def read_power_register(self, retry: bool = True) -> Optional[Dict[int, bool]]: """Reads power register.""" self.logger.debug("Reading power register") # Read register try: self.i2c.write([0x40], retry=retry) bytes_ = self.i2c.read(2, retry=retry) except I2CError as e: raise exceptions.ReadPowerRegisterError(logger=self.logger) from e # Parse response bytes msb = bytes_[0] lsb = bytes_[1] powered_channels = { 0: not bool(bitwise.get_bit_from_byte(4, msb)), 1: not bool(bitwise.get_bit_from_byte(3, msb)), 2: not bool(bitwise.get_bit_from_byte(2, msb)), 3: not bool(bitwise.get_bit_from_byte(1, msb)), 4: not bool(bitwise.get_bit_from_byte(0, msb)), 5: not bool(bitwise.get_bit_from_byte(7, lsb)), 6: not bool(bitwise.get_bit_from_byte(6, lsb)), 7: not bool(bitwise.get_bit_from_byte(5, lsb)), } return powered_channels
def read_status(self, retry: bool = True) -> Status: """Reads status.""" self.logger.debug("Reading status") # Read status data, requires mux diable to read all x4 bytes try: with self.i2c_lock: self.i2c.write(bytes([0x04, 0x13, 0x8a, 0x00, 0x01]), retry=retry) bytes_ = self.i2c.read(4, retry=retry, disable_mux=True) except I2CError as e: raise ReadStatusError(logger=self.logger) from e # Parse status bytes _, _, status_msb, status_lsb = bytes_ status = Status( error_condition=bool(bitwise.get_bit_from_byte(0, status_lsb)), flash_error=bool(bitwise.get_bit_from_byte(1, status_lsb)), calibration_error=bool(bitwise.get_bit_from_byte(2, status_lsb)), rs232=bool(bitwise.get_bit_from_byte(0, status_msb)), rs485=bool(bitwise.get_bit_from_byte(1, status_msb)), i2c=bool(bitwise.get_bit_from_byte(2, status_msb)), warm_up_mode=bool(bitwise.get_bit_from_byte(3, status_msb)), single_point_calibration=bool( bitwise.get_bit_from_byte(7, status_msb)), ) # Successfully read status self.logger.debug("Status: {}".format(status)) return status
def read_status_register(self, retry: bool = True) -> StatusRegister: """Reads status of sensor.""" self.logger.info("Reading status register") try: byte = self.i2c.read_register(0x00, retry=retry) except I2CError as e: raise ReadRegisterError(message="status reg", logger=self.logger) from e # Parse status register byte status_register = StatusRegister( firmware_mode=bitwise.get_bit_from_byte(7, byte), app_valid=bool(bitwise.get_bit_from_byte(4, byte)), data_ready=bool(bitwise.get_bit_from_byte(3, byte)), error=bool(bitwise.get_bit_from_byte(0, byte)), ) self.logger.debug(status_register) return status_register
def read_user_register(self, retry: bool = True) -> UserRegister: """ Reads user register.""" self.logger.debug("Reading user register") # Read register try: byte = self.i2c.read_register(0xE7, retry=retry) except I2CError as e: raise exceptions.ReadUserRegisterError(logger=self.logger) from e # Parse register content resolution_msb = bitwise.get_bit_from_byte(bit=7, byte=byte) resolution_lsb = bitwise.get_bit_from_byte(bit=0, byte=byte) user_register = UserRegister( resolution=resolution_msb << 1 + resolution_lsb, end_of_battery=bool(bitwise.get_bit_from_byte(bit=6, byte=byte)), heater_enabled=bool(bitwise.get_bit_from_byte(bit=2, byte=byte)), reload_disabled=bool(bitwise.get_bit_from_byte(bit=1, byte=byte)), ) # Successfully read user register self.logger.debug("User register: {}".format(user_register)) return user_register
def test_get_bit_from_byte(): byte = 0x4C bit = bitwise.get_bit_from_byte(7, byte) assert bit == 0 bit = bitwise.get_bit_from_byte(6, byte) assert bit == 1 bit = bitwise.get_bit_from_byte(5, byte) assert bit == 0 bit = bitwise.get_bit_from_byte(4, byte) assert bit == 0 bit = bitwise.get_bit_from_byte(3, byte) assert bit == 1 bit = bitwise.get_bit_from_byte(2, byte) assert bit == 1 bit = bitwise.get_bit_from_byte(1, byte) assert bit == 0 bit = bitwise.get_bit_from_byte(0, byte) assert bit == 0
def read_error_register(self, retry: bool = True) -> ErrorRegister: """Reads error register.""" self.logger.info("Reading error register") try: byte = self.i2c.read_register(0x0E, retry=retry) except I2CError as e: raise ReadRegisterError(message="error reg", logger=self.logger) from e # Parse error register byte return ErrorRegister( write_register_invalid=bool(bitwise.get_bit_from_byte(0, byte)), read_register_invalid=bool(bitwise.get_bit_from_byte(1, byte)), measurement_mode_invalid=bool(bitwise.get_bit_from_byte(2, byte)), max_resistance=bool(bitwise.get_bit_from_byte(3, byte)), heater_fault=bool(bitwise.get_bit_from_byte(4, byte)), heater_supply=bool(bitwise.get_bit_from_byte(5, byte)), )
if os.getenv("IS_USB_I2C_ENABLED") != "true": print("Platform is not usb-to-i2c enabled") exit(0) # Initialize i2c instance i2c_controller = I2cController() i2c_controller.configure("ftdi://ftdi:232h/1") i2c = i2c_controller.get_port(0x15) # Read data bytes i2c.write([0x04, 0x13, 0x8B, 0x00, 0x01]) bytes_ = i2c.read(4) # Parse data bytes _, _, status_msb, status_lsb = bytes_ error_condition = (bool(bitwise.get_bit_from_byte(0, status_lsb)),) flash_error = (bool(bitwise.get_bit_from_byte(1, status_lsb)),) calibration_error = (bool(bitwise.get_bit_from_byte(2, status_lsb)),) rs232 = (bool(bitwise.get_bit_from_byte(0, status_msb)),) rs485 = (bool(bitwise.get_bit_from_byte(1, status_msb)),) i2c_ = (bool(bitwise.get_bit_from_byte(2, status_msb)),) warm_up_mode = (bool(bitwise.get_bit_from_byte(3, status_msb)),) single_point_calibration = (bool(bitwise.get_bit_from_byte(7, status_msb)),) # Display status print("Error Condition: {}".format(bool(error_condition))) print("Flash Error: {}".format(bool(flash_error))) print("Calibration Error: {}".format(bool(calibration_error))) print("RS232: {}".format(bool(rs232))) print("RS485: {}".format(bool(rs485))) print("I2C: {}".format(bool(i2c_)))
if os.getenv("IS_USB_I2C_ENABLED") != "true": print("Platform is not usb-to-i2c enabled") exit(0) # Initialize i2c instance i2c_controller = I2cController() i2c_controller.configure("ftdi://ftdi:232h/1") i2c = i2c_controller.get_port(0x15) # Read data bytes i2c.write([0x04, 0x13, 0x8b, 0x00, 0x01]) bytes_ = i2c.read(4) # Parse data bytes _, _, status_msb, status_lsb = bytes_ error_condition = bool(bitwise.get_bit_from_byte(0, status_lsb)), flash_error = bool(bitwise.get_bit_from_byte(1, status_lsb)), calibration_error = bool(bitwise.get_bit_from_byte(2, status_lsb)), rs232 = bool(bitwise.get_bit_from_byte(0, status_msb)), rs485 = bool(bitwise.get_bit_from_byte(1, status_msb)), i2c_ = bool(bitwise.get_bit_from_byte(2, status_msb)), warm_up_mode = bool(bitwise.get_bit_from_byte(3, status_msb)), single_point_calibration = bool(bitwise.get_bit_from_byte(7, status_msb)), # Display status print("Error Condition: {}".format(bool(error_condition))) print("Flash Error: {}".format(bool(flash_error))) print("Calibration Error: {}".format(bool(calibration_error))) print("RS232: {}".format(bool(rs232))) print("RS485: {}".format(bool(rs485))) print("I2C: {}".format(bool(i2c_)))