...something
This commit is contained in:
parent
395437dd30
commit
392d8c64d2
24
DShotRMT.cpp
24
DShotRMT.cpp
|
|
@ -141,7 +141,7 @@ uint16_t DShotRMT::getERPM()
|
||||||
return _last_erpm;
|
return _last_erpm;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode the response
|
// Decodes the response
|
||||||
uint16_t new_erpm = _decodeDShotFrame(_rx_symbols);
|
uint16_t new_erpm = _decodeDShotFrame(_rx_symbols);
|
||||||
if (new_erpm != 0)
|
if (new_erpm != 0)
|
||||||
{
|
{
|
||||||
|
|
@ -168,7 +168,7 @@ bool DShotRMT::_initTXChannel()
|
||||||
_tx_channel_config.mem_block_symbols = DSHOT_SYMBOLS_SIZE;
|
_tx_channel_config.mem_block_symbols = DSHOT_SYMBOLS_SIZE;
|
||||||
_tx_channel_config.trans_queue_depth = TX_BUFFER_SIZE;
|
_tx_channel_config.trans_queue_depth = TX_BUFFER_SIZE;
|
||||||
|
|
||||||
//
|
// No loops, real time calculation for each frame
|
||||||
_transmit_config.loop_count = 0;
|
_transmit_config.loop_count = 0;
|
||||||
|
|
||||||
// ...it's a trap
|
// ...it's a trap
|
||||||
|
|
@ -215,14 +215,14 @@ bool DShotRMT::_initDShotEncoder()
|
||||||
// Use RMT to transmit a prepared DShot packet and returns it
|
// Use RMT to transmit a prepared DShot packet and returns it
|
||||||
bool DShotRMT::_sendDShotFrame(const dshot_packet_t &packet)
|
bool DShotRMT::_sendDShotFrame(const dshot_packet_t &packet)
|
||||||
{
|
{
|
||||||
// Exclude calculation from timing is more stable
|
// Excludes calculation from timing is more stable
|
||||||
rmt_symbol_word_t tx_symbols[DSHOT_BITS_PER_FRAME];
|
rmt_symbol_word_t tx_symbols[DSHOT_BITS_PER_FRAME];
|
||||||
_encodeDShotFrame(packet, tx_symbols);
|
_encodeDShotFrame(packet, tx_symbols);
|
||||||
|
|
||||||
// Checking timer signal
|
// Checking timer signal
|
||||||
if (_timer_signal())
|
if (_timer_signal())
|
||||||
{
|
{
|
||||||
// Trigger RMT Transmit
|
// Triggers RMT Transmit
|
||||||
rmt_transmit(_rmt_tx_channel, _dshot_encoder, tx_symbols, DSHOT_SYMBOLS_SIZE, &_transmit_config);
|
rmt_transmit(_rmt_tx_channel, _dshot_encoder, tx_symbols, DSHOT_SYMBOLS_SIZE, &_transmit_config);
|
||||||
|
|
||||||
// Time Stamp
|
// Time Stamp
|
||||||
|
|
@ -238,7 +238,7 @@ uint16_t DShotRMT::_calculateCRC(const dshot_packet_t &packet)
|
||||||
uint16_t data = (packet.throttle_value << 1) | packet.telemetric_request;
|
uint16_t data = (packet.throttle_value << 1) | packet.telemetric_request;
|
||||||
uint16_t crc = (data ^ (data >> 4) ^ (data >> 8)) & 0b0000000000001111;
|
uint16_t crc = (data ^ (data >> 4) ^ (data >> 8)) & 0b0000000000001111;
|
||||||
|
|
||||||
// Invert CRC for bidirectional DShot
|
// Inverts CRC for bidirectional DShot
|
||||||
if (_is_bidirectional)
|
if (_is_bidirectional)
|
||||||
{
|
{
|
||||||
crc = (~crc) & 0b0000000000001111;
|
crc = (~crc) & 0b0000000000001111;
|
||||||
|
|
@ -260,7 +260,7 @@ dshot_packet_t DShotRMT::_buildDShotPacket(const uint16_t value)
|
||||||
// DShot Frame Container
|
// DShot Frame Container
|
||||||
dshot_packet_t packet = {};
|
dshot_packet_t packet = {};
|
||||||
|
|
||||||
// Create DShot packet
|
// Creates DShot packet
|
||||||
packet.throttle_value = value;
|
packet.throttle_value = value;
|
||||||
packet.telemetric_request = 0;
|
packet.telemetric_request = 0;
|
||||||
packet.checksum = _calculateCRC(packet);
|
packet.checksum = _calculateCRC(packet);
|
||||||
|
|
@ -275,10 +275,10 @@ bool IRAM_ATTR DShotRMT::_encodeDShotFrame(const dshot_packet_t &packet, rmt_sym
|
||||||
// Parse actual packet into buffer
|
// Parse actual packet into buffer
|
||||||
_current_packet = _parseDShotPacket(packet);
|
_current_packet = _parseDShotPacket(packet);
|
||||||
|
|
||||||
// Convert the parsed dshot frame to rmt_tx data
|
// Converts the parsed dshot frame to rmt_tx data
|
||||||
for (int i = 0; i < DSHOT_BITS_PER_FRAME; i++)
|
for (int i = 0; i < DSHOT_BITS_PER_FRAME; i++)
|
||||||
{
|
{
|
||||||
// Encode RMT symbols bitwise (MSB first) - tricky
|
// Encoded RMT symbols bitwise (MSB first) - tricky
|
||||||
bool bit = (_current_packet >> (DSHOT_BITS_PER_FRAME - 1 - i)) & 0b0000000000000001;
|
bool bit = (_current_packet >> (DSHOT_BITS_PER_FRAME - 1 - i)) & 0b0000000000000001;
|
||||||
if (_is_bidirectional)
|
if (_is_bidirectional)
|
||||||
{
|
{
|
||||||
|
|
@ -303,25 +303,25 @@ uint16_t DShotRMT::_decodeDShotFrame(const rmt_symbol_word_t *symbols)
|
||||||
{
|
{
|
||||||
uint16_t received_frame = 0;
|
uint16_t received_frame = 0;
|
||||||
|
|
||||||
// Decode each symbol to reconstruct the frame
|
// Decodes each symbol to reconstruct the frame
|
||||||
for (size_t i = 0; i < DSHOT_BITS_PER_FRAME; ++i)
|
for (size_t i = 0; i < DSHOT_BITS_PER_FRAME; ++i)
|
||||||
{
|
{
|
||||||
bool bit = symbols[i].duration0 < symbols[i].duration1;
|
bool bit = symbols[i].duration0 < symbols[i].duration1;
|
||||||
received_frame = (received_frame << 1) | bit;
|
received_frame = (received_frame << 1) | bit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract payload and CRC
|
// Extracts payload and CRC
|
||||||
uint16_t data = received_frame >> 4;
|
uint16_t data = received_frame >> 4;
|
||||||
uint16_t received_crc = received_frame & 0b0000000000001111;
|
uint16_t received_crc = received_frame & 0b0000000000001111;
|
||||||
|
|
||||||
// Calculate CRC for received frame
|
// Calculates CRC for received frame
|
||||||
uint16_t calculated_crc = (data ^ (data >> 4) ^ (data >> 8)) & 0b0000000000001111;
|
uint16_t calculated_crc = (data ^ (data >> 4) ^ (data >> 8)) & 0b0000000000001111;
|
||||||
if (_is_bidirectional)
|
if (_is_bidirectional)
|
||||||
{
|
{
|
||||||
calculated_crc = (~calculated_crc) & 0b0000000000001111;
|
calculated_crc = (~calculated_crc) & 0b0000000000001111;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compare CRC
|
// Compares CRC
|
||||||
if (received_crc != calculated_crc)
|
if (received_crc != calculated_crc)
|
||||||
{
|
{
|
||||||
Serial.println(DSHOT_MSG_04);
|
Serial.println(DSHOT_MSG_04);
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ private:
|
||||||
dshot_packet_t _packet;
|
dshot_packet_t _packet;
|
||||||
unsigned long _last_transmission_time;
|
unsigned long _last_transmission_time;
|
||||||
|
|
||||||
//
|
// ---Helpers ---
|
||||||
bool _initTXChannel();
|
bool _initTXChannel();
|
||||||
bool _initRXChannel();
|
bool _initRXChannel();
|
||||||
bool _initDShotEncoder();
|
bool _initDShotEncoder();
|
||||||
|
|
@ -134,10 +134,11 @@ private:
|
||||||
bool IRAM_ATTR _encodeDShotFrame(const dshot_packet_t &packet, rmt_symbol_word_t *symbols);
|
bool IRAM_ATTR _encodeDShotFrame(const dshot_packet_t &packet, rmt_symbol_word_t *symbols);
|
||||||
uint16_t _decodeDShotFrame(const rmt_symbol_word_t *symbols);
|
uint16_t _decodeDShotFrame(const rmt_symbol_word_t *symbols);
|
||||||
|
|
||||||
|
// --- Simple Timer ---
|
||||||
bool _timer_signal();
|
bool _timer_signal();
|
||||||
bool _timer_reset();
|
bool _timer_reset();
|
||||||
|
|
||||||
// Error Handling
|
// --- Error Handling ---
|
||||||
static constexpr bool DSHOT_OK = 0;
|
static constexpr bool DSHOT_OK = 0;
|
||||||
static constexpr bool DSHOT_ERROR = 1;
|
static constexpr bool DSHOT_ERROR = 1;
|
||||||
static constexpr char *DSHOT_MSG_01 = "Failed to initialize TX channel!";
|
static constexpr char *DSHOT_MSG_01 = "Failed to initialize TX channel!";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue