...cosmetics and prepare for bidirectional dshot

This commit is contained in:
Wastl Kraus 2021-07-04 14:01:10 +02:00
parent 9cfbbb2f6f
commit a507871cbd
3 changed files with 39 additions and 34 deletions

View File

@ -1,30 +1,31 @@
#pragma once #pragma once
// source: https://github.com/bitdump/BLHeli/blob/master/BLHeli_S%20SiLabs/Dshotprog%20spec%20BLHeli_S.txt // Source: https://github.com/bitdump/BLHeli/blob/master/BLHeli_S%20SiLabs/Dshotprog%20spec%20BLHeli_S.txt
// Date: 04.07.2021
enum dshot_cmd_t { enum dshot_cmd_t {
DIGITAL_CMD_MOTOR_STOP, // Currently not implemented DSHOT_CMD_MOTOR_STOP, // Currently not implemented - STOP Motors
DIGITAL_CMD_BEEP1, // Wait at least length of beep (380ms) before next command DSHOT_CMD_BEEP1, // Wait at least length of beep (380ms) before next command
DIGITAL_CMD_BEEP2, // Wait at least length of beep (380ms) before next command DSHOT_CMD_BEEP2, // Wait at least length of beep (380ms) before next command
DIGITAL_CMD_BEEP3, // Wait at least length of beep (400ms) before next command DSHOT_CMD_BEEP3, // Wait at least length of beep (400ms) before next command
DIGITAL_CMD_BEEP4, // Wait at least length of beep (400ms) before next command DSHOT_CMD_BEEP4, // Wait at least length of beep (400ms) before next command
DIGITAL_CMD_BEEP5, // Wait at least length of beep (400ms) before next command DSHOT_CMD_BEEP5, // Wait at least length of beep (400ms) before next command
DIGITAL_CMD_ESC_INFO, // Wait at least 12ms before next command DSHOT_CMD_ESC_INFO, // Currently not implemented
DIGITAL_CMD_SPIN_DIRECTION_1, // Currently not implemented DSHOT_CMD_SPIN_DIRECTION_1, // Need 6x, no wait required
DIGITAL_CMD_SPIN_DIRECTION_2, // Need 6x, no wait required DSHOT_CMD_SPIN_DIRECTION_2, // Need 6x, no wait required
DIGITAL_CMD_3D_MODE_OFF, // Need 6x, no wait required DSHOT_CMD_3D_MODE_OFF, // Need 6x, no wait required
DIGITAL_CMD_3D_MODE_ON, // Need 6x, no wait required DSHOT_CMD_3D_MODE_ON, // Need 6x, no wait required
DIGITAL_CMD_SETTINGS_REQUEST, // Currently not implemented DSHOT_CMD_SETTINGS_REQUEST, // Currently not implemented
DIGITAL_CMD_SAVE_SETTINGS, // Need 6x, wait at least 12ms before next command DSHOT_CMD_SAVE_SETTINGS, // Need 6x, wait at least 12ms before next command
DIGITAL_CMD_SPIN_DIRECTION_NORMAL = 20, // Need 6x, no wait required DSHOT_CMD_SPIN_DIRECTION_NORMAL, // Need 6x, no wait required
DIGITAL_CMD_SPIN_DIRECTION_REVERSED, // Need 6x, no wait required DSHOT_CMD_SPIN_DIRECTION_REVERSED, // Need 6x, no wait required
DIGITAL_CMD_LED0_ON, // No wait required DSHOT_CMD_LED0_ON, // Currently not implemented
DIGITAL_CMD_LED1_ON, // No wait required DSHOT_CMD_LED1_ON, // Currently not implemented
DIGITAL_CMD_LED2_ON, // No wait required DSHOT_CMD_LED2_ON, // Currently not implemented
DIGITAL_CMD_LED3_ON, // No wait required DSHOT_CMD_LED3_ON, // Currently not implemented
DIGITAL_CMD_LED0_OFF, // No wait required DSHOT_CMD_LED0_OFF, // Currently not implemented
DIGITAL_CMD_LED1_OFF, // No wait required DSHOT_CMD_LED1_OFF, // Currently not implemented
DIGITAL_CMD_LED2_OFF, // No wait required DSHOT_CMD_LED2_OFF, // Currently not implemented
DIGITAL_CMD_LED3_OFF, // No wait required DSHOT_CMD_LED3_OFF, // Currently not implemented
DSHOT_CMD_MAX = 47 DSHOT_CMD_MAX = 47
}; };

View File

@ -4,10 +4,11 @@
// Author: derdoktor667 // Author: derdoktor667
// //
#include <Arduino.h>
#include "DShotRMT.h" #include "DShotRMT.h"
DShotRMT* DShotFirst = nullptr;
DShotRMT* DShotNext = nullptr;
DShotRMT::DShotRMT(gpio_num_t gpio, rmt_channel_t rmtChannel) { DShotRMT::DShotRMT(gpio_num_t gpio, rmt_channel_t rmtChannel) {
dshot_config.gpio_num = gpio; dshot_config.gpio_num = gpio;
dshot_config.pin_num = uint8_t(gpio); dshot_config.pin_num = uint8_t(gpio);
@ -44,7 +45,7 @@ bool DShotRMT::begin(dshot_mode_t dshot_mode, bool is_bidirectional) {
dshot_config.mode = dshot_mode; dshot_config.mode = dshot_mode;
dshot_config.clk_div = DSHOT_CLK_DIVIDER; dshot_config.clk_div = DSHOT_CLK_DIVIDER;
dshot_config.name_str = dshot_mode_name[dshot_mode]; dshot_config.name_str = dshot_mode_name[dshot_mode];
dshot_config.is_inverted = is_bidirectional; dshot_config.bidirectional = is_bidirectional;
switch (dshot_config.mode) { switch (dshot_config.mode) {
case DSHOT150: case DSHOT150:
@ -119,7 +120,7 @@ void DShotRMT::send_dshot_value(uint16_t throttle_value, telemetric_request_t te
throttle_value = DSHOT_THROTTLE_MAX; throttle_value = DSHOT_THROTTLE_MAX;
} }
if (dshot_config.is_inverted) { if (dshot_config.bidirectional) {
// ...implement bidirectional mode // ...implement bidirectional mode
@ -132,12 +133,14 @@ void DShotRMT::send_dshot_value(uint16_t throttle_value, telemetric_request_t te
} }
} }
// ...get all setup data about current mode
dshot_config_t* DShotRMT::get_dshot_info() { dshot_config_t* DShotRMT::get_dshot_info() {
return &dshot_config; return &dshot_config;
} }
uint8_t DShotRMT::get_dshot_clock_div() { // ...get the ABP_Clock Divider for further calculations
return dshot_config.clk_div; uint8_t* DShotRMT::get_dshot_clock_div() {
return &dshot_config.clk_div;
} }
rmt_item32_t* DShotRMT::encode_dshot_to_rmt(uint16_t parsed_packet) { rmt_item32_t* DShotRMT::encode_dshot_to_rmt(uint16_t parsed_packet) {
@ -173,7 +176,7 @@ uint16_t DShotRMT::calc_dshot_chksum(const dshot_packet_t& dshot_packet) {
uint16_t packet = DSHOT_NULL_PACKET; uint16_t packet = DSHOT_NULL_PACKET;
uint16_t chksum = DSHOT_NULL_PACKET; uint16_t chksum = DSHOT_NULL_PACKET;
if (dshot_config.is_inverted) { if (dshot_config.bidirectional) {
// ...implement bidirectional mode // ...implement bidirectional mode

View File

@ -21,7 +21,7 @@ constexpr auto DSHOT_THROTTLE_MIN = 48;
constexpr auto DSHOT_THROTTLE_MAX = 2047; constexpr auto DSHOT_THROTTLE_MAX = 2047;
constexpr auto DSHOT_NULL_PACKET = 0b0000000000000000; constexpr auto DSHOT_NULL_PACKET = 0b0000000000000000;
constexpr auto DSHOT_PAUSE = 65; // ...21bit is recommended constexpr auto DSHOT_PAUSE = DSHOT_PACKET_LENGTH * DSHOT_CLK_DIVIDER; // ...21bit is recommended, but to be sure
constexpr auto DSHOT_PAUSE_BIDIRECTIONAL = DSHOT_PAUSE; constexpr auto DSHOT_PAUSE_BIDIRECTIONAL = DSHOT_PAUSE;
constexpr auto DSHOT_PAUSE_BIT = 16; constexpr auto DSHOT_PAUSE_BIT = 16;
@ -37,6 +37,7 @@ typedef enum dshot_mode_e {
DSHOT1200 DSHOT1200
} dshot_mode_t; } dshot_mode_t;
// ...to get human readable DShot Mode
static const char* const dshot_mode_name[] = { static const char* const dshot_mode_name[] = {
"DSHOT_OFF", "DSHOT_OFF",
"DSHOT150", "DSHOT150",
@ -61,7 +62,7 @@ typedef struct dshot_packet_s {
typedef struct dshot_config_s { typedef struct dshot_config_s {
dshot_mode_t mode; dshot_mode_t mode;
dshot_name_t name_str; dshot_name_t name_str;
bool is_inverted; bool bidirectional;
gpio_num_t gpio_num; gpio_num_t gpio_num;
uint8_t pin_num; uint8_t pin_num;
rmt_channel_t rmt_channel; rmt_channel_t rmt_channel;
@ -86,7 +87,7 @@ class DShotRMT {
void send_dshot_value(uint16_t throttle_value, telemetric_request_t telemetric_request = NO_TELEMETRIC); void send_dshot_value(uint16_t throttle_value, telemetric_request_t telemetric_request = NO_TELEMETRIC);
dshot_config_t* get_dshot_info(); dshot_config_t* get_dshot_info();
uint8_t get_dshot_clock_div(); uint8_t* get_dshot_clock_div();
private: private:
rmt_item32_t dshot_rmt_item[DSHOT_PACKET_LENGTH] = { }; rmt_item32_t dshot_rmt_item[DSHOT_PACKET_LENGTH] = { };