Compare commits

...

3 Commits

Author SHA1 Message Date
Astro b3e9a1b636 init_log: set USB_LOGGER max level 2020-09-24 23:11:23 +02:00
Astro bfbf037006 config: add load/save code 2020-09-24 23:10:47 +02:00
Astro a1ad9b2456 main: load config from eeprom on boot 2020-09-24 23:08:42 +02:00
3 changed files with 36 additions and 7 deletions

View File

@ -51,12 +51,39 @@ impl Config {
} }
} }
pub fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], postcard::Error> { /// apply loaded config to system
to_slice(self, buffer) pub fn apply(&self, channels: &mut Channels) {
for i in 0..CHANNELS {
self.channels[i].apply(channels, i);
}
} }
pub fn decode(buffer: &[u8]) -> Result<Self, postcard::Error> { pub fn load(eeprom: &mut pins::Eeprom) -> Result<Self, Error> {
from_bytes(buffer) let mut buffer = [0; EEPROM_SIZE];
eeprom.read_data(0, &mut buffer)?;
log::info!("load: {:?}", buffer);
let config = from_bytes(&mut buffer)?;
Ok(config)
}
pub fn save(&self, eeprom: &mut pins::Eeprom) -> Result<(), Error> {
let mut buffer = [0; EEPROM_SIZE];
let config_buffer = to_slice(self, &mut buffer)?;
log::info!("save: {:?}", config_buffer);
let mut addr = 0;
for chunk in config_buffer.chunks(EEPROM_PAGE_SIZE) {
'write_retry: loop {
match eeprom.write_page(addr, chunk) {
Ok(()) => break 'write_retry,
Err(eeprom24x::Error::I2C(i2c::Error::NACK)) => {},
Err(e) => Err(e)?,
}
}
addr += chunk.len() as u32;
}
Ok(())
} }
} }

View File

@ -1,11 +1,10 @@
use crate::usb; use crate::usb;
#[cfg(not(feature = "semihosting"))]
static USB_LOGGER: usb::Logger = usb::Logger;
#[cfg(not(feature = "semihosting"))] #[cfg(not(feature = "semihosting"))]
pub fn init_log() { pub fn init_log() {
static USB_LOGGER: usb::Logger = usb::Logger;
let _ = log::set_logger(&USB_LOGGER); let _ = log::set_logger(&USB_LOGGER);
log::set_max_level(log::LevelFilter::Info);
} }
#[cfg(feature = "semihosting")] #[cfg(feature = "semihosting")]

View File

@ -124,6 +124,9 @@ fn main() -> ! {
usb::State::setup(usb); usb::State::setup(usb);
let mut channels = Channels::new(pins); let mut channels = Channels::new(pins);
let _ = Config::load(&mut eeprom)
.map(|config| config.apply(&mut channels))
.map_err(|e| warn!("error loading config: {:?}", e));
// EEPROM ships with a read-only EUI-48 identifier // EEPROM ships with a read-only EUI-48 identifier
let mut eui48 = [0; 6]; let mut eui48 = [0; 6];