use super::FlashLayout;
use std::{sync::Arc, time::Duration};
#[derive(Clone)]
pub struct FlashProgress {
handler: Arc<dyn Fn(ProgressEvent)>,
}
impl FlashProgress {
pub fn new(handler: impl Fn(ProgressEvent) + 'static) -> Self {
Self {
handler: Arc::new(handler),
}
}
pub fn empty() -> Self {
Self {
handler: Arc::new(|_| {}),
}
}
fn emit(&self, event: ProgressEvent) {
(self.handler)(event);
}
pub(super) fn initialized(
&self,
chip_erase: bool,
restore_unwritten: bool,
phases: Vec<FlashLayout>,
) {
self.emit(ProgressEvent::Initialized {
chip_erase,
restore_unwritten,
phases,
});
}
pub(super) fn started_erasing(&self) {
self.emit(ProgressEvent::StartedErasing);
}
pub(super) fn started_filling(&self) {
self.emit(ProgressEvent::StartedFilling);
}
pub(super) fn started_programming(&self, length: u64) {
self.emit(ProgressEvent::StartedProgramming { length });
}
pub(super) fn page_programmed(&self, size: u32, time: Duration) {
self.emit(ProgressEvent::PageProgrammed { size, time });
}
pub(super) fn sector_erased(&self, size: u64, time: Duration) {
self.emit(ProgressEvent::SectorErased { size, time });
}
pub(super) fn page_filled(&self, size: u64, time: Duration) {
self.emit(ProgressEvent::PageFilled { size, time });
}
pub(super) fn failed_programming(&self) {
self.emit(ProgressEvent::FailedProgramming);
}
pub(super) fn finished_programming(&self) {
self.emit(ProgressEvent::FinishedProgramming);
}
pub(super) fn failed_erasing(&self) {
self.emit(ProgressEvent::FailedErasing);
}
pub(super) fn finished_erasing(&self) {
self.emit(ProgressEvent::FinishedErasing);
}
pub(super) fn failed_filling(&self) {
self.emit(ProgressEvent::FailedFilling);
}
pub(super) fn finished_filling(&self) {
self.emit(ProgressEvent::FinishedFilling);
}
pub(super) fn message(&self, message: String) {
self.emit(ProgressEvent::DiagnosticMessage { message });
}
}
#[derive(Debug)]
pub enum ProgressEvent {
Initialized {
chip_erase: bool,
phases: Vec<FlashLayout>,
restore_unwritten: bool,
},
StartedFilling,
PageFilled {
size: u64,
time: Duration,
},
FailedFilling,
FinishedFilling,
StartedErasing,
SectorErased {
size: u64,
time: Duration,
},
FailedErasing,
FinishedErasing,
StartedProgramming {
length: u64,
},
PageProgrammed {
size: u32,
time: Duration,
},
FailedProgramming,
FinishedProgramming,
DiagnosticMessage {
message: String,
},
}