Integrate hand gateway and spatial force rendering

This commit is contained in:
lenn
2026-06-29 18:55:42 +08:00
parent f30ebcf20b
commit d4f160af75
14 changed files with 1041 additions and 98 deletions

View File

@@ -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)));
});
}