Add new KWP logger (Debug view)

This commit is contained in:
Ashcon Mohseninia 2022-09-27 20:08:57 +01:00
parent 4fb1b1a092
commit 8e7b7a50ba
3 changed files with 93 additions and 49 deletions

View File

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

View File

@ -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() {

View File

@ -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!(),
_ => {}
}
}
}