.
Dependencies: L432KC_SPI_Pey_Lal
protocol.cpp
- Committer:
- voltxd
- Date:
- 2022-04-07
- Revision:
- 110:a6d1d3525014
- Child:
- 111:f11575e7c79b
File content as of revision 110:a6d1d3525014:
#include "protocol.h" char newDataAvailable = 0; char calculateChecksum(uint32_t propulsion, uint32_t direction) { char checksum = 0xff; checksum ^= propulsion >> 8; checksum ^= propulsion & (0b11111111); checksum ^= direction >> 8; checksum ^= direction & (0b11111111); return checksum; } char receiveState = STATE_START_OF_FRAME; char receiveIndex = 0; uint32_t receivedPropulsion; uint32_t receivedDirection; uint32_t verifiedPropulsion = 1500; uint32_t verifiedDirection = 1150; void decodeMessage(char c) { switch(receiveState) { case STATE_START_OF_FRAME: //Checking if we received the start Byte if (c == 0xff) { receiveState = STATE_PROPULSION; receiveIndex = 0; } break; case STATE_PROPULSION: //Retrieving the propulsion PWM bytes (1. MSB; 2. LSB) if (receiveIndex++ == 0) receivedPropulsion = c << 8; else { receivedPropulsion += c; receiveState = STATE_DIRECTION; receiveIndex = 0; } break; case STATE_DIRECTION: //Retrieving the direction PWM bytes (1. MSB; 2. LSB) if (receiveIndex++ == 0) receivedDirection = c << 8; else { receivedDirection += c; receiveState = STATE_CHECKSUM; } break; case STATE_CHECKSUM: //Checksum if (c == calculateChecksum(receivedPropulsion, receivedDirection)) { //Le message recu est correct, on peut exploiter ses données verifiedPropulsion = receivedPropulsion; verifiedDirection = receivedDirection; newDataAvailable = 1; } receiveState = STATE_START_OF_FRAME; break; default: receiveState = STATE_START_OF_FRAME; break; } } void getVerifiedPWMValues(uint32_t *pwmPropulsion, uint32_t *pwmDirection) { *pwmPropulsion = verifiedPropulsion; *pwmDirection = verifiedDirection; newDataAvailable = 0; } char isDataAvailable() { return newDataAvailable; }