#ifndef MODBUS_MEMORY_H #define MODBUS_MEMORY_H #include #include #include typedef enum { MB_MEM_COIL = 0, MB_MEM_DISCRETE_INPUT, MB_MEM_INPUT_REGISTER, MB_MEM_HOLDING_REGISTER } modbus_mem_type_t; typedef struct modbus_db modbus_db_t; typedef struct { modbus_db_t *db; } modbus_memory_t; /* ---------------------------------------------------- */ /* Init / deinit */ /* ---------------------------------------------------- */ bool modbus_memory_init(modbus_memory_t *mem, modbus_db_t *db); void modbus_memory_deinit(modbus_memory_t *mem); /* Clear all runtime point values back to 0 */ void modbus_memory_reset(modbus_memory_t *mem); /* ---------------------------------------------------- */ /* Single-point access helpers */ /* ---------------------------------------------------- */ bool modbus_memory_read_coil(modbus_memory_t *mem, uint16_t offset, uint8_t *value); bool modbus_memory_write_coil(modbus_memory_t *mem, uint16_t offset, uint8_t value); bool modbus_memory_read_discrete_input(modbus_memory_t *mem, uint16_t offset, uint8_t *value); bool modbus_memory_write_discrete_input(modbus_memory_t *mem, uint16_t offset, uint8_t value); bool modbus_memory_read_input_register(modbus_memory_t *mem, uint16_t offset, uint16_t *value); bool modbus_memory_write_input_register(modbus_memory_t *mem, uint16_t offset, uint16_t value); bool modbus_memory_read_holding_register(modbus_memory_t *mem, uint16_t offset, uint16_t *value); bool modbus_memory_write_holding_register(modbus_memory_t *mem, uint16_t offset, uint16_t value); /* ---------------------------------------------------- */ /* Generic access helpers */ /* ---------------------------------------------------- */ bool modbus_memory_read_bit(modbus_memory_t *mem, modbus_mem_type_t type, uint16_t offset, uint8_t *value); bool modbus_memory_write_bit(modbus_memory_t *mem, modbus_mem_type_t type, uint16_t offset, uint8_t value); bool modbus_memory_read_reg(modbus_memory_t *mem, modbus_mem_type_t type, uint16_t offset, uint16_t *value); bool modbus_memory_write_reg(modbus_memory_t *mem, modbus_mem_type_t type, uint16_t offset, uint16_t value); /* ---------------------------------------------------- */ /* Multi-point access helpers */ /* ---------------------------------------------------- */ bool modbus_memory_read_coils(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, uint8_t *dest); bool modbus_memory_write_coils(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, const uint8_t *src); bool modbus_memory_read_discrete_inputs(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, uint8_t *dest); bool modbus_memory_write_discrete_inputs(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, const uint8_t *src); bool modbus_memory_read_input_registers(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, uint16_t *dest); bool modbus_memory_write_input_registers(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, const uint16_t *src); bool modbus_memory_read_holding_registers(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, uint16_t *dest); bool modbus_memory_write_holding_registers(modbus_memory_t *mem, uint16_t start_offset, uint16_t quantity, const uint16_t *src); /* ---------------------------------------------------- */ /* Utility helpers */ /* ---------------------------------------------------- */ bool modbus_memory_valid_bit_range(modbus_memory_t *mem, modbus_mem_type_t type, uint16_t start_offset, uint16_t quantity); bool modbus_memory_valid_reg_range(modbus_memory_t *mem, modbus_mem_type_t type, uint16_t start_offset, uint16_t quantity); #endif /* MODBUS_MEMORY_H */