#ifndef _SENSOR_SCAN_H_
#define _SENSOR_SCAN_H_


#define WashRoom_Pin            GPIO_Pin_2          //S1
#define BedRoom_Pin             GPIO_Pin_3          //S2
#define GateWay_Pin             GPIO_Pin_4
#define Retain_Pin              GPIO_Pin_5          //门磁

#define DET_EXIST1              GPIO_Pin_6
#define DET_EXIST2              GPIO_Pin_7


#define DET_PRESS               0x00
#define DET_LOOSEN              0x01


#define DET_NONE                0x00
#define DET_SER_PRESS           0x01        //触发
#define DET_SER_LOOSEN          0x02        //未触发
#define DET_OPENTOCLOSE         0x03
#define DET_CLOSETOOPEN         0x04

#define DIP_DELAY_COUNT         5              //扫描次数
#define DIP_SCAN_Time           20              //每次扫描时间

#define DET_DELAY_COUNT         10          //消抖次数
#define DET_DELAY_COUNT_LONG    600         //长触发判断时间为3S

typedef enum{
    DET_CH0,
    DET_CH1,
    DET_CH2,
    DET_CH3,
    DET_CH4,

    DET_MAX,
}SENSORDET_CH_E;



typedef enum {
    KEY_VAL_NOT,                    //没按下
    KEY_VAL_SHORT_PRESS,            //单击
    KEY_VAL_CONT_LONG_PRESS,        //连续长按
    KEY_VAL_SINGLE_LONG_PRESS,      //长按单击
    KEY_VAL_LONG_PRESS_LOOSEN,      //长按松开
} KEY_VAL_e;



typedef struct{

    uint8_t     det_ctrlout_state;    //输出给泛智联的延时关闭标记
    uint32_t    det_action_tick;      //延时标记时间搓

    uint8_t     door_rarON_flag;       //门磁开标志
    uint8_t     bath_rarON_flag;       //洗浴状态

    uint8_t     bath_rarOFF_flag;       //洗浴关状态

    uint32_t    door_rarOn_time;     //门磁关事件延时触发时间
    uint32_t    bath_rarOn_time;     //卫浴雷达关事件延时触发时间

    uint32_t    door_rar_deltime;     //门磁关事件延时时间
    uint32_t    bath_rar_deltime;     //卫浴雷达关事件延时时间

}__attribute__ ((__packed__))SENSORDET_INFO_T;



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

#define VIRTUAL_PORT_MAX                    5           //端口数
#define VIRTUAL_GP_NUM_MAX                  9           //条件组总数//条件总数

//设置端口超时时间
#define DETECTION_Window_Hour_Max           8//6
#define DETECTION_Window_Min_Max            480//360
#define DETECTION_Window_Sec_Max            28800//21600        //长时间窗口检测最大时间，单位;S
#define DETECTION_Window_OnlyPort           240//270            //单个端口字节数，DETECTION_Window_Sec_Max/10/8
#define DETECTION_Window_BitMin             15                  //一个bit代表多少秒

//条件组
#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 VC_Event_PersonDet_Flag             0x01                //无人到有人事件：
#define VC_Event_NoPersonDet_Flag           0x02                //有人到无人事件：
#define VC_Event_DoorSensorOpen_Flag        0x04                //门磁开事件：
#define VC_Event_DoorSensorClose_Flag       0x08                //门磁关事件：
#define VC_Event_BathroomRadarOn_Flag       0x10                //洗手间雷达开事件：
#define VC_Event_BathroomRadarOFF_Flag      0x20                //洗手间雷达关事件：



#define VC_CONDGROUP_Default_StartGroup     0x01                //条件缓存数组中无人至有人 默认起始条件组为0x01
#define VC_NONE_Default_StartGroup          0x06                //条件缓存数组中, 默认最大条件组数，不支持修改，空间不足



typedef enum
{
    DIP_VAL_OFF,            //松开
    DIP_VAL_ON,             //按下
}DIP_VAL_e;


typedef struct
{
    uint8_t delayCnt_ON[DET_MAX];
    uint8_t delayCnt_OFF[DET_MAX];
    uint32_t DIP_val;
    uint32_t DIP_last_val;
}DIP_t;


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:释放    4,关至开    3,开至关

    uint16_t    Timeout_Time;           //条件 - 判定超时时间
    uint8_t     Timeout_Unit;           //条件 - 判定超时时间单位

    uint8_t     Trigger_Flag;           //条件成立标记

//    uint32_t    Trigger_Tick;         //条件时间戳
//    uint32_t    Timeout_Tick;         //条件超时时间戳
}__attribute__ ((__packed__))CONDITION_STRUCT;    //条件判断结构体


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
{
    uint16_t     Det1sTime;                             //15s检测当前次数
    uint16_t     TriggerNum[VIRTUAL_PORT_MAX];          //15s内触发次数
    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];       //滑动窗口时间    默认  8  小时(秒)  单位：S
    uint16_t    DetWinTrigger[VIRTUAL_PORT_MAX];        //触发总时间(单位：n秒)
    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 用于条件比对使用         0:不判断   1:触发    2:释放   3:边沿变化    4:边沿变化,触发变释放

//    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     Action;                 //产生动作
    uint8_t     CardState;              //有卡状态
    uint8_t     CardStateLast;
    uint8_t     DetNum;                 //参与窗口检测端口数量
    uint8_t     Last_ConGroupType;      //上一次条件组成立的类型 - 用于产生短暂人离、长时间人离 事件

    uint8_t     print_rdrsta_flag;      //输出雷达状态标志, 0x01,输出
    uint8_t     rdrsta_change_flag;     // 0x01,雷达状态改变

    uint32_t    Condition_Trigger_Tick;
    uint32_t    Last_Trigger_Tick;      //上一次条件成立的时间戳

    DIP_t       g_Dip;                  //端口消抖

}__attribute__ ((__packed__))VIRTUALCARD_STRUCT;



extern SENSORDET_INFO_T sensor_info;




void Blv_CardlessPower_Tack(void);
void DetWin_WriteData_Bit(uint8_t port,uint16_t idex,uint8_t state);
uint8_t DetWin_ReadData_Bit(uint8_t port,uint16_t idex);

void DIP_ScanTask(void);
void Sensor_Init(void);
void Action_Task(void);
void print_RDRsta_Tack(void);
uint8_t BLV_DETInfo_Recv_Processing(uint8_t* RecvData,uint16_t RecvLen);
#endif




