use heapless::{String, Vec};
pub const MAX_SSID_LEN: usize = 32;
pub const MAX_PASSWORD_LEN: usize = 63;
pub const MAX_SCAN_RESULTS: usize = 32;
pub const MAX_HOSTNAME_LEN: usize = 64;
pub const MAX_SOCKETS: usize = 8;
pub const MAX_SPI_XFER: usize = 4096;
pub type Ssid = String<MAX_SSID_LEN>;
pub type Password = String<MAX_PASSWORD_LEN>;
pub type Hostname = String<MAX_HOSTNAME_LEN>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum WiFiMode {
Station = 1,
AccessPoint = 2,
StationAp = 3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum WiFiSecurityType {
Open = 0,
Wep = 1,
WpaPsk = 2,
Wpa2Psk = 3,
WpaWpa2Psk = 4,
Wpa2Enterprise = 5,
Wpa3 = 6,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum WiFiState {
Uninitialized,
Disconnected,
Connecting,
Connected,
GotIp,
Disconnecting,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct ScanResult {
pub ssid: Ssid,
pub bssid: [u8; 6],
pub channel: u8,
pub rssi: i8,
pub security: WiFiSecurityType,
}
pub type ScanResults = Vec<ScanResult, MAX_SCAN_RESULTS>;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct ApConfig {
pub ssid: Ssid,
pub password: Password,
pub channel: u8,
pub security: WiFiSecurityType,
pub max_connections: u8,
}
impl Default for ApConfig {
fn default() -> Self {
Self {
ssid: Ssid::new(),
password: Password::new(),
channel: 1,
security: WiFiSecurityType::Wpa2Psk,
max_connections: 4,
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct StationInfo {
pub ip: Ipv4Address,
pub mac: MacAddress,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct Ipv4Address(pub [u8; 4]);
impl Ipv4Address {
pub const fn new(a: u8, b: u8, c: u8, d: u8) -> Self {
Self([a, b, c, d])
}
pub const fn octets(&self) -> [u8; 4] {
self.0
}
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct IpConfig {
pub ip: Ipv4Address,
pub gateway: Ipv4Address,
pub netmask: Ipv4Address,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum SocketProtocol {
Tcp,
Udp,
Ssl,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum SocketState {
Free,
Allocated,
Connecting,
Connected,
Closing,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct SocketId(pub u8);
impl SocketId {
pub const fn new(id: u8) -> Option<Self> {
if id < MAX_SOCKETS as u8 {
Some(Self(id))
} else {
None
}
}
pub const fn raw(&self) -> u8 {
self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum MqttQos {
AtMostOnce = 0,
AtLeastOnce = 1,
ExactlyOnce = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct MacAddress(pub [u8; 6]);
impl MacAddress {
pub const fn new(bytes: [u8; 6]) -> Self {
Self(bytes)
}
pub const fn as_bytes(&self) -> &[u8; 6] {
&self.0
}
}