From 47f224055bad358921eb2c03ff8a99bafb651365 Mon Sep 17 00:00:00 2001 From: Robert Schauklies Date: Sun, 25 Jan 2026 00:36:07 +0100 Subject: [PATCH] adds cell for fetching the RPM --- spinnyboy_rust/src/bin/dc_driver/dshot.rs | 23 +++++++++++++++++------ spinnyboy_rust/src/bin/main.rs | 4 ++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/spinnyboy_rust/src/bin/dc_driver/dshot.rs b/spinnyboy_rust/src/bin/dc_driver/dshot.rs index b6a2f42..558d6bf 100644 --- a/spinnyboy_rust/src/bin/dc_driver/dshot.rs +++ b/spinnyboy_rust/src/bin/dc_driver/dshot.rs @@ -4,7 +4,7 @@ use esp_hal::{ gpio::Level, rmt::{Channel, PulseCode, SingleShotTxTransaction}, }; -use core::{cell::{Ref, RefCell}, ops::Index}; +use core::{cell::{self, Cell, Ref, RefCell}, ops::Index}; use num_traits::float::FloatCore; use rtt_target::{rprint, rprintln}; @@ -12,6 +12,10 @@ fn calculate_crc(frame: u16) -> u16 { (0xffff ^ (frame ^ (frame >> 4) ^ (frame >> 8))) & 0xF } +/*https://de.aliexpress.com/item/1005009484033753.html?spm=a2g0o.productlist.main.2.6389651cV8lVw8&algo_pvid=9cfe024b-8aff-49ea-981b-824f392de976&algo_exp_id=9cfe024b-8aff-49ea-981b-824f392de976-1&pdp_ext_f=%7B%22order%22%3A%2232%22%2C%22eval%22%3A%221%22%2C%22fromPage%22%3A%22search%22%7D&pdp_npi=6%40dis%21EUR%2111.99%2111.99%21%21%2113.55%2113.55%21%40211b813b17620408595223963e91a7%2112000049243823801%21sea%21DE%212739924950%21X%211%210%21n_tag%3A-29919%3Bd%3Abce7cd6%3Bm03_new_user%3A-29895&curPageLogUid=GNUFzsTU8oDr&utparam-url=scene%3Asearch%7Cquery_from%3A%7Cx_object_id%3A1005009484033753%7C_p_origin_prod%3A +IFlight XING-E Pro 2207 2750KV +*/ +const XING_EPRO_22_COILS: u32 = 12; #[allow(dead_code)] #[allow(non_camel_case_types)] @@ -196,7 +200,7 @@ pub struct DShot<'a> { rx_channel: RefCell<&'a mut Channel<'static, esp_hal::Blocking, esp_hal::rmt::Rx>>, speed: DShotSpeed, bit_ticks: BitTicks, - + rpm: Cell>, pulses: RefCell<[u32; 17]>, requested_throttle: RefCell, current_tx: RefCell>>, @@ -215,20 +219,25 @@ impl<'a> DShot<'a> { let clk_speed = clk_speed.unwrap_or(80_000_000); let clk_divider = clk_divider.unwrap_or(1); let bit_ticks = BitTicks::from_clk(clk_speed, clk_divider, speed); - + let cell = Cell::new(None); let txc = tx_channel.reborrow().transmit(&[0u32]).unwrap(); Self { rx_channel: RefCell::new(rx_channel), speed, bit_ticks, - + rpm: cell, pulses: RefCell::new([0u32; 17]), requested_throttle: RefCell::new(0), current_tx: RefCell::new(Some(txc)), current_tx_done_at: RefCell::new(None), } } - + fn set_rpm(&self,new_rpm:u32){ + self.rpm.set(Some(new_rpm)); + } + pub fn get_rpm(&self) -> Option { + self.rpm.get() + } pub fn create_frame(value: u16, telemetry: bool) -> u16 { // Mask to 11 bits (0-2047 range) and set telemetry bit let frame = ((value & 0x07FF) << 1) | telemetry as u16; @@ -301,7 +310,9 @@ impl<'a> DShot<'a> { // Fucking got it. let exp = data >> 9; let mantissa = data & 0b111111111; - let rpm = mantissa << exp; + let mut rpm: u32 = (mantissa << exp).into(); + rpm = (rpm*1000); + rprintln!("RPM: {}", rpm); } } diff --git a/spinnyboy_rust/src/bin/main.rs b/spinnyboy_rust/src/bin/main.rs index 6c043f1..b2fa9d9 100644 --- a/spinnyboy_rust/src/bin/main.rs +++ b/spinnyboy_rust/src/bin/main.rs @@ -100,6 +100,10 @@ fn main() -> ! { loop { dshot_esc.process(); dshot_esc.set_throttle(150); + match dshot_esc.get_rpm() { + Some(x) => {rprintln!("GOT RPM {}",x)}, + None => {rprintln!("NO RPM!")} + } } // rprintln!("RMT SENT!");