use crate::probe::DebugProbeInfo;
use crate::probe::stlink::StLinkFactory;
use nusb::MaybeFuture;
use super::usb_interface::USB_PID_EP_MAP;
use super::usb_interface::USB_VID;
use std::fmt::Write;
pub(super) fn is_stlink_device(device: &nusb::DeviceInfo) -> bool {
(device.vendor_id() == USB_VID) && (USB_PID_EP_MAP.contains_key(&device.product_id()))
}
#[tracing::instrument(skip_all)]
pub(super) fn list_stlink_devices() -> Vec<DebugProbeInfo> {
let devices = match nusb::list_devices().wait() {
Ok(d) => d,
Err(e) => {
tracing::warn!("listing stlink devices failed: {e}");
return vec![];
}
};
devices
.filter(is_stlink_device)
.map(|device| {
DebugProbeInfo::new(
format!(
"STLink {}",
&USB_PID_EP_MAP[&device.product_id()].version_name
),
device.vendor_id(),
device.product_id(),
read_serial_number(&device),
&StLinkFactory,
None,
false,
)
})
.collect()
}
pub(super) fn read_serial_number(device: &nusb::DeviceInfo) -> Option<String> {
device.serial_number().map(|s| {
if s.len() < 24 {
s.as_bytes().iter().fold(String::new(), |mut s, b| {
let _ = write!(s, "{b:02X}"); s
})
} else {
s.to_string()
}
})
}