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