.

Dependencies:   L432KC_SPI_Pey_Lal

Committer:
voltxd
Date:
Wed May 18 18:07:09 2022 +0000
Revision:
115:156b8234f2de
Parent:
111:f11575e7c79b
Child:
116:6dfcafa00e42
.

Who changed what in which revision?

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