// rfp-srv.cpp : Defines the entry point for the console application. // /*---------------------------------------------------------------------------* Project: HIO2 demos - simple File: simple.c (C)2005 HUDSON SOFT $Header: /home/cvsroot/SDK/build/demos/hio2demo/vc++/simple/simple.cpp,v 1.3 2006/03/15 06:31:27 mitu Exp $ $NoKeywords: $ *---------------------------------------------------------------------------*/ #include "stdafx.h" #include #include "Hio2DllIf.h" #include "multi.h" // 送信データの生成に流用 #include "simple.h" #include "typedefs.h" #include "deci2.h" #include "deci2hlp.h" #define RFP_MAIN //----------------------------------------------------------------------------- // local symbol definition // hio2[D].dll interface static CHio2DllIf l_cHio2Dll; // HIO2 API用ハンドル static HIO2Handle l_hHIO2; // EXI-USB device path static TCHAR l_lpszDevicePathBuffer[_MAX_PATH]; static HIO2DevicePath l_pDevicePath = l_lpszDevicePathBuffer; // NNGCとの接続状況 static volatile BOOL l_bConnect = FALSE; // NNGCからデータを受信 static volatile BOOL l_bReceived = FALSE; // 送信フラグ static volatile BOOL l_bSend = FALSE; // 受信データ用バッファ static MULTI_PACKET l_stRecvBuffer; // 終了フラグ static BOOL l_bExit = FALSE; //----------------------------------------------------------------------------- // local function declared #ifndef RFP_MAIN static void __HIO2Init( void ); #else /* RFP_MAIN */ static void RFP_HIO2Init( void ); #endif /*RFP_MAIN */ static void __HIO2Send( void ); static void __HIO2Exit( void ); static void __Halt( SIMPLE_ERROR errcode ); /////////////////////////////////////////////////////////////////////////////// // // callback // // enum devices static BOOL __EnumCallback(HIO2DevicePath pathName, void* param) { lstrcpy(l_lpszDevicePathBuffer, pathName); return TRUE; } // receive #ifndef RFP_MAIN static void __ReceiveCallback( HIO2Handle h ) { u32 mail; if ( l_bExit ) return ; if ( !l_cHio2Dll.ReadMailbox(h, &mail) ) __Halt(SIMPLE_ERR_HIO2_READ_MAILBOX); switch ( mail ) { case SIMPLE_MAIL_OPEN: // 接続相手からオープン通知 if ( !l_cHio2Dll.WriteMailbox(h, SIMPLE_MAIL_OPEN_RESULT) ) __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX); l_bConnect = TRUE; break; case SIMPLE_MAIL_RECV: // 接続相手からデータを受信 if ( !l_cHio2Dll.Read(h, SIMPLE_NNGC2PC_ADDR, &l_stRecvBuffer, sizeof(l_stRecvBuffer)) ) __Halt(SIMPLE_ERR_HIO2_READ); l_bReceived = TRUE; break; case SIMPLE_MAIL_CHANGE: // 送信・受信切り替え l_bSend = !l_bSend; break; case SIMPLE_MAIL_EXIT: // 接続相手から終了通知 l_bExit = TRUE; break; } } #else /* RFP_MAIN */ static void RFP_ReceiveCallback( HIO2Handle h ) { u32 mail; if ( l_bExit ) return ; if ( !l_cHio2Dll.ReadMailbox(h, &mail) ) __Halt(SIMPLE_ERR_HIO2_READ_MAILBOX); switch ( mail ) { case SIMPLE_MAIL_OPEN: // 接続相手からオープン通知 if ( !l_cHio2Dll.WriteMailbox(h, SIMPLE_MAIL_OPEN_RESULT) ) __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX); l_bConnect = TRUE; break; case SIMPLE_MAIL_RECV: // 接続相手からデータを受信 l_bReceived = TRUE; break; case SIMPLE_MAIL_CHANGE: // 送信・受信切り替え l_bSend = !l_bSend; break; case SIMPLE_MAIL_EXIT: // 接続相手から終了通知 l_bExit = TRUE; break; default: printf("? received %u\n", mail); } } #endif /* RFP_MAIN */ /////////////////////////////////////////////////////////////////////////////// // // simple application // #ifndef RFP_MAIN int _tmain(int argc, _TCHAR* argv[]) { // hio2[D].dllをロード if ( !l_cHio2Dll.Create() ) { printf("hio2[D].dll load error.\n"); return -1; } // HIO2 APIの初期化 __HIO2Init(); printf("HIO2 DEMO - simple\n\n"); printf("press ESC key to exit\n\n"); while ( !l_bExit ) { Sleep(1); BOOL sendPossible = FALSE; { u32 status; // HIO2ステータスを取得 if ( !l_cHio2Dll.ReadStatus(l_hHIO2, &status) ) __Halt(SIMPLE_ERR_HIO2_READ_STATUS); sendPossible = !(status & HIO2_STATUS_TX); } // ESCキーが入力されたら終了 if ( (_kbhit() != 0) && (tolower(_getch()) == 0x1B) ) { // メール送信可能状態の時、NNGCに終了通知 { if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_EXIT) ) __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX); l_bExit = TRUE; break; } } // 送信状態の時、NNGCにデータを送信 if ( sendPossible && l_bSend ) __HIO2Send(); // データを受信した if ( l_bReceived ) { TCHAR buffer[128]; int n; MultiPacketToString(buffer, &l_stRecvBuffer); n = printf("%s",buffer); while (n-- > 0) printf("\x08"); fflush(stdout); l_bReceived = FALSE; } } __HIO2Exit(); return 0; } #else /* RFP_MAIN */ #ifdef __cplusplus extern "C" { #endif void * GetRequest(); void SendResponse(void *buf); void * RfpHandler(char *buf); #ifdef __cplusplus } #endif extern "C" void InitRFPClient(char *_hostname); extern "C" void ExitRFPClient(void); int _tmain(int argc, _TCHAR* argv[]) { // hio2[D].dllをロード if ( !l_cHio2Dll.Create() ) { printf("hio2[D].dll load error.\n"); return -1; } // HIO2 APIの初期化 RFP_HIO2Init(); InitRFPClient(0); printf("HIO2 RFP/FIO server\n\n"); printf("press ESC key to exit\n\n"); while ( !l_bExit ) { Sleep(1); // ESCキーが入力されたら終了 if ( (_kbhit() != 0) && (tolower(_getch()) == 0x1B) ) { // メール送信可能状態の時、NNGCに終了通知 { if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_EXIT) ) __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX); l_bExit = TRUE; break; } } // データを受信した if ( l_bReceived ) { void * buf = GetRequest(); void * response = 0; DECI2_HDR * pkt = (DECI2_HDR *)buf; switch (pkt->protocol) { // distribute to proper handler case DECI2_PROTO_DRFP0: /* serve request : send a response */ response = RfpHandler((char *)(pkt + 1)); if (!response) return printf("failed to handle packet"); else SendResponse(response); break; default: printf("unknown packet received : prototype %x\n", pkt->protocol); } } } ExitRFPClient(); __HIO2Exit(); return 0; } #endif /* RFP_MAIN */ //----------------------------------------------------------------------------- #ifndef RFP_MAIN static void __HIO2Init( void ) { // 初期化 if ( !l_cHio2Dll.Init() ) __Halt(SIMPLE_ERR_HIO2_INIT); // デバイスの列挙 int nDevCount = l_cHio2Dll.EnumDevices(__EnumCallback, NULL); if ( nDevCount == -1 ) __Halt(SIMPLE_ERR_HIO2_ENUMDEVICES); // デバイスが見つからなかった場合 if ( nDevCount == 0 ) __Halt(SIMPLE_ERR_EXI2USB_NOT_FIND); // デバイスオープン if ( (l_hHIO2=l_cHio2Dll.Open(l_pDevicePath, __ReceiveCallback, NULL, NULL)) == HIO2_INVALID_HANDLE_VALUE ) __Halt(SIMPLE_ERR_HIO2_OPEN); } #else /* RFP_MAIN */ static void RFPHIOBanner(void); void RFP_HIO2Init( void ) { // 初期化 if ( !l_cHio2Dll.Init() ) __Halt(SIMPLE_ERR_HIO2_INIT); // デバイスの列挙 int nDevCount = l_cHio2Dll.EnumDevices(__EnumCallback, NULL); if ( nDevCount == -1 ) __Halt(SIMPLE_ERR_HIO2_ENUMDEVICES); // デバイスが見つからなかった場合 if ( nDevCount == 0 ) __Halt(SIMPLE_ERR_EXI2USB_NOT_FIND); // デバイスオープン if ( (l_hHIO2=l_cHio2Dll.Open(l_pDevicePath, RFP_ReceiveCallback, NULL, NULL)) == HIO2_INVALID_HANDLE_VALUE ) __Halt(SIMPLE_ERR_HIO2_OPEN); printf("HIO2 init succeeded\n"); RFPHIOBanner(); } #endif /* RFP_MAIN */ //----------------------------------------------------------------------------- static void __HIO2Send( void ) { MULTI_PACKET stPacket; struct tm *pLocalTime; __time64_t lTime; _time64(&lTime); pLocalTime = _localtime64(&lTime); stPacket.mon = pLocalTime->tm_mon; stPacket.mday = pLocalTime->tm_mday; stPacket.hour = pLocalTime->tm_hour; stPacket.min = pLocalTime->tm_min; stPacket.sec = pLocalTime->tm_sec; stPacket.msec = 0; strcpy(stPacket.string, "PC TIME"); int a = sizeof(stPacket); if ( !l_cHio2Dll.Write(l_hHIO2, SIMPLE_PC2NNGC_ADDR, &stPacket, sizeof(stPacket)) ) __Halt(SIMPLE_ERR_HIO2_WRITE); if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_RECV) ) __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX); } //----------------------------------------------------------------------------- static void __HIO2Exit( void ) { l_cHio2Dll.Close(l_hHIO2); l_cHio2Dll.Exit(); // hio2[D].dll解放 l_cHio2Dll.Release(); printf("HIO2 DEMO - simple done. \n"); } //----------------------------------------------------------------------------- void __Halt( SIMPLE_ERROR errcode ) { // エラーメッセージ表示後、hio2[D].dllを解放 printf(simpleErrorMessage[errno], l_cHio2Dll.GetLastError()); l_cHio2Dll.Release(); exit(1); } // end of simple.cpp #include "rfp-srv.h" static DECI2_PACKET RecvBuffer ; static DECI2_PACKET SendBuffer ; void RFPHIOBanner(void) { printf("DECI2_PC2NNGC_ADDR = % 08x\n", DECI2_PC2NNGC_ADDR); printf("DECI2_NNGC2PC_ADDR = % 08x\n", DECI2_NNGC2PC_ADDR); printf("DECI2_BUFFER_SIZE = % 08x\n", DECI2_BUFFER_SIZE); } void SendResponse(void *buf) { DECI2_HDR *pkt = (DECI2_HDR *)buf; int pkt_length = pkt->length; M_bswapself16(pkt->length); M_bswapself16(pkt->reserved); M_bswapself16(pkt->protocol); BOOL sendPossible = FALSE; { u32 status; // HIO2ステータスを取得 if ( !l_cHio2Dll.ReadStatus(l_hHIO2, &status) ) __Halt(SIMPLE_ERR_HIO2_READ_STATUS); sendPossible = !(status & HIO2_STATUS_TX); } assert(sendPossible); if ( !l_cHio2Dll.Write(l_hHIO2, DECI2_PC2NNGC_ADDR, buf, pkt_length) ) __Halt(SIMPLE_ERR_HIO2_WRITE); if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_RECV) ) __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX); } void *GetRequest() { assert(l_bReceived); char * RecvAddr = (char *)&RecvBuffer; if ( !l_cHio2Dll.Read(l_hHIO2, DECI2_NNGC2PC_ADDR, RecvAddr, sizeof(RecvBuffer)) ) __Halt(SIMPLE_ERR_HIO2_READ); l_bReceived = FALSE; DECI2_HDR *pkt = (DECI2_HDR *)RecvAddr; M_bswapself16(pkt->length); M_bswapself16(pkt->reserved); M_bswapself16(pkt->protocol); return RecvAddr; } void *GetBlock(u32 size) { assert(size<=sizeof(SendBuffer)); return &SendBuffer; }