summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerhard Sittig <gerhard.sittig@gmx.net>2020-07-18 18:14:19 +0200
committerGerhard Sittig <gerhard.sittig@gmx.net>2020-07-18 20:36:15 +0200
commit4afcb4d0489705a3ca5f2590bd4645e51d5fb611 (patch)
tree1caada07a8aa793f6e6c9e3c963611103846e3ef
parent5ed5cea580fe8bc9405043b216eb420792889283 (diff)
downloadlibsigrokdecode-4afcb4d0489705a3ca5f2590bd4645e51d5fb611.tar.gz
libsigrokdecode-4afcb4d0489705a3ca5f2590bd4645e51d5fb611.zip
caliper: fixup boilerplate (and some coding style and whitespace)
The caliper decoder was written against an older version of the library and failed to load in recent environments. Fixup the decoder boilerplate (eliminate ambiguous annotation class/row names, drop the IC tag) and address other style nits while we are here (rephrase user visible text, break a few long lines, adjust some of the indentation and whitespace issues, drop dead code). Remaining issues get addressed later.
-rw-r--r--decoders/caliper/__init__.py16
-rw-r--r--decoders/caliper/pd.py69
2 files changed, 41 insertions, 44 deletions
diff --git a/decoders/caliper/__init__.py b/decoders/caliper/__init__.py
index 3fc99fe..44dab08 100644
--- a/decoders/caliper/__init__.py
+++ b/decoders/caliper/__init__.py
@@ -18,17 +18,17 @@
##
'''
-This decodes digital output of cheap generic calipers (usualy made in china)
-Decoder will show measured value in milimeters or inches.
+This decoder interprets the digital output of cheap generic calipers
+(usually made in China), and shows the measured value in millimeters
+or inches.
-Please note that these devices often communicate on low voltage level,
-which might not be possible to capture with 3.3V logic analyzers.
-So additional circuitry might be needed to capture the signal.
+Notice that these devices often communicate on voltage levels below
+3.3V and may require additional circuitry to capture the signal.
-This is NOT for calipers using Digimatic protocol (eg. Mitutoyo and similar brands)
-
-More info:
+This decoder does not work for calipers using the Digimatic protocol
+(eg. Mitutoyo and similar brands).
+For more information see:
http://www.shumatech.com/support/chinese_scales.htm
https://www.instructables.com/id/Reading-Digital-Callipers-with-an-Arduino-USB/
'''
diff --git a/decoders/caliper/pd.py b/decoders/caliper/pd.py
index 3db0473..cbb01cf 100644
--- a/decoders/caliper/pd.py
+++ b/decoders/caliper/pd.py
@@ -28,23 +28,26 @@ class Decoder(srd.Decoder):
id = 'caliper'
name = 'Caliper'
longname = 'Digital calipers'
- desc = 'Protocol of cheap generic digital calipers'
+ desc = 'Protocol of cheap generic digital calipers.'
license = 'mit'
inputs = ['logic']
outputs = []
channels = (
- {'id': 'clk', 'name': 'CLK', 'desc': 'Serial clock line'},
- {'id': 'data', 'name': 'DATA', 'desc': 'Serial data line'},
+ {'id': 'clk', 'name': 'CLK', 'desc': 'Serial clock line'},
+ {'id': 'data', 'name': 'DATA', 'desc': 'Serial data line'},
)
options = (
- {'id': 'timeout_ms', 'desc': 'Timeout packet after X ms, 0 to disable', 'default': 10},
- {'id': 'unit', 'desc': 'Convert units', 'default': 'keep', 'values': ('keep', 'mm', 'inch')},
- {'id': 'changes', 'desc': 'Changes only', 'default': 'no', 'values': ('no', 'yes')},
+ {'id': 'timeout_ms', 'desc': 'Packet timeout in ms, 0 to disable',
+ 'default': 10},
+ {'id': 'unit', 'desc': 'Convert units', 'default': 'keep',
+ 'values': ('keep', 'mm', 'inch')},
+ {'id': 'changes', 'desc': 'Changes only', 'default': 'no',
+ 'values': ('no', 'yes')},
)
- tags = ['Analog/digital', 'IC', 'Sensor']
+ tags = ['Analog/digital', 'Sensor']
annotations = (
- ('measurements', 'Measurements'),
- ('warning', 'Warnings'),
+ ('measurement', 'Measurement'),
+ ('warning', 'Warning'),
)
annotation_rows = (
('measurements', 'Measurements', (0,)),
@@ -70,84 +73,78 @@ class Decoder(srd.Decoder):
def start(self):
self.out_ann = self.register(srd.OUTPUT_ANN)
- #Switch bit order of variable x, which is l bit long
- def bitr(self,x,l):
+ # Switch bit order of variable x, which is l bit long.
+ def bitr(self, x, l):
return int(bin(x)[2:].zfill(l)[::-1], 2)
def decode(self):
self.last_measurement = None
while True:
- clk, data = self.wait([{0: 'r'},{'skip': round(self.samplerate/1000)}])
- #print([clk,data])
+ clk, data = self.wait([{0: 'r'}, {'skip': round(self.samplerate / 1000)}])
- #Timeout after inactivity
- if(self.options['timeout_ms'] > 0):
- if self.samplenum > self.es_cmd + (self.samplerate/(1000/self.options['timeout_ms'])):
+ # Timeout after inactivity.
+ if self.options['timeout_ms'] > 0:
+ if self.samplenum > self.es_cmd + (self.samplerate / (1000 / self.options['timeout_ms'])):
if self.bits > 0:
- self.put(self.ss_cmd, self.samplenum, self.out_ann, [1, ['timeout with %s bits in buffer'%(self.bits),'timeout']])
+ self.put(self.ss_cmd, self.samplenum, self.out_ann, [1, ['timeout with %s bits in buffer' % (self.bits), 'timeout']])
self.reset()
- #Do nothing if there was timeout without rising clock edge
+ # Do nothing if there was timeout without rising clock edge.
if self.matched == (False, True):
continue
- #Store position of last activity
+ # Store position of last activity.
self.es_cmd = self.samplenum
- #Store position of first bit
+ # Store position of first bit.
if self.ss_cmd == 0:
self.ss_cmd = self.samplenum
- #Shift in measured number
+ # Shift in measured number.
if self.bits < 16:
self.number = (self.number << 1) | (data & 0b1)
- self.bits+=1
+ self.bits += 1
continue
- #Shift in flag bits
+ # Shift in flag bits.
if self.bits < 24:
self.flags = (self.flags << 1) | (data & 0b1)
- self.bits+=1
+ self.bits += 1
if self.bits < 24:
continue
- #Hooray! We got last bit of data
+ # We got last bit of data.
self.es_cmd = self.samplenum
- #Do actual decoding
-
- #print(format(self.flags, '08b'));
+ # Do actual decoding.
negative = ((self.flags & 0b00001000) >> 3)
inch = (self.flags & 0b00000001)
number = self.bitr(self.number, 16)
- #print(format(number, '016b'))
-
if negative > 0:
number = -number
inchmm = 25.4 #how many mms in inch
if inch:
- number = number/2000
+ number = number / 2000
if self.options['unit'] == 'mm':
number *= inchmm
inch = 0
else:
- number = number/100
+ number = number / 100
if self.options['unit'] == 'inch':
- number = round(number/inchmm,4)
+ number = round(number / inchmm, 4)
inch = 1
units = "in" if inch else "mm"
- measurement = (str(number)+units)
- #print(measurement)
+ measurement = (str(number) + units)
if ((self.options['changes'] == 'no') or (self.last_measurement != measurement)):
self.put(self.ss_cmd, self.es_cmd, self.out_ann, [0, [measurement, str(number)]])
self.last_measurement = measurement
- #Prepare for next packet
+ # Prepare for next packet.
self.reset()