summaryrefslogtreecommitdiff
path: root/decoders/pwm
diff options
context:
space:
mode:
authorGerhard Sittig <gerhard.sittig@gmx.net>2017-06-18 12:59:31 +0200
committerGerhard Sittig <gerhard.sittig@gmx.net>2017-06-20 23:09:51 +0200
commit0172a1661a3addc958269d4251246d2d03cf6368 (patch)
treeb2f625757684f794d1e1505af6bbf541a7bb9c51 /decoders/pwm
parenteb88372396c2264948bc05586fb54dc318266973 (diff)
downloadlibsigrokdecode-0172a1661a3addc958269d4251246d2d03cf6368.tar.gz
libsigrokdecode-0172a1661a3addc958269d4251246d2d03cf6368.zip
pwm: Rephrase edge and period detection, eliminate internal state
With the simplicity of PWM waveforms and the convenience of the v3 API, there is no need to maintain internal state. After the start of the first period was determined based on the input signal's polarity, any period is defined by just the next two edges, and the next period is immediately to follow.
Diffstat (limited to 'decoders/pwm')
-rw-r--r--decoders/pwm/pd.py33
1 files changed, 14 insertions, 19 deletions
diff --git a/decoders/pwm/pd.py b/decoders/pwm/pd.py
index 5d0b4a5..a2fbb0f 100644
--- a/decoders/pwm/pd.py
+++ b/decoders/pwm/pd.py
@@ -61,7 +61,6 @@ class Decoder(srd.Decoder):
self.samplerate = value
def start(self):
- self.startedge = 0 if self.options['polarity'] == 'active-low' else 1
self.out_ann = self.register(srd.OUTPUT_ANN)
self.out_binary = self.register(srd.OUTPUT_BINARY)
self.out_average = \
@@ -93,33 +92,29 @@ class Decoder(srd.Decoder):
def decode(self):
- # Wait for an "active" edge (depends on config).
- self.wait({0: 'f' if self.startedge == 0 else 'r'})
+ # Wait for an "active" edge (depends on config). This starts
+ # the first full period of the inspected signal waveform.
+ self.wait({0: 'f' if self.options['polarity'] == 'active-low' else 'r'})
self.first_samplenum = self.samplenum
- self.start_samplenum = self.samplenum
- # Handle all next edges.
+ # Keep getting samples for the period's middle and terminal edges.
+ # At the same time that last sample starts the next period.
while True:
- pin, = self.wait({0: 'e'})
- if pin != self.startedge:
- # Non-active edge
- self.end_samplenum = self.ss_block = self.samplenum
- continue
+ # Get the next two edges. Setup some variables that get
+ # referenced in the calculation and in put() routines.
+ self.start_samplenum = self.samplenum
+ pins = self.wait({0: 'e'})
+ self.end_samplenum = self.samplenum
+ pins = self.wait({0: 'e'})
+ self.ss_block = self.start_samplenum
+ self.es_block = self.samplenum
- # Active edge
- # We are on a full cycle we can calculate
- # the period, the duty cycle and its ratio.
+ # Calculate the period, the duty cycle, and its ratio.
period = self.samplenum - self.start_samplenum
duty = self.end_samplenum - self.start_samplenum
ratio = float(duty / period)
- # This interval starts at this edge.
- self.ss_block = self.start_samplenum
- # Store the new rising edge position and the ending
- # edge interval.
- self.start_samplenum = self.es_block = self.samplenum
-
# Report the duty cycle in percent.
percent = float(ratio * 100)
self.putx([0, ['%f%%' % percent]])