13 days agoutil: silence printf format compiler warnings (Python ssize_t) master
Gerhard Sittig [Thu, 24 Nov 2022 12:10:04 +0000 (13:10 +0100)]
util: silence printf format compiler warnings (Python ssize_t)

On some platforms PY_FORMAT_SIZE_T seems to be ineffective, resulting in
compiler warnings about printf format data type mismatches (observed in
MXE builds).

Silence the warnings. Prefer the ssize_t data type instead which we know
the printf format of, reliably.

13 days agotype_decoder: silence print format warnings, greppable messages
Gerhard Sittig [Fri, 28 Sep 2018 18:23:36 +0000 (20:23 +0200)]
type_decoder: silence print format warnings, greppable messages

Silence printf(3) format warnings. Python's data types should be
considered opaque, size (and signedness) are usually unknown, as is
the relation to standard C language print format specs.

Unbreak long messages which were spread across several source code
text lines. This complies to Linux style guides. Being able to find
diagnostics messages that were reported by users in sources is more
important than sticking to an arbitrary text line length.

13 days agonit: break a long line in different ways, unobfuscate parameter grouping
Gerhard Sittig [Mon, 10 Oct 2016 16:25:37 +0000 (18:25 +0200)]
nit: break a long line in different ways, unobfuscate parameter grouping

Break a rather long line for a Python method call at a different
location, to better reflect the parameter groups which organize for the
method to get called, and those which pass parameters to that called
method. This commit also splits the actual action and its check for
successful execution into separate C language statements.

2 months agoparallel: flush accumulated data when input data is exhausted
Gerhard Sittig [Mon, 3 Oct 2022 16:29:46 +0000 (18:29 +0200)]
parallel: flush accumulated data when input data is exhausted

The "parallel" decoder buffers the currently seen data pattern, and
defers annotation emission until the end position is known. Which is
why the last data pattern would not show up in the decoder's output.
See bug #292 and its duplicates for examples and concerns.

Catch the EOFError exception, and flush previously accumulated data.

It is yet to get determined whether a warning annotation is due. Most
probably not for "parallel" which merely visualizes data line states.
But other decoders which have the concept of frames shall NOT follow
this "parallel" decoder's naive approach, and claim that a frame had
completed although its end condition was never seen. Add a developer
TODO comment to raise awareness.

2 months agotype_decoder: update .samplenum before ending .wait() with EOFError
Gerhard Sittig [Mon, 3 Oct 2022 16:23:34 +0000 (18:23 +0200)]
type_decoder: update .samplenum before ending .wait() with EOFError

When the protocol decoder's input data is exhausted, then the .wait()
method will raise the EOFError exception. Python decoders can catch this
exception and handle the condition. For proper annotation emission it is
essential that the self.samplenum value corresponds to the last position
in the input stream. Update it before returning from the .wait() call.

3 months agosrd: add support for SIGROKDECODE_PATH environment variable
Gerhard Sittig [Sun, 21 Aug 2022 11:54:58 +0000 (13:54 +0200)]
srd: add support for SIGROKDECODE_PATH environment variable

The optional SIGROKDECODE_DIR environment variable accepts a single
directory specification. The SIGROKDECODE_PATH variable accepts a list
of directories to search protocol decoders. The list separator is
platform dependent (colon or semicolon). Empty items are explicitly
ignored. Both variables get evaluated. Behaviour remains backwards
compatible, just gets extended for improved usability.

3 months agosrd: add TODO comment on the SIGROKDECODE_DIR env var's motivation
Gerhard Sittig [Sun, 21 Aug 2022 11:52:19 +0000 (13:52 +0200)]
srd: add TODO comment on the SIGROKDECODE_DIR env var's motivation

A comment in the srd.c implementation suggests that the environment
variable SIGROKDECODE_DIR would serve debugging purposes and would
override other incarnations of available decoders. I disagree with
either of these interpretations. Add a TODO comment, the phrase may
need an update or rework.

7 months agouart: don't re-calculate in-frame bit position, just count the bits
Gerhard Sittig [Fri, 22 Apr 2022 20:45:06 +0000 (22:45 +0200)]
uart: don't re-calculate in-frame bit position, just count the bits

The .get_wait_cond() routine kept re-calculating the current bit index
in the currently inspected UART frame. Just count the bits instead as
they are seen/taken. This eliminates redundant complex logic which had
hard to track down issues in past revisions. Increases robustness, and
improves maintainability.

7 months agouart: handle two stop bits configuration
Gerhard Sittig [Sat, 23 Apr 2022 17:20:42 +0000 (19:20 +0200)]
uart: handle two stop bits configuration

Sample and process multiple STOP bits as specified, add 2.0 to the list
of supported configurations. This implementation works as expected with
integer numbers of STOP bits (0, 1, 2). For half-bits the sample point
as well as the annotation position will be incorrect (as a result of an
internal implementation detail of the existing decoder which is not easy
to address).

This commit reduces the diff size, and remains backwards bug-compatible.
Fixing the bit boundaries in annotations including support for half-bits
is more involved, and remains for a later commit.

7 months agouart: handle zero stop bits configuration
Gerhard Sittig [Wed, 13 Apr 2022 19:10:00 +0000 (21:10 +0200)]
uart: handle zero stop bits configuration

Use common code to advance internal state during UART frame inspection.
This reduces redundancy, and improves robustness. Data bits collectors
need not worry about the optional presence of subsequent fields (parity,
stop bits, both can be absent).

Improve the separation of implementation details of the lower layer UART
frame decoding from upper layer protocol handling. Concentrate the post
processing of UART frames, BREAK and IDLE conditions in the source, and
keep the ss/es determination at the caller which detected the condition
by arbitrary means.

This unbreaks the decoder's operation when 0 stop bits are configured.
The implementation still assumes that the line goes idle between frames
even when zero stop bits are configured. Strictly speaking this decoder
now copes with traffic that uses "less than half a stop bit".

7 months agosbus_futaba: add decoder for SBUS hobby remote control by Futaba
Gerhard Sittig [Wed, 20 Apr 2022 05:58:28 +0000 (07:58 +0200)]
sbus_futaba: add decoder for SBUS hobby remote control by Futaba

This is the SBUS remote control by Futaba, the 25 bytes on top of UART.
Not the computer peripheral bus. Hence the suffix in the decoder name.

The implementation was tested with synthetic data. Example captures with
real world data have yet to become available. This implementation shows
the message framing, the proportional and digital channels' values, and
the flags. Several warnings for short and long and invalid messages are
implemented, as are user adjustable channel value range limits.

The boilerplate may need adjustment. All naming was made up by me based
on what information was available (vendor doc was missing).

9 months agolibsigrokdecode.h: declare Windows dllexport for SRD_API routines
Gerhard Sittig [Mon, 14 Feb 2022 19:35:05 +0000 (20:35 +0100)]
libsigrokdecode.h: declare Windows dllexport for SRD_API routines

Add the __declspec(dllexport) decoration to SRD_API routines on Windows
when building the library body (this is new). Stick with the default
visibility on all other platforms (as previously implemented).

This is similar to what Kyle Johnson submitted in PR 66, but phrased
differently. Avoid the non-portable indentation before the hash in
preprocessor instructions. Use positive logic for readability (put
the Windows branch next to the check for the Windows platform).

Reported-By: Kyle Johnson <>
10 months agodecoder: rename iteration variables to improve readability
Gerhard Sittig [Sun, 1 Nov 2020 13:48:14 +0000 (14:48 +0100)]
decoder: rename iteration variables to improve readability

Use longer variable names for the iteration over channels, options,
annotation classes and rows, and binary classes when a decoder gets
loaded. This improves readability, especially in nested loops with
complex test conditions and diagnostics messages.

Although the Python variables were checked for their availability and
expected data type, and we should only see non-negative index values,
the iteration variable's data type remains unchanged in this commit
(sticks with signed size types).

10 months agodecoder: check annotation rows' references to annotation classes
Gerhard Sittig [Sun, 1 Nov 2020 11:33:47 +0000 (12:33 +0100)]
decoder: check annotation rows' references to annotation classes

Check the annotation class indices when iterating annotation rows.
Refuse to load decoders with inconsistent declarations, emit error
messages to raise developers' awareness of implementation bugs.

This fixes bug #1601.

10 months agodecoder: don't break error messages, factor out Python variable name
Gerhard Sittig [Sun, 1 Nov 2020 11:16:07 +0000 (12:16 +0100)]
decoder: don't break error messages, factor out Python variable name

Don't break long error messages in source code, so that developers can
grep for user reported strings during maintenance. This commit does not
change behaviour.

Concentrate repeated references to the 'annotation_rows' Python variable
name in a single spot at the top of the helper routine.

11 months agoir_irmp: sigrok PD, make use of IRMP decoder core locking
Gerhard Sittig [Sun, 26 Dec 2021 06:38:05 +0000 (08:38 +0200)]
ir_irmp: sigrok PD, make use of IRMP decoder core locking

Rephrase how the external IRMP library gets loaded, to provide better
diagnostics to users. All decoder instances are equal after the recent
introduction of locking support.

Move the "reset state" call for the IRMP decoder core to the .decode()
method's main loop, where the context manager holds the instance lock.
This allows "parallel" execution of multiple IRMP decoders in the same
sigrok application, assuming that the context manager scope will be
left at some point in time.

This fixes bug #1581 when applications communicate EOF to decoders.

Move some Python object members to local variables. They exclusively
are used within the .decode() method.

Update the copyright for the non-trivial changes.

11 months agoir_irmp: Python binding, support instance locking and context manager
Gerhard Sittig [Sun, 26 Dec 2021 07:31:02 +0000 (08:31 +0100)]
ir_irmp: Python binding, support instance locking and context manager

Extend the ctypes wrapper for the IRMP decoder core. Add routines for
the instance state creation and lock management. Implement metamethods
for Python context managers which lock the instance to protect the C
library's internal state from changing unexpectedly. Add my copyright
for the non-trivial changes.

This commit eliminates the limitation to a single IRMP decoder core for
the sigrok process to use. Multiple Python callers can synchronize their
library use, and see a consistent library state across the scope of the
context manager. It's essential though that callers leave the context
to not block other callers for extended periods of time.

11 months agoir_irmp: wrapper lib, add locking and Python threading support
Gerhard Sittig [Sun, 26 Dec 2021 07:23:27 +0000 (08:23 +0100)]
ir_irmp: wrapper lib, add locking and Python threading support

The IRMP core library is not thread safe (known limitation, heritage of
the AVR firmware origin). Add a mutex so that calling applications can
lock IR decoder core instances. Allow Python threading while waiting for
the locks, we can safely assume that this IRMP wrapper is used in the
sigrok context which does require Python for decoders. Add my copyright
for the non-trivial changes.

This implementation uses glib for locking to improve portability, which
already is a dependency of the libsigrokdecode component. This version
uses belt and suspenders by implementing a constructor as well as adding
auto init calls to each of the public API code paths. The client ID is
not an essential requirement, but useful during application maintenance.

11 months agoir_irmp: wrapper lib, silence warnings in "Windows or Unix" condition
Gerhard Sittig [Sun, 26 Dec 2021 07:21:02 +0000 (08:21 +0100)]
ir_irmp: wrapper lib, silence warnings in "Windows or Unix" condition

Platform detection in the external IRMP library works best when either
the WIN32 or the unix identifiers are provided, which the sigrokdecode
build environment derives from other identifiers which are more reliably

It turns out that other external dependencies like glib or Python may
provide some of these identifiers, too. Which results in the compiler
warning about symbols' redefinition. Only define derived identifiers
when they haven't been provided yet.

This amends commit ab88bae1c7b9.

11 months agosession: introduce the public "send EOF" API routine
Gerhard Sittig [Sun, 26 Dec 2021 06:42:27 +0000 (07:42 +0100)]
session: introduce the public "send EOF" API routine

Introduce the public srd_session_send_eof() routine which is backed by
the internal srd_inst_send_eof() helper. Applications can tell decoders
when the input stream of sample data is exhausted, so that decoders can
optionally "flush" their previously accumulated information when
desired. Previous implementations just kept decoders in blocking .wait()
calls and somehow terminated them at arbitrary times afterwards.

When EOF is sent to the decoder session, then calls to the .wait()
method which typically are done from .decode() or its descendents will
end with an EOFError Python exception. Termination of .decode() with the
EOFError exception is non-fatal for backwards compatibility and to keep
the convenience for current decoder implementations. Decoders can either
catch the exception, or use context managers, or do nothing.

This API extension is motivated by research for bug #1581 and provides
the infrastructure to address bug #292. Decoders need to remain careful,
and should not claim that protocol activities would have completed when
their end condition was not even seen in the capture. Marking incomplete
activities with warnings is the most appropriate reaction.

11 months agotype_decoder: eliminate explicit string length spec for literals
Gerhard Sittig [Sat, 25 Dec 2021 18:53:11 +0000 (19:53 +0100)]
type_decoder: eliminate explicit string length spec for literals

Rephrase the 'names[]' array declaration in output_type_name() to avoid
the necessity of guessing what the maximum length of the literals might
be during future maintenance. Developers need not care when the compiler
can handle this detail.

11 months agotype_decoder: use ALL_ZERO for sentinels in method/member tables
Gerhard Sittig [Sat, 25 Dec 2021 18:52:30 +0000 (19:52 +0100)]
type_decoder: use ALL_ZERO for sentinels in method/member tables

Avoid the full listing of all-zero struct members in sentinel items of
object methods and class properties tables. Use the ALL_ZERO phrase
instead which better reflects what's intended, and reliably silences
warnings should structs' lengths differ across Python versions.

11 months agotype_decoder: update and extend Decoder base class doc strings
Gerhard Sittig [Sat, 25 Dec 2021 18:48:11 +0000 (19:48 +0100)]
type_decoder: update and extend Decoder base class doc strings

Some doc strings have become outdated, update them. Some doc strings
were terse, extend them. Ideally protocol decoder authors would be able
to use the builtin documentation to answer questions on data types and
arguments order. This implementation isn't there yet, needs more work.

11 months agotype_decoder: move Python doc strings to method implementations
Gerhard Sittig [Sat, 25 Dec 2021 18:43:48 +0000 (19:43 +0100)]
type_decoder: move Python doc strings to method implementations

Move Python doc strings to the location where methods and classes get
implemented. This improves awareness during maintenance, and allows for
longer text phrases without obfuscating the registration code path.

This commit does not alter the content of existing doc strings, only
moves their location. And keeps related items together when long decls
span multiple text lines (function name and arguments list, args and
kw args), to improve/keep readability.

11 months agointernal: introduce ALL_ZERO declaration, modelled after libsigrok
Gerhard Sittig [Sat, 25 Dec 2021 18:50:43 +0000 (19:50 +0100)]
internal: introduce ALL_ZERO declaration, modelled after libsigrok

Declare ALL_ZERO in the common libsigrokdecode-internal.h header file.
The implementation and the comment on its motivation were taken from the
libsigrok implementation, slightly rephrased for improved readability.

11 months Use python3-embed.pc as a fallback
Evangelos Foutras [Thu, 3 Dec 2020 17:17:00 +0000 (19:17 +0200)] Use python3-embed.pc as a fallback

This provides some future-proofing against newer Python versions.

11 months agoconfigure: Add python 3.10 support
Soeren Apel [Mon, 20 Dec 2021 18:36:39 +0000 (19:36 +0100)]
configure: Add python 3.10 support

11 months agoparallel: Add binary output
Soeren Apel [Fri, 17 Dec 2021 21:50:00 +0000 (22:50 +0100)]
parallel: Add binary output

16 months agorc_encode: Add support for EV1527, RT1527, FP1527 and HS1527
Soeren Apel [Thu, 29 Jul 2021 21:33:32 +0000 (23:33 +0200)]
rc_encode: Add support for EV1527, RT1527, FP1527 and HS1527

17 months agoieee488: add support for parallel poll (PP)
Gerhard Sittig [Sat, 20 Mar 2021 14:43:13 +0000 (15:43 +0100)]
ieee488: add support for parallel poll (PP)

The concurrent assertion of ATN and EOI is a PP (parallel poll) query.
The host asserts the control signals, and configured devices may assert
the DIO lines in response.

Because DAV is not involved, and because the input capture may not have
DIO at the start of the PP phase, and may neither have DIO any more at
its end, the check for parallel poll is more complex. Unconditionally
inspecting each sample of the capture is inefficient. Keep manipulating
the main loop's wait conditions instead, to stick with edge navigation
as long as possible, and only switch to inspection of individual samples
when strictly needed.

It's also important to gracefully handle low oversampling. Existing test
cases suffered from PP glitches when ATN asserted in the same location
where EOI deasserted. Be extra conservative about the presence of the
PP phase, expect at least two samples (a difference between its start
and end position) before emitting the annotation.

17 months agoieee488: shorten an option description for consistency across dialogs
Gerhard Sittig [Thu, 18 Mar 2021 19:05:02 +0000 (20:05 +0100)]
ieee488: shorten an option description for consistency across dialogs

The description text of the Commodore peripherals option spanned a
rather wide space. Trim the text for consistency with other options.

17 months agoieee488: support optional parity for ATN commands (for HP gear)
Gerhard Sittig [Thu, 18 Mar 2021 18:14:54 +0000 (19:14 +0100)]
ieee488: support optional parity for ATN commands (for HP gear)

HP gear is said to sometimes send commands (ATN asserted) with a parity.
Introduce an option to check and strip the MSB before interpretation.

Reported-By: Anders Gustafsson <>
17 months agodoc: update IRC reference to Libera.Chat
Gerhard Sittig [Wed, 16 Jun 2021 18:52:10 +0000 (20:52 +0200)]
doc: update IRC reference to Libera.Chat

21 months agodecoder: increment Python object reference for .has_channel() result
Gerhard Sittig [Sun, 7 Mar 2021 06:03:18 +0000 (07:03 +0100)]
decoder: increment Python object reference for .has_channel() result

This fixes bug #1671.

Reported-By: Ivan Wick
21 months agoUse uint8_t instead of unsigned char for raw byte data
Soeren Apel [Fri, 26 Jun 2020 18:18:35 +0000 (20:18 +0200)]
Use uint8_t instead of unsigned char for raw byte data

21 months agoImplement basic flushing
Soeren Apel [Sun, 21 Jun 2020 10:10:59 +0000 (12:10 +0200)]
Implement basic flushing

21 months agoRename logic_class to logic_group and output as group-wise RLE
Soeren Apel [Fri, 26 Jun 2020 18:16:15 +0000 (20:16 +0200)]
Rename logic_class to logic_group and output as group-wise RLE

21 months agopca9571/tca6408a: Rework logic output
Soeren Apel [Thu, 26 Mar 2020 15:02:36 +0000 (16:02 +0100)]
pca9571/tca6408a: Rework logic output

For now, libsigrokdecode clients expect to receive a 1:1 number of
input samples to logic output samples, along with a logic output
samplerate equal to the PD's input sample rate

21 months agoRemove samplerate from srd_decoder_logic_output_channel
Soeren Apel [Sun, 1 Mar 2020 15:50:46 +0000 (16:50 +0100)]
Remove samplerate from srd_decoder_logic_output_channel

This means that the samplerate for logic output channels is
implicitly determined by the input channel samplerate.

The motivation for this is that hard-coding a samplerate isn't
possible - but at the same time, it's also not possible to
determine the samplerate at the time the logic output channels
are initialized, as the samplerate can be set at runtime.

From my point of view, we would need one of two mechanisms to
make this work:

1) Allow creation of logic outputs at runtime via some
registration callback
2) Allow changing a logic output's samplerate after it has been
created, again requiring some kind of callback

To me, both currently are overkill because making the assumption
that samplerate_in = samplerate_out not only makes this problem
go away as it can easily be handled on the client side where
samplerate_in is already known, it also makes handling of the
logic data in the PDs easier.

21 months agopca9571: Add initial OUTPUT_LOGIC support.
Uwe Hermann [Fri, 5 Jul 2019 06:12:23 +0000 (08:12 +0200)]
pca9571: Add initial OUTPUT_LOGIC support.

21 months agotca6408a: Add initial OUTPUT_LOGIC support.
Uwe Hermann [Wed, 26 Jun 2019 19:34:37 +0000 (21:34 +0200)]
tca6408a: Add initial OUTPUT_LOGIC support.

21 months agoAdd initial OUTPUT_LOGIC support.
Uwe Hermann [Wed, 26 Jun 2019 19:25:37 +0000 (21:25 +0200)]
Add initial OUTPUT_LOGIC support.

Protocol decoders can now declare an arbitrary number of logic output
channels with a fixed assumed samplerate each.

22 months agoseven_segment: cosmetics in decode(), reduce redundancy
Gerhard Sittig [Wed, 13 Jan 2021 19:12:07 +0000 (20:12 +0100)]
seven_segment: cosmetics in decode(), reduce redundancy

"Un-clutter" the decode() routine. Group related instructions to improve
readability. Drop redundant statements where common code can handle all
cases. Also fixes an unconditional access to the optional decimal point
input signal (which had caused a runtime error, and ceased decoding).

22 months agoseven_segment: document segment layout for awareness during maintenance
Gerhard Sittig [Wed, 13 Jan 2021 18:51:52 +0000 (19:51 +0100)]
seven_segment: document segment layout for awareness during maintenance

Add a comment to the table which maps LED segment combinations to their
textual presentation. Mention the table's sort order for awareness, and
provide column captions as well as a segment layout illustration to
simplify maintenance.

The LED segment layout comment was
Submitted-by: Ben Gardiner <>
22 months agoseven_segment: expand to a full alphabet
Ben Gardiner [Sun, 22 Nov 2020 20:43:01 +0000 (20:43 +0000)]
seven_segment: expand to a full alphabet

Expand the list of characters that will be recognized by the seven
segment decoder to include many display character 'encodings.'
Including some punctuation characters and tricky letters like W and V.

Signed-off-by: Ben Gardiner <>
[ gsi: sort by ASCII codes (keep ignoring letter case) ]

2 years agoseven_segment: add option to display unknown characters
Ben Gardiner [Sun, 22 Nov 2020 20:40:44 +0000 (20:40 +0000)]
seven_segment: add option to display unknown characters

option show_unknown=yes will display unknown 7-segment characters as
an octothorpe ('#').

Signed-off-by: Ben Gardiner <>
2 years agoparallel: increase number of data lines to 16
Gerhard Sittig [Sat, 7 Nov 2020 14:44:37 +0000 (15:44 +0100)]
parallel: increase number of data lines to 16

The 'parallel' decoder supported 32 channels when it was introduced.
Commit a3b4f1684a8f lowered the channel count to 8 which is quite a
small number. Increase the number of supported channels to 16 again.
This should result in increased usability while keeping an acceptable
UI dialog size for the decoder properties.

2 years agoparallel: update builtin documentation
Gerhard Sittig [Sat, 7 Nov 2020 15:07:10 +0000 (16:07 +0100)]
parallel: update builtin documentation

Update the decoder's doc string to catch up with recent extensions.
Rephrase how clock and data lines interact. Sparse assignment of data
lines is supported (has been for a while). Discuss the optional reset
signal and its enable/select use.

2 years agoparallel: adjust Python output to match its documentation
Gerhard Sittig [Sat, 7 Nov 2020 12:49:06 +0000 (13:49 +0100)]
parallel: adjust Python output to match its documentation

The parallel decoder documented the layout of the Python output but used
to emit something different (mere data values). Add the bit width of
data items and the bus cycle count for demultiplexed words, to match the
documented layout.

No harm was done, there are no in-tree decoders which stack on top of
the parallel decoder.

2 years agoparallel: rephrase word accumulation after reset introduction
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:

  3768240-4118229 parallel: item: "3"
  3768240-4468218 parallel: word: "33"
  4118229-4468218 parallel: item: "3"
  4468218-4818202 parallel: item: "3"
  4468218-5268189 parallel: word: "32"
  4818202-5268189 parallel: item: "2"
  5268189-5368185 parallel: item: "2"
  5268189-5568180 parallel: word: "28"
  5368185-5568180 parallel: item: "8"
  5568180-5668176 parallel: item: "0"
  5568180-5868171 parallel: word: "08"
  5668176-5868171 parallel: item: "8"
  5868171-5968166 parallel: item: "0"
  5868171-6168162 parallel: word: "01"
  5968166-6168162 parallel: item: "1"
  6168162-6268157 parallel: item: "0"
  6168162-6468152 parallel: word: "0c"
  6268157-6468152 parallel: item: "c"

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:

  parallel/hd44780_word_demux/annotation ..................................... Output mismatch
  Testcase: parallel/hd44780_word_demux/annotation
  Test output mismatch:
  + 4118229-4468218 parallel: item: "3"
  - 4118229-4468218 parallel: item: "3"
  + 4818202-5268189 parallel: item: "2"
  - 4818202-5268189 parallel: item: "2"
  + 5368185-5568180 parallel: item: "8"
  - 5368185-5568180 parallel: item: "8"
  + 5668176-5868171 parallel: item: "8"
  - 5668176-5868171 parallel: item: "8"
  + 5968166-6168162 parallel: item: "1"
  - 5968166-6168162 parallel: item: "1"
  + 6268157-6468152 parallel: item: "c"
  - 6268157-6468152 parallel: item: "c"

2 years agoparallel: add support for optional reset/enable/select signal
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.

2 years agoparallel: add option to sample data on either clock edge
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.

2 years agoparallel: rephrase handling of data lines, symbolic upper bound
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.

2 years agoparallel: symbolic names for pins and annotation classes
Gerhard Sittig [Sat, 7 Nov 2020 12:44:32 +0000 (13:44 +0100)]
parallel: symbolic names for pins and annotation classes

Concentrate tunables at the top of the source code. Eliminate magic
numbers by replacing them with symbolic identifiers.

2 years agoirmp: Fix a build issue with xtensa cross toolchains.
Uwe Hermann [Mon, 31 Aug 2020 19:53:18 +0000 (21:53 +0200)]
irmp: Fix a build issue with xtensa cross toolchains.

2 years agoir_nec: fix typo in STOP bit width
Gerhard Sittig [Sat, 1 Aug 2020 07:35:40 +0000 (09:35 +0200)]
ir_nec: fix typo in STOP bit width

The 0.652ms STOP bit width must have been a typo (though consistent in
the previous implementation), it's not half of the 1.125ms ZERO symbol.

Notice that this is an incompatible change to the decoder implementation.
It affects the annotations for STOP bits and overall REMOTE button codes.

2 years agoir_nec: sort and comment timing specs, drop tolerance option
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

2 years agoir_nec: concentrate timing at the top of the source file
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.

2 years agoir_nec: Add option for automatic polarity detection
BenediktO [Mon, 27 Jul 2020 06:32:30 +0000 (08:32 +0200)]
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 ]

2 years agoir_nec: Make the tolerance configurable
BenediktO [Mon, 27 Jul 2020 06:32:52 +0000 (08:32 +0200)]
ir_nec: Make the tolerance configurable

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 ]

2 years agoir_nec: Annotate IR frame already at the end of the STOP bit
BenediktO [Mon, 27 Jul 2020 06:31:31 +0000 (08:31 +0200)]
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 ]

2 years agoir_nec: Add Joy-it SBC-IRC01 remote
BenediktO [Mon, 27 Jul 2020 06:30:24 +0000 (08:30 +0200)]
ir_nec: Add Joy-it SBC-IRC01 remote

The Joy-it SBC-IRC01 remote control appears as address 0x00.

2 years agosle44xx: support memory read "to end of capacity"
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.

2 years agosle44xx: optionally use samplerate to show processing durations
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.

2 years agosle44xx: extend decoder's feature set, outgoing data, processing
Gerhard Sittig [Sat, 29 Aug 2020 11:00:04 +0000 (13:00 +0200)]
sle44xx: extend decoder's feature set, outgoing data, processing

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.

2 years agosle44xx: rephrase ss/es passing for annotation emission
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.

2 years agosle44xx: minor developer comment and style nits
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.

2 years agosle44xx: don't assume RESET at the start of the capture
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.

2 years agosle44xx: rework data bits accumulation, and byte presentation
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.

2 years agosle44xx: rephrase annotation text construction
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.

2 years agosle44xx: use symbolic identifiers for annotation classes
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).

2 years agosle44xx: use symbolic identifiers for pins and signal transitions
Gerhard Sittig [Mon, 27 Jul 2020 18:03:47 +0000 (20:03 +0200)]
sle44xx: use symbolic identifiers for pins and signal transitions

Eliminate magic numbers for input pins and signal transition conditions.
Which dramatically improves readability and simplifies review.

2 years agosle44xx: remove incomplete Python output for now
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.

2 years agosle44xx: extend decoder doc string, add "memory cards" hint
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.

2 years agosle44xx: fixup boilerplate, add missing required fields
Gerhard Sittig [Sat, 29 Aug 2020 08:05:24 +0000 (10:05 +0200)]
sle44xx: fixup boilerplate, add missing required fields

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.

2 years agosle44xx: introduce decoder for Siemens memory cards
Federico Cerutti [Sat, 4 Jan 2020 10:48:35 +0000 (11:48 +0100)]
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.

2 years agoavr_isp: Extend decoder, add locks, eeprom, program memory commands.
Helge Kruse [Sun, 2 Aug 2020 16:26:55 +0000 (18:26 +0200)]
avr_isp: Extend decoder, add locks, eeprom, program memory commands.

[ gsi: list all classes, break long lines, EEPROM address calculation ]

2 years agoavr_isp: move "unknown command" to warning, drop empty 'bits' row
Gerhard Sittig [Sun, 2 Aug 2020 18:14:13 +0000 (20:14 +0200)]
avr_isp: move "unknown command" to warning, drop empty 'bits' row

Use the warnings annotation class for the "Unknown command" message, the
PE class (programming enabled) is unexpected and most probably a typo.

Drop the empty 'bits' annotation row which has been unused since commit

2 years agoavr_isp: Use symbolic names for annotation classes.
Helge Kruse [Sun, 2 Aug 2020 16:24:55 +0000 (18:24 +0200)]
avr_isp: Use symbolic names for annotation classes.

[ gsi: explicit list of all classes in row declaration ]

2 years agosdq: prefer Python's .format() method for string formatting
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.

2 years agosdq: use symbolic names for pins and annotation classes
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.

2 years agosdq: provide more information in the decoder's boilerplate
Gerhard Sittig [Wed, 12 Aug 2020 16:48:27 +0000 (18:48 +0200)]
sdq: provide more information in the decoder's boilerplate

Extend the module's doc string. Provide more details to the
user beyond the vendor's name, to increase the decoder's usability.

2 years agosdq: simplify decode routine, no state machine required
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.

[ best viewed as a whitespace ignoring diff ]

2 years agosdq: only use samplerate and options values after validity check
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.

2 years agosdq: use common bits to number conversion
Gerhard Sittig [Wed, 12 Aug 2020 16:46:28 +0000 (18:46 +0200)]
sdq: use common bits to number conversion

2 years agosdq: Add the SDQ protocol decoder
Philip Åkesson [Sun, 9 Aug 2020 14:44:46 +0000 (16:44 +0200)]
sdq: Add the SDQ protocol decoder

[ gsi: minor whitespace adjustment ]

2 years agost7735: Fix handling of unknown commands
gregor-anich-uibk [Sat, 8 Aug 2020 11:57:26 +0000 (13:57 +0200)]
st7735: Fix handling of unknown commands

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 ]

2 years Add support for Python 3.9.
Dan Horák [Tue, 4 Aug 2020 07:19:44 +0000 (09:19 +0200)] Add support for Python 3.9.

2 years agolpc: improve performance, use proper .wait() condition
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 ]

2 years agost25r39xx_spi: Minor style and description changes
Soeren Apel [Sun, 19 Jul 2020 20:57:49 +0000 (22:57 +0200)]
st25r39xx_spi: Minor style and description changes

2 years agost25r39xx_spi: Add st25r39xx PD using spi
bvernoux [Tue, 14 Jul 2020 21:02:35 +0000 (23:02 +0200)]
st25r39xx_spi: Add st25r39xx PD using spi

This NFC interface chip is used in the HydraNFC Shield v2.

See also dumps used to validate it on

2 years agolfast/sipi: Fix typo
Soeren Apel [Thu, 30 Jul 2020 19:42:41 +0000 (21:42 +0200)]
lfast/sipi: Fix typo

2 years agosipi: Initial version of the SIPI protocol to form a Zipwire stack
Soeren Apel [Wed, 29 Jul 2020 21:45:45 +0000 (23:45 +0200)]
sipi: Initial version of the SIPI protocol to form a Zipwire stack

2 years agolfast: More bug fixes and enhancements
Soeren Apel [Wed, 29 Jul 2020 21:44:56 +0000 (23:44 +0200)]
lfast: More bug fixes and enhancements

2 years agolfast: Enhance LFAST PD
Soeren Apel [Tue, 28 Jul 2020 10:57:58 +0000 (12:57 +0200)]
lfast: Enhance LFAST PD

2 years agolfast: Initial version of the NXP LFAST / IFX HSCT PD
Soeren Apel [Mon, 27 Jul 2020 15:01:53 +0000 (17:01 +0200)]
lfast: Initial version of the NXP LFAST / IFX HSCT PD

2 years agoir_sirc: use common bitpack() variant with array access
Gerhard Sittig [Thu, 23 Jul 2020 15:27:17 +0000 (17:27 +0200)]
ir_sirc: use common bitpack() variant with array access

This eliminates array copies and indexed access to bit values in the
calling decoder. Prefer common helpers instead.

2 years agocan: use common MSB first variant of bitpack()
Gerhard Sittig [Thu, 23 Jul 2020 15:26:06 +0000 (17:26 +0200)]
can: use common MSB first variant of bitpack()

This eliminates array copies and bit order reversal in the calling
decoder. Prefer common helpers instead.

2 years agocommon: add LSB/MSB first bitpack variant with optional index
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'.

2 years agocan: avoid assignment to .id field during frame inspection
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