#pragma once
#include <list>
using namespace std;
#include "Data.h"

#define REC_FORWARD				1
#define REC_BACKWARD			2
#define REC_CURRENT				3

#define GET_ALM_SELECT			1
#define GET_ALM_PRE				2
#define GET_ALM_NEXT			3
#define GET_ALM_CLOSE_SELECT	5



#define SAVE_ALM_ECGWAVE_LENGTH     (10*500)
#define SAVE_ALM_RESPWAVE_LENGTH     (10*125)
#define SAVE_ALM_SPO2WAVE_LENGTH     (10*125)

#define RESULT_HR                   1
#define RESULT_ST1                   2
#define RESULT_ST2                   3
#define RESULT_PVCS                   4
#define RESULT_RR                   5
#define RESULT_SPO2                   6
#define RESULT_PR                   7
#define RESULT_TEMP                   8



#define SYSTEM_DATA_POWON       1




struct SAVE_DATA_FILE_HEAD
{
	TCHAR cMagic[8];
	TCHAR cVersion[8];
	TCHAR cCreateFileDate[32];
	TCHAR cModifyFileDate[32];
	TCHAR cPat[32];
	UINT u32FileW;
	UINT u32Length;

};




struct SAVE_ALM_FILE_HEAD
{
	char cVersion[4];
	char cCreateFileDate[32];
	char cModifyFileDate[32];
	char cPat[32];
	UINT u32FileW;
	UINT u32Length;

};




struct ECG_ALM_DATA
{
	UINT16 u16HR;
	UINT16 u16ST1;
	UINT16 u16ST2;
	char cECGWave[SAVE_ALM_ECGWAVE_LENGTH];
};



struct RESP_ALM_DATA
{
	UINT16 u16RR;
	char cRespWave[SAVE_ALM_RESPWAVE_LENGTH];
};


struct SPO2_ALM_DATA
{
	UINT16 u16Spo2;
	UINT16 u16PR;
	char cSpo2Wave[SAVE_ALM_SPO2WAVE_LENGTH];
};


struct TEMP_ALM_DATA
{
	UINT16 u16Temp;
};



struct NIBP_RESULT
{
	char cTime[20];
	char cPat[16];
	UINT16 u16No;
	UINT16 u16SYS;
	UINT16 u16MEAN;
	UINT16 u16DIA;
};

struct RESULT_DATA
{
	char cTime[20];
	INT16 i16HR;
	INT16 i16ST1;
	INT16 i16ST2;
	INT16 i16PVCs;
	INT16 i16RR;
	INT16 i16Spo2;
	INT16 i16PR;
	INT16 i16Temp;
};



struct ALM_SHOW
{
	char cDate[16];
	char cTime[16];
	UINT16 u16Type;
	UINT16 u16SubType;
	UINT16 u16AlmValue;
	UINT16 u16Level;
};


// CThreadDataAlmRec

class CThreadDataAlmRec : public CWinThread
{
	DECLARE_DYNCREATE(CThreadDataAlmRec)

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

public:
	//数据实时保存 初始化
	INT Init_Save_Data();
	//检查实时数据文件是否完整
	INT  Check_Save_Data_File();
	//复位实时数据文件
	INT  Reset_Save_Data_File();
	//提交一份实时数据 保存项
	INT Save_Data(struct SAVE_DATA * st);
	//获得一份实时数据
	INT Get_Data(struct SAVE_DATA * st);
	//进行实时数据保存
	INT Do_Save();
	//从实时数据保存的文件中 读出一份数据
	INT Do_Get();



	//血压实时保存 初始化
	INT Init_Save_NIBP();
	//检查实时血压文件是否完整
	INT  Check_Save_NIBP_File();
	//复位实时数据文件
	INT  Reset_Save_NIBP_File();
	//提交一份血压数据 保存项
	INT Save_NIBP(struct NIBP_DATA * st);
	//获得一份血压数据
	INT Get_NIBP(INT dir);
	//进行血压数据保存
	INT Do_Save_NIBP();
	//从血压数据保存的文件中 读出一份数据
	INT Do_Get_NIBP();

	


	//系统 信息 保存 初始化
	INT Init_Save_Sys();
	//检查实时系统 信息文件是否完整
	INT  Check_Save_Sys_File();
	//复位系统 信息文件
	INT  Reset_Save_Sys_File();
	//提交一份系统 信息数据 保存项
	INT Save_Sys(struct SYS_DATA * st);
	//获得一份系统 信息数据
	INT Get_Sys(INT dir);
	//进行系统 信息数据保存
	INT Do_Save_Sys();
	//从系统 信息数据保存的文件中 读出一份数据
	INT Do_Get_Sys();

	//报警 信息 保存 初始化
	INT Init_Save_Alm();
	//检查报警 信息文件是否完整
	INT  Check_Save_Alm_File();
	//复位报警 信息文件
	INT  Reset_Save_Alm_File();
	//提交一份报警 信息数据 保存项
	INT Alm_Save(struct SAVE_ALM *st);
	//获得一份报警 信息数据
	INT Get_Alm(struct ALM_SEARCH_PARA *s_para);
	

	//结果 信息 保存 初始化
	INT Init_Save_Result();
	//检查结果 信息文件是否完整
	INT  Check_Save_Result_File();
	//复位结果 信息文件
	INT  Reset_Save_Result_File();
	//提交一份结果 信息数据 保存项
	INT Result_Save(struct SAVE_RESULT_PARA *st);
	//获得一份结果 信息数据
	INT Get_Result(struct SELECT_RESULT_PARA *s_para);


	//将开机时间 保存
	INT Add_Sys_PowerON();

	virtual BOOL InitInstance();
	virtual int ExitInstance();
	virtual int Run();
	int m_i32Exit;

	//测量结果实时保存
	INT Reset_Result_Data();
	INT Save_Result_Data(struct RESULT_DATA *st);
	INT Get_Result_Data(UINT offset, UINT type, UINT time, UINT length);
	INT Do_Result_Data_Save();
	INT Do_Result_Data_Get();

	//实时数据保存文件 正确操作标识 1为 文件操作出现异常
	INT m_i32FileFlag;
	//实时数据保存文件 头部 更新 标识 每隔几个点进行一次flash更新
	INT m_i32FileHeadFlag;
	//存储数据文件的读写地址
	UINT m_u32SaveDataFileW, m_u32SaveDataFileR, m_u32SaveDataFileLength, m_u32SaveDataSecLength;
	//实时数据读写 缓冲区
	UCHAR *m_pSaveDataBuff;
	////实时数据保存文件 的 文件头部
	struct SAVE_DATA_FILE_HEAD stSaveDataFileHead1, stSaveDataFileHead2;
	//实时数据 保存 队列 先进先出，需要保存到文件的实时数据 保存在队列中
	list<struct SAVE_DATA> m_stlSaveData;
	//实时数据 读取 队列 先进先出，保存读取结果的 结构体指针 存储在队列中
	list<struct SAVE_DATA*> m_pstlGetSaveData;
	CFile m_FSaveData;
	CCriticalSection m_CSSaveData;

	//血压数据保存文件 正确操作标识 1为 文件操作出现异常
	INT m_i32NIBPFileFlag;
	//血压数据保存文件 头部 更新 标识 每隔几个点进行一次flash更新
	INT m_i32NIBPFileHeadFlag;
	//存储数据文件的读写地址
	UINT m_u32SaveNIBPFileW, m_u32SaveNIBPFileR, m_u32SaveNIBPFileLength, m_u32SaveNIBPSecLength, m_u32SaveNIBPReadNum;
	//读取 操作 的 状态
	UINT8 m_u8GetNIBPFlag;
	//血压数据读写 缓冲区
	UCHAR *m_pSaveNIBPBuff;
	//进行 读取数据 的 窗口 指针
	CWnd *wndSaveNIBP;
	struct SAVE_DATA_FILE_HEAD stSaveNIBPFileHead1, stSaveNIBPFileHead2;
	list<struct NIBP_DATA> m_stlSaveNIBP;
	list<struct NIBP_DATA> m_stlGetNIBP;
	CFile m_FSaveNIBP;
	CCriticalSection m_CSSaveNIBP;

	//系统信息数据保存文件 正确操作标识 1为 文件操作出现异常
	INT m_i32SysFileFlag;
	//系统信息数据保存文件 头部 更新 标识 每隔几个点进行一次flash更新
	INT m_i32SysFileHeadFlag;
	//存储数据文件的读写地址
	UINT m_u32SaveSysFileW, m_u32SaveSysFileR, m_u32SaveSysFileLength, m_u32SaveSysSecLength, m_u32SaveSysReadNum;
	//读取 操作 的 状态
	UINT8 m_u8GetSysFlag;
	//系统信息数据读写 缓冲区
	UCHAR *m_pSaveSysBuff;
	//进行 读取数据 的 窗口 指针
	CWnd *wndSaveSys;
	//系统信息数据保存文件 的 文件头部
	struct SAVE_DATA_FILE_HEAD stSaveSysFileHead1, stSaveSysFileHead2;
	list<struct SYS_DATA> m_stlSaveSys;
	list<struct SYS_DATA> m_stlGetSys;
	CFile m_FSaveSys;
	CCriticalSection m_CSSaveSys;

	//报警数据 中 心电波、呼吸、血氧波 的长度
	static INT m_i32SaveAlmECGWaveLength, m_i32SaveAlmRespWaveLength, m_i32SaveAlmPlethWaveLength;
	//报警数据保存文件 正确操作标识 1为 文件操作出现异常
	INT m_i32AlmFileFlag;
	//报警数据保存文件 头部 更新 标识 每隔几个点进行一次flash更新
	INT m_i32AlmFileHeadFlag;
	//存储数据文件的读写地址
	UINT m_u32SaveAlmFileW, m_u32SaveAlmFileR, m_u32SaveAlmFileSelect, m_u32SaveAlmFileLength, m_u32SaveAlmSecLength, m_u32SaveAlmInfoLength, m_u32SaveAlmReadNum;
	UINT8 m_u8GetAlmFlag;
	//第一次 select 是否 找到 一个 符合条件 的报警项
	UINT8 m_u8SelectAlmFlag;
	///报警数据数据读写 缓冲区
	UCHAR *m_pSaveAlmBuff;
	CWnd *wndSaveAlm;
	//报警数据保存文件 的 文件头部
	struct SAVE_DATA_FILE_HEAD stSaveAlmFileHead1, stSaveAlmFileHead2;
	list<struct SAVE_ALM> m_stlSaveAlm;
	struct ALM_SEARCH_PARA m_stAlmPara;
	struct SAVE_ALM m_stGetAlm;
	//内存中的报警 Info部分 用来 报警项 查找
	struct SAVE_ALM_FILE_INFO *m_stpSAVE_ALM_FILE_INFO;
	CFile m_FSaveAlm;
	//在正在进行 报警回顾 操作
	INT m_i32AlmGetFlag;
	INT m_i32AlmSelectClose;
	//
	//UCHAR *m_pAlmInfoBuffSelect, *m_pAlmInfoBuffWrite;
	CCriticalSection m_CSSaveAlm;



	INT m_i32ResultFileFlag;
	INT m_i32ResultFileHeadFlag;
	//存储数据文件的读写地址
	UINT m_u32SaveResultFileW, m_u32SaveResultFileR, m_u32SaveResultFileLength, m_u32SaveResultSecLength, m_u32SaveResultReadNum;
	UINT8 m_u8GetResultFlag;
	UCHAR *m_pSaveResultBuff;
	CWnd *wndSaveResult;
	struct SAVE_DATA_FILE_HEAD stSaveResultFileHead1, stSaveResultFileHead2;
	//list<struct NIBP_DATA> m_stlSaveResult;
	//list<struct NIBP_DATA> m_stlGetResult;
	CFile m_FSaveResult;
	CCriticalSection m_CSSaveResult;


	//回顾 各项 的 长度
	static UINT m_u32SaveDataFileItemLength;
	static UINT m_u32SaveNIBPFileItemLength;
	static UINT m_u32SaveSysFileItemLength;
	static UINT m_u32SaveAlmFileItemLength;

private:
	
	//搜索符合条件的报警项
	INT Find_Alm(struct ALM_SEARCH_PARA *st);
	//搜索报警
	INT Select_Alm(struct ALM_SEARCH_PARA *st);
	//获得上一项符合条件的报警项
	//如果没有上一项，则返回当前项
	INT Do_Get_Alm_Pre(struct ALM_SEARCH_PARA *st);
	//获得下一项符合条件的报警项
	//如果没有下一项，则返回当前项
	INT Do_Get_Alm_Next(struct ALM_SEARCH_PARA *st);
	//读取已经记录的报警 信息
	INT Read_Alm();
	//写入报警，更新报警信息记录
	INT Write_ALM(struct SAVE_ALM *st);
	//进行报警 信息数据保存
	INT Do_Alm_Save();
	//从报警 信息数据保存的文件中 读出一份数据
	INT Do_Get_Alm();
	//进行 报警保存记录数据 的拷贝
	void Copy_SAVE_ALM(struct SAVE_ALM *dst, struct SAVE_ALM *sst);

protected:
	DECLARE_MESSAGE_MAP()

	
};


