#ifndef _BLV_485_DEV_TEMPFUN_H_
#define _BLV_485_DEV_TEMPFUN_H_

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

//#define DEV_RS485_TEMP			0x07

#define TMEP_TYPE_IR       	0       //红外温控器，自动风速不会控制继电器
#define TEMP_TYPE_VALVE    	1       //电磁阀温控器，自动风速会控制继电器

#define TEM_DecTem   		15   //减少温度
#define TEM_AddTem   		33   //增加温度
#define TEM_DecFan   		14   //减少风速
#define TEM_AddFan   		34   //增加风速
#define SET_TEMP_FANAUTO   	35   //单控自动风					2026-03-27
#define SET_TEMP_MODEAUTO   36   //单控自动模式					2026-03-27
#define SET_FANAUTO1  	 	37   //设置自动风速含停止档位		2026-03-27
#define SET_FANAUTO2   		38   //设置自动风速含不停止档位		2026-03-27

#define TEM_MIN_SET   		0x10   //最低温度
#define TEM_MAX_SET   		0x20   //最高温度

#define TEMP_ONOFF_CTRL_MAX		0x03   //温控器控制重发计数

/*温控器协议以配置软件为准*/
#define TEMP_VALVE_OPEN    0x01   //阀开
#define TEMP_VALVE_CLOSE   0x00   //阀关

#define TEMP_RESTORE       0x00   //还原
#define TEMP_KEEP          0x03   //保存

#define TEMP_ON       0x01   //空调开机
#define TEMP_OFF      0x02   //空调关机

#define TEMP_STATE_ON       0x01   //空调状态开机
#define TEMP_STATE_OFF      0x00   //空调状态关机

#define TEMP_HIGH     	0x03   //风机高速
#define TEMP_MID      	0x02   //风机中速
#define TEMP_LOW      	0x01   //风机低速
#define TEMP_FANAUTO  	0x00   //风机自动

#define TEMP_COLD     	0x01   //空调制冷
#define TEMP_HOT      	0x02   //空调制热
#define TEMP_WIND     	0x03   //空调送风
#define TEMP_MODEAUTO  	0x00   //空调模式自动  这个自动唯有主动去控制空调时 才存在   上报空调的状态是没有自动


//#define TEMSTATECONVER(data) (*(uint16_t *)(&data))  //实际u16的值
//#define TEMSTATEADDR(data) ((uint16_t *)&data)  //实际u16的地址

#define TEMTEMPCONVER(data) ((0x00 == data)?TEM_MAX_SET:data)  //温控器温度转换为0，就输出32度
   


/*C7T 温控器相关定义*/
//#define TEMSTATECONVER(data) (*(uint16_t *)&data)  	//将结构体数据转化为实际u16的值
#define C7T_Temp_Switch_To_Judge(data)	((TEMP_STATE_ON == data)?0x01:0x02)

typedef struct 
{
	uint8_t indoor_t ;     		//室内温度	
	uint8_t set_t ;    			//设置温度	
	uint8_t valve ;        		// 1阀开  0阀关
	uint8_t fan ;      			// 1低速,2中速,3高速,0停止,4自动
	uint8_t mode ;     			// 1制冷,2制热,3送风,0自动
	uint8_t on_off ;   			// 1开,2关
}__attribute__ ((__packed__))TemState_Struct; 

typedef struct 
{
	uint8_t IndoorFlag:1;    //室内温度判断标志
	uint8_t SetTFlag:1;      //设置温度判断标志
	uint8_t ValveFlag:1;     //阀门判断标志
	uint8_t FanFlag:1;       //风速判断标志
	uint8_t ModeFlag:1;      //模式判断标志
	uint8_t OnOffFlag:1;     //开关机判断标志
	
	uint8_t IndoorState:1;  //室内温度状态       
	uint8_t SetTState:1;   //设置温度状态
	uint8_t HValveFlag:1;   //热阀判断标志
	uint8_t HValveState:1;  //热阀状态
	uint8_t ValveState:1;  //阀门状态
	uint8_t FanState:2;   //风速状态
	uint8_t ModeState:2;   //模式状态
	uint8_t OnOffState:1;   //开关机状态
	
}__attribute__ ((__packed__))TemCond_Struct; //单一判断时，需要跟状态一起判断 非单一判断时，只需判断标志位

typedef struct 
{
	uint8_t TemIndoorCtrlVar ; 		//室内温度控制标志或计数	
	uint8_t TemSetTCtrlVar ; 		//设置温度控制标志或计数
	uint8_t TemValveCtrlVar ; 		//阀门控制标志或计数	
	uint8_t TemFanCtrlVar ;   		//风速控制标志或计数	
	uint8_t TemModeCtrlVar ;  		//模式控制标志或计数	
	uint8_t TemOnOffCtrlVar ; 		//开关机控制标志或计数
}__attribute__ ((__packed__))TemStateCtrlVar_Struct;

typedef struct
{
	BLV_COMM_RECORD_G comm_record;	//通讯记录
	
	TemState_Struct TemState;
	
	TemState_Struct TemStateCtrl;     				//将要控制的状态
	TemState_Struct TemStateCtrlLast; 				//将要控制的上一个状态
	
	TemStateCtrlVar_Struct TemStateCtrlFlag;  		//温控器控制标志
	TemStateCtrlVar_Struct TemStateCtrlCnt;   		//温控器控制计数
	
	TemCond_Struct TemCondCfg;   //配置产生的条件  低6位一个为1时，表示单一条件 低6位2个或者以上为1时，为非单一条件。
	TemCond_Struct TemCondRec;   //温控器接收产生的条件  低6位为产生的动作 高10位为动作的描述
	
	uint8_t FanAutoRelay;      						//风速自动时，继电器的状态
	uint8_t FanAutoFlag;   							//为0，走主机自动风速，为1，走协议自动风速
	uint8_t relay_out;   							//0位低速  1位中速   2位高速   3位热阀  4位冷阀  
	uint8_t ValveSameFlag;   						//冷热阀一致为1   不一致为2      //2023-04-17

	uint8_t control_start;							//本地开关机控制状态
	
//	TemState_Struct TemStateNet;  					//用于虚拟温控器状态变化比较      暂未用
	TemState_Struct TemStateLast;  					//温控器的上一个状态  用于状态变化上报
//	TemState_Struct TemStateRs485;  				//温控器的上一个状态  用于状态变化上报 RS485       暂未用
//	TemState_Struct TemStateMap;  					//温控器的上一个状态  用于状态变化上报 RS485	     暂未用
//	TemState_Struct TemStateExUdp;  				//温控器的上一个状态  用于状态变化上报 网络对外    暂未用

	TemState_Struct TemKeepState;
	uint8_t DevSendCnt;								//设备发送计数   计数达到重发次数都没有回复，判为离线  占4位
	uint8_t DevOffline;								//设备离线标志 1，设备离线   0，设备在线             占2位
	uint8_t DevOfflineLast;							//设备离线标志 1，设备离线   0，设备在线         占2位

	uint8_t TemCycleCnt;  							//温控器轮询计数，LF温控器轮询计数专用

//	uint8_t TemDataChangeFlag; 						//温控器数据改变标志
//	uint8_t TempType;        						//温控器类型，默认为红外温控器，有继电器存在，即是电磁阀温控器，0为红外温控器，1为电磁阀温控器
	
	uint8_t TemStateNetFlag;  						//服务器控制温控器标志位 - 用于云端控制温控器，不播放语音提示
	uint8_t TemStateNetCnt;							//服务器控制温控器后查询计数
	uint16_t TemStateNetState;   					//服务器控制温控器状态
	
	
	//Dev_Name_Struct DevNameStruct;//空调别名 每个回路16个字节别名     //仅支持30个回路别名
	
	uint32_t inquire_tick;		//询问时间戳
	
	uint8_t CardEn;                                 //2023-12-26   插卡状态同步功能启用/禁用

	uint8_t CardFlag;                               //2023-12-26   插卡状态同步设置标记
	uint8_t CardCnt;                                //2023-12-26   插卡状态同步计数
	uint8_t ValveNoExist;                           //2024-06-27   水机无阀标记
	
	uint8_t switch_en_flag;					//开机提示音 使能标志位
	uint8_t	fan_en_flag;					//风速模式提示音 使能标志位
	
	uint8_t	FanStop_Flag;					//风速是否含停止档位 标志位
	
	uint8_t DevPort;            //2024-11-05
	uint8_t DevPort_Last;       //2024-11-05
	uint8_t DevPort_Flag;       //2024-11-05
	
	uint8_t inif_flag;			//2025-08-21 		初始化标志位
	
	uint8_t Carbon_Set_Temp;	//2025-10-13	给碳达人使用
	uint8_t udp_flag;			//2025-10-13 增加向服务器上报标志位
	uint32_t udp_tick;			//2025-10-13 
	
	uint8_t indoor_dec_temp;	//2026-03-02		存储室内上报温度小数点部分数据     lsj
	
}__attribute__ ((__packed__))RS485_TEMP_INFO;						//485温控器的数据与函数

typedef struct
{
	TemState_Struct TemState; 		//
	uint8_t FanAutoRelay;      		//风速自动时，继电器的状态
}__attribute__ ((__packed__))RS485_TEMP_BASIC;         //485温控器基本参数

typedef void (*RS485_Tem_CycleCtrl_ptr)(Device_Public_Information_G *BUS_Public);		//轮询函数指针申明

typedef void (*RS485_Tem_Ctrl_ptr)(Device_Public_Information_G *BUS_Public,RS485_TEMP_INFO *Rs485Tem, uint8_t CtrlWay);		//控制函数指针申明


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

void Dev_Temp_State_Sync(TemState_Struct *temp,TemState_Struct *sync_temp);
uint16_t Dev_Temp_State_Data(TemState_Struct temp);
uint8_t Get_BLV485_TEMP_Online_Status(uint32_t devaddr);
uint16_t Get_BLV485_TEMP_Status(uint32_t devaddr,uint16_t loop);

uint8_t TemSingleJudge(uint32_t CfgDevAdd, RS485_Tem_Ctrl_ptr Rs485TemCtrl, RS485_Tem_CycleCtrl_ptr Rs485TemCycle);
uint8_t TemGlobalJudge(uint32_t CfgDevAdd, RS485_Tem_Ctrl_ptr Rs485TemCtrl, RS485_Tem_CycleCtrl_ptr Rs485TemCycle);
void Temp_Action_Set(RS485_TEMP_BASIC *Rs485TemRecBuf, RS485_TEMP_INFO *Rs485Tem);

void Dev_TEMPCTRL_Ctrl(uint32_t CfgDevAddIn, uint16_t DevInputAddr, uint32_t CfgDevAddOut, uint16_t DevOutputLoop, uint16_t DevOutputType);

#endif
