A personal rust firmware for the Badger 2040 W

I think the time and all that is working now

Changed files
+83 -32
src
+1 -1
Cargo.toml
··· 106 106 debug = 2 107 107 108 108 [profile.dev] 109 - debug = 1 109 + debug = 2 110 110 lto = true 111 111 opt-level = "z" 112 112
+58 -13
src/main.rs
··· 9 9 use core::cell::RefCell; 10 10 use core::fmt::Write; 11 11 use core::str::from_utf8; 12 + use cortex_m::asm::delay; 12 13 use cyw43::JoinOptions; 13 14 use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi}; 14 15 use defmt::info; 15 16 use defmt::*; 17 + use embassy_embedded_hal::shared_bus::I2cDeviceError; 16 18 use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice; 17 19 use embassy_executor::Spawner; 18 20 use embassy_net::StackResources; ··· 21 23 use embassy_rp::clocks::RoscRng; 22 24 use embassy_rp::flash::Async; 23 25 use embassy_rp::gpio::Input; 24 - use embassy_rp::i2c::I2c; 26 + use embassy_rp::i2c::{Error, I2c}; 25 27 use embassy_rp::peripherals::{DMA_CH0, I2C0, PIO0, SPI0}; 26 28 use embassy_rp::pio::{InterruptHandler, Pio}; 27 29 use embassy_rp::rtc::{DateTime, DayOfWeek}; ··· 181 183 wifi_connection_attempts += 1; 182 184 } 183 185 186 + //Setup i2c bus 187 + let config = embassy_rp::i2c::Config::default(); 188 + let i2c = i2c::I2c::new_blocking(p.I2C0, p.PIN_5, p.PIN_4, config); 189 + static I2C_BUS: StaticCell<I2c0Bus> = StaticCell::new(); 190 + let i2c_bus = NoopMutex::new(RefCell::new(i2c)); 191 + let i2c_bus = I2C_BUS.init(i2c_bus); 192 + 193 + let i2c_dev = I2cDevice::new(i2c_bus); 194 + let mut rtc_device = PCF85063::new(i2c_dev); 195 + 184 196 let mut time_was_set = false; 185 197 if connected_to_wifi { 186 198 info!("waiting for DHCP..."); ··· 212 224 &mut tls_write_buffer, 213 225 TlsVerify::None, 214 226 ); 227 + 228 + Timer::after(Duration::from_millis(500)).await; 215 229 // let mut http_client = HttpClient::new(&tcp_client, &dns_client); 216 230 let mut http_client = HttpClient::new_with_tls(&tcp_client, &dns_client, tls_config); 217 231 ··· 276 290 minute, 277 291 second: second as u8, 278 292 }; 279 - rtc.set_datetime(rtc_time).unwrap(); 293 + 294 + // // prepare date and time to be set 295 + // let now = DateTime { 296 + // year: 21, // 2021 297 + // month: 4, // April 298 + // weekday: 0, // Sunday 299 + // day: 4, 300 + // day_of_week: DayOfWeek::Sunday, 301 + // hour, 302 + // minute, 303 + // hours: 16, 304 + // minutes: 52, 305 + // seconds: 00, 306 + // second: 0, 307 + // }; 308 + 309 + rtc_device 310 + .set_datetime(&rtc_time) 311 + .expect("TODO: panic message"); 312 + // rtc.set_datetime(rtc_time).unwrap(); 280 313 time_was_set = true; 281 314 let _ = control.leave().await; 282 315 } ··· 295 328 296 329 //Set up saving 297 330 let mut flash = embassy_rp::flash::Flash::<_, Async, FLASH_SIZE>::new(p.FLASH, p.DMA_CH3); 298 - let mut save: Save = read_postcard_from_flash(ADDR_OFFSET, &mut flash, SAVE_OFFSET).unwrap(); 331 + //TODO baaaaaad 332 + let mut save = 333 + read_postcard_from_flash(ADDR_OFFSET, &mut flash, SAVE_OFFSET).unwrap_or_else(|err| { 334 + error!("Error getting the save from the flash: {:?}", err); 335 + Save::new() 336 + }); 299 337 WIFI_COUNT.store(save.wifi_counted, core::sync::atomic::Ordering::Relaxed); 300 - 301 - //Setup i2c bus 302 - let config = embassy_rp::i2c::Config::default(); 303 - let i2c = i2c::I2c::new_blocking(p.I2C0, p.PIN_5, p.PIN_4, config); 304 - static I2C_BUS: StaticCell<I2c0Bus> = StaticCell::new(); 305 - let i2c_bus = NoopMutex::new(RefCell::new(i2c)); 306 - let i2c_bus = I2C_BUS.init(i2c_bus); 307 - 308 - let i2c_dev = I2cDevice::new(i2c_bus); 309 - let mut rtc_device = PCF85063::new(i2c_dev); 310 338 311 339 //Task spawning 312 340 spawner.must_spawn(run_the_temp_sensor(i2c_bus)); ··· 322 350 user_led.set_low(); 323 351 324 352 loop { 353 + //TODO take out 354 + Timer::after(Duration::from_millis(5_000)).await; 355 + 356 + let time = rtc_device.get_datetime().unwrap(); 357 + info!("Hour: {:?}", time.hour()); 358 + info!("Minute: {:?}", time.minute()); 359 + info!("Second: {:?}", time.second()); 360 + 361 + // match rtc_device.get_datetime() { 362 + // Ok(time) => { 363 + // info!("RTC time: {:?}", time.as_utc().time().minute()); 364 + // } 365 + // Err(err) => { 366 + // error!("Error reading rtc"); 367 + // } 368 + // } 369 + 325 370 //Change Image Button 326 371 if btn_c.is_high() { 327 372 info!("Button C pressed");
+12 -14
src/pcf85063a/datetime.rs
··· 7 7 //! a convenient set_time() function could be added (sets only seconds, minutes and hours) 8 8 9 9 use super::{DEVICE_ADDRESS, Error, PCF85063, Register, decode_bcd, encode_bcd}; 10 + use embassy_rp::rtc::DateTime; 10 11 use embedded_hal_1::i2c::I2c; 11 12 use time::{Date, PrimitiveDateTime, Time}; 12 13 ··· 36 37 } 37 38 38 39 /// Set date and time all at once. 39 - pub fn set_datetime(&mut self, datetime: &PrimitiveDateTime) -> Result<(), Error<E>> { 40 + pub fn set_datetime(&mut self, datetime: &DateTime) -> Result<(), Error<E>> { 40 41 let payload = [ 41 42 Register::SECONDS, //first register 42 - encode_bcd(datetime.second()), 43 - encode_bcd(datetime.minute()), 44 - encode_bcd(datetime.hour()), 45 - encode_bcd(datetime.day()), 46 - encode_bcd(datetime.weekday().number_days_from_sunday()), 47 - encode_bcd(datetime.month().into()), 48 - encode_bcd((datetime.year() - 2000) as u8), 43 + encode_bcd(datetime.second), 44 + encode_bcd(datetime.minute), 45 + encode_bcd(datetime.hour), 46 + encode_bcd(datetime.day), 47 + //Not sure if this is correct 48 + encode_bcd(datetime.day_of_week as u8), 49 + encode_bcd(datetime.month), 50 + encode_bcd((datetime.year - 2000) as u8), 49 51 ]; 50 - self.i2c 51 - .write(DEVICE_ADDRESS, &payload) 52 - .map_err(Error::I2C) 52 + self.i2c.write(DEVICE_ADDRESS, &payload).map_err(Error::I2C) 53 53 } 54 54 55 55 /// Set only the time, date remains unchanged. ··· 62 62 encode_bcd(time.minute()), 63 63 encode_bcd(time.hour()), 64 64 ]; 65 - self.i2c 66 - .write(DEVICE_ADDRESS, &payload) 67 - .map_err(Error::I2C) 65 + self.i2c.write(DEVICE_ADDRESS, &payload).map_err(Error::I2C) 68 66 } 69 67 }
+3 -4
src/pcf85063a/mod.rs
··· 1 - #![no_std] 2 - 3 - mod alarm; 4 - mod datetime; 1 + #![allow(dead_code)] 2 + pub mod alarm; 3 + pub mod datetime; 5 4 6 5 use embedded_hal_1::i2c::I2c; 7 6
+9
src/save.rs
··· 60 60 pub wifi_counted: u32, 61 61 pub bssid: Vec<String<17>, BSSID_LEN>, 62 62 } 63 + 64 + impl Save { 65 + pub fn new() -> Self { 66 + Self { 67 + wifi_counted: 0, 68 + bssid: Vec::new(), 69 + } 70 + } 71 + }