62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
/**
|
|
* @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 <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#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 */
|