ble: Add device information service
This commit is contained in:
parent
cd84754465
commit
dc54b55230
4 changed files with 152 additions and 1 deletions
80
src/ble.rs
80
src/ble.rs
|
|
@ -39,9 +39,73 @@ pub enum BleSendable {
|
|||
SpatemRaw(io::msg::RawMsgRx),
|
||||
}
|
||||
|
||||
pub const DIS_SERIAL_MAX_LEN: usize = 17;
|
||||
pub const DIS_FW_REVISION_MAX_LEN: usize = 20; // git-describe
|
||||
pub const DIS_SW_REVISION_MAX_LEN: usize = 66; // max length of get_feature_list, joined with comma
|
||||
|
||||
pub struct DeviceInfo {
|
||||
/// WiFi MAC
|
||||
pub serial_number: [u8; DIS_SERIAL_MAX_LEN],
|
||||
/// git tag/ revision
|
||||
pub fw_revision: [u8; DIS_FW_REVISION_MAX_LEN],
|
||||
/// used for feature flags
|
||||
pub sw_revision: [u8; DIS_SW_REVISION_MAX_LEN],
|
||||
}
|
||||
|
||||
impl DeviceInfo {
|
||||
pub fn new(serial_number: &str, fw_revision: &str, sw_revision: &str) -> Self {
|
||||
Self {
|
||||
serial_number: string_as_padded_buf(serial_number, DIS_SERIAL_MAX_LEN)
|
||||
.try_into()
|
||||
.unwrap(),
|
||||
fw_revision: string_as_padded_buf(fw_revision, DIS_FW_REVISION_MAX_LEN)
|
||||
.try_into()
|
||||
.unwrap(),
|
||||
sw_revision: string_as_padded_buf(sw_revision, DIS_SW_REVISION_MAX_LEN)
|
||||
.try_into()
|
||||
.unwrap(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn string_as_padded_buf(value: &str, length: usize) -> alloc::vec::Vec<u8> {
|
||||
let buf = value.as_bytes();
|
||||
let buf_len = buf.len();
|
||||
|
||||
// cut buffer at maximum length or pad with whitespace
|
||||
if buf_len > length {
|
||||
buf[..length].to_vec()
|
||||
} else {
|
||||
let padding_len = length - buf_len;
|
||||
let padding = alloc::vec![b' '; padding_len];
|
||||
|
||||
[buf, &padding].concat()
|
||||
}
|
||||
}
|
||||
|
||||
#[gatt_server]
|
||||
struct Server {
|
||||
c_its_events: CITSEvents,
|
||||
device_info_service: DeviceInfoService,
|
||||
}
|
||||
|
||||
#[gatt_service(uuid = service::DEVICE_INFORMATION)]
|
||||
struct DeviceInfoService {
|
||||
/// Manufacturer name
|
||||
#[characteristic(uuid = characteristic::MANUFACTURER_NAME_STRING, read, value = "jtbx")]
|
||||
mfg_name: &'static str,
|
||||
/// Model number
|
||||
#[characteristic(uuid = characteristic::MODEL_NUMBER_STRING, read, value = "ESP32-C5 C-ITS Companion")]
|
||||
model_number: &'static str,
|
||||
// Serial Number String
|
||||
#[characteristic(uuid = characteristic::SERIAL_NUMBER_STRING, read, value = [0u8; DIS_SERIAL_MAX_LEN])]
|
||||
serial_number: [u8; DIS_SERIAL_MAX_LEN],
|
||||
// Firmware Revision String
|
||||
#[characteristic(uuid = characteristic::FIRMWARE_REVISION_STRING, read, value = [0u8; DIS_FW_REVISION_MAX_LEN])]
|
||||
fw_revision: [u8; DIS_FW_REVISION_MAX_LEN],
|
||||
// Software Revision String
|
||||
#[characteristic(uuid = characteristic::SOFTWARE_REVISION_STRING, read, value = [0u8; DIS_SW_REVISION_MAX_LEN])]
|
||||
sw_revision: [u8; DIS_SW_REVISION_MAX_LEN],
|
||||
}
|
||||
|
||||
#[gatt_service(uuid = "c0b70000-d4f4-4000-ada8-f99a02ee315c")]
|
||||
|
|
@ -111,6 +175,7 @@ pub async fn run(
|
|||
>,
|
||||
name: alloc::string::String,
|
||||
short_name: alloc::string::String,
|
||||
device_info: DeviceInfo,
|
||||
) {
|
||||
let mut resources: HostResources<DefaultPacketPool, CONNECTIONS_MAX, L2CAP_CHANNELS_MAX> =
|
||||
HostResources::new();
|
||||
|
|
@ -132,6 +197,21 @@ pub async fn run(
|
|||
}))
|
||||
.unwrap();
|
||||
|
||||
// set "dynamic" device info data
|
||||
let _ = server
|
||||
.device_info_service
|
||||
.serial_number
|
||||
.set(&server, &device_info.serial_number);
|
||||
let _ = server
|
||||
.device_info_service
|
||||
.fw_revision
|
||||
.set(&server, &device_info.fw_revision);
|
||||
let _ = server
|
||||
.device_info_service
|
||||
.sw_revision
|
||||
.set(&server, &device_info.sw_revision);
|
||||
|
||||
// advertise and run update logic
|
||||
let _ = embassy_futures::join::join(ble_task(runner), async {
|
||||
loop {
|
||||
match advertise(&mut peripheral, &server, &short_name).await {
|
||||
|
|
|
|||
Loading…
Reference in a new issue