| Remote Access Control | |||||
00001 // This file has been prepared for Doxygen automatic documentation generation. 00048 #include "comms.h" 00049 #include "common.h" 00050 #include "config.h" 00051 #include "timer.h" 00052 #include "radio.h" 00053 00054 00055 00056 #ifdef USE_UART 00057 00058 00059 00061 #define BAUD_RATE 19200 00063 #define BRREG_VALUE ((CPU_F/16/BAUD_RATE)-1) 00064 00065 00066 00068 static volatile byte * messageBufferPtr; 00070 static volatile byte messageBytesLeft; 00072 static volatile byte messageByteCount; 00073 00074 00075 00077 #pragma vector = USART_RX_vect 00078 __interrupt void receiveHandler(void) 00079 { 00080 // Store incoming byte in buffer and move ptr. 00081 *messageBufferPtr++ = UDR0; 00082 ++messageByteCount; 00083 00084 // Is buffer full? 00085 if( --messageBytesLeft == 0 ) { 00086 // Disable receive interrupts. 00087 UCSR0B &= ~(1<<RXCIE0); 00088 } else { 00089 // Restart timeout. 00090 startShortTimeout(); 00091 } 00092 } 00093 00094 00095 00096 bool initReceiver(void) 00097 { 00098 // Pull up input line. 00099 PORTD |= (1<<PD0); 00100 00101 // Initialize UART receiver. 00102 UCSR0B = (1<<RXEN0); 00103 UBRR0 = BRREG_VALUE; 00104 00105 return true; // Always succeeds. 00106 } 00107 00108 00109 00110 void enableReception( byte messageSize ) 00111 { 00112 messageBufferPtr = (byte *) &receiveBuffer; 00113 messageBytesLeft = messageSize; 00114 messageByteCount = 0; 00115 UCSR0A |= (1<<RXC0); 00116 UCSR0B |= (1<<RXCIE0); 00117 } 00118 00119 00120 00121 bool messageComplete(void) 00122 { 00123 return messageBytesLeft == 0; 00124 } 00125 00126 00127 00128 byte messageBytesReceived(void) 00129 { 00130 // Don't count preamble. 00131 if( messageByteCount >= 1 ) { 00132 return messageByteCount - 1; 00133 } else { 00134 return 0; 00135 } 00136 } 00137 00138 00139 00140 bool receiverTimedOut(void) 00141 { 00142 if( shortTimeout == true && !messageComplete() ) { 00143 // Disable reception. 00144 UCSR0B &= ~(1<<RXCIE0); 00145 // Indicate timeout. 00146 return true; 00147 } else { 00148 return false; 00149 } 00150 } 00151 00152 00153 00154 #else 00155 00156 00157 00159 static volatile byte * messageBufferPtr; 00161 static volatile byte messageBytesLeft; 00163 static volatile byte messageByteCount; 00165 static volatile byte messageCurrentByte; 00167 static volatile byte messageBitCount; 00169 static volatile bool messageWaitForStartBit; 00170 00171 00172 00174 #pragma vector = RF_CLOCK_PCINT_VECT 00175 __interrupt void rxClockLineHandler(void) 00176 { 00177 // Return if it was not a rising edge in clock input pin. 00178 if( GET_RX_CLOCK() == 0 ) { 00179 return; 00180 } 00181 00182 // Check that data is 0 if we are waiting for start bit. 00183 if( messageWaitForStartBit ) { 00184 if( GET_RX_DATA() == 0 ) { 00185 messageWaitForStartBit = false; 00186 startShortTimeout(); 00187 } 00188 return; 00189 } 00190 00191 // Insert bit into current byte and copy to buffer if 8 bits are received. 00192 messageCurrentByte <<= 1; 00193 #ifdef INVERTED_MANCHESTER 00194 if( GET_RX_DATA() != 0 ) { 00195 #else 00196 if( GET_RX_DATA() == 0 ) { 00197 #endif 00198 messageCurrentByte |= 0x01; 00199 } 00200 if( ++messageBitCount == 8 ) { 00201 *messageBufferPtr++ = messageCurrentByte; 00202 messageCurrentByte = 0; 00203 messageBitCount = 0; 00204 ++messageByteCount; 00205 00206 // Disable further interrupts if all bytes are received, 00207 // else restart the timeout for next byte. 00208 if( --messageBytesLeft == 0 ) { 00209 RF_CLOCK_PCINT_MASK_REG &= ~(1<<RF_CLOCK_PCINT_MASK_BIT); 00210 rx_WriteOFF( false ); 00211 } else { 00212 startShortTimeout(); 00213 } 00214 } 00215 } 00216 00217 00218 00219 bool initReceiver(void) 00220 { 00221 INIT_RX_DATA(); 00222 INIT_RX_CLOCK(); 00223 00224 PCICR |= (1<<RF_CLOCK_PCINT_ENABLE_BIT); 00225 00226 // Consult receiver datasheet for details on settings. 00227 rx_OPMODE_t opmode; 00228 opmode.baudRateRange = 2; // XLim = 3.2 - 5.6 kBaud 00229 opmode.bitCheck = 1; // 3 valid 1-bits required to wake up receiver. 00230 #ifdef FSK 00231 opmode.amplitudeModulation = false; 00232 #endif 00233 #ifdef ASK 00234 opmode.amplitudeModulation = true; 00235 #endif 00236 opmode.sleepValue = 1; // ~2ms sleep. 00237 opmode.sleepExtension = false; 00238 opmode.noiseSuppression = true; 00239 00240 rx_LIMIT_t limit; 00241 limit.limMin = RX_LIM_MIN; // 4800 Baud - 20% 00242 limit.limMax = RX_LIM_MAX; // 4800 Baud + 20% 00243 00244 bool success = rx_WriteVerifySleep( &opmode, &limit ); 00245 return success; 00246 } 00247 00248 00249 00250 void enableReception( byte messageSize ) 00251 { 00252 messageBufferPtr = (byte *) &receiveBuffer; 00253 messageBytesLeft = messageSize; 00254 messageByteCount = 0; 00255 messageCurrentByte = 0; 00256 messageBitCount = 0; 00257 messageWaitForStartBit = true; 00258 RF_CLOCK_PCINT_MASK_REG |= (1<<RF_CLOCK_PCINT_MASK_BIT); 00259 } 00260 00261 00262 00263 bool messageComplete(void) 00264 { 00265 return messageBytesLeft == 0; 00266 } 00267 00268 00269 00270 byte messageBytesReceived(void) 00271 { 00272 return messageByteCount; 00273 } 00274 00275 00276 00277 bool receiverTimedOut(void) 00278 { 00279 if( shortTimeout == true && !messageComplete() && !messageWaitForStartBit ) { 00280 // Disable reception. 00281 RF_CLOCK_PCINT_MASK_REG &= ~(1<<RF_CLOCK_PCINT_MASK_BIT); 00282 rx_WriteOFF( false ); 00283 // Indicate timeout. 00284 return true; 00285 } else { 00286 return false; 00287 } 00288 } 00289 00290 00291 00292 #endif 00293
Generated on Fri Aug 8 11:03:47 2008 for AVR411 Secure Rolling Code Algorithm (Receiver) by 1.4.7
|