www.pudn.com > wince_LED.rar > LED_INTDlg.cpp


// LED_INTDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "LED_INT.h" 
#include "LED_INTDlg.h" 
#include "pm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLED_INTDlg dialog 
 
CLED_INTDlg::CLED_INTDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CLED_INTDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CLED_INTDlg) 
	m_DispBuf = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CLED_INTDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CLED_INTDlg) 
	DDX_Text(pDX, IDC_DISP, m_DispBuf); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CLED_INTDlg, CDialog) 
	//{{AFX_MSG_MAP(CLED_INTDlg) 
	ON_BN_CLICKED(IDC_OPEN, OnOpen) 
	ON_BN_CLICKED(IDC_CLOSE, OnClose) 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_SYSTEM_SLEEP, OnSystemSleep) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLED_INTDlg message handlers 
 
BOOL CLED_INTDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// 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 
	 
	CenterWindow(GetDesktopWindow());	// center to the hpc screen 
 
	// TODO: Add extra initialization here 
	hMouse=NULL; 
	BOOL	RetValue = TRUE; 
 
	/* IO Register Allocation */ 
 
	v_pIOPregs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS); 
	if (v_pIOPregs == NULL)  
	{ 
		AfxMessageBox(TEXT("For IOPregs : VirtualAlloc failed!")); 
		RetValue = FALSE; 
	} 
	else  
	{ 
		if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(IOP_BASE), sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE))  
		{ 
			AfxMessageBox(TEXT("For IOPregs: VirtualCopy failed!")); 
			RetValue = FALSE; 
		} 
	} 
	 
	if (!RetValue)  
	{ 
		if (v_pIOPregs)  
		{ 
			VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE); 
		} 
 
		v_pIOPregs = NULL; 
	} 
	   
	else RETAILMSG (1, (TEXT(":::InitializeAddresses - Success\r\n") )); 
	s2410LCD = (volatile LCDreg *)VirtualAlloc(0, sizeof(LCDreg), MEM_RESERVE, PAGE_NOACCESS); 
	if (v_pIOPregs == NULL)  
	{ 
		ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n"))); 
		RetValue = FALSE; 
	} 
	else  
	{ 
		if (!VirtualCopy((PVOID)s2410LCD, (PVOID)(LCD_BASE), sizeof(s2410LCD), PAGE_READWRITE | PAGE_NOCACHE))  
		{ 
			ERRORMSG(1,(TEXT("For s2410LCD: VirtualCopy failed!\r\n"))); 
			RetValue = FALSE; 
		} 
	} 
	 
	if (!RetValue)  
	{ 
//		RETAILMSG (1, (TEXT(":::InitializeAddresses - Fail!!\r\n") )); 
 
		if (s2410LCD)  
		{ 
			VirtualFree((PVOID) s2410LCD, 0, MEM_RELEASE); 
		} 
 
		s2410LCD = NULL; 
	} 
	else RETAILMSG (1, (TEXT(":::InitializeAddresses - Success\r\n") )); 
	v_pIOPregs->rGPFCON  &= ~(0x3 << 6);		/* Set EINT2(GPF3) as EINT3							*/ 
	v_pIOPregs->rGPFCON  |=  (0x2 << 6); 
 
    v_pIOPregs->rEXTINT0 &= ~(0x7 << 12);		/* Configure EINT3 as Falling Edge Mode				*/ 
    v_pIOPregs->rEXTINT0 |=  (0x2 << 12); 
 
	v_pIOPregs->rGPDCON  &= ~(0xFFFF << 0);								 
	v_pIOPregs->rGPDCON  |=  (0x5555 << 0);//配置GPD0~GPD7为输出状态 
 
	//v_pIOPregs->rGPFUP 
	IntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 
	if (!(InterruptInitialize(SYSINTR_PDD, IntrEvent, 0, 0)))  
	{ 
		RETAILMSG(1, (TEXT("::: SYSINTR_EINT3 Init Fail\r\n"))); 
	} 
 
	LoopNum = 0; 
 
	HANDLE hReadThread; 
	DWORD dwThreadID; 
	// 创建一个读端口线程. 
	if (hReadThread = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)PortReadThread, this, 0, &dwThreadID)) 
	{ 
		CloseHandle (hReadThread); 
	} 
	else 
	{ 
		::MessageBox (NULL, _T("不能创建一个读端口线程"), _T("Error"), MB_OK); 
	} 
	CeSetThreadPriority(hReadThread, 152);  
 
	CString Str; 
 
	Str.Format(_T("按键按下次数:%d次"),LoopNum); 
	m_DispBuf = Str; 
	UpdateData(FALSE); 
 
	LED_Flag = TRUE; 
 
	SetTimer(1,40,NULL); 
 
 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
 
 
void CLED_INTDlg::OnOpen()  
{ 
	v_pIOPregs->rGPBDAT &= ~(0x1 << 7); 
	v_pIOPregs->rGPBDAT &= ~(0x1 << 8); 
	v_pIOPregs->rGPBDAT &= ~(0x1 << 9); 
	v_pIOPregs->rGPBDAT &= ~(0x1 << 10); 
} 
 
void CLED_INTDlg::OnClose()  
{ 
	v_pIOPregs->rGPBDAT |= (0x1 << 7); 
	v_pIOPregs->rGPBDAT |= (0x1 << 8); 
	v_pIOPregs->rGPBDAT |= (0x1 << 9); 
	v_pIOPregs->rGPBDAT |= (0x1 << 10); 
} 
 
void CLED_INTDlg::OnTimer(UINT nIDEvent)  
{ 
	if(LED_Flag) 
	{ 
		LED_Flag = FALSE; 
		v_pIOPregs->rGPDDAT |= (0xFF << 0); 
	} 
	else{ 
		LED_Flag = TRUE; 
		v_pIOPregs->rGPDDAT &= ~(0xFF << 0); 
	} 
/*	if(WaitForSingleObject(IntrEvent, INFINITE)== WAIT_OBJECT_0) 
	{ 
		InterruptDone(SYSINTR_EINT2); 
		m_DispBuf = _T("按键按下"); 
		UpdateData(FALSE); 
	} 
 
	KillTimer(1); 
	 
	m_DispBuf = _T("等待按下"); 
	UpdateData(FALSE); 
	SetTimer(1,2000,NULL); 
	*/	 
	CDialog::OnTimer(nIDEvent); 
} 
 
void PortReadThread(CLED_INTDlg *dlg) 
{ 
	while(1) 
	{ 
		if(WaitForSingleObject(dlg->IntrEvent, INFINITE)== WAIT_OBJECT_0) 
		{ 
			InterruptDone(SYSINTR_PDD); 
			dlg->SendMessage(0x407,0,0); 
		} 
	} 
} 
 
LRESULT CLED_INTDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	CString Str; 
	if (message==0x407){ 
		LoopNum ++; 
		Str.Format(_T("按键按下次数:%d次"),LoopNum); 
		m_DispBuf = Str; 
		UpdateData(FALSE); 
	} 
	return CDialog::WindowProc(message, wParam, lParam); 
} 
 
void CLED_INTDlg::OnSystemSleep()  
{ 
	SetSystemPowerState(NULL,POWER_STATE_SUSPEND,POWER_FORCE);	 
}