// Copyright 2005 Doi Shigeki // list310.cpp ダイアログボックス版 // 入力はタイマでトリガ #include #include "list302.h" #include "list309.h" BOOL CALLBACK dlgproc( HWND, UINT, WPARAM, LPARAM ); DWORD WINAPI tproc( LPVOID ); HANDLE husb; // サブスレッドでも使うので HWND gh; // グローバル変数にする int WINAPI WinMain( HINSTANCE hi, HINSTANCE, LPSTR, int ) { husb = CreateFile( "\\\\.\\Ezusb-0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if( (int)husb < 0 ){ MessageBox( NULL, "USBデバイスがオープンできません", "エラー", MB_OK ); return 0; } SetPortConfig( husb, 0,0,0,0,0,1,0); DialogBox( hi, "DLG_DATA", // ダイアログボックスを開く HWND_DESKTOP, (DLGPROC)dlgproc ); CloseHandle( husb ); return TRUE; } BOOL CALLBACK dlgproc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { static int sw[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int i,n,n2; BYTE x; DWORD id; switch(msg){ case WM_INITDIALOG: gh = hwnd; // 入力専用スレッドを作る CreateThread( NULL, // pointer to thread security attributes 0, // initial thread stack size, 0はデフォルト tproc, // pointer to thread function NULL, // argument for new thread 0, // creation flags &id ); // pointer to returned thread identifier return TRUE; // 処理を行った場合はTRUEを返す case WM_COMMAND: n = LOWORD( wp ); if( ID_o0 <= n && n <= ID_o3 ){ // あるチェックボックスが操作された n2 = ( n - ID_o0 ) / 10; // ID値は連続して10づつ増加であること sw[ n2 ] = ! sw[ n2 ]; // 値を反転 SendMessage( GetDlgItem( hwnd, n ), BM_SETCHECK, sw[n2], 0); // 表示に反映 x = 0; // 出力データを組み立てる for( i = 0; i < 4; i++){ x = x + ( sw[ i ] << i ) ; } PIOWrite( husb, 1, x ); } return TRUE; case WM_CLOSE: EndDialog( hwnd, 0 ); return TRUE; } return FALSE; } DWORD WINAPI tproc( LPVOID ) { BYTE x; while(1){ PIORead( husb, 3, &x); if( x & 0x10 ) SetDlgItemText(gh,ID_i3,"1"); else SetDlgItemText(gh,ID_i3,"0"); if( x & 0x20 ) SetDlgItemText(gh,ID_i2,"1"); else SetDlgItemText(gh,ID_i2,"0"); if( x & 0x40 ) SetDlgItemText(gh,ID_i1,"1"); else SetDlgItemText(gh,ID_i1,"0"); if( x & 0x80 ) SetDlgItemText(gh,ID_i0,"1"); else SetDlgItemText(gh,ID_i0,"0"); Sleep(100); } }