Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: nRF24L01P_Hello_World nRF24L01P
protocol.cpp@4:5caf9e1dc16c, 2021-01-08 (annotated)
- Committer:
- voltxd
- Date:
- Fri Jan 08 08:51:10 2021 +0000
- Revision:
- 4:5caf9e1dc16c
- Child:
- 5:668dd9395ca5
1;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |