Share PM67 upload protocol through C core

This commit is contained in:
2026-09-05 11:37:03 +03:00
parent 78d3f6690b
commit 235d5d81a2
17 changed files with 466 additions and 15 deletions

View File

@@ -177,6 +177,24 @@ class NativeProtocol:
ctypes.c_size_t, ctypes.c_size_t,
]
lib.pcan_abi_periph28335_command_name.restype = ctypes.c_char_p
lib.pcan_abi_tms2812_crc16.argtypes = [ctypes.c_void_p, ctypes.c_size_t]
lib.pcan_abi_tms2812_crc16.restype = ctypes.c_uint16
lib.pcan_abi_tms2812_build_upload.argtypes = [
ctypes.c_uint8, ctypes.c_uint32, ctypes.c_uint32,
ctypes.c_void_p, ctypes.c_size_t,
]
lib.pcan_abi_tms2812_build_upload.restype = ctypes.c_size_t
lib.pcan_abi_tms2812_expected_upload_size.argtypes = [ctypes.c_uint32]
lib.pcan_abi_tms2812_expected_upload_size.restype = ctypes.c_size_t
lib.pcan_abi_tms2812_validate_upload.argtypes = [
ctypes.c_void_p, ctypes.c_size_t, ctypes.c_uint8, ctypes.c_uint32,
]
lib.pcan_abi_tms2812_validate_upload.restype = ctypes.c_int
lib.pcan_abi_tms2812_decode_upload.argtypes = [
ctypes.c_void_p, ctypes.c_size_t, ctypes.c_uint8, ctypes.c_uint32,
ctypes.c_void_p, ctypes.c_size_t,
]
lib.pcan_abi_tms2812_decode_upload.restype = ctypes.c_int
lib.pcan_abi_frame_encode.argtypes = [
ctypes.c_uint8, ctypes.c_uint8, ctypes.c_uint32,
ctypes.c_void_p, ctypes.c_uint8, ctypes.c_void_p, ctypes.c_size_t,
@@ -335,6 +353,35 @@ class NativeProtocol:
result[raw_name.decode("utf-8")] = tuple(commands)
return result
def tms2812_crc16(self, data: bytes) -> int:
return int(self.lib.pcan_abi_tms2812_crc16(
self._bytes_buffer(data), len(data)))
def tms2812_build_upload(self, controller: int, word_address: int,
byte_count: int) -> bytes:
output = (ctypes.c_uint8 * 12)()
size = int(self.lib.pcan_abi_tms2812_build_upload(
controller, word_address, byte_count, output, len(output)))
if size == 0:
raise ValueError("SETProtocol rejected PM67 upload request")
return bytes(output[:size])
def tms2812_expected_upload_size(self, byte_count: int) -> int:
return int(self.lib.pcan_abi_tms2812_expected_upload_size(byte_count))
def tms2812_validate_upload(self, data: bytes, controller: int,
byte_count: int) -> int:
return int(self.lib.pcan_abi_tms2812_validate_upload(
self._bytes_buffer(data), len(data), controller, byte_count))
def tms2812_decode_upload(self, data: bytes, controller: int,
byte_count: int) -> tuple[int, bytes]:
output = (ctypes.c_uint8 * byte_count)()
status = int(self.lib.pcan_abi_tms2812_decode_upload(
self._bytes_buffer(data), len(data), controller, byte_count,
output, len(output)))
return status, bytes(output) if status == 0 else b""
def encode(self, sequence: int, flags: int, can_id: int, data: bytes) -> bytes:
if len(data) > 8:
raise ValueError("DLC cannot exceed 8 bytes")