pub mod code;
pub mod qr;
pub mod vendor_identifiers;
use log::info;
use verhoeff::Verhoeff;
use crate::{
codec::base38, data_model::cluster_basic_information::BasicInfoConfig, error::Error,
secure_channel::spake2p::VerifierOption, CommissioningData,
};
use self::{
code::{compute_pairing_code, pretty_print_pairing_code},
qr::{compute_qr_code, print_qr_code},
};
pub struct DiscoveryCapabilities {
on_ip_network: bool,
ble: bool,
soft_access_point: bool,
}
impl DiscoveryCapabilities {
pub fn new(on_ip_network: bool, ble: bool, soft_access_point: bool) -> Self {
DiscoveryCapabilities {
on_ip_network,
ble,
soft_access_point,
}
}
pub fn has_value(&self) -> bool {
self.on_ip_network || self.ble || self.soft_access_point
}
}
impl Default for DiscoveryCapabilities {
fn default() -> Self {
DiscoveryCapabilities {
on_ip_network: true,
ble: false,
soft_access_point: false,
}
}
}
impl DiscoveryCapabilities {
fn as_bits(&self) -> u8 {
let mut bits = 0;
if self.soft_access_point {
bits |= 1 << 0;
}
if self.ble {
bits |= 1 << 1;
}
if self.on_ip_network {
bits |= 1 << 2;
}
bits
}
}
pub fn print_pairing_code_and_qr(
dev_det: &BasicInfoConfig,
comm_data: &CommissioningData,
discovery_capabilities: DiscoveryCapabilities,
buf: &mut [u8],
) -> Result<(), Error> {
let pairing_code = compute_pairing_code(comm_data);
let qr_code = compute_qr_code(dev_det, comm_data, discovery_capabilities, buf)?;
pretty_print_pairing_code(&pairing_code);
print_qr_code(qr_code);
Ok(())
}
fn passwd_from_comm_data(comm_data: &CommissioningData) -> u32 {
match comm_data.verifier.data {
VerifierOption::Password(pwd) => pwd,
VerifierOption::Verifier(_) => 0,
}
}