blob: 16bb6ec599057e315c40515ab4140c34a1b7c295 [file] [log] [blame]
// Copyright 2023 Google LLC
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use crate::packet_encoding::{Encodable, Error as PacketError};
/// Represents the Advertising Set ID which is 1 byte long.
/// Follows little endian encoding.
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct AdvertisingSetId(pub u8);
impl AdvertisingSetId {
// Byte size if this is to be encoded.
pub const BYTE_SIZE: usize = 1;
}
/// Represents the SyncInfo Interval value which is 2 bytes long.
/// Follows little endian encoding.
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct PaInterval(pub u16);
impl PaInterval {
pub const BYTE_SIZE: usize = 2;
pub const UNKNOWN_VALUE: u16 = 0xFFFF;
pub const fn unknown() -> Self {
Self(Self::UNKNOWN_VALUE)
}
}
impl Encodable for PaInterval {
type Error = PacketError;
/// Encodees the PaInterval to 2 byte value using little endian encoding.
fn encode(&self, buf: &mut [u8]) -> core::result::Result<(), Self::Error> {
if buf.len() < Self::BYTE_SIZE {
return Err(PacketError::BufferTooSmall);
}
buf[0..Self::BYTE_SIZE].copy_from_slice(&self.0.to_le_bytes());
Ok(())
}
fn encoded_len(&self) -> core::primitive::usize {
Self::BYTE_SIZE
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn encode_pa_interval() {
let mut buf = [0; PaInterval::BYTE_SIZE];
let interval = PaInterval(0x1004);
interval.encode(&mut buf[..]).expect("should succeed");
assert_eq!(buf, [0x04, 0x10]);
}
#[test]
fn encode_pa_interval_fails() {
let mut buf = [0; 1]; // Not enough buffer space.
let interval = PaInterval(0x1004);
interval.encode(&mut buf[..]).expect_err("should fail");
}
}