Rev 514 | Rev 686 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 514 | Rev 685 | ||
---|---|---|---|
Line 95... | Line 95... | ||
95 | * unused |
95 | * unused |
96 | */ |
96 | */ |
97 | ISR(SIG_USART1_DATA) { |
97 | ISR(SIG_USART1_DATA) { |
98 | } |
98 | } |
Line 99... | Line 99... | ||
99 | 99 | ||
100 | /** |
100 | /* |
101 | * receive data through usart1 |
101 | * receive data through usart1 |
102 | * portions taken and adapted from |
102 | * portions taken and adapted from |
103 | * http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Fbranches%2FV0.72p+Code+Redesign+killagreg%2Fuart0.c |
103 | * http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Fbranches%2FV0.72p+Code+Redesign+killagreg%2Fuart0.c |
104 | */ |
104 | */ |
- | 105 | ISR(SIG_USART1_RECV) { |
|
- | 106 | uint8_t c; |
|
- | 107 | // catch the received byte |
|
105 | ISR(SIG_USART1_RECV) { |
108 | c = UDR1; |
106 | if (rxd_buffer_locked) return; // if rxd buffer is locked immediately return |
- | |
107 | LED1_ON |
109 | if (rxd_buffer_locked) return; // if rxd buffer is locked immediately return |
108 | static uint16_t crc; |
110 | static uint16_t crc; |
- | 111 | static uint8_t ptr_rxd_buffer = 0; |
|
- | 112 | static uint8_t c1 = 0; |
|
- | 113 | static uint8_t c2 = 0; |
|
109 | static uint8_t ptr_rxd_buffer = 0; |
114 | static uint8_t usart_rx_ok = 0; |
110 | uint8_t crc1, crc2; |
- | |
111 | uint8_t c; |
- | |
112 | - | ||
113 | c = UDR1; // catch the received byte |
- | |
114 | 115 | uint8_t crc1, crc2; |
|
- | 116 | // the rxd buffer is unlocked |
|
115 | // the rxd buffer is unlocked |
117 | if (usart_rx_ok == 0) { |
116 | if ((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received |
- | |
117 | { |
- | |
118 | /* |
118 | if ((c2 == '#') && (c1 == 'b') && (c == 'D' || c == 'V' || c == 'O')) { |
119 | // skip other datasets |
119 | usart_rx_ok = 1; |
120 | if (ptr_rxd_buffer == 2 && rxd_buffer[ptr_rxd_buffer] != 'O') { |
120 | rxd_buffer[ptr_rxd_buffer++] = c2; |
121 | ptr_rxd_buffer = 0; // reset rxd buffer |
121 | crc = c2; |
122 | rxd_buffer_locked = 0; // unlock rxd buffer |
122 | rxd_buffer[ptr_rxd_buffer++] = c1; |
123 | }*/ |
123 | crc += c1; |
124 | rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer |
124 | rxd_buffer[ptr_rxd_buffer++] = c; |
- | 125 | crc += c; |
|
125 | crc = c; // init crc |
126 | c2 = 0; |
- | 127 | c1 = 0; |
|
- | 128 | LED1_ON |
|
126 | } else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // collect incomming bytes |
129 | LED2_OFF |
127 | { |
130 | } else { |
- | 131 | c2 = c1; |
|
128 | if (c != '\r') // no termination character |
132 | c1 = c; |
- | 133 | } |
|
- | 134 | } else if (ptr_rxd_buffer < RXD_BUFFER_LEN) { // collect incomming bytes |
|
129 | { |
135 | if (c != '\r') { // no termination character |
130 | rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer |
136 | rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer |
131 | crc += c; // update crc |
137 | crc += c; // update crc |
132 | } else // termination character was received |
- | |
133 | { |
138 | } else { // termination character was received |
134 | // the last 2 bytes are no subject for checksum calculation |
139 | // the last 2 bytes are no subject for checksum calculation |
135 | // they are the checksum itself |
140 | // they are the checksum itself |
136 | crc -= rxd_buffer[ptr_rxd_buffer - 2]; |
141 | crc -= rxd_buffer[ptr_rxd_buffer - 2]; |
137 | crc -= rxd_buffer[ptr_rxd_buffer - 1]; |
142 | crc -= rxd_buffer[ptr_rxd_buffer - 1]; |
Line 142... | Line 147... | ||
142 | // compare checksum to transmitted checksum bytes |
147 | // compare checksum to transmitted checksum bytes |
143 | if ((crc1 == rxd_buffer[ptr_rxd_buffer - 2]) && (crc2 == rxd_buffer[ptr_rxd_buffer - 1])) { // checksum valid |
148 | if ((crc1 == rxd_buffer[ptr_rxd_buffer - 2]) && (crc2 == rxd_buffer[ptr_rxd_buffer - 1])) { // checksum valid |
144 | rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character |
149 | rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character |
145 | ReceivedBytes = ptr_rxd_buffer + 1; // store number of received bytes |
150 | ReceivedBytes = ptr_rxd_buffer + 1; // store number of received bytes |
146 | rxd_buffer_locked = 1; // lock the rxd buffer |
151 | rxd_buffer_locked = 1; // lock the rxd buffer |
- | 152 | LED1_OFF |
|
147 | } else { // checksum invalid |
153 | } else { // checksum invalid |
148 | rxd_buffer_locked = 0; // unlock rxd buffer |
154 | rxd_buffer_locked = 0; // unlock rxd buffer |
- | 155 | LED2_ON |
|
149 | } |
156 | } |
150 | ptr_rxd_buffer = 0; // reset rxd buffer pointer |
157 | ptr_rxd_buffer = 0; // reset rxd buffer pointer |
- | 158 | usart_rx_ok = 0; |
|
151 | } |
159 | } |
152 | } else // rxd buffer overrun |
160 | } else { // rxd buffer overrun |
153 | { |
- | |
154 | ptr_rxd_buffer = 0; // reset rxd buffer |
161 | ptr_rxd_buffer = 0; // reset rxd buffer |
155 | rxd_buffer_locked = 0; // unlock rxd buffer |
162 | rxd_buffer_locked = 0; // unlock rxd buffer |
- | 163 | usart_rx_ok = 0; |
|
- | 164 | LED2_ON |
|
156 | } |
165 | } |
157 | LED1_OFF |
- | |
158 | } |
166 | } |
Line 159... | Line 167... | ||
159 | 167 | ||
160 | /** |
168 | /** |
161 | * Decode the recevied Buffer |
169 | * Decode the recevied Buffer |