| AVR Z-LINKŪ | |||||
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/ 00025 /* === Includes ============================================================ */ 00026 #include"serialPortHAL.h" 00027 /* ==== Macros ============================================================= */ 00028 /* === Typedefs ============================================================ */ 00029 /* === Variables =========================================================== */ 00030 rxDataBlock_t rxData; 00031 rxState_t rxState; 00032 00038 const unsigned char __flash OK[ ] = "OK\r\n"; 00039 00045 const unsigned char __flash ERROR[] = "ERROR: 0x"; 00046 00052 const unsigned char __flash ASSOCIATION_NOTIFICATION[] = "+N"; 00053 00059 const unsigned char __flash DISASSOCIATION_NOTIFICATION[] = "+D"; 00060 00066 const unsigned char __flash NEW_DATA_NOTIFICATION[] = "+T: "; 00067 00072 const unsigned char __flash CRNL[] = "\r\n"; 00073 00078 const uint8_t __flash hexTable[] = "0123456789ABCDEF"; 00079 00080 /* === Prototypes ========================================================== */ 00081 static void sendSymbol( const unsigned char symbol ); 00082 static void sendStringWithLength( const unsigned char *string, const uint8_t strLength ); 00083 static uint8_t errToHex( uint8_t hexNibble ); 00084 /* === Implementation ====================================================== */ 00085 00097 void serialInterfaceInitialization( void ){ 00098 00099 #ifdef UART 00100 00101 uartInitialization( BR_38400 ); 00102 #else 00103 ftdiInitialization( ); 00104 #endif 00105 } 00106 00107 00111 void rxReset( void ){ 00112 00113 unsigned char dummy = 0x00; 00114 00115 RECEIVER_OFF; 00116 00117 rxState = SOC; 00118 00119 rxData.rx_i = dummy; 00120 rxData.ATCommand[ rxData.rx_i ] = dummy; 00121 rxData.parameters[ rxData.rx_i ] = dummy; 00122 rxData.numberOfReceivedParameters = dummy; 00123 rxData.receptionComplete = false; 00124 rxData.error = NO_ERROR; 00125 00126 #ifdef UART 00127 //Following loop is used to ensure that the rx FIFO is flushed. 00128 //Sometimes it gets cloged up with old data. 00129 for( ; UCSR0A & ( 1 << RXC0 ); ){ 00130 00131 dummy = UDR0; 00132 } 00133 #endif 00134 00135 RECEIVER_ON; 00136 } 00137 00142 unsigned char * getATCommand( void ){ 00143 00144 return ( unsigned char * )rxData.ATCommand; 00145 } 00146 00151 rxError_t getError( void ){ 00152 00153 return rxData.error; 00154 } 00155 00156 00161 bool dataAvailable( void ){ 00162 00163 return rxData.receptionComplete; 00164 } 00165 00173 unsigned char * getParameterNumber( paramter_t parameterNumber ){ 00174 00175 if( parameterNumber < NUMBER_OF_PARAMETERS ){ 00176 00177 return rxData.parameter[ parameterNumber ]; 00178 } 00179 00180 00181 else{ 00182 00183 return NULL_PARAMETER; 00184 } 00185 } 00186 00196 #pragma inline 00197 static void sendSymbol( const unsigned char symbol ){ 00198 00199 #ifdef UART 00200 00201 uartSendSymbol( symbol ); 00202 #else 00203 ftdiSendSymbol( symbol ); 00204 #endif 00205 } 00206 00207 00213 void sendString( const unsigned char *string ){ 00214 00215 for( ; *string != '\0'; ){ 00216 00217 sendSymbol( *string++ ); 00218 } 00219 00220 return; 00221 } 00222 00228 void sendFlashString( const unsigned char __flash *string ){ 00229 00230 for( ; *string != '\0'; ){ 00231 00232 sendSymbol( *string++ ); 00233 } 00234 00235 return; 00236 } 00237 00238 00242 void sendOK( void ){ 00243 00244 sendFlashString( OK ); 00245 00246 return; 00247 } 00248 00249 00250 00274 void sendERROR( const chatError_t err ){ 00275 00276 sendFlashString( ERROR ); 00277 00278 //Convert from err to ascii hex: 00279 sendSymbol( errToHex( (err & 0xF0) >> 4 ) ); //MSB 00280 sendSymbol( errToHex( err & 0x0F ) ); //LSB 00281 00282 sendFlashString( CRNL ); 00283 00284 return; 00285 } 00286 00287 00292 static uint8_t errToHex( uint8_t hexNibble ){ 00293 00294 return hexTable[ hexNibble ]; 00295 } 00296 00303 void sendAssociationNotification( void ){ 00304 00305 sendFlashString( ASSOCIATION_NOTIFICATION ); 00306 sendFlashString( CRNL ); 00307 00308 return; 00309 } 00310 00316 void sendDisAssociationNotification( void ){ 00317 00318 sendFlashString( DISASSOCIATION_NOTIFICATION ); 00319 sendFlashString( CRNL ); 00320 00321 return; 00322 } 00323 00324 00333 void sendDataNotification( uint8_t length, unsigned char *data ){ 00334 00335 uint8_t i, ii, dataLength; 00336 unsigned char valueReversed[ 3 ]; 00337 unsigned char asciiValue[ 4 ]; 00338 00339 dataLength = length; 00340 00341 //Make sure that only 3 iterations are made. 00342 for( i = ii = 0; (ii < 3) && ( dataLength != 0 ) ; ii++ ){ 00343 00344 i = dataLength % 10; 00345 dataLength = dataLength / 10; 00346 00347 valueReversed[ ii ] = i + '0'; 00348 } 00349 00350 asciiValue[ ii ] = '\0'; //Terminate string 00351 00352 //Reverse the order of digits. 00353 for( i = 0, ii; ii > 0 ; ii--, i++ ){ 00354 00355 asciiValue[ i ] = valueReversed[ ii - 1 ]; 00356 } 00357 00358 00359 sendFlashString( NEW_DATA_NOTIFICATION ); 00360 sendString( asciiValue ); 00361 //sendStringWithLength( asciiValue, length ); //Dummy...hardcoded. 00362 sendSymbol( ',' ); 00363 sendStringWithLength( data, length ); 00364 sendFlashString( CRNL ); 00365 00366 return; 00367 } 00368 00376 static void sendStringWithLength( const unsigned char *string, const uint8_t strLength ){ 00377 00378 uint8_t i; 00379 00380 for( i = 0; i < strLength; i++ ){ 00381 00382 sendSymbol( *string++ ); 00383 } 00384 00385 return; 00386 } 00387 00396 #ifdef UART 00397 ISR( USART0_RX_vect ){ 00398 00399 uint8_t receivedData; 00400 00401 receivedData = ( uint8_t )UDR0; //Collect data. 00402 #else 00403 ISR( INT7_vect ){ 00404 00405 unsigned char receivedData; 00406 00407 receivedData = ( uint8_t )*FTDI_Fifo; //Collect data. 00408 #endif 00409 00410 switch( rxState ){ 00411 00412 case SOC: 00413 00414 if( rxData.rx_i <= LENGTH_OF_COMMAND ){ 00415 00416 if( receivedData == PARAMETER_PREAMBLE_A ){ 00417 00418 rxData.ATCommand[ rxData.rx_i ] = '\0'; 00419 rxState = PARAM_PREAMBLE; 00420 } 00421 00422 else if( receivedData == EOC_DELIMITER ){ 00423 00424 rxData.ATCommand[ rxData.rx_i ] = '\0'; 00425 rxState = EOC; 00426 } 00427 00428 else{ 00429 00430 rxData.ATCommand[ rxData.rx_i++ ] = receivedData; 00431 } 00432 } 00433 00434 else{ 00435 00436 RECEIVER_OFF; 00437 rxData.error = BUFFER_OVERFLOW; 00438 rxData.receptionComplete = true; 00439 } 00440 00441 break; 00442 00443 case PARAM_PREAMBLE: 00444 00445 if( receivedData == PARAMETER_PREAMBLE_B ){ 00446 00447 rxData.rx_i = 0; 00448 rxData.parameter[ rxData.numberOfReceivedParameters++ ] = \ 00449 &rxData.parameters[ rxData.rx_i ]; 00450 rxState = COLLECT_PARAMETERS; 00451 } 00452 00453 else{ 00454 00455 RECEIVER_OFF; 00456 rxData.error = UNKNOWN_SEQUENCE; 00457 rxData.receptionComplete = true; 00458 } 00459 00460 break; 00461 00462 case COLLECT_PARAMETERS: 00463 00464 00465 if( ( rxData.rx_i < LENGTH_OF_PARAMETER_BUFFER )&& 00466 ( rxData.numberOfReceivedParameters < NUMBER_OF_PARAMETERS ) ) 00467 { 00468 00469 if( receivedData == PARAMETER_DELIMITER ){ 00470 00471 rxData.parameters[ rxData.rx_i++ ] = '\0'; 00472 rxData.parameter[ rxData.numberOfReceivedParameters++ ] = \ 00473 &rxData.parameters[ rxData.rx_i ]; 00474 } 00475 00476 00477 else if( receivedData == EOC_DELIMITER ){ 00478 00479 rxData.parameters[ rxData.rx_i ] = '\0'; 00480 rxState = EOC; 00481 } 00482 00483 else{ 00484 00485 rxData.parameters[ rxData.rx_i++ ] = receivedData; 00486 } 00487 } 00488 00489 else{ 00490 00491 RECEIVER_OFF; 00492 rxData.error = BUFFER_OVERFLOW; 00493 rxData.receptionComplete = true; 00494 } 00495 break; 00496 00497 case EOC: 00498 00499 RECEIVER_OFF; 00500 00501 if( receivedData != '\n' ){ 00502 00503 rxData.error = UNKNOWN_EOC_SEQUENCE; 00504 } 00505 00506 rxData.receptionComplete = true; 00507 break; 00508 00509 default: 00510 00511 RECEIVER_OFF; 00512 rxData.error = UNKNOWN_RX_STATE; 00513 rxData.receptionComplete = true; 00514 break; 00515 } 00516 }
Generated on Sat Dec 2 16:05:51 2006 for AVR414 User's Guide - ATAVRRZ502 - Accessory Kit by 1.4.7
|