mirror of
https://github.com/hubaldv/bioz-firmware-rs.git
synced 2025-12-06 05:01:18 +00:00
Included bode plot measurements, including different number of points.
This commit is contained in:
@@ -7,6 +7,7 @@ use embassy_futures::select::{select, Either};
|
||||
use embassy_stm32::usb::Driver;
|
||||
use embassy_stm32::{peripherals, uid, usb};
|
||||
|
||||
use heapless::Vec;
|
||||
use postcard_rpc::{
|
||||
define_dispatch,
|
||||
header::VarHeader,
|
||||
@@ -19,9 +20,9 @@ use postcard_rpc::{
|
||||
},
|
||||
};
|
||||
|
||||
use bioz_icd_rs::{GetUniqueIdEndpoint, PingEndpoint, SetGreenLedEndpoint, SingleImpedanceOutput, SingleImpedanceOutputTopic, StartMultiImpedance, StartMultiImpedanceEndpoint, StartSingleImpedance, StartSingleImpedanceEndpoint, StopMultiImpedanceEndpoint, StopSingleImpedanceEndpoint, MultiImpedanceOutputTopic28, MultiImpedanceOutput28, ENDPOINT_LIST, TOPICS_IN_LIST, TOPICS_OUT_LIST};
|
||||
use bioz_icd_rs::{GetUniqueIdEndpoint, MeasurementPointSet, MultiImpedanceOutputTopic, MultiImpedanceResult, MultiImpedanceStartRequest, PingEndpoint, SetGreenLedEndpoint, SingleImpedanceOutputTopic, SingleImpedanceStartRequest, StartMultiImpedanceEndpoint, StartSingleImpedanceEndpoint, StopMultiImpedanceEndpoint, StopSingleImpedanceEndpoint, ENDPOINT_LIST, TOPICS_IN_LIST, TOPICS_OUT_LIST};
|
||||
|
||||
use crate::impedance::{ImpedanceSetupType, IMPEDANCE_CHANNEL_SINGLE, IMPEDANCE_CHANNEL_MULTI, RunningMode};
|
||||
use crate::impedance::{ImpedanceSetupType, RunningMode, IMPEDANCE_CHANNEL_MULTI, IMPEDANCE_CHANNEL_SINGLE};
|
||||
|
||||
// Postcard RPC types
|
||||
type AppDriver = usb::Driver<'static, peripherals::USB>;
|
||||
@@ -164,7 +165,7 @@ pub async fn set_green_led_handler(_context: &mut Context, _header: VarHeader, r
|
||||
static STOP: Signal<CriticalSectionRawMutex, ()> = Signal::new();
|
||||
|
||||
#[embassy_executor::task]
|
||||
pub async fn start_single_impedance_handler(context: SpawnCtx, header: VarHeader, rqst: StartSingleImpedance, sender: Sender<AppTx>) {
|
||||
pub async fn start_single_impedance_handler(context: SpawnCtx, header: VarHeader, rqst: SingleImpedanceStartRequest, sender: Sender<AppTx>) {
|
||||
info!("Start impedance measurement at {:?} Hz.", rqst.sinus_frequency);
|
||||
|
||||
// Mark the impedance setup as running
|
||||
@@ -216,24 +217,54 @@ pub async fn start_single_impedance_handler(context: SpawnCtx, header: VarHeader
|
||||
pub async fn stop_single_impedance_handler(context: &mut Context, _header: VarHeader, _rqst: ()) -> bool {
|
||||
info!("Stop impedance measurement");
|
||||
let was_busy = context.impedance_setup.lock().await.running_mode;
|
||||
if was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency {
|
||||
if was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eight) || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eighteen) {
|
||||
STOP.signal(());
|
||||
}
|
||||
was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency
|
||||
was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eight) || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eighteen)
|
||||
}
|
||||
|
||||
#[embassy_executor::task]
|
||||
pub async fn start_multi_impedance_handler(context: SpawnCtx, header: VarHeader, rqst: StartMultiImpedance, sender: Sender<AppTx>) {
|
||||
pub async fn start_multi_impedance_handler(context: SpawnCtx, header: VarHeader, rqst: MultiImpedanceStartRequest, sender: Sender<AppTx>) {
|
||||
// Mark the impedance setup as running
|
||||
context.impedance_setup.lock().await.running_mode = RunningMode::MultiFrequency;
|
||||
context.impedance_setup.lock().await.running_mode = RunningMode::MultiFrequency(rqst.points);
|
||||
|
||||
// Init the sequencer
|
||||
context.impedance_setup.lock().await.init_multi_frequency_measurement(rqst.dft_number, rqst.number_of_points).await;
|
||||
let response = match rqst.points {
|
||||
MeasurementPointSet::Eight => {
|
||||
const SIZE: usize = 8;
|
||||
context
|
||||
.impedance_setup
|
||||
.lock()
|
||||
.await
|
||||
.init_multi_frequency_measurement::<SIZE>(rqst.points)
|
||||
.await
|
||||
.map(|periods| MultiImpedanceResult {
|
||||
points: rqst.points,
|
||||
periods_per_dft_8: periods,
|
||||
periods_per_dft_18: Vec::new(),
|
||||
})
|
||||
}
|
||||
MeasurementPointSet::Eighteen => {
|
||||
const SIZE: usize = 18;
|
||||
context
|
||||
.impedance_setup
|
||||
.lock()
|
||||
.await
|
||||
.init_multi_frequency_measurement::<SIZE>(rqst.points)
|
||||
.await
|
||||
.map(|periods| MultiImpedanceResult {
|
||||
points: rqst.points,
|
||||
periods_per_dft_8: Vec::new(),
|
||||
periods_per_dft_18: periods,
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
// Trigger the sequencer
|
||||
context.impedance_setup.lock().await.start_measurement().await;
|
||||
|
||||
if sender
|
||||
.reply::<StartMultiImpedanceEndpoint>(header.seq_no, &())
|
||||
.reply::<StartMultiImpedanceEndpoint>(header.seq_no, &response)
|
||||
.await
|
||||
.is_err()
|
||||
{
|
||||
@@ -255,7 +286,7 @@ pub async fn start_multi_impedance_handler(context: SpawnCtx, header: VarHeader,
|
||||
}
|
||||
Either::Second(msg) => {
|
||||
if sender
|
||||
.publish::<MultiImpedanceOutputTopic28>(seq.into(), &msg)
|
||||
.publish::<MultiImpedanceOutputTopic>(seq.into(), &msg)
|
||||
.await
|
||||
.is_err()
|
||||
{
|
||||
@@ -275,8 +306,8 @@ pub async fn start_multi_impedance_handler(context: SpawnCtx, header: VarHeader,
|
||||
pub async fn stop_multi_impedance_handler(context: &mut Context, _header: VarHeader, _rqst: ()) -> bool {
|
||||
info!("Stop impedance measurement");
|
||||
let was_busy = context.impedance_setup.lock().await. running_mode;
|
||||
if was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency {
|
||||
if was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eight) || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eighteen) {
|
||||
STOP.signal(());
|
||||
}
|
||||
was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency
|
||||
was_busy == RunningMode::SingleFrequency || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eight) || was_busy == RunningMode::MultiFrequency(MeasurementPointSet::Eighteen)
|
||||
}
|
||||
Reference in New Issue
Block a user