/* * Транспортно-независимая карта 16-битных регистров с отдельными регионами и обработчиками. * Проверка диапазонов и прав доступа выполняется до вызова сервиса; относительное смещение * региона отличается от общего адреса. */ /* Transport-independent 16-bit word address space. No heap, clocks or board headers. */ #ifndef SET_REGMAP_H #define SET_REGMAP_H #include "pcan_abi.h" #ifdef __cplusplus extern "C" { #endif #define SET_REG_MAX_WORDS 124u #define SET_REG_READ 1u #define SET_REG_WRITE 2u enum { SET_REG_OK=0, SET_REG_FUNCTION=1, SET_REG_ADDRESS=2, SET_REG_VALUE=3, SET_REG_FAILURE=4, SET_REG_BUSY=6 }; typedef unsigned (*set_reg_read_fn)(void *, uint16_t, uint16_t, uint16_t *); typedef unsigned (*set_reg_write_fn)(void *, uint16_t, uint16_t); typedef struct { uint16_t base, words, kind, version, instance, flags; void *context; set_reg_read_fn read; set_reg_write_fn write; } set_reg_region; typedef struct { const set_reg_region *regions; size_t count; } set_regmap; /* Directory at 0: 8-word header, then 8 words per region. Reject overlaps, * wraparound, invalid callbacks and overlap with the directory itself. * Regions and contexts must outlive the map and remain unchanged. */ PCAN_ABI_API unsigned set_regmap_init(set_regmap *, const set_reg_region *, size_t); /* One region per request. Preflight all bounds/capacity before calling a module. * Writes return absolute address/value echo. Reads must be side-effect free. * A module validates the entire write before mutation. Caller serializes access. */ PCAN_ABI_API unsigned set_regmap_request(const set_regmap *, unsigned function, uint16_t address, uint16_t value, uint16_t *out, size_t capacity, size_t *count); /* Complete Modbus RTU FC03/06 frame; no broadcast. Capacity >=253 bytes. * CRC/address/capacity validation precedes dispatch. */ PCAN_ABI_API size_t set_regmap_rtu(const set_regmap *, unsigned device, const uint8_t *, size_t, uint8_t *, size_t); /* Legacy UMP CAN envelope, usable by any region: BE address/value/1F00/token/fn. * Returns padded EVEN words, last padding word=0. Caller retains original * requested count; token/error accompany fragments. Output capacity >=124. */ PCAN_ABI_API size_t set_regmap_can(const set_regmap *, const uint8_t *, size_t, uint16_t *, size_t, unsigned *token, unsigned *error); PCAN_ABI_API size_t set_regmap_can_fragment(const uint16_t *, size_t count, size_t index, unsigned token, unsigned error, uint8_t *, size_t capacity); #ifdef __cplusplus } #endif #endif