Search Code
About round-robin-rtos

Published 09 Sep 2010.

Last change message: N/A

Import this program

round-robin-rtos

Published 09 Sep 2010, by   user Tim Exton-McGuinness   tag No tags
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers serial.c Source File

serial.c

00001 //serial port receiver interrupt handler
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();    //get character
00014  rxwr &= 0xff;                                //range check index
00015 }
00016 }   //end of extern "C"
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 }   //end of extern "C"
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 }   //end of extern "C"
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;                                   //keep in range
00054    return(c);
00055  }
00056 }   //end of extern "C"
00057  
00058 //-----------------------------------------------------------------------
00059 extern "C" {
00060 int peekchar( void )
00061  {  
00062    if( rxwr == rxrd ) return(0);
00063    return(1);
00064  }
00065 }   //end of extern "C"
00066 
00067 //------------------------------------------------------
00068 extern "C" {
00069 void crlf( void )
00070 {
00071  put_char(0xa);
00072  put_char(0xd);
00073 }
00074 }   //end of extern "C"
00075 
00076 //------------------------------------------------------
00077 extern "C" {
00078 void spaces( unsigned char i )
00079 {
00080  if ( i > 0 ) {while(i--) put_char(0x20);}
00081 }
00082 }   //end of extern "C"
00083 
00084 //-----------------------------------------------------------------
00085 // parse text line, converting ' ' and 'CR' to NULL
00086 // returns global argv and argc parameters set accordingly
00087 extern "C" {
00088 void parse( char *ptr )
00089   {    
00090     argc = 0;
00091     while( *ptr )
00092       {
00093         argv[argc++] = ptr;        //record start of parameter string
00094         while(*ptr != ' ') ptr++;
00095         *ptr++ = 0;
00096       }     
00097   }
00098 }   //end of extern "C"
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 )        //esc
00119           {
00120             *ptr++ = 'q';
00121             *ptr++ = 0x20;
00122             *ptr = 0;
00123 //            put_char(0xa);
00124             return;
00125           }
00126           
00127         if ( key == 0x8 )        //delete
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 }   //end of extern "C"
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 }   //end of extern "C"
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 }   //end of extern "C"
00165   
00166 //--------------------------------------------------------------------------
00167 extern "C" {
00168 void clear_screen( void )
00169   {
00170     sprintf(sl_buff,"%c[2J", 27); sleepy_write( sl_buff);  /* erase screen */
00171   }
00172 }   //end of extern "C"
00173   
00174 //-------------------------------------------------------------------------
00175 extern "C" {
00176 int tohex( char c )
00177   {
00178     if ( c > 0x39 ) c-=7;
00179     return( c&0xf );
00180   }
00181 }   //end of extern "C"
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 }   //end of extern "C"