#ifndef _BLV_BUS_DEV_PB20FUN_H_
#define _BLV_BUS_DEV_PB20FUN_H_

#include "stdint.h"
#include "BLV_485_Protocol.h"
#include "BLV_All_Dev_Init.h"

/*配置接口命令宏定义开始*/
#define PB20_OWN_LS_STATE_OPEN             0x01       //自带灯带开
#define PB20_OWN_LS_STATE_CLOSE            0x02       //自带灯带关
#define PB20_Device_CHECK_OPEN             0x03       //PB设备巡检开
#define PB20_Device_CHECK_CLOSE            0x04       //PB设备巡检关

#define PB20_OWN_LS_Ctrl_UpperLimit        0x05       //向上调光至上限
#define PB20_OWN_LS_Ctrl_LowerLimit        0x06       //向下调光至下限
#define PB20_OWN_LS_Cycle_Stop             0x08       //停止调光

#define PB20_OWN_LS_DimTime_Set            0x09       //渐变时间设置
#define PB20_Global_Light_Set              0x0A       //全局亮度
#define PB20_GlobalLight_UpperLimit        0x0B       //全局可调上限
#define PB20_GlobalLight_LowerLimit        0x0C       //全局可调下限

#define PB20_OWN_LS_SWITCH_Ctrl            0x11       //只控制开关状态
#define PB20_OWN_LS_LIGHT_Ctrl             0x12       //只控制亮度 

#define PB20_OWN_LS_Dim_Up                 0x1C       //向上调光 - 百分比控制
#define PB20_OWN_LS_Dim_Down               0x1D       //向下调光 - 百分比控制

#define PB20_OWN_LS_Dim_Up_Limit           0x1A       //唯有亮的灯 向上调光 至上限  -  百分比控制
#define PB20_OWN_LS_Dim_Down_Limit         0x1B       //唯有亮的灯 向下调光 至下限  -  百分比控制

#define PB20_OWN_LS_Cycle_Dim_Up           0x1E       //向上循环
#define PB20_OWN_LS_Cycle_Dim_Down         0x1F       //向下循环

#define PB20_OWN_LS_Cycle_Dim_Up_Limit     0x20       //唯有亮的灯 向上循环 至上限
#define PB20_OWN_LS_Cycle_Dim_Down_Limit   0x21       //唯有亮的灯 向下循环 至下限


/*配置接口命令宏定义结束*/

/*PB20串口协议命令宏定义开始*/
#define PB20_CMD_INQUIRE              0x20       //状态轮询命令
#define PB20_CMD_OLS_LCTRL            0x21       //PB20自带灯带亮度控制
#define PB20_CMD_OLS_ONOFF            0x22       //PB20自带灯带开关控制
#define PB20_CMD_OLS_CCTRL            0x23       //PB20自带灯带循环控制
#define PB20_CMD_GL_CTRL              0x28       //PB20全局参数设置

#define PB20_CMD_LD_LCTRL             0x35       //PB20-LD亮度控制
#define PB20_CMD_LD_CCTRL             0x36       //PB20-LD循环控制

#define PB20_CMD_LS_LLCTRL            0x40       //PB20-LS亮度组控
#define PB20_CMD_LS_AGCTRL            0x41       //PB20-LS渐变组控
#define PB20_CMD_LS_LSCTRL            0x42       //PB20-LS开关状态组控
#define PB20_CMD_LS_SCTRL             0x44       //PB20-LS开关控制
#define PB20_CMD_LS_LCTRL             0x45       //PB20-LS亮度控制
#define PB20_CMD_LS_CCTRL             0x46       //PB20-LS循环控制
#define PB20_CMD_LS_RELCTRL           0x47       //PB20-LS相对调节组控
#define PB20_CMD_LS_INRELCTRL         0x48       //PB20-LS相对调节单回路

#define PB20_CMD_RELAY_ADDRCTRL       0x50       //PB20-Relay地址段控制
#define PB20_CMD_RELAY_CTRL           0x52       //PB20-Relay控制
#define PB20_CMD_Relpy_OK             0x00
#define PB20_CMD_Relpy_Busy           0x01
/*PB20串口协议命令宏定义结束*/


/*设备属性相关宏定义开始*/
#define PB20_RETAYTIME_MAX            0x02       //协议重发次数
#define PB20_OWN_LS_BUFF_SIZE		  0x04       //回路限制
#define PB20_RETRY_TIME               0x01       //PB20下发重发次数
#define DEV_CHECK_OPEN                0x01       //巡检开
#define DEV_CHECK_CLOSE               0x02       //巡检关
/*设备属性相关宏定义结束*/

#define PB20_STRIPLIST_MAX                 16
#define PB20_LEDLIST_MAX                   16
#define PB20_RELAY_MAX                     16

typedef struct
{
	uint8_t DevType;          //巡检设备类型
	uint8_t DevAddr;          //巡检设备485地址
	uint16_t DevLoop;         //巡检设备回路
	uint16_t LP_Limit;        //巡检设备功率下限
	uint16_t UP_Limit;        //巡检设备功率上限

}__attribute__ ((__packed__))DEVCHECKMAP;

/*巡检状态机*/
typedef enum
{
	CLOSEALL = 0,       //全关
	FIRSTINQUIRE,       //查询功率
	OPENONE,            //开一个回路
	SECONDINQUIRE,      //查询功率
	CHECKONE,           //检查一个回路
	CHECKEND,           //结束巡检
}CHECK_STATE;



#define CheckMapDevNumMax ((SRAM_CheckMap_List_End_Addr - SRAM_CheckMap_List_Start_Addr)/(sizeof(DEVCHECKMAP)))   //巡检表设备数量


typedef struct
{
	uint8_t Type;
	uint8_t Addr;
	uint8_t Port;
}__attribute__ ((__packed__))SUBDEVICE;

typedef struct
{
	BLV_COMM_RECORD_G comm_record;				    	//通讯记录    37
	uint8_t DevSendCnt:4;     					    	//设备发送计数   计数达到重发次数都没有回复，判为离线  占4位
	uint8_t DevOffline:2;       			        	//设备离线标志 1，设备离线   0，设备在线             占2位
	uint8_t DevOfflineLast:2;                       	//设备离线标志 1，设备离线   0，设备在线         占2位
	uint8_t DevSendSN;                              	//设备发送SN号  39
	
	uint8_t Global_Light;                           	//全局亮度      
	uint8_t GLight_UpperLimit;                      	//全局可调上限
	uint8_t GLight_LowerLimit;                  		//全局可调下限
	uint8_t GLight_Flag;                  				//全局设置标记  43
	
	/*Own LS*/
	uint16_t LoopValidNum;                          	//有效回路      44
	uint8_t CtrlMode[PB20_OWN_LS_BUFF_SIZE];        	//当前控制模式
	uint8_t CtrlMode_Last[PB20_OWN_LS_BUFF_SIZE];   	//上次控制模式
	uint8_t LightBuf[PB20_OWN_LS_BUFF_SIZE]; 			//当前回路亮度值	  
	uint8_t LightBuf_Last[PB20_OWN_LS_BUFF_SIZE];   	//上次回路亮度值   60    
    uint8_t ReportLight[PB20_OWN_LS_BUFF_SIZE];         //上报服务器亮度值
    
	uint8_t Own_Ls_Light_Flag;       					//亮度控制标记
	uint8_t Own_Ls_OnOff_Flag;                          //开关状态标记
	uint8_t Own_Ls_Cycle_Flag;      					//循环控制标记
	uint8_t Own_Ls_Cycle_Time[PB20_OWN_LS_BUFF_SIZE];   //循环调光渐变时间
	uint8_t Own_Ls_DimTime;      						//亮度控制渐变时间  68
	/*Own LS*/
	
	uint8_t Check_Flag;            					    //巡检标记
	uint8_t Check_DevType;         						//巡检设备类型
	uint8_t Check_Loop;            						//巡检设备回路
	uint8_t Check_State;           						//巡检状态机
	uint8_t Close_State;                                //巡检结束全关状态   73
//	uint8_t Check_DevNum;          //
	
    uint8_t soft_version;                               //软件版本
    
    uint16_t PS_vol;                                    //灯带当前电压
	uint16_t Bus_Vol;              						//Bus当前电压
	uint16_t Bus_Vol_Last;         						//Bus上次电压       80
	
	uint16_t Bus_Ele;              						//Bus当前电流
	uint16_t Bus_Ele_Last;         						//Bus上次电流
	
	uint32_t  Bus_Power;           						//Bus当前功率
	uint32_t  Bus_Power_Last;      						//Bus上次功率
	
	uint32_t  Wait_Tick;           						//等待时间戳        96
	uint32_t  PB_Idle_Tick;								//PB总线空闲时间戳
	
	#if RS485_PB20_LD_Flag
	SUBDEVICE LED_List[PB20_LEDLIST_MAX];         		//LED设备地址链表    57
	uint8_t LEDDevNum;             						//挂载的LED数量
	
	uint32_t LED_Send_L_Flag;      						//挂载LED地址:0~31数据发送标记
	uint32_t LED_Send_H_Flag;      						//挂载LED地址:32~63数据发送标记
	#endif
	
	
	#if RS485_PB20_LS_Flag                              //124
	SUBDEVICE Strip_List[PB20_STRIPLIST_MAX];       	//LS设备地址链表     
	uint8_t StripDevNum;           						//挂载的LS数量
	 
	uint32_t Strip_A00_07_LLCtrl;                       //LS地址0~7回路亮度控制标记
	uint32_t Strip_A08_15_LLCtrl;                       //LS地址8~15回路亮度控制标记
	uint8_t  Strip_LLCtrl_Flag[PB20_STRIPLIST_MAX];     //LS地址0~15亮度控制标记                   
	uint8_t  Strip_LL_CtrlLoopNum;                      //LS亮度回路控制数量
	uint32_t Strip_A00_07_LLCtrl_Send;                  //LS地址0~7回路亮度控制标记          2024-11-12    按回路控制时已发送的控制标记
	uint32_t Strip_A08_15_LLCtrl_Send;                  //LS地址8~15回路亮度控制标记         2024-11-12    按回路控制时已发送的控制标记
	uint8_t  Strip_LL_CtrlLoopNum_Send;                 //LS亮度回路控制数量(已发送)         2024-11-12
	
	uint32_t Strip_A00_07_LSCtrl;                       //LS地址0~7回路开关状态控制标记
	uint32_t Strip_A08_15_LSCtrl;                       //LS地址8~15回路开关状态控制标记
	uint8_t  Strip_LSCtrl_Flag[PB20_STRIPLIST_MAX];     //LS地址0~15开关状态控制标记
	uint8_t  Strip_LS_CtrlLoopNum;                      //LS开关状态回路控制数量
	uint32_t Strip_A00_07_LSCtrl_Send;                  //LS地址0~7回路开关状态控制标记      2024-11-12
	uint32_t Strip_A08_15_LSCtrl_Send;                  //LS地址8~15回路开关状态控制标记     2024-11-12
	uint8_t  Strip_LS_CtrlLoopNum_Send;                 //LS开关状态回路控制数量             2024-11-12
	
	uint32_t Strip_A00_07_AGCtrl;                       //LS地址0~7回路自动渐变控制标记
	uint32_t Strip_A08_15_AGCtrl;                       //LS地址8~15回路自动渐变控制标记
	uint8_t  Strip_AGCtrl_Flag[PB20_STRIPLIST_MAX];     //LS地址0~15自动渐变控制标记
	uint8_t  Strip_AG_CtrlLoopNum;                      //LS渐变回路控制数量
	
    uint8_t  Strip_AG_Flag;                             //LS相对调节标志位，0x01,相对调节，0x00,组控调节
    
	#endif
	
	
	#if RS485_PB20_Relay_Flag                           //74
	SUBDEVICE Relay_List[PB20_RELAY_MAX];       		//挂载继电器链表      
	uint8_t RelayDevNum;           						//挂载的Relay数量
	
	uint32_t Relay_A00_07_LoopCtrl;                     //继电器地址0~7控制标记
	uint32_t Relay_A08_15_LoopCtrl;                     //继电器地址8~15控制标记
	uint8_t  Relay_LoopCtrl_Flag[PB20_RELAY_MAX];       //继电器地址0~15控制标记
	uint8_t  Relay_CtrlLoopNum;                         //继电器状态回路控制数量
	uint32_t Relay_A00_07_LoopCtrl_Send;                //继电器地址0~7控制标记      2024-11-12
	uint32_t Relay_A08_15_LoopCtrl_Send;                //继电器地址8~15控制标记     2024-11-12
	uint8_t  Relay_CtrlLoopNum_Send;                    //继电器状态回路控制数量     2024-11-12
	
	#endif
	
	uint8_t PB20_Process_State;                         //PB20总线处理状态
	
}__attribute__ ((__packed__))RS485_PB20_INFO;







void BLV_RS485_PB20_Data_Init(uint16_t DataLen, uint8_t *Data);
void BLV_RS485_PB20_For_Logic_Init(LOGICFILE_DEVICE_INFO *dev_info,uint8_t *data,uint16_t data_len);

void BLV_PB20_Group_Control_State(uint32_t CfgDevAddIn, uint16_t DevInputAddr,uint32_t devaddr, uint32_t CtrlFlag, uint8_t CtrlNum,uint16_t *start);

void Dev_Check_Map_Add(uint8_t *DevBuf);

uint8_t Get_BLV_PB20_COMM_Version(uint32_t devaddr);        //2024-05-22
uint16_t Get_BLV_PB20_PS_Voltage(uint32_t devaddr);         //2024-05-22
uint16_t Get_BLV_PB20_BUS_Voltage(uint32_t devaddr);        //2024-05-22
uint16_t Get_BLV_PB20_BUS_Current(uint32_t devaddr);        //2024-05-22

#endif

