#pragma once

#include "myBase.h"
#include "mySystem.h"
#include "myModbus.h"
#include <vector>
#include <string>
#include <map>

#define MODULE_MODBUS_M "modbus_m"

#define MODBUS_M_STR_LEN 64
#define MODBUS_M_MAX_SLAVE_NUM 16

// 通讯通道配置
typedef struct
{
    uint32_t id;                    // 通道ID
    std::string mode;               // "tcp" 或 "rtu"
    std::string host;               // TCP 目标IP
    uint16_t port;                  // TCP 目标端口
    std::string device;             // RTU 串口设备
    int baud;                       // RTU 波特率
    char parity;                    // RTU 校验位
    int data_bit;                   // RTU 数据位
    int stop_bit;                   // RTU 停止位
    int timeout_ms;                 // 请求超时
    int retry_cnt;                  // 失败重试次数
    modbus_t *ctx;                  // libmodbus 上下文
    bool connected;                 // 连接状态
}stru_modbus_m_channel;

// 点表条目
typedef struct
{
    uint16_t no;                    // 序号
    uint8_t type;                   // 数据类型: 2=bit, 4=uint16, 6=float32, 7=uint32, 13=string
    uint32_t channel;               // 归属通道ID
    uint8_t slave;                  // 从站地址
    uint8_t fc;                     // 功能码
    uint16_t addr;                  // 寄存器/线圈起始地址
    uint16_t count;                 // 连续读取数量
    uint8_t bit;                    // 位位置(0-15)，type=2且fc=03/04时有效
    float factor;                   // 遥测系数
    float offset;                   // 遥测偏移
    std::string saddr;              // 内部信号地址
    std::string desc;               // 描述
    void *p_val;                    // 数据指针
}stru_modbus_m_item;

// 点表页
typedef struct
{
    std::string desc;
    std::vector<stru_modbus_m_item> st_vec;     // 遥信
    std::vector<stru_modbus_m_item> mx_vec;     // 遥测
    std::vector<stru_modbus_m_item> co_vec;     // 遥控
    std::vector<stru_modbus_m_item> ao_vec;     // 参数
}stru_modbus_m_point;

// 写请求（用于 Co/Ao 异步写入）
typedef struct
{
    uint32_t channel;
    uint8_t slave;
    uint8_t fc;
    uint16_t addr;
    uint16_t value;
    bool is_coil;                   // true=写线圈, false=写寄存器
}stru_modbus_m_write_req;

// 模块主配置
typedef struct
{
    std::vector<stru_modbus_m_channel> channels;
    stru_modbus_m_point point;
}stru_modbus_m_cfg;


// API 声明
int modbus_m_init();
int modbus_m_cfg_parse(const std::string &path);
void modbus_m_show_info();
