#ifndef _BLV_DEV_ACTION_H_
#define _BLV_DEV_ACTION_H_


#include "stdint.h"
#include "BLV_485_Protocol.h"
#include "BLV_Dev_Option.h"			//工程文件

#if LOGIC_FILE_EN	
#define SRAM_DevAction_List_Size			0x000400	//每个设备动作节点存储空间大小  - 当前设备动作节点
#else
#define SRAM_DevAction_List_Size			0x000200	//每个设备动作节点存储空间大小  - 当前设备动作节点
#endif
/*时间条件宏定义开始*/
#define ALLDAY           3        //全天
#define DAY              1        //白天
#define NIGHT            2        //晚上
/*时间条件宏定义结束*/

/*执行条件宏定义开始*/
#define ELE_UNRELATED    1   		 //与卡无关
#define ELE_ENABLE  	   2   		 //取电有效
#define ELE_DISABLE      3   		 //取电无效
/*执行条件宏定义结束*/

#define CtrlValid            0x01    //控制有效
#define CtrlInvalid          0x00    //控制无效

#define DEV_STATE_OPEN     0x01      //设备状态为开
#define DEV_STATE_CLOSE    0x02      //设备状态为关

#define DEV_CTRLWAY_INVALID      0x00   //控制方式无效
#define DEV_CTRLWAY_OPEN         0x01      //控制方式为开
#define DEV_CTRLWAY_CLOSE        0x02      //控制方式为关
#define DEV_CTRLWAY_RELATESCENE  0x03      //控制方式为对应场景开
#define DEV_CTRLWAY_STOP         0x06      //控制方式为停

#define CFG_Dev_CtrlWay_Is_Open  							0x01   //配置设备执行方式为开
#define CFG_Dev_CtrlWay_Is_Close 							0x02   //配置设备执行方式为关
#define CFG_Dev_CtrlWay_Is_TOGGLE                 0x04   //配置设备执行方式为取反

#define CFG_Dev_CtrlWay_Is_Dim_CycleUp            0x07   //向上循环
#define CFG_Dev_CtrlWay_Is_Dim_CycleDown          0x08   //向下循环
#define CFG_Dev_CtrlWay_Is_Dim_Stop               0x09   //调光停止
#define CFG_Dev_CtrlWay_Is_Dim_Up                 0x0A   //向上调光
#define CFG_Dev_CtrlWay_Is_Dim_Down               0x0B   //向下调光
#define CFG_Dev_CtrlWay_Is_Dim_Open               0x0C   //点按至记忆的亮度
#define CFG_Dev_CtrlWay_Is_Dim_Close              0x0D   //点按到关闭
#define CFG_Dev_CtrlWay_Is_RelateBlink            0x0E   //配置设备执行方式为对应闪烁  弱电输出专属，干节点或者485
#define CFG_Dev_CtrlWay_Is_Dim_Up_Step_Cycle      0x0F   //向上点按循环调光

#define CFG_Dev_CtrlWay_Is_OnlySwitch             0x11      //只开关控制
#define CFG_Dev_CtrlWay_Is_OnlyBright             0x12      //只调亮度

#define CFG_Dev_CtrlWay_Is_Dim_Up_Limit                 0x1A   //唯有亮的灯 向上调光 至上限
#define CFG_Dev_CtrlWay_Is_Dim_Down_Limit               0x1B   //唯有亮的灯 向下调光 至下限
#define CFG_Dev_CtrlWay_Is_Dim_Up_Step_Cycle_Limit 0x1F        //唯有亮的灯 向上点按循环调光

#define CFG_Dev_CtrlWay_Is_PWM_Set_Time                0x20   //PWM调光渐变时间
#define CFG_Dev_CtrlWay_Is_A9LD_Set_Time               0x21   //A9LD调光渐变时间
#define CFG_Dev_CtrlWay_Is_A8PB_Set_Time               0x22   //A8PB调光渐变时间
#define CFG_Dev_CtrlWay_Is_C12_Set_Time                0x23   //C12调光渐变时间
#define CFG_Dev_CtrlWay_Is_RGB_Set_Time                0x24   //RGB调光渐变时间

#define DEV_Dimming_Time	0x0F		//调光时间

#define LEDLIGHTMAXLIMIT    100   //最高亮度限制
#define LEDLIGHTMINLIMIT    15    //最低亮度限制   


#define SCENE_MODE_CTRL    0x01        //场景控制模式
#define LIGHT_MODE_CTRL    0x02        //灯光控制模式

#define NOR_MODE_CTRL    0x01      //普通模式控制
#define SLEEP_MODE_CTRL  0x02      //睡眠模式控制

#define LIGHT_SCENE_ONE    0x01        //场景不可关闭，执行相应动作
#define LIGHT_SCENE_TWO    0x02        //场景可关闭，执行相应动作

#define LIGHT_SCENE_SLEEP      			0x04        //睡眠模式 ，全部关才算开，有一个开就算关。
#define LIGHT_SCENE_MAINSWITCH    		0x05        //总开关，有一个开，指示灯就开。所有灯关，指示灯才关
#define LIGHT_SCENE_HELPSLEEP 			0x06        //助眠模式 ，全部关才算开，有一个开就算关。
#define LIGHT_SCENE_MULTI      			0x0B        //多联开关
#define LIGHT_SCENE_Rotary     			0x0C        //旋钮场景
#define LIGHT_SCENE_SLEEP_UNRELATED		0x0E		//与睡眠无关的场景，不会触发起夜功能

#define NightModeStart   0x01   //进入起夜模式
#define NightModeOpen    0x02   //打开夜灯
#define NightModeClose   0x00   //关闭夜灯

#if LOGIC_FILE_EN	
#define SRAM_DevAction_List_Start_Addr		0x400000	//设备动作链表起始地址       包含        一共960K
#define SRAM_DevAction_List_End_Addr		0x4F0000	  //设备动作链表结束地址     不包含

#define SRAM_CheckMap_List_Start_Addr       0x03A800    //巡检表开始地址           包含        一共10K
#define SRAM_CheckMap_List_End_Addr         0x03D000    //巡检表结束地址           不包含

#define SRAM_VCard_PortInf_Start_Addr       0x03D000    //无卡取电 映射端口信息  起始地址   包含      一共2K
#define SRAM_VCard_PortInf_End_Addr         0x03D7FF    //无卡取电 映射端口信息  结束地址   包含

#define SRAM_VCard_ConNToS_Start_Addr       0x03D800    //无卡取电 无人至有人条件信息  起始地址  包含   一共1K
#define SRAM_VCard_ConNToS_End_Addr         0x03DBFF    //无卡取电 无人至有人条件信息  结束地址  包含

#define SRAM_VCard_ConSToN_Start_Addr       0x03DC00    //无卡取电 有人至无人条件信息  起始地址  包含   一共1K
#define SRAM_VCard_Con_End_Addr             0x03DFFF    //无卡取电 有人至无人条件信息  结束地址  包含 

#define SRAM_VCard_DetectWin_Start_Addr     0x03E000    //无卡取电  检测窗口状态   起始地址  包含   一共60K
#define SRAM_VCard_DetectWin_End_Addr       0x04CFFF    //无卡取电  检测窗口状态   结束地址  包含

/*2025-09-19 修改无卡取电逻辑后，该区域不需要在使用了*/
#define SRAM_VCard_Property_Start_Addr      0x04D000    //无卡取电  公共属性   起始地址  包含   一共1K
#define SRAM_VCard_Property_End_Addr        0x04D3FF    //无卡取电  公共属性   结束地址  包含


#define SRAM_BlwMap_List_Start_Addr       0x4F0000    //映射表开始地址           包含        一共32K
#define SRAM_BlwMap_List_End_Addr         0x4F8000    //映射表结束地址           不包含 

#define SRAM_DevDly_List_Start_Addr       0x4F8000    //延时设备起始地址                     一共32K
#define SRAM_DevDly_List_End_Addr         0x500000    //延时设备结束地址
#else
#define SRAM_DevAction_List_Start_Addr		0x020000	//设备动作链表起始地址       包含        一共62K
#define SRAM_DevAction_List_End_Addr		  0x02F000	  //设备动作链表结束地址     不包含

#define SRAM_BlwMap_List_Start_Addr       0x02F000    //映射表开始地址           包含        一共2K
#define SRAM_BlwMap_List_End_Addr         0x02F800    //映射表结束地址           不包含 

#define SRAM_DevDly_List_Start_Addr       0x02F800    //延时设备起始地址                     一共2K
#define SRAM_DevDly_List_End_Addr         0x030000    //延时设备结束地址

#define SRAM_VCard_PortInf_Start_Addr       0x03D000    //无卡取电 映射端口信息  起始地址   包含      一共2K
#define SRAM_VCard_PortInf_End_Addr         0x03D7FF    //无卡取电 映射端口信息  结束地址   包含

#define SRAM_VCard_ConNToS_Start_Addr       0x03D800    //无卡取电 无人至有人条件信息  起始地址  包含   一共1K
#define SRAM_VCard_ConNToS_End_Addr         0x03DBFF    //无卡取电 无人至有人条件信息  结束地址  包含

#define SRAM_VCard_ConSToN_Start_Addr       0x03DC00    //无卡取电 有人至无人条件信息  起始地址  包含   一共1K
#define SRAM_VCard_Con_End_Addr             0x03DFFF    //无卡取电 有人至无人条件信息  结束地址  包含 

#define SRAM_VCard_DetectWin_Start_Addr     0x03E000    //无卡取电  检测窗口状态   起始地址  包含   一共30K
#define SRAM_VCard_DetectWin_End_Addr       0x0457FF    //无卡取电  检测窗口状态   结束地址  包含

#endif
/*全局变量存储定义开始*/
//#define SRAM_DevAction_List_Addr			0x020000	//设备动作最后偏移地址 - 4Byte
/*全局变量存储定义结束*/

#define DevActionNameLenMax     0x20      //设备名长度限制

#define DevActionNumMax   ((SRAM_DevAction_List_End_Addr - SRAM_DevAction_List_Start_Addr)/SRAM_DevAction_List_Size)   //设备动作数量上限

#if LOGIC_FILE_EN == 0x01
#define DevCtrlNumMax      50   //扩展设备最多控制数量 - 配置软件动作控制数增加到50
#else 
#define DevCtrlNumMax      28   //扩展设备最多控制数量
#endif

#define DevCtrlLen         0x06  //设备控制长度固定6个字节
#define DevCtrlDlyLen      0x08  //设备控制长度带延时固定8个字节 需要自己查找设备和延时节点
#define DevCtrlDlyLenAddr  0x10  //设备控制长度带设备地址固定16个字节  此项主要用于内部使用

#define BlwMapStructCoreLen   sizeof(Struct_CFG_BLW_Map_Core)
#define BlwMapStructLen sizeof(Struct_CFG_BLW_Map_Add)
#define BlwMapDevNumMax ((SRAM_BlwMap_List_End_Addr - SRAM_BlwMap_List_Start_Addr)/BlwMapStructLen)   //映射表设备数量


#define UINT64DATACONVER(data)   (*(uint64_t *)&data)  //实际u64的值 
#define UINT16DATACONVER(data)   (*(uint16_t *)&data)  //实际u16的值    当一个变量来用 可以用来比较和赋值 注意，按位定义结构体时，至少按照结构体的倍数来对齐
#define UINT16DATAADDR(data)     ((uint16_t *)&data)  //实际u16的地址   
//#define UINT8DATACONVER(data)   (*(uint8_t *)&data)  //实际u8的值    当一个变量来用 可以用来比较和赋值

#define Season_Spring         0x01                  //春季
#define Season_Summer         0x02                  //夏季
#define Season_Winter         0x03                  //冬季
#define Season_Autumn         0x00                  //秋季

typedef struct 
{
	uint32_t  CtrlReadFlag;              //操作标志位
	uint16_t CtrlReadBuf[32];               //控制读取缓存
}__attribute__ ((__packed__))CtrlRead_Data_Struct;    //设备状态 一共68个字节


//typedef struct CFG_Action_Add*  CFG_Action_AddP;  //新增动作指针
typedef struct CFG_Dev_Add* 		CFG_Dev_AddP;     //新增设备指针
/*设备的函数指针定义开始*/
//typedef uint8_t (*Dev_Input_Detect_ptr)(CFG_Dev_AddP CfgDevAddIn, uint16_t DevInputLoop, uint8_t DevInputType);															//设备输入检测函数，传入设备回路地址，返回输入类型
//typedef void (*Dev_Output_Ctrl_ptr)(CFG_Dev_AddP CfgDevAddIn, uint16_t DevInputAddr, CFG_Dev_AddP CfgDevAddOut, uint16_t DevOutputLoop, uint16_t DevOutputType);		  	//设备输出控制函数，传入设备类型，输出回路地址，输出类型，即可控制设备
//typedef void (*Dev_All_Output_Ctrl_ptr)(CFG_Dev_AddP CfgDevAddOut, uint16_t DevOutputType);		  	//设备所有回路控制函数，所有回路为开，或关 或调亮或调暗
//typedef uint16_t (*Dev_Output_Type_CtrlWay_Get_ptr)(uint16_t DevOutputType);	               //设备输出类型执行方式得到。比如控制LED灯第一路 开 50亮度。那么应该返回50
//typedef uint16_t (*Dev_Output_Type_CtrlContect_Get_ptr)(CFG_Dev_AddP CfgDevAdd, uint16_t DevOutputLoop, uint16_t DevOutputType);	            //设备输出类型执行内容得到。比如控制LED灯第一路 开 50亮度。那么应该返回50
//typedef uint16_t (*Dev_Output_Loop_State_Get_ptr)(CFG_Dev_AddP CfgDevAddOut, uint16_t DevOutputLoop);										//设备输出回路状态得到。比如此时LED灯指定回路亮度为50， 那么应该返回50
//typedef uint16_t (*Dev_Output_AllLoop_State_Get_ptr)(CFG_Dev_AddP CfgDevAddOut, uint8_t *p);	                //指定设备节点所有回路状态变化得到
//typedef uint16_t (*Dev_Output_Rs485Loop_State_Get_ptr)(CFG_Dev_AddP CfgDevAddOut, uint8_t *p);	              //指定设备节点所有回路状态变化得到
//typedef uint16_t (*Dev_Output_ExUdpLoop_State_Get_ptr)(CFG_Dev_AddP CfgDevAddOut, uint8_t *p);	              //指定设备节点所有回路状态变化得到

//typedef uint16_t (*Dev_Output_AllLoop_Action_Get_ptr)(CFG_Dev_AddP CfgDevAddOut, uint8_t *p);	                //指定设备节点所有回路动作得到


//typedef uint8_t (*Dev_Off_Line_State_Get_ptr)(CFG_Dev_AddP CfgDevAddOut);										//设备离线状态得到。比如此时LED灯指定回路亮度为50， 那么应该返回50
//typedef uint16_t (*Dev_Output_OtherState_Get_ptr)(CFG_Dev_AddP CfgDevAddOut, uint8_t *p);	   //指定设备节点其他状态变化得到，如在线离线，电量

//typedef void (*Dev_OutCtrlFun_ptr)(CFG_Dev_AddP CfgDevAdd);     //设备输出控制函数，或者输入检测函数
/*网络函数指针申明开始*/
//typedef void (*RCU_Net_Send_Fun_ptr)(CFG_Dev_AddP CfgDevAdd);     	//定义传递参数为设备节点，返回值为uint8_t的函数指针类型，用于RCU网络数据发送函数
/*设备节点所有方法函数结构体*/
//typedef struct 
//{

//	Dev_Input_Detect_ptr Dev_Input_Type_Get;              	 	//设备输入类型得到函数，与设备类型配套使用，由于配置的输入类型比较简单，可以直接使用
//	Dev_Output_Ctrl_ptr Dev_Output_Ctrl;                 		 	//这个设备控制函数可能只是改变控制设备的参数，与设备类型配套使用
//	Dev_All_Output_Ctrl_ptr Dev_All_Output_Ctrl;             	//设备所有输出控制函数
//	Dev_Output_Type_CtrlWay_Get_ptr Dev_Output_Type_CtrlWay_Get;     //设备配置输出类型执行方式得到。由于配置的输出类型比较复杂，需要提炼才行
//	Dev_Output_Type_CtrlContect_Get_ptr Dev_Output_Type_CtrlContect_Get;//设备配置输出类型执行内容得到。由于配置的输出类型比较复杂，需要提炼才行
//	Dev_Output_Loop_State_Get_ptr Dev_Output_Loop_State_Get;         //设备输出状态得到。继电器就返回，开或关。指示灯或者LED灯就返回亮度。
//	Dev_Output_AllLoop_State_Get_ptr Dev_Output_AllLoop_State_Get;   //指定设备节点所有回路状态变化得到，返回将要上报的回路数 至少为1 主要用于宝来威服务器上报
//	Dev_Output_Rs485Loop_State_Get_ptr Dev_Output_Rs485Loop_State_Get;  //指定设备节点所有回路状态变化得到，返回将要上报的回路数
//	Dev_Output_ExUdpLoop_State_Get_ptr Dev_Output_ExUdpLoop_State_Get;  //指定设备节点所有回路状态变化得到，返回将要上报的回路数

//	Dev_Output_AllLoop_Action_Get_ptr Dev_Output_AllLoop_Action_Get;   //指定设备节点所有回路动作变化得到，每个设备的动作 报文长度都不一样 每次只上报一个设备节点的所有动作 主要用于宝来威服务器上报
	
//	Dev_Off_Line_State_Get_ptr Dev_Off_Line_State_Get;               //设备离线状态得到函数
//	Dev_Output_OtherState_Get_ptr Dev_Output_OtherState_Get;         //设备其他状态得到函数   返回上报的状态个数  主要检测RS485设备在线离线是否变化

//	Dev_OutCtrlFun_ptr Dev_OutCtrlFun;      //设备输出控制函数，设备输入检测函数  主要是本地的5个设备 继电器 输入 输出 PWM 网络
	
/*关于网络函数指针定义开始*/	
//	RCU_Net_Send_Fun_ptr RCU_Net_Send_Flag; //设备节点网络发送标志置位函数
/*关于网络函数指针定义结束*/	
	
//}__attribute__ ((__packed__))Struct_Dev_Fun_Info;  					   //设备信息结构体，相同的设备类型拥有相同的函数，只是传的参数不一样



/*设备的函数指针定义结束*/

typedef struct CFG_Dev_Add
{
	Device_Public_Information_G BUS_Public;  //共有属性
	
	void *DevDataStruct;                   //私有参数
	/*普通功能函数开始*/
//	Struct_Dev_Fun_Info DevFunInfo;        //共有函数指针
/*普通功能函数结束*/
}__attribute__ ((__packed__))CFG_Dev_Add;    //配置数据新增设备结构体

#define DEVNAMELENMAX    0x10   //最长16个字节
#define DEVNAMENUMMAX    20     //每类设备最多20个名称 2022-12-29
typedef struct 
{
	char DevName[16];   //
}__attribute__ ((__packed__))Dev_Name_Struct;  //设备名结构体

typedef struct 
{	
	uint16_t ActionNo;    //场景编号  
  char DevActionName[DevActionNameLenMax];     //当前动作名称，长度限制32个字节  如果有多个名称，可以用分隔符
	
}__attribute__ ((__packed__))Dev_Action_Core;    //动作核心信息 一共34个字节

typedef struct 
{
	uint8_t DevType;      //设备类型
	uint8_t DevAddr;      //设备地址
	uint16_t inAddr;         //输入地址
	
	uint16_t inType;          //输入类型 根据设备类型，来识别输入类型
	
}__attribute__ ((__packed__))Dev_Action_Input;    //动作输入与输入类型 一共6个字节



#if LOGIC_FILE_EN
typedef struct
{
	uint64_t DevActionOutFlag:1;  	//动作输出使能 
	uint64_t RoomState:3; 			//房态   0不判断   1出租 2退房 3待租 4空房 
	uint64_t EleCtrlFlag:1; 		//取电服务控制     0不判断  1需要控制取电服务开
	uint64_t EleState:3;         	//取电状态       0不判断  1开  2关
	uint64_t DndState:3;        	//勿扰状态       0不判断  1开  2关
	uint64_t CleanState:3;       	//清理状态       0不判断  1开  2关
	uint64_t CallState:3;       	//呼叫状态       0不判断  1开  2关
	uint64_t WashState:3; 			//洗衣状态         0不判断  1开  2关
	uint64_t CheckOutState:3; 		//退房状态       0不判断  1开  2关
	uint64_t WaitState:3; 			//稍后状态         0不判断  1开  2关
	uint64_t SosState:3; 			//SOS状态            0不判断  1开  2关
	uint64_t RentState:3; 			//预约待租状态      0不判断  1开  2关
	uint64_t LockState:3; 			//开锁状态         0不判断  1开  2关
	uint64_t LuggageState:3; 		//行李状态         0不判断  1开  2关
	uint64_t StrongState:3; 		//保险箱状态       0不判断  1开  2关
	uint64_t DoorState:3; 			//门磁状态         0不判断  1开  2关
	uint64_t WarningState:3; 		//提示音状态       0不判断  1开  2关
	uint64_t BacklightState:3;		//背光状态       0不判断  1开  2关
	uint64_t SeasonState:3; 		//季节        对于配置数据 0不判断  1春 2夏 3秋 4冬  对于全局1春 2夏 3秋 0冬
	uint64_t TimeState:3; 			//时间            1全天 2白天 3黑夜 
	uint64_t NeightFlag:1;  		//与夜灯有关  对于配置数据 为1，起夜有关 为0，起夜无关   对于本地全局条件，为1，起夜功能存在  为0，起夜功能不存在
	uint64_t NeightState:2;  		//起夜状态    对于配置数据 无意义   对于本地全局条件   1进入起夜 2起夜中 0退出起夜
	uint64_t RcuLockState:3; 		//RCU锁定    对于配置数据 0不判断 1锁定 2正常  对于本地全局条件  1锁定  0正常
	uint64_t Reserve1:2; 			//保留2位
	
}__attribute__ ((__packed__))Dev_Action_U64Cond;    //动作的场景执行条件 一共9个字节
#else

typedef struct
{
	/*u64 变量申明开始*/
	uint64_t DevActionOutFlag:1;  //动作输出使能  1锁定 0正常
	uint64_t RoomFlag:1; //房态关联 1关联 0不关联
	uint64_t RoomState:3; //房态 1出租 2退房 3待租 4空房 
	uint64_t LightFlag:1; //调光关闭关联  调光亮度为非0  ，才进行亮度增加
	uint64_t EleCtrlFlag:1; //取电服务控制开标志   为1表示 需要控制开  为0表示不执行
	uint64_t Reserve2:1; //保留1位

	uint64_t EleFlag:1;          //取电关联 1关联 0不关联
	uint64_t EleState:2;         //取电状态 1开 2关
	uint64_t DndFlag:1;          //勿扰关联 1关联 0不关联
	uint64_t DndState:2;        //勿扰状态 1开 2关
	uint64_t CleanFlag:1;       //清理关联 1关联 0不关联
	uint64_t CleanState:2;       //清理状态 1开 2关
	
	uint64_t CallFlag:1;         //呼叫关联 1关联 0不关联
	uint64_t CallState:2;       //呼叫状态 1开 2关
	uint64_t WashFlag:1; //洗衣关联 1关联 0不关联
	uint64_t WashState:2; //洗衣状态 1开 2关
	uint64_t CheckOutFlag:1; //退房关联 1关联 0不关联
	
	uint64_t CheckOutState:2; //退房状态 1开 2关
	uint64_t WaitFlag:1; //稍后关联 1关联 0不关联
	uint64_t WaitState:2; //稍后状态 1开 2关
	uint64_t SosFlag:1; //SOS关联 1关联 0不关联   
	uint64_t SosState:2; //SOS状态 1开 2关
	
	uint64_t RentFlag:1; //预约待租关联 1关联 0不关联  
	uint64_t RentState:2; //预约待租状态 1开 2关
	uint64_t LockFlag:1; //开锁关联 1关联 0不关联
	uint64_t LockState:2; //开锁状态 1开 2关
	uint64_t LuggageFlag:1; //行李关联 1关联 0不关联
	uint64_t LuggageState:2; //行李状态 1开 2关
	
	uint64_t StrongFlag:1; //保险箱关联 1关联 0不关联
	uint64_t StrongState:2; //保险箱状态 1开 2关
	uint64_t DoorFlag:1; //门磁关联 1关联 0不关联
	uint64_t DoorState:2; //门磁状态 1开 2关
	uint64_t WarningFlag:1; //提示音关联 1关联 0不关联
	
	uint64_t WarningState:2; //提示音状态 1开 2关
	uint64_t SeaSonFlag:1;  //季节关联
	uint64_t SeasonState:2; //季节    1春 2夏 3冬 0秋
	uint64_t TimeFlag:1; //时间关联
	uint64_t TimeState:2; //时间 1全天 2白天 3黑夜 
	
	uint64_t NeightFlag:1;  //起夜关联
	uint64_t NeightState:2;  //起夜状态  1进入起夜 2起夜中 0退出起夜
	uint64_t RcuLockFlag:1; //锁定关联
	uint64_t RcuLockState:2; //1锁定  0正常

	uint64_t Reserve3:2; //保留2位
	/*u64 变量申明结束*/	
}__attribute__ ((__packed__))Dev_Action_U64Cond;    //动作的场景执行条件 一共9个字节

#endif

//	uint8_t timeMode;        //时间条件      全天   白天   黑夜
//	uint8_t eleMode;         //执行条件    取电有效   取电无效   取电无关
//	uint8_t Reserve1;        //保留1
//	uint8_t Reserve2;        //保留2
//	uint8_t Reserve3;        //保留3
//	uint8_t Reserve4;        //保留4
//	uint8_t Reserve5;        //保留5
//	uint8_t Reserve6;        //保留6    //复杂的逻辑或者服务，需要定义新的设备去完成
	
typedef struct{

	Dev_Action_U64Cond DevActionU64Cond;   //64位的条件
	uint8_t SceneExcute;     //执行方式        场景不可关闭   场景可关闭   
}__attribute__ ((__packed__))Dev_Action_Cond;    //动作的场景执行条件 一共9个字节

typedef struct 
{
	uint8_t DelayCont;      //延时时间     根据新增的动作，动态添加设备延时执行属性
	uint8_t DelayWeight;    //延时单位
}__attribute__ ((__packed__))Dev_Dly_Value;   //设备延时信息


typedef struct 
{
		/*配置设备输出信息开始*/
	uint8_t DevType;       //设备类型
	uint8_t DevAddr;       //设备地址
	uint16_t DevOutputLoop;  //设备输出地址
	uint16_t DevCtrlState; //设备控制状态	
	Dev_Dly_Value DevDlyValue; //设备延时信息
	/*配置设备输出信息结束*/
}__attribute__ ((__packed__))Dev_Action_OutCfg;    //设备控制  长度8个字节

#define DEVACTIONOUTCFGLEN  sizeof(Dev_Action_OutCfg) //固定8个字节

typedef struct 
{
	Dev_Action_OutCfg DevActionOutCfg;    // 长度8个字节
	uint32_t          DevActionOutAddr;   //每个设备的地址
	uint32_t          DevDlyAddr;         //延时设备的地址
}__attribute__ ((__packed__))Dev_Action_Output;    //设备控制  长度16个字节

typedef struct 
{
	uint8_t  SceneState;              //场景普通状态    目前场景状态就两个，开或者关    可以作为反馈灯的标志   睡眠节点判断依据比较特殊，全关为开，有一个为开就为开
	uint8_t  SceneStateLast ;          //场景普通状态的上一个状态   用于指示灯控制
	uint8_t  SceneReuseFlag ;         //输入节点和输入回路完全一样，而且动作启用，复用标志置一 为1，扫描动作时会先判断条件
//	uint8_t  SceneStateRs485;        //场景485上报   与状态比较，有变化就进行485上报  
//	uint8_t  SceneStateInUdp;        //场景网络对内上报    与状态比较，有变化就上报
//	uint8_t  SceneStateExUdp;        //场景网络对外上报   与状态比较，有变化就进行485上报
	uint8_t  MultiSetFlag;           //场景下标设置标记           2024-05-23
	uint8_t  MultiNumber;            //当前动作所处多联场景下标   2024-05-23
	uint8_t  MultiValidNo;           //有效的多联场景总数         2024-05-23
	uint8_t  SceneTypeFlag;              //场景判断标志 1，需要判断场景状态 0，不用判断场景状态  场景可关闭，睡眠，总开关，助眠，对应场景，就算需要判断   1，表示单控场景    2，表示多控场景  0，表示未定义场景 。场景仅算控制灯光一类，一路灯即是单控，多路灯即是多控。且输入为开关，控制服务信息，空调，窗帘，背景音乐都不计数。
	uint32_t DevAddrIn;              //设备动作 设备地址输入
}__attribute__ ((__packed__))Dev_Action_State;    //设备状态 一共11个字节


typedef struct CFG_Action_Add
{
	Dev_Action_Core DevActionCore;    //设备动作核心信息 一共34个字节
	Dev_Action_Input DevActionInput;  //设备动作的输入  一共6字节
	Dev_Action_Cond DevActionCond;    //设备输入的条件  一共9字节
	
/*  新增动作结构体长度结束 数据拷贝总长49字节    */
	
	
	Dev_Action_State DevActionState;    //场景状态参数    一共11个字节
	uint8_t	 CheckVal;         //当前设备动作校验        1个字节
	uint16_t data_len;         //设备长度                2个字节
	uint8_t DevCtrlNum;       //设备控制数量             1个字节
	Dev_Action_Output  DevActionOutput[DevCtrlNumMax];  //设备输出  长度16N 个数由实际情况决定最多存放28个
	
/*动作节点会用到的变量结束*/	
}__attribute__ ((__packed__))DEV_ACTION_INFO;    //设备动作共用结构体   设备输入  条件  与输出   总长度49+11+4+448 = 512字节



typedef struct{
	uint16_t   DevActionNum;				//设备动作总数                     范围0~(DevActionNumMax-1)
	uint16_t   DevActioni;          //用于遍历所有动作的全局参数  范围0~(DevActionNumMax-1)
	uint16_t   DevDlyNum;        //延时设备总数      
	uint16_t   DevDlyi;          //用于遍历所有的延时设备
	
	uint16_t  BlwMapDevNum;     //宝来威映射表设备总数     2024-08-28  uint8_t 改 uint16_t
	uint8_t   BlwMapDevi;       //用于遍历宝来威映射表设备
	
	uint8_t   DevNum;           //设备总数
	uint8_t   DevBusNum;        //Bus总线设备个数
	uint8_t   DevPollNum;       //轮询总线设备个数
	uint8_t   DevActiveNum;     //主动总线设备个数
	uint8_t   DevNorNum;        //普通设备个数
	
	uint8_t   Devi;             //用于遍历整个设备
	
/*时间变量声明开始*/	
	uint8_t   TimeGetFlag;      //时间获取标志 每次拿到时间，就计数 比如从服务器获取到时间
/*时间变量声明结束*/
	
	Dev_Action_U64Cond DevActionU64Cond;   //64位的条件参考 
	uint16_t SleepActionNo;           //睡眠场景编号 不为0，就算有效
	uint32_t DevLockAddr;        //微信锁的设备地址
	uint8_t  Lock485Addr;        //微信锁485地址
	uint32_t pc_addr;            //调试设备地址
	
	uint16_t CheckMapDevNum;     //2023-11-27   巡检数量
	uint8_t  CheckTypeNum;       //巡检设备类型总数   2024-04-02
	uint8_t  CheckMapList[4];    //巡检设备类型列表   2024-04-02
	
	uint8_t  OffLineDevType;     //离线设备类型        2023-10-08
	uint8_t  OffLineDevAddr;     //离线设备地址        2023-10-08
	uint8_t  InputType;          //输入设备类型        2023-10-08    
	uint8_t  InputAddr;          //输入设备地址        2023-10-08
	uint8_t  InputLoop;          //输入设备回路        2023-10-08
	
	uint8_t  People_Flag;        //有人无人标记       2024-03-01
	uint8_t  ServerCtrl;         //服务器控制
	uint8_t  CardInFlag;         //入住服务时开启标记清睡眠标记   2024-04-29
	
	uint16_t  DimGlobalValue;     //调光全局亮度
	
	uint8_t  TimeSyncFlag;       //时间同步标记
	uint8_t  DayStart;           //白天开始时间
	uint8_t  DayEnd;             //白天结束时间
	
	uint8_t  VC_ConNToSGruop;    //无卡取电无人至有人条件组数
	uint8_t  VC_ConNToSSubset;   //无卡取电无人至有人子条件总数
	
	uint8_t  VC_ConSToNGruop;    //无卡取电有人至无人条件组数
	uint8_t  VC_ConSToNSubset;   //无卡取电有人至无人子条件总数

	uint8_t  VC_PortNum;         //无卡取电端口数
	
	uint16_t CCTValue;           //调光色温值
	
	uint8_t Dim_Lower_limit;     //调光下限
	uint8_t Dim_Upper_limit;     //调光上限
	
	uint8_t Service_16;          //服务16状态
	
	uint8_t sram_save_flag;			//外部SRAM保存标志位
	
	uint8_t Last_EleState;			//上一次取电状态
	uint8_t SleepMode_State;
	uint8_t Last_SleepMode_State;
	uint8_t SleepLight_State;
	uint8_t Last_SleepLight_State;
	uint8_t Person_Detected;			//无人取电中的 有人或无人状态 （插卡取电、按键触发、雷达感应也算）
	uint8_t Last_Person_Detected;
	
	uint16_t Last_DimGlobalValue;		//上次保存的调光值
	uint16_t Last_CCTValue;				//上次保存的调光色温值
	
	uint8_t CardState;			//插卡状态
	uint8_t Last_CardState;
	
	uint8_t Rs485CardType;			//插卡身份（卡类型） 如果没有身份 ->  "有无卡+有无人+卡身份"事件 不能正常更新
	uint8_t Last_Rs485CardType;
	
//	uint8_t NeightState;            //夜灯状态  
	uint8_t Last_NeightState;
//	uint8_t Last_NeightState2;      //上次夜灯状态，不过这个是与Dev_Action_U64Cond中实际夜灯状态比对，而不是和本结构体里的状态比对
	
	
}__attribute__ ((packed)) BLV_DevAction_Manage_G;

typedef struct
{
	uint8_t ServerDevType;         //u8的设备类型，包括本地自带设备和485设备 
	uint8_t ServerDevAddr;         //u8的设备地址，本地自带设备地址默认为0，485设备地址需要填相应设备的实际地址
	
	uint8_t DevType;       //设备类型 
	uint8_t DevAddr;       //设备地址
	uint16_t DevLoopAddr;   //回路地址
}__attribute__ ((__packed__))Struct_CFG_BLW_Map_Core;   //映射表核心信息

//包括下一个节点指针 结构体大小是18个字节
typedef struct CFG_BLW_Map_Add
{
/*配置数据自带参数开始*/

	Struct_CFG_BLW_Map_Core BlwMapCore;     //映射表核心信息
/*配置数据拷贝字节数，目前共6个字节*/	
/*宝来威映射表特有参数开始*/	
	
	uint32_t CfgDevAdd;    //非场景类的设备，会对应一个设备节点  占用4个字节
	uint32_t CfgActionAdd; //场景类型的设备，会对应一个动作节点  占用4个字节
	uint16_t MapAddState;            //映射表当前状态
	uint16_t MapAddStateLast;        //映射表上一个状态
	
/*宝来威映射表特有参数结束，目前共12个字节*/	
}__attribute__ ((__packed__))Struct_CFG_BLW_Map_Add;    //配置数据新增映射表结构体





/*延时设备参数申明开始*/

#define DevDlyStructLen sizeof(Struct_Dev_Dly)

#define DevDlyNumMax   ((SRAM_DevDly_List_End_Addr - SRAM_DevDly_List_Start_Addr)/DevDlyStructLen)   //设备动作数量上限

#define  DELAY_TIME_MS              0x01      //毫秒
#define  DELAY_TIME_S               0x02      //秒
#define  DELAY_TIME_MIN             0x03      //分钟
#define  DELAY_TIME_HOUR            0x04      //小时

/*设备延时执行结构体*/

typedef struct                       
{
	uint8_t DevType;       //设备类型  0为动作
	uint32_t DevDlyAddr;                        //设备延时节点           节点可能处于设备范围，或者动作范围
	uint16_t DevOutputLoop;                     //设备输出回路  为动作节点时，此变量没用
}__attribute__ ((__packed__))Struct_Dev_Dly_Core; //延时设备关键信息   7个字节

typedef struct                       
{

  Struct_Dev_Dly_Core  DevDlyCore;        //     
	
	uint8_t  DlyBlinkFlag;                      //延时闪烁标志，当延时闪烁标志被置一时，延时执行标志常置一 也是动作挂起标志 0为正常 1为挂起 挂起时，可以无视条件 直接执行设备输出
	Dev_Dly_Value  DlyBlinkTime;                      //闪烁频率 0201  为1S切换  0202 为2S切换 若为动作 为当前需要执行的扩展设备下标
	uint16_t DevOutputType;                     //设备输出类型，包括设备执行方式和执行内容
	uint8_t  DlyExcuteFlag;                     //延时执行标志，当动作触发时，标志置一
	uint32_t DlyExcuteTime;      								//延时执行时间，当动作触发时，时间被赋值
	
	
//	CFG_Dev_DlyP NextNode;    							  //指向下一个节点
}__attribute__ ((__packed__))Struct_Dev_Dly;	//设备延时结构体，针对所有带延时的扩展属性设备  固定16个字节
/*延时设备参数申明结束*/


typedef enum
{
	LOOPCH01,    							//0
	LOOPCH02,              //1
	LOOPCH03,            //2
	LOOPCH04,             //3
	LOOPCH05,             //4
	LOOPCH06,         //5
	LOOPCH07,             //6
	LOOPCH08,              //7
	LOOPCH09,            //8
	LOOPCH10,       //9        //收拾餐盘
	LOOPCH11,          //10
	LOOPCH12,           //11
	LOOPCH13,             //12      //门磁  1打开（闭合）     2关闭（门打开）
	LOOPCH14,               //13      //回路14
	LOOPCH15,               //14      //回路15
	LOOPCH16,               //14      //回路15
	LOOPCH17,               //14      //回路15
	LOOPCH18,               //14      //回路15
	LOOPCH19,               //14      //回路15
	LOOPCH20,               //14      //回路15
	LOOPCH21,               //14      //回路15
	LOOPCH22,               //14      //回路15
	LOOPCH23,               //14      //回路15
	LOOPCH24,               //14      //回路15
	LOOPCH25,               //14      //回路15
	LOOPCH26,               //14      //回路15
	LOOPCH27,               //14      //回路15
	LOOPCH28,               //14      //回路15
	LOOPCH29,               //14      //回路15
	LOOPCH30,               //14      //回路15
	LOOPCH31,               //14      //回路15
	LOOPCH32,               //14      //回路15
	LOOPCH33,               //14      //回路15
	LOOPCH34,               //14      //回路15
	LOOPCH35,               //14      //回路15
	LOOPCH36,               //14      //回路15
	LOOPCH37,               //14      //回路15
	LOOPCH38,               //14      //回路15
	LOOPCH39,               //14      //回路15
	LOOPCH40,               //14      //回路15
	LOOPCH41,               //14      //回路15
	LOOPCH42,               //14      //回路15
	LOOPCH43,               //14      //回路15
	LOOPCH44,               //14      //回路15
	LOOPCH45,               //14      //回路15
	LOOPCH46,               //14      //回路15
	LOOPCH47,               //14      //回路15
	LOOPCH48,               //14      //回路15
	LOOPCH49,               //14      //回路15
	LOOPCH50,               //14      //回路15
	LOOPCH51,               //14      //回路15
	LOOPCH52,               //14      //回路15	
	LOOPCH53,               //14      //回路15
	LOOPCH54,               //14      //回路15
	LOOPCH55,               //14      //回路15
	LOOPCH56,               //14      //回路15
	LOOPCH57,               //14      //回路15
	LOOPCH58,               //14      //回路15
	LOOPCH59,               //14      //回路15
	LOOPCH60,               //14      //回路15
	LOOPCH61,               //14      //回路15
	LOOPCH62,               //14      //回路15
	LOOPCH63,               //14      //回路15
	LOOPCH64,               //14      //回路15
	
	LOOPCHMAX,               //本地自定义回路信息个数上限
}Enum_Dev_Loop;              //设备回路信息集合



typedef struct{
	
	uint8_t  Addr;
	uint32_t ExpandReadFlag;
	uint16_t ExpandReadState[32];
	
}EXPAND_TYPE_G;        //继电器群控状态结构体   2022-09-03



typedef struct{
	
	uint8_t  Addr;
	uint32_t DimmReadFlag;
	uint16_t DimmReadState[32];
	
}DIMM_TYPE_G;         //调光群控状态结构体     2022-09-03


void BLV_DevAction_Init(void);
void BLV_DevAction_Task(void);   //
void BLV_DevDly_Task(void);      //
uint8_t LOGIC_FILE_Check(void);
void Logic_DevAction_Add(uint8_t *data,uint16_t len);

void BLV_DevAction_Add(uint8_t *DevCoreBuf, char *DevName, uint8_t *DevInputBuf, uint8_t *DevCondBuf, uint8_t DevCtrlNum, uint8_t *DevCtrlBuf);
uint32_t DevAction_No_Get(uint16_t DevActionNo);

uint8_t DevActionCtrl(uint8_t *p, uint8_t DataLen);   //中控，服务器调用
void Ele_Ctrl_OpenClose(uint8_t);              

uint32_t Find_AllDevice_List_Information(uint8_t dev_type,uint8_t addr);
uint32_t Find_AllDevice_List_Information2(uint8_t Port, uint8_t dev_type,uint8_t addr);

void Expand_Scene_Get(void);
void Expand_DevDly_Get(void);
void DevAction_ReuseFlag_Get(void);

extern BLV_DevAction_Manage_G  DevActionGlobal;

void DevAction_State_Get(DEV_ACTION_INFO *DevActionInfo);
void DevAction_IndicateCtrl(DEV_ACTION_INFO *DevActionInfo);

void DevAction_ExpandClose(DEV_ACTION_INFO *DevActionInfo, uint8_t ModeCtrl);

#endif









