RobOmega - PSL RoboCup / Mbed OS nRF24L01P_L432KC_CarteBlanche

Dependencies:   nRF24L01P_Hello_World nRF24L01P

Committer:
voltxd
Date:
Fri Apr 16 16:01:03 2021 +0000
Revision:
5:668dd9395ca5
Parent:
4:5caf9e1dc16c
ok;

Who changed what in which revision?

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