use crate::flash::Page;
use std::fmt;
use std::ops::RangeInclusive;
#[derive(Debug)]
pub struct BootloaderInfo {
pub build_number: u32,
pub build_date: String,
pub application_base: u32,
pub application_size: usize,
pub version: Version,
pub identifier: String,
}
impl BootloaderInfo {
pub fn application_pages(&self) -> RangeInclusive<Page> {
Page::from_address(self.application_base)
..=Page::from_address(self.application_base + self.application_size as u32 - 1)
}
}
impl fmt::Display for BootloaderInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "Firmware version: {}", self.version)?;
writeln!(f, "Firmware build number: {}", self.build_number)?;
writeln!(f, "Firmware build date: {}", self.build_date)?;
writeln!(f, "Bootloader identifier: {}", self.identifier)?;
writeln!(
f,
"Application flash base address: 0x{:08x}",
self.application_base
)?;
writeln!(
f,
"Application flash size: {} KiB",
self.application_size / 1024
)
}
}
#[derive(Debug)]
pub struct Version {
pub major: u8,
pub minor: u8,
pub patch: u8,
}
impl fmt::Display for Version {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
}
}