
#ifndef _BLV_485_DEV_WEIXINLOCKFUN_H_
#define _BLV_485_DEV_WEIXINLOCKFUN_H_


#include "stdint.h"
#include "BLV_RF_GatewayHost.h"
#include "BLV_Dev_Action.h"
#include "BLV_All_Dev_Init.h"

#define WxLock_OPEN    	   0x01            //微信锁有开的动作
#define WxLock_CLOSE   	   0x02            //微信锁有关的动作
//#define WxLock_STOP   	 		 0x06            //微信锁有停止的动作
#define WxLock_Invalid 	   0x00            //微信锁

#define WxLock_V1_0     0x00    //微信锁V1_0   //定制协议版
#define WxLock_V2_0     0x01    //微信锁V1_0   //公共协议版

#define WxLockCtrlSendMax  0x03  //微信锁控制重发上限


#define WXLOCKDOWNMESSAGELEN  100   //下行长度限制
#define WXLOCKUPMESSAGELEN    100   //上行长度限制

typedef struct RS485_WxLock_INFO*  RS485_WxLock_INFOP;


//typedef void (*RS485_WxLock_Cycle_ptr)(uint8_t DevPort, uint8_t DevAddr);						//定义传递参数为端口号和设备地址，返回为空的函数类型指针，用于485微信锁控制和轮询
//typedef void (*RS485_WxLockRead_ptr)(u8 *, u8);								      //定义传递参数为数组信息，返回值为空的函数指针类型，用于485微信锁数据读取
typedef void (*RS485_WxLock_IndiCtrl_ptr)(RS485_WxLock_INFOP, uint16_t Addr, uint16_t OnOff);			//定义传递参数为地址和状态，返回为空的函数类型指针，用于485开关指示灯赋值
typedef uint16_t (*RS485_WxLock_LoopStateRead_ptr)(RS485_WxLock_INFOP, uint16_t);               //指定回路状态判断

typedef struct RS485_WxLock_INFO
{
	BLV_COMM_RECORD_G comm_record;		//通讯记录
	
	uint8_t DevSendCnt;     //设备发送计数   计数达到重发次数都没有回复，判为离线  占4位
	uint8_t DevOffline;       //设备离线标志 1，设备离线   0，设备在线             占2位
	uint8_t DevOfflineLast;       //设备离线标志 1，设备离线   0，设备在线         占2位
		
	uint32_t RfGatewayHostAddr;  //无线主网关信息
	
	uint32_t WeixinCycleCnt;   //微信锁轮询计数
	uint32_t WeixinCycleMax;   //
	
	uint8_t WeixinTimeSetFlag;  //微信锁睡眠时间设备标志
	uint8_t WeixinTimeSetCnt;   //微信锁时间设置计数
	uint8_t WeixinTimeSetValue; //微信锁设置时间
	
	uint8_t WeixinCtrlFlag;   //微信控制标志位   		 1：需要控制  0：不需要控制
	uint8_t WeixinCtrlState;  //控制微信锁  1开  2关
	uint8_t WeixinLockState;  //微信锁实际状态		1：锁开     2：锁关
	uint8_t WeixinLockStateLast; //微信锁上一个状态
	uint8_t WeixinLockStateInUdp;  //微信锁实际状态上一个状态		1：锁开     2：锁关
	
	uint8_t WeixinLockAction;    //微信锁动作
//	uint8_t WeixinLockUpFlag;    //微信锁上报标志
	uint16_t DoorLockVoltage;    //门锁电量 以mv为单位
	uint8_t WeixinLockUpVol;     //上报的电量，按百分比计算
	uint8_t WeixinLockUpVolLast;  //上一次上报的电量， 按百分比计算
//	uint8_t DoorLockVoltageL;     //门锁电压的低字节
//	uint8_t DoorLockVoltageH;     //门锁电压的高字节
	uint8_t WeixinCtrlSendCnt;    //微信控制重发计数
	
	uint8_t WeixinDownSendFlag;     //下行发送标志
	uint8_t WeixinDownSendCnt;     //下行发送计数
	uint8_t WeixinDownMessageLen;  //下行的数据长度
	uint8_t WeixinDownMessage[WXLOCKDOWNMESSAGELEN];  //微信锁下行消息内容
	
	uint8_t WeixinLockTimeGetFlag;  //微信锁时间得到标志 与RCU的得到标志进行比较，有变化就进行赋值 
	uint32_t WeixinLockWriteTime;  //微信锁设置时间  
	uint32_t WeixinLockReadTime;   //微信锁读取时间

/*创佳微信锁定义开始*/
	uint8_t CJ_control_flag;		//创佳锁命令控制标志位
	uint8_t CJ_send_sn;				//创佳锁发送序号（成功，加1，到达15清0；失败，当前不变）
	uint8_t CJ_connection_status;	//创佳锁与E92连接状态
	uint8_t CJ_reality_lock;		//创佳锁实际开锁状态
	uint8_t CJ_status;				//创佳锁状态（bit0：0-门开，1-门关  bit1：0-方舌关，1-方舌开  bit2：0-斜舌关，1-斜舌开）
	uint8_t CJ_kwh;					//创佳锁电量（百分比电量  0~100）
	uint8_t CJ_signal;				//创佳锁信号强度（0x00~0xDx）
	uint8_t CJ_lock_mac[6];			//创佳锁的MAC地址（小端模式）
	uint8_t CJ_firmware_version[23];//创佳锁的固件版本（小端模式）
	uint8_t CJ_identity;			//创佳锁开锁身份（00-客人卡，02-没身份，30-楼层卡，40-清洁卡，50-楼号卡，60-总控卡，70-应急卡，E0-领班卡，
									//					F0-机械钥匙，66-蓝牙，17-远程开锁房卡，18-NFC，19-标准Z-Wave开锁，20-卡号，21-干接点）
	uint16_t CJ_year;				//创佳锁时间，年
	uint8_t CJ_month;				//创佳锁时间，月
	uint8_t CJ_day;					//创佳锁时间，日
	uint8_t CJ_hour;				//创佳锁时间，小时
	uint8_t CJ_min;					//创佳锁时间，分钟
	uint8_t CJ_sec;					//创佳锁时间，秒
	uint8_t CJ_room[5];				//创佳锁读取房号信息
	uint8_t CJ_read_gateway[15];	//创佳锁读取网关版本信息
	uint8_t CJ_clock_flag;			//创佳锁设置时钟状态
	uint8_t CJ_connect_flag;		//创佳锁控制配对连接状态
	
/*创佳微信锁定义结束*/

	uint8_t WeixinAskLockFlag;      //请求开锁标志
	
	uint8_t WeixinUpSendFlag;     //上行发送标志
	uint8_t WeixinUpSendCnt;     //上行发送计数	
	uint8_t WeixinUpMessageLen;   //下行的数据长度	
	uint8_t WeixinUpMessage[WXLOCKUPMESSAGELEN];  //微信锁上行消息内容  会被上报到MQTT服务器
    
    
/*杨格锁定义开始,2025-12-18,叶阳文*/
    // CJ_identity,  身份变量使用创佳微信锁的，0x00:无身份, 0x01-0x05:具体身份数量见带身份插卡取电
    //CJ_status,    动作
    //CJ_kwh,       电量百分比变量使用创佳的
    //CJ_signal,    信号强度
    //WeixinAskLockFlag,    请求开锁标志位
    uint8_t YG_SendCnt;    //发送计数
    uint8_t YG_SendSN;    //主动发送SN号，SN号由主动方维护
    uint8_t YG_RecvSN;    //接收SN号，设备端维护
    
    uint8_t YG_haveID_Flag;     //有上报身份标志位
    uint8_t YG_LockAction_Flag; //锁身份动作事件处理标志位
    uint8_t YG_LockAction;  	//锁身份动作
    
    uint8_t YG_kwh_LowThr;          //百分比低电量阈值
    
    uint32_t YG_LockActionVldPeriod; //杨格门锁，门锁取电标志有效期,单位 ms
    uint32_t YG_IdVldPeriod;        //杨格门锁，身份有效期,单位 ms,默认 5min
    uint32_t YG_IdVldPeriod_Tick;   //杨格门锁，身份有效期时间戳，单位 ms
    uint32_t YG_Send_Tick;          //发送控制的时间间隔时间搓
/*杨格锁定义结束*/


//	RS485_WxLock_IndiCtrl_ptr RS485_WxLock_IndiCtrl;        //指示灯赋值
//	RS485_WxLock_LoopStateRead_ptr  RS485_WxLock_LoopStateRead;  //读取	
	
}__attribute__ ((__packed__))RS485_WxLock_INFO;

void BLW_RS485_WeixinLockFun_Init(uint16_t DataLen, uint8_t *Data);

//void BLW_RS485_WeixinLockFun_Init(uint8_t devaddr);
void RS485_WxLock_IndiCtrl(uint32_t CfgDevAddIn, uint16_t DevInputAddr, uint32_t devaddr, uint16_t Addr, uint16_t OnOff);

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


#endif




