1 /*---------------------------------------------------------------------------*
2 Project: HIO2 demos - simple
3 File: simple.c
4
5 (C)2005 HUDSON SOFT
6
7 $Header: /home/cvsroot/SDK/build/demos/hio2demo/vc++/simple/simple.cpp,v 1.3 2006/03/15 06:31:27 mitu Exp $
8
9 $NoKeywords: $
10 *---------------------------------------------------------------------------*/
11
12 #include "stdafx.h"
13
14 #include <revolution/hio2.h>
15 #include "Hio2DllIf.h"
16 #include "multi.h" // divert to generation of sent data
17 #include "simple.h"
18
19 //-----------------------------------------------------------------------------
20 // local symbol definition
21
22 // hio2[D].dll interface
23 static CHio2DllIf l_cHio2Dll;
24
25 // HIO2 API handle
26 static HIO2Handle l_hHIO2;
27
28 // EXI-USB device path
29 static TCHAR l_lpszDevicePathBuffer[_MAX_PATH];
30 static HIO2DevicePath l_pDevicePath = l_lpszDevicePathBuffer;
31
32 // NNGC connection state
33 static volatile BOOL l_bConnect = FALSE;
34
35 // receive data from NNGC
36 static volatile BOOL l_bReceived = FALSE;
37
38 // send flag
39 static volatile BOOL l_bSend = FALSE;
40
41 // Buffer for received data
42 static MULTI_PACKET l_stRecvBuffer;
43
44 // termination flag
45 static BOOL l_bExit = FALSE;
46
47 //-----------------------------------------------------------------------------
48 // local function declared
49
50 static void __HIO2Init( void );
51 static void __HIO2Send( void );
52 static void __HIO2Exit( void );
53 static void __Halt( SIMPLE_ERROR errno );
54
55 ///////////////////////////////////////////////////////////////////////////////
56 //
57 // callback
58 //
59
60 // enum devices
61 static
__EnumCallback(HIO2DevicePath pathName,void * param)62 BOOL __EnumCallback(HIO2DevicePath pathName, void* param)
63 {
64 lstrcpy(l_lpszDevicePathBuffer, pathName);
65 return TRUE;
66 }
67
68 // receive
69 static
__ReceiveCallback(HIO2Handle h)70 void __ReceiveCallback( HIO2Handle h )
71 {
72 u32 mail;
73
74 if ( l_bExit ) return ;
75
76 if ( !l_cHio2Dll.ReadMailbox(h, &mail) )
77 __Halt(SIMPLE_ERR_HIO2_READ_MAILBOX);
78
79 switch ( mail )
80 {
81 case SIMPLE_MAIL_OPEN: // open notification from connection target
82 if ( !l_cHio2Dll.WriteMailbox(h, SIMPLE_MAIL_OPEN_RESULT) )
83 __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX);
84 l_bConnect = TRUE;
85 break;
86 case SIMPLE_MAIL_RECV: // receive data from connection target
87 if ( !l_cHio2Dll.Read(h, SIMPLE_NNGC2PC_ADDR, &l_stRecvBuffer,
88 sizeof(l_stRecvBuffer)) )
89 __Halt(SIMPLE_ERR_HIO2_READ);
90 l_bReceived = TRUE;
91 break;
92 case SIMPLE_MAIL_CHANGE: // switch send/receive
93 l_bSend = !l_bSend; break;
94 case SIMPLE_MAIL_EXIT: // termination notification from connection target
95 l_bExit = TRUE; break;
96 }
97 }
98
99
100 ///////////////////////////////////////////////////////////////////////////////
101 //
102 // simple application
103 //
104
_tmain(int argc,_TCHAR * argv[])105 int _tmain(int argc, _TCHAR* argv[])
106 {
107 // load hio2[D].dll
108 if ( !l_cHio2Dll.Create() )
109 {
110 printf("hio2[D].dll load error.\n");
111 return -1;
112 }
113
114 // HIO2 API initialization
115 __HIO2Init();
116
117 printf("HIO2 DEMO - simple\n\n");
118 printf("press ESC key to exit\n\n");
119
120 while ( !l_bExit )
121 {
122 Sleep(1);
123
124 BOOL sendPossible = FALSE;
125 {
126 u32 status;
127 // get HIO2 status
128 if ( !l_cHio2Dll.ReadStatus(l_hHIO2, &status) )
129 __Halt(SIMPLE_ERR_HIO2_READ_STATUS);
130 sendPossible = !(status & HIO2_STATUS_TX);
131 }
132
133 // terminate when the ESC key is input
134 if ( (_kbhit() != 0) && (tolower(_getch()) == 0x1B) )
135 {
136 // termination notification to NNGC when mail can be sent
137 {
138 if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_EXIT) )
139 __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX);
140 l_bExit = TRUE;
141 break;
142 }
143 }
144
145 // send data to NNGC during send state
146 if ( sendPossible && l_bSend ) __HIO2Send();
147
148 // data received
149 if ( l_bReceived )
150 {
151 TCHAR buffer[128];
152 int n;
153
154 MultiPacketToString(buffer, &l_stRecvBuffer);
155 n = printf("%s",buffer);
156 while (n-- > 0) printf("\x08");
157 fflush(stdout);
158
159 l_bReceived = FALSE;
160 }
161
162 }
163
164 __HIO2Exit();
165
166 return 0;
167 }
168
169 //-----------------------------------------------------------------------------
170 static
__HIO2Init(void)171 void __HIO2Init( void )
172 {
173 // initialization
174 if ( !l_cHio2Dll.Init() ) __Halt(SIMPLE_ERR_HIO2_INIT);
175
176 // device list
177 int nDevCount = l_cHio2Dll.EnumDevices(__EnumCallback, NULL);
178 if ( nDevCount == -1 ) __Halt(SIMPLE_ERR_HIO2_ENUMDEVICES);
179
180 // if device cannot be found
181 if ( nDevCount == 0 ) __Halt(SIMPLE_ERR_EXI2USB_NOT_FIND);
182
183 // device open
184 if ( (l_hHIO2=l_cHio2Dll.Open(l_pDevicePath, __ReceiveCallback, NULL, NULL))
185 == HIO2_INVALID_HANDLE_VALUE )
186 __Halt(SIMPLE_ERR_HIO2_OPEN);
187 }
188
189 //-----------------------------------------------------------------------------
190 static
__HIO2Send(void)191 void __HIO2Send( void )
192 {
193 MULTI_PACKET stPacket;
194 struct tm *pLocalTime;
195 __time64_t lTime;
196
197 _time64(&lTime);
198 pLocalTime = _localtime64(&lTime);
199
200 stPacket.mon = pLocalTime->tm_mon;
201 stPacket.mday = pLocalTime->tm_mday;
202 stPacket.hour = pLocalTime->tm_hour;
203 stPacket.min = pLocalTime->tm_min;
204 stPacket.sec = pLocalTime->tm_sec;
205 stPacket.msec = 0;
206 strcpy(stPacket.string, "PC TIME");
207
208 int a = sizeof(stPacket);
209 if ( !l_cHio2Dll.Write(l_hHIO2, SIMPLE_PC2NNGC_ADDR, &stPacket,
210 sizeof(stPacket)) )
211 __Halt(SIMPLE_ERR_HIO2_WRITE);
212
213 if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_RECV) )
214 __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX);
215 }
216
217 //-----------------------------------------------------------------------------
218 static
__HIO2Exit(void)219 void __HIO2Exit( void )
220 {
221 l_cHio2Dll.Close(l_hHIO2);
222 l_cHio2Dll.Exit();
223
224 // hio2[D].dll deallocated
225 l_cHio2Dll.Release();
226
227 printf("HIO2 DEMO - simple done. \n");
228 }
229
230 //-----------------------------------------------------------------------------
__Halt(SIMPLE_ERROR errno)231 void __Halt( SIMPLE_ERROR errno )
232 {
233 // after displaying the error message deallocate hio2[D].dll
234 printf(simpleErrorMessage[errno], l_cHio2Dll.GetLastError());
235 l_cHio2Dll.Release();
236
237 exit(1);
238 }
239
240 // end of simple.cpp
241