Subversion Repositories Projects

Rev

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