From 73134a1b817d66b9ded9c84776a1b81f672bab9d Mon Sep 17 00:00:00 2001 From: Chad Condon Date: Wed, 5 Mar 2025 22:01:00 -0800 Subject: [PATCH] Retry I2C harder --- src/klipper_sgp40/__init__.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/klipper_sgp40/__init__.py b/src/klipper_sgp40/__init__.py index 5c5b6f7..2b72fb9 100644 --- a/src/klipper_sgp40/__init__.py +++ b/src/klipper_sgp40/__init__.py @@ -11,7 +11,8 @@ from logging import ERROR, WARNING from struct import unpack_from -from .. import bus # type:ignore +from ...serialhdl import error # type: ignore +from .. import bus # type: ignore from .gia import GasIndexAlgorithm SGP40_CHIP_ADDR = 0x59 @@ -22,6 +23,27 @@ MEASURE_RAW_CMD_PREFIX = [0x26, 0x0F] +# Hack i2c to attempt more retries. +def _get_response(self, cmds, cmd_queue, minclock=0, reqclock=0): + retries = 15 + retry_delay = 0.010 + while 1: + for cmd in cmds[:-1]: + self.serial.raw_send(cmd, minclock, reqclock, cmd_queue) + self.serial.raw_send_wait_ack(cmds[-1], minclock, reqclock, cmd_queue) + params = self.last_params + if params is not None: + self.serial.register_response(None, self.name, self.oid) + return params + if retries <= 0: + self.serial.register_response(None, self.name, self.oid) + raise error("Unable to obtain '%s' response" % (self.name,)) + reactor = self.serial.reactor + reactor.pause(reactor.monotonic() + retry_delay) + retries -= 1 + retry_delay *= 2.0 + + def _generate_crc(data): # From SGP40 data sheet crc = 0xFF @@ -184,6 +206,8 @@ def _handle_connect(self): self._init_sgp40() + self.i2c.i2c_read_cmd._xmit_helper.get_response = _get_response + self.reactor.update_timer(self.step_timer, self.reactor.NOW) def _handle_ready(self):