Tim Exton-McGuinness
/
round-robin-rtos
Round robin Scheduler
serial.c@0:cf2d4c337b6f, 2010-09-09 (annotated)
- Committer:
- timexton
- Date:
- Thu Sep 09 14:09:14 2010 +0000
- Revision:
- 0:cf2d4c337b6f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
timexton | 0:cf2d4c337b6f | 1 | //serial port receiver interrupt handler |
timexton | 0:cf2d4c337b6f | 2 | |
timexton | 0:cf2d4c337b6f | 3 | #include "globals.h" |
timexton | 0:cf2d4c337b6f | 4 | |
timexton | 0:cf2d4c337b6f | 5 | Serial Terminal(p9, p10 ); |
timexton | 0:cf2d4c337b6f | 6 | |
timexton | 0:cf2d4c337b6f | 7 | extern "C" void sleep( void ); |
timexton | 0:cf2d4c337b6f | 8 | |
timexton | 0:cf2d4c337b6f | 9 | //--------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 10 | extern "C" { |
timexton | 0:cf2d4c337b6f | 11 | void serial_rx_isr( void ) |
timexton | 0:cf2d4c337b6f | 12 | { |
timexton | 0:cf2d4c337b6f | 13 | rxbuffer[rxwr++] = Terminal.getc(); //get character |
timexton | 0:cf2d4c337b6f | 14 | rxwr &= 0xff; //range check index |
timexton | 0:cf2d4c337b6f | 15 | } |
timexton | 0:cf2d4c337b6f | 16 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 17 | |
timexton | 0:cf2d4c337b6f | 18 | //----------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 19 | extern "C" { |
timexton | 0:cf2d4c337b6f | 20 | int put_char( char c ) |
timexton | 0:cf2d4c337b6f | 21 | { |
timexton | 0:cf2d4c337b6f | 22 | while( !Terminal.writeable() ) sleep(); |
timexton | 0:cf2d4c337b6f | 23 | Terminal.putc(c); |
timexton | 0:cf2d4c337b6f | 24 | if ( c == 0xa ) |
timexton | 0:cf2d4c337b6f | 25 | { |
timexton | 0:cf2d4c337b6f | 26 | while( !Terminal.writeable() ) sleep(); |
timexton | 0:cf2d4c337b6f | 27 | Terminal.putc(0xd); |
timexton | 0:cf2d4c337b6f | 28 | } |
timexton | 0:cf2d4c337b6f | 29 | |
timexton | 0:cf2d4c337b6f | 30 | return( c ); |
timexton | 0:cf2d4c337b6f | 31 | } |
timexton | 0:cf2d4c337b6f | 32 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 33 | |
timexton | 0:cf2d4c337b6f | 34 | //------------------------------------------- |
timexton | 0:cf2d4c337b6f | 35 | extern "C" { |
timexton | 0:cf2d4c337b6f | 36 | void sleepy_write( char *ptr) |
timexton | 0:cf2d4c337b6f | 37 | { |
timexton | 0:cf2d4c337b6f | 38 | char c; |
timexton | 0:cf2d4c337b6f | 39 | |
timexton | 0:cf2d4c337b6f | 40 | while( c = *ptr++ ) put_char( c ); |
timexton | 0:cf2d4c337b6f | 41 | } |
timexton | 0:cf2d4c337b6f | 42 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 43 | |
timexton | 0:cf2d4c337b6f | 44 | //---------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 45 | extern "C" { |
timexton | 0:cf2d4c337b6f | 46 | int get_char( void ) |
timexton | 0:cf2d4c337b6f | 47 | { |
timexton | 0:cf2d4c337b6f | 48 | char c; |
timexton | 0:cf2d4c337b6f | 49 | |
timexton | 0:cf2d4c337b6f | 50 | while( (rxwr == rxrd) ) sleep(); |
timexton | 0:cf2d4c337b6f | 51 | |
timexton | 0:cf2d4c337b6f | 52 | c = rxbuffer[rxrd++]; |
timexton | 0:cf2d4c337b6f | 53 | rxrd &= 0xff; //keep in range |
timexton | 0:cf2d4c337b6f | 54 | return(c); |
timexton | 0:cf2d4c337b6f | 55 | } |
timexton | 0:cf2d4c337b6f | 56 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 57 | |
timexton | 0:cf2d4c337b6f | 58 | //----------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 59 | extern "C" { |
timexton | 0:cf2d4c337b6f | 60 | int peekchar( void ) |
timexton | 0:cf2d4c337b6f | 61 | { |
timexton | 0:cf2d4c337b6f | 62 | if( rxwr == rxrd ) return(0); |
timexton | 0:cf2d4c337b6f | 63 | return(1); |
timexton | 0:cf2d4c337b6f | 64 | } |
timexton | 0:cf2d4c337b6f | 65 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 66 | |
timexton | 0:cf2d4c337b6f | 67 | //------------------------------------------------------ |
timexton | 0:cf2d4c337b6f | 68 | extern "C" { |
timexton | 0:cf2d4c337b6f | 69 | void crlf( void ) |
timexton | 0:cf2d4c337b6f | 70 | { |
timexton | 0:cf2d4c337b6f | 71 | put_char(0xa); |
timexton | 0:cf2d4c337b6f | 72 | put_char(0xd); |
timexton | 0:cf2d4c337b6f | 73 | } |
timexton | 0:cf2d4c337b6f | 74 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 75 | |
timexton | 0:cf2d4c337b6f | 76 | //------------------------------------------------------ |
timexton | 0:cf2d4c337b6f | 77 | extern "C" { |
timexton | 0:cf2d4c337b6f | 78 | void spaces( unsigned char i ) |
timexton | 0:cf2d4c337b6f | 79 | { |
timexton | 0:cf2d4c337b6f | 80 | if ( i > 0 ) {while(i--) put_char(0x20);} |
timexton | 0:cf2d4c337b6f | 81 | } |
timexton | 0:cf2d4c337b6f | 82 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 83 | |
timexton | 0:cf2d4c337b6f | 84 | //----------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 85 | // parse text line, converting ' ' and 'CR' to NULL |
timexton | 0:cf2d4c337b6f | 86 | // returns global argv and argc parameters set accordingly |
timexton | 0:cf2d4c337b6f | 87 | extern "C" { |
timexton | 0:cf2d4c337b6f | 88 | void parse( char *ptr ) |
timexton | 0:cf2d4c337b6f | 89 | { |
timexton | 0:cf2d4c337b6f | 90 | argc = 0; |
timexton | 0:cf2d4c337b6f | 91 | while( *ptr ) |
timexton | 0:cf2d4c337b6f | 92 | { |
timexton | 0:cf2d4c337b6f | 93 | argv[argc++] = ptr; //record start of parameter string |
timexton | 0:cf2d4c337b6f | 94 | while(*ptr != ' ') ptr++; |
timexton | 0:cf2d4c337b6f | 95 | *ptr++ = 0; |
timexton | 0:cf2d4c337b6f | 96 | } |
timexton | 0:cf2d4c337b6f | 97 | } |
timexton | 0:cf2d4c337b6f | 98 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 99 | |
timexton | 0:cf2d4c337b6f | 100 | //----------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 101 | extern "C" { |
timexton | 0:cf2d4c337b6f | 102 | void readln( char *ptr ) |
timexton | 0:cf2d4c337b6f | 103 | { |
timexton | 0:cf2d4c337b6f | 104 | char key; |
timexton | 0:cf2d4c337b6f | 105 | int count = 0; |
timexton | 0:cf2d4c337b6f | 106 | |
timexton | 0:cf2d4c337b6f | 107 | while(1) |
timexton | 0:cf2d4c337b6f | 108 | { |
timexton | 0:cf2d4c337b6f | 109 | key = get_char(); |
timexton | 0:cf2d4c337b6f | 110 | |
timexton | 0:cf2d4c337b6f | 111 | if ( key == 0xd ) |
timexton | 0:cf2d4c337b6f | 112 | { |
timexton | 0:cf2d4c337b6f | 113 | *ptr++ = 0x20; |
timexton | 0:cf2d4c337b6f | 114 | *ptr = 0; |
timexton | 0:cf2d4c337b6f | 115 | return; |
timexton | 0:cf2d4c337b6f | 116 | } |
timexton | 0:cf2d4c337b6f | 117 | |
timexton | 0:cf2d4c337b6f | 118 | if ( key == 0x1b ) //esc |
timexton | 0:cf2d4c337b6f | 119 | { |
timexton | 0:cf2d4c337b6f | 120 | *ptr++ = 'q'; |
timexton | 0:cf2d4c337b6f | 121 | *ptr++ = 0x20; |
timexton | 0:cf2d4c337b6f | 122 | *ptr = 0; |
timexton | 0:cf2d4c337b6f | 123 | // put_char(0xa); |
timexton | 0:cf2d4c337b6f | 124 | return; |
timexton | 0:cf2d4c337b6f | 125 | } |
timexton | 0:cf2d4c337b6f | 126 | |
timexton | 0:cf2d4c337b6f | 127 | if ( key == 0x8 ) //delete |
timexton | 0:cf2d4c337b6f | 128 | { |
timexton | 0:cf2d4c337b6f | 129 | if ( count ) |
timexton | 0:cf2d4c337b6f | 130 | { |
timexton | 0:cf2d4c337b6f | 131 | put_char( 0x8 ); |
timexton | 0:cf2d4c337b6f | 132 | put_char( 0x20 ); |
timexton | 0:cf2d4c337b6f | 133 | put_char( 0x8 ); |
timexton | 0:cf2d4c337b6f | 134 | ptr--; |
timexton | 0:cf2d4c337b6f | 135 | count--; |
timexton | 0:cf2d4c337b6f | 136 | } |
timexton | 0:cf2d4c337b6f | 137 | } |
timexton | 0:cf2d4c337b6f | 138 | else |
timexton | 0:cf2d4c337b6f | 139 | { |
timexton | 0:cf2d4c337b6f | 140 | *ptr++ = key; |
timexton | 0:cf2d4c337b6f | 141 | count++; |
timexton | 0:cf2d4c337b6f | 142 | put_char( key ); |
timexton | 0:cf2d4c337b6f | 143 | } |
timexton | 0:cf2d4c337b6f | 144 | } |
timexton | 0:cf2d4c337b6f | 145 | } |
timexton | 0:cf2d4c337b6f | 146 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 147 | |
timexton | 0:cf2d4c337b6f | 148 | //-------------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 149 | extern "C" { |
timexton | 0:cf2d4c337b6f | 150 | void goxy( int x, int y) |
timexton | 0:cf2d4c337b6f | 151 | { |
timexton | 0:cf2d4c337b6f | 152 | sprintf(sl_buff,"%c[%d;%dH", 27, y, x); sleepy_write( sl_buff); |
timexton | 0:cf2d4c337b6f | 153 | } |
timexton | 0:cf2d4c337b6f | 154 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 155 | |
timexton | 0:cf2d4c337b6f | 156 | //-------------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 157 | extern "C" { |
timexton | 0:cf2d4c337b6f | 158 | void cursor( int x, int y, int spaces ) |
timexton | 0:cf2d4c337b6f | 159 | { |
timexton | 0:cf2d4c337b6f | 160 | goxy( x, y ); |
timexton | 0:cf2d4c337b6f | 161 | while( spaces-- ) put_char( ' ' ); |
timexton | 0:cf2d4c337b6f | 162 | goxy( x, y ); |
timexton | 0:cf2d4c337b6f | 163 | } |
timexton | 0:cf2d4c337b6f | 164 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 165 | |
timexton | 0:cf2d4c337b6f | 166 | //-------------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 167 | extern "C" { |
timexton | 0:cf2d4c337b6f | 168 | void clear_screen( void ) |
timexton | 0:cf2d4c337b6f | 169 | { |
timexton | 0:cf2d4c337b6f | 170 | sprintf(sl_buff,"%c[2J", 27); sleepy_write( sl_buff); /* erase screen */ |
timexton | 0:cf2d4c337b6f | 171 | } |
timexton | 0:cf2d4c337b6f | 172 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 173 | |
timexton | 0:cf2d4c337b6f | 174 | //------------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 175 | extern "C" { |
timexton | 0:cf2d4c337b6f | 176 | int tohex( char c ) |
timexton | 0:cf2d4c337b6f | 177 | { |
timexton | 0:cf2d4c337b6f | 178 | if ( c > 0x39 ) c-=7; |
timexton | 0:cf2d4c337b6f | 179 | return( c&0xf ); |
timexton | 0:cf2d4c337b6f | 180 | } |
timexton | 0:cf2d4c337b6f | 181 | } //end of extern "C" |
timexton | 0:cf2d4c337b6f | 182 | |
timexton | 0:cf2d4c337b6f | 183 | //------------------------------------------------------------------------- |
timexton | 0:cf2d4c337b6f | 184 | extern "C" { |
timexton | 0:cf2d4c337b6f | 185 | int atohex( char *ptr ) |
timexton | 0:cf2d4c337b6f | 186 | { |
timexton | 0:cf2d4c337b6f | 187 | int acc = 0; |
timexton | 0:cf2d4c337b6f | 188 | int nibble; |
timexton | 0:cf2d4c337b6f | 189 | |
timexton | 0:cf2d4c337b6f | 190 | while( nibble = *ptr++ ) |
timexton | 0:cf2d4c337b6f | 191 | { |
timexton | 0:cf2d4c337b6f | 192 | acc*=16; |
timexton | 0:cf2d4c337b6f | 193 | acc+=tohex(nibble); |
timexton | 0:cf2d4c337b6f | 194 | } |
timexton | 0:cf2d4c337b6f | 195 | |
timexton | 0:cf2d4c337b6f | 196 | return( acc ); |
timexton | 0:cf2d4c337b6f | 197 | } |
timexton | 0:cf2d4c337b6f | 198 | |
timexton | 0:cf2d4c337b6f | 199 | } //end of extern "C" |