📄 ecg_1dlg.cpp
字号:
// 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 + -