Add new KWP logger (Debug view)
This commit is contained in:
parent
4fb1b1a092
commit
8e7b7a50ba
|
@ -7,7 +7,7 @@ use eframe::egui;
|
|||
use eframe::Frame;
|
||||
|
||||
use crate::{
|
||||
usb_hw::diag_usb::{EspLogMessage},
|
||||
usb_hw::{diag_usb::{EspLogMessage}, KwpEventLevel, KwpEventHandler},
|
||||
window::{InterfacePage, PageAction},
|
||||
};
|
||||
|
||||
|
@ -48,15 +48,18 @@ impl MainPage {
|
|||
tester_present_require_response: true,
|
||||
global_session_control: false
|
||||
};
|
||||
let mut kwp = Kwp2000DiagnosticServer::new_over_iso_tp(
|
||||
let (evt_sender, evt_receiver) = mpsc::channel::<(KwpEventLevel, String)>();
|
||||
let kwp = Kwp2000DiagnosticServer::new_over_iso_tp(
|
||||
server_settings,
|
||||
channel,
|
||||
channel_cfg,
|
||||
Kwp2000VoidHandler {},
|
||||
KwpEventHandler::new(evt_sender),
|
||||
).unwrap();
|
||||
|
||||
|
||||
|
||||
Self {
|
||||
bar: MainStatusBar::new(logger, hw_name),
|
||||
bar: MainStatusBar::new(evt_receiver, hw_name),
|
||||
show_about_ui: false,
|
||||
diag_server: Arc::new(Mutex::new(kwp)),
|
||||
dev_info: DevInfo { compat_mode: "UNKNOWN".into(), fw_version: "UNKNOWN".into(), fw_date: "UNKNOWN".into() }
|
||||
|
|
|
@ -6,7 +6,7 @@ use std::{
|
|||
};
|
||||
|
||||
use crate::{
|
||||
usb_hw::diag_usb::{EspLogMessage, Nag52USB},
|
||||
usb_hw::{diag_usb::{EspLogMessage, Nag52USB}, KwpEventLevel},
|
||||
window::{InterfacePage, StatusBar},
|
||||
};
|
||||
use eframe::egui;
|
||||
|
@ -14,24 +14,21 @@ use eframe::egui;
|
|||
#[derive(Clone)]
|
||||
pub struct MainStatusBar {
|
||||
show_log_view: bool,
|
||||
msgs: VecDeque<EspLogMessage>,
|
||||
receiver: Option<Arc<mpsc::Receiver<EspLogMessage>>>,
|
||||
msgs: VecDeque<(KwpEventLevel, String)>,
|
||||
receiver: Arc<mpsc::Receiver<(KwpEventLevel, String)>>,
|
||||
hw_name: String,
|
||||
auto_scroll: bool,
|
||||
use_light_theme: bool
|
||||
}
|
||||
|
||||
impl MainStatusBar {
|
||||
pub fn new(logger: Option<mpsc::Receiver<EspLogMessage>>, hw_name: String) -> Self {
|
||||
pub fn new(logger: mpsc::Receiver<(KwpEventLevel, String)>, hw_name: String) -> Self {
|
||||
Self {
|
||||
show_log_view: false,
|
||||
msgs: VecDeque::new(),
|
||||
auto_scroll: true,
|
||||
use_light_theme: false,
|
||||
receiver: match logger {
|
||||
Some(l) => Some(Arc::new(l)),
|
||||
None => None,
|
||||
},
|
||||
receiver: Arc::new(logger),
|
||||
hw_name
|
||||
}
|
||||
}
|
||||
|
@ -40,62 +37,53 @@ impl MainStatusBar {
|
|||
impl StatusBar for MainStatusBar {
|
||||
fn draw(&mut self, ui: &mut egui::Ui, ctx: &egui::Context) {
|
||||
ui.label(format!("Connected via {}", self.hw_name));
|
||||
if self.receiver.is_some() {
|
||||
if ui.button("TCM log view").clicked() {
|
||||
self.show_log_view = true;
|
||||
}
|
||||
if ui.button("Debug view").clicked() {
|
||||
self.show_log_view = true;
|
||||
}
|
||||
|
||||
if ui.checkbox(&mut self.use_light_theme, "Light theme").clicked() {
|
||||
let style = match self.use_light_theme {
|
||||
true => egui::Visuals::light(),
|
||||
false => egui::Visuals::dark()
|
||||
};
|
||||
ctx.set_visuals(style);
|
||||
|
||||
}
|
||||
egui::widgets::global_dark_light_mode_buttons(ui);
|
||||
|
||||
|
||||
if self.show_log_view {
|
||||
egui::containers::Window::new("Log view")
|
||||
.fixed_size(&[1200f32, 400f32])
|
||||
.resizable(false)
|
||||
let ui_h = ui.available_height();
|
||||
let ui_w = ui.available_width();
|
||||
egui::containers::Window::new("Debug view")
|
||||
.resizable(true)
|
||||
.default_height(ui_h/4.0)
|
||||
.default_width(ui_w/4.0)
|
||||
.show(ui.ctx(), |log_view| {
|
||||
log_view.vertical(|l_view| {
|
||||
egui::containers::ScrollArea::new([false, true])
|
||||
.max_height(300f32)
|
||||
.auto_shrink([false, false])
|
||||
.stick_to_bottom(true)
|
||||
let max_height = l_view.available_height();
|
||||
egui::containers::ScrollArea::vertical()
|
||||
.auto_shrink([false, false])
|
||||
.max_height(500.0)
|
||||
.stick_to_bottom(true)
|
||||
.show(l_view, |scroll| {
|
||||
for msg in &self.msgs {
|
||||
for (lvl, msg) in &self.msgs {
|
||||
scroll.label(
|
||||
RichText::new(format!(
|
||||
"{} {} {}",
|
||||
msg.timestamp, msg.tag, msg.msg
|
||||
"{}",
|
||||
msg
|
||||
))
|
||||
.color(match msg
|
||||
.lvl
|
||||
.color(match lvl
|
||||
{
|
||||
crate::usb_hw::diag_usb::EspLogLevel::Info => {
|
||||
Color32::from_rgb(0, 100, 0)
|
||||
}
|
||||
crate::usb_hw::diag_usb::EspLogLevel::Warn => {
|
||||
KwpEventLevel::Warn => {
|
||||
Color32::from_rgb(255, 215, 0)
|
||||
}
|
||||
crate::usb_hw::diag_usb::EspLogLevel::Error => {
|
||||
KwpEventLevel::Err => {
|
||||
Color32::from_rgb(255, 0, 0)
|
||||
}
|
||||
_ => Color32::from_rgb(255, 255, 255),
|
||||
_ => ui.visuals().text_color()
|
||||
}),
|
||||
);
|
||||
}
|
||||
});
|
||||
//while let Some(msg) = self.dev.lock().unwrap().read_log_msg() {
|
||||
// if self.msgs.len() >= 1000 {
|
||||
// self.msgs.pop_front();
|
||||
// }
|
||||
// self.msgs.push_back(msg);
|
||||
//}
|
||||
while let Ok(msg) = self.receiver.try_recv() {
|
||||
if self.msgs.len() >= 1000 {
|
||||
self.msgs.pop_front();
|
||||
}
|
||||
self.msgs.push_back(msg);
|
||||
}
|
||||
});
|
||||
|
||||
if log_view.button("Clear log view").clicked() {
|
||||
|
|
|
@ -1,3 +1,56 @@
|
|||
use std::sync::mpsc;
|
||||
|
||||
use ecu_diagnostics::{ServerEventHandler, kwp2000::SessionType, ServerEvent};
|
||||
use eframe::epaint::Color32;
|
||||
|
||||
pub mod diag_usb;
|
||||
pub mod scanner;
|
||||
pub mod flasher;
|
||||
pub mod flasher;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub enum KwpEventLevel {
|
||||
Info,
|
||||
Warn,
|
||||
Err
|
||||
}
|
||||
|
||||
pub struct KwpEventHandler {
|
||||
evt_queue: mpsc::Sender<(KwpEventLevel, String)>
|
||||
}
|
||||
|
||||
impl KwpEventHandler {
|
||||
pub fn new(sender: mpsc::Sender<(KwpEventLevel, String)>) -> Self {
|
||||
Self { evt_queue: sender }
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl Sync for KwpEventHandler{}
|
||||
unsafe impl Send for KwpEventHandler{}
|
||||
|
||||
impl ServerEventHandler<SessionType> for KwpEventHandler {
|
||||
#[allow(unused_results)]
|
||||
fn on_event(&mut self, e: ecu_diagnostics::ServerEvent<SessionType>) {
|
||||
match e {
|
||||
//ecu_diagnostics::ServerEvent::CriticalError { desc } => todo!(),
|
||||
//ecu_diagnostics::ServerEvent::ServerStart => todo!(),
|
||||
//ecu_diagnostics::ServerEvent::ServerExit => todo!(),
|
||||
ecu_diagnostics::ServerEvent::DiagModeChange { old, new } => {
|
||||
self.evt_queue.send((KwpEventLevel::Info, format!("Diag server change mode from '{:?}' to '{:?}'", old, new)));
|
||||
},
|
||||
ecu_diagnostics::ServerEvent::Request(req) => {
|
||||
self.evt_queue.send((KwpEventLevel::Info, format!("OUT {:02X?}", req)));
|
||||
},
|
||||
ecu_diagnostics::ServerEvent::Response(res) => {
|
||||
match res {
|
||||
Ok(payload) => self.evt_queue.send((KwpEventLevel::Info, format!("IN {:02X?}", payload))),
|
||||
Err(e) => self.evt_queue.send((KwpEventLevel::Err, format!("IN {}", e.to_string())))
|
||||
};
|
||||
},
|
||||
ecu_diagnostics::ServerEvent::TesterPresentError(e) => {
|
||||
self.evt_queue.send((KwpEventLevel::Warn, format!("TESTER PRESENT ERROR {}", e)));
|
||||
},
|
||||
//ecu_diagnostics::ServerEvent::InterfaceCloseOnExitError(_) => todo!(),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue