#pragma once
#include "includes.h"
#include "Uart.h"
#include "Verbpo.h"
#include "ClientSock.h"


#define NET_DISCNT			0x00
#define NET_CNT			0x01

#define ID_RESET        			0x01
#define ID_RESET_LENGTH        			2 
#define ID_COM_STS      			0x02
#define ID_COM_STS_LENGTH      			4 
#define ID_SELFTEST     			0x03
#define ID_SELFTEST_LENGTH     			9 
#define ID_CMD_ACK    				0x04
#define ID_CMD_ACK_LENGTH    			6 
#define ID_ECGWAVE					0x05
#define ID_ECGWAVE_LENGTH				18 
#define ID_LEAD_STS					0x06
#define ID_LEAD_STS_LENGTH				6 
#define ID_HR           			0x07
#define ID_HR_LENGTH_LENGTH           	6 
#define ID_ECG_PCVs					0x09
#define ID_ECG_PCVs_LENGTH 		5
#define ID_ECG_CORR_ALARM		0x0A
#define ID_ECG_CORR_ALARM_LENGTH 		6
#define ID_ST           			0x0B
#define ID_ST_LENGTH          	8 
#define ID_ST_PATTERN   			0x0C
#define ID_ST_PATTERN_LENGTH   			10 
#define ID_RESPWAVE     			0x10
#define ID_RESPWAVE_LENGTH     			7 
#define ID_RR           			0x11
#define ID_RR_LENGTH           			6 
#define ID_APNEA        			0x12
#define ID_APNEA_LENGTH        			7 
#define ID_CVA          			0x13
#define ID_CVA_LENGTH          			5 
#define ID_TEMP         			0x15
#define ID_TEMP_LENGTH         			9 
#define ID_SPO2_WAVE    			0x16
#define ID_SPO2_WAVE_LENGTH    			8 
#define ID_SPO2_PR     				0x17
#define ID_SPO2_PR_LENGTH     			8  
#define ID_IBP_WAVE     			0x18
#define ID_IBP_WAVE_LENGTH     			7  
#define ID_IBP_STS      			0x19
#define ID_IBP_STS_LENGTH      			4 
#define ID_IBP_DATA     			0x1A
#define ID_IBP_DATA_LENGTH     			10 
#define ID_IBP_CAL      			0x1B
#define ID_IBP_CAL_LENGTH      			6 
#define ID_IBP_CAL_TIME 			0x1C
#define ID_IBP_CAL_TIME_LENGTH 			7 
#define ID_NBP_CUFPRE   			0x20
#define ID_NBP_CUFPRE_LENGTH   			7 
#define ID_NBP_END      			0x21
#define ID_NBP_END_LENGTH      			4 
#define ID_NBP_RESULT1  			0x22
#define ID_NBP_RESULT1_LENGTH  			9 
#define ID_NBP_RESULT2  			0x23
#define ID_NBP_RESULT2_LENGTH  			5 
#define ID_NBP_STS      			0x24 
#define ID_NBP_STS_LENGTH      			8 

#define ID_AIROXY_VALUE      		0x30
#define ID_AIROXY_VALUE_LENGTH      5 

#define ID_AIROXY_STS      			0x31
#define ID_AIROXY_STS_LENGTH      5 

#define ACK_SUC						0x00
#define ACK_CHECK				   	0x01
#define ACK_LENGTH_ERR				0x02
#define ACK_INVALID					0x03
#define ACK_PARA_ERR				0x04
#define ACK_NO_ACCEPT				0x05
#define REV_BUFF_LENGTH     4096
#define SEND_BUFF_LENGTH     1024

//病人类型设置 设置病人类型为成人、儿童或新生儿
#define CMD_PAT_TYPE			0x42 
#define CMD_PAT_TYPE_LENGTH		5
//3 / 5 导联设置 设置 ECG 导联为 5 导联或 3 导联模式
#define CMD_LEADSYSTEM			0x45 
#define CMD_LEADSYSTEM_LENGTH		5
//导联方式设置设置通道 1 或通道 2 的 ECG 导联：
//I、 II、 III、 AVL、 AVR、 AVF、 V
#define CMD_LEADTYPE			0x46 
#define CMD_LEADTYPE_LENGTH		5
//心电滤波方式设置设置通道 1 或通道 2 的 ECG 滤波方
//式：诊断、监护、手术
#define CMD_FILTER_MODE			0x47  
#define CMD_FILTER_MODE_LENGTH		5
//心电增益设置 ECG 增益：× 0.25、× 0.5、× 1、× 2
#define CMD_ECG_GAIN			0x48  
#define CMD_ECG_GAIN_LENGTH		5
//心电校准设置 ECG 波形为 1Hz 的校准信号
#define CMD_ECG_CAL				0x49 
#define CMD_ECG_CAL_LENGTH		5
//工频干扰抑制开关设置 50 / 60Hz 工频干扰抑制的开关
#define CMD_ECG_TRAP			0x4A 
#define CMD_ECG_TRAP_LENGTH		5
//起搏分析开关 设置起搏分析的开关
#define CMD_ECG_PACE			0x4B 
#define CMD_ECG_PACE_LENGTH		5
//ST 测量的 ISO、 ST点 设置 ST 计算的 ISO 和 ST 点
#define CMD_ST_ISO				0x4C
#define CMD_ST_ISO_LENGTH		8
//心率计算通道 选择心率计算为通道 1 或通道 2
#define CMD_ECG_CHANNEL			0x4D
#define CMD_ECG_CHANNEL_LENGTH		5
//心率重新计算 重新计算心率
#define CMD_ECG_LEARN			0x4E 
#define CMD_ECG_LEARN_LENGTH		4
//呼吸增益 设置呼吸增益为：× 0.25、× 0.5、×1、× 2、× 4
#define CMD_RESP_GAIN			0x50 
#define CMD_RESP_GAIN_LENGTH		5
//窒息报警时间 设 置 呼 吸 窒 息 的 报 警 延 迟 时 间 ：10s～40s
#define CMD_APNEA_ALM			0x52
#define CMD_APNEA_ALM_LENGTH		5
//体温探头类型 设置体温探头的类型： YSI / CY - F1
#define CMD_TEMP_TYPE			0x53
#define CMD_TEMP_TYPE_LENGTH		5
//SPO2 设置  设置 SPO2 的测量灵敏度
#define CMD_SPO2				0x54
#define CMD_SPO2_LENGTH			5
//NBP 启动手动 / 自动测量
//启动一次血压手动测量或自动测量
#define CMD_NBP_START			 0x55
#define CMD_NBP_START_LENGTH		4
// NBP 中止测量 结束当前的测量
#define CMD_NBP_END				0x56 
#define CMD_NBP_END_LENGTH		4
// NBP 测量周期 设置血压自动测量的周期
#define CMD_NBP_PERIOD			0x57 
#define CMD_NBP_PERIOD_LENGTH		5
//NBP 校准  血压进入校准状态
#define CMD_NBP_CAL				0x58
#define CMD_NBP_CAL_LENGTH		4
//NBP 复位  软件复位血压模块
#define CMD_NBP_RESET			0x59
#define CMD_NBP_RESET_LENGTH		4
//NBP 漏气检测 血压气路进行漏气检测
#define CMD_NBP_PNEUMATIC			0x5A
#define CMD_NBP_PNEUMATIC_LENGTH		4
//NBP 查询状态  查询血压模块的状态
#define CMD_NBP_POLL_STATE  0x5B 
#define CMD_NBP_POLL_STATE_LENGTH		4
//NBP 设置初次充气压力  设置下次血压测量的首次充气压力
#define CMD_NBP_PRE_PRESSURE			0x5C
#define CMD_NBP_PRE_PRESSURE_LENGTH		6
//NBP 启动 STAT 测量 开始 5 分钟的 STAT 血压测量
#define CMD_NBP_CONTINUE			0x5D 
#define CMD_NBP_CONTINUE_LENGTH		4
//NBP 查询测量结果
#define CMD_NBP_GET_RESULT			0x5E
#define CMD_NBP_GET_RESULT_LENGTH		4

#define SCOMMAND_LENGTH	  64
struct CMD_TEST_NET
{
	CString csIP;
	UINT u32Port;
	CWnd *pWnd;
};

//发送命令结构
typedef struct
{
	//命令数据
	unsigned char Data[40];
	//长度
	short int Length;
	//命令类型
	short int Type;
}SCommand;

// UartDataThread

class UartDataThread : public CWinThread
{
	DECLARE_DYNCREATE(UartDataThread)

protected:
	UartDataThread();           // 动态创建所使用的受保护的构造函数
	virtual ~UartDataThread();

public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();

protected:
	DECLARE_MESSAGE_MAP()

public:
	//串口接收到的数据 ，进行解析
	void RevDataAnalyse();
	
	void PutData(unsigned char *buf, unsigned short int length);
	//串口数据解包
	int UnPackData(unsigned char *  p, short int Index, int  length);
	//串口数据组包
	int PackData(unsigned char* pack, int length);
	int GetData();

	int SendData(INT *s);
	//向下位机发送命令
	int SendCmd(unsigned char *buff, unsigned char type, int length);


	//产生模拟的心电、呼吸、血氧、体温等数据
	int PutECGData();
	int PutRespData();
	int PutOxyData();
	int PutTempData();
	int PutNIBPData();
	int PutAirOxyData();


	int init_net(CString ip, UINT port);
	int net_connect();
	int net_close();
	int test_net_connect(struct CMD_TEST_NET *st);
	int do_test_net_connect();
	int submit_net_file();
	int do_submit_net_file();
	int close_submit_net_file();
	int add_rev_cmd(struct REV_CMD *st);

	//病人类型设置 设置病人类型为成人、儿童或新生儿
	int Send_CMD_PatType(UINT8 data);

	//3 / 5 导联设置 设置 ECG 导联为 5 导联或 3 导联模式
	int Send_CMD_LeadSystem(UINT8 data);

	//导联方式设置设置通道 1 或通道 2 的 ECG 导联：
	//I、 II、 III、 AVL、 AVR、 AVF、 V
	int Send_CMD_LeadType(UINT8 data);

	//心电滤波方式设置设置通道 1 或通道 2 的 ECG 滤波方
	//式：诊断、监护、手术
	int Send_CMD_FilterMode(UINT8 data);

	//心电增益设置通道 1 或通道 2 的 ECG 增益：
	//× 0.25、× 0.5、× 1、× 2
	int Send_CMD_ECGGain(UINT8 data);

	//心电校准设置 ECG 波形为 1Hz 的校准信号
	int Send_CMD_ECGCal(UINT8 data);

	//工频干扰抑制开关设置 50 / 60Hz 工频干扰抑制的开关
	int Send_CMD_ECGTrap(UINT8 data);

	//起搏分析开关 设置起搏分析的开关
	int Send_CMD_ECGPace(UINT8 data);

	//ST 测量的 ISO、 ST点 设置 ST 计算的 ISO 和 ST 点
	int Send_CMDSTISO(UINT16 iso, UINT16 st);

	//心率计算通道 选择心率计算为通道 1 或通道 2
	int Send_CMD_ECGChannel(UINT8 data);

	//心率重新计算 重新计算心率
	int Send_CMD_ECGLearn();

	//呼吸增益 设置呼吸增益为：× 0.25、× 0.5、×1、× 2、× 4
	int Send_CMD_RESPGain(UINT8 data);

	//窒息报警时间 设 置 呼 吸 窒 息 的 报 警 延 迟 时 间 ：10s～40s
	int Send_CMD_APNEAAlm(UINT8 data);

	//体温探头类型 设置体温探头的类型： YSI / CY - F1
	int Send_CMD_TempType(UINT8 data);

	//SPO2 设置  设置 SPO2 的测量灵敏度
	int Send_CMD_SPO2(UINT8 data);

	//NBP 启动手动 / 自动测量
	//启动一次血压手动测量或自动测量
	int Send_CMD_NBPStart();

	// NBP 中止测量 结束当前的测量
	int Send_CMD_NBPEnd();

	// NBP 测量周期 设置血压自动测量的周期
	int Send_CMD_NBPPeriod(UINT8 data);

	//NBP 校准  血压进入校准状态
	int Send_CMD_NBPCal();

	//NBP 复位  软件复位血压模块
	int Send_CMD_NBPReset();

	//NBP 漏气检测 血压气路进行漏气检测
	int Send_CMD_NBPPneumatic();

	//NBP 查询状态  查询血压模块的状态
	int Send_CMD_NBPPollState();

	//NBP 设置初次充气压力  设置下次血压测量的首次充气压力
	int Send_CMD_NBPPrePressure(UINT8 type, UINT8 press);

	//NBP 启动 STAT 测量 开始 5 分钟的 STAT 血压测量
	int Send_CMD_NBPContiune();

	//NBP 查询测量结果
	int Send_CMD_NBPGetResult();


	virtual int Run();
	int m_i32Exit;
	//	CClientSock m_Conn;
private:

	//	QMutex QMutexRev;
	unsigned char m_u8RevBuff[REV_BUFF_LENGTH];
	unsigned short int m_u16RevBuffR, m_u16RevBuffW, m_u16RevBuffLength;
	//	QMutex QMutexSend;
	unsigned char m_u8SendBuff[SEND_BUFF_LENGTH];
	unsigned short int m_u16SendBuffR, m_u16SendBuffW, m_u16SendBuffLength;
	void ACKAdd(char ID, char Status);
	void AddAck();
	void Adjust_RevBuff_RLength(unsigned short int);
	void err_check();
	void do_send_data();
	int m_i32CmdAckFlag;
	Uart *m_pUart;

	struct ECG_DATA m_stRevECGData;
	struct RESP_DATA m_stRevRespData;
	struct OXY_DATA m_stRevOxyData;

	CString m_csIP;
	UINT m_u32Port;
	int m_i32NetFlag;



	struct CMD_TEST_NET m_stCMD_TEST_NET;
	int m_i32CMD_TEST_NET;
	int m_i32CMD_TEST_NETResult;
	CCriticalSection m_CSCMD_TEST_NET;

	SCommand m_stSCommand[SCOMMAND_LENGTH];
	int m_i32SCommandR, m_i32SCommandW, m_i32SCommandL;
	UINT32 u32SendCmdTime;
	UINT8 m_u8SendCmdBuf[64], m_u8SendCmdLength, m_u8SendCmdType, m_i32SendCurIndex, m_u8Timeout, m_u8SendAckFlag, m_u8SendEndFlag;
	CCriticalSection m_csSendCmd;
};


