464 lines
10 KiB
C++
464 lines
10 KiB
C++
// 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 <revolution/hio2.h>
|
|
#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;
|
|
}
|