...modular functions
...crc calculation and paket building in seperate functions now
This commit is contained in:
parent
8557930d3e
commit
1c8a0ed572
42
DShotRMT.cpp
42
DShotRMT.cpp
|
|
@ -73,14 +73,8 @@ void DShotRMT::setThrottle(uint16_t throttle)
|
||||||
|
|
||||||
_lastThrottle = throttle;
|
_lastThrottle = throttle;
|
||||||
|
|
||||||
// Assemble raw DShot packet and compute checksum
|
// Convert throttle value to DShot Paket Format
|
||||||
_tx_packet = (throttle << 1) | (_isBidirectional ? 1 : 0);
|
_tx_packet = assambleDShotPaket(_lastThrottle);
|
||||||
|
|
||||||
uint16_t crc = _isBidirectional
|
|
||||||
? (~(_tx_packet ^ (_tx_packet >> 4) ^ (_tx_packet >> 8))) & 0x0F
|
|
||||||
: (_tx_packet ^ (_tx_packet >> 4) ^ (_tx_packet >> 8)) & 0x0F;
|
|
||||||
|
|
||||||
_tx_packet = (_tx_packet << 4) | crc;
|
|
||||||
|
|
||||||
// Encode RMT symbols
|
// Encode RMT symbols
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
@ -167,6 +161,38 @@ uint32_t DShotRMT::getMotorRPM(uint8_t magnet_count)
|
||||||
return rpm;
|
return rpm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculate CRC for DShot Paket
|
||||||
|
uint16_t DShotRMT::calculateCRC(uint16_t dshot_packet)
|
||||||
|
{
|
||||||
|
// Clear container before new calculation
|
||||||
|
_packet_crc = DSHOT_NULL_PACKET;
|
||||||
|
|
||||||
|
// CRC is inverted for biDirectional DSHot
|
||||||
|
_packet_crc = _isBidirectional
|
||||||
|
? (~(dshot_packet ^ (dshot_packet >> 4) ^ (dshot_packet >> 8))) & 0x0F
|
||||||
|
: (dshot_packet ^ (dshot_packet >> 4) ^ (dshot_packet >> 8)) & 0x0F;
|
||||||
|
|
||||||
|
return _packet_crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assamble DShot Paket (10 bit throttle + 1 bit telemetry request + 4 bit crc)
|
||||||
|
uint16_t DShotRMT::assambleDShotPaket(uint16_t value)
|
||||||
|
{
|
||||||
|
// Clear container
|
||||||
|
_tx_packet = DSHOT_NULL_PACKET;
|
||||||
|
|
||||||
|
// dummy 10bit convertion
|
||||||
|
_tx_packet = value & 0b0000011111111111;
|
||||||
|
|
||||||
|
// Assemble raw DShot packet and add checksum
|
||||||
|
_tx_packet = (value << 1) | (_isBidirectional ? 1 : 0);
|
||||||
|
_packet_crc = calculateCRC(_tx_packet);
|
||||||
|
|
||||||
|
_tx_packet = (_tx_packet << 4) | _packet_crc;
|
||||||
|
|
||||||
|
return _tx_packet;
|
||||||
|
}
|
||||||
|
|
||||||
// --- Encode DShot TX Frame ---
|
// --- Encode DShot TX Frame ---
|
||||||
// Converts a 16-bit packet into a valid DShot Frame for RMT
|
// Converts a 16-bit packet into a valid DShot Frame for RMT
|
||||||
void DShotRMT::encodeDShotTX(uint16_t dshot_packet, rmt_symbol_word_t *symbols, size_t &count)
|
void DShotRMT::encodeDShotTX(uint16_t dshot_packet, rmt_symbol_word_t *symbols, size_t &count)
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,12 @@ public:
|
||||||
dshot_mode_t getDShotMode() const { return _mode; }
|
dshot_mode_t getDShotMode() const { return _mode; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// Calculate the checksum for throttle value
|
||||||
|
uint16_t calculateCRC(uint16_t dshot_packet);
|
||||||
|
|
||||||
|
// Assamble DShot Paket (10 bit throttle + 1 bit telemetry request + 4 bit crc)
|
||||||
|
uint16_t assambleDShotPaket(uint16_t value);
|
||||||
|
|
||||||
// Converts a 16-bit DShot packet into RMT symbols and appends pause
|
// Converts a 16-bit DShot packet into RMT symbols and appends pause
|
||||||
void encodeDShotTX(uint16_t dshot_packet, rmt_symbol_word_t *symbols, size_t &count);
|
void encodeDShotTX(uint16_t dshot_packet, rmt_symbol_word_t *symbols, size_t &count);
|
||||||
|
|
||||||
|
|
@ -79,6 +85,7 @@ private:
|
||||||
uint16_t _lastThrottle = DSHOT_FULL_PACKET;
|
uint16_t _lastThrottle = DSHOT_FULL_PACKET;
|
||||||
uint16_t _received_packet = DSHOT_NULL_PACKET;
|
uint16_t _received_packet = DSHOT_NULL_PACKET;
|
||||||
uint16_t _tx_packet = DSHOT_NULL_PACKET;
|
uint16_t _tx_packet = DSHOT_NULL_PACKET;
|
||||||
|
uint16_t _packet_crc = DSHOT_NULL_PACKET;
|
||||||
|
|
||||||
// --- RMT Channel ---
|
// --- RMT Channel ---
|
||||||
rmt_channel_handle_t _rmt_rx_channel = nullptr;
|
rmt_channel_handle_t _rmt_rx_channel = nullptr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue