Age | Commit message (Collapse) | Author |
|
Extend the __init__.py module's doc string. Provide more details to the
user beyond the vendor's name, to increase the decoder's usability.
|
|
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.
[ best viewed as a whitespace ignoring diff ]
|
|
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.
|
|
|
|
[ gsi: minor whitespace adjustment ]
|
|
Command lookup for unknown codes resulted in an exception instead of the
'else' clause which was ineffective. Make the check non-fatal.
[ gsi: rephrased commit message ]
|
|
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 ]
|
|
|
|
This NFC interface chip is used in the HydraNFC Shield v2.
See also dumps used to validate it on https://github.com/sigrokproject/sigrok-dumps/pull/21
|
|
|
|
|
|
|
|
|
|
|
|
This eliminates array copies and indexed access to bit values in the
calling decoder. Prefer common helpers instead.
|
|
This eliminates array copies and bit order reversal in the calling
decoder. Prefer common helpers instead.
|
|
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'.
|
|
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.
|
|
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?).
|
|
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).
|
|
|
|
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.
|
|
The remote is unmarked and belongs to a 60x60cm LED panel. There is
a total of 8 buttons. It's probably some generic remote control.
Bought here: https://www.lumizil.de/led-deckenleuchte-panel-60x60cm
|
|
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.
This resolves bug #1583.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
Concentrate the magic numbers for IR pulse widths at the top of the
source file. Drop more unused variables. Rename others to shorten more
text lines.
|
|
|
|
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.
|
|
|
|
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.
|
|
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.
|
|
|
|
|
|
|
|
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.
This fixes bug #897.
|
|
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.
|
|
Support of the now common RGBW type LED strips (uses 4 bytes instead of 3).
Added an option to select RGB or RGBW
|
|
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.
|
|
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.
|
|
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.
|
|
Move math expressions with always identical values out of the loop, and
improve readability of the packet timeout condition in the process.
|
|
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.
|
|
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.
|
|
|
|
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.
|
|
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.
|