/**
 * @file    iec104.h
 * @brief   IEC 60870-5-104 服务端模块 — 公共头
 *
 * @details 本模块作为 IEC-104 从站 (Server), 通过 com_router 的 bind_app="iec"
 *          机制接收 TCP :2404 端口的主站连接数据。协议栈复用 lib60870 自研库。
 *
 *          架构:
 *            com_router (bind_app=iec) → MQ_COM_TO_IEC → libiec
 *              → CS10x_104Init → CS10x_DoRecv → callbacks → datacenter
 *              → iec_data_tx → MQ_IEC_TO_COM → com_router → TCP
 *
 *          支持最多 3 路并发连接 (MAX_IEC_NUM), 超时 600s 自动回收 slot。
 */

#ifndef _IEC104_H_
#define _IEC104_H_

#include "myBase.h"
#include "myIec60870.h"

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_IEC_NUM   3         /**< 最大并发 IEC 连接数 */
#define IEC_BUF_SIZE  1024      /**< 每路收发缓冲区大小 */

/* 环形缓冲区辅助类型 (iec104.cpp/iec104_point.cpp 共享) */
typedef struct
{
	uint32_t info_addr;
	uint8_t  status;
	uint8_t  state_type;
	uint16_t ms;
	uint32_t sec;
} iec_soe_info_t;

typedef struct
{
	uint32_t info_addr;
	float    val;
} iec_yc_info_t;

/** IEC 实例 — 每路连接一个 */
typedef struct
{
	uint8_t     is_busy;        /**< 槽位占用标志 */
	CS10x_Type  iec_type;       /**< CS104_TYPE_S / CS101_TYPE_S */
	uint32_t    interface;       /**< (ch_id<<16)|fd, 通道唯一标识 */
	uint32_t    tm_out;          /**< 超时计数器 (ms), 超过 600s 回收 */

	uint8_t     rx[IEC_BUF_SIZE];
	uint8_t     tx[IEC_BUF_SIZE];
	uint8_t     pub[IEC_BUF_SIZE];
	uint8_t     bak[IEC_BUF_SIZE];

	CS10x       cs10x;           /**< lib60870 协议栈句柄 */
} stru_iec;

/* =========================== 对外 API =========================== */

stru_iec *iec104_get_by_interface(uint32_t interface);
int       iec104_data_rx(uint8_t *msg);       /**< MQ 数据入口 */
void      iec104_task(uint16_t usGap);        /**< 10ms 定时器处理 */

/* =========================== 应用线程入口 =========================== */

int   app_iec_init1(void *arg);
int   app_iec_init2(void *arg);
void *app_iec(void *arg);

#ifdef __cplusplus
}
#endif

#endif /* _IEC104_H_ */
