|  |  |  | #include "system/sensord/sensors/i2c_sensor.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int16_t read_12_bit(uint8_t lsb, uint8_t msb) {
 | 
					
						
							|  |  |  |   uint16_t combined = (uint16_t(msb) << 8) | uint16_t(lsb & 0xF0);
 | 
					
						
							|  |  |  |   return int16_t(combined) / (1 << 4);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int16_t read_16_bit(uint8_t lsb, uint8_t msb) {
 | 
					
						
							|  |  |  |   uint16_t combined = (uint16_t(msb) << 8) | uint16_t(lsb);
 | 
					
						
							|  |  |  |   return int16_t(combined);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int32_t read_20_bit(uint8_t b2, uint8_t b1, uint8_t b0) {
 | 
					
						
							|  |  |  |   uint32_t combined = (uint32_t(b0) << 16) | (uint32_t(b1) << 8) | uint32_t(b2);
 | 
					
						
							|  |  |  |   return int32_t(combined) / (1 << 4);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I2CSensor::I2CSensor(I2CBus *bus, int gpio_nr, bool shared_gpio) :
 | 
					
						
							|  |  |  |   bus(bus), gpio_nr(gpio_nr), shared_gpio(shared_gpio) {}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | I2CSensor::~I2CSensor() {
 | 
					
						
							|  |  |  |   if (gpio_fd != -1) {
 | 
					
						
							|  |  |  |     close(gpio_fd);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int I2CSensor::read_register(uint register_address, uint8_t *buffer, uint8_t len) {
 | 
					
						
							|  |  |  |   return bus->read_register(get_device_address(), register_address, buffer, len);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int I2CSensor::set_register(uint register_address, uint8_t data) {
 | 
					
						
							|  |  |  |   return bus->set_register(get_device_address(), register_address, data);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int I2CSensor::init_gpio() {
 | 
					
						
							|  |  |  |   if (shared_gpio || gpio_nr == 0) {
 | 
					
						
							|  |  |  |     return 0;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gpio_fd = gpiochip_get_ro_value_fd("sensord", GPIOCHIP_INT, gpio_nr);
 | 
					
						
							|  |  |  |   if (gpio_fd < 0) {
 | 
					
						
							|  |  |  |     return -1;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return 0;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool I2CSensor::has_interrupt_enabled() {
 | 
					
						
							|  |  |  |   return gpio_nr != 0;
 | 
					
						
							|  |  |  | }
 |