Integrate hand gateway and spatial force rendering
This commit is contained in:
60
src/ui.rs
60
src/ui.rs
@@ -2,8 +2,9 @@ use eframe::egui;
|
||||
|
||||
use crate::{
|
||||
connection::{ConnectionManager, ConnectionState},
|
||||
force::HudSpatialForce,
|
||||
recording::Recorder,
|
||||
serial_core::serial::SerialIoStats,
|
||||
serial_core::serial::{SerialIoStats, SerialProtocol},
|
||||
style::{
|
||||
self, ACCENT_BLUE, ACCENT_GREEN, ACCENT_ORANGE, ACCENT_RED, METRICS, ONE_DARK_PRO,
|
||||
dim_text, group_frame, layout, panel_frame, tag_button,
|
||||
@@ -53,6 +54,22 @@ pub enum SerialMode {
|
||||
Hand,
|
||||
}
|
||||
|
||||
impl SerialMode {
|
||||
pub fn baud_rate(self) -> u32 {
|
||||
match self {
|
||||
SerialMode::Finger => 921_600,
|
||||
SerialMode::Hand => 1_152_000,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn protocol(self) -> SerialProtocol {
|
||||
match self {
|
||||
SerialMode::Finger => SerialProtocol::TactileA,
|
||||
SerialMode::Hand => SerialProtocol::HandGateway,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
pub enum Parity {
|
||||
None,
|
||||
@@ -305,6 +322,8 @@ fn draw_connect_action_row(
|
||||
&config.selected_port,
|
||||
config.rows as u32,
|
||||
config.cols as u32,
|
||||
config.mode.baud_rate(),
|
||||
config.mode.protocol(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -435,7 +454,13 @@ fn draw_connection_row(
|
||||
if is_connected {
|
||||
connection.disconnect();
|
||||
} else if !config.port.is_empty() {
|
||||
connection.connect(&config.port, 12, 7);
|
||||
connection.connect(
|
||||
&config.port,
|
||||
12,
|
||||
7,
|
||||
config.mode.baud_rate(),
|
||||
config.mode.protocol(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -646,7 +671,7 @@ fn baud_combo(ui: &mut egui::Ui, config: &mut ConfigPanelState) {
|
||||
.selected_text(config.baud_rate.to_string())
|
||||
.show_ui(ui, |ui| {
|
||||
for baud_rate in [
|
||||
9_600, 19_200, 38_400, 57_600, 115_200, 230_400, 460_800, 921_600,
|
||||
9_600, 19_200, 38_400, 57_600, 115_200, 230_400, 460_800, 921_600, 1_152_000,
|
||||
] {
|
||||
ui.selectable_value(&mut config.baud_rate, baud_rate, baud_rate.to_string());
|
||||
}
|
||||
@@ -672,16 +697,21 @@ pub fn draw_stats_panel(
|
||||
ctx: &egui::Context,
|
||||
panel: &mut FloatingPanelState,
|
||||
force_history: &[f32],
|
||||
spatial_force: Option<HudSpatialForce>,
|
||||
) {
|
||||
draw_floating_panel(ctx, panel, "统计", "stats_panel", |ui| {
|
||||
ui.set_min_width(320.0);
|
||||
draw_resultant_force_chart(ui, force_history);
|
||||
draw_resultant_force_chart(ui, force_history, spatial_force);
|
||||
});
|
||||
}
|
||||
|
||||
const FORCE_CHART_MAX_N: f32 = 25.6;
|
||||
|
||||
fn draw_resultant_force_chart(ui: &mut egui::Ui, values: &[f32]) {
|
||||
fn draw_resultant_force_chart(
|
||||
ui: &mut egui::Ui,
|
||||
values: &[f32],
|
||||
spatial_force: Option<HudSpatialForce>,
|
||||
) {
|
||||
let latest = values.last().copied().unwrap_or(0.0);
|
||||
let max = values.iter().copied().fold(0.0_f32, f32::max);
|
||||
let active_values = values.iter().copied().filter(|value| *value > 0.0);
|
||||
@@ -709,6 +739,26 @@ fn draw_resultant_force_chart(ui: &mut egui::Ui, values: &[f32]) {
|
||||
|
||||
ui.add_space(6.0);
|
||||
paint_resultant_force_chart(ui, values);
|
||||
|
||||
ui.add_space(8.0);
|
||||
draw_spatial_force_readout(ui, spatial_force);
|
||||
});
|
||||
}
|
||||
|
||||
fn draw_spatial_force_readout(ui: &mut egui::Ui, spatial_force: Option<HudSpatialForce>) {
|
||||
let Some(force) = spatial_force else {
|
||||
ui.horizontal(|ui| {
|
||||
ui.colored_label(dim_text(), "3D");
|
||||
ui.label(style::subtle_text("等待三维力数据"));
|
||||
});
|
||||
return;
|
||||
};
|
||||
|
||||
ui.horizontal_wrapped(|ui| {
|
||||
ui.colored_label(ACCENT_BLUE, "3D");
|
||||
ui.label(style::value_text(format!("angle {:.0}°", force.angle_deg)));
|
||||
ui.separator();
|
||||
ui.label(style::value_text(format!("mag {:.2}", force.magnitude)));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user