]> sigrok.org Git - libsigrokdecode.git/blobdiff - decoders/onewire_link/onewire_link.py
configure.ac/Makefile.am: Alphabetical order.
[libsigrokdecode.git] / decoders / onewire_link / onewire_link.py
index d6aec2c2aae23ee6da8fe6b3d704318c97a21190..c8bda561b2e47217b1cb6fe4e1693493689ccb30 100644 (file)
@@ -32,10 +32,10 @@ class Decoder(srd.Decoder):
     inputs = ['logic']
     outputs = ['onewire_link']
     probes = [
-        {'id': 'owr', 'name': 'OWR', 'desc': '1-Wire bus'},
+        {'id': 'owr', 'name': 'OWR', 'desc': '1-Wire signal line'},
     ]
     optional_probes = [
-        {'id': 'pwr', 'name': 'PWR', 'desc': '1-Wire power'},
+        {'id': 'pwr', 'name': 'PWR', 'desc': '1-Wire power supply pin'},
     ]
     options = {
         'overdrive': ['Overdrive', 1],
@@ -50,19 +50,18 @@ class Decoder(srd.Decoder):
         'cnt_overdrive_reset': ['Overdrive mode reset time', 0],
     }
     annotations = [
-        ['Link', 'Link layer events (reset, presence, bit slots)'],
+        ['Text', 'Human-readable text'],
+        ['Warnings', 'Human-readable warnings'],
     ]
 
     def __init__(self, **kwargs):
         self.samplenum = 0
-        # Link layer variables
         self.state = 'WAIT FOR FALLING EDGE'
         self.present = 0
         self.bit = 0
         self.bit_cnt = 0
         self.command = 0
         self.overdrive = 0
-        # Event timing variables
         self.fall = 0
         self.rise = 0
 
@@ -74,25 +73,21 @@ class Decoder(srd.Decoder):
 
         # Check if samplerate is appropriate.
         if self.options['overdrive']:
-            self.put(0, 0, self.out_ann, [0,
-                ['NOTE: Sample rate checks assume overdrive mode.']])
             if self.samplerate < 2000000:
-                self.put(0, 0, self.out_ann, [0,
+                self.put(0, 0, self.out_ann, [1,
                     ['ERROR: Sampling rate is too low. Must be above 2MHz ' +
                      'for proper overdrive mode decoding.']])
             elif self.samplerate < 5000000:
-                self.put(0, 0, self.out_ann, [0,
+                self.put(0, 0, self.out_ann, [1,
                   ['WARNING: Sampling rate is suggested to be above 5MHz ' +
                    'for proper overdrive mode decoding.']])
         else:
-            self.put(0, 0, self.out_ann, [0,
-                ['NOTE: Sample rate checks assume normal mode only.']])
             if self.samplerate < 400000:
-                self.put(0, 0, self.out_ann, [0,
+                self.put(0, 0, self.out_ann, [1,
                     ['ERROR: Sampling rate is too low. Must be above ' +
                      '400kHz for proper normal mode decoding.']])
             elif (self.samplerate < 1000000):
-                self.put(0, 0, self.out_ann, [0,
+                self.put(0, 0, self.out_ann, [1,
                     ['WARNING: Sampling rate is suggested to be above ' +
                      '1MHz for proper normal mode decoding.']])
 
@@ -143,7 +138,7 @@ class Decoder(srd.Decoder):
         time_min = float(self.cnt_normal_bit) / self.samplerate
         time_max = float(self.cnt_normal_bit + 1) / self.samplerate
         if (time_min < 0.000005) or (time_max > 0.000015):
-            self.put(0, 0, self.out_ann, [0,
+            self.put(0, 0, self.out_ann, [1,
                 ['WARNING: The normal mode data sample time interval ' +
                  '(%2.1fus-%2.1fus) should be inside (5.0us, 15.0us).'
                  % (time_min * 1000000, time_max * 1000000)]])
@@ -151,7 +146,7 @@ class Decoder(srd.Decoder):
         time_min = float(self.cnt_normal_presence) / self.samplerate
         time_max = float(self.cnt_normal_presence + 1) / self.samplerate
         if (time_min < 0.0000681) or (time_max > 0.000075):
-            self.put(0, 0, self.out_ann, [0,
+            self.put(0, 0, self.out_ann, [1,
                 ['WARNING: The normal mode presence sample time interval ' +
                  '(%2.1fus-%2.1fus) should be inside (68.1us, 75.0us).'
                  % (time_min * 1000000, time_max * 1000000)]])
@@ -159,7 +154,7 @@ class Decoder(srd.Decoder):
         time_min = float(self.cnt_overdrive_bit) / self.samplerate
         time_max = float(self.cnt_overdrive_bit + 1) / self.samplerate
         if (time_min < 0.000001) or (time_max > 0.000002):
-            self.put(0, 0, self.out_ann, [0,
+            self.put(0, 0, self.out_ann, [1,
                 ['WARNING: The overdrive mode data sample time interval ' +
                  '(%2.1fus-%2.1fus) should be inside (1.0us, 2.0us).'
                  % (time_min * 1000000, time_max * 1000000)]])
@@ -167,7 +162,7 @@ class Decoder(srd.Decoder):
         time_min = float(self.cnt_overdrive_presence) / self.samplerate
         time_max = float(self.cnt_overdrive_presence + 1) / self.samplerate
         if (time_min < 0.0000073) or (time_max > 0.000010):
-            self.put(0, 0, self.out_ann, [0,
+            self.put(0, 0, self.out_ann, [1,
                 ['WARNING: The overdrive mode presence sample time interval ' +
                  '(%2.1fus-%2.1fus) should be inside (7.3us, 10.0us).'
                  % (time_min*1000000, time_max*1000000)]])
@@ -180,11 +175,12 @@ class Decoder(srd.Decoder):
             # State machine.
             if self.state == 'WAIT FOR FALLING EDGE':
                 # The start of a cycle is a falling edge.
-                if owr == 0:
-                    # Save the sample number for the falling edge.
-                    self.fall = self.samplenum
-                    # Go to waiting for sample time.
-                    self.state = 'WAIT FOR DATA SAMPLE'
+                if owr != 0:
+                    continue
+                # Save the sample number for the falling edge.
+                self.fall = self.samplenum
+                # Go to waiting for sample time.
+                self.state = 'WAIT FOR DATA SAMPLE'
             elif self.state == 'WAIT FOR DATA SAMPLE':
                 # Sample data bit.
                 t = self.samplenum - self.fall
@@ -195,52 +191,56 @@ class Decoder(srd.Decoder):
                 # A data slot ends in a recovery period, otherwise, this is
                 # probably a reset.
                 t = self.samplenum - self.fall
-                if t == self.cnt_slot[self.overdrive]:
-                    if owr:
-                        self.put(self.fall, self.samplenum, self.out_ann,
-                                 [0, ['BIT: %01x' % self.bit]])
-                        self.put(self.fall, self.samplenum, self.out_proto,
-                                 ['BIT', self.bit])
+                if t != self.cnt_slot[self.overdrive]:
+                    continue
+
+                if owr == 0:
+                    # This seems to be a reset slot, wait for its end.
+                    self.state = 'WAIT FOR RISING EDGE'
+                    continue
+
+                self.put(self.fall, self.samplenum, self.out_ann,
+                         [0, ['Bit: %d' % self.bit]])
+                self.put(self.fall, self.samplenum, self.out_proto,
+                         ['BIT', self.bit])
 
-                        # Checking the first command to see if overdrive mode
-                        # should be entered.
-                        if self.bit_cnt <= 8:
-                            self.command |= (self.bit << self.bit_cnt)
-                        elif self.bit_cnt == 8 and self.command in [0x3c, 0x69]:
-                            self.put(self.fall, self.cnt_bit[self.overdrive],
-                                     self.out_ann,
-                                     [0, ['ENTER OVERDRIVE MODE']])
-                        # Increment the bit counter.
-                        self.bit_cnt += 1
-                        # Wait for next slot.
-                        self.state = 'WAIT FOR FALLING EDGE'
-                    else:
-                        # This seems to be a reset slot, wait for its end.
-                        self.state = 'WAIT FOR RISING EDGE'
+                # Checking the first command to see if overdrive mode
+                # should be entered.
+                if self.bit_cnt <= 8:
+                    self.command |= (self.bit << self.bit_cnt)
+                elif self.bit_cnt == 8 and self.command in [0x3c, 0x69]:
+                    self.put(self.fall, self.cnt_bit[self.overdrive],
+                             self.out_ann, [0, ['Entering overdrive mode']])
+                # Increment the bit counter.
+                self.bit_cnt += 1
+                # Wait for next slot.
+                self.state = 'WAIT FOR FALLING EDGE'
             elif self.state == 'WAIT FOR RISING EDGE':
                 # The end of a cycle is a rising edge.
-                if owr:
-                    # Check if this was a reset cycle.
-                    t = self.samplenum - self.fall
-                    if t > self.cnt_normal_reset:
-                        # Save the sample number for the falling edge.
-                        self.rise = self.samplenum
-                        self.state = 'WAIT FOR PRESENCE DETECT'
-                        # Exit overdrive mode.
-                        if self.overdrive:
-                            self.put(self.fall, self.cnt_bit[self.overdrive],
-                                     self.out_ann, [0, ['EXIT OVERDRIVE MODE']])
-                            self.overdrive = 0
-                        # Clear command bit counter and data register.
-                        self.bit_cnt = 0
-                        self.command = 0
-                    elif (t > self.cnt_overdrive_reset) and self.overdrive:
-                        # Save the sample number for the falling edge.
-                        self.rise = self.samplenum
-                        self.state = "WAIT FOR PRESENCE DETECT"
-                    # Otherwise this is assumed to be a data bit.
-                    else:
-                        self.state = "WAIT FOR FALLING EDGE"
+                if owr != 1:
+                    continue
+
+                # Check if this was a reset cycle.
+                t = self.samplenum - self.fall
+                if t > self.cnt_normal_reset:
+                    # Save the sample number for the falling edge.
+                    self.rise = self.samplenum
+                    self.state = 'WAIT FOR PRESENCE DETECT'
+                    # Exit overdrive mode.
+                    if self.overdrive:
+                        self.put(self.fall, self.cnt_bit[self.overdrive],
+                                 self.out_ann, [0, ['Exiting overdrive mode']])
+                        self.overdrive = 0
+                    # Clear command bit counter and data register.
+                    self.bit_cnt = 0
+                    self.command = 0
+                elif (t > self.cnt_overdrive_reset) and self.overdrive:
+                    # Save the sample number for the falling edge.
+                    self.rise = self.samplenum
+                    self.state = "WAIT FOR PRESENCE DETECT"
+                # Otherwise this is assumed to be a data bit.
+                else:
+                    self.state = "WAIT FOR FALLING EDGE"
             elif self.state == 'WAIT FOR PRESENCE DETECT':
                 # Sample presence status.
                 t = self.samplenum - self.rise
@@ -248,19 +248,22 @@ class Decoder(srd.Decoder):
                     self.present = owr
                     self.state = 'WAIT FOR RESET SLOT END'
             elif self.state == 'WAIT FOR RESET SLOT END':
-                # A reset slot ends in a long recovery period
+                # A reset slot ends in a long recovery period.
                 t = self.samplenum - self.rise
-                if t == self.cnt_reset[self.overdrive]:
-                    if owr:
-                        self.put(self.fall, self.samplenum, self.out_ann,
-                                 [0, ['RESET/PRESENCE: %s'
-                                 % ('False' if self.present else 'True')]])
-                        self.put(self.fall, self.samplenum, self.out_proto,
-                                 ['RESET/PRESENCE', not self.present])
-                        # Wait for next slot.
-                        self.state = 'WAIT FOR FALLING EDGE'
-                    else:
-                        # This seems to be a reset slot, wait for its end.
-                        self.state = 'WAIT FOR RISING EDGE'
+                if t != self.cnt_reset[self.overdrive]:
+                    continue
+
+                if owr == 0:
+                    # This seems to be a reset slot, wait for its end.
+                    self.state = 'WAIT FOR RISING EDGE'
+                    continue
+
+                self.put(self.fall, self.samplenum, self.out_ann,
+                         [0, ['Reset/presence: %s'
+                         % ('false' if self.present else 'true')]])
+                self.put(self.fall, self.samplenum, self.out_proto,
+                         ['RESET/PRESENCE', not self.present])
+                # Wait for next slot.
+                self.state = 'WAIT FOR FALLING EDGE'
             else:
                 raise Exception('Invalid state: %s' % self.state)