send tof status to gui
This commit is contained in:
parent
79b22b3cb7
commit
bb974c2015
3 changed files with 27 additions and 6 deletions
|
@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize};
|
||||||
/// -1..1
|
/// -1..1
|
||||||
pub type Speed = f32;
|
pub type Speed = f32;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub enum ControlPacket {
|
pub enum ControlPacket {
|
||||||
/// Forward, Clockwise
|
/// Forward, Clockwise
|
||||||
Twist(Speed, Speed),
|
Twist(Speed, Speed),
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
|
|
||||||
|
use std::cell::OnceCell;
|
||||||
|
|
||||||
use common::{ControlPacket, TelemetryPacket};
|
use common::{ControlPacket, TelemetryPacket};
|
||||||
use eframe::egui::{self, Align2};
|
use eframe::egui::{self, containers, Align2, Checkbox, Context, Label};
|
||||||
use tokio::sync::{mpsc, watch::Receiver};
|
use tokio::sync::{mpsc, watch::Receiver};
|
||||||
use egui_toast::{Toast, Toasts};
|
use egui_toast::{Toast, Toasts};
|
||||||
|
|
||||||
|
pub const GUI: OnceCell<Context> = OnceCell::new();
|
||||||
|
|
||||||
pub fn gui(data: Receiver<GUIData>, toasts: mpsc::Receiver<Toast>) -> eframe::Result {
|
pub fn gui(data: Receiver<GUIData>, toasts: mpsc::Receiver<Toast>) -> eframe::Result {
|
||||||
let options = eframe::NativeOptions {
|
let options = eframe::NativeOptions {
|
||||||
viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]),
|
viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]),
|
||||||
|
@ -43,8 +47,21 @@ impl GUI {
|
||||||
|
|
||||||
impl eframe::App for GUI {
|
impl eframe::App for GUI {
|
||||||
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
||||||
|
let _ = GUI.set(ctx.clone());
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
ui.heading("Cruise Control");
|
ui.heading("Cruise Control");
|
||||||
|
|
||||||
|
if let Some(ref command) = self.data.borrow().last_command {
|
||||||
|
ui.label(format!("sending {command:?}"));
|
||||||
|
}
|
||||||
|
if let Some(ref telem) = self.data.borrow().telemetry {
|
||||||
|
ui.label(format!("Left tof: {}", if let Some(tof) = telem.sensors.tof_l {format!("✅ {tof}mm")} else {"❌".into()}));
|
||||||
|
ui.label(format!("Right tof: {}", if let Some(tof) = telem.sensors.tof_r {format!("✅ {tof}mm")} else {"❌".into()}));
|
||||||
|
ui.label(format!("Side tof: {}", if let Some(tof) = telem.sensors.tof_s {format!("✅ {tof}mm")} else {"❌".into()}));
|
||||||
|
ui.label(format!("Gyro: {}", if telem.sensors.gyro.is_some() {"✅"} else {"❌"}));
|
||||||
|
} else {
|
||||||
|
ui.label("disconnected");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
let mut toasts = Toasts::new()
|
let mut toasts = Toasts::new()
|
||||||
.anchor(Align2::RIGHT_BOTTOM, (-10.0, -10.0)) // 10 units from the bottom right corner
|
.anchor(Align2::RIGHT_BOTTOM, (-10.0, -10.0)) // 10 units from the bottom right corner
|
||||||
|
|
|
@ -6,7 +6,7 @@ use anyhow::{Context, Ok, Result};
|
||||||
use common::{ControlPacket, TelemetryPacket};
|
use common::{ControlPacket, TelemetryPacket};
|
||||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
||||||
use egui_toast::{Toast, ToastKind};
|
use egui_toast::{Toast, ToastKind};
|
||||||
use gui::{gui, GUIData};
|
use gui::{gui, GUIData, GUI};
|
||||||
use pitch_detection::{detector::{mcleod::McLeodDetector, PitchDetector}, utils};
|
use pitch_detection::{detector::{mcleod::McLeodDetector, PitchDetector}, utils};
|
||||||
use rust_music_theory::note::{Note, NoteLetter, Pitch, Tuning};
|
use rust_music_theory::note::{Note, NoteLetter, Pitch, Tuning};
|
||||||
use tokio::{io::{AsyncReadExt, AsyncWriteExt, BufWriter, WriteHalf}, net::{tcp::{OwnedReadHalf, OwnedWriteHalf}, TcpStream}, spawn, sync::{self, mpsc, watch, RwLock}, time::timeout};
|
use tokio::{io::{AsyncReadExt, AsyncWriteExt, BufWriter, WriteHalf}, net::{tcp::{OwnedReadHalf, OwnedWriteHalf}, TcpStream}, spawn, sync::{self, mpsc, watch, RwLock}, time::timeout};
|
||||||
|
@ -68,7 +68,7 @@ fn main() -> Result<()> {
|
||||||
Ok(control)
|
Ok(control)
|
||||||
}).unwrap();
|
}).unwrap();
|
||||||
|
|
||||||
executor.block_on(controller(notes, control)).unwrap()
|
executor.block_on(controller(notes, control, data_sender.clone())).unwrap()
|
||||||
});
|
});
|
||||||
|
|
||||||
println!("launching gui");
|
println!("launching gui");
|
||||||
|
@ -92,10 +92,11 @@ async fn telemetry_handler(mut telem: OwnedReadHalf, gui: watch::Sender<GUIData>
|
||||||
gui.send_modify(|gui| {
|
gui.send_modify(|gui| {
|
||||||
gui.telemetry = Some(telem);
|
gui.telemetry = Some(telem);
|
||||||
});
|
});
|
||||||
|
GUI.get().map(|c| c.request_repaint());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn controller(mut notes: mpsc::Receiver<(Option<pitch_detection::Pitch<f32>>, f32)>, controller: OwnedWriteHalf) -> Result<()> {
|
async fn controller(mut notes: mpsc::Receiver<(Option<pitch_detection::Pitch<f32>>, f32)>, controller: OwnedWriteHalf, gui: watch::Sender<GUIData>) -> Result<()> {
|
||||||
let mut controller = BufWriter::new(controller);
|
let mut controller = BufWriter::new(controller);
|
||||||
//send_packet(&mut controller, ControlPacket::Arm(true)).await?;
|
//send_packet(&mut controller, ControlPacket::Arm(true)).await?;
|
||||||
//println!("armed flipper");
|
//println!("armed flipper");
|
||||||
|
@ -123,10 +124,13 @@ async fn controller(mut notes: mpsc::Receiver<(Option<pitch_detection::Pitch<f32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
send_packet(&mut controller, control).await?;
|
send_packet(&mut controller, control.clone()).await?;
|
||||||
|
gui.send_modify(|gui| gui.last_command = Some(control));
|
||||||
} else {
|
} else {
|
||||||
send_packet(&mut controller, ControlPacket::Twist(0.0, 0.0)).await?;
|
send_packet(&mut controller, ControlPacket::Twist(0.0, 0.0)).await?;
|
||||||
|
gui.send_modify(|gui| gui.last_command = Some(ControlPacket::Stop));
|
||||||
}
|
}
|
||||||
|
GUI.get().map(|c| c.request_repaint());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue