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
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 }
Generated on Wed Jul 13 2022 03:07:10 by
1.7.2