Skip to content

Conversation

acolomb
Copy link
Member

@acolomb acolomb commented Aug 5, 2025

The PdoBase mapping uses an enumeration starting from one for the individual PDOs. Requesting index 0 (zero) accidentally will return the first PdoVariable in the first PDO. This is coincidental, because the PDOs are tried in turn and with a PDO, the numeric index lookup is zero-based.

To avoid hard-to-debug errors, simply forbid the value zero completely in the lookup, which does not make sense for any of the supported lookup methods.

Copy link

codecov bot commented Aug 5, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@acolomb acolomb added this to the v3.0.0 milestone Aug 5, 2025
@acolomb acolomb added the pdo label Aug 5, 2025
@acolomb acolomb linked an issue Aug 18, 2025 that may be closed by this pull request
@acolomb acolomb changed the title PdoBase: Forbid getting item with zero index (fixes #581) PdoBase: Forbid getting item with zero index (fixes #581, #607) Aug 18, 2025
@acolomb acolomb linked an issue Aug 18, 2025 that may be closed by this pull request
@acolomb acolomb marked this pull request as draft August 18, 2025 22:17
The access by this index number mixed up the two number ranges.  The
CiA 301 standard defines:

* Object 1600h to 17FFh: RPDO mapping parameter
* Object 1A00h to 1BFFh: TPDO mapping parameter

The test was also wrong, because it added the two tested variables to
the TPDO1, while testing the __getitem__ lookup with index 0x1600.
Augment test_pdo_getitem() to not only check the mapped object values.
What's more important is the type of object returned, and whether it
is the correct object (identical to other access method results).
These two PdoBase-derived classes only supported numeric access based
on the sequential index, not with the mapping parameter record index
like the PDO class.  Implement a fallback to check that if the regular
index lookup fails.
The mechanisms to lookup objects, implemented in class PdoMaps, did
not apply to the PDO class itself, because it simply used a dictionary
instead of a PdoMaps object.  That also violates the static typing
rules.

Make the PdoBase.maps attribute mandatory and accept only type
PdoMaps.  To allow a basically "empty" PdoMaps object, adjust its
constructor to skip adding entries when neither offset parameter is
given as non-zero.  Instead, access the PdoMaps.maps attribute
directly to inject the offset-based TX and RX PdoMap objects in the
PDO class constructor.  Add some explanation why relative indices
cannot be used here.
@acolomb acolomb marked this pull request as ready for review August 19, 2025 11:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Can't access T/RPDO via ID PDO getitem unexpected returns PdoVariable on value 0
1 participant