From 0e77a050393205dc02729b5511341d33d8ffa459 Mon Sep 17 00:00:00 2001 From: Wastl Kraus Date: Mon, 8 Sep 2025 14:40:32 +0200 Subject: [PATCH] ...update result --- DShotRMT.cpp | 70 ++++++++++++++++++++++++++-------------------------- DShotRMT.h | 6 +++-- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/DShotRMT.cpp b/DShotRMT.cpp index d164016..8abc326 100644 --- a/DShotRMT.cpp +++ b/DShotRMT.cpp @@ -44,7 +44,7 @@ DShotRMT::DShotRMT(gpio_num_t gpio, dshot_mode_t mode, bool is_bidirectional) _result{false, UNKNOWN_ERROR} { // Calculate frame timing including switch/pause time - _frame_timer_us = _timing_config.frame_length_us + DSHOT_SWITCH_TIME; + _frame_timer_us = _timing_config.frame_length_us + DSHOT_PAUSE_US; // Double frame time for bidirectional mode (includes response time) if (_is_bidirectional) @@ -130,8 +130,7 @@ dshot_result_t DShotRMT::begin() // Init RMT TX channel dshot_result_t DShotRMT::_initTXChannel() { - // Result container - dshot_result_t result = {false, TX_INIT_FAILED}; + _result = {false, TX_INIT_FAILED}; // Configure TX channel _tx_channel_config.gpio_num = _gpio; @@ -147,26 +146,25 @@ dshot_result_t DShotRMT::_initTXChannel() // Create RMT TX channel if (rmt_new_tx_channel(&_tx_channel_config, &_rmt_tx_channel) != DSHOT_OK) { - return result; + return _result; } // if (rmt_enable(_rmt_tx_channel) != DSHOT_OK) { - return result; + return _result; } - result.success = true; - result.msg = TX_INIT_SUCCESS; + _result.success = true; + _result.msg = TX_INIT_SUCCESS; - return result; + return _result; } // Init RMT RX channel dshot_result_t DShotRMT::_initRXChannel() { - // Result container - dshot_result_t result = {false, RX_INIT_FAILED}; + _result = {false, RX_INIT_FAILED}; // Direct RMT symbol processing - Performance optimized _rx_event_callbacks.on_recv_done = _rmt_rx_done_callback; @@ -184,19 +182,19 @@ dshot_result_t DShotRMT::_initRXChannel() // Create RMT RX channel if (rmt_new_rx_channel(&_rx_channel_config, &_rmt_rx_channel) != DSHOT_OK) { - return result; + return _result; } // if (rmt_enable(_rmt_rx_channel) != DSHOT_OK) { - return result; + return _result; } - result.success = true; - result.msg = RX_INIT_SUCCESS; + _result.success = true; + _result.msg = RX_INIT_SUCCESS; - return result; + return _result; } // Callback for RMT RX @@ -226,6 +224,8 @@ bool IRAM_ATTR DShotRMT::_rmt_rx_done_callback(rmt_channel_handle_t rmt_rx_chann // Initialize DShot encoder dshot_result_t DShotRMT::_initDShotEncoder() { + _result = {false, ENCODER_INIT_FAILED}; + // Create copy encoder configuration rmt_copy_encoder_config_t encoder_config = {}; @@ -355,12 +355,12 @@ uint16_t DShotRMT::_parseDShotPacket(const dshot_packet_t &packet) uint16_t DShotRMT::_calculateCRC(const uint16_t data) { // DShot CRC - uint16_t crc = (data ^ (data >> 4) ^ (data >> 8)) & 0b0000000000001111; + uint16_t crc = (data ^ (data >> 4) ^ (data >> 8)) & DSHOT_CRC_MASK; // Invert CRC for bidirectional DShot mode if (_is_bidirectional) { - crc = (~crc) & 0b0000000000001111; + crc = (~crc) & DSHOT_CRC_MASK; } return crc; @@ -378,13 +378,13 @@ void DShotRMT::_preCalculateBitPositions() // Transmit DShot packet via RMT dshot_result_t DShotRMT::_sendDShotFrame(const dshot_packet_t &packet) { - dshot_result_t result = {false, UNKNOWN_ERROR}; - + _result = {false, UNKNOWN_ERROR}; + // Check timing requirements if (!_timer_signal()) { - result.msg = TIMING_CORRECTION; - return result; + _result.msg = TIMING_CORRECTION; + return _result; } // Enable RMT RX before RMT TX @@ -395,8 +395,8 @@ dshot_result_t DShotRMT::_sendDShotFrame(const dshot_packet_t &packet) if (rmt_receive(_rmt_rx_channel, rx_symbols, sizeof(rx_symbols), &_receive_config) != DSHOT_OK) { - result.msg = RECEIVER_FAILED; - return result; + _result.msg = RECEIVER_FAILED; + return _result; } } @@ -415,16 +415,16 @@ dshot_result_t DShotRMT::_sendDShotFrame(const dshot_packet_t &packet) // Disable RMT RX for sending if (rmt_disable(_rmt_rx_channel) != DSHOT_OK) { - result.msg = RECEIVER_FAILED; - return result; + _result.msg = RECEIVER_FAILED; + return _result; } } // Perform RMT transmission if (rmt_transmit(_rmt_tx_channel, _dshot_encoder, tx_symbols, tx_size_bytes, &_transmit_config) != DSHOT_OK) { - result.msg = TRANSMISSION_FAILED; - return result; + _result.msg = TRANSMISSION_FAILED; + return _result; } // Re-enable RMT RX @@ -432,18 +432,18 @@ dshot_result_t DShotRMT::_sendDShotFrame(const dshot_packet_t &packet) { if (rmt_enable(_rmt_rx_channel) != DSHOT_OK) { - result.msg = RECEIVER_FAILED; - return result; + _result.msg = RECEIVER_FAILED; + return _result; } } // Update timestamp and calculate execution time _timer_reset(); - result.success = true; - result.msg = TRANSMISSION_SUCCESS; + _result.success = true; + _result.msg = TRANSMISSION_SUCCESS; - return result; + return _result; } // Encode DShot packet into RMT symbol format (placed in IRAM for performance) @@ -486,13 +486,13 @@ uint16_t DShotRMT::_decodeDShotFrame(const rmt_symbol_word_t *symbols) // Extract 16 data bits and 4 CRC bits from 20-bit frame. // The first bit of the GCR frame is a start bit and is discarded. - uint16_t data_and_crc = (decoded_frame & 0xFFFF); + uint16_t data_and_crc = (decoded_frame & DSHOT_FULL_PACKET); // Cutting 4 bits? uint16_t received_data = data_and_crc >> 4; // Masking CRC - uint16_t received_crc = data_and_crc & 0b0000000000001111; + uint16_t received_crc = data_and_crc & DSHOT_CRC_MASK; // Telemetry request bit is always 1. if (!(received_data & (1 << 11))) @@ -511,7 +511,7 @@ uint16_t DShotRMT::_decodeDShotFrame(const rmt_symbol_word_t *symbols) } // Return the eRPM value (first 11 bits of received data). - return received_data & 0b0000011111111111; + return received_data & DSHOT_THROTTLE_MAX; } // Check if enough time has passed for next transmission diff --git a/DShotRMT.h b/DShotRMT.h index 7c14853..81651d3 100644 --- a/DShotRMT.h +++ b/DShotRMT.h @@ -19,8 +19,10 @@ static constexpr auto DSHOT_THROTTLE_FAILSAFE = 0; static constexpr auto DSHOT_THROTTLE_MIN = 48; static constexpr auto DSHOT_THROTTLE_MAX = 2047; static constexpr auto DSHOT_BITS_PER_FRAME = 16; -static constexpr auto DSHOT_SWITCH_TIME = 30; // Additional time in us for bidir switching +static constexpr auto DSHOT_PAUSE_US = 30; // Additional frame pause time static constexpr auto DSHOT_NULL_PACKET = 0b0000000000000000; +static constexpr auto DSHOT_FULL_PACKET = 0b1111111111111111; +static constexpr auto DSHOT_CRC_MASK = 0b0000000000001111; static constexpr auto DSHOT_RX_TIMEOUT_MS = 2; // Never reached, just a timeeout static constexpr auto GCR_BITS_PER_FRAME = 21; // Number of GCR bits in a DShot answer frame (1 start + 16 data + 4 CRC) static constexpr auto DEFAULT_MOTOR_MAGNET_COUNT = 14; @@ -30,7 +32,7 @@ static constexpr auto NO_DSHOT_ERPM = 0; static constexpr auto NO_DSHOT_RPM = 0; // RMT Configuration Constants -constexpr auto DSHOT_CLOCK_SRC_DEFAULT = RMT_CLK_SRC_DEFAULT; +constexpr auto DSHOT_CLOCK_SRC_DEFAULT = RMT_CLK_SRC_APB; constexpr auto DSHOT_RMT_RESOLUTION = 10 * 1000 * 1000; // 10 MHz resolution constexpr auto RMT_BUFFER_SIZE = DSHOT_BITS_PER_FRAME; constexpr auto RMT_BUFFER_SYMBOLS = 64;