JD2022-TU1/main/extern/rfphio/rfp-srv/rfp-srv.cpp

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;
}