2 ## This file is part of the libsigrokdecode project.
4 ## Copyright (C) 2020 Tomas Mudrunka <harvie@github>
6 ## Permission is hereby granted, free of charge, to any person obtaining a copy
7 ## of this software and associated documentation files (the "Software"), to deal
8 ## in the Software without restriction, including without limitation the rights
9 ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 ## copies of the Software, and to permit persons to whom the Software is
11 ## furnished to do so, subject to the following conditions:
13 ## The above copyright notice and this permission notice shall be included in all
14 ## copies or substantial portions of the Software.
16 ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 import sigrokdecode
as srd
26 class Decoder(srd
.Decoder
):
30 longname
= 'Digital calipers'
31 desc
= 'Protocol of cheap generic digital calipers'
36 {'id': 'clk', 'name': 'CLK', 'desc': 'Serial clock line'},
37 {'id': 'data', 'name': 'DATA', 'desc': 'Serial data line'},
40 {'id': 'timeout_ms', 'desc': 'Timeout packet after X ms, 0 to disable', 'default': 10},
41 {'id': 'unit', 'desc': 'Convert units', 'default': 'keep', 'values': ('keep', 'mm', 'inch')},
43 tags
= ['Analog/digital', 'IC', 'Sensor']
45 ('measurements', 'Measurements'),
46 ('warning', 'Warnings'),
49 ('measurements', 'Measurements', (0,)),
50 ('warnings', 'Warnings', (1,)),
58 def metadata(self
, key
, value
):
59 if key
== srd
.SRD_CONF_SAMPLERATE
:
60 self
.samplerate
= value
66 self
.ss_cmd
, self
.es_cmd
= 0, 0
70 self
.out_ann
= self
.register(srd
.OUTPUT_ANN
)
72 #Switch bit order of variable x, which is l bit long
74 return int(bin(x
)[2:].zfill(l
)[::-1], 2)
78 clk
, data
= self
.wait([{0: 'r'},{'skip': round(self
.samplerate
/1000)}])
81 #Timeout after inactivity
82 if(self
.options
['timeout_ms'] > 0):
83 if self
.samplenum
> self
.es_cmd
+ (self
.samplerate
/(1000/self
.options
['timeout_ms'])):
85 self
.put(self
.ss_cmd
, self
.samplenum
, self
.out_ann
, [1, ['timeout with %s bits in buffer'%(self
.bits
),'timeout']])
88 #Do nothing if there was timeout without rising clock edge
89 if self
.matched
== (False, True):
92 #Store position of last activity
93 self
.es_cmd
= self
.samplenum
95 #Store position of first bit
97 self
.ss_cmd
= self
.samplenum
99 #Shift in measured number
101 self
.number
= (self
.number
<< 1) |
(data
& 0b1)
107 self
.flags
= (self
.flags
<< 1) |
(data
& 0b1)
111 #Hooray! We got last bit of data
112 self
.es_cmd
= self
.samplenum
116 #print(format(self.flags, '08b'));
118 negative
= ((self
.flags
& 0b00001000) >> 3)
119 inch
= (self
.flags
& 0b00000001)
121 number
= self
.bitr(self
.number
, 16)
123 #print(format(number, '016b'))
128 inchmm
= 25.4 #how many mms in inch
132 if self
.options
['unit'] == 'mm':
137 if self
.options
['unit'] == 'inch':
138 number
= round(number
/inchmm
,4)
141 units
= "in" if inch
else "mm"
143 measurement
= (str(number
)+units
)
146 self
.put(self
.ss_cmd
, self
.es_cmd
, self
.out_ann
, [0, [measurement
, str(number
)]])
148 #Prepare for next packet
This page took 0.332615 seconds and 4 git commands to generate.