/*
 * @Author: zchuo zhengchen.huo@lnxall.com
 * @Date: 2025-06-24 14:58:14
 * @LastEditors: zchuo zhengchen.huo@lnxall.com
 * @LastEditTime: 2025-07-03 15:41:55
 * @FilePath: /proto_forward/src/rate/rate.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#ifndef __RATE_MODE__
#define __RATE_MODE__
#include <cJSON.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/syslog.h>
#include "../tag.h"
#include <ctype.h>  // 用于isdigit函数
#include <time.h>
#include "lnxall_buffer.h"
#include "../proto_forward.h"
#include "../prot_transf.h"
#include "../tag.h"
#include "../mqtt_emms2/mqtt_emms2.h"
// #include "645_api.h"
// #include "dlt645_api_07.h"

#define RATECFG_PATH "/app/config/rate_fig.json"

extern int  read_data_timeout(int fd, unsigned char* buff, int buffsize, int timeout);
// 获取全量配置的信息
enum rate_message_node_type // 报文节点类型定义
{
    RATE_MSG_NODE_NON = 0,          // 原文
    RATE_MSG_NODE_TEXT,             // 原文
    RATE_MSG_NODE_TZ_MON,           // 年时区 月
    RATE_MSG_NODE_TZ_DAY,           // 年时区 日
    RATE_MSG_NODE_TF_HOUR,          // 日时段 小时
    RATE_MSG_NODE_TF_MIN,           // 日时段 分钟
    RATE_MSG_NODE_TF_MODE,          // 日时段 尖峰平谷类型
    RATE_MSG_NODE_PASSWD,           // 密码
    RATE_MSG_NODE_645_CR,           // 645协议报文校验码
    RATE_MSG_NODE_645_TAB,          // 645协议多费率表号
    RATE_MSG_NODE_RTU_CRC
};

struct rate_message_node    // 报文节点信息结构体，用以存放报文节点信息
{
    union 
    {
        int time[2];        // 存储二维矩阵地址，用以直接访问矩阵 例如 : row1_col2_MIN 为 time[2] = {1, 2}
        int passwd;         // 存放密码
        char *message;      // 存放原文
        int mode;           // 存放尖峰平谷类型
    }data;
    // int time[2];        // 存储二维矩阵地址，用以直接访问矩阵 例如 : row1_col2_MIN 为 time[2] = {1, 2}
    // int passwd;         // 存放密码
    // char *message;      // 存放原文
    // int mode;           // 存放尖峰平谷类型
    list_head_t list;
    enum rate_message_node_type type;           // 自定义支持的类型并按照预定类型处理   
};

struct rate_dev_message     // 一条hex报文的组合信息，用以组装hex报文
{
    struct rate_message_node data;
    list_head_t list;
    int type;   // 0:send   1:read
};

typedef enum
{
    RATE_ORDER_ERROR  =   -1,
    RATE_ORDER_A = 0,
    RATE_ORDER_B = 1,
    RATE_ORDER_AB,
    RATE_ORDER_BA,
    RATE_ORDER_ABCD,
    RATE_ORDER_DCBA,
    RATE_ORDER_BADC,
    RATE_ORDER_CDAB,
    RATE_ORDER_ABCDEFGH,
    RATE_ORDER_GHEFCDAB,
    RATE_ORDER_BADCFEHG,
    RATE_ORDER_HGFEDCBA,
    RATE_ORDER_MAX
}DATA_RATE_ORDER;  //字序 请务必按照从少到多排序

struct rate_dev_cfg // 描述设备的报文配置信息
{
    char *dev_no;
    char *vendor, *model;
    
    list_t  list;

    int data_type;              // 数据大小端等数据转换的处理 0:小端 1:大端 其他再增加类型例如偏移量等 需增加相应代码实现
    int delay_time;             // 等待回复的延迟时间 单位ms
    DATA_RATE_ORDER protocol;        // 编码方式 A B AB ABCD DCBA BADC CDAB ABCDEFGH GHEFCDAB BADCFEHG HGFEDCBA   xxxxx
    int read_en, write_en;      // 读写配置使能

    int adapter[6];             // 尖峰平谷的映射定义 云端配置默认 0:无 1:尖 2:峰 3:平 4:谷 5:深谷
    char *agreement;         // 协议名 特殊协议拓展校验此
    
    struct rate_dev_message read, write;    // 读操作和写操作 本结构下变量为链表头 信息存在其后
};

// 获取链表长度接口
int rate_cfg_list_length(void);

/**********配置矩阵解析********* */
enum RATE_TYPE
{
    RATE_TYPE_NON = 0,          //  无
    RATE_YTPE_SHARP,            //  尖
    RATE_YTPE_PEAK,             //  峰
    RATE_YTPE_FLAT,             //  平
    RATE_YTPE_VALLEY,           //  谷
    RATE_YTPE_DEEP_VALLEY,      //  深谷
    
};

struct tags_matrix_Node // 矩阵配置节点
{
    int hour;   
    int min;
    enum RATE_TYPE type;
};

struct tags_matrix_row // 矩阵行 信息
{
    struct tags_matrix_Node *Node;  // 矩阵单行的各个列 使用数组下标访问
    int Node_num;                   // 节点数, 防止访问溢出
    int mon;                        // 本行的月
    int day;                        // 本行的天
};

struct tags_matrix  // 单个电表的信息
{
    char dev_no[DEV_NO_LEN];            // 设备no
    struct tags_matrix_row *rows;       // 配置矩阵 一维数据 记录矩阵的 行 使用数组下标访问
    int row_num;                            // 行数量 防止访问溢出的防御编程

    // [1, 1][10, 15, 0][10, 15, 0][10, 15, 0][10, 15, 0]
    // [3, 1][10, 15, 0][10, 15, 0][10, 15, 0][10, 15, 0]
    // [9, 15][10, 15, 0][10, 15, 2][10, 15, 0][10, 15, 0]
    // [12, 1][10, 15, 0][10, 15, 0][10, 15, 0][10, 15, 0]

    char passwd[64];                    // 可能存在的密码
};

int get_rate_cfg();
int check_rate_support(char *vendor, char *mode);
int rate_mqtt_analysis_cfg(cJSON *root);
cJSON *update_dev_rate_info(cJSON *dev_info);
int rate_cfg_read(char *dev_no, struct tags_matrix *matrix);
int report_rate_set_return(mqtt_emms2_var_t *var,const char *type,EMMS2_TAG_TYPE tag_type,int seq, int ret);
int rate_test();
#endif
