use super::FlashLayout;
use std::time::Duration;
pub struct FlashProgress {
handler: Box<dyn Fn(ProgressEvent)>,
}
impl FlashProgress {
pub fn new(handler: impl Fn(ProgressEvent) + 'static) -> Self {
Self {
handler: Box::new(handler),
}
}
fn emit(&self, event: ProgressEvent) {
(self.handler)(event);
}
pub(super) fn initialized(&self, flash_layout: FlashLayout) {
self.emit(ProgressEvent::Initialized { flash_layout });
}
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) {
self.emit(ProgressEvent::StartedProgramming);
}
pub(super) fn page_programmed(&self, size: u32, time: Duration) {
self.emit(ProgressEvent::PageProgrammed { size, time });
}
pub(super) fn sector_erased(&self, size: u32, time: Duration) {
self.emit(ProgressEvent::SectorErased { size, time });
}
pub(super) fn page_filled(&self, size: u32, 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);
}
}
#[derive(Debug)]
pub enum ProgressEvent {
Initialized {
flash_layout: FlashLayout,
},
StartedFilling,
PageFilled {
size: u32,
time: Duration,
},
FailedFilling,
FinishedFilling,
StartedErasing,
SectorErased {
size: u32,
time: Duration,
},
FailedErasing,
FinishedErasing,
StartedProgramming,
PageProgrammed {
size: u32,
time: Duration,
},
FailedProgramming,
FinishedProgramming,
}