round-robin-rtos
Published 09 Sep 2010, by
Tim Exton-McGuinness

No tags
« Back to documentation index
Show/hide line numbers
serial.c Source File
serial.c
00001
00002
00003 #include "globals.h"
00004
00005 Serial Terminal(p9, p10 );
00006
00007 extern "C" void sleep( void );
00008
00009
00010 extern "C" {
00011 void serial_rx_isr( void )
00012 {
00013 rxbuffer[rxwr++] = Terminal.getc();
00014 rxwr &= 0xff;
00015 }
00016 }
00017
00018
00019 extern "C" {
00020 int put_char( char c )
00021 {
00022 while( !Terminal.writeable() ) sleep();
00023 Terminal.putc(c);
00024 if ( c == 0xa )
00025 {
00026 while( !Terminal.writeable() ) sleep();
00027 Terminal.putc(0xd);
00028 }
00029
00030 return( c );
00031 }
00032 }
00033
00034
00035 extern "C" {
00036 void sleepy_write( char *ptr)
00037 {
00038 char c;
00039
00040 while( c = *ptr++ ) put_char( c );
00041 }
00042 }
00043
00044
00045 extern "C" {
00046 int get_char( void )
00047 {
00048 char c;
00049
00050 while( (rxwr == rxrd) ) sleep();
00051
00052 c = rxbuffer[rxrd++];
00053 rxrd &= 0xff;
00054 return(c);
00055 }
00056 }
00057
00058
00059 extern "C" {
00060 int peekchar( void )
00061 {
00062 if( rxwr == rxrd ) return(0);
00063 return(1);
00064 }
00065 }
00066
00067
00068 extern "C" {
00069 void crlf( void )
00070 {
00071 put_char(0xa);
00072 put_char(0xd);
00073 }
00074 }
00075
00076
00077 extern "C" {
00078 void spaces( unsigned char i )
00079 {
00080 if ( i > 0 ) {while(i--) put_char(0x20);}
00081 }
00082 }
00083
00084
00085
00086
00087 extern "C" {
00088 void parse( char *ptr )
00089 {
00090 argc = 0;
00091 while( *ptr )
00092 {
00093 argv[argc++] = ptr;
00094 while(*ptr != ' ') ptr++;
00095 *ptr++ = 0;
00096 }
00097 }
00098 }
00099
00100
00101 extern "C" {
00102 void readln( char *ptr )
00103 {
00104 char key;
00105 int count = 0;
00106
00107 while(1)
00108 {
00109 key = get_char();
00110
00111 if ( key == 0xd )
00112 {
00113 *ptr++ = 0x20;
00114 *ptr = 0;
00115 return;
00116 }
00117
00118 if ( key == 0x1b )
00119 {
00120 *ptr++ = 'q';
00121 *ptr++ = 0x20;
00122 *ptr = 0;
00123
00124 return;
00125 }
00126
00127 if ( key == 0x8 )
00128 {
00129 if ( count )
00130 {
00131 put_char( 0x8 );
00132 put_char( 0x20 );
00133 put_char( 0x8 );
00134 ptr--;
00135 count--;
00136 }
00137 }
00138 else
00139 {
00140 *ptr++ = key;
00141 count++;
00142 put_char( key );
00143 }
00144 }
00145 }
00146 }
00147
00148
00149 extern "C" {
00150 void goxy( int x, int y)
00151 {
00152 sprintf(sl_buff,"%c[%d;%dH", 27, y, x); sleepy_write( sl_buff);
00153 }
00154 }
00155
00156
00157 extern "C" {
00158 void cursor( int x, int y, int spaces )
00159 {
00160 goxy( x, y );
00161 while( spaces-- ) put_char( ' ' );
00162 goxy( x, y );
00163 }
00164 }
00165
00166
00167 extern "C" {
00168 void clear_screen( void )
00169 {
00170 sprintf(sl_buff,"%c[2J", 27); sleepy_write( sl_buff);
00171 }
00172 }
00173
00174
00175 extern "C" {
00176 int tohex( char c )
00177 {
00178 if ( c > 0x39 ) c-=7;
00179 return( c&0xf );
00180 }
00181 }
00182
00183
00184 extern "C" {
00185 int atohex( char *ptr )
00186 {
00187 int acc = 0;
00188 int nibble;
00189
00190 while( nibble = *ptr++ )
00191 {
00192 acc*=16;
00193 acc+=tohex(nibble);
00194 }
00195
00196 return( acc );
00197 }
00198
00199 }