/*
 * sl_protocol.h
 *
 *  Created on: 2024年6月20日
 *      Author: psx
 */

#ifndef APP_INC_SL_PROTOCOL_H_
#define APP_INC_SL_PROTOCOL_H_

#include "debug.h"
#include "uart_dev.h"
#include "math.h"

/* 功能码 */
typedef enum
{
   SL_Function_Code_Read_Register           =   0x30,   /* 读寄存器数据 */
   SL_Function_Code_Write_Register          =   0x10,   /* 写寄存器数据 */
   SL_Function_Code_Broadcast_Scan          =   0xA0,   /* 广播扫描 */
   SL_Function_Code_Registration_request    =   0xA1,   /* 注册请求 */
   SL_Function_Code_Update_Profile          =   0xD0,   /* 配置文件 */
   SL_Function_Code_Remote_Upgrade          =   0xD1,   /* 远程升级 */
}SL_MsgFunctionCode;

/* 寄存器地址 */
typedef enum
{
   SL_Register_Registration_Status          = 0x0000,  /* 注册状态  */
   SL_Register_address                      = 0x0001,  /* 地址  */
   SL_Register_Access_Node_Type             = 0x0002,  /* 接入节点类型   */
   SL_Register_Communication_Methods        = 0x0003,  /* 通信方式   */
   SL_Register_Battery_Voltage              = 0x0100,  /* 电池电压   */
   SL_Register_Charg_Current                = 0x0101,  /* 充电电流（流向电池+负载）   */
   SL_Register_Discharg_Current             = 0x0102,  /* 放电电流（流向负载）   */
   SL_Register_Solar_Open_Circuit_Voltage   = 0x0103,  /* 太阳能开路电压 */
   SL_Register_HighSideMos_Temperature      = 0x0104,  /* 高端mos的温度 */
   SL_Register_DischargMos_State            = 0x0105,  /* 放电mos的状态 */
   SL_Register_MPPT_Mode                    = 0x0106,  /* 工作模式 */
}SL_Mppt_MsgRegister;

/* 注册状态 */
typedef enum
{
   UNREGISTER = 0,          /* 未注册 */
   REGISTER_FAIL = 1,       /* 注册失败 */
   REGISTER_SUCCESS = 2,    /* 注册成功 */
}SL_REGISTERSTATUS;

/* 接入节点类型 */
typedef enum
{
   POWERBOX = 1,            /* 电源箱子 */
   MICROMETEOROLOGY = 2,    /* 微气象 */
}SL_ACCESSNODETYPE;

/* 通信方式 */
typedef enum
{
    RS485 = 1,
    RJ45 = 2,
    Lora = 3,
}SL_COMMUNICATIONMETHODS;

/* 放电mos管状态 */
typedef enum
{
    close = 0,
    open = 1,
}SL_DischargMos_State;

/* mppt工作模式 */
typedef enum
{
    NoWork          = 0,    /* 没有工作 */
    TRICKLE         = 1,    /* 涓流模式 */
    CONSTANTCURRENT = 2,    /* 恒流模式 */
    CONSTANTVOLTAGE = 3,    /* 恒压模式 */
    FLOAT           = 4,    /* 浮充模式 */
    NoBattery       = 5,    /* 没有电池 */
}SL_MPPT_MODE;

#define chang_8_to_16(L,H)  (L | (H<<8))

/* 指定对齐方式为1字节 */
#pragma pack(push,1)
/* 读时接收到的帧格式（汇聚网关->接入节点） */
typedef struct _SL_Mppt_Rorecv_pack{
    uint8_t start_Flag[2];                  /* 起始标志  */
    uint8_t address[7];                     /* 地址 */
    uint8_t function_Code;                  /* 功能码 */
    uint8_t read_Register_Start_Address_H;  /* 读取寄存器起始地址高8位 */
    uint8_t read_Register_Start_Address_L;  /* 读取寄存器起始地址低八位 */
    uint8_t read_Register_Number_H;         /* 读取寄存器个数高八位 */
    uint8_t read_Register_Number_L;         /* 读取寄存器个数低八位 */
    uint8_t check_Bit_H;                    /* 校验位高八位 */
    uint8_t check_Bit_L;                    /* 校验位低八位 */
    uint8_t end_Flag;                       /* 结束标志 */
}SL_Mppt_Rorecv_pack;
#define SL_MPPT_RORECV_PACK_SIZE        (sizeof(SL_Mppt_Rorecv_pack))

/* 写时接收到的帧格式（汇聚网关->接入节点） */
typedef struct _SL_Mppt_Worecv_pack{
    uint8_t start_Flag[2];                  /* 起始标志  */
    uint8_t address[7];                     /* 地址 */
    uint8_t function_Code;                  /* 功能码 */
    uint8_t write_Register_Start_Address_H; /* 写寄存器起始地址高8位  */
    uint8_t write_Register_Start_Address_L; /* 写寄存器起始地址低八位  */
    uint8_t write_Register_Number_H;        /* 写寄存器个数高八位  */
    uint8_t write_Register_Number_L;        /* 写寄存器个数低八位  */
    uint8_t *content;                       /* 写入的内容 */
    uint8_t check_Bit_H;                    /* 校验位高八位 */
    uint8_t check_Bit_L;                    /* 校验位低八位 */
    uint8_t end_Flag;                       /* 结束标志 */
}SL_Mppt_Worecv_pack;
#define SL_MPPT_WORECV_PACK_SIZE        (sizeof(SL_Mppt_Worecv_pack))

/* 扫描广播帧F1（汇聚网关->接入节点） */
typedef struct _SL_Mppt_ScanBroadcast_pack{
    uint8_t start_Flag[2];                  /* 起始标志  */
    uint8_t address[7];                     /* 地址 */
    uint8_t function_Code;                  /* 功能码 */
    uint8_t check_Bit_H;                    /* 校验位高八位 */
    uint8_t check_Bit_L;                    /* 校验位低八位 */
    uint8_t end_Flag;                       /* 结束标志 */
}SL_Mppt_Scan_Broadcast_pack;
#define SL_MPPT_SCAN_BROADCAST_PACK_SIZE    (sizeof(SL_Mppt_Scan_Broadcast_pack))

/* 注册请求帧F2（接入节点->汇聚网关） */
typedef struct _SL_Mppt_RegistrationRequest_pack{
    uint8_t start_Flag[2];              /* 起始标志  */
    uint8_t address[7];                 /* 地址 */
    uint8_t function_Code;              /* 功能码 */
    uint8_t register_Length_H;          /* 寄存器长度高八位 */
    uint8_t register_Length_L;          /* 寄存器长度低八位 */
    uint8_t registration_Status_H;      /* 注册状态高八位  */
    uint8_t registration_Status_L;      /* 注册状态低八位 */
    uint8_t access_Node_ID[7];          /* 接入节点ID */
    uint8_t access_Node_Type_H;         /* 接入节点类型高八位 */
    uint8_t access_Node_Type_L;         /* 接入节点类型低八位 */
    uint8_t check_Bit_H;                /* 校验位高八位 */
    uint8_t check_Bit_L;                /* 校验位低八位 */
    uint8_t end_Flag;                   /* 结束标志 */
}SL_Mppt_RegistrationRequest_pack;
#define SL_MPPT_REGISTRATIONREQUEST_PACK_SIZE    (sizeof(SL_Mppt_RegistrationRequest_pack))

/* 注册回复帧F3（汇聚网关->接入节点） */
typedef struct _SL_Mppt_RegistrationReply_pack{
    uint8_t start_Flag[2];              /* 起始标志  */
    uint8_t address[7];                 /* 地址 */
    uint8_t function_Code;              /* 功能码 */
    uint8_t register_Length_H;          /* 寄存器长度高八位 */
    uint8_t register_Length_L;          /* 寄存器长度低八位 */
    uint8_t registration_Status_H;      /* 注册状态高八位  */
    uint8_t registration_Status_L;      /* 注册状态低八位 */
    uint8_t check_Bit_H;                /* 校验位高八位 */
    uint8_t check_Bit_L;                /* 校验位低八位 */
    uint8_t end_Flag;                   /* 结束标志 */
}SL_Mppt_RegistrationReply_pack;
#define SL_MPPT_REGISTRATIONREPLY_PACK_SIZE (sizeof(SL_Mppt_RegistrationReply_pack))

/* 接收其他帧格式（汇聚网关->接入节点） */
typedef struct _SL_Mppt_ROther_pack{
    uint8_t start_Flag[2];                  /* 起始标志  */
    uint8_t address[7];                     /* 地址 */
    uint8_t function_Code;                  /* 功能码 */
    uint8_t check_Bit_H;                    /* 校验位高八位 */
    uint8_t check_Bit_L;                    /* 校验位低八位 */
    uint8_t end_Flag;                       /* 结束标志 */
}SL_Mppt_ROther_pack;
#define SL_MPPT_ROTHER_PACK_SIZE (sizeof(SL_Mppt_ROther_pack))

/* 发送其他帧格式（接入节点->汇聚网关） */
typedef struct _SL_Mppt_SOther_pack{
    uint8_t start_Flag[2];                  /* 起始标志  */
    uint8_t address[7];                     /* 地址 */
    uint8_t function_Code;                  /* 功能码 */
    uint8_t state;                          /* 准备状态，01H准备完毕 */
    uint8_t check_Bit_H;                    /* 校验位高八位 */
    uint8_t check_Bit_L;                    /* 校验位低八位 */
    uint8_t end_Flag;                       /* 结束标志 */
}SL_Mppt_SOther_pack;
#define SL_MPPT_SOTHER_PACK_SIZE (sizeof(SL_Mppt_SOther_pack))


/*  */
#define RECV_LENGTH 20
typedef struct _SL_Mppt_Recv_pack{
    uint8_t  start_Flag[2];                 /* 起始标志  */
    uint8_t  address[7];                    /* 地址 */
    uint8_t  function_Code;                 /* 功能码 */
    uint8_t  recv_Data[RECV_LENGTH];        /* 其他部分 */
}SL_Mppt_Recv_pack;

/* 功能码处理函数 */
typedef void (*MsgProcFunc)(device_handle device, void*, uint32_t MsgLen);
typedef struct _SL_FunctionMsgProcTable{
    u_int32_t    msgId;
    MsgProcFunc  pMsgProc;
}SL_FuncionMsgProcTable;

/* 寄存器处理表 */
typedef uint16_t (*RegProcFunc)(void*);
typedef struct _SL_RegProcTable{
    uint32_t     regId;
    RegProcFunc  pRegProc;
}SL_RegProcTable;


/* 默认参数 */
typedef struct _default_Value{
    uint8_t start_Flag[2];                  /* 起始标志  */
    uint8_t address[7];                     /* 地址 */
    uint16_t access_Node_Type;              /* 接入节点类型   */
    uint16_t communication_Methods;         /* 通信方式 */
    uint8_t end_Flag;                       /* 结束标志 */
}default_Value;

extern default_Value defaultValue;

typedef struct _SL_Mppt_para{
  uint16_t Registration_Status;         /* 注册状态  */
  uint8_t  address[7];                  /* 地址  */
  uint16_t Access_Node_Type;            /* 接入节点类型  */
  uint16_t Communication_Methods;       /* 通信方式  */
  float_t Battery_Voltage;              /* 电池电压  */
  float_t Charg_Current;                /* 充电电流（流向电池+负载）   */
  float_t Discharg_Current;             /* 放电电流（流向负载）   */
  float_t Solar_Open_Circuit_Voltage;   /* 太阳能开路电压  */
  float_t HighSideMos_Temperature;      /* 高端mos的温度 */
  uint16_t DischargMos_State;           /* 放电mos的状态 */
  uint16_t MPPT_Mode;  /* 工作模式 */
}SL_Mppt_para;
extern SL_Mppt_para g_Mppt_Para;

/* 恢复默认的对齐设置 */
#pragma pack(pop)

void read_and_process_uart_data(device_handle device);
uint16_t CheckFunc(uint8_t *arr_buff, uint8_t len);
int randomDelay();
uint8_t Check_485_bus_busy(device_handle device);



#endif /* APP_INC_SL_PROTOCOL_H_ */
