📄 gpiodlg.cpp
字号:
// gpioDlg.cpp : implementation file
//
#include "stdafx.h"
#include "gpio.h"
#include "gpioDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//xdj add gpio zhu ce biao xin xi
WCHAR * szRegKey=L"Drivers\\BuiltIn\\PIO";
WCHAR * szPrefix=L"PIO";
WCHAR * szDLL=L"Gpio.dll";
WCHAR * szFriendlyName=L"Simple Driver";
DWORD DrvIndex=1;
DWORD DrvOrder=0;
// xdj add :write to string to zhu ce biao
#define WRITE_REG_SZ(Name,Value)RegSetValueEx(hDrvKey,Name,0,REG_SZ,(LPBYTE)Value,\
(wcslen(Value)+1)*sizeof(WCHAR))
#define WRITE_REG_DWORD(Name,Value){DWORD dwValue=Value;RegSetValueEx(hDrvKey,Name,\
0,REG_DWORD,(LPBYTE)&dwValue,sizeof(DWORD));}
//#define IOCTL_GPH_SET_PIN_OUT 0x0000017
/////////////////////////////////////////////////////////////////////////////
// CGpioDlg dialog
CGpioDlg::CGpioDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGpioDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CGpioDlg)
m_WriteByte = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CGpioDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGpioDlg)
DDX_Text(pDX, IDC_WRITE_EDIT, m_WriteByte);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGpioDlg, CDialog)
//{{AFX_MSG_MAP(CGpioDlg)
ON_BN_CLICKED(IDC_OPEN_PIO1, OnOpenPio1)
ON_BN_CLICKED(IDC_CLOSE_PIO1, OnClosePio1)
ON_BN_CLICKED(IDC_BEEP_ON, OnBeepOn)
ON_BN_CLICKED(IDC_BEEP_CLOSE, OnBeepClose)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_LOAD_DRIVER, OnLoadDriver)
ON_BN_CLICKED(IDC_UNLOAD_DRIVER, OnUnloadDriver)
ON_BN_CLICKED(IDC_BUTTON1, OnWrite)
ON_BN_CLICKED(IDC_BUTTON2, OnRead)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGpioDlg message handlers
BOOL CGpioDlg::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
return TRUE; // return TRUE unless you set the focus to a control
}
//XDJ ADD
// 包含命令码头文件
#include "gpio_xdj.h"
HANDLE HandleDriver= INVALID_HANDLE_VALUE;
// 文件句柄
HANDLE hFile = INVALID_HANDLE_VALUE;
HKEY hDrvKey=NULL; // 注册表操作句柄
void CGpioDlg::OnOpenPio1() //打开驱动
{
// TODO: Add your control notification handler code here
BOOL ret;
//xdj del
//BYTE pinnum=10;
//xdj add
BYTE pinnum=4;
hFile=CreateFile(TEXT("PIO1:"),GENERIC_READ | GENERIC_WRITE,0,
NULL,OPEN_EXISTING,0,0);
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(_T("can not open ABgpio!!"));
return;
}
else
MessageBox(_T("open ABgpio success!")); //hFile=!INVALID_HANDLE_VALUE
//xdj del
//ret=::DeviceIoControl(hFile,IOCTL_GPH_SET_PIN_OUT,&pinnum,1,NULL,0,NULL,NULL);
//xdj add
ret=::DeviceIoControl(hFile,IOCTL_GPA_SET_PIN_OUT,&pinnum,1,NULL,0,NULL,NULL);
if (ret != TRUE)
{
// OnClosePio1();
MessageBox(_T("设置 GPE5引脚输出失败!"));
// return;
}
CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_PIO1); /* 取得控件指针 */
CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_PIO1);
pOpenButton->EnableWindow(FALSE); /* 禁止按键 */
pCloseButton->EnableWindow(TRUE); /* 使能按键 */
}
void CGpioDlg::OnClosePio1() //hFile=INVALID_HANDLE_VALUE
{
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_PIO1); /* 取得控件指针 */
CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_PIO1);
pOpenButton->EnableWindow(TRUE); /* 使能按键 */
pCloseButton->EnableWindow(FALSE); /* 禁止按*/
} //hFile=INVALID_HANDLE_VALUE
void CGpioDlg::OnBeepOn() //WRITE TO GPIOA
{
// TODO: Add your control notification handler code here
BOOL ret;
BYTE pinnum = 4;
// 置 GPE5 为低电平, 蜂鸣器蜂鸣
ret = ::DeviceIoControl(hFile, IOCTL_GPA_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("设置 GPE5 低电平失败!"));
}
void CGpioDlg::OnBeepClose() //READ FROM GPIOA
{
// TODO: Add your control notification handler code here
BOOL ret;
BYTE pinnum = 4;
// 置 GPH10 为高电平, 禁止蜂鸣器蜂鸣
ret = ::DeviceIoControl(hFile, IOCTL_GPA_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("设置 GPE5 高电平失败!"));
}
void CGpioDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
OnClosePio1(); /* 关闭 GPIO 驱动 */
}
void CGpioDlg::OnLoadDriver()
{
// TODO: Add your control notification handler code here
LONG nErr;
DWORD dwDisp;
//创建注册表键
nErr=RegCreateKeyEx(HKEY_LOCAL_MACHINE,szRegKey,0,L"",0,
0,NULL,&hDrvKey,&dwDisp);
if(nErr!=ERROR_SUCCESS)
{
{
MessageBox(_T("failed!!"));
return;
}
}
else
{
WRITE_REG_SZ( L"Prefix",szPrefix);
WRITE_REG_SZ( L"Dll",szDLL);
WRITE_REG_SZ( L"FriendlyName",szFriendlyName);
WRITE_REG_DWORD( L"Order",DrvOrder);
WRITE_REG_DWORD( L"Index",DrvIndex);
}
HandleDriver=ActivateDeviceEx(szRegKey,NULL,0,NULL);
if(HandleDriver==INVALID_HANDLE_VALUE)
{
MessageBox(_T("load failed!!"));
}
else
{
MessageBox(_T("load success!!")); //HandleDriver!=INVALID_HANDLE_VALUE
}
}
void CGpioDlg::OnUnloadDriver()
{
// TODO: Add your control notification handler code here
if(HandleDriver!=INVALID_HANDLE_VALUE)
{
OnClosePio1();
BOOL ret=DeactivateDevice(HandleDriver);
if(ret==TRUE)
{
RegCloseKey(hDrvKey);
RegDeleteKey(HKEY_LOCAL_MACHINE,szRegKey);
HandleDriver= INVALID_HANDLE_VALUE;
MessageBox(_T("unload success!!"));
}
else
{
MessageBox(_T("load failed!!")); //(HandleDriver!=INVALID_HANDLE_VALUE)
}
}
}
void CGpioDlg::OnWrite()
{
// TODO: Add your control notification handler code here
BOOL ret;
uint i,j;
DWORD tmp,actlen;
// tmp=0x55;
uint writebyte;
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(_T("驱动没打开"));
return;
}
UpdateData(TRUE);
//BYTE writebyte=(BYTE)tmp;
writebyte=0x55;
ret=true;
for(j=0;j<128;j++)
{
for(i=0;i<16;i++)
////BOOL ret=WriteFile(hFile,&m_WriteByte,1,&actlen,NULL);
WriteFile(hFile,&m_WriteByte,1,&actlen,NULL);
}
//BOOL ret=WriteFile(hFile,writebyte,1,&actlen,NULL);
if((ret==FALSE)||(actlen!=1))
MessageBox(_T("写入数据失败"));
else
MessageBox(_T("写入数据成功"));
}
void CGpioDlg::OnRead()
{
// TODO: Add your control notification handler code here
DWORD recbuff,actlen;
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(_T("驱动没打开"));
return;
}
BOOL ret=ReadFile(hFile,&recbuff,1,&actlen,NULL);
if((ret==FALSE)||(actlen!=1))
MessageBox(_T("读出数据失败"));
else
MessageBox(_T("读出数据成功"));
CString strTmp;
strTmp.Format(_T(" %x"),recbuff);
CEdit * pDispEdit = (CEdit * )GetDlgItem(IDC_READ_DISP);
pDispEdit->SetWindowText(strTmp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -