1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
pub struct FlashProgress {
    handler: Box<dyn Fn(ProgressEvent)>,
}

impl FlashProgress {
    pub fn new(handler: impl Fn(ProgressEvent) + 'static) -> Self {
        Self {
            handler: Box::new(handler),
        }
    }

    pub fn emit(&self, event: ProgressEvent) {
        (self.handler)(event);
    }

    pub fn initialized(&self, total_pages: usize, total_sector_size: usize, page_size: u32) {
        self.emit(ProgressEvent::Initialized {
            total_pages,
            total_sector_size,
            page_size,
        });
    }

    pub fn started_flashing(&self) {
        self.emit(ProgressEvent::StartedFlashing);
    }

    pub fn started_erasing(&self) {
        self.emit(ProgressEvent::StartedErasing);
    }

    pub fn page_programmed(&self, size: u32, time: u128) {
        self.emit(ProgressEvent::PageFlashed { size, time });
    }

    pub fn sector_erased(&self, size: u32, time: u128) {
        self.emit(ProgressEvent::SectorErased { size, time });
    }

    pub fn finished_programming(&self) {
        self.emit(ProgressEvent::FinishedProgramming);
    }

    pub fn finished_erasing(&self) {
        self.emit(ProgressEvent::FinishedErasing);
    }
}

pub enum ProgressEvent {
    Initialized {
        total_pages: usize,
        total_sector_size: usize,
        page_size: u32,
    },
    StartedFlashing,
    StartedErasing,
    PageFlashed {
        size: u32,
        time: u128,
    },
    SectorErased {
        size: u32,
        time: u128,
    },
    FinishedProgramming,
    FinishedErasing,
}