diff --git a/examples/stm32/nanomodbus_stm32.c b/examples/stm32/nanomodbus_stm32.c index 229b634..8660b76 100644 --- a/examples/stm32/nanomodbus_stm32.c +++ b/examples/stm32/nanomodbus_stm32.c @@ -15,18 +15,72 @@ typedef struct tRingBuf { static ringBuf rb; static void ringbuf_init(ringBuf* rb, void (*overflow_callback)(struct tRingBuf* rq)); -static void ring_buf_overflow_error(ringBuf* rb); +static void ringbuf_overflow_error(ringBuf* rb); -void nanomodbus_rtu_init(nmbs_t* nmbs) +uint8_t coil_buf[COIL_BUF_SIZE]; +uint16_t reg_buf [REG_BUF_SIZE]; + +static nmbs_error server_read_coils(uint16_t address, uint16_t quantity, nmbs_bitfield coils_out, uint8_t unit_id, void* arg); +static nmbs_error server_read_holding_registers(uint16_t address, uint16_t quantity, uint16_t* registers_out, uint8_t unit_id, void* arg); +static nmbs_error server_write_single_coil(uint16_t address, bool value, uint8_t unit_id, void* arg); +static nmbs_error server_write_multiple_coils(uint16_t address, uint16_t quantity, const nmbs_bitfield coils, uint8_t unit_id, void* arg); +static nmbs_error server_write_single_register(uint16_t address, uint16_t value, uint8_t unit_id, void* arg); +static nmbs_error server_write_multiple_resisters(uint16_t address, uint16_t quantity, const uint16_t* registers, uint8_t unit_id, void* arg); + +void nanomodbus_server_init(nmbs_t* nmbs) { - ring_buf_init(&rb, ring_buf_overflow_error); + ringbuf_init(&rb, ringbuf_overflow_error); nmbs_platform_conf pf_conf; + nmbs_callbacks cb; nmbs_platform_conf_create(&pf_conf); pf_conf.transport = NMBS_TRANSPORT_RTU; pf_conf.read = read_serial; pf_conf.write = write_serial; + + nmbs_callbacks_create(&cb); + cb.read_coils = server_read_coils; + cb.read_holding_registers = server_read_holding_registers; + cb.write_single_coil = server_write_single_coil; + cb.write_multiple_coils = server_write_multiple_coils; + cb.write_single_register = server_write_single_register; + cb.write_multiple_registers = server_write_multiple_resisters; +} + +void nanomodbus_server_add(nmbs_server_t* server) +{ + +} + +static nmbs_error server_read_coils(uint16_t address, uint16_t quantity, nmbs_bitfield coils_out, uint8_t unit_id, void* arg) +{ + +} + +static nmbs_error server_read_holding_registers(uint16_t address, uint16_t quantity, uint16_t* registers_out, uint8_t unit_id, void* arg) +{ + +} + +static nmbs_error server_write_single_coil(uint16_t address, bool value, uint8_t unit_id, void* arg) +{ + +} + +static nmbs_error server_write_multiple_coils(uint16_t address, uint16_t quantity, const nmbs_bitfield coils, uint8_t unit_id, void* arg) +{ + + +} +static nmbs_error server_write_single_register(uint16_t address, uint16_t value, uint8_t unit_id, void* arg) +{ + +} + +static nmbs_error server_write_multiple_registers(uint16_t address, uint16_t quantity, const uint16_t* registers, uint8_t unit_id, void* arg) +{ + } // Function to initialize the ring buffer @@ -98,7 +152,7 @@ uint16_t ringbuf_size(ringBuf* rb) { } // Example callback function to handle buffer overflow -static void ring_buf_overflow_error(ringBuf* rb) +static void ringbuf_overflow_error(ringBuf* rb) { //In here we may check the overflow situation while(true){} diff --git a/examples/stm32/nanomodbus_stm32.h b/examples/stm32/nanomodbus_stm32.h index 05ed248..2a9e609 100644 --- a/examples/stm32/nanomodbus_stm32.h +++ b/examples/stm32/nanomodbus_stm32.h @@ -7,6 +7,11 @@ extern "C" { #define NANOMB_UART huart1 #define RX_BUF_SIZE 256 + +// Max size of coil and register area +#define COIL_BUF_SIZE 1024 +#define REG_BUF_SIZE 2048 + // Other hardware configuration have done in *.ioc file // Core name may vary with your hardware @@ -14,7 +19,14 @@ extern "C" { // NanoModbus include #include "nanomodbus.h" -void nanomodbus_rtu_init(nmbs_t* nmbs); +void nanomodbus_server_init(nmbs_t* nmbs); +void nanomodbus_server_add(nmbs_server_t* server); + +struct tNmbsServer{ + uint8_t id; + uint8_t coils[COIL_BUF_SIZE]; + uint16_t regs[REG_BUF_SIZE]; +}typedef nmbs_server_t; extern UART_HandleTypeDef NANOMB_UART;