/** * @file balsam_can.h * @brief Legacy Balsam 167 extended-CAN register frames. * * The wire layout is taken from Balsam_167_periph/Source/Internal/ecan.c: * one big-endian address/mask word followed by three big-endian register words. */ #ifndef BALSAM_CAN_H #define BALSAM_CAN_H #include #include #ifdef __cplusplus extern "C" { #endif #define BALSAM_CAN_BASE_ID 0x00BA0000UL #define BALSAM_CAN_NODE_COUNT 13U #define BALSAM_CAN_DATA_OFFSET 0x10U #define BALSAM_CAN_DLC 8U #define BALSAM_CAN_REGISTER_COUNT 3U typedef enum { BALSAM_CAN_TO_NODE = 0, BALSAM_CAN_FROM_NODE = 1 } balsam_can_direction_t; typedef struct { uint8_t device; uint8_t direction; uint8_t present_mask; uint16_t start_address; uint16_t values[BALSAM_CAN_REGISTER_COUNT]; } balsam_can_frame_t; /** Return non-zero for the command/data/terminal IDs used by Balsam 167. */ int balsam_can_is_id(uint32_t can_id); /** * Decode an 8-byte Balsam frame. Returns 1 on success, 0 for another CAN ID, * -1 for invalid arguments and -2 for a Balsam ID with a non-8-byte payload. */ int balsam_can_decode(uint32_t can_id, const uint8_t *data, size_t size, balsam_can_frame_t *output); /** Human-readable Russian name of a Balsam device. */ const char *balsam_can_device_name(uint8_t device); /** * Format the register name from the Balsam 167 data table into output. * Returns the required length (excluding NUL); an empty string means unknown. */ size_t balsam_can_register_name(uint8_t device, uint16_t address, char *output, size_t output_size); #ifdef __cplusplus } #endif #endif /* BALSAM_CAN_H */