summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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()