diff options
author | Raptor Engineering Development Team <support@raptorengineering.com> | 2018-02-19 15:55:13 -0600 |
---|---|---|
committer | Raptor Engineering Development Team <support@raptorengineering.com> | 2019-04-19 10:28:12 +0000 |
commit | ffd276f4f0a7b61f14b64165074a77058b0f9f16 (patch) | |
tree | d90cf9cd54a14c819445ebf211d2de961d77f3c8 | |
parent | ab6ce4f51fce943f28bdc3bd0f5e9c463d04e8aa (diff) | |
download | blackbird-skeleton-ffd276f4f0a7b61f14b64165074a77058b0f9f16.tar.gz blackbird-skeleton-ffd276f4f0a7b61f14b64165074a77058b0f9f16.zip |
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
-rw-r--r-- | pyiplledmonitor/ipl_status_led_monitor.py | 41 |
1 files changed, 23 insertions, 18 deletions
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): |