os/ossrv/genericopenlibs/cstdlib/TSTLIB/tserial.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 1997-2005 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description:
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <stdlib.h>	/* definition of exit() */
sl@0
    20
#include <stdio.h>
sl@0
    21
#include <errno.h>
sl@0
    22
#include <string.h>
sl@0
    23
#include <sys/unistd.h>
sl@0
    24
#include <sys/ioctl.h>
sl@0
    25
#include "ctest.h"
sl@0
    26
sl@0
    27
sl@0
    28
int GlobalPort;
sl@0
    29
sl@0
    30
void DoSharedStuff(void)
sl@0
    31
	{
sl@0
    32
		int p1, p2, ret;
sl@0
    33
		SerialConfig config;
sl@0
    34
		p1 = open("COM1:",  1);
sl@0
    35
		p2 = open("COM1:",  1);
sl@0
    36
sl@0
    37
		//try changing the settings
sl@0
    38
		ret = ioctl(p1, COMMIOCTL_GETCONFIG, &config);
sl@0
    39
sl@0
    40
		config.iRate = Bps115200;
sl@0
    41
		ret = ioctl(p2, COMMIOCTL_SETCONFIG, &config);
sl@0
    42
sl@0
    43
		config.iRate = Bps1200;
sl@0
    44
		ret = ioctl(p1, COMMIOCTL_GETCONFIG, &config);
sl@0
    45
sl@0
    46
		close(p2);
sl@0
    47
		config.iRate = Bps1200;
sl@0
    48
		ret = ioctl(p1, COMMIOCTL_GETCONFIG, &config);
sl@0
    49
		close(p1);
sl@0
    50
sl@0
    51
	}
sl@0
    52
void OpenAndConfigure(void)
sl@0
    53
	{
sl@0
    54
	int res;
sl@0
    55
	SerialConfig sc;
sl@0
    56
sl@0
    57
	GlobalPort = open("COM1:",0);
sl@0
    58
	res = ioctl(GlobalPort, COMMIOCTL_GETCONFIG, &sc);
sl@0
    59
	sc.iRate = Bps115200;
sl@0
    60
	sc.iParity = ParityNone;
sl@0
    61
	res = ioctl(GlobalPort, COMMIOCTL_SETCONFIG, &sc);
sl@0
    62
	}
sl@0
    63
sl@0
    64
sl@0
    65
void WaitAndRead(void)
sl@0
    66
	{
sl@0
    67
	int port = GlobalPort;
sl@0
    68
	int ret;
sl@0
    69
	char buffer[100];
sl@0
    70
sl@0
    71
	printf("Wait and read\n");
sl@0
    72
	ret = read(port, buffer, 10);
sl@0
    73
	printf("got it %x\n",buffer[0]);
sl@0
    74
	}
sl@0
    75
sl@0
    76
sl@0
    77
void WriteABit(int x)
sl@0
    78
	{
sl@0
    79
	int port = GlobalPort;
sl@0
    80
	char bob[100];
sl@0
    81
	sprintf(bob, "Test Write >>%d<<    >>%x<<\n", x, x);
sl@0
    82
	write(port, bob, strlen(bob));
sl@0
    83
	}
sl@0
    84
sl@0
    85
void writelots(void)
sl@0
    86
	{
sl@0
    87
	int n;
sl@0
    88
	for (n=0;n<10000;n++)
sl@0
    89
		WriteABit(n);
sl@0
    90
	}
sl@0
    91
sl@0
    92
sl@0
    93
void DoTests(void)
sl@0
    94
	{	
sl@0
    95
	int port1, port2;
sl@0
    96
	int timeout = 0;
sl@0
    97
	int threshold = 0;
sl@0
    98
	int ret=0;
sl@0
    99
sl@0
   100
	port1 = open("COM1:",  0);
sl@0
   101
sl@0
   102
	//this one should fail
sl@0
   103
	port2 = open("COM1:",  0);
sl@0
   104
sl@0
   105
	if (-1 != port1)
sl@0
   106
		{
sl@0
   107
		//play with the signals
sl@0
   108
		int sigs[] = {0,0};
sl@0
   109
 		int sig = 0;
sl@0
   110
		ret = ioctl(port1, COMMIOCTL_SETSIGNALS, &sigs[0]);
sl@0
   111
		ret = ioctl(port1, COMMIOCTL_GETSIGNALS, &sig);
sl@0
   112
		sig = 5000;
sl@0
   113
		ret = ioctl(port1, COMMIOCTL_BREAK, &sig);
sl@0
   114
		close(port1);
sl@0
   115
		}
sl@0
   116
sl@0
   117
	port1 = open("COM1:",  0);
sl@0
   118
	port2 = open("COM2:",0);
sl@0
   119
sl@0
   120
sl@0
   121
	if (-1 != port2)
sl@0
   122
		{
sl@0
   123
		int len;
sl@0
   124
		SerialConfig config;
sl@0
   125
		char buffer[1024];
sl@0
   126
		size_t size = 100;
sl@0
   127
sl@0
   128
sl@0
   129
		timeout = 2000;
sl@0
   130
		ret = ioctl(port2, COMMIOCTL_SETREADTIMEOUT, &timeout);
sl@0
   131
		timeout = 0;
sl@0
   132
		ret = ioctl(port2, COMMIOCTL_GETREADTIMEOUT, &timeout);
sl@0
   133
sl@0
   134
				
sl@0
   135
		threshold = 2000;
sl@0
   136
		ret = ioctl(port2, COMMIOCTL_SETREADTHRESHOLD, &threshold);
sl@0
   137
		threshold = 0;
sl@0
   138
		ret = ioctl(port2, COMMIOCTL_GETREADTHRESHOLD, &threshold);
sl@0
   139
sl@0
   140
sl@0
   141
		//buffer lengths
sl@0
   142
		len = 0;
sl@0
   143
		ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &len);
sl@0
   144
sl@0
   145
		len = 2048;
sl@0
   146
		ret = ioctl(port1, COMMIOCTL_SETBUFFERLENGTH, &len);
sl@0
   147
sl@0
   148
		len = 0;
sl@0
   149
		ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &len);
sl@0
   150
sl@0
   151
		len = 10000000;
sl@0
   152
		ret = ioctl(port1, COMMIOCTL_SETBUFFERLENGTH, &len);
sl@0
   153
		
sl@0
   154
		len = 0;
sl@0
   155
		ret = ioctl(port1, COMMIOCTL_GETBUFFERLENGTH, &len);
sl@0
   156
sl@0
   157
sl@0
   158
		//try changing the settings
sl@0
   159
		ret = ioctl(port1, COMMIOCTL_GETCONFIG, &config);
sl@0
   160
sl@0
   161
		config.iRate = Bps115200;
sl@0
   162
		ret = ioctl(port1, COMMIOCTL_SETCONFIG, &config);
sl@0
   163
sl@0
   164
		config.iRate = Bps1200;
sl@0
   165
		ret = ioctl(port1, COMMIOCTL_GETCONFIG, &config);
sl@0
   166
sl@0
   167
sl@0
   168
		timeout = threshold = -1;
sl@0
   169
		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &threshold);
sl@0
   170
		ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &timeout);
sl@0
   171
		
sl@0
   172
		printf("Talk to me, ESC to exit\n");
sl@0
   173
		do
sl@0
   174
			{
sl@0
   175
			ret = read(port1, buffer, size);
sl@0
   176
			if (ret != -1)
sl@0
   177
				printf("look what I got >>> %c\t%x\n",buffer[0],buffer[0]);
sl@0
   178
			else
sl@0
   179
				printf("error, errno is %x \n",errno);
sl@0
   180
			}
sl@0
   181
		while (buffer[0] != 27);
sl@0
   182
sl@0
   183
		printf("Talk to me in blocks of 5, EXIT! to exit\n");
sl@0
   184
		threshold = 5;
sl@0
   185
		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &threshold);
sl@0
   186
		do
sl@0
   187
			{
sl@0
   188
			ret = read(port1, buffer, size);
sl@0
   189
			if (ret >=0)
sl@0
   190
				{
sl@0
   191
				buffer[ret] = 0;
sl@0
   192
				printf("look what I got >>> %s\n",buffer);
sl@0
   193
				}
sl@0
   194
			else
sl@0
   195
				printf("error\n");
sl@0
   196
			}
sl@0
   197
		while (strcmp(buffer, "EXIT!"));
sl@0
   198
		printf("Wait 10 seconds then give up\n");
sl@0
   199
		timeout = 10000;
sl@0
   200
		ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &timeout);
sl@0
   201
		threshold = 1;
sl@0
   202
		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &threshold);
sl@0
   203
		ret = read(port1, buffer, size);
sl@0
   204
		if (ret > 0)
sl@0
   205
			printf("look what I got >>> %c\t%x\n",buffer[0],buffer[0]);
sl@0
   206
		else
sl@0
   207
			printf("timeout\n");
sl@0
   208
sl@0
   209
		
sl@0
   210
		//no threshold, but with a 5 second timeout
sl@0
   211
		printf("Now for the hard one!\n");
sl@0
   212
		timeout = 5000;
sl@0
   213
		ret = ioctl(port1, COMMIOCTL_SETREADTIMEOUT, &timeout);
sl@0
   214
		threshold = -1;
sl@0
   215
		ret = ioctl(port1, COMMIOCTL_SETREADTHRESHOLD, &threshold);
sl@0
   216
		ret = read(port1, buffer, size);
sl@0
   217
		if (ret<0)
sl@0
   218
			printf("got an error, errno is 56 if it a timeout. erno = %d\n", errno);
sl@0
   219
		else
sl@0
   220
			printf("look what I got >>> %c\t%x\n",buffer[0],buffer[0]);
sl@0
   221
sl@0
   222
		printf("Going to write some stuff now\n");
sl@0
   223
		ret = write(port1, "Lardy dardy dardy cheese\n\n",26);
sl@0
   224
		printf("Written some stuff now and got a ret of %d\n", ret);
sl@0
   225
sl@0
   226
sl@0
   227
		close(port2);
sl@0
   228
		}
sl@0
   229
	
sl@0
   230
	if (-1 != port1)
sl@0
   231
		close(port1);
sl@0
   232
sl@0
   233
	printf("Press key to exit");
sl@0
   234
	getchar();
sl@0
   235
	}
sl@0
   236
sl@0
   237
sl@0
   238
sl@0
   239
void pong(void)
sl@0
   240
	{
sl@0
   241
		char buf[50];
sl@0
   242
		int port = open("IRCOM:0", 0);
sl@0
   243
		int x;
sl@0
   244
		strcpy(buf,"test shot #");
sl@0
   245
		for (x=0;x<10;x++);
sl@0
   246
			{
sl@0
   247
			write(port, buf, strlen(buf));
sl@0
   248
			read(port,buf, 50);
sl@0
   249
			strcat(buf,"#");
sl@0
   250
			}
sl@0
   251
		close(port);
sl@0
   252
	}
sl@0
   253
sl@0
   254
void ping(void)
sl@0
   255
	{
sl@0
   256
		char buf[50];
sl@0
   257
		int x;
sl@0
   258
		int port = open("IRCOM:0", 0);
sl@0
   259
		for (x=0;x<10;x++);
sl@0
   260
			{
sl@0
   261
			read(port,buf, 50);
sl@0
   262
			strcat(buf,"*");
sl@0
   263
			write(port, buf, strlen(buf));
sl@0
   264
			}
sl@0
   265
		close(port);
sl@0
   266
	}
sl@0
   267
sl@0
   268
/**
sl@0
   269
@SYMTestCaseID          SYSLIB-STDLIB-CT-1112
sl@0
   270
@SYMTestCaseDesc	    Tests for serial port
sl@0
   271
@SYMTestPriority 	    High
sl@0
   272
@SYMTestActions  	    Notifies a thread for events on port 
sl@0
   273
@SYMTestExpectedResults Test must not fail
sl@0
   274
@SYMREQ                 REQ0000
sl@0
   275
*/					
sl@0
   276
void WaitForNotifyThread(void)
sl@0
   277
	{
sl@0
   278
	int val[2];
sl@0
   279
	int ret = 0;
sl@0
   280
	
sl@0
   281
	while (!ret)
sl@0
   282
		{
sl@0
   283
		val[0] = KNotifyFramingError|KNotifyOverrunError|KNotifyParityError;
sl@0
   284
		val[1] = -1;
sl@0
   285
		ret = ioctl(GlobalPort, COMMIOCTL_NOTIFY, &val[0]);
sl@0
   286
		printf("NotifyThread ret = %d, val[0] is %d, val[1] is %d\n", ret, val[0], val[1]);
sl@0
   287
		}
sl@0
   288
	}
sl@0
   289
sl@0
   290
/**
sl@0
   291
@SYMTestCaseID          SYSLIB-STDLIB-CT-1113
sl@0
   292
@SYMTestCaseDesc	    Tests for serial port
sl@0
   293
@SYMTestPriority 	    High
sl@0
   294
@SYMTestActions  	    Keep reading infinitely from the port
sl@0
   295
@SYMTestExpectedResults Test must not fail
sl@0
   296
@SYMREQ                 REQ0000
sl@0
   297
*/					
sl@0
   298
void readloop(void)
sl@0
   299
	{
sl@0
   300
	char buf[100];
sl@0
   301
	int ret = 0;
sl@0
   302
	while (!ret)
sl@0
   303
		{
sl@0
   304
		read(GlobalPort, buf, 100);
sl@0
   305
		printf("ReadThread got %x\n", buf[0]);
sl@0
   306
		}
sl@0
   307
	}
sl@0
   308
sl@0
   309
int main(void)
sl@0
   310
	{
sl@0
   311
	void* client;
sl@0
   312
	void* t1;
sl@0
   313
	void*t2;
sl@0
   314
	void*t3;
sl@0
   315
	int err;
sl@0
   316
	
sl@0
   317
sl@0
   318
//	DoTests();
sl@0
   319
sl@0
   320
//	printf("Do it again using the CPosixServer\n");
sl@0
   321
sl@0
   322
	start_posix_server();	/* calls SpawnPosixServer from C++ code */
sl@0
   323
sl@0
   324
//	client=create_thread(DoTests, "serial tests");
sl@0
   325
//	start_thread(client);
sl@0
   326
//	err=wait_for_thread(client);
sl@0
   327
sl@0
   328
	
sl@0
   329
//	t3 = create_thread(OpenAndConfigure,"cfg");
sl@0
   330
//	start_thread(t3);
sl@0
   331
//	err=wait_for_thread(t3);
sl@0
   332
sl@0
   333
//	t1 = create_thread(WaitAndRead, "open and wait");
sl@0
   334
//	t2 = create_thread(writelots, "writelots");
sl@0
   335
//	start_thread(t1);
sl@0
   336
//	start_thread(t2);
sl@0
   337
//	err=wait_for_thread(t1);
sl@0
   338
//	err=wait_for_thread(t2);
sl@0
   339
//	close(GlobalPort);
sl@0
   340
sl@0
   341
	
sl@0
   342
	OpenAndConfigure();
sl@0
   343
	t1 = create_thread(WaitForNotifyThread, "notify");
sl@0
   344
	t2 = create_thread(readloop, "readloop");
sl@0
   345
sl@0
   346
	start_thread(t1);
sl@0
   347
	start_thread(t2);
sl@0
   348
sl@0
   349
	err=wait_for_thread(t2);
sl@0
   350
	err=wait_for_thread(t1);
sl@0
   351
	
sl@0
   352
	close(GlobalPort);
sl@0
   353
	return 0;
sl@0
   354
	}
sl@0
   355