You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							50 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							50 lines
						
					
					
						
							1.4 KiB
						
					
					
				| #pragma once
 | |
| 
 | |
| #include <cstdint>
 | |
| #include <unistd.h>
 | |
| #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;
 | |
|   }
 | |
| };
 | |
| 
 |