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.5 2007/11/26 13:57:26 iwai_yuma 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 generate send 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 = HIO2_INVALID_HANDLE_VALUE;
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 err );
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 {
78 __Halt( SIMPLE_ERR_HIO2_READ_MAILBOX );
79 }
80
81 switch ( mail )
82 {
83 case SIMPLE_MAIL_OPEN: // Open notification from connection target
84 if ( !l_cHio2Dll.WriteMailbox(h, SIMPLE_MAIL_OPEN_RESULT) )
85 __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX);
86 l_bConnect = TRUE;
87 break;
88 case SIMPLE_MAIL_RECV: // Receive data from connection target
89 if ( !l_cHio2Dll.Read(h, SIMPLE_NNGC2PC_ADDR, &l_stRecvBuffer,
90 sizeof(l_stRecvBuffer)) )
91 __Halt(SIMPLE_ERR_HIO2_READ);
92 l_bReceived = TRUE;
93 break;
94 case SIMPLE_MAIL_CHANGE: // Switch send/receive
95 l_bSend = !l_bSend; break;
96 case SIMPLE_MAIL_EXIT: // Termination notification from connection target
97 l_cHio2Dll.Close(h);
98 l_bExit = TRUE; break;
99 }
100 }
101
102
103 ///////////////////////////////////////////////////////////////////////////////
104 //
105 // Simple application
106 //
107
_tmain(int argc,_TCHAR * argv[])108 int _tmain(int argc, _TCHAR* argv[])
109 {
110 // Load hio2[D].dll
111 if ( !l_cHio2Dll.Create() )
112 {
113 printf("hio2[D].dll load error.\n");
114 return -1;
115 }
116
117 // HIO2 API initialization
118 __HIO2Init();
119
120 printf("HIO2 DEMO - simple\n\n");
121 printf("press ESC key to exit\n\n");
122
123 while ( !l_bExit )
124 {
125 Sleep(1);
126
127 BOOL sendPossible = FALSE;
128 {
129 u32 status;
130 // Get HIO2 status
131 if ( !l_cHio2Dll.ReadStatus(l_hHIO2, &status) )
132 __Halt(SIMPLE_ERR_HIO2_READ_STATUS);
133 sendPossible = !(status & HIO2_STATUS_TX);
134 }
135
136 // Terminate when the ESC key is input
137 if ( (_kbhit() != 0) && (tolower(_getch()) == 0x1B) )
138 {
139 // Termination notification to NNGC when mail can be sent
140 {
141 if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_EXIT) )
142 __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX);
143 l_bExit = TRUE;
144 break;
145 }
146 }
147
148 // Send data to NNGC during send state
149 if ( sendPossible && l_bSend ) __HIO2Send();
150
151 // Data received
152 if ( l_bReceived )
153 {
154 TCHAR buffer[128];
155 int n;
156
157 // MultiPacketToString( buffer, sizeof( buffer ), &l_stRecvBuffer );
158 MultiPacketToString( buffer, &l_stRecvBuffer );
159 n = printf("%s",buffer);
160 while (n-- > 0) printf("\x08");
161 fflush(stdout);
162
163 l_bReceived = FALSE;
164 }
165
166 }
167
168 __HIO2Exit();
169
170 return 0;
171 }
172
173 //-----------------------------------------------------------------------------
174 static
__HIO2Init(void)175 void __HIO2Init( void )
176 {
177 // Initialization
178 if ( !l_cHio2Dll.Init() ) __Halt(SIMPLE_ERR_HIO2_INIT);
179
180 // Enumerate devices
181 int nDevCount = l_cHio2Dll.EnumDevices(__EnumCallback, NULL);
182 if ( nDevCount == -1 ) __Halt(SIMPLE_ERR_HIO2_ENUMDEVICES);
183
184 // When the device could not be found
185 if ( nDevCount == 0 ) __Halt(SIMPLE_ERR_EXI2USB_NOT_FIND);
186
187 // Device open
188 if ( (l_hHIO2=l_cHio2Dll.Open(l_pDevicePath, __ReceiveCallback, NULL, NULL))
189 == HIO2_INVALID_HANDLE_VALUE )
190 __Halt(SIMPLE_ERR_HIO2_OPEN);
191 }
192
193 //-----------------------------------------------------------------------------
194 static
__HIO2Send(void)195 void __HIO2Send( void )
196 {
197 MULTI_PACKET stPacket;
198 struct tm pLocalTime;
199 __time64_t lTime;
200 errno_t err;
201
202 _time64(&lTime);
203
204 err = _localtime64_s( &pLocalTime, &lTime );
205 // pLocalTime = _localtime64(&lTime);
206
207 stPacket.mon = pLocalTime.tm_mon + 1;
208 stPacket.mday = pLocalTime.tm_mday;
209 stPacket.hour = pLocalTime.tm_hour;
210 stPacket.min = pLocalTime.tm_min;
211 stPacket.sec = pLocalTime.tm_sec;
212 stPacket.msec = 0;
213
214 strcpy_s( stPacket.string, sizeof( stPacket.string ), "PC TIME" );
215 // strcpy(stPacket.string, "PC TIME");
216
217 int a = sizeof(stPacket);
218 if ( !l_cHio2Dll.Write(l_hHIO2, SIMPLE_PC2NNGC_ADDR, &stPacket,
219 sizeof(stPacket)) )
220 __Halt(SIMPLE_ERR_HIO2_WRITE);
221
222 if ( !l_cHio2Dll.WriteMailbox(l_hHIO2, SIMPLE_MAIL_RECV) )
223 __Halt(SIMPLE_ERR_HIO2_WRITE_MAILBOX);
224 }
225
226 //-----------------------------------------------------------------------------
227 static
__HIO2Exit(void)228 void __HIO2Exit( void )
229 {
230 if ( l_hHIO2 != HIO2_INVALID_HANDLE_VALUE ) l_cHio2Dll.Close(l_hHIO2);
231 l_cHio2Dll.Exit();
232
233 // hio2[D].dll deallocated
234 l_cHio2Dll.Release();
235
236 printf("\nHIO2 DEMO - simple done. \n");
237 }
238
239 //-----------------------------------------------------------------------------
__Halt(SIMPLE_ERROR err)240 void __Halt( SIMPLE_ERROR err )
241 {
242 // After displaying an error message, perform shutdown processing for HIO2
243 printf( simpleErrorMessage[err], l_cHio2Dll.GetLastError() );
244
245 __HIO2Exit();
246
247 exit(1);
248 }
249
250 // End of simple.cpp
251