From ffd276f4f0a7b61f14b64165074a77058b0f9f16 Mon Sep 17 00:00:00 2001 From: Raptor Engineering Development Team Date: Mon, 19 Feb 2018 15:55:13 -0600 Subject: Work around unstable I2C bus The I2C bus the FPGA is attached to is even less stable than originally thought Retry reads and use most commonly returned value as an interim workaround --- pyiplledmonitor/ipl_status_led_monitor.py | 41 +++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'pyiplledmonitor') diff --git a/pyiplledmonitor/ipl_status_led_monitor.py b/pyiplledmonitor/ipl_status_led_monitor.py index a67186a..6e36d00 100644 --- a/pyiplledmonitor/ipl_status_led_monitor.py +++ b/pyiplledmonitor/ipl_status_led_monitor.py @@ -69,24 +69,29 @@ class IPLStatusLEDMonitor(DbusProperties, DbusObjectManager): def IPLLEDReadI2CByte(self, byte): retry_number = 0 retval = 0 - comm_fail = True; - while (comm_fail == True): - comm_fail = False; - try: - proc = subprocess.Popen(["i2cget", "-y", "12", "0x31", str(byte)], stdout=subprocess.PIPE, stderr=open(os.devnull, 'wb'), shell=False) - (out, err) = proc.communicate() - if (proc.returncode != 0): - comm_fail = True - else: - retval = int(out, 16) - except: - comm_fail = True; - pass - if (comm_fail == True): - retry_number += 1 - if (retry_number > 16): - break - time.sleep(0.1) + candidate_values = [] + for read_count in range(0, 64): + comm_fail = True; + while (comm_fail == True): + comm_fail = False; + try: + proc = subprocess.Popen(["i2cget", "-y", "12", "0x31", str(byte)], stdout=subprocess.PIPE, stderr=open(os.devnull, 'wb'), shell=False) + (out, err) = proc.communicate() + if (proc.returncode != 0): + comm_fail = True + else: + retval = int(out, 64) + except: + comm_fail = True; + pass + if (comm_fail == True): + retry_number += 1 + if (retry_number > 64): + break + time.sleep(0.1) + if (comm_fail == False): + candidate_values.append(retval) + retval = max(set(candidate_values), key=candidate_values.count) return retval def IPLLEDCheckSystem(self): -- cgit v1.2.1