#ifndef _BLV_NOR_DEV_VIRTUALCARD_
#define _BLV_NOR_DEV_VIRTUALCARD_

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

#define VC_CONDGROUP_MAX          10      //条件组最大支持数
#define VC_CONDSUB_MAX            10      //每组条件最大支持数

#define VIRTUAL_PORT_MAX          11      //虚拟端口数

#define SOMEONE               1           //有人
#define NOONE                 2           //无人

#define VC_CONDGROUP_Default_StartGroup		0x01			//条件组中无人至有人 默认起始条件组为0x01

#define VC_CONDGROUP_SomeOne_Type			0x01			//条件组类型
#define VC_CONDGROUP_NoOne_Type				0x02
#define VC_CONDGROUP_BrieflyLeaving_Type	0x03
#define VC_CONDGROUP_LongTermLeaving_Type	0x04

#define DETECTION_Window_Time_Max			43200				//长时间窗口检测最大时间，单位；S

//事件ID
#define VC_EventID_DoorSensor				0x01				//开门进入事件：条件逻辑判断无人->有人
#define VC_EventID_CardedPersonLeft			0x02				//卡在人离事件：条件逻辑判断有人->无人，同时卡还在
#define VC_EventID_UncardedPersonLeft		0x03				//无卡人离事件：条件逻辑判断有人->无人，且无卡
#define VC_EventID_RadarPersonDetected		0x04				//雷达有人事件：长时间检测逻辑判断人员存在
#define VC_EventID_RadarPersonLeft			0x05				//雷达无人事件：长时间检测逻辑判断室内无人
#define VC_EventID_RS485ButtonPress			0x06				//按键触发事件：室内检测到RS485 按键有触发
#define VC_EventID_ShortAway				0x07				//短暂人离事件：条件逻辑判断有人->无人中，短暂判定人离
#define VC_EventID_LongAway					0x08				//长期人离事件：条件逻辑判断有人->无人中，长时间判定人离
#define VC_EventID_ShortAwayTimeout			0x09				//短暂人离超时事件：条件逻辑判断有人->无人中，短暂判定人离超时产生
#define VC_EventID_LongAwayTimeout			0x0A				//长期人离超时事件：条件逻辑判断有人->无人中，长时间判定人离超时产生

//标志位
#define VC_Event_DoorSensor_Flag			0x0001				//开门进入事件：条件逻辑判断无人->有人
#define VC_Event_CardedPersonLeft_Flag		0x0002				//卡在人离事件：条件逻辑判断有人->无人，同时卡还在
#define VC_Event_UncardedPersonLeft_Flag	0x0004				//无卡人离事件：条件逻辑判断有人->无人，且无卡
#define VC_Event_RadarPersonDetected_Flag	0x0008				//雷达有人事件：长时间检测逻辑判断人员存在
#define VC_Event_RadarPersonLeft_Flag		0x0010				//雷达无人事件：长时间检测逻辑判断室内无人
#define VC_Event_RS485ButtonPress_Flag		0x0020				//按键触发事件：室内检测到RS485 按键有触发
#define VC_Event_ShortAway_Flag				0x0040				//短暂人离事件：条件逻辑判断有人->无人中，短暂判定人离
#define VC_Event_LongAway_Flag				0x0080				//长期人离事件：条件逻辑判断有人->无人中，长时间判定人离
#define VC_Event_ShortAwayTimeout_Flag		0x0100				//短暂人离超时事件：条件逻辑判断有人->无人中，短暂判定人离超时产生
#define VC_Event_LongAwayTimeout_Flag		0x0200				//长期人离超时事件：条件逻辑判断有人->无人中，长时间判定人离超时产生


typedef struct
{
	uint8_t  HPort_Type;        //映射端口类型
	uint8_t  HPort_Addr;        //映射端口485地址
	uint16_t HPort_Loop;        //映射端口回路

	uint8_t  PortIndex;         //虚拟端口号
	uint8_t  PortEnFlag;        //单个回路统计启用标记
}__attribute__ ((__packed__))VPORT_STRUCT;       //端口属性结构体

typedef struct
{
	uint8_t  	HPort_Type;        	//映射端口类型
	uint8_t  	HPort_Addr;        	//映射端口485地址
	uint16_t 	HPort_Loop;        	//映射端口回路

	uint8_t  	Release_Thres;		//释放阈值 有人->无人
	uint8_t  	PortIndex;         	//虚拟端口号
	uint8_t  	PortEnFlag;        	//单个回路长时间检测 启用标记
	uint16_t  	Judgment_Time;     	//回路检测统计时间
	uint8_t   	Judgment_Unit;     	//回路检测统计时间单位
	uint8_t		Trigger_Thres;		//触发阈值 无人->有人
}__attribute__ ((__packed__))VPORT_INFO_STRUCT;       //端口信息结构体 - 配置文件中存储数据结构

typedef struct
{
	uint8_t   	Exist_Flag;     	//有人无人标记	1:有人	2:无人	3:短暂人离 4:长时间人离
	uint8_t   	Condi_Gruop;    	//条件组		
	uint8_t   	Condi_Subset;   	//条件序号
	
	uint16_t  	Judgment_Time;     	//条件 - 判定成立时间
	uint8_t   	Judgment_Unit;     	//条件 - 判定成立时间单位
	
	uint8_t   	Port_State[VIRTUAL_PORT_MAX];						//0:不判断   1:触发    2:释放
	
	uint16_t  	Timeout_Time;     	//条件 - 判定超时时间
	uint8_t   	Timeout_Unit;     	//条件 - 判定超时时间单位
	
	uint8_t   	Trigger_Flag;  		//条件成立标记
	
	uint32_t  	Trigger_Tick;     	//条件时间戳

}__attribute__ ((__packed__))CONDITION_STRUCT;    //条件结构体

typedef struct
{
	uint8_t   	Det1sTime;                            	//1s检测当前次数
	uint8_t 	Det30sTime;								//30s 写一下日志
	uint8_t   	TriggerNum[VIRTUAL_PORT_MAX];         	//1s内触发次数
	uint8_t		FullFlag[VIRTUAL_PORT_MAX];				//检测窗口已满 - 标志位
	
	uint8_t 	Trigger_Thres[VIRTUAL_PORT_MAX];		//触发阈值 无人->有人
	uint8_t 	Release_Thres[VIRTUAL_PORT_MAX];		//释放阈值 有人->无人
	uint16_t  	DetWinTotalNum[VIRTUAL_PORT_MAX];  		//滑动窗口时间    默认12小时(43200秒)  单位：S
	uint16_t  	DetWinTrigger[VIRTUAL_PORT_MAX];      	//触发总时间(秒)
	uint16_t  	DetWinIdex[VIRTUAL_PORT_MAX];         	//滑动下标
	
}__attribute__ ((__packed__))DETECT_STRUCT;         	//89B

typedef struct 
{
	uint32_t      	PortTick;                       		//端口检测时间戳    4
	uint8_t       	PortInit_Flag;                  		//端口映射标记      1
	
	VPORT_STRUCT  	Port_Info[VIRTUAL_PORT_MAX];    		//映射端口属性      77    
	uint8_t       	PortState[VIRTUAL_PORT_MAX];    		//端口状态          11
	uint8_t       	PortStateLast[VIRTUAL_PORT_MAX];   		//上一次端口状态    11
	uint8_t 	  	PortStateAct[VIRTUAL_PORT_MAX];			//端口动作状态		11 用于条件比对使用
	
	uint32_t 	  	PortTiggleTick[VIRTUAL_PORT_MAX];		//端口记录点按时间戳 - 用于A9IO避免重发触发状态	44 
	
	DETECT_STRUCT 	DetInfo;                        		//长时间检测信息        102
	
	float         	ActThreshold[VIRTUAL_PORT_MAX]; 		//实际触发阈值    44

	uint8_t 		ExistState;          	//有人或无人状态
	uint8_t 		ExistState_Last;
	uint8_t 		ConGroupIndx;       	//当前判断条件组下标
	
	uint8_t 		CardState;          	//有卡状态
	uint8_t 		CardStateLast;			//
	uint8_t 		DetNum;             	//参与窗口检测端口数量
	uint8_t 		Last_ConGroupType;		//上一次条件组成立的类型 - 用于产生短暂人离、长时间人离 事件
	
	uint32_t  		Action;            		//产生动作	2026-01-26 将变量从uint8_t 改为 uint32_t
	
	uint32_t 		Condition_Trigger_Tick;

	uint32_t 		Last_Trigger_Tick;		//上一次条件成立的时间戳
}__attribute__ ((__packed__))VIRTUALCARD_STRUCT;	



void BLV_Nor_Dev_VirtualCard_For_Logic_Init(LOGICFILE_DEVICE_INFO *dev_info,uint8_t *data,uint16_t data_len);


#endif

