RobOmega - PSL RoboCup / Mbed OS nRF24L01P_L432KC_CarteBlanche

Dependencies:   nRF24L01P_Hello_World nRF24L01P

Committer:
voltxd
Date:
Fri Jan 08 08:51:10 2021 +0000
Revision:
4:5caf9e1dc16c
Child:
5:668dd9395ca5
1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
voltxd 4:5caf9e1dc16c 1 #include "protocol.h"
voltxd 4:5caf9e1dc16c 2 #include "bufferCirculaire.h"
voltxd 4:5caf9e1dc16c 3
voltxd 4:5caf9e1dc16c 4 //------------------------------------------------Encodage/Decodage des trames------------------------------------------------//
voltxd 4:5caf9e1dc16c 5 //!!! La taille de "msg[]" doit être [msgPayloadLength + 6]
voltxd 4:5caf9e1dc16c 6 int encodeMessage(int msgFunction, int msgPayloadLength, char* msgPayload, char* msg)
voltxd 4:5caf9e1dc16c 7 {
voltxd 4:5caf9e1dc16c 8 int msgLength = 0;
voltxd 4:5caf9e1dc16c 9 msg[msgLength++] = 0xFE; //Start of Frame
voltxd 4:5caf9e1dc16c 10 msg[msgLength++] = (char)(msgFunction >> 8); //Message Function MSB
voltxd 4:5caf9e1dc16c 11 msg[msgLength++] = (char)(msgFunction); //Message Function LSB
voltxd 4:5caf9e1dc16c 12 msg[msgLength++] = (char)(msgPayloadLength >> 8); //Message Payload Length MSB
voltxd 4:5caf9e1dc16c 13 msg[msgLength++] = (char)(msgPayloadLength); //Message Payload Length LSB
voltxd 4:5caf9e1dc16c 14 int j;
voltxd 4:5caf9e1dc16c 15 for (j = 0 ; j < msgPayloadLength; j++)
voltxd 4:5caf9e1dc16c 16 msg[msgLength++] = msgPayload[j]; //MessagePayload
voltxd 4:5caf9e1dc16c 17 msg[msgLength++] = calculateChecksum(msgFunction, msgPayloadLength, msgPayload); //Checksum
voltxd 4:5caf9e1dc16c 18
voltxd 4:5caf9e1dc16c 19 return msgLength;
voltxd 4:5caf9e1dc16c 20 }
voltxd 4:5caf9e1dc16c 21
voltxd 4:5caf9e1dc16c 22 char calculateChecksum(int msgFunction, int msgPayloadLength, char* msgPayload)
voltxd 4:5caf9e1dc16c 23 {
voltxd 4:5caf9e1dc16c 24 char checksum = 0xFE;
voltxd 4:5caf9e1dc16c 25 checksum ^= (char)(msgFunction >> 8);
voltxd 4:5caf9e1dc16c 26 checksum ^= (char)(msgFunction);
voltxd 4:5caf9e1dc16c 27 checksum ^= (char)(msgPayloadLength >> 8);
voltxd 4:5caf9e1dc16c 28 checksum ^= (char)(msgPayloadLength);
voltxd 4:5caf9e1dc16c 29 int i;
voltxd 4:5caf9e1dc16c 30 for(i = 0; i < msgPayloadLength; i++)
voltxd 4:5caf9e1dc16c 31 checksum ^= msgPayload[i];
voltxd 4:5caf9e1dc16c 32
voltxd 4:5caf9e1dc16c 33 return checksum;
voltxd 4:5caf9e1dc16c 34 }
voltxd 4:5caf9e1dc16c 35
voltxd 4:5caf9e1dc16c 36 unsigned char rcvState = WAITING;
voltxd 4:5caf9e1dc16c 37 int decodedMsgFunction;
voltxd 4:5caf9e1dc16c 38 int decodedPayloadLength;
voltxd 4:5caf9e1dc16c 39 char decodedPayload[BUFFER_SIZE];
voltxd 4:5caf9e1dc16c 40 int decodedPayloadIndex = 0;
voltxd 4:5caf9e1dc16c 41
voltxd 4:5caf9e1dc16c 42 void decodeMessage(char receivedByte)
voltxd 4:5caf9e1dc16c 43 {
voltxd 4:5caf9e1dc16c 44 switch(rcvState)
voltxd 4:5caf9e1dc16c 45 {
voltxd 4:5caf9e1dc16c 46 case WAITING:
voltxd 4:5caf9e1dc16c 47 if (receivedByte == 0xFE)
voltxd 4:5caf9e1dc16c 48 rcvState = FUNCTION_MSB;
voltxd 4:5caf9e1dc16c 49 break;
voltxd 4:5caf9e1dc16c 50
voltxd 4:5caf9e1dc16c 51 case FUNCTION_MSB:
voltxd 4:5caf9e1dc16c 52 decodedMsgFunction = receivedByte << 8;
voltxd 4:5caf9e1dc16c 53 rcvState = FUNCTION_LSB;
voltxd 4:5caf9e1dc16c 54 break;
voltxd 4:5caf9e1dc16c 55
voltxd 4:5caf9e1dc16c 56 case FUNCTION_LSB:
voltxd 4:5caf9e1dc16c 57 decodedMsgFunction += receivedByte;
voltxd 4:5caf9e1dc16c 58 rcvState = LENGTH_MSB;
voltxd 4:5caf9e1dc16c 59 break;
voltxd 4:5caf9e1dc16c 60
voltxd 4:5caf9e1dc16c 61 case LENGTH_MSB:
voltxd 4:5caf9e1dc16c 62 decodedPayloadLength = receivedByte << 8;
voltxd 4:5caf9e1dc16c 63 rcvState = LENGTH_LSB;
voltxd 4:5caf9e1dc16c 64 break;
voltxd 4:5caf9e1dc16c 65
voltxd 4:5caf9e1dc16c 66 case LENGTH_LSB:
voltxd 4:5caf9e1dc16c 67 decodedPayloadLength += receivedByte;
voltxd 4:5caf9e1dc16c 68 rcvState = PAYLOAD;
voltxd 4:5caf9e1dc16c 69 break;
voltxd 4:5caf9e1dc16c 70
voltxd 4:5caf9e1dc16c 71 case PAYLOAD:
voltxd 4:5caf9e1dc16c 72 if(decodedPayloadLength >= BUFFER_SIZE)
voltxd 4:5caf9e1dc16c 73 {
voltxd 4:5caf9e1dc16c 74 rcvState = WAITING;
voltxd 4:5caf9e1dc16c 75 decodedPayloadLength = 0;
voltxd 4:5caf9e1dc16c 76 decodedMsgFunction = 0;
voltxd 4:5caf9e1dc16c 77 }
voltxd 4:5caf9e1dc16c 78 else if (decodedPayloadLength > 0)
voltxd 4:5caf9e1dc16c 79 {
voltxd 4:5caf9e1dc16c 80 decodedPayload[decodedPayloadIndex++] = receivedByte;
voltxd 4:5caf9e1dc16c 81 if (decodedPayloadIndex >= decodedPayloadLength)
voltxd 4:5caf9e1dc16c 82 {
voltxd 4:5caf9e1dc16c 83 rcvState = CHECKSUM;
voltxd 4:5caf9e1dc16c 84 decodedPayloadIndex = 0;
voltxd 4:5caf9e1dc16c 85 }
voltxd 4:5caf9e1dc16c 86 }
voltxd 4:5caf9e1dc16c 87 else
voltxd 4:5caf9e1dc16c 88 {
voltxd 4:5caf9e1dc16c 89 rcvState = CHECKSUM;
voltxd 4:5caf9e1dc16c 90 }
voltxd 4:5caf9e1dc16c 91 break;
voltxd 4:5caf9e1dc16c 92
voltxd 4:5caf9e1dc16c 93 case CHECKSUM:
voltxd 4:5caf9e1dc16c 94 {
voltxd 4:5caf9e1dc16c 95 char calculatedChecksum = calculateChecksum(decodedMsgFunction, decodedPayloadLength, decodedPayload);
voltxd 4:5caf9e1dc16c 96 if (calculatedChecksum == receivedByte)
voltxd 4:5caf9e1dc16c 97 {
voltxd 4:5caf9e1dc16c 98 //Victoire, la trame recu correspond à la trame envoyé
voltxd 4:5caf9e1dc16c 99 //TODO: Faire une fonction qui traite la charge utile apres décodage.
voltxd 4:5caf9e1dc16c 100 }
voltxd 4:5caf9e1dc16c 101
voltxd 4:5caf9e1dc16c 102 rcvState = WAITING;
voltxd 4:5caf9e1dc16c 103 break;
voltxd 4:5caf9e1dc16c 104 }
voltxd 4:5caf9e1dc16c 105 }
voltxd 4:5caf9e1dc16c 106 }