RobOmega - PSL RoboCup / Mbed OS nRF24L01P_L432KC_CarteBlanche

Dependencies:   nRF24L01P_Hello_World nRF24L01P

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers protocol.cpp Source File

protocol.cpp

00001 #include "protocol.h"
00002 #include "circularBuffer.h"
00003 
00004 //------------------------------------------------Encodage/Decodage des trames------------------------------------------------//
00005 //!!! La taille de "msg[]" doit être [msgPayloadLength + 6]
00006 void encodeAndSendMessage(int msgFunction, int msgPayloadLength, char* msgPayload)
00007 {
00008     int msgIndex = 0;
00009     char msg[msgPayloadLength + 6];
00010     msg[msgIndex++] = 0xFE;                                                                //Start of Frame
00011     msg[msgIndex++] = (char)(msgFunction >> 8);                                            //Message Function MSB
00012     msg[msgIndex++] = (char)(msgFunction);                                                 //Message Function LSB
00013     msg[msgIndex++] = (char)(msgPayloadLength >> 8);                                       //Message Payload Length MSB
00014     msg[msgIndex++] = (char)(msgPayloadLength);                                            //Message Payload Length LSB
00015     int j;
00016     for (j = 0 ; j < msgPayloadLength; j++)
00017         msg[msgIndex++] = msgPayload[j];                                                   //MessagePayload
00018     msg[msgIndex++] = calculateChecksum(msgFunction, msgPayloadLength, msgPayload);        //Checksum
00019     
00020     cbTxSendMessage(msg, msgPayloadLength + 6);
00021 }
00022 
00023 char calculateChecksum(int msgFunction, int msgPayloadLength, char* msgPayload)
00024 {
00025     char checksum = 0xFE;
00026     checksum ^= (char)(msgFunction >> 8);
00027     checksum ^= (char)(msgFunction);
00028     checksum ^= (char)(msgPayloadLength >> 8);
00029     checksum ^= (char)(msgPayloadLength);
00030     int i;
00031     for(i = 0; i < msgPayloadLength; i++)
00032         checksum ^= msgPayload[i];
00033     
00034     return checksum;
00035 }
00036 
00037 unsigned char rcvState = WAITING;
00038 int decodedMsgFunction;
00039 int decodedPayloadLength;
00040 char decodedPayload[BUFFER_SIZE];
00041 int decodedPayloadIndex = 0;
00042 
00043 void decodeMessage(char receivedByte)
00044 {
00045     switch(rcvState)
00046     {
00047         case WAITING:
00048             if (receivedByte == 0xFE)
00049                 rcvState = FUNCTION_MSB;
00050             break;
00051             
00052         case FUNCTION_MSB:
00053             decodedMsgFunction = receivedByte << 8;
00054             rcvState = FUNCTION_LSB;
00055             break;
00056             
00057         case FUNCTION_LSB:
00058             decodedMsgFunction += receivedByte;
00059             rcvState = LENGTH_MSB;
00060             break;
00061             
00062         case LENGTH_MSB:
00063             decodedPayloadLength = receivedByte << 8;
00064             rcvState = LENGTH_LSB;
00065             break;
00066             
00067         case LENGTH_LSB:
00068             decodedPayloadLength += receivedByte;
00069             rcvState = PAYLOAD;
00070             break;
00071             
00072         case PAYLOAD:
00073             if(decodedPayloadLength >= BUFFER_SIZE)
00074             {
00075                 rcvState = WAITING;
00076                 decodedPayloadLength = 0;
00077                 decodedMsgFunction = 0;
00078             }
00079             else if (decodedPayloadLength > 0)
00080             {
00081                 decodedPayload[decodedPayloadIndex++] = receivedByte;
00082                 if (decodedPayloadIndex >= decodedPayloadLength)
00083                 {
00084                     rcvState = CHECKSUM;
00085                     decodedPayloadIndex = 0;
00086                 }
00087             }
00088             else
00089             {
00090                 rcvState = CHECKSUM;
00091             }
00092             break;
00093             
00094         case CHECKSUM:
00095         {    
00096             char calculatedChecksum = calculateChecksum(decodedMsgFunction, decodedPayloadLength, decodedPayload);
00097             if (calculatedChecksum == receivedByte)
00098             {
00099                 //Victoire, la trame recu correspond à la trame envoyé
00100                 //TODO: Faire une fonction qui traite la charge utile apres décodage.
00101             }
00102             
00103             rcvState = WAITING;
00104             break;
00105         }
00106     }
00107 }