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@5:668dd9395ca5, 2021-04-16 (annotated)
- Committer:
- voltxd
- Date:
- Fri Apr 16 16:01:03 2021 +0000
- Revision:
- 5:668dd9395ca5
- Parent:
- 4:5caf9e1dc16c
ok;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |