Skip to content

Commit 5a325f9

Browse files
Merge branch 'main' into hyacinth-range-test
2 parents da4d12c + 56f0cb7 commit 5a325f9

6 files changed

Lines changed: 90 additions & 58 deletions

File tree

firmwares/flight_computer/src/bin/rocket.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,27 @@ async fn main(low_priority_spawner: Spawner) -> ! {
7171

7272
let (can1_tx, can1_rx) = ((), ());
7373
let (can2_tx, can2_rx) = ((), ());
74-
// let (usb_downlink, usb_uplink) = ((), ());
74+
#[cfg(feature = "usb")]
7575
let (usb_downlink, usb_uplink) = fw::usb::start(board.usb_driver, low_priority_spawner);
76+
7677
let (eth_downlink, eth_uplink) = fw::ethernet::start(board.ethernet, low_priority_spawner, seed);
7778

78-
fw::recovery::start_recovery_task(load_outputs, high_priority_spawner, &MAIN_RECOVERY_SIG, &PARABREAKS_SIG).await;
79+
fw::recovery::start_recovery_task(
80+
settings.main_output_settings.clone(),
81+
load_outputs,
82+
high_priority_spawner,
83+
&MAIN_RECOVERY_SIG,
84+
&PARABREAKS_SIG,
85+
)
86+
.await;
7987

8088
let vehicle = Vehicle::init(
8189
board.sensors,
8290
board.outputs.leds,
8391
load_outputs,
8492
(can1_tx, can1_rx),
8593
(can2_tx, can2_rx),
94+
#[cfg(feature = "usb")]
8695
(usb_downlink, usb_uplink),
8796
(eth_downlink, eth_uplink),
8897
(lora_downlink, lora_uplink),

firmwares/flight_computer/src/buzzer.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,8 @@ pub async fn run(mut pwm: SimplePwm<'static, embassy_stm32::peripherals::TIM2>,
340340
FlightMode::RecoveryDrogue | FlightMode::RecoveryMain => Some(&SHORT_WARNING_MELODY),
341341
FlightMode::HardwareArmed => Some(&HWARMED),
342342
FlightMode::Armed | FlightMode::ArmedLaunchImminent => Some(&ARMED),
343-
FlightMode::Landed => Some(&LANDED),
343+
// FlightMode::Landed =>#[cfg(feature = "std")] Some(&LANDED),
344+
FlightMode::Idle => Some(&IDLE_AGAIN),
344345
_ => None,
345346
};
346347
}

firmwares/flight_computer/src/recovery.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,27 @@ use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
66
use embassy_sync::channel::{Channel, Receiver, Sender};
77
use embassy_sync::signal::Signal;
88
use embassy_time::{Duration, Timer};
9-
use shared_types::FlightMode;
9+
use shared_types::{FlightMode, settings::RecoveryOutputSettings};
1010

1111
pub static MAIN_RECOVERY_SIG: Signal<CriticalSectionRawMutex, bool> = Signal::new();
1212
pub static PARABREAKS_SIG: Signal<CriticalSectionRawMutex, bool> = Signal::new();
1313

1414
pub async fn start_recovery_task(
15+
main_output_settings: RecoveryOutputSettings,
1516
load_outputs: &'static Mutex<CriticalSectionRawMutex, LoadOutputs>,
1617
spawner: SendSpawner,
1718
main_recovery_sig: &'static Signal<CriticalSectionRawMutex, bool>,
1819
parabreaks_sig: &'static Signal<CriticalSectionRawMutex, bool>,
1920
) {
20-
spawner.spawn(run_main_recovery(load_outputs, main_recovery_sig)).unwrap();
21+
spawner.spawn(run_main_recovery(main_output_settings, load_outputs, main_recovery_sig)).unwrap();
2122
spawner.spawn(run_parabreaks(load_outputs, parabreaks_sig)).unwrap();
2223
}
2324
// TODO: add settings
2425

2526
// TODO: check timings, add timings in settings
2627
#[embassy_executor::task]
2728
async fn run_main_recovery(
29+
settings: RecoveryOutputSettings,
2830
load_outputs: &'static Mutex<CriticalSectionRawMutex, LoadOutputs>,
2931
main_recovery_sig: &'static Signal<CriticalSectionRawMutex, bool>,
3032
) {
@@ -34,23 +36,22 @@ async fn run_main_recovery(
3436
continue;
3537
}
3638

37-
// TODO: think if should arm here
38-
unsafe {
39-
load_outputs.lock_mut(|o| o.arm());
40-
}
41-
for _ in 0..3 {
39+
Timer::after(Duration::from_millis(settings.forewarning_duration.into())).await;
40+
41+
// Check armed status
42+
for _ in 0..settings.num_pulses {
4243
unsafe {
4344
load_outputs.lock_mut(|o| o.activate(LoadOutput::Out1));
4445
}
4546
defmt::info!("Main recovery motor active.");
4647

47-
Timer::after(Duration::from_millis(500)).await;
48+
Timer::after(Duration::from_millis(settings.pulse_high_duration.into())).await;
4849
unsafe {
4950
load_outputs.lock_mut(|o| o.deactivate(LoadOutput::Out1));
5051
}
5152
defmt::info!("Main recovery motor stop.");
5253

53-
Timer::after(Duration::from_millis(500)).await;
54+
Timer::after(Duration::from_millis(settings.pause_duration.into())).await;
5455
}
5556
}
5657
}

firmwares/flight_computer/src/vehicle.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub struct Vehicle {
5757

5858
can1: ((), ()),
5959
can2: ((), ()),
60-
60+
#[cfg(feature = "usb")]
6161
usb: (
6262
Sender<'static, CriticalSectionRawMutex, DownlinkMessage, 3>,
6363
Receiver<'static, CriticalSectionRawMutex, UplinkMessage, 3>,
@@ -105,7 +105,7 @@ impl Vehicle {
105105
load_outputs: &'static Mutex<CriticalSectionRawMutex, LoadOutputs>,
106106
can1: ((), ()),
107107
can2: ((), ()),
108-
usb: (
108+
#[cfg(feature = "usb")] usb: (
109109
Sender<'static, CriticalSectionRawMutex, DownlinkMessage, 3>,
110110
Receiver<'static, CriticalSectionRawMutex, UplinkMessage, 3>,
111111
),
@@ -151,6 +151,7 @@ impl Vehicle {
151151

152152
can1,
153153
can2,
154+
#[cfg(feature = "usb")]
154155
usb,
155156
eth,
156157
lora,
@@ -267,8 +268,9 @@ impl Vehicle {
267268
info!("UplinkMessage: ReadSettings");
268269
// let _ = self.usb.0.try_send(DownlinkMessage::Settings(self.settings.clone()));
269270
let _ = self.eth.0.try_send(DownlinkMessage::Settings(self.settings.clone()));
270-
// FIXME: remember to re-enable
271-
// let _ = self.lora.0.try_send(DownlinkMessage::Settings(self.settings.clone()));
271+
272+
// FIXME: tried re-enabling, but did not work
273+
let _ = self.lora.0.try_send(DownlinkMessage::Settings(self.settings.clone()));
272274
}
273275
UplinkMessage::WriteSettings(settings) => {
274276
info!("UplinkMessage: WriteSettings");
@@ -312,6 +314,7 @@ impl Vehicle {
312314
// Send telemetry via Usb
313315

314316
if let Some(msg) = usb_msg {
317+
#[cfg(feature = "usb")]
315318
let _res = self.usb.0.try_send(msg);
316319
// match res {
317320
// Ok(_) => defmt::info!("usb telemetry send successful"),
@@ -327,9 +330,10 @@ impl Vehicle {
327330
// Store data in flash
328331
self.flash.tick().await;
329332
if self.mode >= FlightMode::ArmedLaunchImminent {
330-
if let Some(msg) = flash_msg {
331-
let _ = self.flash.write_message(msg);
332-
}
333+
// FIXME: the impl has a bug
334+
// if let Some(msg) = flash_msg {
335+
// let _ = self.flash.write_message(msg);
336+
// }
333337
}
334338

335339
//// Broadcast telemetry to payloads
@@ -343,14 +347,19 @@ impl Vehicle {
343347

344348
// We are going to or beyond Armed, switch to max tx power and arm ACS
345349
if new_mode >= FlightMode::Armed && self.mode < FlightMode::Armed {
350+
// TODO: lora max power
346351
//self.radio.set_max_transmit_power();
347-
// TODO:
352+
// TODO: think about arm AND de-arm
353+
unsafe {
354+
self.load_outputs.lock_mut(|o| o.arm());
355+
}
356+
info!("Arming Recovery");
348357
}
349358
// TODO:: move maybe
350-
if self.mode == FlightMode::RecoveryDrogue {
359+
if new_mode == FlightMode::RecoveryDrogue {
351360
self.parabreaks_sig.signal(true);
352361
}
353-
if self.mode == FlightMode::RecoveryMain {
362+
if new_mode == FlightMode::RecoveryMain {
354363
self.main_recovery_sig.signal(true);
355364
}
356365

gui/src/widgets/fc_settings.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -362,15 +362,15 @@ impl FcSettingsUiExt for Settings {
362362
"pulses of"
363363
});
364364
ui.add(
365-
DragValue::new(&mut self.drogue_output_settings.output_high_time)
365+
DragValue::new(&mut self.drogue_output_settings.pulse_high_duration)
366366
.suffix(" ms")
367367
.speed(1)
368-
.range(0..=10000),
368+
.range(0..=100000),
369369
);
370370
if self.drogue_output_settings.num_pulses > 1 {
371371
ui.weak("with");
372372
ui.add(
373-
DragValue::new(&mut self.drogue_output_settings.output_low_time)
373+
DragValue::new(&mut self.drogue_output_settings.pause_duration)
374374
.suffix(" ms")
375375
.speed(1)
376376
.range(0..=10000),
@@ -380,7 +380,7 @@ impl FcSettingsUiExt for Settings {
380380
ui.weak("after");
381381
}
382382
ui.add(
383-
DragValue::new(&mut self.drogue_output_settings.output_warning_time)
383+
DragValue::new(&mut self.drogue_output_settings.forewarning_duration)
384384
.suffix(" ms")
385385
.speed(1)
386386
.range(0..=10000),
@@ -405,15 +405,15 @@ impl FcSettingsUiExt for Settings {
405405
"pulses of"
406406
});
407407
ui.add(
408-
DragValue::new(&mut self.main_output_settings.output_high_time)
408+
DragValue::new(&mut self.main_output_settings.pulse_high_duration)
409409
.suffix(" ms")
410410
.speed(1)
411411
.range(0..=10000),
412412
);
413413
if self.main_output_settings.num_pulses > 1 {
414414
ui.weak("with");
415415
ui.add(
416-
DragValue::new(&mut self.main_output_settings.output_low_time)
416+
DragValue::new(&mut self.main_output_settings.pause_duration)
417417
.suffix(" ms")
418418
.speed(1)
419419
.range(0..=10000),
@@ -423,7 +423,7 @@ impl FcSettingsUiExt for Settings {
423423
ui.weak("after");
424424
}
425425
ui.add(
426-
DragValue::new(&mut self.main_output_settings.output_warning_time)
426+
DragValue::new(&mut self.main_output_settings.forewarning_duration)
427427
.suffix(" ms")
428428
.speed(1)
429429
.range(0..=10000),

shared_types/src/settings.rs

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -154,41 +154,64 @@ pub enum Orientation {
154154

155155
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
156156
pub struct RecoveryOutputSettings {
157-
/// time to enable recovery outputs (after warning tone, ms)
158-
pub output_high_time: u32,
159-
/// time delay between recovery output pulses (ms)
160-
pub output_low_time: u32,
157+
/// Duration for each pulse.
158+
pub pulse_high_duration: u32,
159+
/// Time delay between recovery output pulses (ms)
160+
pub pause_duration: u32,
161161
/// number of recovery output pulses
162162
pub num_pulses: u32,
163163
// TODO: unused for actual sound duration
164-
/// duration of warning tone to play before enabling outputs (ms)
165-
pub output_warning_time: u32,
164+
/// Duration of warning tone to play before enabling outputs (ms)
165+
pub forewarning_duration: u32,
166166
/// Warning sound frequency
167167
pub output_warning_frequency: f32,
168168
}
169169

170+
// FIXME: fix/remove this
170171
impl RecoveryOutputSettings {
171172
pub fn total_duration(&self) -> u32 {
172-
self.output_warning_time
173-
+ self.num_pulses * self.output_high_time
174-
+ (self.num_pulses - 1) * self.output_low_time
173+
self.forewarning_duration
174+
+ self.num_pulses * self.pulse_high_duration
175+
+ (self.num_pulses - 1) * self.pause_duration
175176
}
176177

177178
pub fn currently_high(&self, time_in_mode: u32) -> bool {
178-
let phase_duration = self.output_high_time + self.output_low_time;
179-
time_in_mode > self.output_warning_time
179+
let phase_duration = self.pulse_high_duration + self.pause_duration;
180+
time_in_mode > self.forewarning_duration
180181
&& time_in_mode < self.total_duration()
181-
&& (time_in_mode - self.output_warning_time) % phase_duration < self.output_high_time
182+
&& (time_in_mode - self.forewarning_duration) % phase_duration < self.pulse_high_duration
182183
}
183184
}
184-
185+
/*
185186
impl Default for RecoveryOutputSettings {
186187
fn default() -> Self {
187188
Self {
188-
output_high_time: 500,
189-
output_low_time: 0,
189+
pulse_high_duration: 500,
190+
pause_duration: 0,
190191
num_pulses: 1,
191-
output_warning_time: 500,
192+
forewarning_duration: 500,
193+
output_warning_frequency: 500.0,
194+
}
195+
}
196+
}
197+
198+
*/
199+
impl RecoveryOutputSettings {
200+
fn default_main() -> Self {
201+
Self {
202+
pulse_high_duration: 200,
203+
pause_duration: 500,
204+
num_pulses: 2,
205+
forewarning_duration: 500,
206+
output_warning_frequency: 500.0,
207+
}
208+
}
209+
fn default_parabreaks() -> Self {
210+
Self {
211+
pulse_high_duration: 16_000,
212+
pause_duration: 0,
213+
num_pulses: 1,
214+
forewarning_duration: 500,
192215
output_warning_frequency: 500.0,
193216
}
194217
}
@@ -312,19 +335,8 @@ impl Default for Settings {
312335
apogee_min_falling_time: 100,
313336
main_output_mode: MainOutputMode::default(),
314337
main_output_deployment_altitude: 450.0,
315-
drogue_output_settings: RecoveryOutputSettings {
316-
output_high_time: 300,
317-
output_low_time: 200,
318-
num_pulses: 3,
319-
output_warning_time: 200,
320-
..Default::default()
321-
},
322-
main_output_settings: RecoveryOutputSettings {
323-
output_high_time: 200,
324-
output_low_time: 500,
325-
num_pulses: 3,
326-
..Default::default()
327-
},
338+
drogue_output_settings: RecoveryOutputSettings::default_parabreaks(),
339+
main_output_settings: RecoveryOutputSettings::default_main(),
328340
lora: LoRaSettings::default(),
329341
lora_downlink_settings: LoraLinkSettings::default_downlink(),
330342
lora_uplink_settings: LoraLinkSettings::default_uplink(),

0 commit comments

Comments
 (0)