source: rtems/testsuites/libtests/termios/init.c @ 1c6926c1

Last change on this file since 1c6926c1 was 1c6926c1, checked in by Kevin Kirspel <kevin-kirspel@…>, on Mar 21, 2017 at 7:39:48 PM

termios: Synchronize with latest FreeBSD headers

Adding modified FreeBSD headers to synchronize RTEMS termios with
FreeBSD. Modify termios to support dedicated input and output baud for
termios structure. Updated BSPs to use dedicated input and output baud
in termios structure. Updated tools to use dedicated input and output
baud in termios structure. Updated termios testsuites to use dedicated
input and output baud in termios structure.

Close #2897.

  • Property mode set to 100644
File size: 20.0 KB
Line 
1/*
2 * RTEMS configuration/initialization
3 *
4 * This program may be distributed and used for any purpose.
5 * I ask only that you:
6 *  1. Leave this author information intact.
7 *  2. Document any changes you make.
8 *
9 * W. Eric Norum
10 * Saskatchewan Accelerator Laboratory
11 * University of Saskatchewan
12 * Saskatoon, Saskatchewan, CANADA
13 * eric@skatter.usask.ca
14 *
15 * Additions:
16 * Charles-Antoine Gauthier
17 * Software Engineering Group
18 * Institute for Information Technology
19 * National Research Council of Canada
20 * charles.gauthier@nrc.ca
21 */
22
23#ifdef HAVE_CONFIG_H
24#include "config.h"
25#endif
26
27#include <bsp.h>
28
29#include <rtems/shell.h>
30
31#include <stdio.h>
32#include <unistd.h>
33#include <termios.h>
34#include <errno.h>
35#include <string.h>
36
37#include <tmacros.h>
38
39const char rtems_test_name[] = "TERMIOS";
40
41/* forward declarations to avoid warnings */
42rtems_task Init(rtems_task_argument argument);
43void print_32bits(unsigned long bits, unsigned char size, char * names[]);
44void print_c_iflag(struct termios * tp);
45void print_c_oflag(struct termios * tp);
46void print_c_lflag(struct termios * tp);
47void print_c_cflag(struct termios * tp);
48void print_c_cc(struct termios * tp);
49void print_baud(const char* name, speed_t spd);
50void print_termios(struct termios *tp);
51unsigned long get_baud_rate(void);
52unsigned long get_parity(void);
53unsigned long get_stop_bits(void);
54unsigned long get_data_bits(void);
55void change_line_settings(struct termios *tp);
56void canonical_input(struct termios *tp);
57void do_raw_input(int vmin, int vtime);
58void usage(void);
59
60#if !defined(fileno)
61int fileno( FILE *stream); /* beyond ANSI */
62#endif
63
64/* Some of the termios dumping code depends on bit positions! */
65
66void print_32bits( unsigned long bits, unsigned char size, char * names[] )
67{
68  unsigned char i;
69
70  for( i = 0; i < size; i++ ) {
71    if( (bits >> i) & 0x1 )
72      printf( "%s ", names[i] );
73  }
74}
75
76
77void print_c_iflag( struct termios * tp )
78{
79  char * c_iflag_bits [] = {
80    "IGNBRK",   /* 0000001 */
81    "BRKINT",   /* 0000002 */
82    "IGNPAR",   /* 0000004 */
83    "PARMRK",   /* 0000010 */
84    "INPCK",    /* 0000020 */
85    "ISTRIP",   /* 0000040 */
86    "INLCR",    /* 0000100 */
87    "IGNCR",    /* 0000200 */
88    "ICRNL",    /* 0000400 */
89    "IUCLC",    /* 0001000 */
90    "IXON",     /* 0002000 */
91    "IXANY",    /* 0004000 */
92    "IXOFF",    /* 0010000 */
93    "IMAXBEL",  /* 0020000 */
94    "unknown",  /* 0040000 */
95    "unknown",  /* 0100000 */
96    "unknown",  /* 0200000 */
97    "unknown",  /* 0400000 */
98    "unknown",  /* 1000000 */
99    "unknown",  /* 2000000 */
100    "unknown"   /* 4000000 */
101  };
102
103  printf( "c_iflag = 0x%08x\n\t", tp->c_iflag );
104  print_32bits( tp->c_iflag, sizeof( c_iflag_bits )/sizeof( char * ), c_iflag_bits );
105  printf( "\n" );
106}
107
108
109void print_c_oflag( struct termios * tp )
110{
111  printf( "c_oflag = 0x%08x\n\t", tp->c_oflag );
112
113  if( tp->c_oflag & OPOST )
114    printf( "OPOST " );
115
116  if( tp->c_oflag & OLCUC )
117    printf( "OLCUC " );
118
119  if( tp->c_oflag & ONLCR )
120    printf( "ONLCR " );
121
122  if( tp->c_oflag & ONOEOT )
123    printf( "ONOEOT " );
124
125  if( tp->c_oflag & OCRNL )
126    printf( "OCRNL " );
127
128  if( tp->c_oflag & ONOCR )
129    printf( "ONOCR " );
130
131  if( tp->c_oflag & ONLRET )
132    printf( "ONLRET " );
133
134  if( tp->c_oflag & OFILL )
135    printf( "OFILL " );
136
137  if( tp->c_oflag & OFDEL )
138    printf( "OFDEL " );
139
140  switch( tp->c_oflag & NLDLY ) {
141    case NL0:
142      printf( "NL0 " );
143      break;
144
145    case NL1:
146      printf( "NL1 " );
147      break;
148  }
149
150  switch( tp->c_oflag & CRDLY ) {
151    case CR0:
152      printf( "CR0 " );
153      break;
154
155    case CR1:
156      printf( "CR1 " );
157      break;
158
159    case CR2:
160      printf( "CR2 " );
161      break;
162
163    case CR3:
164      printf( "CR3 " );
165      break;
166  }
167
168  switch( tp->c_oflag & TABDLY ) {
169    case TAB0:
170      printf( "TAB0 " );
171      break;
172
173    case TAB1:
174      printf( "TAB1 " );
175      break;
176
177    case TAB2:
178      printf( "TAB2 " );
179      break;
180
181    case TAB3:
182      printf( "TAB3 " );
183      break;
184  }
185
186  switch( tp->c_oflag & BSDLY ) {
187    case BS0:
188      printf( "BS0 " );
189      break;
190
191    case BS1:
192      printf( "BS1 " );
193      break;
194  }
195
196  switch( tp->c_oflag & VTDLY ) {
197    case VT0:
198      printf( "VT0 " );
199      break;
200
201    case VT1:
202      printf( "VT1 " );
203      break;
204  }
205
206  switch( tp->c_oflag & FFDLY ) {
207    case FF0:
208      printf( "FF0" );
209      break;
210
211    case FF1:
212      printf( "FF1" );
213      break;
214  }
215  printf( "\n" );
216}
217
218
219void print_c_lflag( struct termios * tp )
220{
221  char * c_lflag_bits [] = {
222    "ECHOKE",      /* 0x00000001 */
223    "ECHOE",       /* 0x00000002 */
224    "ECHOK",       /* 0x00000004 */
225    "ECHO",        /* 0x00000008 */
226    "ECHONL",      /* 0x00000010 */
227    "ECHOPRT",     /* 0x00000020 */
228    "ECHOCTL",     /* 0x00000040 */
229    "ISIG",        /* 0x00000080 */
230    "ICANON",      /* 0x00000100 */
231    "ALTWERASE",   /* 0x00000200 */
232    "IEXTEN",      /* 0x00000400 */
233    "EXTPROC",     /* 0x00000800 */
234    "XCASE",       /* 0x00001000 */
235    "unknown",     /* 0x00002000 */
236    "unknown",     /* 0x00004000 */
237    "unknown",     /* 0x00008000 */
238    "unknown",     /* 0x00010000 */
239    "unknown",     /* 0x00020000 */
240    "unknown",     /* 0x00040000 */
241    "unknown",     /* 0x00080000 */
242    "unknown",     /* 0x00100000 */
243    "unknown",     /* 0x00200000 */
244    "TOSTOP",      /* 0x00400000 */
245    "FLUSHO",      /* 0x00800000 */
246    "unknown",     /* 0x01000000 */
247    "NOKERNINFO",  /* 0x02000000 */
248    "unknown",     /* 0x04000000 */
249    "unknown",     /* 0x08000000 */
250    "unknown",     /* 0x10000000 */
251    "PENDIN",      /* 0x20000000 */
252    "unknown",     /* 0x40000000 */
253    "NOFLSH",      /* 0x80000000 */
254  };
255
256  printf( "c_lflag = 0x%08x\n\t", tp->c_lflag );
257  print_32bits( tp->c_lflag, sizeof( c_lflag_bits )/sizeof( char * ), c_lflag_bits );
258  printf( "\n" );
259}
260
261
262void print_c_cflag( struct termios * tp )
263{
264  printf( "c_cflag = 0x%08x\n", tp->c_cflag );
265
266  switch( tp->c_cflag & CSIZE ) {
267    case CS5:
268      printf( "\tCSIZE =\tCS5\n" );
269      break;
270
271    case CS6:
272      printf( "\tCSIZE =\tCS6\n" );
273      break;
274
275    case CS7:
276      printf( "\tCSIZE =\tCS7\n" );
277      break;
278
279    case CS8:
280      printf( "\tCSIZE =\tCS8\n" );
281      break;
282  }
283
284  if( tp->c_cflag & CIGNORE )
285    printf( "\tCIGNORE set: iqnore c_cflags enabled\n" );
286  else
287    printf( "\tCIGNORE clear: iqnore c_cflags disabled\n" );
288
289  if( tp->c_cflag & CSTOPB )
290    printf( "\tCSTOPB set: send 2 stop bits\n" );
291  else
292    printf( "\tCSTOPB clear: send 1 stop bit\n" );
293
294  if( tp->c_cflag & PARENB )
295    printf( "\tPARENB set: parity enabled\n" );
296  else
297    printf( "\tPARENB clear: parity disabled\n" );
298
299  if( tp->c_cflag & PARODD )
300    printf( "\tPARODD set: parity odd\n" );
301  else
302    printf( "\tPARODD clear: parity even\n" );
303
304  if( tp->c_cflag & CREAD )
305    printf( "\tCREAD set: receiver enabled\n" );
306  else
307    printf( "\tCREAD clear: treceiver disabled\n" );
308
309  if( tp->c_cflag & HUPCL )
310    printf( "\tHUPCL set: enabled\n" );
311  else
312    printf( "\tHUPCL clear: disabled\n" );
313
314  if( tp->c_cflag & CLOCAL )
315    printf( "\tCLOCAL set: ignore modem lines\n" );
316  else
317    printf( "\tCLOCAL clear: don't ignore modem lines\n" );
318
319  if( tp->c_cflag & CCTS_OFLOW )
320    printf( "\tCCTS_OFLOW: hardware CTS output flow control enabled\n" );
321  else
322    printf( "\tCCTS_OFLOW: hardware CTS output flow control disabled\n" );
323
324  if( tp->c_cflag & CRTS_IFLOW )
325    printf( "\tCRTS_IFLOW: hardware RTS input flow control enabled\n" );
326  else
327    printf( "\tCRTS_IFLOW: hardware RTS input flow control disabled\n" );
328
329  if( tp->c_cflag & CRTSCTS )
330    printf( "\tCRTSCTS: harware flow control enabled?\n" );
331  else
332    printf( "\tCRTSCTS: hardware flow control disabled?\n" );
333
334  if( tp->c_cflag & CDSR_OFLOW )
335    printf( "\tCDSR_OFLOW: hardware DSR output flow control enabled\n" );
336  else
337    printf( "\tCDSR_OFLOW: hardware DSR output flow control disabled\n" );
338
339  if( tp->c_cflag & CDTR_IFLOW )
340    printf( "\tCDTR_IFLOW: hardware DTR input flow control enabled\n" );
341  else
342    printf( "\tCDTR_IFLOW: hardware DTR input flow control disabled\n" );
343
344  if( tp->c_cflag & CCAR_OFLOW )
345    printf( "\tCCAR_OFLOW: hardware CD output flow control enabled\n" );
346  else
347    printf( "\tCCAR_OFLOW: hardware CD output flow control disabled\n" );
348}
349
350
351void print_c_cc( struct termios * tp )
352{
353  size_t i;
354  char * cc_index_names [ /* NCCS */ ] = {
355    "[VEOF]    ",   /* 0 */
356    "[VEOL]    ",   /* 1 */
357    "[VEOL2]   ",   /* 2 */
358    "[VERASE]  ",   /* 3 */
359    "[VWERASE] ",   /* 4 */
360    "[VKILL]   ",   /* 5 */
361    "[VREPRINT]",   /* 6 */
362    "[VERASE2] ",   /* 7 */
363    "[VINTR]   ",   /* 8 */
364    "[VQUIT]   ",   /* 9 */
365    "[VSUSP]   ",   /* 10 */
366    "[VDSUSP]  ",   /* 11 */
367    "[VSTART]  ",   /* 12 */
368    "[VSTOP]   ",   /* 13 */
369    "[VLNEXT]  ",   /* 14 */
370    "[VDISCARD]",   /* 15 */
371    "[VMIN]    ",   /* 16 */
372    "[VTIME]   ",   /* 17 */
373    "[VSTATUS] ",   /* 18 */
374    "unknown   ",   /* 19 */
375  };
376
377  for( i = 0; i < sizeof(cc_index_names)/sizeof(char*) ; i++ ) {
378    printf( "c_cc%s = 0x%08x\n", cc_index_names[i], tp->c_cc[i] );
379  }
380}
381
382
383void print_baud( const char* name, speed_t spd )
384{
385  switch( spd ) {
386  case B0:
387    printf( "%s = B0\n", name );
388    break;
389
390  case B50:
391    printf( "%s = B50\n", name );
392    break;
393
394  case B75:
395    printf( "%s = B75\n", name );
396    break;
397
398  case B110:
399    printf( "%s = B110\n", name );
400    break;
401
402  case B134:
403    printf( "%s = B134\n", name );
404    break;
405
406  case B150:
407    printf( "%s = B150\n", name );
408    break;
409
410  case B200:
411    printf( "%s = B200\n", name );
412    break;
413
414  case B300:
415    printf( "%s = B300\n", name );
416    break;
417
418  case B600:
419    printf( "%s = B600\n", name );
420    break;
421
422  case B1200:
423    printf( "%s = B1200\n", name );
424    break;
425
426  case B1800:
427    printf( "%s = B1800\n", name );
428    break;
429
430  case B2400:
431    printf( "%s = B2400\n", name );
432    break;
433
434  case B4800:
435    printf( "%s = B4800\n", name );
436    break;
437
438  case B9600:
439    printf( "%s = B9600\n", name );
440    break;
441
442  case B19200:
443    printf( "%s = B19200\n", name );
444    break;
445
446  case B38400:
447    printf( "%s = B38400\n", name );
448    break;
449
450  case B7200:
451    printf( "%s = B7200\n", name );
452    break;
453
454  case B14400:
455    printf( "%s = B14400\n", name );
456    break;
457
458  case B28800:
459    printf( "%s = B28800\n", name );
460    break;
461
462  case B57600:
463    printf( "%s = B57600\n", name );
464    break;
465
466  case B76800:
467    printf( "%s = B76800\n", name );
468    break;
469
470  case B115200:
471    printf( "%s = B115200\n", name );
472    break;
473
474  case B230400:
475    printf( "%s = B230400\n", name );
476    break;
477
478  case B460800:
479    printf( "%s = B460800\n", name );
480    break;
481
482  case B921600:
483    printf( "%s = B921600\n", name );
484    break;
485
486  default:
487    printf( "%s = unknown (0x%08x)\n", name, (unsigned int)spd );
488    break;
489  }
490}
491
492
493void print_termios( struct termios *tp )
494{
495  printf( "\nLooking at the current termios settings:\n\n" );
496  print_c_iflag( tp );
497  print_c_oflag( tp );
498  print_c_cflag( tp );
499  print_c_lflag( tp );
500  print_c_cc( tp );
501  print_baud( "c_ispeed", tp->c_ispeed );
502  print_baud( "c_ospeed", tp->c_ospeed );
503  printf( "\n" );
504}
505
506
507unsigned long get_baud_rate(void)
508{
509  unsigned long baud_rate;
510
511  while( 1 ) {
512    printf( "Enter the numerical value for the new baud rate.\n" );
513    printf( "Choices are: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800\n" );
514    printf( "2400, 4800, 9600, 19200, 38400, 7200, 14400, 28800, 57600, 76800\n" );
515    printf( "115200, 230400, 460800, 921600\n" );
516    printf( "\nYour choice: " );
517    scanf( "%lu", &baud_rate );
518    printf( "\n" );
519    switch( baud_rate ) {
520      case 50:     return B50;
521      case 75:     return B75;
522      case 110:    return B110;
523      case 134:    return B134;
524      case 150:    return B150;
525      case 200:    return B200;
526      case 300:    return B300;
527      case 600:    return B600;
528      case 1200:   return B1200;
529      case 1800:   return B1800;
530      case 2400:   return B2400;
531      case 4800:   return B4800;
532      case 9600:   return B9600;
533      case 19200:  return B19200;
534      case 38400:  return B38400;
535      case 7200:   return B7200;
536      case 14400:  return B14400;
537      case 28800:  return B28800;
538      case 57600:  return B57600;
539      case 76800:  return B76800;
540      case 115200: return B115200;
541      case 230400: return B230400;
542      case 460800: return B460800;
543      case 921600: return B921600;
544
545      default:
546        printf( "%lu is not a valid choice. Try again.\n\n", baud_rate );
547        break;
548    }
549  }
550}
551
552
553unsigned long get_parity(void)
554{
555  int parity;
556
557  while( 1 ) {
558    printf( "Enter the numerical value for the new parity\n" );
559    printf( "Choices are: 0 for no parity, 1 for even parity, 2 for odd parity\n" );
560    printf( "\nYour choice: " );
561    scanf( "%d", &parity );
562    printf( "\n" );
563    switch( parity ) {
564      case 0:
565        return 0;
566
567      case 1:
568        return PARENB;
569
570      case 2:
571        return PARENB | PARODD;
572
573      default:
574        printf( "%d is not a valid choice. Try again.\n\n", parity );
575        break;
576    }
577  }
578}
579
580
581unsigned long get_stop_bits(void)
582{
583  int stop_bits;
584
585  while( 1 ) {
586    printf( "Enter the numerical value for the new number of stop bits\n" );
587    printf( "Choices are: 1 or 2\n" );
588    printf( "\nYour choice: " );
589    scanf( "%d", &stop_bits );
590    printf( "\n" );
591    switch( stop_bits ) {
592      case 1:
593        return 0;
594
595      case 2:
596        return CSTOPB;
597
598      default:
599        printf( "%d is not a valid choice. Try again.\n\n", stop_bits );
600        break;
601    }
602  }
603}
604
605
606unsigned long get_data_bits(void)
607{
608  int data_bits;
609
610  while( 1 ) {
611    printf( "Enter the numerical value for the new number of data bits\n" );
612    printf( "Choices are: 5, 6, 7 or 8\n" );
613    printf( "\nYour choice: " );
614    scanf( "%d", &data_bits );
615    printf( "\n" );
616    switch( data_bits ) {
617      case 5:
618        return CS5;
619
620      case 6:
621        return CS6;
622
623      case 7:
624        return CS7;
625
626      case 8:
627        return CS8;
628
629      default:
630        printf( "%d is not a valid choice. Try again.\n\n", data_bits );
631        break;
632    }
633  }
634}
635
636
637void change_line_settings( struct termios *tp )
638{
639  unsigned long baud_rate, parity, stop_bits, data_bits, sleep_time;
640
641  printf( "\nSetting line characteristics\n\n" );
642
643  baud_rate = get_baud_rate();
644  parity = get_parity();
645  stop_bits = get_stop_bits();
646  data_bits = get_data_bits();
647
648  printf( "NOTE: You will not see output until you switch your terminal settings!\n" );
649  printf( "WARNING: If you do not switch your terminal settings, your terminal may hang.\n" );
650  printf( "Enter the number of seconds the test will wait for you to switch your terminal\n" );
651  printf( "settings before it continues\n" );
652  printf( "Sleep time (in seconds): " );
653  scanf( "%lu", &sleep_time );
654  printf( "\n" );
655  printf( "Setting line to new termios settings in %lu seconds.\n", sleep_time );
656
657  sleep( sleep_time );
658
659  tp->c_cflag = CLOCAL | CREAD | parity | stop_bits | data_bits;
660  tp->c_ispeed = baud_rate;
661  tp->c_ospeed = baud_rate;
662  if( tcsetattr( fileno( stdin ), TCSADRAIN, tp ) < 0 ) {
663    perror( "change_line_settings(): tcsetattr() failed" );
664    rtems_test_exit( 1 );
665  }
666  printf( "Line settings set.\n" );
667}
668
669
670void canonical_input( struct termios *tp )
671{
672  char c;
673  bool first_time = true;
674
675  printf( "\nTesting canonical input\n\n" );
676
677  printf( "Setting line to canonical input mode.\n" );
678  tp->c_lflag = ISIG | ICANON | ECHO | ECHONL | ECHOK | ECHOE | ECHOPRT | ECHOCTL | IEXTEN;
679  tp->c_iflag = BRKINT | ICRNL | IXON | IMAXBEL;
680  if( tcsetattr( fileno( stdin ), TCSADRAIN, tp ) < 0 ) {
681    perror( "canonical_input(): tcsetattr() failed" );
682    rtems_test_exit( 1 );
683  }
684
685  while ( ( c = getchar () ) != '\n');
686  printf( "Testing getchar(). Type some text followed by carriage return\n" );
687  printf( "Each character you entered will be echoed back to you\n\n" );
688  while ( ( c = getchar () ) != '\n') {
689    if( first_time ) {
690      printf( "\nYou typed:\n");
691      first_time = false;
692    }
693    printf( "%c", c );
694  }
695  printf( "\n\nCanonical input test done.\n" );
696}
697
698
699/*
700 * Test raw (ICANON=0) input
701 */
702void do_raw_input( int vmin, int vtime )
703{
704  int i;
705  struct termios old, new;
706  rtems_interval ticksPerSecond, then, now;
707  unsigned int msec;
708  unsigned long count;
709  int nread;
710  unsigned char cbuf[100];
711
712  printf( "Raw input test with VMIN=%d  VTIME=%d\n", vmin, vtime );
713
714  ticksPerSecond = rtems_clock_get_ticks_per_second();
715  if ( tcgetattr( fileno ( stdin ), &old ) < 0 ) {
716    perror( "do_raw_input(): tcgetattr() failed" );
717    return;
718  }
719
720  new = old;
721  new.c_lflag &= ~( ICANON | ECHO | ECHONL | ECHOK | ECHOE | ECHOPRT | ECHOCTL );
722  new.c_cc[VMIN] = vmin;
723  new.c_cc[VTIME] = vtime;
724  if( tcsetattr( fileno( stdin ), TCSADRAIN, &new ) < 0 ) {
725    perror ("do_raw_input(): tcsetattr() failed" );
726    return;
727  }
728
729  do {
730    then = rtems_clock_get_ticks_since_boot();
731    count = 0;
732    for(;;) {
733      nread = read( fileno( stdin ), cbuf, sizeof cbuf );
734      if( nread < 0 ) {
735        perror( "do_raw_input(): read() failed" );
736        goto out;
737      }
738      count++;
739      if( nread != 0 )
740        break;
741    }
742    now = rtems_clock_get_ticks_since_boot();
743    msec = (now - then) * 1000 / ticksPerSecond;
744    printf( "Count:%-10lu  Interval:%3u.%3.3d  Char:",
745          count, msec / 1000, msec % 1000 );
746
747    for( i = 0 ; i < nread ; i++ )
748      printf (" 0x%2.2x", cbuf[i]);
749    printf ("\n");
750
751  } while( cbuf[0] != 'q' );
752
753out:
754  if( tcsetattr( fileno( stdin ), TCSADRAIN, &old) < 0 )
755    perror("do_raw_input(): tcsetattr() failed: %s\n" );
756
757  TEST_BEGIN();
758}
759
760
761static void raw_input( struct termios *tp )
762{
763  printf( "\nTesting raw input input\n\n" );
764  printf( "Hit 'q' to terminate the test\n" );
765
766  do_raw_input( 0, 0 );
767  do_raw_input( 0, 20 );
768  do_raw_input( 5, 0 );
769  do_raw_input( 5, 20 );
770
771  printf( "\nRaw input test done.\n" );
772}
773
774
775void usage( void )
776{
777  printf( "\nYou have the following choices:\n" );
778  printf( "  1 - Reset the struct termios\n" );
779  printf( "  2 - Look at the current termios setting\n" );
780  printf( "  3 - Change the line characteristics\n" );
781  printf( "  4 - Test canonical input\n" );
782  printf( "  5 - Test raw input\n" );
783  printf( "  9 - Exit\n" );
784  printf( "Enter your choice (1 to 5 or 9, followed by a carriage return): " );
785}
786
787static void notification( int fd, int seconds_remaining, void *arg )
788{
789  printf(
790    "Press any key to check the termios input capabilities (%is remaining)\n",
791    seconds_remaining
792  );
793}
794
795/*
796 * RTEMS Startup Task
797 */
798rtems_task
799Init (rtems_task_argument ignored)
800{
801  rtems_status_code status;
802  char c ;
803  struct termios orig_termios, test_termios;
804
805  TEST_BEGIN();
806
807  status = rtems_shell_wait_for_input(
808    STDIN_FILENO,
809    20,
810    notification,
811    NULL
812  );
813  if (status == RTEMS_SUCCESSFUL) {
814    if( tcgetattr( fileno( stdin ), &orig_termios ) < 0 ) {
815      perror( "tcgetattr() failed" );
816      rtems_test_exit( 0 );
817    }
818
819    test_termios = orig_termios;
820
821    usage();
822    for(;;) {
823      switch( c = getchar() ) {
824        case '1':
825          printf( "\nResetting the line to the original termios setting\n\n" );
826          test_termios = orig_termios;
827          if( tcsetattr( fileno( stdin ), TCSADRAIN, &test_termios ) < 0 ) {
828            perror( "tcsetattr() failed" );
829            rtems_test_exit( 1 );
830          }
831          usage();
832          break;
833
834        case '2':
835          print_termios( &test_termios );
836          usage();
837          break;
838
839        case '3':
840          change_line_settings( &test_termios );
841          usage();
842          break;
843
844        case '4':
845          canonical_input( &test_termios );
846          usage();
847          break;
848
849        case '5':
850          raw_input( &test_termios );
851          usage();
852          break;
853
854        case '9':
855          rtems_test_exit( 1 );
856
857        case '\n':
858          break;
859
860        default:
861          printf( "\n%c is not a valid choice. Try again\n\n", c );
862          usage();
863          break;
864      }
865    }
866  } else {
867    TEST_END();
868
869    rtems_test_exit( 0 );
870  }
871}
872
873/* application configuration */
874#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
875#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
876
877#define CONFIGURE_MAXIMUM_TASKS       1
878
879#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
880
881#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
882
883#define CONFIGURE_MICROSECONDS_PER_TICK 1000
884
885#define CONFIGURE_INIT
886
887#include <rtems/confdefs.h>
888/* end of configuration */
889
Note: See TracBrowser for help on using the repository browser.