Lena
1 year ago
committed by
Lena
3 changed files with 214 additions and 0 deletions
@ -0,0 +1,43 @@ |
|||||||
|
//! Wi-Fi info example
|
||||||
|
//!
|
||||||
|
//! This example prints out all the info about the console's network, like SSID, security, proxy info...
|
||||||
|
|
||||||
|
use ctru::{prelude::*, services::ac::Ac}; |
||||||
|
|
||||||
|
fn main() { |
||||||
|
ctru::use_panic_handler(); |
||||||
|
|
||||||
|
let gfx = Gfx::new().expect("Couldn't obtain GFX controller"); |
||||||
|
let mut hid = Hid::new().expect("Couldn't obtain HID controller"); |
||||||
|
let apt = Apt::new().expect("Couldn't obtain APT controller"); |
||||||
|
|
||||||
|
let _console = Console::new(gfx.top_screen.borrow_mut()); |
||||||
|
|
||||||
|
let mut ac = Ac::new().expect("Couldn't get an AC handle"); |
||||||
|
|
||||||
|
print_network_info(&ac).expect("Error while gathering network info"); |
||||||
|
println!("Press START to exit."); |
||||||
|
|
||||||
|
while apt.main_loop() { |
||||||
|
hid.scan_input(); |
||||||
|
|
||||||
|
if hid.keys_down().contains(KeyPad::START) { |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
gfx.wait_for_vblank(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn print_network_info(ac: &Ac) -> ctru::Result<()> { |
||||||
|
let connected = ac.get_wifi_status()?; |
||||||
|
println!("Wi-Fi connected: {}", connected); |
||||||
|
|
||||||
|
// Some methods error out if the console isn't connected
|
||||||
|
if connected { |
||||||
|
println!("Wi-Fi SSID: {}", ac.get_wifi_ssid()?); |
||||||
|
println!("Wi-Fi security: {:?}", ac.get_wifi_security()?); |
||||||
|
} |
||||||
|
|
||||||
|
Ok(()) |
||||||
|
} |
@ -0,0 +1,170 @@ |
|||||||
|
use crate::error::ResultCode; |
||||||
|
use std::ffi::CString; |
||||||
|
use std::io::Write; |
||||||
|
use std::marker::PhantomData; |
||||||
|
pub struct Ac(()); |
||||||
|
|
||||||
|
impl Ac { |
||||||
|
/// Initialize a new service handle.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # let _runner = test_runner::GdbRunner::default();
|
||||||
|
/// # use std::error::Error;
|
||||||
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
/// #
|
||||||
|
/// use ctru::services::ac::Ac;
|
||||||
|
///
|
||||||
|
/// let ac = Ac::new()?;
|
||||||
|
/// #
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
#[doc(alias = "acInit")] |
||||||
|
pub fn new() -> crate::Result<Ac> { |
||||||
|
unsafe { |
||||||
|
ResultCode(ctru_sys::acInit())?; |
||||||
|
Ok(Ac(())) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Waits for an internet connection
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # let _runner = test_runner::GdbRunner::default();
|
||||||
|
/// # use std::error::Error;
|
||||||
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
/// #
|
||||||
|
/// use ctru::services::ac::Ac;
|
||||||
|
///
|
||||||
|
/// let ac = Ac::new()?;
|
||||||
|
///
|
||||||
|
/// println!("Waiting for an internet connection...");
|
||||||
|
/// ac.wait_for_internet_connection()?;
|
||||||
|
/// println!("Connected.");
|
||||||
|
/// #
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
#[doc(alias = "acWaitInternetConnection")] |
||||||
|
pub fn wait_internet_connection(&self) -> crate::Result<()> { |
||||||
|
unsafe { |
||||||
|
ResultCode(ctru_sys::acWaitInternetConnection())?; |
||||||
|
|
||||||
|
Ok(()) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Returns whether the console is connected to Wi-Fi
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # let _runner = test_runner::GdbRunner::default();
|
||||||
|
/// # use std::error::Error;
|
||||||
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
/// #
|
||||||
|
/// use ctru::services::ac::Ac;
|
||||||
|
///
|
||||||
|
/// let ac = Ac::new()?;
|
||||||
|
///
|
||||||
|
/// println!("Wi-Fi connected: {}", ac.get_wifi_status()?);
|
||||||
|
/// #
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
#[doc(alias = "ACU_GetWifiStatus")] |
||||||
|
pub fn get_wifi_status(&self) -> crate::Result<bool> { |
||||||
|
unsafe { |
||||||
|
let mut ret = 0u32; |
||||||
|
ResultCode(ctru_sys::ACU_GetStatus(&mut ret))?; |
||||||
|
|
||||||
|
Ok(ret == 3) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Returns whether the console is connected to Wi-Fi
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # let _runner = test_runner::GdbRunner::default();
|
||||||
|
/// # use std::error::Error;
|
||||||
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
/// #
|
||||||
|
/// use ctru::services::ac::Ac;
|
||||||
|
///
|
||||||
|
/// let ac = Ac::new()?;
|
||||||
|
///
|
||||||
|
/// #
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
#[doc(alias = "ACU_GetWifiSecurityMode")] |
||||||
|
pub fn get_wifi_security(&self) -> crate::Result<SecurityMode> { |
||||||
|
unsafe { |
||||||
|
let mut ret = 0u32; |
||||||
|
ResultCode(ctru_sys::ACU_GetSecurityMode(&mut ret))?; |
||||||
|
// fix this, for some reason the bindings have the type as a struct and not enum
|
||||||
|
// and so i can't impl TryFrom automatically
|
||||||
|
Ok(std::mem::transmute(ret)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Returns the SSID of the Wi-Fi network the console is connected to, or error if the console isn't connected to any network.
|
||||||
|
///
|
||||||
|
/// You can check if the console is connected to a network using [`Self::get_wifi_status()`]
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// # let _runner = test_runner::GdbRunner::default();
|
||||||
|
/// # use std::error::Error;
|
||||||
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
/// #
|
||||||
|
/// use ctru::services::ac::Ac;
|
||||||
|
///
|
||||||
|
/// let ac = Ac::new()?;
|
||||||
|
///
|
||||||
|
/// println!("The console is connected to the network \"{}\"", ac.get_wifi_ssid().unwrap())
|
||||||
|
/// #
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
#[doc(alias = "ACU_GetSSID")] |
||||||
|
pub fn get_wifi_ssid(&self) -> crate::Result<String> { |
||||||
|
unsafe { |
||||||
|
let mut len = 0u32; |
||||||
|
ResultCode(ctru_sys::ACU_GetSSIDLength(&mut len))?; |
||||||
|
// we don't really need space for the terminator
|
||||||
|
let mut vec: Vec<u8> = vec![0u8; len as usize]; |
||||||
|
ResultCode(ctru_sys::ACU_GetSSID(vec.as_mut_ptr()))?; |
||||||
|
// how do i handle this error?
|
||||||
|
Ok(String::from_utf8(vec).unwrap()) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Drop for Ac { |
||||||
|
#[doc(alias = "acExit")] |
||||||
|
fn drop(&mut self) { |
||||||
|
unsafe { ctru_sys::acExit() }; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[doc(alias = "acSecurityMode")] |
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)] |
||||||
|
#[repr(u32)] |
||||||
|
pub enum SecurityMode { |
||||||
|
Open = 0, |
||||||
|
WEP40Bit = 1, |
||||||
|
WEP104Bit = 2, |
||||||
|
WEP128Bit = 3, |
||||||
|
WPA_TKIP = 4, |
||||||
|
WPA2_TKIP = 5, |
||||||
|
WPA_AES = 6, |
||||||
|
WPA2_AES = 7 |
||||||
|
} |
Loading…
Reference in new issue