.

Dependencies:   L432KC_SPI_Pey_Lal

Committer:
voltxd
Date:
Mon May 23 17:18:33 2022 +0000
Revision:
118:67d6698069fd
Parent:
116:6dfcafa00e42
ajoutvitesse;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
voltxd 110:a6d1d3525014 1 #include "protocol.h"
voltxd 116:6dfcafa00e42 2 #include "toolbox.hpp"
voltxd 110:a6d1d3525014 3
voltxd 110:a6d1d3525014 4 char newDataAvailable = 0;
voltxd 110:a6d1d3525014 5
voltxd 116:6dfcafa00e42 6 //Bytewise XOR checksum
voltxd 116:6dfcafa00e42 7 char calculateChecksum(char command, char* payload, char payloadLength) //Use only when receiving frames
voltxd 110:a6d1d3525014 8 {
voltxd 110:a6d1d3525014 9 char checksum = 0xff;
voltxd 115:156b8234f2de 10 checksum ^= command;
voltxd 115:156b8234f2de 11 for (int i = 0; i < payloadLength; i++)
voltxd 115:156b8234f2de 12 checksum ^= payload[i];
voltxd 110:a6d1d3525014 13 return checksum;
voltxd 110:a6d1d3525014 14 }
voltxd 110:a6d1d3525014 15
voltxd 116:6dfcafa00e42 16 char calculateChecksum(char *msg) //Use only when emitting speed frames
voltxd 116:6dfcafa00e42 17 {
voltxd 116:6dfcafa00e42 18 int i = 0;
voltxd 116:6dfcafa00e42 19 char checksum = msg[i++];
voltxd 116:6dfcafa00e42 20 for (; i < 5; i++)
voltxd 116:6dfcafa00e42 21 checksum ^= msg[i];
voltxd 116:6dfcafa00e42 22 return checksum;
voltxd 116:6dfcafa00e42 23 }
voltxd 116:6dfcafa00e42 24
voltxd 116:6dfcafa00e42 25 void encodeMessage(char *msg, float vitesse)
voltxd 116:6dfcafa00e42 26 {
voltxd 116:6dfcafa00e42 27 msg[0] = 0xff;
voltxd 116:6dfcafa00e42 28 convertFloatToBytes(&vitesse, msg, 1);
voltxd 116:6dfcafa00e42 29 msg[5] = calculateChecksum(msg);
voltxd 116:6dfcafa00e42 30 }
voltxd 116:6dfcafa00e42 31
voltxd 110:a6d1d3525014 32 char receiveState = STATE_START_OF_FRAME;
voltxd 110:a6d1d3525014 33 char receiveIndex = 0;
voltxd 115:156b8234f2de 34 char receiveIndexLimit;
voltxd 115:156b8234f2de 35 char receivedCommand;
voltxd 115:156b8234f2de 36 char receivedPayload[PAYLOAD_MAX_SIZE] = {0};
voltxd 110:a6d1d3525014 37
voltxd 115:156b8234f2de 38 char verifiedPayload[PAYLOAD_MAX_SIZE] = {0};
voltxd 115:156b8234f2de 39 char verifiedIndexLimit;
voltxd 115:156b8234f2de 40 char verifiedCommand;
voltxd 110:a6d1d3525014 41
voltxd 111:f11575e7c79b 42 //Decode the bytes received according to their order of reception.
voltxd 110:a6d1d3525014 43 void decodeMessage(char c)
voltxd 110:a6d1d3525014 44 {
voltxd 110:a6d1d3525014 45 switch(receiveState)
voltxd 110:a6d1d3525014 46 {
voltxd 110:a6d1d3525014 47 case STATE_START_OF_FRAME:
voltxd 110:a6d1d3525014 48 //Checking if we received the start Byte
voltxd 110:a6d1d3525014 49 if (c == 0xff)
voltxd 110:a6d1d3525014 50 {
voltxd 115:156b8234f2de 51 receiveState = STATE_COMMAND_TYPE;
voltxd 110:a6d1d3525014 52 receiveIndex = 0;
voltxd 110:a6d1d3525014 53 }
voltxd 110:a6d1d3525014 54 break;
voltxd 110:a6d1d3525014 55
voltxd 115:156b8234f2de 56 case STATE_COMMAND_TYPE:
voltxd 115:156b8234f2de 57 receivedCommand = c;
voltxd 115:156b8234f2de 58 receiveState = STATE_PAYLOAD;
voltxd 115:156b8234f2de 59 switch(receivedCommand)
voltxd 110:a6d1d3525014 60 {
voltxd 115:156b8234f2de 61 case COMMAND_PWM:
voltxd 115:156b8234f2de 62 receiveIndexLimit = 4;
voltxd 115:156b8234f2de 63 break;
voltxd 115:156b8234f2de 64
voltxd 115:156b8234f2de 65 case COMMAND_ASSERVISSEMENT:
voltxd 115:156b8234f2de 66 receiveIndexLimit = 6;
voltxd 115:156b8234f2de 67 break;
voltxd 115:156b8234f2de 68
voltxd 115:156b8234f2de 69 case COMMAND_PARAMETRES:
voltxd 115:156b8234f2de 70 receiveIndexLimit = 8;
voltxd 115:156b8234f2de 71 break;
voltxd 115:156b8234f2de 72
voltxd 115:156b8234f2de 73 default:
voltxd 115:156b8234f2de 74 receiveState = STATE_START_OF_FRAME;
voltxd 115:156b8234f2de 75 break;
voltxd 110:a6d1d3525014 76 }
voltxd 110:a6d1d3525014 77 break;
voltxd 110:a6d1d3525014 78
voltxd 115:156b8234f2de 79 case STATE_PAYLOAD:
voltxd 115:156b8234f2de 80 receivedPayload[receiveIndex++] = c;
voltxd 115:156b8234f2de 81 if (receiveIndex >= receiveIndexLimit)
voltxd 115:156b8234f2de 82 receiveState = STATE_CHECKSUM;
voltxd 115:156b8234f2de 83 break;
voltxd 115:156b8234f2de 84
voltxd 110:a6d1d3525014 85 case STATE_CHECKSUM:
voltxd 110:a6d1d3525014 86 //Checksum
voltxd 115:156b8234f2de 87 if (c == calculateChecksum(receivedCommand, receivedPayload, receiveIndexLimit))
voltxd 110:a6d1d3525014 88 {
voltxd 111:f11575e7c79b 89 //The frame is correct, we can use the values retrieved.
voltxd 115:156b8234f2de 90 for (int i = 0; i < receiveIndexLimit; i++)
voltxd 115:156b8234f2de 91 verifiedPayload[i] = receivedPayload[i];
voltxd 115:156b8234f2de 92 verifiedIndexLimit = receiveIndexLimit;
voltxd 115:156b8234f2de 93 verifiedCommand = receivedCommand;
voltxd 110:a6d1d3525014 94 newDataAvailable = 1;
voltxd 110:a6d1d3525014 95 }
voltxd 110:a6d1d3525014 96 receiveState = STATE_START_OF_FRAME;
voltxd 110:a6d1d3525014 97 break;
voltxd 110:a6d1d3525014 98
voltxd 110:a6d1d3525014 99 default:
voltxd 110:a6d1d3525014 100 receiveState = STATE_START_OF_FRAME;
voltxd 110:a6d1d3525014 101 break;
voltxd 110:a6d1d3525014 102 }
voltxd 110:a6d1d3525014 103 }
voltxd 110:a6d1d3525014 104
voltxd 111:f11575e7c79b 105 //Return the values decoded
voltxd 115:156b8234f2de 106 char getVerifiedPayload(char *payloadOutput)
voltxd 110:a6d1d3525014 107 {
voltxd 115:156b8234f2de 108 for (int i = 0; i < verifiedIndexLimit; i++)
voltxd 115:156b8234f2de 109 payloadOutput[i] = verifiedPayload[i];
voltxd 110:a6d1d3525014 110 newDataAvailable = 0;
voltxd 115:156b8234f2de 111 return verifiedCommand;
voltxd 110:a6d1d3525014 112 }
voltxd 110:a6d1d3525014 113
voltxd 111:f11575e7c79b 114 //Return a value telling if new informations are available.
voltxd 110:a6d1d3525014 115 char isDataAvailable()
voltxd 110:a6d1d3525014 116 {
voltxd 110:a6d1d3525014 117 return newDataAvailable;
voltxd 110:a6d1d3525014 118 }