Skip to content

Commit

Permalink
Retry I2C harder
Browse files Browse the repository at this point in the history
  • Loading branch information
thetic committed Mar 6, 2025
1 parent 35ff2b9 commit 73134a1
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion src/klipper_sgp40/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 73134a1

Please sign in to comment.