]> sigrok.org Git - libsigrokdecode.git/blame - decoders/transitioncounter.py
srd: Quick hack to make transitioncounter.py work again.
[libsigrokdecode.git] / decoders / transitioncounter.py
CommitLineData
1c6fa20f
UH
1##
2## This file is part of the sigrok project.
3##
4## Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
5##
6## This program is free software; you can redistribute it and/or modify
7## it under the terms of the GNU General Public License as published by
8## the Free Software Foundation; either version 2 of the License, or
9## (at your option) any later version.
10##
11## This program is distributed in the hope that it will be useful,
12## but WITHOUT ANY WARRANTY; without even the implied warranty of
13## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14## GNU General Public License for more details.
15##
16## You should have received a copy of the GNU General Public License
17## along with this program; if not, write to the Free Software
18## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19##
ad2dc0de 20
1c8ac5bf
UH
21import sigrok
22
b41ae47f
UH
23class Sample():
24 def __init__(self, data):
25 self.data = data
26 def probe(self, probe):
862f6f27 27 s = ord(self.data[int(probe / 8)]) & (1 << (probe % 8))
b41ae47f
UH
28 return True if s else False
29
30def sampleiter(data, unitsize):
31 for i in range(0, len(data), unitsize):
32 yield(Sample(data[i:i+unitsize]))
33
1c8ac5bf 34class Decoder(sigrok.Decoder):
2b7d0e2b 35 id = 'transitioncounter'
b41ae47f
UH
36 name = 'Transition counter'
37 longname = '...'
38 desc = 'Counts rising/falling edges in the signal.'
39 longdesc = '...'
40 author = 'Uwe Hermann'
41 email = 'uwe@hermann-uwe.de'
42 license = 'gplv2+'
43 inputs = ['logic']
44 outputs = ['transitioncounts']
45 probes = {}
46 options = {}
47
3643fc3f 48 def __init__(self, **kwargs):
b41ae47f 49 self.probes = Decoder.probes.copy()
862f6f27
UH
50 self.output_protocol = None
51 self.output_annotation = None
b41ae47f
UH
52
53 # TODO: Don't hardcode the number of channels.
54 self.channels = 8
55
56 self.lastsample = None
57 self.oldbit = [0] * self.channels
58 self.transitions = [0] * self.channels
59 self.rising = [0] * self.channels
60 self.falling = [0] * self.channels
61
3643fc3f 62 def start(self, metadata):
e100d51e 63 self.unitsize = metadata['unitsize']
862f6f27
UH
64 # self.output_protocol = self.output_new(2)
65 self.output_annotation = self.output_new(1)
3643fc3f 66
b41ae47f
UH
67 def report(self):
68 pass
69
862f6f27 70 def decode(self, timeoffset, duration, data):
b41ae47f
UH
71 """Counts the low->high and high->low transitions in the specified
72 channel(s) of the signal."""
1c6fa20f 73
b41ae47f 74 # We should accept a list of samples and iterate...
862f6f27 75 for sample in sampleiter(data, self.unitsize):
b41ae47f
UH
76
77 # TODO: Eliminate the need for ord().
78 s = ord(sample.data)
79
80 # Optimization: Skip identical samples (no transitions).
81 if self.lastsample == s:
82 continue
83
84 # Upon the first sample, store the initial values.
85 if self.lastsample == None:
86 self.lastsample = s
87 for i in range(self.channels):
88 self.oldbit[i] = (self.lastsample & (1 << i)) >> i
89
90 # Iterate over all channels/probes in this sample.
91 # Count rising and falling edges for each channel.
92 for i in range(self.channels):
ad2dc0de
UH
93 curbit = (s & (1 << i)) >> i
94 # Optimization: Skip identical bits (no transitions).
b41ae47f 95 if self.oldbit[i] == curbit:
ad2dc0de 96 continue
b41ae47f
UH
97 elif (self.oldbit[i] == 0 and curbit == 1):
98 self.rising[i] += 1
99 elif (self.oldbit[i] == 1 and curbit == 0):
100 self.falling[i] += 1
101 self.oldbit[i] = curbit
102
103 # Save the current sample as 'lastsample' for the next round.
104 self.lastsample = s
105
106 # Total number of transitions = rising + falling edges.
107 for i in range(self.channels):
108 self.transitions[i] = self.rising[i] + self.falling[i]
109
110 # TODO: Which output format?
111 # TODO: How to only output something after the last chunk of data?
112 outdata = []
113 for i in range(self.channels):
114 outdata += [[self.transitions[i], self.rising[i], self.falling[i]]]
862f6f27
UH
115
116 if outdata != []:
117 # self.put(self.output_protocol, 0, 0, out_proto)
118 self.put(self.output_annotation, 0, 0, outdata)
2b7d0e2b 119