summaryrefslogtreecommitdiff
path: root/decoders/i2c/pd.py
AgeCommit message (Collapse)Author
2023-07-18i2c: rephrase state machine, eliminate text matchingGerhard Sittig
Rephrase the conditions which drive the I2C decoder's progress. Remove self.state and its space separated string literals which were tedious to search for, and which "lent themselves" to magic string matching. Use other existing conditions instead, which also reduces redundancy. Defer the "forgetting data bits" until after ACK was seen. Comment on the motivation to keep the "protocol violating" implementation, which misses error conditions that happen on the wire, but happens to support heavily undersampled captures to an astonishing degree. Also addresses minor style nits: Prefer to think of "dominant ACK" and "recessive NAK". Rephrase a byte shift for the first address byte. Emit the first warning annotation for the row which was declared before but was not used so far.
2023-07-18i2c: concentrate sample number and value getting in main loopGerhard Sittig
It's unfortunate how the symbol / bit value handlers of the I2C decoder keep redundantly accessing the .samplenum property. Ideally they should just get an ss, es, value tuple, while the determination of these params should be kept in the .decode() main loop. Prepare the internal implementation to that approach, but enforce an absolutely backwards compatible behaviour for now. This was verified by the test suite. The data bit handler still keeps updating previous bits' end positions when another bit is seen. Which assumes back to back bits which strictly speaking does not match the protocol's definition. The unfortunate application of the second last bit time's width to the last bit time and the ACK slot is kept as well. And the code path needed to be kept within the bit handler, because the second last bit's width only becomes available when the last bit _was_ handled. Which means that the main loop cannot provide a useful es value which matches the previous implementation's behaviour.
2023-07-18i2c: also shift first address byte for 10bit slave addressesGerhard Sittig
The first address byte in an I2C transfer always carries the R/W bit. Always shift this byte regardless of 7/10 bit addresses, and always emit separate annotations for the address value part and the R/W bit part.
2023-07-18i2c: unobfuscate ss/es passing for put, document BITS orderGerhard Sittig
Eliminate how the I2C decoder's put methods take data as arguments and hiddenly take ss/es from instance variables. This improves readability during review. Rename .putx() to .putg() to match other decoders (emits graphical annotations, in contrast to Python and binary). Document the surprising BITS pdata order, stacked decoders get LSB first sequences. To keep awareness during maintenance. Keep an explicit copy of the LSB bits to simplify the implementation of the data byte handler (sample numbers remain available at indices in their reception order).
2023-07-18i2c: improve reliability of bitrate estimation (throughput, meta)Gerhard Sittig
The I2C decoder used to track the bitrate of the observed traffic (number of address and data bits in a transfer). It's uncertain where this output went (is meta still supported, are applications using it?), and it appears to not be covered in tests. Improve the logic still. Adjust the location of the emitted annotation. It used to start at the most recently observed data byte, which looks suspicious. Output was attempted when STOP was seen, even if the start was not observed. The calculation dropped data before a repeated start. The implementation kept data around after it became obsolete. Break a long formula across several text lines. Use the fact that Python division yields floating point results. Add a comment in the ACK/NAK bit handler. It references data which was gathered when accumulating data bits. Could be acceptable but must be remained aware of.
2023-07-18i2c: unify emission of annotations, always use proto{} tableGerhard Sittig
Slightly unobfuscate how the I2C decoder invokes put methods. Present the annotation class and the list of texts for different zoom levels for readability. Also keep the data value presentation in that table so that it holds all texts which users will see during decoder use. Eliminate how the data bits used to bypass that table in the past. This commit does not address the unfortunate self.ss/es coupling of decoding code paths and annotation emitting helpers, which complicates review of the decoder's implemented logic.
2023-07-18i2c: more idiomatic use of Python list, reduces redundancy, commentsGerhard Sittig
Collect all bits of a byte time in a Python list (as was done before). Eliminate the bit counter and the value accumulator, use the list's length during accumulation and common conversion support after the accumulation instead. Also comment on the non-trivial start/end sample number update logic. The decoder implementation likes to claim data validity outside of the high SCL phase, which does not agree with the strict I2C protocol idea. Increases usability though (data visibility at zoom levels). This and backwards compatibility makes us keep the logic, as long as we remain aware of its implications. Comment on the rather unexpected LSB first emission of annotations and stacked layer data passing, while the I2C protocol itself is MSB first.
2023-07-18i2c: add support for 10bit slave addressesGerhard Sittig
Slave addresses can be of 7bit or 10bit type, which occupies one or two bytes at the start of the frame. Detect when a 10bit address is seen, and classify the following byte as yet another address byte (which the previous implementation incorrectly classified as data byte). This commit only accumulates the address value and adjusts the class of annotations. It does not introduce new annotation classes or rows, to not change the decoder in incompatible ways.
2023-07-18i2c: rename variables and adjust data types for readabilityGerhard Sittig
Use longer names for variables and adjust their data types to improve readability of the "is write?", "is repeated start?" conditions. Use a boolean when the condition is known, and preset to None when the state is yet uncertain. Rename .bits[] to .data_bits[] to reflect that they exclusively hold the byte's bits and not the ACK/NAK bit.
2020-01-01All PDs: Consistently use singular/plural for annotation classes/rows.Uwe Hermann
2019-03-15decoders: Add/update tags for each PD.Uwe Hermann
2019-03-13Add PD tags handling and some tagsSoeren Apel
2018-02-13i2c: make input samplerate optionalGerhard Sittig
Absence of a samplerate for the input stream should not be fatal. The protocol decodes fine, we just cannot determine a bitrate for frames. This addresses part of bug 1076.
2018-01-13i2c: Drop obsolete 10bit slave address TODO.Uwe Hermann
Nobody has seen any such slave in the wild, yet. In the very unlikely case that someone actually sees or needs this, patches are welcome though (together with sample .sr files).
2017-12-22all decoders: introduce a reset() methodGerhard Sittig
Move initialization code of protocol decoders from the constructor to a new reset() helper method. The libsigrokdecode backend could run this method several times to clear the decoder's internal state, before new data from another acquisition gets fed to decode() calls.
2017-06-21i2c: Don't drop the first sample of input dataGerhard Sittig
The previous implementation of the I2C decoder used to retrieve and not process the first sample of the input stream. Remove this instruction.
2017-06-05Add srd_inst_initial_pins_set_all() and support code.Uwe Hermann
This allows frontends to set the assumed initial pins (i.e., the assumed state of the pins before the first sample of a capture) to user-specified values. The assumed initial pins can be either low, or high, or "use same value as the first sample of the capture". The special self.initial_pins decoder attribute is now removed.
2017-03-03Drop obsolete workarounds in PDs.Uwe Hermann
Some PDs were using a temporary workaround for (as it turned out) a refcounting issue that was fixed in 066fbafdc3ba734a73b5f7fcfa1dbae67ddebf8a.
2017-01-07license: remove FSF postal address from boiler plate license textGerhard Sittig
Remove the FSF postal address as it might change (it did in the past). Reference the gnu.org website instead which is more stable.
2016-12-07i2c: Convert to PD API version 3.Uwe Hermann
2016-05-15Use consistent __init__() format across all PDs.Uwe Hermann
The previous **kwargs some PDs had is not actually ever used, so drop it.
2015-12-24Use a Python list (not tuple) for OUT_BINARY.Uwe Hermann
This is more consistent with annotation syntax and looks slightly better in most cases.
2014-10-13All PDs: More consistent names for ss/es variables.Uwe Hermann
Use self.ss/self.es, or if there's a need to differentiate them a bit more, use self.ss_<suffix>/self.es_<suffix> consistently. Also, drop some unused variables.
2014-07-15All PDs: Minor whitespace and consistency fixes.Uwe Hermann
- No newlines at the end of files. - No trailing ';' characters. - Comparison with None: Use 'is None' or 'is not None'. - Comparison with True/False: Use 'if cond:' or 'if not cond:'. - Various minor whitespace fixes.
2014-07-09Various PDs: Throw SamplerateError instead of Exception.Uwe Hermann
Also, use the "if not self.samplerate" form, which catches both the case where self.samplerate is None, as well as the case where it is 0.
2014-06-23i2c: Generate proper exception for missing samplerate, and test for it.Bert Vermeulen
Also remove some dead code.
2014-04-15All PDs: More consistent OUTPUT_PYTHON format docs.Uwe Hermann
2014-04-15All PDs: Bump api_version to 2.Uwe Hermann
Older libsigrokdecode versions are no longer able to use the current versions of the PDs (various changes in syntax etc).
2014-04-13Rename 'probe' to 'channel' everywhere.Uwe Hermann
Variables of type 'struct srd_channel *' are consistently named 'pdch' to make them easily distinguishable from libsigrok's 'struct sr_channel *' variables that are consistently named 'ch'.
2014-03-10Probes, optional probes and annotations now take a tuple.Bert Vermeulen
Annotation entries also consist of a tuple, not a list.
2014-03-10Remove unused probes and optionsBert Vermeulen
2014-03-10Change PD options to be a tuple of dictionaries.Bert Vermeulen
Each option consists of a dictionary with the following keys: id The option id, which is passed in when setting a value. desc A description of the option, suitable for display. def The default value for this option. values (optional) If present, a tuple containing values the option may take. They must be of the same type as the default. Valid types for the options are UTF-8-encoded strings, integers, and floating point values.
2014-02-09i2c: Emit per-bit annotations/packets and define annotation rows.Uwe Hermann
2014-01-30s/out_proto/out_python/.Uwe Hermann
The output type is now called OUTPUT_PYTHON, adapt all PDs to that.
2014-01-28All PDs: Drop unneeded comments.Uwe Hermann
The single comment re-stating the PD's name / description / purpose in each pd.py file is not really needed, that info is available in the Decoder class' attributes already.
2013-12-28i2c: Replaced I2C with I²CJoel Holdsworth
2013-12-13i2c: Avoid obsolete method.Bert Vermeulen
2013-12-12Use new binary class definition format.Bert Vermeulen
2013-12-10Add protocol decoder testing framework.Bert Vermeulen
This adds a tool in the tests directory, called pdtest. It uses the "test/" directory in every PD directory, if present, to run the PD against dumps found in the sigrok-dumps repository, and compares the output against ".output" files in the "test/" directory. The file "test/test.conf" is used to configure which tests to run. A separate tool (tests/runtc.c) is used to run the actual decoding and report output. To get an overview of the options, run tests/pdtest without any options.
2013-11-15Use OUTPUT_BINARY with four classes.Bert Vermeulen
2013-11-15Drop obsolete report() method.Bert Vermeulen
2013-11-15Emit meta bitrateBert Vermeulen
2013-11-07Rename inter-PD output type to SRD_OUTPUT_PYTHONBert Vermeulen
This better reflects what it is: a python object generated and processed by python code.
2013-10-30The start() method no longer takes a metadata parameterBert Vermeulen
2013-09-14i2c: Drop unneeded 'addressing' option.Uwe Hermann
This (unimplemented so far) option is not needed at all, since the decoder will be able to detect 7/10 bit slave addresses automatically, the user doesn't have to specify slave address sizes.
2013-09-14i2c: Drop obsolete TODOs.Uwe Hermann
2013-09-14i2c: Move OUTPUT_PROTO docs to pd.py.Uwe Hermann
2013-09-14i2c: Various fixes to make the PD suitable for GUIs.Uwe Hermann
The output format of the slave address is now a PD option. It can be "shifted" or "unshifted", i.e. bit 0 (which contains a read/write marker) is either shifted out or not, i.e., the slave address is displayed as 8bit or 7bit number (or 11bit/10bit number for 10bit slave addresses). Data bytes (not address bytes) are always shown as 8bit values, of course. Add annotation types for the individual I2C components such as start conditions, stop conditions, ACK/NACK, address read/writes, data read/writes and so on. This fixes bug #151.
2013-09-08i2c: Fix corner-case that can occur with LA triggers.Uwe Hermann
Until now the I2C PD was basically ignoring the very first sample, and using that as the initial 'oldscl'/'oldsda' value. However, if your logic analyzers trigger on, say, SDA=low that will result in a file where the first sample is really important since it is the one which the PD will need to know that there's a falling edge on SDA. Thus, assume both SCL and SDA are high/1 when the PD starts. This is a good assumption since both pins have pullups on them in practice and are thus high/1 when the bus is idle. Later on we might want to have config options to let the PD assume other states of SDA/SCL initially.
2013-04-23GPL headers: Use correct project name.Uwe Hermann