
#ifndef MODBUS_TCP_SER__
#define MODBUS_TCP_SER__

#include "protocol.h"
#include "common.h"
#include "tag.h"
#define ADDR_MAP_FILE "tag_addr_map.json"

#define MODBUSTCP_CONFIG_FILE "/app/config/north/modbustcp_north_map.json"
#define MODBUS_TCP "MODBUS_TCP"
#define POINT_INFO_DEAFIL_NUM 5
#define PLAN_START_ADDR 40015
#define PLAN_END_ADDR 41549
 

#define CHK_AMASK_BIT(alarm_flag, bit)	(alarm_flag & (1ULL << (bit)))
#define SET_AMASK_BIT(alarm_flag, bit)	(alarm_flag |= (1ULL << (bit)))
#define CLR_AMASK_BIT(alarm_flag, bit)	(alarm_flag &= ~(1ULL << (bit)))



typedef struct point_info
{
    char name[TAG_NAME_LEN];
    unsigned short addr;
    unsigned char function_code;
    DATA_TYPE data_type;
    DATA_ORDER data_order;
    float coefficient;
}point_info_t;

typedef struct addrmap
{
    unsigned short modaddr; //modbus 地址码
    unsigned short start_bits;
    unsigned short nb_bits;
    unsigned short start_input_bits;
    unsigned short nb_input_bits;
    unsigned short start_registers;
    unsigned short nb_registers;
    unsigned short start_input_registers;
    unsigned short nb_input_registers;
    point_info_t **point_info_list;
    unsigned short point_info_list_num;
    modbus_mapping_t *mb_mapping;
}addr_map_t;

typedef struct client_connection
{
    int socket_fd;
    time_t last_activity_time;
    struct client_connection *next;
}client_connection_t;

typedef struct modbus_tcp_ser
{
    unsigned short server_port;
    pthread_t thread;
    addr_map_t *addr_map;
    int addrmapcnt;
    client_connection_t *client_list;
    int max_idle_time;  // 最大空闲时间（秒）
    int heartbeat_interval;  // 心跳检测间隔（秒）
}modbus_tcp_ser_t;

typedef struct modbus_sever_base_param
{
    char *config_file_pwd;
    char *config_str_to_ems;
}MODBUS_SERVER_BASE_PARAM;

typedef struct modbus_sever_param
{
    MODBUS_SERVER_BASE_PARAM *modbus_ser_base_data;
    modbus_tcp_ser_t *modbus_tcp_ser;
    int control;
}MODBUS_SERVER_PARAM;

MODBUS_SERVER_PARAM *modbus_tcp_ser_init(MODBUS_SERVER_BASE_PARAM *param);
int modbus_tcp_ser_start(proto_forward_t *var);
int modbus_tcp_ser_stop(proto_forward_t *var);
#endif