summaryrefslogtreecommitdiffstats
path: root/pyiplledmonitor
diff options
context:
space:
mode:
authorRaptor Engineering Development Team <support@raptorengineering.com>2018-02-19 15:55:13 -0600
committerRaptor Engineering Development Team <support@raptorengineering.com>2019-04-19 10:28:12 +0000
commitffd276f4f0a7b61f14b64165074a77058b0f9f16 (patch)
treed90cf9cd54a14c819445ebf211d2de961d77f3c8 /pyiplledmonitor
parentab6ce4f51fce943f28bdc3bd0f5e9c463d04e8aa (diff)
downloadtalos-skeleton-ffd276f4f0a7b61f14b64165074a77058b0f9f16.tar.gz
talos-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
Diffstat (limited to 'pyiplledmonitor')
-rw-r--r--pyiplledmonitor/ipl_status_led_monitor.py41
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):
OpenPOWER on IntegriCloud