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