...simplify packet assambly
This commit is contained in:
parent
ebbeb99d4f
commit
3a80bdef75
10
DShotRMT.cpp
10
DShotRMT.cpp
|
|
@ -184,13 +184,13 @@ uint32_t DShotRMT::getMotorRPM(uint8_t magnet_count)
|
||||||
// Calculates CRC for DShot packet
|
// Calculates CRC for DShot packet
|
||||||
void DShotRMT::calculateCRC(dshot_packet_t *dshot_packet)
|
void DShotRMT::calculateCRC(dshot_packet_t *dshot_packet)
|
||||||
{
|
{
|
||||||
uint16_t packet = (dshot_packet->throttle_value << 1) | (dshot_packet->telemetric_request);
|
_parsed_dshot_tx_packet = (dshot_packet->throttle_value << 1) | (dshot_packet->telemetric_request);
|
||||||
|
|
||||||
// Reset CRC container
|
// Reset CRC container
|
||||||
dshot_packet->checksum = DSHOT_NULL_PACKET;
|
dshot_packet->checksum = DSHOT_NULL_PACKET;
|
||||||
|
|
||||||
// CRC calculation for DShot (4 bits)
|
// CRC calculation for DShot (4 bits)
|
||||||
dshot_packet->checksum = ((packet ^ (packet >> 4) ^ (packet >> 8)) & 0b0000000000001111);
|
dshot_packet->checksum = ((_parsed_dshot_tx_packet ^ (_parsed_dshot_tx_packet >> 4) ^ (_parsed_dshot_tx_packet >> 8)) & 0b0000000000001111);
|
||||||
|
|
||||||
// CRC is inverted for bidirectional DShot
|
// CRC is inverted for bidirectional DShot
|
||||||
if (dshot_packet->telemetric_request)
|
if (dshot_packet->telemetric_request)
|
||||||
|
|
@ -198,10 +198,10 @@ void DShotRMT::calculateCRC(dshot_packet_t *dshot_packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assembles DShot packet (11 bit throttle + 1 bit telemetry request + 4 bit CRC)
|
// Assembles DShot packet (11 bit throttle + 1 bit telemetry request + 4 bit CRC)
|
||||||
uint16_t DShotRMT::parseDShotPacket(const dshot_packet_t *dshot_packet) const
|
uint16_t DShotRMT::parseDShotPacket(const dshot_packet_t *dshot_packet)
|
||||||
{
|
{
|
||||||
uint16_t parsed_packet = ((dshot_packet->throttle_value << 1) | (dshot_packet->telemetric_request)) & 0b0000111111111111;
|
_parsed_dshot_tx_packet = ((dshot_packet->throttle_value << 1) | (dshot_packet->telemetric_request)) & 0b0000111111111111;
|
||||||
return ((parsed_packet << 4) | (dshot_packet->checksum)) & 0b1111111111111111;
|
return ((_parsed_dshot_tx_packet << 4) | (dshot_packet->checksum)) & 0b1111111111111111;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Converts a 16-bit packet into a valid DShot frame for RMT
|
// Converts a 16-bit packet into a valid DShot frame for RMT
|
||||||
|
|
|
||||||
|
|
@ -71,13 +71,14 @@ public:
|
||||||
gpio_num_t getGPIO() const { return _gpio; }
|
gpio_num_t getGPIO() const { return _gpio; }
|
||||||
dshot_mode_t getDShotMode() const { return _mode; }
|
dshot_mode_t getDShotMode() const { return _mode; }
|
||||||
uint16_t getFrameLenght() const { return _frameLength; }
|
uint16_t getFrameLenght() const { return _frameLength; }
|
||||||
|
uint16_t getDShotPacket() const { return _parsed_dshot_tx_packet; }
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
// Calculates the checksum for a DShot packet
|
// Calculates the checksum for a DShot packet
|
||||||
void calculateCRC(dshot_packet_t *dshot_packet);
|
void calculateCRC(dshot_packet_t *dshot_packet);
|
||||||
|
|
||||||
// Parses the DShot packet (11 bit throttle + 1 bit telemetry request + 4 bit CRC)
|
// Parses the DShot packet (11 bit throttle + 1 bit telemetry request + 4 bit CRC)
|
||||||
uint16_t parseDShotPacket(const dshot_packet_t *dshot_packet) const;
|
uint16_t parseDShotPacket(const dshot_packet_t *dshot_packet);
|
||||||
|
|
||||||
// Converts a 16-bit DShot packet into RMT symbols
|
// Converts a 16-bit DShot packet into RMT symbols
|
||||||
void encodeDShotTX(dshot_packet_t *dshot_packet, rmt_symbol_word_t *symbols, size_t &count);
|
void encodeDShotTX(dshot_packet_t *dshot_packet, rmt_symbol_word_t *symbols, size_t &count);
|
||||||
|
|
@ -85,8 +86,7 @@ protected:
|
||||||
// Decodes the ESC answer
|
// Decodes the ESC answer
|
||||||
uint16_t decodeDShotRX(const rmt_symbol_word_t *symbols, uint32_t count);
|
uint16_t decodeDShotRX(const rmt_symbol_word_t *symbols, uint32_t count);
|
||||||
|
|
||||||
private:
|
// --- Configuration Parameters ---
|
||||||
// --- Configuration Parameters ---
|
|
||||||
gpio_num_t _gpio = GPIO_NUM_NC;
|
gpio_num_t _gpio = GPIO_NUM_NC;
|
||||||
dshot_mode_t _mode = DSHOT_OFF;
|
dshot_mode_t _mode = DSHOT_OFF;
|
||||||
bool _isBidirectional = false;
|
bool _isBidirectional = false;
|
||||||
|
|
@ -94,6 +94,7 @@ private:
|
||||||
|
|
||||||
// --- DShot Packets Container ---
|
// --- DShot Packets Container ---
|
||||||
uint16_t _rx_packet = DSHOT_NULL_PACKET;
|
uint16_t _rx_packet = DSHOT_NULL_PACKET;
|
||||||
|
uint16_t _parsed_dshot_tx_packet = DSHOT_NULL_PACKET;
|
||||||
dshot_packet_t _dshot_packet = {};
|
dshot_packet_t _dshot_packet = {};
|
||||||
|
|
||||||
// --- RMT Channel Handles ---
|
// --- RMT Channel Handles ---
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue