kentindell/canhack

CANID class does not seem to have get_id() method

Closed this issue · 2 comments

The PDF documentation 'CANPico MicroPython SDK reference manual.pdf' leads me to believe that the CANID object should have a get_id() method.

Hower, calling get_id() on a CANID gives a runtime error.

Error: "AttributeError: 'CANID' object has no attribute 'id'"

Code: "canid = frame.get_canid().get_id()"

I have run the following code on a CANID object to find about the supported methods:

object_methods = [method_name for method_name in dir(frame.get_canid())
                  if callable(getattr(frame.get_canid(), method_name))]
print(object_methods)

Result:
['__class__', 'get_arbitration_id', 'get_id_filter', 'is_extended']

The CANID class has the following methods:

  • get_arbitration_id
  • is_extended
  • get_id_filter

The arbitration ID is a 29-bit integer, and should be interpreted depending on whether it is an extended or standard ID.

The error message quoted is odd: all Python objects get an attribute of id (which makes it awkward in the context of naming an API for CAN).

The documentation is in error: it should be get_arbitration_id rather than get_id: there was a late change to the code to name this arbitration ID to try and prevent confusion between a CANID instance, an integer part of a CAN ID, and a Python ID. The change didn't make it into the documentation, leading to confusion about IDs..

I'll get the documentation fixed.