Add shift time tables

This commit is contained in:
Ashcon Mohseninia 2022-12-04 11:34:55 +00:00
parent e02349d9c3
commit 60923af5e4
5 changed files with 327 additions and 158 deletions

View File

@ -10,11 +10,10 @@ name = "config_app"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [dependencies]
serde_json = { version = "1.0.79" } serde_json = { version = "1.0.89" }
serde = { version = "1.0.137", features = ["derive"] } serde = { version = "1.0.148", features = ["derive"] }
ecu_diagnostics="0.90.51" ecu_diagnostics="0.90.52"
#ecu_diagnostics = {path="../../ecu_diagnostics"} image = "0.24.5"
image = "0.24.1"
serial-rs = {git="https://github.com/rnd-ash/serial-rs"} serial-rs = {git="https://github.com/rnd-ash/serial-rs"}
nfd="0.0.4" nfd="0.0.4"
pollster = "0.2.5" pollster = "0.2.5"
@ -22,7 +21,7 @@ eframe = {version="0.19.0", features=["wgpu"]}
egui_extras = "0.19.0" egui_extras = "0.19.0"
modular-bitfield = "0.11.2" modular-bitfield = "0.11.2"
static_assertions = "1.1.0" static_assertions = "1.1.0"
env_logger="0.9.0" env_logger="0.10.0"
egui-toast="0.3.0" egui-toast="0.4.0"
chrono = "0.4.23" chrono = "0.4.23"
nom="7.1.1" nom="7.1.1"

View File

@ -0,0 +1,19 @@
use eframe::egui;
pub trait HelpView: Clone + Sized {
fn gen_ui(&self, meta: &super::MapData, raw_ui: &mut egui::Ui) -> bool where Self: Sized;
}
#[derive(Clone, Copy)]
pub struct FillingPressureHelp;
impl HelpView for FillingPressureHelp {
fn gen_ui(&self, meta: &super::MapData, raw_ui: &mut egui::Ui) -> bool {
if raw_ui.button("Back").clicked() {
return true;
}
return false;
}
}

View File

@ -0,0 +1,284 @@
use super::MapData;
pub (crate) const MAP_ARRAY: &[MapData] = &[
MapData::new(
0x01,
"Upshift (A)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Upshift RPM threshold",
"RPM",
None,
Some(&["1->2", "2->3", "3->4", "4->5"]),
//None
),
MapData::new(
0x02,
"Upshift (C)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Upshift RPM threshold",
"RPM",
None,
Some(&["1->2", "2->3", "3->4", "4->5"]),
//None
),
MapData::new(
0x03,
"Upshift (S)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Upshift RPM threshold",
"RPM",
None,
Some(&["1->2", "2->3", "3->4", "4->5"]),
//None
),
MapData::new(
0x04,
"Downshift (A)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Downshift RPM threshold",
"RPM",
None,
Some(&["2->1", "3->2", "4->3", "5->4"]),
//None
),
MapData::new(
0x05,
"Downshift (C)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Downshift RPM threshold",
"RPM",
None,
Some(&["2->1", "3->2", "4->3", "5->4"]),
//None
),
MapData::new(
0x06,
"Downshift (S)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Downshift RPM threshold",
"RPM",
None,
Some(&["2->1", "3->2", "4->3", "5->4"]),
//None
),
MapData::new(
0x07,
"Working pressure",
"%",
"",
"Input torque (% of rated)",
"Gear",
"Downshift RPM threshold",
"mBar",
None,
Some(&["P/N", "R1/R2", "1", "2", "3", "4", "5"]),
//None
),
MapData::new(
0x08,
"Pressure solenoid current",
"mBar",
"C",
"Working pressure",
"ATF Temperature",
"Solenoid current (mA)",
"mA",
None,
None,
//None
),
MapData::new(
0x09,
"TCC solenoid Pwm",
"mBar",
"C",
"Converter pressure",
"ATF Temperature",
"Solenoid PWM duty (4096 = 100% on)",
"/4096",
None,
None,
//None
),
MapData::new(
0x0A,
"Clutch filling time",
"C",
"",
"ATF Temperature",
"Clutch",
"filling time in millseconds",
"ms",
None,
Some(&["K1", "K2", "K3", "B1", "B2"]),
//None
),
MapData::new(
0x0B,
"Clutch filling pressure",
"C",
"",
"",
"Clutch",
"filling pressure in millibar",
"mBar",
None,
Some(&["K1", "K2", "K3", "B1", "B2"]),
//None
),
MapData::new(
0x10,
"Upshift overlap time (Agility)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x11,
"Downshift overlap time (Agility)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x12,
"Upshift overlap time (Standard)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x13,
"Downshift overlap time (Standard)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x14,
"Upshift overlap time (Comfort)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x15,
"Downshift overlap time (Comfort)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x16,
"Upshift overlap time (Winter)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x17,
"Downshift overlap time (Winter)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x18,
"Upshift overlap time (Manual)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
MapData::new(
0x19,
"Downshift overlap time (Manual)",
"%",
"RPM",
"",
"Pedal position",
"Input speed",
"ms",
None,
None,
//None
),
];

View File

@ -23,10 +23,12 @@ use egui_extras::{Size, Table, TableBuilder};
use egui_toast::ToastKind; use egui_toast::ToastKind;
use nom::number::complete::le_u16; use nom::number::complete::le_u16;
mod map_widget; mod map_widget;
mod help_view;
mod map_list;
use map_list::MAP_ARRAY;
use crate::window::PageAction; use crate::window::PageAction;
use self::map_widget::MapWidget; use self::{map_widget::MapWidget, help_view::HelpView};
use super::{ use super::{
configuration::{ configuration::{
@ -329,7 +331,6 @@ impl Map {
let mut value = format!("{}", copy.data_modify[map_idx]); let mut value = format!("{}", copy.data_modify[map_idx]);
if let Some((curr_edit_idx, current_edit_txt, resp)) = &copy.curr_edit_cell { if let Some((curr_edit_idx, current_edit_txt, resp)) = &copy.curr_edit_cell {
if *curr_edit_idx == map_idx { if *curr_edit_idx == map_idx {
println!("Editing current cell {}", current_edit_txt);
value = current_edit_txt.clone(); value = current_edit_txt.clone();
} }
} }
@ -343,7 +344,6 @@ impl Map {
response = response.on_hover_text(format!("Current in EEPROM: {}", copy.data_eeprom[map_idx])); response = response.on_hover_text(format!("Current in EEPROM: {}", copy.data_eeprom[map_idx]));
} }
if response.lost_focus() || cell.ctx().input().key_pressed(egui::Key::Enter) { if response.lost_focus() || cell.ctx().input().key_pressed(egui::Key::Enter) {
println!("Cell ({},{}) lost focus, editing done", row_id, x_pos);
if let Ok(new_v) = i16::from_str_radix(&value, 10) { if let Ok(new_v) = i16::from_str_radix(&value, 10) {
copy.data_modify[map_idx] = new_v; copy.data_modify[map_idx] = new_v;
} }
@ -455,7 +455,7 @@ impl Map {
if raw_ui.button("Write changes (To EEPROM)").clicked() { if raw_ui.button("Write changes (To EEPROM)").clicked() {
return match self.save_to_eeprom() { return match self.save_to_eeprom() {
Ok(_) => { Ok(_) => {
if let Ok(new_data) = Self::new(self.meta.id, self.ecu_ref.clone(), self.meta) { if let Ok(new_data) = Self::new(self.meta.id, self.ecu_ref.clone(), self.meta.clone()) {
*self = new_data; *self = new_data;
} }
Some(PageAction::SendNotification { text: format!("Map {} EEPROM save OK!", self.eeprom_key), kind: ToastKind::Success }) Some(PageAction::SendNotification { text: format!("Map {} EEPROM save OK!", self.eeprom_key), kind: ToastKind::Success })
@ -473,7 +473,7 @@ impl Map {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[derive(Debug, Clone)]
pub struct MapData { pub struct MapData {
id: u8, id: u8,
name: &'static str, name: &'static str,
@ -485,6 +485,7 @@ pub struct MapData {
value_unit: &'static str, value_unit: &'static str,
x_replace: Option<&'static [&'static str]>, x_replace: Option<&'static [&'static str]>,
y_replace: Option<&'static [&'static str]>, y_replace: Option<&'static [&'static str]>,
show_help: bool
} }
impl MapData { impl MapData {
@ -498,7 +499,7 @@ impl MapData {
v_desc: &'static str, v_desc: &'static str,
value_unit: &'static str, value_unit: &'static str,
x_replace: Option<&'static [&'static str]>, x_replace: Option<&'static [&'static str]>,
y_replace: Option<&'static [&'static str]>, y_replace: Option<&'static [&'static str]>
) -> Self { ) -> Self {
Self { Self {
id, id,
@ -511,145 +512,11 @@ impl MapData {
value_unit, value_unit,
x_replace, x_replace,
y_replace, y_replace,
show_help: false
} }
} }
} }
const MAP_ARRAY: [MapData; 11] = [
MapData::new(
0x01,
"Upshift (A)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Upshift RPM threshold",
"RPM",
None,
Some(&["1->2", "2->3", "3->4", "4->5"]),
),
MapData::new(
0x02,
"Upshift (C)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Upshift RPM threshold",
"RPM",
None,
Some(&["1->2", "2->3", "3->4", "4->5"]),
),
MapData::new(
0x03,
"Upshift (S)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Upshift RPM threshold",
"RPM",
None,
Some(&["1->2", "2->3", "3->4", "4->5"]),
),
MapData::new(
0x04,
"Downshift (A)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Downshift RPM threshold",
"RPM",
None,
Some(&["2->1", "3->2", "4->3", "5->4"]),
),
MapData::new(
0x05,
"Downshift (C)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Downshift RPM threshold",
"RPM",
None,
Some(&["2->1", "3->2", "4->3", "5->4"]),
),
MapData::new(
0x06,
"Downshift (S)",
"%",
"",
"Pedal position (%)",
"Gear shift",
"Downshift RPM threshold",
"RPM",
None,
Some(&["2->1", "3->2", "4->3", "5->4"]),
),
MapData::new(
0x07,
"Working pressure",
"%",
"",
"Input torque (% of rated)",
"Gear",
"Downshift RPM threshold",
"mBar",
None,
Some(&["P/N", "R1/R2", "1", "2", "3", "4", "5"]),
),
MapData::new(
0x08,
"Pressure solenoid current",
"mBar",
"C",
"Working pressure",
"ATF Temperature",
"Solenoid current (mA)",
"mA",
None,
None,
),
MapData::new(
0x09,
"TCC solenoid Pwm",
"mBar",
"C",
"Converter pressure",
"ATF Temperature",
"Solenoid PWM duty (4096 = 100% on)",
"/4096",
None,
None,
),
MapData::new(
0x0A,
"Clutch filling time",
"C",
"",
"ATF Temperature",
"Clutch",
"filling time in millseconds",
"ms",
None,
Some(&["K1", "K2", "K3", "B1", "B2"]),
),
MapData::new(
0x0B,
"Clutch filling pressure",
"C",
"",
"",
"Clutch",
"filling pressure in millibar",
"mBar",
None,
Some(&["K1", "K2", "K3", "B1", "B2"]),
),
];
pub struct MapEditor { pub struct MapEditor {
bar: MainStatusBar, bar: MainStatusBar,
server: Arc<Mutex<Kwp2000DiagnosticServer>>, server: Arc<Mutex<Kwp2000DiagnosticServer>>,
@ -675,7 +542,7 @@ impl super::InterfacePage for MapEditor {
ui: &mut eframe::egui::Ui, ui: &mut eframe::egui::Ui,
frame: &eframe::Frame, frame: &eframe::Frame,
) -> crate::window::PageAction { ) -> crate::window::PageAction {
for map in &MAP_ARRAY { for map in MAP_ARRAY {
if ui.button(map.name).clicked() { if ui.button(map.name).clicked() {
self.error = None; self.error = None;
match Map::new(map.id, self.server.clone(), map.clone()) { match Map::new(map.id, self.server.clone(), map.clone()) {

View File

@ -10,7 +10,7 @@ use crate::ui::{
status_bar::{self}, status_bar::{self},
}; };
use eframe::{ use eframe::{
egui::{self, Direction}, egui::{self, Direction, WidgetText, RichText},
epaint::Pos2, epaint::Pos2,
}; };
use egui_toast::{Toast, ToastKind, ToastOptions, Toasts}; use egui_toast::{Toast, ToastKind, ToastOptions, Toasts};
@ -69,7 +69,7 @@ impl eframe::App for MainWindow {
self.pop_page(); self.pop_page();
} }
let mut toasts = Toasts::new(ctx) let mut toasts = Toasts::new()
.anchor(Pos2::new( .anchor(Pos2::new(
5.0, 5.0,
ctx.available_rect().height() - s_bar_height - 5.0, ctx.available_rect().height() - s_bar_height - 5.0,
@ -92,18 +92,18 @@ impl eframe::App for MainWindow {
} }
PageAction::SendNotification { text, kind } => { PageAction::SendNotification { text, kind } => {
println!("Pushing notification {}", text); println!("Pushing notification {}", text);
toasts.add( toasts.add(Toast {
text,
kind, kind,
ToastOptions { text: WidgetText::RichText(RichText::new(text)),
options: ToastOptions {
show_icon: true, show_icon: true,
expires_at: Some(Instant::now().add(Duration::from_secs(5))), expires_at: Some(Instant::now().add(Duration::from_secs(5))),
}, }
); });
} }
} }
}); });
toasts.show(); toasts.show(&ctx);
} }
ctx.request_repaint(); ctx.request_repaint();
} }