desc = 'Demodulated morse code protocol.'
license = 'gplv2+'
inputs = ['logic']
- outputs = ['morse']
+ outputs = []
+ tags = ['Encoding']
channels = (
{'id': 'data', 'name': 'Data', 'desc': 'Data line'},
)
)
annotations = (
('time', 'Time'),
- ('units', 'Units'),
+ ('unit', 'Unit'),
('symbol', 'Symbol'),
('letter', 'Letter'),
('word', 'Word'),
)
- annotation_rows = tuple((u, v, (i,)) for i, (u, v) in enumerate(annotations))
+ annotation_rows = tuple((u + 's', v + 's', (i,)) for i, (u, v) in enumerate(annotations))
def __init__(self):
+ self.reset()
+
+ def reset(self):
self.samplerate = None
def metadata(self, key, value):
# Annotate symbols, emit symbols, handle timeout via token.
timeunit = self.options['timeunit']
- if self.samplerate is None:
- self.samplerate = 1.0
self.wait({0: 'r'})
prevtime = self.samplenum # Time of an actual edge.
curtime = self.samplenum
dt = (curtime - prevtime) / self.samplerate
units = dt / timeunit
- iunits = round(units)
+ iunits = int(max(1, round(units)))
error = abs(units - iunits)
symbol = (pval, iunits)
continue
self.put(prevtime, curtime, self.out_ann, [0, ['{:.3g}'.format(dt)]])
- self.put(prevtime, curtime, self.out_ann, [1, ['{:.1f}*{:.3g}'.format(units, timeunit)]])
if symbol in symbols:
+ self.put(prevtime, curtime, self.out_ann, [1, ['{:.1f}*{:.3g}'.format(units, timeunit)]])
yield (prevtime, curtime, symbol)
+ else:
+ self.put(prevtime, curtime, self.out_ann, [1, ['!! {:.1f}*{:.3g} !!'.format(units, timeunit)]])
prevtime = curtime
thisunit = dt / iunits
- timeunit += (thisunit - timeunit) * 0.02 * iunits # Adapt.
+ timeunit += (thisunit - timeunit) * 0.2 * max(0, 1 - 2*error) # Adapt.
def decode_morse(self):
# Group symbols into letters.
yield None # Pass through flush of 5+ space.
def decode(self):
+
+ # Strictly speaking there is no point in running this decoder
+ # when the sample rate is unknown or zero. But the previous
+ # implementation already fell back to a rate of 1 in that case.
+ # We stick with this approach, to not introduce new constraints
+ # for existing use scenarios.
+ if not self.samplerate:
+ self.samplerate = 1.0
+
# Annotate letters, group into words.
s0 = s1 = None
word = ''