testexecmgmt/ucc/Source/SerialTcpRelay/SerialTcpRelay.cpp
changeset 0 3da2a79470a7
equal deleted inserted replaced
-1:000000000000 0:3da2a79470a7
       
     1 /*
       
     2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 * System Includes
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 
       
    21 #include <stdio.h>
       
    22 #include <stdlib.h>
       
    23 #include <assert.h>
       
    24 #include <string.h>
       
    25 
       
    26 
       
    27 /*************************************************************************************
       
    28  *
       
    29  * Local Includes
       
    30  *
       
    31  ************************************************************************************/
       
    32 #include "CSerialTcpRelay.h"
       
    33 
       
    34 
       
    35 /*************************************************************************************
       
    36  *
       
    37  * Definitions
       
    38  *
       
    39  ************************************************************************************/
       
    40 #define TO_RETRY					(1000)
       
    41 #define TO_TIMEWAIT					(3000)
       
    42 #define INITIALSTRINGBUFFERSIZE		(64)
       
    43 
       
    44 
       
    45 /*************************************************************************************
       
    46  *
       
    47  * Prototypes
       
    48  *
       
    49  ************************************************************************************/
       
    50 void Relay( SOCKADDR_IN aSocketAddress, char *aSerialPortName );
       
    51 void RelaySession( SOCKADDR_IN aSocketAddress, CSerialPort *aSerialPort );
       
    52 void PrintRelayError( TRelayError aRelayError, int aErrCode );
       
    53 
       
    54 
       
    55 /*************************************************************************************
       
    56  *
       
    57  * main()
       
    58  *
       
    59  ************************************************************************************/
       
    60 int main( int argc, char *argv[] )
       
    61 {
       
    62 	char *serial_port_name;
       
    63 	SOCKADDR_IN socket_address;
       
    64 	WORD version;
       
    65 	WSADATA wsaData;
       
    66 	int err;
       
    67 
       
    68 	// check params
       
    69 	if( argc < 3 ) {
       
    70 		fprintf( stderr, "usage: %s <tcp_host> <tcp_port> <serial_port>\n", argv[0] );
       
    71 		return -1;
       
    72 	}
       
    73 
       
    74 	// process the params
       
    75 	memset( &socket_address, 0, sizeof(socket_address) );
       
    76 	socket_address.sin_family = AF_INET;
       
    77 	socket_address.sin_port = htons( atoi(argv[2]) );
       
    78 	socket_address.sin_addr.S_un.S_addr = inet_addr( argv[1] );
       
    79 	serial_port_name = argv[3];
       
    80 
       
    81 	// start the socket subsystem
       
    82 	version = MAKEWORD( 2, 2 );
       
    83 	err = WSAStartup( version, &wsaData );
       
    84 	assert( err == 0 );
       
    85 
       
    86 	// start the relay
       
    87 	Relay( socket_address, serial_port_name );
       
    88 
       
    89 	// done
       
    90 	WSACleanup();
       
    91 	return 0;
       
    92 }
       
    93 
       
    94 
       
    95 /*************************************************************************************
       
    96  *
       
    97  * Relay()
       
    98  *
       
    99  ************************************************************************************/
       
   100 void Relay( SOCKADDR_IN aSocketAddress, char *aSerialPortName )
       
   101 {
       
   102 	int err;
       
   103 	CSerialPort serial_port;
       
   104 
       
   105 	// repeat...
       
   106 	while( 1 ) {
       
   107 
       
   108 		// open the serial port - if this fails then pause and retry
       
   109 		err = serial_port.OpenPort( aSerialPortName );
       
   110 		if( err != 0 ) {
       
   111 			fprintf( stderr, "Failed to open serial port %s (%d)\n", aSerialPortName, err );
       
   112 			Sleep( TO_RETRY );
       
   113 			continue;
       
   114 		}
       
   115 
       
   116 		// try and establish a session (might succeed, might fail, makes no difference here)
       
   117 		RelaySession( aSocketAddress, &serial_port );
       
   118 
       
   119 		// close the port
       
   120 		serial_port.ClosePort();
       
   121 	}
       
   122 
       
   123 	// done
       
   124 	return;
       
   125 }
       
   126 
       
   127 
       
   128 /*************************************************************************************
       
   129  *
       
   130  * RelaySession()
       
   131  *
       
   132  ************************************************************************************/
       
   133 void RelaySession( SOCKADDR_IN aSocketAddress, CSerialPort *aSerialPort )
       
   134 {
       
   135 	char recv_buffer;
       
   136 	int err, errcode, bytes_read = 0, slen, initial_string_buffer_length;
       
   137 	CSerialTcpRelay relay;
       
   138 	TRelayError rerr;
       
   139 
       
   140 	int current_at_state = 0;
       
   141 	char expected_at_char[] = { 'A', 'T', 0x0d, 0 };
       
   142 	char initial_string_buffer[INITIALSTRINGBUFFERSIZE] = { 0 };
       
   143 
       
   144 	// wait for some bytes to arrive on the port
       
   145 	fprintf( stdout, "Waiting for new session\n" );
       
   146 	while( 1 ) {
       
   147 
       
   148 		// read from the serial port - if there is an error then exit
       
   149 		bytes_read = 1;
       
   150 		err = aSerialPort->ReceiveBytes( &recv_buffer, &bytes_read );
       
   151 		if( err != 0 ) {
       
   152 			fprintf( stderr, "Error reading from the serial port (%s)\n", strerror(err) );
       
   153 			break;
       
   154 		}
       
   155 
       
   156 		// if nothing was read then just continue
       
   157 		if( bytes_read == 0 ) {
       
   158 			continue;
       
   159 		}
       
   160 
       
   161 		// if we read a char that does not match the ignore string then try and
       
   162 		// create a session
       
   163 		if( recv_buffer != expected_at_char[current_at_state] ) {
       
   164 			strncpy( initial_string_buffer, expected_at_char, INITIALSTRINGBUFFERSIZE );
       
   165 			initial_string_buffer[current_at_state] = 0;
       
   166 			slen = strlen( initial_string_buffer );
       
   167 			assert( slen < (INITIALSTRINGBUFFERSIZE-2) );
       
   168 			initial_string_buffer[slen] = recv_buffer;
       
   169 			initial_string_buffer[slen+1] = 0;
       
   170 			initial_string_buffer_length = strlen( initial_string_buffer );
       
   171 			break;
       
   172 		}
       
   173 
       
   174 		// otherwise update the at_state
       
   175 		current_at_state += 1;
       
   176 		current_at_state = ((expected_at_char[current_at_state] == 0) ? 0 : current_at_state);
       
   177 	}
       
   178 	
       
   179 	// some data was received - try and start a session
       
   180 	rerr = relay.InitialiseRelay( aSerialPort, aSocketAddress, initial_string_buffer, initial_string_buffer_length, &errcode );
       
   181 	if( rerr != RE_SUCCESS ) {
       
   182 		PrintRelayError( rerr, errcode );
       
   183 		return;
       
   184 	}
       
   185 	fprintf( stdout, "Session established\n" );
       
   186 
       
   187 	// session established - execute
       
   188 	rerr = relay.ExecuteRelay();
       
   189 	if( rerr != RE_SUCCESS ) {
       
   190 		fprintf( stderr, "ExecuteRelay returned %d\n", rerr );
       
   191 	}
       
   192 	fprintf( stdout, "Session closed\n" );
       
   193 	
       
   194 	// do time-wait 
       
   195 	Sleep( TO_TIMEWAIT );
       
   196 }
       
   197 
       
   198 
       
   199 /*************************************************************************************
       
   200  *
       
   201  * PrintRelayError()
       
   202  *
       
   203  ************************************************************************************/
       
   204 void PrintRelayError( TRelayError aRelayError, int aErrCode )
       
   205 {
       
   206 	char *relay_error_string[] = { NULL, "socket() failed", "connect() failed", "initial send() failed" };
       
   207 	fprintf( stderr, "Failed to initialise the relay - %s - %d\n", relay_error_string[aRelayError], aErrCode );
       
   208 }
       
   209 
       
   210 
       
   211