import sigrokdecode as srd
+class SamplerateError(Exception):
+ pass
+
class Decoder(srd.Decoder):
api_version = 3
id = 'pwm'
license = 'gplv2+'
inputs = ['logic']
outputs = ['pwm']
+ tags = ['Encoding']
channels = (
{'id': 'data', 'name': 'Data', 'desc': 'Data line'},
)
)
def __init__(self):
+ self.reset()
+
+ def reset(self):
+ self.samplerate = None
self.ss_block = self.es_block = None
- self.first_samplenum = None
- self.start_samplenum = None
- self.end_samplenum = None
- self.num_cycles = 0
- self.average = 0
def metadata(self, key, value):
if key == srd.SRD_CONF_SAMPLERATE:
self.put(self.ss_block, self.es_block, self.out_ann, [1, [period_s]])
def putb(self, data):
- self.put(self.num_cycles, self.num_cycles, self.out_binary, data)
+ self.put(self.ss_block, self.es_block, self.out_binary, data)
def decode(self):
+ if not self.samplerate:
+ raise SamplerateError('Cannot decode without samplerate.')
+
+ num_cycles = 0
+ average = 0
# Wait for an "active" edge (depends on config). This starts
# the first full period of the inspected signal waveform.
# 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
+ start_samplenum = self.samplenum
+ self.wait({0: 'e'})
+ end_samplenum = self.samplenum
+ self.wait({0: 'e'})
+ self.ss_block = start_samplenum
self.es_block = self.samplenum
# Calculate the period, the duty cycle, and its ratio.
- period = self.samplenum - self.start_samplenum
- duty = self.end_samplenum - self.start_samplenum
+ period = self.samplenum - start_samplenum
+ duty = end_samplenum - start_samplenum
ratio = float(duty / period)
# Report the duty cycle in percent.
self.putp(period_t)
# Update and report the new duty cycle average.
- self.num_cycles += 1
- self.average += percent
+ num_cycles += 1
+ average += percent
self.put(self.first_samplenum, self.es_block, self.out_average,
- float(self.average / self.num_cycles))
+ float(average / num_cycles))