#ifndef MODBUS_POINTS_H #define MODBUS_POINTS_H #include #include #include #include "modbus_memory.h" /* Modbus Data Type - bool = 1 register - uint16 = 1 register - uint32 = 2 registers - float = 2 registers Example: If max is set to 2, you can have this combination: - 2 bool Data_Type - 2 uint16 Data_Type - 1 uint32 Data_Type - 1 float Data_Type */ #define MODBUS_MAX_CSV_LINE_LEN 512 typedef enum { MB_POINT_COIL = 0, MB_POINT_DISCRETE_INPUT, MB_POINT_INPUT_REGISTER, MB_POINT_HOLDING_REGISTER, MB_POINT_INVALID } modbus_point_type_t; typedef enum { MB_DATA_BOOL = 0, MB_DATA_UINT16, /* 1 Register*/ MB_DATA_UINT32, /* 2 Registers */ MB_DATA_FLOAT, /* 2 Registers */ MB_DATA_DOUBLE, /* 4 Registers */ MB_DATA_INVALID } modbus_data_type_t; typedef enum { PICS_DATA_NONE = 0, PICS_DATA_BOOLEAN, /* PICS Boolean = 1 bit ; uses 1 Register */ PICS_DATA_INTEGER, /* PICS Integer = 32-bit ; uses 2 Registers*/ PICS_DATA_FLOAT, /* PICS Float = 64-bit double ; uses 4 registers */ PICS_DATA_STRING, /* This is ignored, just brought in incase users usees it, ESP32 will ignore it*/ PICS_DATA_INVALID } pics_data_type_t; typedef struct modbus_point { modbus_point_type_t type; uint32_t raw_address; uint16_t offset; modbus_data_type_t data_type; uint8_t reg_span; bool is_helper; bool has_control_address; uint32_t control_raw_address; modbus_point_type_t control_type; uint16_t control_offset; bool has_pics_address; uint32_t pics_raw_address; modbus_point_type_t pics_type; uint16_t pics_offset; pics_data_type_t pics_data_type; uint8_t pics_reg_span; uint16_t pics_words[4]; uint8_t bit_value; uint16_t reg_value; } modbus_point_t; typedef struct modbus_db { modbus_point_t *points; size_t count; size_t capacity; } modbus_db_t; /* Initialize / clear point database */ void modbus_points_init(modbus_db_t *db); void modbus_points_reset(modbus_db_t *db); /* Load points from CSV */ bool modbus_points_load(modbus_db_t *db, const char *filename, size_t max_points); /* Lookup helpers */ const modbus_point_t *modbus_points_find_by_type_offset(const modbus_db_t *db, modbus_point_type_t type, uint16_t offset); /* Optional helpers for PICS staging lookup */ const modbus_point_t *modbus_points_find_by_pics_offset(const modbus_db_t *db, modbus_point_type_t type, uint16_t offset); const modbus_point_t *modbus_points_find_by_pics_range(const modbus_db_t *db, modbus_point_type_t type, uint16_t offset); /* Helpers */ modbus_mem_type_t modbus_points_type_to_mem(modbus_point_type_t type); bool modbus_points_is_bit_type(modbus_point_type_t type); bool modbus_points_is_reg_type(modbus_point_type_t type); bool modbus_points_is_writable_type(modbus_point_type_t type); #endif /* MODBUS_POINTS_H */