/*
 * @Author: ybzhou yibo.zhou@lnxall.com
 * @Date: 2025-07-16 12:48:24
 * @LastEditors: ybzhou yibo.zhou@lnxall.com
 * @LastEditTime: 2025-09-10 19:19:35
 * @FilePath: /2025.07.09/proto_forward/src/automatic_north/modbus_create.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#ifndef __MODBUS_CREATE_H__
#define __MODBUS_CREATE_H__

#include "north_automatic.h"

#define MODBUSTCP_NORTH_MAP_FILE "modbustcp_north_map.json"

extern char *type_string[];
extern char *order_string[];
extern const char *property_name[];

typedef enum
{
    N_CODE_TYPE = 0,
    X_CODE_TYPE,     
    L_CODE_TYPE, 
    B_CODE_TYPE,  
    S_CODE_TYPE, 
} mo_fun_code_t;

typedef struct
{
    char **compatible;
	int str_addr;
	int end_addr;
	//------------------------------------此4个参数，仅多个设备用一个modbus addr时使用，记录寄存器的个数
    unsigned short nb_bits;
	unsigned short nb_input_bits;
	unsigned short nb_registers;
	unsigned short nb_input_registers;
	//------------------------------------
} mo_class_info_t;

typedef struct
{
    char ver;
	int server_port; 
	unsigned short start_bits;             // 线圈寄存器起始地址
	unsigned short start_input_bits;       // 离散量输入寄存器起始地址
	unsigned short start_registers;        // 保持寄存器起始地址
	unsigned short start_input_registers;  // 输入寄存器起始地址
	mo_class_info_t mo_class_info[CLASS_NUM];
} mo_proto_info_t;

typedef struct
{
    unsigned int addr;
	unsigned char function_code;
	DATA_TYPE data_type;
	double coefficient; //1.0
} mo_xlsx_item_t;

typedef struct
{
    unsigned int addr;
	struct mq_north_tag *coil_tag[TAG_NUM];
	unsigned short nb_coil;
	struct mq_north_tag *inputb_tag[TAG_NUM];
	unsigned short nb_inputb;
	struct mq_north_tag *hold_tag[TAG_NUM];
	unsigned short nb_hold;
	struct mq_north_tag *inputr_tag[TAG_NUM];
	unsigned short nb_inputr;
} mo_xlsx_dev_t;

typedef struct
{

} mo_xlsx_sheet_t;

typedef struct
{
	unsigned int addr;
	unsigned char function_code;
	DATA_TYPE data_type;
	DATA_ORDER data_order; // 大小端，字节序（默认多字节统一大端格式：AB ABCD）
	double coefficient; //1.0
} mo_north_tag_t;

typedef struct
{
	unsigned short addr;
	struct mq_north_tag *coil_tag[TAG_NUM];
	unsigned short nb_coil;            // 线圈点位个数
	unsigned short nb_bits;            // 线圈寄存器个数     addr
	struct mq_north_tag *inputb_tag[TAG_NUM];
	unsigned short nb_inputb;          // 离散量输入点位个数
	unsigned short nb_input_bits;      // 离散量输入寄存器个数
	struct mq_north_tag *hold_tag[TAG_NUM];
	unsigned short nb_hold;            // 保持寄存器点位个数
	unsigned short nb_registers;       // 保持寄存器个数
	struct mq_north_tag *inputr_tag[TAG_NUM];
	unsigned short nb_inputr;          // 输入寄存器点位个数
	unsigned short nb_input_registers; // 输入寄存器个数

	unsigned short section_indx; // 分段索引
} mo_north_dev_t;

typedef struct
{    
    mo_class_info_t *mo_class_info;
} mo_north_class_t;

mo_proto_info_t *get_mo_proto_info(void); //

int mo_match_by_class_type(char **class_type, mo_class_info_t *mo_class_info, int *p_compatible_id, int log_flag); // -1，匹配失败，其他匹配成功

char *create_mo_relate_file(mq_north_inside_t *mq_north_inside, mq_xlsx_book_t *mq_xlsx_book);

void init_mo_north_dev(mo_north_dev_t *dev);
void init_mo_xlsx_dev(mo_xlsx_dev_t *dev);
void clear_mo_class_nb(mo_class_info_t *mo_class_info);


#endif
