Gerhard Sittig [Sat, 7 Nov 2020 12:49:06 +0000 (13:49 +0100)]
parallel: rephrase word accumulation after reset introduction
Straighten the accumulation of words from bit chunks that are spread
across several bus cycles (multiplexed transmission). Simplify the PD's
instance variables, keep more state in local vars and explicitly pass
related information to API calls. This also unobfuscates the emission
of annotations and simplifies future maintenance.
Split the accumulation of word data and the emission of its annotation
such that reset related activity can flush accumulated data. Introduce a
warning when word data gets emitted which does not match the configured
word width (early de-assertion of select/enable, or unexpected reset).
Presenting this data and amending it with a warning is considered more
desirable than not seeing the data at all. This does not affect previous
use cases since support for the reset signal was only introduced lately.
Also emit annotations in a more logical order. It's unexpected to see
the resulting word before its last item is seen. Graphical presentation
may not care but automated processing of the decoder output will. This
is the previous order of annotation emission which is surprising and got
fixed in this commit:
This adjusted emission order won't pass the current test implementation,
but manual inspection of the output reveals that all the expected data
is present and matches previously extracted information:
Gerhard Sittig [Sat, 7 Nov 2020 13:38:05 +0000 (14:38 +0100)]
parallel: add support for optional reset/enable/select signal
Add an optional 'reset' signal of user configurable polarity. When the
signal is asserted, the data lines are not interpreted. Assertion will
flush previously accumulated data bits and words. Deassertion can help
synchronize to input streams when the capture started in the middle of
a word. Despite the "reset" name this signal can also be thought of as
"enable" or "select", and increases the versatility and usefulness of
the parallel decoder beyond strictly parallel memory busses.
Construct the list of .wait() conditions and track the positions of
individual terms in that list. This is necessary because "always false"
conditions are not available, thus pin/channel indices and .matched[]
indices don't correspond for sparse input signal assignments.
Accept when previously gathered information became void again, and
re-use existing initialization code for reset related activity.
Gerhard Sittig [Sat, 7 Nov 2020 13:47:21 +0000 (14:47 +0100)]
parallel: add option to sample data on either clock edge
Add 'either' as another choice in addition to rising and falling clock
edge. This is useful since parallel busses exist which communicate at
double data rate (DDR).
Unobfuscate the mapping between displayed option text and .wait()
condition codes while we are here.
Gerhard Sittig [Sat, 7 Nov 2020 12:46:56 +0000 (13:46 +0100)]
parallel: rephrase handling of data lines, symbolic upper bound
Strictly speaking this decoder considers all input signals as optional.
The previous version accepted clock alone. Though reading values from
zero data bits is of limited. Tighten the check for connected inputs.
Inline the declaration of all channels in the decoder boiler plate, the
helper routine was only used in a single spot. Change the order of the
data lines stripe details and the .wait() conditions, improve locality
of assignment and use of related variables.
Don't assume that "all channels but clock" are data lines. Use a
symbolic upper bound for the data lines partition, to prepare the
introduction of a reset/enable signal.
Gerhard Sittig [Sat, 1 Aug 2020 07:29:39 +0000 (09:29 +0200)]
ir_nec: sort and comment timing specs, drop tolerance option
Extend comments on the IR NEC timing details. Sort the symbols by their
width to reflect their relation (ONE to ZERO to STOP is each half of
their predecessor's width).
Increase the open coded tolerance percentage, and remove the option for
the value. Make sure leader and repeat codes still can be told from each
other.
Gerhard Sittig [Sat, 1 Aug 2020 07:17:37 +0000 (09:17 +0200)]
ir_nec: concentrate timing at the top of the source file
Move IR NEC protocol timing details to the top of the source file, for
raised awareness and easier adjustment. Specs are "unit-less" (only have
comments), but are scaled for improved readability. Values are copies of
the previous implementation.
ir_nec: Add option for automatic polarity detection
Provide an option to have the decoder automatically detect the IR signal's
polarity. Stick with active-low by default for backwards compatibility,
because this auto-detect implementation assumes that the capture starts
with an idle phase.
[ gsi: rephrased message and implementation, auto-detect off by default ]
Provide an option to adjust the IR NEC decoder's tolerance. Which makes
signals accessible that are generated by cheap remotes which would not
decode at all with the previous implementation and its fixed limit.
[ gsi: rephrased commit message and implementation ]
ir_nec: Annotate IR frame already at the end of the STOP bit
Emit annotations for the current IR frame as soon as possible, at the
very end of the STOP bit. Don't defer annotation emission until the
start of the next frame is seen. This unbreaks captures where the last
IR frame would not decode before.
[ gsi: rephrased commit message, updated comment in the implementation ]
Gerhard Sittig [Sun, 30 Aug 2020 05:20:33 +0000 (07:20 +0200)]
sle44xx: support memory read "to end of capacity"
Assume a maximum memory capacity, currently open coded, could become a
user servicable option when needed. Automatically flush the accumulated
outgoing data when a memory read reaches address 256.
Drop the unconditional START condition check now that it became obsolete.
Gerhard Sittig [Tue, 28 Jul 2020 15:37:11 +0000 (17:37 +0200)]
sle44xx: optionally use samplerate to show processing durations
The protocol is clocked, so strictly does not depend on the samplerate.
When the samplerate is available, the duration of internal processing
(memory erase and write) can get annotated. It's an optional feature.
The datasheet suggests that write and erase time are in the range of a
few milliseconds. Normalize to ms units and provide 10us resolution.
Rephrase how the decoder's progress during data interpretation gets
tracked. Extend the set of .wait() conditions in the main loop, and
determine START/STOP conditions and BIT validity there already, which
reduces redundancy with called handlers.
Increase the decoder's coverage of the memory card's feature set and
constraints. Handle the optional CLK during RST, to tell interrupted
memory access from card reset. Interpret known command codes, to present
their meaning and arguments to users, and to tell "outgoing data" (the
card's memory content) from "internal processing" (providing clock until
the card signals completion of a write access). Get initial statistics
on internal processing (clock count, and terminal I/O level, no duration
in units of wall clock time yet).
Unfortunately there is no reliable condition to detect the end of a
memory read when it executes to the end of the memory card's capacity.
That's why START detection is more greedy than specified, to reliably
re-sync to subsequent commands and their byte sequences.
Arrange for an improved set of annotation rows with symbols (bit level),
fields (data bytes), and operations details (summary of memory access
including protection).
Rename the binary output. It carries "any bytes" which were seen, the
command bytes as well as response data bytes.
Gerhard Sittig [Sat, 29 Aug 2020 10:31:31 +0000 (12:31 +0200)]
sle44xx: rephrase ss/es passing for annotation emission
Coupling the logic which interprets input signals at different levels
and the helpers which emit annotations by means of "global" variables
(public members of the decoder object) is unfortunate. It complicates
the logic, adds unnecessary dependencies, and makes maintenance rather
tedious and error prone.
Pass ss/es times to put() routines the same way as annotation classes
and annotation texts are passed. This simplifies the logic where bits
and bytes levels and additional rows are handled. The data values and
their spans all become local information that gets determined in the
same context. Which dramatically simplifies review.
Gerhard Sittig [Tue, 18 Aug 2020 19:05:17 +0000 (21:05 +0200)]
sle44xx: minor developer comment and style nits
These are just nits, behaviour remains. The comment may be incorrect
how command and data modes are detected. Add a developer comment for
later revisit. Drop unneeded parentheses in a ternary operation, and
move an ATR related comment around.
Gerhard Sittig [Tue, 28 Jul 2020 15:38:45 +0000 (17:38 +0200)]
sle44xx: don't assume RESET at the start of the capture
The decoder cannot know the state of the input signal before the start
of the capture. Assuming the RESET state results in incorrect output for
data bits which we don't know the context of. Start from unknown state
instead until a reliable condition is seen to synchronize to.
Gerhard Sittig [Mon, 27 Jul 2020 19:58:55 +0000 (21:58 +0200)]
sle44xx: rework data bits accumulation, and byte presentation
The 'databyte' is strictly local to the routine when 8 bits were seen.
The 'bitcount' is redundant and becomes obsolete when bits[] is a Python
list. The comment and the code disagreed, the wire is said to communicate
bits in LSB first order, the implemenation kept accumulating bits in the
reverse order (the annotation part, not the data byte math). Prefer the
common helper to convert bits to bytes.
There is uncertainty about the bit width "estimation" logic. The main
loop's .wait() conditions suggest that data bit values are valid for the
period of high CLK, which provides an easier and more robust condition
for annotation boundaries. Add a comment for now. The order of bit and
byte values' annotation emission is unfortunate, too.
Gerhard Sittig [Mon, 27 Jul 2020 19:15:20 +0000 (21:15 +0200)]
sle44xx: rephrase annotation text construction
Concentrate all text variants for zoom levels in a single spot. Remove
duplicates, and on the other hand add more verbose phrases to support
users which are not intimately familiar with the protocol. Prefer the
Python strings .format() method over the % operator for its versatility
and readability.
Gerhard Sittig [Mon, 27 Jul 2020 18:20:52 +0000 (20:20 +0200)]
sle44xx: use symbolic identifiers for annotation classes
Eliminate magic numbers for annotation classes, prefer symbolic names
instead to improve readability. Put the annotation classes in an order
which matches the annotation rows' order. Reduce indentation in the
'proto' table while we are here (yet keep the vertical alignment).
Gerhard Sittig [Mon, 27 Jul 2020 15:57:04 +0000 (17:57 +0200)]
sle44xx: remove incomplete Python output for now
The current implementation exclusively communicated the 'RESET'
condition but nothing else. Remove the Python output from the decoder,
it's easy to re-introduce when a complete implementation materializes.
There also is no known recipient of SLE44xx Python output right now
which would expect to see even the currently implemented subset.
Gerhard Sittig [Mon, 27 Jul 2020 15:48:40 +0000 (17:48 +0200)]
sle44xx: extend decoder doc string, add "memory cards" hint
Add a stronger hint to "memory cards", users might expect to see this
detail in the decoder's description. Rephrase how the reset line will
terminate pending memory reads.
The decoder was created in an older setup and would not load in recent
applications. Add missing boilerplate which is mandatory. Rename 'data'
since annotation classes and rows must not have ambiguous names, and
there is no singular form of 'data' -- use 'fields' instead. This also
fixes a missing line termination at the end of the text file.
sle44xx: introduce decoder for Siemens memory cards
Introduce an initial implementation of the SLE44xx protocol decoder for
Siemens/Infineon SLE 4418/28/32/42 memory cards. ATR (Answer To Reset),
command and data bytes get displayed, and RESET/abort events are marked.
Extracted data bytes are made available as binary output.
Gerhard Sittig [Wed, 12 Aug 2020 18:08:35 +0000 (20:08 +0200)]
sdq: prefer Python's .format() method for string formatting
Prefer the .format() method over the % operator. Also vertically align
the non-trivial text alternatives for different zoom levels to simplify
comparison and adjustment during maintenance.
Gerhard Sittig [Wed, 12 Aug 2020 18:03:06 +0000 (20:03 +0200)]
sdq: use symbolic names for pins and annotation classes
Eliminate magic numbers which are too hard to read and too easy to get
wrong during maintenance. Prefer symbolic identifiers instead for pins
and annotation classes.
Gerhard Sittig [Wed, 12 Aug 2020 16:47:37 +0000 (18:47 +0200)]
sdq: simplify decode routine, no state machine required
Move the initial synchronization to the input data out of the main loop,
and handle the BREAK symbol when it was seen. Turns out that no state
machine is required to decode the SDQ protocol.
Gerhard Sittig [Wed, 12 Aug 2020 16:47:01 +0000 (18:47 +0200)]
sdq: only use samplerate and options values after validity check
Move the calculation which involves the samplerate as well as user
provided options out of the meta packet reception and to the top of the
decode() method. Especially only use the samplerate after it was tested
for availability.
BenediktO [Wed, 25 Mar 2020 13:05:13 +0000 (14:05 +0100)]
lpc: improve performance, use proper .wait() condition
Use a proper .wait() condition to have edges detected in common code,
and avoid the many transitions between C and Python. This dramatically
increases performance of the LPC protocol decoder.
[ gsi: rephrased and reflowed the commit message ]
Gerhard Sittig [Thu, 23 Jul 2020 15:23:24 +0000 (17:23 +0200)]
common: add LSB/MSB first bitpack variant with optional index
The CAN decoder collects bits in MSB first order. The SIRC decoder keeps
lists of tuples with bits and their ss/es. Introduce common logic for
LSB and MSB first arguments, and optional array index access, to reduce
redundancy at callers'.
Gerhard Sittig [Wed, 22 Jul 2020 20:05:54 +0000 (22:05 +0200)]
can: avoid assignment to .id field during frame inspection
The CAN frame's ID field gets stored in an .id member, which is
unfortunate. Use .ident instead. The 'id' identifier is a Python
language word, though it's used for PD boilerplate as well. Assume
that the boilerplate is worth keeping, and harder to adjust (more
dependencies), so adjust this PD's implementation to resolve the
ambiguity.
Gerhard Sittig [Wed, 22 Jul 2020 20:02:23 +0000 (22:02 +0200)]
can: use common helper for bits to number conversion
Eliminate repeated local string manipulation for the purpose of
number conversion from bits input. Prefer the common helper instead
(is an MSB first variant desirable to simplify call sites more?).
Gerhard Sittig [Wed, 22 Jul 2020 19:56:17 +0000 (21:56 +0200)]
can: amend recently added Python output feature
Adjust nits in the previous commit which added Python output to the CAN
decoder. Rename the routine to .putpy() for consistency with other PDs.
Avoid the 'bytes' identifier as it ships with Python as a data type.
Rephrase the construction of the tuple for Python output, to become more
explicit and help reviewers. Partially "undo" the rtr rename, to reduce
diffs to the previous version (see diff HEAD~2 to see the essence). Fix
up a three space indentation issue (which was there before the addition
of Python output).
Gerhard Sittig [Sun, 26 Jul 2020 06:45:32 +0000 (08:45 +0200)]
ir_nec: improve robustness, present more data on invalid input
Don't terminate IR frame inspection when successfully decoded fields
fail the validity check. Reset internal state on long periods of idle
level instead (beware of the late detection of the STOP condition).
Unconditionally annotate received fields, and optionally amend them with
a warning annotation. It's unexpected to not see the address field value
at all just because the number was not acceptable for the potentially
incorrect protocol selection.
Rename a variable in the decode() routine. The 'b' identifier suggested
a bit value, but it was used for the pulse width.
Gerhard Sittig [Sat, 25 Jul 2020 15:56:54 +0000 (17:56 +0200)]
ir_nec: add support for extended NEC protocol (16bit address)
Add support for the extended NEC protocol, where the address field spans
16 bits and the complement is not sent. Commands still span 8 bits and
are sent in normal and in inverted form. The user needs to select the
extended protocol (off by default for compatibility), the input data
does not allow automatic detection of the protocol variant. It's also
not appropriate to assume the extended format when the address field
happens to fail the validity check.
The unfortunate mix of data value checks and annotation emission in
combination with "global" state makes this implementation more redundant
than I would like. A later cleanup is desirable.
Gerhard Sittig [Sat, 25 Jul 2020 15:55:26 +0000 (17:55 +0200)]
ir_nec: use common helper for bit accumulation
The input signal's polarity ('active' variable) is strictly local to the
decode() method. The 'count' becomes obsolete when 'data' is kept in a
Python list. Conversion of bit patterns to numbers is provided by common
helpers. Alpha-sort Python imports while we are here.
This commit also renames a few variables in the normal/inverted check
for valid input data. Which can help the introduction of support for the
extended protocol, by decoupling what gets checked and what gets shown.
Gerhard Sittig [Sat, 25 Jul 2020 15:53:27 +0000 (17:53 +0200)]
ir_nec: rephrase button lookup and addr/cmd validity checks
Eliminate redundancy in the check for database entries of button events.
Tighten the check for valid address and command bit patterns. The former
implementation did something unexpected, wanted the AND of the first and
second 8bit patterns to become zero. But the second 8bit item has not yet
become available when the test runs after the reception of the first 8bit
item. So the test happened to "pass" unexpectedly in intermediate steps,
and failed to catch invalid input data when all fields became available.
Unfortunately the check for valid data and the emission of annotations
was combined in the implementation. So it's essential to keep running
the "check" routine to get the annotations, and update internal ss/es
state. But only emit warnings when the check fails after all involved
data became available. Check for strict XOR as per the protocol spec.
Gerhard Sittig [Sat, 25 Jul 2020 15:51:07 +0000 (17:51 +0200)]
ir_nec: only use the samplerate after receiving the value
The metadata() method unconditionally referenced the samplerate even
though the value is only available conditionally. Move the references to
a location after the samplerate presence check.
Eliminate magic numbers, use symbolic names for annotation classes and
pin numbers. Also vertically align text variants for zoom levels in the
more complex cases, to simplify maintenance. Prefer .format() calls to
improve readability in the more complex invocations.
Gerhard Sittig [Wed, 22 Jul 2020 18:41:33 +0000 (20:41 +0200)]
ir_sirc: minor Python and other nits
The .wait() wrapper always receives Python lists. There is only a single
IR pin (and its value isn't even used anywhere because appropriate edge
conditions get constructed). There is a delicate ss/es detail in the
.decode() routine concerning the IR frame's annotation's start. Don't
"continue" in the loop body's last statement, just "pass" and continue.
Gerhard Sittig [Wed, 22 Jul 2020 17:55:07 +0000 (19:55 +0200)]
ir_sirc: reduce smarts to improve maintenance (.wait() API change)
Eliminate redundancy in time to snum conversions and vice versa. Don't
locally overload .wait() with unexpected semantics and neither change
its parameters nor return values. Give reviewers and maintainers a
chance to see what's happening when they inspect call sites. The
'signals' identifier is unusual for pin states, use the more common
'pins' instead for consistency with other decoders. Reflect when return
values are not used, so that readers need to juggle fewer details in
their head.
Gerhard Sittig [Wed, 22 Jul 2020 17:38:44 +0000 (19:38 +0200)]
ir_sirc: .put() nits, common helpers, whitespace
Wrap the .put() routine which eliminates redundancy and shortens a few
code lines. Vertically align text variants for different zoom levels.
Prefer common helpers for bit accumulation which eliminates a local copy
of that feature. Address minor whitespace nits, alpha-sort imports.
Gerhard Sittig [Mon, 20 Jul 2020 20:21:30 +0000 (22:21 +0200)]
ir_sirc: fixup decoder boilerplate
The SIRC decoder was written to an older API, and failed to load in a
recent environment (tag missing, ambiguous annotation names). Unbreak
the decoder's boilerplate, and address other nits while we are here:
There is no Python output. Use the same declaration syntax as in other
decoders for improved maintenance (greppability). Call reset() from
__init__() to avoid surprises when a future version does have vars. Do
provide a doc string in the module initialization, to keep the URL for
the protocol description at hand.
Arno Morbach [Mon, 13 Jan 2020 13:30:16 +0000 (14:30 +0100)]
spdif: Fix various issues.
Bug #897 and my own experience caused me to improve the SPDIF decoder.
The following issues were addressed and resolved:
1. The Error: "srd: ValueError: Protocol decoder instance spdif-1:
invalid literal for int() with base 2: '121111012112021111012120'"
This error can happen if the sample rate is marginal. The correct function
of the decoder depends on the position of the data stream. The pulse width
calculation was wrong and the pulse width detection sometimes thought the
same pulse classes to be different.
The new decoder explicitly checks for short pulses and reports an error
with a corresponding message.
2. Bitrates were calculated wrong: The shown results were not usable at all.
The new decoder uses the first ten frames to calculate the bit rates and
uses the correct measurement units.
Possible issue: The bit rate calculation assumes an ongoing data stream.
It uses the time between the first and 10th frame.
They need to be sent without interruption. But this should be no problem
because SPDIF is meant to be a continuous stream.
3. A missing samplerate, e.g. when used in sigrok-cli with binary input, lead
to an error message on the original decoder.
The new decoder just skips the output of the bitrate if the samplerate is
missing. A missing samplerate no longer raises an error but only a message
in the data output.
4. The user was not informed about the integral steps of the decoder.
The new decoder shows the results of the synchronisation process at the
beginning. This can help to understand the behaviour of the decoder.
Gerhard Sittig [Sun, 19 Jul 2020 17:41:18 +0000 (19:41 +0200)]
numbers_and_state: introduce decoder (based on vector slicer)
The idea was taken from the vector slicer as suggested in github PR 17.
The code was rewritten to avoid cluttering the decoder set with lots of
tiny implementations. Create a single decoder which does all of the bit
accumulation as well as number format interpretation and also includes
number to text formatting with user selectable presentations. Optional
clock is supported, to avoid too many annotations in glitchy setups. The
IEEE 754 format was added as another interpretation. The enum code path
accepts data files in either the Python or JSON format (the latter feels
backwards to me). Putting enums on separate rows helps visualize state
transitions. Users can disable GUI traces or select CLI rows to silence
the output if it feels noisy.
The most appropriate (useful, and usable) number of supported channels
is yet to get determined. This version accepts up to 16 inputs.
Gerhard Sittig [Sun, 19 Jul 2020 06:44:00 +0000 (08:44 +0200)]
irmp: silence "illegal character encoding" compiler warning
Replace non-ASCII characters in the FDC keyboard map with their
respective number values, since the character presentation is
non-portable and results in compiler warnings.
A similar change was done in IRMP version 3.2.0 (SVN r192 as of
2020-06-22) which the sigrok project has not caught up with yet.
Gerhard Sittig [Sat, 18 Jul 2020 18:30:43 +0000 (20:30 +0200)]
caliper: rephrase measurement annotation text construction
Unclutter the construction of the annotation text for measurements.
Prefer one code block over multiple scatterred lines. Only do string
formatting when an annotation gets emitted. Prefer .format() for its
better control over generated text. Fixup remaining Python idioms in
the unit conversion block while we are here.
Gerhard Sittig [Sat, 18 Jul 2020 18:05:42 +0000 (20:05 +0200)]
caliper: use common code for packet timeout
The previous implementation unconditionally waited for up to 1ms, and
optionally handled the user configured timeout period. Use common code
instead to handle the full span of the timeout period. Which somewhat
unclutters the .decode() routine's body by eliminating an unnecessary
step in the sequence. This change also reduces indentation, and prefers
Python's .format() over the old syntax.
Gerhard Sittig [Sat, 18 Jul 2020 17:45:22 +0000 (19:45 +0200)]
caliper: use common code for bit accumulation
There is only one annotation, rename ss/es for consistency with other
decoders. Move a conversion constant to the top of the source file, and
rename some identifiers to increase readability of math expressions.
There is no point in constructing numbers in MSB first order and then
reversing their bit order. Prefer Python lists for accumulated bits, and
common code for number conversion. Use one code block for the extraction
and conversion of received data instead of a set of scattered lines.
This shall increase readability of the data extraction, and eliminates
redundancy in the implementation.
Gerhard Sittig [Sat, 18 Jul 2020 16:40:50 +0000 (18:40 +0200)]
caliper: slight refactoring of common pieces
Merge .reset_data() into .reset() since no other location called it.
Move self.options[] lookup out of the loop, drop state from self when
it's strictly local to .decode(). Use a common annotation emission
routine, and vertically align text variants for zoom levels. This
further reduces the lengths of a few text lines.
Gerhard Sittig [Sat, 18 Jul 2020 16:14:19 +0000 (18:14 +0200)]
caliper: fixup boilerplate (and some coding style and whitespace)
The caliper decoder was written against an older version of the library
and failed to load in recent environments. Fixup the decoder boilerplate
(eliminate ambiguous annotation class/row names, drop the IC tag) and
address other style nits while we are here (rephrase user visible text,
break a few long lines, adjust some of the indentation and whitespace
issues, drop dead code). Remaining issues get addressed later.
Gerhard Sittig [Sat, 18 Jul 2020 11:15:41 +0000 (13:15 +0200)]
ir_irmp: enforce "one instance" limitation for IRMP library
The IRMP core library is not prepared for threading or interleaved use
by multiple call sites for different data streams, internal state is
kept in global vars (MCU project heritage). Adjust the Python wrapper,
create one usable instance, and several more which fail to execute.
Fail late such that users see error messages.
The approach isn't pretty, but avoids segfaults when re-loaded sessions
assign multiple decoder instances, and raises user's awareness of the
"one instance" limitation by established means: "decoder error" bar, and
log messages, with a description to point out the cause.
This commit implements a dirty modification of a singleton. It's a pity
that Python appears to lack reliable destruction, hence the whole class
remains blocked even if the instance is released. Move all library use
into pd.py:decode() in the hope that Python's 'with' could help in a
future implementation. Prepare to either present a generic message that
is generated by pd.py, or pass on a text that originates in the Python
wrapper for the C library.
Gerhard Sittig [Fri, 17 Jul 2020 21:04:34 +0000 (23:04 +0200)]
ir_irmp: add support for button "release" flag
Recent upstream IRMP core versions introduced a "release" flag in
addition to the "repeat" flag. Prepare the decoder to present these
flags when libraries should pass them in results.
The flags' being orthogonal slightly complicates the logic which
constructs annotation texts. Do provide text variants for all previously
supported zoom levels, yet try to keep the implementation as simple as
possible: Match list lengths for simplified folding. Always print the
flags field even if none of the flags is active (kind of was done before
this change as well, just not visible). This approach easily accepts
more flags as needed in future versions.
Gerhard Sittig [Sat, 22 Feb 2020 09:28:54 +0000 (10:28 +0100)]
ir_irmp: touch up the IRMP based decoder implementation (Python side)
Address Python and sigrok project coding style nits in the IRMP based
decoder for infrared signals. Re-add the attribution which was lost in a
previous copy and forgotten in the recent submission. Eliminate camel
case identifiers and adjust to the simplified Python binding API. Drop
remaining diagnostics from development and dead code (unused carrier
detection). Reword the boilerplate text to match other decoders. Avoid
Python f-strings since they are not portable. Prefer slightly less
cryptic variable names in the construction of annotation texts. Defer
the creation of the library instance until actual decoder use. Start
inspecting the input data at the very first samples in the input stream.
Gerhard Sittig [Sat, 22 Feb 2020 09:19:26 +0000 (10:19 +0100)]
ir_irmp: introduce IRMP based decoder for infrared signals
Commit the decoder as it was provided by Rene Staffen. Which appears to
be a slightly modified version of one of the other IR decoders, though
the boilerplate doesn't say so.
Gerhard Sittig [Sat, 22 Feb 2020 09:16:16 +0000 (10:16 +0100)]
irmp: rework the Python language binding for the shared library
Rename the Python language binding's source file and identifiers to
eliminate camel case (most of it, stick with camel case in Python class
names as is the convention). Adjust whitespace and arrange tables such
that their indentation will last during maintenance.
Re-add the license text which was missing in the original submission's
copy of another decoder. Add copyright information for this submission.
Don't "import *" from ctypes(3), use explicit references instead. Avoid
double underscores as single leading underscore is already bad enough.
Adjust the Python side to the C library's renamed API routines.
Create a result data structure layout that only has a single level of
nesting, which better represents the C library's interface. Only flags
"get unfolded" in the Python binding, to eliminate magic numbers.
Prepare to support more platforms than Linux (detected) and Windows (the
default when nothing else got detected).
Gerhard Sittig [Sat, 22 Feb 2020 08:52:39 +0000 (09:52 +0100)]
irmp: hook up IRMP to the build, create a separate shared object
Add the irmp/ subdirectory to the automake build instructions. Make the
feature optional, provide an enable/disable switch (on by default).
It's an essential implementation detail that the irmp.c file is required
to build, but is not a compile unit of its own. It's yet to be seen how
to most appropriately declare the dependencies of libirmp_la (can get
refined in future commits).
Create a separate shared object from the IRMP source, which shall result
in a stable filename for the DLL/.so lookup. Decoder library code would
not know the application's executable name, neither is anonymous symbol
lookup "in the current process" portable across supported platforms.
The configure.ac macros were modelled after the autobook DLL section.
https://www.sourceware.org/autobook/autobook/autobook_137.html
Symbol export is simple because the library gets implemented and built
here, but is not used from C language code in this project. That's why
we don't do the full dance of symbol import which would be needed on
Windows.
Gerhard Sittig [Sun, 23 Feb 2020 04:26:18 +0000 (05:26 +0100)]
irmp: workaround incomplete platform detection when under libtool
The upstream IRMP project builds fine with direct gcc(1) invocation.
While the same imported source fails detection and then defaults to AVR
when built under libtool in the libsigrokdecode setup.
Provide the symbols which IRMP logic expects, to reduce changes against
upstream sources. Derive these symbols from conditions that are checked
in the sigrok project in other locations, too.
Gerhard Sittig [Sat, 22 Feb 2020 06:27:58 +0000 (07:27 +0100)]
irmp: rework shared library (style, reliability, TODO items)
Address several style nits in the previous implementation of the PC
library, but keep the core as is to simplify future upstream tracking.
Eliminate camel case identifiers, and in(?)/out prefixes for variables,
only keep s_ for global(?) variables. Fixup whitespace, reduce a little
indentation where appropriate. Separate variable declaration from later
assignments and updates to improve readability. Use C style comments.
Drop initializer values for .bss variables. Decorate the declaration as
well as implementation of routines for symbol export. Improve robustness
of name lookups in the list of known protocols.
Prefer native C language data types in the public API. Normalize data in
the wrapper so that application code need not care. Make the byte buffer
API for IR frame detection optional. The API is limited and overloaded
at the same time, and may need more consideration.
Extend comments in spots which are essential for proper operation, or
which encode non-obvious details of the build system. Control visibility
of public API identifiers on non-Windows platforms, too. Rephrase the
doxygen comments for more formal API documentation. Discuss limitations
in the current implementation. Keep a TODO list in the source code.
Gerhard Sittig [Sat, 22 Feb 2020 06:09:37 +0000 (07:09 +0100)]
irmp: introduce PC side shared library code for IRMP core logic
Introduce sources which implement a shared object (DLL) which embeds the
IRMP core logic, receives pin values from an application, and makes IR
detection from previously captured data available in PC environments as
a library, in contrast to the text oriented desktop applications and the
MCU firmware which existed before in the upstream project.
Gerhard Sittig [Sat, 22 Feb 2020 05:49:03 +0000 (06:49 +0100)]
irmp: introduce variables for start of IR frame and current sample
Introduce variables in the IRMP core logic which track the current
sample number, and the position where the start of an IR frame got
detected. The variables are conditional (ANALYZE builds only).
Provided by: Rene Staffen
Local modification: Drop the initializer for the static variables.
They reside in .bss and need not occupy .data space.
Gerhard Sittig [Sat, 22 Feb 2020 05:44:29 +0000 (06:44 +0100)]
irmp: adjust config for PC library use (32bit, 20kHz, more protocols)
This change enables most IR protocol variants (35 of them), as well as
32bit wide counters, and uses the highest supported samplerate of 20kHz
by default. Which shall result in most reliable detection of protocols
and an appropriate feature set for PC library use.
Gerhard Sittig [Sun, 23 Feb 2020 04:49:51 +0000 (05:49 +0100)]
irmp: silence missing prototype compiler warning
The sigrok project enforces warnings when public routines of compile
units lack prototypes. Add a prototype for the irmp.c:print_spectrum()
routine to silence a compiler warning. An alternative would have been to
mark the routine as static (it's exclusively used within the same file).
The #else inside a multi line comment in combination with the excess yet
commented #endif threw off my editor's syntax highlighting and parentheses
matching. Use "#if 0" instead to disable the empty side of ANALYZE macros
which some PIC compilers are said to not support. No change in behaviour.
Gerhard Sittig [Sat, 22 Feb 2020 05:29:16 +0000 (06:29 +0100)]
irmp: silence printf(3) format warnings (simple approach)
Pick low hanging fruit. Stick with the previous implementation's format
specifiers, assume that they work on all platforms which IRMP supports.
Cast arguments to mere integers where necessary instead, again assume
that their range fits as they did in the previous implementation. This
silences several of these compiler warnings:
irmp.c:3332:25: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘long unsigned int’ [-Wformat=]
ANALYZE_PRINTF ("protocol = NIKON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",
^