60 lines
1.7 KiB
Rust
60 lines
1.7 KiB
Rust
use super::*;
|
|
|
|
pub(super) fn compute_pairing_code(comm_data: &CommissioningData) -> String {
|
|
// 0: no Vendor ID and Product ID present in Manual Pairing Code
|
|
const VID_PID_PRESENT: u8 = 0;
|
|
|
|
let CommissioningData {
|
|
discriminator,
|
|
passwd,
|
|
..
|
|
} = comm_data;
|
|
|
|
let mut digits = String::new();
|
|
digits.push_str(&((VID_PID_PRESENT << 2) | (discriminator >> 10) as u8).to_string());
|
|
digits.push_str(&format!(
|
|
"{:0>5}",
|
|
((discriminator & 0x300) << 6) | (passwd & 0x3FFF) as u16
|
|
));
|
|
digits.push_str(&format!("{:0>4}", passwd >> 14));
|
|
|
|
let check_digit = digits.calculate_verhoeff_check_digit();
|
|
digits.push_str(&check_digit.to_string());
|
|
|
|
digits
|
|
}
|
|
|
|
pub(super) fn pretty_print_pairing_code(pairing_code: &str) {
|
|
assert!(pairing_code.len() == 11);
|
|
let mut pretty = String::new();
|
|
pretty.push_str(&pairing_code[..4]);
|
|
pretty.push('-');
|
|
pretty.push_str(&pairing_code[4..8]);
|
|
pretty.push('-');
|
|
pretty.push_str(&pairing_code[8..]);
|
|
info!("Pairing Code: {}", pretty);
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn can_compute_pairing_code() {
|
|
let comm_data = CommissioningData {
|
|
passwd: 123456,
|
|
discriminator: 250,
|
|
..Default::default()
|
|
};
|
|
let pairing_code = compute_pairing_code(&comm_data);
|
|
assert_eq!(pairing_code, "00876800071");
|
|
|
|
let comm_data = CommissioningData {
|
|
passwd: 34567890,
|
|
discriminator: 2976,
|
|
..Default::default()
|
|
};
|
|
let pairing_code = compute_pairing_code(&comm_data);
|
|
assert_eq!(pairing_code, "26318621095");
|
|
}
|
|
}
|