# pragma once
# include <cstdint>
# include <unistd.h>
# include <vector>
# include "cereal/gen/cpp/log.capnp.h"
# include "common/i2c.h"
# include "common/gpio.h"
# include "common/swaglog.h"
# include "system/sensord/sensors/constants.h"
# include "system/sensord/sensors/sensor.h"
int16_t read_12_bit ( uint8_t lsb , uint8_t msb ) ;
int16_t read_16_bit ( uint8_t lsb , uint8_t msb ) ;
int32_t read_20_bit ( uint8_t b2 , uint8_t b1 , uint8_t b0 ) ;
class I2CSensor : public Sensor {
private :
I2CBus * bus ;
int gpio_nr ;
bool shared_gpio ;
virtual uint8_t get_device_address ( ) = 0 ;
public :
I2CSensor ( I2CBus * bus , int gpio_nr = 0 , bool shared_gpio = false ) ;
~ I2CSensor ( ) ;
int read_register ( uint register_address , uint8_t * buffer , uint8_t len ) ;
int set_register ( uint register_address , uint8_t data ) ;
int init_gpio ( ) ;
bool has_interrupt_enabled ( ) ;
virtual int init ( ) = 0 ;
virtual bool get_event ( MessageBuilder & msg , uint64_t ts = 0 ) = 0 ;
virtual int shutdown ( ) = 0 ;
int verify_chip_id ( uint8_t address , const std : : vector < uint8_t > & expected_ids ) {
uint8_t chip_id = 0 ;
int ret = read_register ( address , & chip_id , 1 ) ;
if ( ret < 0 ) {
LOGE ( " Reading chip ID failed: %d " , ret ) ;
return - 1 ;
}
for ( int i = 0 ; i < expected_ids . size ( ) ; + + i ) {
if ( chip_id = = expected_ids [ i ] ) return chip_id ;
}
LOGE ( " Chip ID wrong. Got: %d, Expected %d " , chip_id , expected_ids [ 0 ] ) ;
return - 1 ;
}
} ;