#ifndef __SL_PROTOCOL_H_
#define __SL_PROTOCOL_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_Output_Voltage               = 0x0100,  /* 输出电压   */
   SL_Register_Battery_Voltage              = 0x0101,  /* 电池电压   */
   SL_Register_Charg_Current                = 0x0102,  /* 充电电流（流向电池+负载）   */
   SL_Register_Discharg_Current             = 0x0103,  /* 放电电流（流向负载）   */
   SL_Register_Solar_Open_Circuit_Voltage   = 0x0104,  /* 太阳能开路电压 */
   SL_Register_HighSideMos_Temperature      = 0x0105,  /* 高端mos的温度 */
   SL_Register_DischargMos_State            = 0x0106,  /* 放电mos的状态 */
   SL_Register_MPPT_Mode                    = 0x0107,  /* 工作模式 */
}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 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)

#endif /* __SL_PROTOCOL_H_ */
