www.pudn.com > Observerwangdxh.zip > HRateMon.cpp


// HRateMon.cpp : implementation of the CHeartRateMonitor class 
// 
#include "stdafx.h" 
#include "HRateMon.h" 
#include  
 
// List of predefined constants 
#define ID_HEART_RATE_METER 0x12345 
 
// Structure for heart rate definition 
typedef struct tagHeartRate 
{ 
	INT	nFromAge; 
	INT nToAge; 
	INT nMinValue; 
	INT nThresholdValue; 
	INT nMaxValue; 
}HEARTRATE, * LPHEARTRATE, **LPPHEARTRATE; 
 
///////////////////////////////////////////////////////////////////////////// 
// CHeartRateMonitor message handlers 
 
BEGIN_MESSAGE_MAP(CHeartRateMonitor, CCardioMonitor) 
	//{{AFX_MSG_MAP(CTimeMonitor) 
		ON_WM_PAINT() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
CHeartRateMonitor::CHeartRateMonitor( CCardioSubject * pCardioSubject ) : CCardioMonitor( pCardioSubject ) 
{ 
	// Step 1 - Initialize class members 
	m_nAge		= m_pCardioSubject->GetAge(); 
	m_csProgram = m_pCardioSubject->GetProgram(); 
	m_nLevel	= m_pCardioSubject->GetLevel(); 
	// Step 2 - Based on Age and Program initialize min, threshold and max heartrate value 
	InitializeHeartRate(); 
} 
 
CHeartRateMonitor::~CHeartRateMonitor() 
{ 
} 
 
BOOL CHeartRateMonitor::Update( CSubject * pSubject ) 
{ 
	// Step 1 - Make sure the right subject updates the heartrate meter 
	if( m_pCardioSubject != pSubject ) 
	{ 
		return FALSE; 
	} 
	// Step 2 - Set heart rate if the program changes 
	CString csProgram = m_pCardioSubject->GetProgram(); 
	if( csProgram != m_csProgram ) 
	{ 
		m_csProgram	= csProgram; 
		InitializeHeartRate(); 
	} 
	else 
	{ 
		m_csProgram	= csProgram; 
	} 
	// Step 3 - Get age and level 
	m_nAge		= m_pCardioSubject->GetAge(); 
	m_nLevel	= m_pCardioSubject->GetLevel(); 
	// Step 4 - Get heart rate, if the meter is running 
	if( m_bStarted == TRUE ) 
	{ 
		LONG lHeartRate = GetHeartRate(); 
		CHAR szText[ 512 ]; 
 
		INT nPercent = ( INT )( ( ( double ) ( lHeartRate - m_nMinValue ) ) /  
						( double ) ( m_nMaxValue - m_nMinValue ) * 100 ); 
		// Step 5 - Beep to indicate very low or high heart rate 
		if( lHeartRate < m_nMinValue ) 
		{ 
			MessageBeep( 0xFFFFFFFF ); 
			nPercent = 0; 
		} 
		if( lHeartRate > m_nMaxValue ) 
		{ 
			MessageBeep( 0xFFFFFFFF ); 
			nPercent = 100; 
		} 
		memset( szText, 0, sizeof( szText ) ); 
		sprintf( szText, "Heart Rate = %ld (%d%%)", lHeartRate, nPercent ); 
		m_HeartRateMeter.SetText( szText ); 
		m_HeartRateMeter.SetPos( nPercent ); 
	} 
	// Step 6 - Update the window with the new information 
	Invalidate(); 
	return TRUE; 
} 
 
BOOL CHeartRateMonitor::Create( const RECT & rRect, CWnd * pParentWnd, UINT nID ) 
{ 
	// Step 1 - Adjust Rectangle 
	CRect WndRect = CRect( rRect.left, rRect.top, rRect.left + 490, rRect.top + 120 ); 
	CRect ClientRect; 
 
	// Step 2 - Create window 
	CWnd::Create( NULL, NULL, WS_VISIBLE | WS_BORDER | WS_CHILD | WS_TABSTOP,  
		WndRect, pParentWnd, nID ); 
 
	// Step 3 - Create heart rate meter 
	GetClientRect( ClientRect ); 
 
	CRect HeartRateMeterRect = CRect( ClientRect.left + 20, ClientRect.top + 60, ClientRect.right - 20, ClientRect.top + 80 ); 
	m_HeartRateMeter.Create( NULL, "0",  WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,  
		HeartRateMeterRect, ( CWnd * ) this, ID_HEART_RATE_METER ); 
	// Step 4 - Set default display 
	CHAR szText[ 512 ]; 
 
	memset( szText, 0, sizeof( szText ) ); 
	sprintf( szText, "Heart Rate = 0 (0%%)" ); 
	m_HeartRateMeter.SetText( szText ); 
	return TRUE; 
} 
 
void CHeartRateMonitor::OnPaint()  
{ 
	CRect		ClientRect; 
	CRect		DrawRect; 
	CRect		TitleRect; 
	CHAR		szTitle[ 512 ]; 
	CHAR		szHeartRateValue[ 512 ]; 
 
	CPaintDC dc(this); 
 
	// Step 1 - Set background color and mode 
	GetClientRect( ClientRect ); 
	dc.FillSolidRect( ClientRect, RGB( 255, 255, 0 ) ); 
	TitleRect = CRect( ClientRect.left, ClientRect.top, ClientRect.right, ClientRect.top + 30 ); 
	dc.FillSolidRect( TitleRect, RGB( 0, 128, 128 ) ); 
	dc.SetBkMode( TRANSPARENT ); 
	 
	// Step 2 - Set the title color and text 
	dc.SetTextColor( RGB( 255, 255, 255 ) ); 
	DrawRect = CRect( ClientRect.left, ClientRect.top + 5, ClientRect.right, ClientRect.top + 45 ); 
	memset( szTitle, 0, sizeof( szTitle ) ); 
	sprintf( szTitle, "HeartRate Monitor : Program - %s and Level - %d", m_csProgram, m_nLevel ); 
	dc.DrawText( szTitle, strlen( szTitle ), DrawRect, DT_CENTER | DT_WORDBREAK ); 
 
	// Step 3 - Set the min, threshold and max values 
	dc.SetTextColor( RGB( 0, 0, 0 ) ); 
	DrawRect = CRect( ClientRect.left, ClientRect.top + 85, ClientRect.right, ClientRect.top + 125 ); 
	memset( szHeartRateValue, 0, sizeof( szHeartRateValue ) ); 
	sprintf( szHeartRateValue, "     Min - %.3d                          Threshold - %.3d                              Max - %.3d",  
		m_nMinValue, m_nThresholdValue, m_nMaxValue ); 
	dc.DrawText( szHeartRateValue, strlen( szHeartRateValue ), DrawRect, DT_LEFT | DT_WORDBREAK ); 
} 
 
LONG CHeartRateMonitor::GetHeartRate() 
{ 
	// Step 1 - Generate random no. to get the heartrate 
	LONG lHeartRate = m_nMinValue + ( rand() % ( m_nMaxValue - m_nMinValue ) ); 
	// Step 2 - Adjust the heart rate, to simulate the extreme conditions 
	// when heart rate falls in that area 
	if( lHeartRate - m_nMinValue < 5 ) 
	{ 
		lHeartRate -= rand() % 5; 
	} 
	if( m_nMaxValue - lHeartRate < 5 ) 
	{ 
		lHeartRate += rand() % 5; 
	} 
	return lHeartRate; 
} 
 
VOID CHeartRateMonitor::Stop() 
{ 
	// Step 1 - Set default display 
	CHAR szText[ 512 ]; 
 
	memset( szText, 0, sizeof( szText ) ); 
	sprintf( szText, "Heart Rate = 0 (0%%)" ); 
	m_HeartRateMeter.SetText( szText ); 
	m_HeartRateMeter.SetPos( 0 ); 
	// Step 2 - Set m_bStarted to FALSE 
	m_bStarted = FALSE; 
} 
 
BOOL CHeartRateMonitor::InitializeHeartRate() 
{ 
	// Assign some arbitary heart rate 
	static HEARTRATE sbFatburn[ 7 ] = 
	{ 
		{ 10, 20, 105, 110, 115 }, 
		{ 21, 30, 110, 115, 120 }, 
		{ 31, 40, 115, 120, 125 }, 
		{ 41, 50, 120, 125, 130 }, 
		{ 51, 60, 115, 120, 125 }, 
		{ 61, 70, 110, 115, 120 }, 
		{ 71, 100, 105, 110, 115 } 
	}; 
 
	static HEARTRATE sbCardio[ 7 ] =  
	{ 
		{ 10, 20, 115, 120, 125 }, 
		{ 21, 30, 120, 125, 130 }, 
		{ 31, 40, 125, 130, 135 }, 
		{ 41, 50, 130, 135, 140 }, 
		{ 51, 60, 125, 130, 135 }, 
		{ 61, 70, 120, 125, 130 }, 
		{ 71, 100, 115, 120, 125 } 
	}; 
	INT nIndex = 0; 
 
	// Step 1 - Assign min, max and threshold heart rates based on  
	// the program 
	if( m_csProgram.CompareNoCase( "Fatburn" ) == 0 ) 
	{ 
		for( nIndex = 0; nIndex < 7; nIndex++ ) 
		{ 
			if( m_nAge >= sbFatburn[ nIndex ].nFromAge  &&  
				m_nAge <= sbFatburn[ nIndex ].nToAge ) 
			{ 
				m_nMinValue			= sbFatburn[ nIndex ].nMinValue; 
				m_nThresholdValue	= sbFatburn[ nIndex ].nThresholdValue; 
				m_nMaxValue			= sbFatburn[ nIndex ].nMaxValue; 
				break; 
			} 
		} 
	} 
	else 
	{ 
		for( nIndex = 0; nIndex < 7; nIndex++ ) 
		{ 
			if( m_nAge >= sbCardio[ nIndex ].nFromAge  &&  
				m_nAge <= sbCardio[ nIndex ].nToAge ) 
			{ 
				m_nMinValue			= sbCardio[ nIndex ].nMinValue; 
				m_nThresholdValue	= sbCardio[ nIndex ].nThresholdValue; 
				m_nMaxValue			= sbCardio[ nIndex ].nMaxValue; 
				break; 
			} 
		} 
	} 
	return TRUE; 
}