mirror of
https://github.com/esp-rs/esp-hal.git
synced 2025-09-28 21:00:59 +00:00
feat(esp-wifi): add Country Code (#3837)
* feat(esp-wifi): add Country Code * fix: fmt, changelog * fix: cast * chore: cargo xtask fmt-packages * chore: remove example * fix: use Option<[u8;2]> for country code * fix: return Some * Use an opaque type --------- Co-authored-by: Dániel Buga <bugadani@gmail.com>
This commit is contained in:
parent
af6ffb102f
commit
c4c8d1d5b9
@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- `AccessPointInfo::country` to access the Country Code from the Wi-Fi scan results (#3837)
|
||||||
|
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
@ -217,6 +217,49 @@ pub enum SecondaryChannel {
|
|||||||
Below,
|
Below,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Access point country information.
|
||||||
|
#[derive(Clone, Debug, Default, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
|
||||||
|
pub struct Country([u8; 2]);
|
||||||
|
|
||||||
|
impl Country {
|
||||||
|
fn try_from_c(info: &wifi_country_t) -> Option<Self> {
|
||||||
|
// Find the null terminator or end of array
|
||||||
|
let cc_len = info
|
||||||
|
.cc
|
||||||
|
.iter()
|
||||||
|
.position(|&b| b == 0)
|
||||||
|
.unwrap_or(info.cc.len());
|
||||||
|
|
||||||
|
if cc_len < 2 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate that we have at least 2 valid ASCII characters
|
||||||
|
let cc_slice = &info.cc[..cc_len.min(2)];
|
||||||
|
if cc_slice.iter().all(|&b| b.is_ascii_uppercase()) {
|
||||||
|
Some(Self([cc_slice[0], cc_slice[1]]))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the country code as a string slice.
|
||||||
|
pub fn country_code(&self) -> &str {
|
||||||
|
unsafe {
|
||||||
|
// SAFETY: we have verified in the constructor that the bytes are upper-case ASCII.
|
||||||
|
core::str::from_utf8_unchecked(&self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "defmt")]
|
||||||
|
impl defmt::Format for Country {
|
||||||
|
fn format(&self, fmt: defmt::Formatter<'_>) {
|
||||||
|
self.country_code().format(fmt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Information about a detected Wi-Fi access point.
|
/// Information about a detected Wi-Fi access point.
|
||||||
#[derive(Clone, Debug, Default, PartialEq, Eq)]
|
#[derive(Clone, Debug, Default, PartialEq, Eq)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
@ -241,6 +284,9 @@ pub struct AccessPointInfo {
|
|||||||
|
|
||||||
/// The authentication method used by the access point.
|
/// The authentication method used by the access point.
|
||||||
pub auth_method: Option<AuthMethod>,
|
pub auth_method: Option<AuthMethod>,
|
||||||
|
|
||||||
|
/// The country information of the access point (if available from beacon frames).
|
||||||
|
pub country: Option<Country>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Configuration for a Wi-Fi access point.
|
/// Configuration for a Wi-Fi access point.
|
||||||
@ -1851,6 +1897,7 @@ fn convert_ap_info(record: &include::wifi_ap_record_t) -> AccessPointInfo {
|
|||||||
},
|
},
|
||||||
signal_strength: record.rssi,
|
signal_strength: record.rssi,
|
||||||
auth_method: Some(AuthMethod::from_raw(record.authmode)),
|
auth_method: Some(AuthMethod::from_raw(record.authmode)),
|
||||||
|
country: Country::try_from_c(&record.country),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user