?? dlgbeep.cpp
字號:
// DlgBeep.cpp : implementation file
//
#include "stdafx.h"
#include "Magic2410.h"
#include "DlgBeep.h"
#include "gpio.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DlgBeep dialog
// 定義步進電機各相使用的 GPIO 編號
#define MOTOA 5
#define MOTOB 6
#define MOTOC 7
#define MOTOD 0
#define LED1 11
#define LED2 12
#define LED3 4
#define LED4 6
#define WATER 1
#define HOURSE 2
#define DC_MOTORA 0
#define DC_MOTORB 9
extern HANDLE m_hFileGpio;
DlgBeep::DlgBeep(CWnd* pParent /*=NULL*/)
: CDialog(DlgBeep::IDD, pParent)
{
//{{AFX_DATA_INIT(DlgBeep)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void DlgBeep::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DlgBeep)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DlgBeep, CDialog)
//{{AFX_MSG_MAP(DlgBeep)
ON_BN_CLICKED(IDC_BEEP_ON, OnBeepOn)
ON_BN_CLICKED(IDC_BEEP_OFF, OnBeepOff)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_StepRun, OnStepRun)
ON_BN_CLICKED(IDC_BUTTON_NOT_RUN, OnButtonNotRun)
ON_BN_CLICKED(IDC_BUTTON_LED1, OnButtonLed1)
ON_BN_CLICKED(IDC_BUTTON_LED2, OnButtonLed2)
ON_BN_CLICKED(IDC_BTN_STOP_LED, OnBtnStopLed)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DlgBeep message handlers
// "蜂鳴器蜂鳴" 按鍵單擊事件代碼
void DlgBeep::OnBeepOn()
{
// TODO: Add your control notification handler code here
BOOL ret;
BYTE pinnum = 10;
// 置 GPH10 為低電平, 蜂鳴器蜂鳴
ret = ::DeviceIoControl(hFile, IOCTL_GPH_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPH Pin Out Error!"));
}
// "禁止蜂鳴器蜂鳴" 按鍵單擊事件代碼
void DlgBeep::OnBeepOff()
{
// TODO: Add your control notification handler code here
BOOL ret;
BYTE pinnum = 10;
// 置 GPH10 為高電平, 禁止蜂鳴器蜂鳴
ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPH Pin Out Error!"));
}
void DlgBeep::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
// "關閉GPIO驅動" 按鍵單擊事件代碼
DWORD lpExitCode;
if (hFile != NULL)
CloseHandle(hFile);
if(GetExitCodeThread(hThreadLed,&lpExitCode))
ExitThread(lpExitCode);
CDialog::OnClose();
}
// "步進電機轉動" 按鍵單擊事件代碼
void DlgBeep::OnStepRun()
{
// TODO: Add your control notification handler code here
DWORD i;
if (hFile == INVALID_HANDLE_VALUE)
return;
// 步進電機運轉
for (i = 0; i < 30; i++)
{
MotoMode1(5);
}
}
/********************************************************************
函數名稱: MotoMode2()
功能描述: 步進電機雙四拍程序
控制時序為: AB-DA-CD-CD-BC
輸入參數: DWORD dly: 每一步的延時控制, 值越大,延時越久
返 回 值: 無
*********************************************************************/
void DlgBeep::MotoMode2(DWORD dly)
{
// AB 相有效
SetPinStatus(MOTOA, 1);
SetPinStatus(MOTOB, 1);
Sleep(dly);
SetPinStatus(MOTOA, 0);
SetPinStatus(MOTOB, 0);
// DA 相有效
SetPinStatus(MOTOD, 1);
SetPinStatus(MOTOA, 1);
Sleep(dly);
SetPinStatus(MOTOD, 0);
SetPinStatus(MOTOA, 0);
// CD 相有效
SetPinStatus(MOTOC, 1);
SetPinStatus(MOTOD, 1);
Sleep(dly);
SetPinStatus(MOTOC, 0);
SetPinStatus(MOTOD, 0);
// BC 相有效
SetPinStatus(MOTOB, 1);
SetPinStatus(MOTOC, 1);
Sleep(dly);
SetPinStatus(MOTOB, 0);
SetPinStatus(MOTOC, 0);
}
/********************************************************************
函數名稱: SetPinStatus()
功能描述: 設置 GPIO 引腳為高電平或高電平
輸入參數: DWORD pinnum : 引腳編號, 取值為: MOTOA ~ MOTOD
BYTE status : 引腳狀態, 1 -- 輸出高電平, 0 -- 輸出低電平
返 回 值: TRUE: 操作成功 FALSE: 操作失敗
*********************************************************************/
BOOL DlgBeep::SetPinStatus(DWORD pinnum, BYTE status)
{
BOOL ret;
if (status != 0)
ret = ::DeviceIoControl(hFile, IOCTL_GPC_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
else
ret = ::DeviceIoControl(hFile, IOCTL_GPC_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
return ret;
}
/********************************************************************
函數名稱: MotoMode()
功能描述: 步進電機雙四拍程序
控制時序為: AB-BC-CD-DA-AB
輸入參數: DWORD dly: 每一步的延時控制, 值越大,延時越久
返 回 值: 無
*********************************************************************/
void DlgBeep::MotoMode1(DWORD dly)
{
// DA 相有效
SetPinStatus(MOTOD, 1);
SetPinStatus(MOTOA, 1);
Sleep(dly);
SetPinStatus(MOTOD, 0);
SetPinStatus(MOTOA, 0);
// AB 相有效
SetPinStatus(MOTOA, 1);
SetPinStatus(MOTOB, 1);
Sleep(dly);
SetPinStatus(MOTOA, 0);
SetPinStatus(MOTOB, 0);
// BC 相有效
SetPinStatus(MOTOB, 1);
SetPinStatus(MOTOC, 1);
Sleep(dly);
SetPinStatus(MOTOB, 0);
SetPinStatus(MOTOC, 0);
// CD 相有效
SetPinStatus(MOTOC, 1);
SetPinStatus(MOTOD, 1);
Sleep(dly);
SetPinStatus(MOTOC, 0);
SetPinStatus(MOTOD, 0);
}
void DlgBeep::OnButtonNotRun()
{
// TODO: Add your control notification handler code here
DWORD i;
if (hFile == INVALID_HANDLE_VALUE)
return;
// 步進電機運轉
for (i = 0; i < 30; i++)
{
MotoMode2(5);
}
}
void DlgBeep::OnButtonLed1()
{
// TODO: Add your control notification handler code here
DWORD dwThreadID;
LedStaly=WATER;
if(hThreadLed==NULL)
{
ledThread=TRUE;
hThreadLed=CreateThread(NULL,NULL,LedThread,this,NULL,&dwThreadID);
if(hThreadLed==NULL)
MessageBox(_T("LED Thread Create Faile"));
}
}
BOOL DlgBeep::SetLed(BYTE pinnum, BOOL status,HANDLE hfileled)
{
BOOL ret;
switch(pinnum)
{
case LED1:
case LED2:
if(status)
ret = ::DeviceIoControl(hfileled, IOCTL_GPE_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
else
ret = ::DeviceIoControl(hfileled, IOCTL_GPE_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
break;
case LED3:
case LED4:
if(status)
ret = ::DeviceIoControl(hfileled, IOCTL_GPH_SET_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
else
ret = ::DeviceIoControl(hfileled, IOCTL_GPH_CLR_PIN, &pinnum, 1, NULL, 0, NULL, NULL);
break;
default:
ret = FALSE;
break;
}
return ret;
}
DWORD DlgBeep::LedThread(PVOID arg)
{
DlgBeep *pDlgBeep=(DlgBeep *)arg;
int dly=100;
while(pDlgBeep->ledThread)
{
if(pDlgBeep->LedStaly==WATER)
{
dly=100;
SetLed(LED1,TRUE,pDlgBeep->hFile );
Sleep(dly);
SetLed(LED1,FALSE,pDlgBeep->hFile );
SetLed(LED2,TRUE,pDlgBeep->hFile );
Sleep(dly);
SetLed(LED2,FALSE,pDlgBeep->hFile );
SetLed(LED3,TRUE,pDlgBeep->hFile );
Sleep(dly);
SetLed(LED3,FALSE,pDlgBeep->hFile );
SetLed(LED4,TRUE,pDlgBeep->hFile );
Sleep(dly);
SetLed(LED4,FALSE,pDlgBeep->hFile );
}
else if(pDlgBeep->LedStaly == HOURSE)
{
dly=200;
SetLed(LED2,FALSE,pDlgBeep->hFile );
SetLed(LED4,FALSE,pDlgBeep->hFile );
SetLed(LED1,TRUE,pDlgBeep->hFile );
SetLed(LED3,TRUE,pDlgBeep->hFile );
Sleep(dly);
SetLed(LED1,FALSE,pDlgBeep->hFile );
SetLed(LED3,FALSE,pDlgBeep->hFile );
SetLed(LED2,TRUE,pDlgBeep->hFile );
SetLed(LED4,TRUE,pDlgBeep->hFile );
Sleep(dly);
}
else
Sleep(1000);
}
return (DWORD)0;
}
void DlgBeep::OnButtonLed2()
{
// TODO: Add your control notification handler code here
DWORD dwThreadID;
LedStaly=HOURSE;
if(hThreadLed==NULL)
{
ledThread=TRUE;
hThreadLed=CreateThread(NULL,NULL,LedThread,this,NULL,&dwThreadID);
if(hThreadLed==NULL)
MessageBox(_T("LED Thread Create Faile"));
}
}
void DlgBeep::OnBtnStopLed()
{
// TODO: Add your control notification handler code here
ledThread=FALSE;
Sleep(100);
if(hThreadLed)
{
CloseHandle(hThreadLed);
hThreadLed=NULL;
}
}
void DlgBeep::StopBeepDlgled()
{
// TODO: Add your control notification handler code here
ledThread = FALSE;
Sleep(100);
if(hThreadLed)
{
CloseHandle(hThreadLed);
hThreadLed=NULL;
}
}
DlgBeep *pDlgGPIO;
BOOL DlgBeep::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
BOOL ret;
BYTE pinnum = 10;
BYTE DC_motora=DC_MOTORA;
BYTE DC_motorb=DC_MOTORB;
// A,B,C,D 各相對就 GPIO 掩碼
DWORD pinmask = (1 << MOTOA) + (1 << MOTOB) + (1 << MOTOC) + (1 << MOTOD);
// 打開 GPIO 驅動
hFile = CreateFile(TEXT("PIO1:"), GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("Cannot Open PIO1!"));
return FALSE;
}
m_hFileGpio=hFile;
// 設置 GPH10 為輸出口
ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPH Pin Out Error!"));
// 設置 GPC0, GPC5, GPC6, GPC7 為輸出口
ret = ::DeviceIoControl(hFile, IOCTL_GPC_SET_MULTI_PIN_OUT, &pinmask, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPIO Pin Out failed!"));
// 設置 GPB0 為輸出口
ret = ::DeviceIoControl(hFile, IOCTL_GPB_SET_PIN_OUT, &DC_motora, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPB Pin Out Error!"));
// 設置 GPH9 為輸出口
ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &DC_motorb, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPH Pin Out Error!"));
// 設置 GPE11 為輸出口
pinnum=LED1;
ret = ::DeviceIoControl(hFile, IOCTL_GPE_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPE Pin Out Error!"));
// 設置 GPE12 為輸出口
pinnum=LED2;
ret = ::DeviceIoControl(hFile, IOCTL_GPE_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPE12 Pin Out Error!"));
// 設置 GPH4 為輸出口
pinnum=LED3;
ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPH4 Pin Out Error!"));
// 設置 GPH6 為輸出口
pinnum=LED4;
ret = ::DeviceIoControl(hFile, IOCTL_GPH_SET_PIN_OUT, &pinnum, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
MessageBox(_T("Set GPH6 Pin Out Error!"));
// 置 GPH9 為低電平
ret = ::DeviceIoControl(hFile, IOCTL_GPH_CLR_PIN, &DC_motorb, 1,
NULL, NULL, NULL, NULL);
pDlgGPIO = this;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -