⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecg_1dlg.cpp

📁 一个开源的心电图测量仪驱动和应用软件,可记录
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ECG_1Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "ECG_1.h"
#include "ECG_1Dlg.h"
#include "MCP3002.h"
#include "DSP_Filter.h"
#include "Ecg_Draw.h"
#include "Statistic_View.h"
#include "ECG_Data.h"
#include "DlgVeloTest.h"
#include "DlgConfirm.h"
#include "DlgPulseMeter.h"
#include "DSP_ECG.h"
#include "Person.h"
#include "Ecg_Info.h"
#include "DlgDSPAll.h"

#include "DlgPersonal.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

UINT SmplProcess(LPVOID param)
{
	CECG_1Dlg* dlg = (CECG_1Dlg*) param;
	int p_DX,p_DY = 0;
	
	CRect rcClient;
	CRect Progress;

	dlg->GetClientRect(rcClient);

	p_DX = 55 + rcClient.Width()/2;
	p_DY = 60 + rcClient.bottom/2;

	//Move the progres windoe to the center of the dialog
	//then recize it to be 300x40 points
	Progress.SetRect(p_DX-150,p_DY-20,
		p_DX+150,p_DY+20);
	dlg->m_ctlSampling.MoveWindow(Progress,TRUE);
	dlg->m_ctlSampling.SetPos(0);
	for(int i=1;i<21;i++)
	{
		dlg->m_ctlSampling.SetPos(i);
		Sleep(450);		
		//if start stop is =0 we must stop the procrs control
		if(dlg->b_start_stop==0)
		{
			i=21;
		}
	}
	dlg->m_ctlSampling.MoveWindow(0,0,0,0);
	return 0;
}

static void EndSampleNotification(void* obj,unsigned short *ch_0,unsigned short *ch_1,int lenght,CTime start,CTime end);


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	afx_msg void OnBok();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)

	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}
void CAboutDlg::OnBok() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg::OnOK();
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	ON_BN_CLICKED(IDC_BOK, OnBok)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CECG_1Dlg dialog

CECG_1Dlg::CECG_1Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CECG_1Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CECG_1Dlg)
	m_bmppos = 0;
	m_sComment = _T("");
	m_b50hz = FALSE;
	m_b60hz = FALSE;
	m_b40hzlol = FALSE;
	m_bw50noht = FALSE;
	m_bw45low = FALSE;
	m_bw067hz = FALSE;
	m_select_segment = -1;
	m_srecord = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CECG_1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CECG_1Dlg)
	DDX_Control(pDX, IDC_BCORECT, m_ctlcorect);
	DDX_Control(pDX, IDC_LDATA, m_ctldata);
	DDX_Control(pDX, IDC_BRECORD, m_ctlRecord);
	DDX_Control(pDX, IDC_SLIDBMP, m_ctlBmp);
	DDX_Control(pDX, IDC_PSAMPLING, m_ctlSampling);
	DDX_Slider(pDX, IDC_SLIDBMP, m_bmppos);
	DDX_Text(pDX, IDC_ECOMMENT, m_sComment);
	DDX_Check(pDX, IDC_C50HZ, m_b50hz);
	DDX_Check(pDX, IDC_C60HZ, m_b60hz);
	DDX_Check(pDX, IDC_C40LOL, m_b40hzlol);
	DDX_Check(pDX, IDC_CW50HZ, m_bw50noht);
	DDX_Check(pDX, IDC_CW40HZ, m_bw45low);
	DDX_Check(pDX, IDC_CW067, m_bw067hz);
	DDX_Radio(pDX, IDC_RADIO1, m_select_segment);
	DDX_Text(pDX, IDC_SRECORDS, m_srecord);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CECG_1Dlg, CDialog)
	//{{AFX_MSG_MAP(CECG_1Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BRECORD, OnBrecord)
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDC_BSHOWBMP, OnBshowbmp)
	ON_BN_CLICKED(IDC_BTEST, OnBtest)
	ON_BN_CLICKED(IDC_BINVERTECG, OnBinvertecg)
	ON_BN_CLICKED(IDC_BLOW, OnBlow)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BPRINT, OnBprint)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BDELTA, OnBdelta)
	ON_BN_CLICKED(IDC_BDELTA2, OnBdelta2)
	ON_BN_CLICKED(IDC_BDELTAREVERSE, OnBdeltareverse)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BDELTAREVERSE2, OnBdeltareverse2)
	ON_LBN_SELCHANGE(IDC_LDATA, OnSelchangeLdata)
	ON_BN_CLICKED(IDC_BCORECT, OnBcorect)
	ON_COMMAND(ID_FILE_EXIT, OnFileExit)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	ON_COMMAND(ID_INFO_ECG, OnInfoEcg)
	ON_COMMAND(ID_INFO_PERSONAL, OnInfoPersonal)
	ON_BN_CLICKED(IDC_BSAVEBMP, OnBsavebmp)
	ON_COMMAND(ID_INFO_CONFIRM, OnInfoConfirm)
	ON_WM_CONTEXTMENU()
	ON_BN_CLICKED(IDC_BRECALCALL, OnBrecalcall)
	ON_BN_CLICKED(IDC_BEXIT, OnBexit)
	ON_COMMAND(ID_HELP_ABOUTECG1, OnHelpAboutecg1)
	ON_BN_CLICKED(IDC_BWFLOW, OnBwflow)
	ON_BN_CLICKED(IDC_BWFNOHT50HZ, OnBwfnoht50hz)
	ON_BN_CLICKED(IDC_BWFLOW40HZ, OnBwflow40hz)
	ON_COMMAND(ID_DSP_NOHT50HZ, OnDspNoht50hz)
	ON_COMMAND(ID_DSP_LOW100HZ, OnDspLow100hz)
	ON_COMMAND(ID_DSP_HIGH0025HZ, OnDspHigh0025hz)
	ON_COMMAND(ID_DSP_ECGANALYSIS, OnDspEcganalysis)
	ON_COMMAND(ID_DSP_LOW40HZ, OnDspLow40hz)
	ON_BN_CLICKED(IDC_BSAVEBMP2, OnBsavebmp2)
	ON_BN_CLICKED(IDC_C50HZ, OnC50hz)
	ON_BN_CLICKED(IDC_C60HZ, OnC60hz)
	ON_BN_CLICKED(IDC_C40LOL, OnC40lol)
	ON_BN_CLICKED(IDC_CW50HZ, OnCw50hz)
	ON_BN_CLICKED(IDC_CW40HZ, OnCw40hz)
	ON_BN_CLICKED(IDC_CW067, OnCw067)
	ON_BN_CLICKED(IDC_BAMPL, OnBampl)
	ON_BN_CLICKED(IDC_BDSPALL, OnBdspall)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_ECGINFO_PERSONAL, OnInfoPersonal)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio1)
	ON_BN_CLICKED(IDC_BECGPRINT, OnBecgprint)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CECG_1Dlg message handlers

BOOL CECG_1Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	//Make dlg_pulse_meter modless
	dlg_pulse_meter.Create(IDD_DPULSEMETER,this);
	//set bool variable to show our program that dlg_pulse_meter is closed
	b_dlgPulseMeter = 0;
	//
	dlg_pulse_meter.s_CurrPulse = "0";
	dlg_pulse_meter.s_PastPulse = "0";


	//Calculate win-syncc filter kernels
	//for sampling rate 500hz
	dsp_flf.LoadFilterKernels(500);
	i_fsmpl = 500;
	//////////////////////////////
	m_select_segment = 3;

	//Sets the filter defaut
	m_b50hz=1;
	m_b40hzlol=1;
	s_filter_input = "";
	//Set BMP view type to view ECG records
	i_bmp = 0;
	
	m_ctlSampling.SetRange(0,20);
	m_ctlBmp.SetRange(0,4);
	s_ECG_Info = "QRS ?";
	i_old_ctldata_index = 0;
	GetDlgItem(IDC_BCORECT)->EnableWindow(FALSE);
	//set the start stop variable to be stopped
	b_start_stop = 0;
	//Set the QRS measurement variables
	i_QRS_count=0;
	i_QRS_ms=0;
	i_PR_ms=0;
	i_QT_QTc_ms=0;
	hh = 0;
	mm = 0;
	//Must be done this initialization
	TStart = 0;
	///////////////////////////////////
	ZeroArr(AR_ECG,5000);
	ZeroArr(AR_REV,5000);
	m_sComment = "";
	//Unvisible sampling process control
	m_ctlSampling.MoveWindow(0,0,0,0);
	UpdateData(false);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CECG_1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CECG_1Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
		//redraw BMP with ECG
		if(i_bmp==0)
			OnButton1();
		//else draw statistical info
		if(i_bmp==1)
			OnButton3();

	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CECG_1Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CECG_1Dlg::OnBrecord() 
{
	// TODO: Add your control notification handler code here
	//Before starting sampling deletes previous AR_ECG and AR__REV
	//function is stopped
	UpdateData(true);
	if(b_start_stop == 0)
	{
		//Open dialog to show measured pulse

		ShowPulseDialog();
		//Start sampling process
		StartSampling();
	}
	//function is active
	else
	{
		StopSampling();
		//close pulse dialog if it was created
		HidePulseDialog();
	}

}

void EndSampleNotification(void* obj,unsigned short *ch_0,unsigned short *ch_1,int lenght,CTime start,CTime end)
{
	CECG_1Dlg* dlg = (CECG_1Dlg*) obj;
	dlg->TStart = start;
	dlg->s_ECG_Info.Format("%d:%d",start.GetHour(),
		start.GetMinute());
	dlg->hh = start.GetHour();
	dlg->mm = start.GetMinute();
	
	//filtering and copying
	dlg->CopyFromSample(ch_0,ch_1,lenght);
	//First we need to copy sampled arrays in to a program arrays
	//if start stop flag is =1 then after conversion set window text
	//to show that we can make a new conversion
	if(dlg->b_start_stop == 1)
	{
		//Copy sampled data in to the ECG_DATA class 
		dlg->SetData(dlg->AR_ECG,2500);
		
		dlg->m_ctldata.AddString(dlg->s_ECG_Info);
		//Show pulse on pulse meter dialog
		dlg->ShowCurrPulse(dlg->m_ctldata.GetCount());
		dlg->StartSampling();	
	}
	if(dlg->b_start_stop == 0)
	{
	//	dlg->b_start_stop = 0;
		dlg->m_ctlRecord.SetWindowText("Star Record");
		dlg->m_ctldata.AddString(dlg->s_ECG_Info);
	}
}

void CECG_1Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData(true);
	OnButton1();
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CECG_1Dlg::CopyFromSample(unsigned short *ar0, unsigned short *ar1, int lenght)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -