00001
00022
00023
#ifdef S_SPLINT_S
00024
#include"splint.h"
00025
#endif
00026
00027
00028
00029
#include<ioavr.h>
00030
#include<inavr.h>
00031
#include"AVRGSM_com.h"
00032
00034 int rx_overflow,
rx_ack;
00035
00037 static unsigned char rx_buffer[
RX_BUFFER_SIZE];
00038
00040 static unsigned char searchStr;
00041
00043 static int rx_i;
00044
00046 static int rx_wr_i;
00047
00049 const unsigned char __flash
OK[] =
"OK\r\n";
00050 const unsigned char __flash
CMTI[] =
"+CMTI: ";
00051 const unsigned char __flash
READY[] =
"> ";
00052 const unsigned char __flash
CR_LF[] =
"\r\n";
00053 const unsigned char __flash *
searchFor;
00054 const unsigned char __flash *
searchStrings[4] = {
OK,
CMTI,
READY,
CR_LF};
00055
00056
00066 void COM_init(
unsigned int baudrate )
00067 {
00068
00069 UBRR0H = (
unsigned char) (baudrate>>8);
00070 UBRR0L = (
unsigned char) baudrate;
00071
00072 UCSR0B = ( 1 << RXEN0 ) | ( 1 << TXEN0 );
00073 UCSR0C = ( 1 << USBS0 ) | ( 1 << UCSZ01 ) | ( 1 << UCSZ00 );
00074
00075
COM_rx_reset();
00076 }
00077
00078
00085 void COM_rx_reset(
void )
00086 {
00087
00088 UCSR0B &= ~(1<<RXCIE0);
00089
rx_i =
rx_wr_i = 0;
00090
rx_overflow =
rx_ack = 0;
00091
rx_buffer[
rx_wr_i ] =
'\0';
00092 }
00093
00094
00101 void COM_rx_on(
void )
00102 {
00103
00104 UCSR0B |= ( 1 << RXCIE0 );
00105 }
00106
00107
00114 void COM_rx_off(
void )
00115 {
00116
00117 UCSR0B &= ~( 1 << RXCIE0 );
00118 }
00119
00120
00127 void COM_setSearchString(
unsigned char Response )
00128 {
00129
00130 UCSR0B &= ~( 1 << RXCIE0 );
00131
searchFor =
searchStrings[Response];
00132
searchStr = Response;
00133
rx_i = 0;
00134 }
00135
00136
00142
#pragma vector=USART0_RXC_vect
00143 __interrupt void USART0_RX_interrupt(
void )
00144 {
00145
00146
unsigned char data;
00147
00148 data = UDR0;
00149
00150
rx_buffer[
rx_wr_i++ ] = data;
00151
00152
00153
if(
rx_wr_i >
RX_BUFFER_MASK )
00154 {
00155
rx_wr_i = 0;
00156
rx_overflow = 1;
00157 UCSR0B &= ~( 1 << RXCIE0 );
00158 }
00159
00160
if(
searchFor[
rx_i] == data )
00161 {
00162
rx_i++;
00163
00164
if( !
searchFor[
rx_i] )
00165 {
00166
rx_i = 0;
00167
00168
if(
searchStr ==
CMTI_ )
00169 {
00170
searchFor =
searchStrings[
CRLF_ ];
00171
searchStr =
CRLF_;
00172 }
00173
00174
else
00175 {
00176
rx_ack = 1;
00177 UCSR0B &= ~( 1 << RXCIE0 );
00178 }
00179 }
00180 }
00181
00182
else
00183 {
00184
rx_i = 0;
00185 }
00186 }
00187
00188
00198 int COM_putchar(
unsigned char data )
00199 {
00200
00201
00202
unsigned int i;
00203
00204
for( i = 0; !( UCSR0A & ( 1 << UDRE0 ) ); i++ )
00205 {
00206
if( i >
RX_WAIT )
00207 {
00208
return -1;
00209 }
00210 }
00211
00212 UDR0 = data;
00213
00214
return (
int)data;
00215 }
00216
00217
00224 void COM_put_integer(
int i )
00225 {
00226
00228
int ii;
00229
unsigned char int_buf[5];
00230
00231
if (i < 0)
00232 {
00233 i = -i;
00234
COM_putchar(
'-');
00235 }
00236
00237
for (ii=0; ii < 5; )
00238 {
00239 int_buf[ii++] =
'0'+ i % 10;
00240 i = i / 10;
00241 }
00242
do{ ii--; }
while( (int_buf[ii] ==
'0') && (ii != 0) );
00243
do{
COM_putchar( int_buf[ii--] ); }
while (ii >= 0);
00244
00245 }
00246
00247
00254 void COM_puts(
unsigned char *str)
00255 {
00256
00257
for( ;*str !=
'\0'; )
00258 {
00259
COM_putchar( *str++ );
00260 }
00261 }
00262
00263
00270 void COM_putsf(
const unsigned char __flash *fstr )
00271 {
00272
00273
for( ;*fstr !=
'\0'; )
00274 {
00275
COM_putchar( *fstr++ );
00276 }
00277 }
00278
00279
00289 int COM_trim(
void )
00290 {
00291
00293
int i;
00294
unsigned char temp;
00295
00296
for( i =
rx_wr_i - 1; i >= 0; i--)
00297 {
00298 temp =
rx_buffer[i];
00299
if( ( temp !=
'\r' ) && ( temp !=
'\n' ) && ( temp !=
'O' ) && ( temp !=
'K' ) )
00300 {
00301
break;
00302 }
00303 }
00304
00305
rx_buffer[ i+1 ] =
'\0';
00306
00307
return i;
00308 }
00309
00310
00317 unsigned char*
COM_gets(
void )
00318 {
00319
return rx_buffer;
00320 }