X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=decoders%2Fonewire_link%2Fonewire_link.py;h=c8bda561b2e47217b1cb6fe4e1693493689ccb30;hp=d6aec2c2aae23ee6da8fe6b3d704318c97a21190;hb=23f999aa996e54cd73cb54d5e254d1445d65847d;hpb=e7720d6c73eb981e57753c9028fa3e9019676c50 diff --git a/decoders/onewire_link/onewire_link.py b/decoders/onewire_link/onewire_link.py index d6aec2c..c8bda56 100644 --- a/decoders/onewire_link/onewire_link.py +++ b/decoders/onewire_link/onewire_link.py @@ -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)