diff --git a/src/drivers/rtc.rs b/src/drivers/rtc.rs index 8b13789..525e551 100644 --- a/src/drivers/rtc.rs +++ b/src/drivers/rtc.rs @@ -1 +1,28 @@ +pub async fn rtc_config(i2c: I2c<'static, Async>) -> DS3231> { + let mut rtc: DS3231> = DS3231::new(i2c, RTC_ADDRESS); + let daily_alarm = Alarm1Config::AtTime { + hours: 0, // set alarm every day 00:00:00 to sync time + minutes: 0, + seconds: 0, + is_pm: None, // 24-hour mode + }; + if let Err(e) = rtc.set_alarm1(&daily_alarm).await { + error!("Failed to configure RTC: {:?}", e); + panic!(); + } + rtc +} + +pub async fn read_rtc_time<'a>(rtc: &'a mut DS3231>) -> Result> { + match rtc.datetime().await { + Ok(datetime) => { + let utc_time = datetime.and_utc().timestamp() as u64; + Ok(utc_time) + } + Err(e) => { + error!("Failed to read RTC datetime: {:?}", e); + Err(e) + } + } +} \ No newline at end of file diff --git a/src/init/hardware.rs b/src/init/hardware.rs index e6863b3..ee59444 100644 --- a/src/init/hardware.rs +++ b/src/init/hardware.rs @@ -23,6 +23,19 @@ use log::error; use crate::init::wifi; use crate::init::network; +/************************************************* + * GPIO Pinout Xiao Esp32c6 + * + * D0 -> Level Shifter OE + * D1 -> Level Shifter A0 -> LED + * D3 -> SQW Interrupt RTC + * D4 -> SDA + * D5 -> SCL + * D7 -> Level Shifter A1 -> NFC Reader + * D8 -> Buzzer + * + */ + const RTC_ADDRESS: u8 = 0x57; #[panic_handler] @@ -110,34 +123,6 @@ pub async fn rtc_init_iterrupt(sqw_pin: GPIO21<'static>) -> Input<'static> { sqw_interrupt } -pub async fn rtc_config(i2c: I2c<'static, Async>) -> DS3231> { - let mut rtc: DS3231> = DS3231::new(i2c, RTC_ADDRESS); - let daily_alarm = Alarm1Config::AtTime { - hours: 0, // set alarm every day 00:00:00 to sync time - minutes: 0, - seconds: 0, - is_pm: None, // 24-hour mode - }; - if let Err(e) = rtc.set_alarm1(&daily_alarm).await { - error!("Failed to configure RTC: {:?}", e); - panic!(); - } - rtc -} - -pub async fn read_rtc_time<'a>(rtc: &'a mut DS3231>) -> Result> { - match rtc.datetime().await { - Ok(datetime) => { - let utc_time = datetime.and_utc().timestamp() as u64; - Ok(utc_time) - } - Err(e) => { - error!("Failed to read RTC datetime: {:?}", e); - Err(e) - } - } -} - fn setup_spi_led() { diff --git a/src/main.rs b/src/main.rs index d396432..57db22a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -74,17 +74,17 @@ async fn rtc_task( sqw_pin: peripherals::GPIO21<'static>, ) { let mut rtc_interrupt = init::hardware::rtc_init_iterrupt(sqw_pin).await; - let mut rtc = init::hardware::rtc_config(i2c).await; + let mut rtc = drivers::rtc::rtc_config(i2c).await; let mut utc_time = UTC_TIME.lock().await; - let timestamp_result = init::hardware::read_rtc_time(&mut rtc).await; + let timestamp_result = drivers::rtc::read_rtc_time(&mut rtc).await; *utc_time = timestamp_result.unwrap_or(0); loop { rtc_interrupt.wait_for_falling_edge().await; debug!("RTC interrupt triggered"); utc_time = UTC_TIME.lock().await; - let timestamp_result = init::hardware::read_rtc_time(&mut rtc).await; + let timestamp_result = drivers::rtc::read_rtc_time(&mut rtc).await; *utc_time = timestamp_result.unwrap_or(0); } } \ No newline at end of file