.

Dependencies:   L432KC_SPI_Pey_Lal

Committer:
voltxd
Date:
Thu Apr 07 12:13:04 2022 +0000
Revision:
110:a6d1d3525014
Child:
111:f11575e7c79b
.

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 110:a6d1d3525014 5 char calculateChecksum(uint32_t propulsion, uint32_t direction)
voltxd 110:a6d1d3525014 6 {
voltxd 110:a6d1d3525014 7 char checksum = 0xff;
voltxd 110:a6d1d3525014 8 checksum ^= propulsion >> 8;
voltxd 110:a6d1d3525014 9 checksum ^= propulsion & (0b11111111);
voltxd 110:a6d1d3525014 10 checksum ^= direction >> 8;
voltxd 110:a6d1d3525014 11 checksum ^= direction & (0b11111111);
voltxd 110:a6d1d3525014 12
voltxd 110:a6d1d3525014 13 return checksum;
voltxd 110:a6d1d3525014 14 }
voltxd 110:a6d1d3525014 15
voltxd 110:a6d1d3525014 16 char receiveState = STATE_START_OF_FRAME;
voltxd 110:a6d1d3525014 17 char receiveIndex = 0;
voltxd 110:a6d1d3525014 18 uint32_t receivedPropulsion;
voltxd 110:a6d1d3525014 19 uint32_t receivedDirection;
voltxd 110:a6d1d3525014 20
voltxd 110:a6d1d3525014 21 uint32_t verifiedPropulsion = 1500;
voltxd 110:a6d1d3525014 22 uint32_t verifiedDirection = 1150;
voltxd 110:a6d1d3525014 23
voltxd 110:a6d1d3525014 24 void decodeMessage(char c)
voltxd 110:a6d1d3525014 25 {
voltxd 110:a6d1d3525014 26 switch(receiveState)
voltxd 110:a6d1d3525014 27 {
voltxd 110:a6d1d3525014 28 case STATE_START_OF_FRAME:
voltxd 110:a6d1d3525014 29 //Checking if we received the start Byte
voltxd 110:a6d1d3525014 30 if (c == 0xff)
voltxd 110:a6d1d3525014 31 {
voltxd 110:a6d1d3525014 32 receiveState = STATE_PROPULSION;
voltxd 110:a6d1d3525014 33 receiveIndex = 0;
voltxd 110:a6d1d3525014 34 }
voltxd 110:a6d1d3525014 35 break;
voltxd 110:a6d1d3525014 36
voltxd 110:a6d1d3525014 37 case STATE_PROPULSION:
voltxd 110:a6d1d3525014 38 //Retrieving the propulsion PWM bytes (1. MSB; 2. LSB)
voltxd 110:a6d1d3525014 39 if (receiveIndex++ == 0)
voltxd 110:a6d1d3525014 40 receivedPropulsion = c << 8;
voltxd 110:a6d1d3525014 41 else
voltxd 110:a6d1d3525014 42 {
voltxd 110:a6d1d3525014 43 receivedPropulsion += c;
voltxd 110:a6d1d3525014 44 receiveState = STATE_DIRECTION;
voltxd 110:a6d1d3525014 45 receiveIndex = 0;
voltxd 110:a6d1d3525014 46 }
voltxd 110:a6d1d3525014 47 break;
voltxd 110:a6d1d3525014 48
voltxd 110:a6d1d3525014 49 case STATE_DIRECTION:
voltxd 110:a6d1d3525014 50 //Retrieving the direction PWM bytes (1. MSB; 2. LSB)
voltxd 110:a6d1d3525014 51 if (receiveIndex++ == 0)
voltxd 110:a6d1d3525014 52 receivedDirection = c << 8;
voltxd 110:a6d1d3525014 53 else
voltxd 110:a6d1d3525014 54 {
voltxd 110:a6d1d3525014 55 receivedDirection += c;
voltxd 110:a6d1d3525014 56 receiveState = STATE_CHECKSUM;
voltxd 110:a6d1d3525014 57 }
voltxd 110:a6d1d3525014 58 break;
voltxd 110:a6d1d3525014 59
voltxd 110:a6d1d3525014 60 case STATE_CHECKSUM:
voltxd 110:a6d1d3525014 61 //Checksum
voltxd 110:a6d1d3525014 62 if (c == calculateChecksum(receivedPropulsion, receivedDirection))
voltxd 110:a6d1d3525014 63 {
voltxd 110:a6d1d3525014 64 //Le message recu est correct, on peut exploiter ses données
voltxd 110:a6d1d3525014 65 verifiedPropulsion = receivedPropulsion;
voltxd 110:a6d1d3525014 66 verifiedDirection = receivedDirection;
voltxd 110:a6d1d3525014 67 newDataAvailable = 1;
voltxd 110:a6d1d3525014 68 }
voltxd 110:a6d1d3525014 69 receiveState = STATE_START_OF_FRAME;
voltxd 110:a6d1d3525014 70 break;
voltxd 110:a6d1d3525014 71
voltxd 110:a6d1d3525014 72 default:
voltxd 110:a6d1d3525014 73 receiveState = STATE_START_OF_FRAME;
voltxd 110:a6d1d3525014 74 break;
voltxd 110:a6d1d3525014 75 }
voltxd 110:a6d1d3525014 76 }
voltxd 110:a6d1d3525014 77
voltxd 110:a6d1d3525014 78 void getVerifiedPWMValues(uint32_t *pwmPropulsion, uint32_t *pwmDirection)
voltxd 110:a6d1d3525014 79 {
voltxd 110:a6d1d3525014 80 *pwmPropulsion = verifiedPropulsion;
voltxd 110:a6d1d3525014 81 *pwmDirection = verifiedDirection;
voltxd 110:a6d1d3525014 82 newDataAvailable = 0;
voltxd 110:a6d1d3525014 83 }
voltxd 110:a6d1d3525014 84
voltxd 110:a6d1d3525014 85 char isDataAvailable()
voltxd 110:a6d1d3525014 86 {
voltxd 110:a6d1d3525014 87 return newDataAvailable;
voltxd 110:a6d1d3525014 88 }