Allow user to choose dump location
This commit is contained in:
parent
bfbae491e4
commit
e02349d9c3
|
@ -2,7 +2,7 @@ use std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
io::Write,
|
io::Write,
|
||||||
ops::DerefMut,
|
ops::DerefMut,
|
||||||
sync::{Arc, Mutex, RwLock},
|
sync::{Arc, Mutex, RwLock}, path::PathBuf,
|
||||||
};
|
};
|
||||||
|
|
||||||
use ecu_diagnostics::{
|
use ecu_diagnostics::{
|
||||||
|
@ -45,6 +45,7 @@ impl ReadState {
|
||||||
pub struct CrashAnalyzerUI {
|
pub struct CrashAnalyzerUI {
|
||||||
server: Arc<Mutex<Kwp2000DiagnosticServer>>,
|
server: Arc<Mutex<Kwp2000DiagnosticServer>>,
|
||||||
read_state: Arc<RwLock<ReadState>>,
|
read_state: Arc<RwLock<ReadState>>,
|
||||||
|
save_path: Arc<RwLock<Option<String>>>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CrashAnalyzerUI {
|
impl CrashAnalyzerUI {
|
||||||
|
@ -52,6 +53,7 @@ impl CrashAnalyzerUI {
|
||||||
Self {
|
Self {
|
||||||
server,
|
server,
|
||||||
read_state: Arc::new(RwLock::new(ReadState::None)),
|
read_state: Arc::new(RwLock::new(ReadState::None)),
|
||||||
|
save_path: Arc::new(RwLock::new(None)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,9 +87,11 @@ fn init_flash_mode(server: &mut Kwp2000DiagnosticServer) -> DiagServerResult<(u3
|
||||||
Ok((address, size, bs))
|
Ok((address, size, bs))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_flash_end(server: &mut Kwp2000DiagnosticServer, read: Vec<u8>) -> DiagServerResult<()> {
|
fn on_flash_end(path: &str, server: &mut Kwp2000DiagnosticServer, read: Vec<u8>) -> DiagServerResult<()> {
|
||||||
server.send_byte_array_with_response(&[0x37])?;
|
server.send_byte_array_with_response(&[0x37])?;
|
||||||
File::create("dump.elf").unwrap().write_all(&read[20..]); // First 20 bytes are header of partition. We don't need it
|
let mut p = PathBuf::from(path);
|
||||||
|
p.push("dump.elf");
|
||||||
|
File::create(p).unwrap().write_all(&read[20..]); // First 20 bytes are header of partition. We don't need it
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,8 +104,23 @@ impl InterfacePage for CrashAnalyzerUI {
|
||||||
let state = self.read_state.read().unwrap().clone();
|
let state = self.read_state.read().unwrap().clone();
|
||||||
if state.is_done() {
|
if state.is_done() {
|
||||||
if ui.button("Read coredump ELF").clicked() {
|
if ui.button("Read coredump ELF").clicked() {
|
||||||
|
match nfd::open_pick_folder(None) {
|
||||||
|
Ok(f) => {
|
||||||
|
if let nfd::Response::Okay(path) = f {
|
||||||
|
*self.save_path.write().unwrap() = Some(path);
|
||||||
|
} else {
|
||||||
|
*self.read_state.write().unwrap() = ReadState::Aborted("User did not select a save path for coredump".to_string());
|
||||||
|
return PageAction::None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
*self.read_state.write().unwrap() = ReadState::Aborted("User did not select a save path for coredump".to_string());
|
||||||
|
return PageAction::None;
|
||||||
|
}
|
||||||
|
}
|
||||||
let c = self.server.clone();
|
let c = self.server.clone();
|
||||||
let state_c = self.read_state.clone();
|
let state_c = self.read_state.clone();
|
||||||
|
let save_c = self.save_path.read().unwrap().clone();
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
let mut lock = c.lock().unwrap();
|
let mut lock = c.lock().unwrap();
|
||||||
*state_c.write().unwrap() = ReadState::Prepare;
|
*state_c.write().unwrap() = ReadState::Prepare;
|
||||||
|
@ -144,7 +163,7 @@ impl InterfacePage for CrashAnalyzerUI {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
on_flash_end(&mut lock.deref_mut(), data);
|
on_flash_end(&save_c.unwrap(), &mut lock.deref_mut(), data);
|
||||||
}
|
}
|
||||||
*state_c.write().unwrap() = ReadState::Completed;
|
*state_c.write().unwrap() = ReadState::Completed;
|
||||||
}
|
}
|
||||||
|
@ -180,8 +199,9 @@ impl InterfacePage for CrashAnalyzerUI {
|
||||||
ui.label(format!("Bytes read: {}", bytes_written));
|
ui.label(format!("Bytes read: {}", bytes_written));
|
||||||
}
|
}
|
||||||
ReadState::Completed => {
|
ReadState::Completed => {
|
||||||
|
let saved= self.save_path.read().unwrap().clone().unwrap();
|
||||||
ui.label(
|
ui.label(
|
||||||
RichText::new("Coredump ELF saved as dump.elf!")
|
RichText::new(format!("Coredump ELF saved as {}dump.elf!", saved))
|
||||||
.color(Color32::from_rgb(0, 255, 0)),
|
.color(Color32::from_rgb(0, 255, 0)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue