00001 /*************************************************************************/ 00026 #include <avr/io.h> //I/O-Register 00027 #include <stdint.h> //standart Integertypen 00028 #include <stdlib.h> // itoa 00029 00030 #include "pcc.h" 00031 #include "../nbot_lib/uart.h" 00032 00033 // Defines 00034 #define pcc_rx_ready 1 00035 #define pcc_rx_befehlsempfang 2 00036 #define pcc_rx_fehler 3 00037 #define pcc_rx_done 4 00038 00039 00040 00041 00042 00043 00044 // Private Funktionen 00045 void pcc_reset(void); 00046 void pcc_sendError(void); 00047 00048 // Variablen 00049 const pcc_t *ppcc; 00050 00051 tunHeader header; 00052 tstMessage receivedMessage; 00053 tstMessage transmitMessage; 00054 00055 uint8_t empfangeneBytes; 00056 uint8_t versendeteBytes; 00057 uint8_t sm_rx; // statemachine receive 00058 00059 /**************************************************************************/ 00064 void pcc_init(const pcc_t *daten) 00065 { 00066 ppcc = daten; // datenpoiter übergeben 00067 sm_rx = pcc_rx_ready; 00068 pcc_reset(); 00069 } 00070 00071 /**************************************************************************/ 00076 void pcc_reset(void) 00077 { 00078 header.y = 0; 00079 receivedMessage.header.y = 0; 00080 transmitMessage.header.y = 0; 00081 for(int i = 0; i<8;i++) 00082 { 00083 receivedMessage.message[i] = 0; 00084 transmitMessage.message[i] = 0; 00085 } 00086 empfangeneBytes = 0; 00087 } 00088 00089 /**************************************************************************/ 00094 void pcc_rx(uint8_t buf) 00095 { 00096 if(sm_rx == pcc_rx_ready || sm_rx == pcc_rx_befehlsempfang) 00097 { 00098 sm_rx = pcc_rx_befehlsempfang; 00099 00100 if(empfangeneBytes == 0) // Header wird empfangen 00101 { 00102 receivedMessage.header.y = buf; 00103 } else if((receivedMessage.header.length) >= empfangeneBytes) // Daten werden empfangen 00104 { 00105 receivedMessage.message[(empfangeneBytes-1)] = buf; 00106 } 00107 if((receivedMessage.header.length) == empfangeneBytes) // Nachricht vollständig empfangen 00108 { 00109 sm_rx = pcc_rx_done; 00110 } 00111 } else // alter Befehl noch nicht abgearbeitet 00112 { 00113 sm_rx = pcc_rx_fehler; 00114 } 00115 empfangeneBytes++; 00116 } 00117 00118 /**************************************************************************/ 00123 void pcc(void) 00124 { 00125 switch (sm_rx) 00126 { 00127 case pcc_rx_ready: 00128 case pcc_rx_befehlsempfang: 00129 break; 00130 case pcc_rx_fehler: 00131 pcc_sendError(); 00132 pcc_reset(); 00133 sm_rx = pcc_rx_ready; 00134 break; 00135 case pcc_rx_done: 00136 switch (receivedMessage.header.cmdid) 00137 { 00138 case PCC_SYNC: 00139 pcc_reset(); 00140 break; 00141 case PCC_BOARD_GET: 00142 if(receivedMessage.header.length == 1) 00143 { 00144 transmitMessage.header.cmdid = PCC_BOARD_GET; 00145 transmitMessage.header.length = 2; 00146 switch (receivedMessage.message[0]) 00147 { 00148 case 'A': 00149 transmitMessage.message[0] = DDRA; 00150 transmitMessage.message[1] = PINA; 00151 break; 00152 case 'B': 00153 transmitMessage.message[0] = DDRB; 00154 transmitMessage.message[1] = PINB; 00155 break; 00156 case 'C': 00157 transmitMessage.message[0] = DDRC; 00158 transmitMessage.message[1] = PINC; 00159 break; 00160 case 'D': 00161 transmitMessage.message[0] = DDRD; 00162 transmitMessage.message[1] = PIND; 00163 break; 00164 default: 00165 transmitMessage.message[0] = 0; 00166 transmitMessage.message[1] = 0; 00167 } 00168 pcc_send(&transmitMessage); 00169 } else 00170 pcc_sendError(); 00171 break; 00172 case PCC_BOARD_SET: 00173 if(receivedMessage.header.length == 3) 00174 { 00175 } 00176 else 00177 pcc_sendError(); 00178 break; 00179 case PCC_BOARD_AKKU: 00180 if(receivedMessage.header.length == 0) 00181 { 00182 } 00183 else 00184 pcc_sendError(); 00185 break; 00186 case PCC_BOARD_I2C: 00187 case PCC_BOARD_TIME: 00188 if(receivedMessage.header.length == 0) 00189 { 00190 transmitMessage.header.cmdid = PCC_BOARD_TIME; 00191 transmitMessage.header.length = 4; 00192 transmitMessage.message[0] = *((*ppcc).time)>>24; 00193 transmitMessage.message[1] = *((*ppcc).time)>>16; 00194 transmitMessage.message[2] = *((*ppcc).time)>>8; 00195 transmitMessage.message[3] = *((*ppcc).time); 00196 pcc_send(&transmitMessage); 00197 } 00198 else 00199 pcc_sendError(); 00200 break; 00201 case PCC_MOT_L_ENC: 00202 if(receivedMessage.header.length == 0) 00203 { 00204 transmitMessage.header.cmdid = PCC_MOT_L_ENC; 00205 transmitMessage.header.length = 2; 00206 transmitMessage.message[0] = *((*ppcc).encoder[LEFT])>>8; 00207 transmitMessage.message[1] = *((*ppcc).encoder[LEFT]); 00208 pcc_send(&transmitMessage); 00209 } 00210 else 00211 pcc_sendError(); 00212 break; 00213 case PCC_MOT_L_CUR: 00214 case PCC_MOT_L_ACS: 00215 if(receivedMessage.header.length == 0) 00216 { 00217 transmitMessage.header.cmdid = PCC_MOT_L_ACS; 00218 transmitMessage.header.length = 2; 00219 transmitMessage.message[0] = *((*ppcc).istwert[LEFT])>>8; 00220 transmitMessage.message[1] = *((*ppcc).istwert[LEFT]); 00221 pcc_send(&transmitMessage); 00222 } 00223 else 00224 pcc_sendError(); 00225 break; 00226 case PCC_MOT_L_SRS: 00227 if(receivedMessage.header.length == 0) 00228 { 00229 transmitMessage.header.cmdid = PCC_MOT_L_SRS; 00230 transmitMessage.header.length = 2; 00231 transmitMessage.message[0] = *((*ppcc).sollwert[LEFT])>>8; 00232 transmitMessage.message[1] = *((*ppcc).sollwert[LEFT]); 00233 pcc_send(&transmitMessage); 00234 } 00235 else 00236 pcc_sendError(); 00237 break; 00238 case PCC_MOT_L_TMP: 00239 case PCC_MOT_R_ENC: 00240 if(receivedMessage.header.length == 0) 00241 { 00242 transmitMessage.header.cmdid = PCC_MOT_R_ENC; 00243 transmitMessage.header.length = 2; 00244 transmitMessage.message[0] = *((*ppcc).encoder[RIGHT])>>8; 00245 transmitMessage.message[1] = *((*ppcc).encoder[RIGHT]); 00246 pcc_send(&transmitMessage); 00247 } 00248 else 00249 pcc_sendError(); 00250 break; 00251 case PCC_MOT_R_CUR: 00252 case PCC_MOT_R_ACS: 00253 if(receivedMessage.header.length == 0) 00254 { 00255 transmitMessage.header.cmdid = PCC_MOT_L_ACS; 00256 transmitMessage.header.length = 2; 00257 transmitMessage.message[0] = *((*ppcc).istwert[RIGHT])>>8; 00258 transmitMessage.message[1] = *((*ppcc).istwert[RIGHT]); 00259 pcc_send(&transmitMessage); 00260 } 00261 else 00262 pcc_sendError(); 00263 break; 00264 case PCC_MOT_R_SRS: 00265 if(receivedMessage.header.length == 0) 00266 { 00267 transmitMessage.header.cmdid = PCC_MOT_L_SRS; 00268 transmitMessage.header.length = 2; 00269 transmitMessage.message[0] = *((*ppcc).sollwert[RIGHT])>>8; 00270 transmitMessage.message[1] = *((*ppcc).sollwert[RIGHT]); 00271 pcc_send(&transmitMessage); 00272 } 00273 else 00274 pcc_sendError(); 00275 break; 00276 case PCC_MOT_R_TMP: 00277 case PCC_SENS_IR1: 00278 case PCC_SENS_IR2: 00279 case PCC_SENS_ACC: 00280 case PCC_SENS_ORI: 00281 case PCC_ACTION_MOVE: 00282 case PCC_ACTION_TURN: 00283 break; 00284 default: 00285 pcc_sendError(); 00286 } 00287 pcc_reset(); 00288 sm_rx = pcc_rx_ready; 00289 break; 00290 } 00291 } 00292 00293 void pcc_send(tstMessage *message) 00294 { 00295 uint8_t *buf = (uint8_t *)message; 00296 uint8_t versendeteBytes = 0; 00297 00298 00299 00300 do 00301 { 00302 uart_putc(*buf++); 00303 versendeteBytes++; 00304 }while(versendeteBytes < ((*message).header.length)+1); 00305 } 00306 00307 void pcc_sendError(void) 00308 { 00309 transmitMessage.header.cmdid = PCC_SYNC; 00310 transmitMessage.header.length = 0; 00311 pcc_send(&transmitMessage); 00312 }