pcc.c

gehe zur Dokumentation dieser Datei
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 }

Erzeugt am Sun Apr 22 20:00:39 2007 für nBot von  doxygen 1.5.1-p1