157 lines
6.1 KiB
C
157 lines
6.1 KiB
C
/**
|
|
* @file pcan_abi.h
|
|
* @brief Stable C ABI for desktop, Android and other foreign runtimes.
|
|
*
|
|
* The firmware-facing API remains allocation free. This header exposes
|
|
* scalar arguments and explicitly sized buffers so ctypes/JNI/Swift can use
|
|
* the same C99 implementation without reproducing the wire protocol.
|
|
*/
|
|
#ifndef PCAN_ABI_H
|
|
#define PCAN_ABI_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#if defined(_WIN32) && defined(PCAN_ABI_BUILD_DLL)
|
|
# define PCAN_ABI_API __declspec(dllexport)
|
|
#elif defined(_WIN32) && defined(PCAN_ABI_USE_DLL)
|
|
# define PCAN_ABI_API __declspec(dllimport)
|
|
#elif defined(__GNUC__) && (__GNUC__ >= 4)
|
|
# define PCAN_ABI_API __attribute__((visibility("default")))
|
|
#else
|
|
# define PCAN_ABI_API
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define PCAN_ABI_VERSION 1U
|
|
|
|
typedef struct {
|
|
uint32_t can_id;
|
|
uint8_t sequence;
|
|
uint8_t flags;
|
|
uint8_t dlc;
|
|
uint8_t data[8];
|
|
} pcan_abi_frame_t;
|
|
|
|
#define PCAN_ABI_GUI_PAYLOAD_MAX 512U
|
|
|
|
typedef struct {
|
|
uint16_t sequence;
|
|
uint16_t size;
|
|
uint8_t message_type;
|
|
uint8_t payload[PCAN_ABI_GUI_PAYLOAD_MAX];
|
|
} pcan_abi_gui_frame_t;
|
|
|
|
typedef struct {
|
|
uint8_t device;
|
|
uint8_t direction;
|
|
uint8_t present_mask;
|
|
uint16_t start_address;
|
|
uint16_t values[3];
|
|
} pcan_abi_balsam_frame_t;
|
|
|
|
PCAN_ABI_API uint32_t pcan_abi_version(void);
|
|
|
|
PCAN_ABI_API uint32_t pcan_abi_id_pack(uint8_t priority, uint8_t route,
|
|
uint8_t device_type, uint8_t device_id,
|
|
uint8_t message_type, uint16_t body);
|
|
|
|
PCAN_ABI_API void pcan_abi_id_unpack(uint32_t raw, uint8_t *priority,
|
|
uint8_t *route, uint8_t *device_type,
|
|
uint8_t *device_id, uint8_t *message_type,
|
|
uint16_t *body);
|
|
|
|
PCAN_ABI_API uint16_t pcan_abi_crc16(const uint8_t *data, size_t size);
|
|
|
|
PCAN_ABI_API int pcan_abi_balsam_decode(uint32_t can_id,
|
|
const uint8_t *data, size_t size,
|
|
pcan_abi_balsam_frame_t *output);
|
|
PCAN_ABI_API const char *pcan_abi_balsam_device_name(uint8_t device);
|
|
PCAN_ABI_API size_t pcan_abi_balsam_register_name(
|
|
uint8_t device, uint16_t address, char *output, size_t output_size);
|
|
|
|
/* PM35/TMS320F28335 direct RS232/485 register terminal. */
|
|
PCAN_ABI_API uint16_t pcan_abi_periph28335_crc16(
|
|
const uint8_t *data, size_t size);
|
|
PCAN_ABI_API size_t pcan_abi_periph28335_append_crc(
|
|
const uint8_t *payload, size_t payload_size,
|
|
uint8_t *output, size_t output_size);
|
|
PCAN_ABI_API size_t pcan_abi_periph28335_build_read(
|
|
uint8_t controller, uint16_t start, uint16_t count,
|
|
uint8_t *output, size_t output_size);
|
|
PCAN_ABI_API size_t pcan_abi_periph28335_build_write(
|
|
uint8_t controller, uint16_t address, uint16_t value,
|
|
uint8_t *output, size_t output_size);
|
|
PCAN_ABI_API size_t pcan_abi_periph28335_build_command(
|
|
uint8_t controller, uint8_t command_index,
|
|
uint8_t *output, size_t output_size);
|
|
PCAN_ABI_API size_t pcan_abi_periph28335_expected_read_size(uint16_t count);
|
|
PCAN_ABI_API int pcan_abi_periph28335_decode_read(
|
|
const uint8_t *data, size_t size, uint8_t controller, uint16_t count,
|
|
uint16_t *output, size_t output_count);
|
|
PCAN_ABI_API int pcan_abi_periph28335_validate_write(
|
|
const uint8_t *response, size_t response_size,
|
|
const uint8_t *request, size_t request_size);
|
|
PCAN_ABI_API size_t pcan_abi_periph28335_project_count(void);
|
|
PCAN_ABI_API const char *pcan_abi_periph28335_project_name(
|
|
size_t project_index);
|
|
PCAN_ABI_API const char *pcan_abi_periph28335_command_name(
|
|
size_t project_index, size_t command_index);
|
|
|
|
/* PM67/TMS320F2812 legacy memory upload. */
|
|
PCAN_ABI_API uint16_t pcan_abi_tms2812_crc16(
|
|
const uint8_t *data, size_t size);
|
|
PCAN_ABI_API size_t pcan_abi_tms2812_build_upload(
|
|
uint8_t controller, uint32_t word_address, uint32_t byte_count,
|
|
uint8_t *output, size_t output_size);
|
|
PCAN_ABI_API size_t pcan_abi_tms2812_expected_upload_size(
|
|
uint32_t byte_count);
|
|
PCAN_ABI_API int pcan_abi_tms2812_validate_upload(
|
|
const uint8_t *data, size_t size, uint8_t controller,
|
|
uint32_t byte_count);
|
|
PCAN_ABI_API int pcan_abi_tms2812_decode_upload(
|
|
const uint8_t *data, size_t size, uint8_t controller,
|
|
uint32_t byte_count, uint8_t *output, size_t output_size);
|
|
|
|
PCAN_ABI_API size_t pcan_abi_frame_encode(uint8_t sequence, uint8_t flags,
|
|
uint32_t can_id,
|
|
const uint8_t *data, uint8_t dlc,
|
|
uint8_t *output,
|
|
size_t output_size);
|
|
|
|
/* The caller owns parser_storage; no allocation is performed by the core. */
|
|
PCAN_ABI_API size_t pcan_abi_parser_size(void);
|
|
PCAN_ABI_API int pcan_abi_parser_init(void *parser_storage,
|
|
size_t storage_size);
|
|
PCAN_ABI_API int pcan_abi_parser_push(void *parser_storage, uint8_t byte,
|
|
pcan_abi_frame_t *output);
|
|
PCAN_ABI_API int pcan_abi_parser_stats(const void *parser_storage,
|
|
uint32_t *frames,
|
|
uint32_t *crc_errors,
|
|
uint32_t *bad_length,
|
|
uint32_t *stray_bytes);
|
|
|
|
PCAN_ABI_API uint32_t pcan_abi_gui_crc32(const uint8_t *data, size_t size);
|
|
PCAN_ABI_API size_t pcan_abi_gui_frame_encode(
|
|
uint8_t message_type, uint16_t sequence,
|
|
const uint8_t *payload, uint16_t payload_size,
|
|
uint8_t *output, size_t output_size);
|
|
PCAN_ABI_API size_t pcan_abi_gui_parser_size(void);
|
|
PCAN_ABI_API int pcan_abi_gui_parser_init(void *parser_storage,
|
|
size_t storage_size);
|
|
PCAN_ABI_API int pcan_abi_gui_parser_push(void *parser_storage, uint8_t byte,
|
|
pcan_abi_gui_frame_t *output);
|
|
PCAN_ABI_API int pcan_abi_gui_parser_stats(
|
|
const void *parser_storage, uint32_t *frames, uint32_t *crc_errors,
|
|
uint32_t *version_errors, uint32_t *length_errors,
|
|
uint32_t *stray_bytes);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PCAN_ABI_H */
|