diff --git a/ctru-rs/Cargo.toml b/ctru-rs/Cargo.toml index 29323b44..dd848dd7 100644 --- a/ctru-rs/Cargo.toml +++ b/ctru-rs/Cargo.toml @@ -15,7 +15,7 @@ ctru-sys = { path = "../ctru-sys", version = "0.4" } const-zero = "0.1.0" linker-fix-3ds = { git = "https://github.com/Meziu/rust-linker-fix-3ds.git" } pthread-3ds = { git = "https://github.com/Meziu/pthread-3ds.git" } -libc = { git = "https://github.com/Meziu/libc.git" } +libc = "0.2" bitflags = "1.0.0" widestring = "0.2.2" diff --git a/ctru-rs/examples/time_rtc.rs b/ctru-rs/examples/time_rtc.rs new file mode 100644 index 00000000..f28159f1 --- /dev/null +++ b/ctru-rs/examples/time_rtc.rs @@ -0,0 +1,116 @@ +use ctru::console::Console; +use ctru::gfx::Gfx; +use ctru::services::apt::Apt; +use ctru::services::hid::{Hid, KeyPad}; + +const MONTHS: [&str; 12] = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +const WEEKDAYS: [&str; 7] = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", +]; + +const MONTH_TO_WEEKDAY_TABLE: [i32; 12] = [ + 0 % 7, //january 31 + 31 % 7, //february 28+1(leap year) + 59 % 7, //march 31 + 90 % 7, //april 30 + 120 % 7, //may 31 + 151 % 7, //june 30 + 181 % 7, //july 31 + 212 % 7, //august 31 + 243 % 7, //september 30 + 273 % 7, //october 31 + 304 % 7, //november 30 + 334 % 7, //december 3 +]; + +fn is_leap_year(year: i32) -> bool { + year % 4 == 0 && !(year % 100 == 0 && year % 400 != 0) +} + +/// +fn get_day_of_week(mut day: i32, month: usize, mut year: i32) -> usize { + day += 2 * (3 - ((year / 100) % 4)); + year %= 100; + day += year + (year / 4); + day += MONTH_TO_WEEKDAY_TABLE[month] + - if is_leap_year(year) && month <= 1 { + 1 + } else { + 0 + }; + (day % 7).try_into().expect("day is not valid usize") +} + +fn main() { + ctru::init(); + + let gfx = Gfx::default(); + let hid = Hid::init().expect("Couldn't obtain HID controller"); + let apt = Apt::init().expect("Couldn't obtain APT controller"); + + let _console = Console::init(gfx.top_screen.borrow_mut()); + + print!("\x1b[30;16HPress Start to exit."); + + // Main loop + while apt.main_loop() { + // Scan all the inputs. This should be done once for each frame + hid.scan_input(); + + if hid.keys_down().contains(KeyPad::KEY_START) { + break; + } + + // Get the current time. ctru_sys bindings should be used rather than + // plain libc ones, for reasons I don't understand yet... + let unix_time: ctru_sys::time_t = unsafe { ctru_sys::time(std::ptr::null_mut()) }; + let time = unsafe { *ctru_sys::gmtime(&unix_time as *const _) }; + + let hours = time.tm_hour; + let minutes = time.tm_min; + let seconds = time.tm_sec; + let day = time.tm_mday; + let month = time.tm_mon; + let year = time.tm_year + 1900; + + let month: usize = month.try_into().expect("month is not valid usize"); + + println!("\x1b[1;1H{:0>2}:{:0>2}:{:0>2}", hours, minutes, seconds); + print!( + "{} {} {} {}", + WEEKDAYS + .get(get_day_of_week(day, month, year)) + .expect("invalid weekday"), + MONTHS[month], + day, + year + ); + + // Flush and swap framebuffers + gfx.flush_buffers(); + gfx.swap_buffers(); + + //Wait for VBlank + gfx.wait_for_vblank(); + } +}