/*
 * 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"


/* 功能码 */
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_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_Battery_temperature          = 0x0101,  /* 电池温度   */
   SL_Register_Remaining_Battery_Bower      = 0x0102,  /* 电池剩余电量   */
   SL_Register_Solar_Open_Circuit_Voltage1  = 0x0103,  /* 太阳能开路电压1 */
   SL_Register_Solar_Open_Circuit_Voltage2  = 0x0104,  /* 太阳能开路电压2 */
}SL_Mppt_MsgRegister;

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

#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))

/*  */
#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;

/* 恢复默认的对齐设置 */
#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_ */
