feat: 完善 USB UVC 设备异常处理,添加 USB 设备复位功能

This commit is contained in:
mofeng-git
2026-04-27 16:37:04 +08:00
parent 9065e01225
commit 07b982d1d2
14 changed files with 631 additions and 33 deletions

View File

@@ -3,8 +3,11 @@
//! Provides API endpoints for discovering available hardware devices.
use axum::Json;
use serde::Deserialize;
use crate::atx::{discover_devices, AtxDevices};
use crate::error::{AppError, Result};
use crate::video::usb_reset;
/// GET /api/devices/atx - List available ATX devices
///
@@ -12,3 +15,35 @@ use crate::atx::{discover_devices, AtxDevices};
pub async fn list_atx_devices() -> Json<AtxDevices> {
Json(discover_devices())
}
/// GET /api/devices/usb - List all USB devices
///
/// Enumerates USB devices from `/sys/bus/usb/devices/` with associated
/// video device mappings.
pub async fn list_usb_devices() -> Json<Vec<usb_reset::UsbDeviceInfo>> {
Json(usb_reset::list_usb_devices())
}
#[derive(Deserialize)]
pub struct UsbResetRequest {
pub bus_num: u32,
pub dev_num: u32,
}
/// POST /api/devices/usb/reset - Reset a USB device via authorized cycle
///
/// Writes `0` then `1` to the device's `authorized` sysfs attribute,
/// causing the kernel to deauthorize and re-authorize the device.
/// Requires root or write access to sysfs.
pub async fn reset_usb_device(Json(req): Json<UsbResetRequest>) -> Result<Json<serde_json::Value>> {
usb_reset::reset_usb_device(req.bus_num, req.dev_num).map_err(|e| {
AppError::VideoError(format!(
"USB reset failed for device {}-{}: {}",
req.bus_num, req.dev_num, e
))
})?;
Ok(Json(serde_json::json!({
"success": true,
"message": format!("USB device {}-{} reset successfully", req.bus_num, req.dev_num)
})))
}

View File

@@ -177,6 +177,11 @@ pub fn create_router(state: Arc<AppState>) -> Router {
.route("/atx/wol/history", get(handlers::atx_wol_history))
// Device discovery endpoints
.route("/devices/atx", get(handlers::devices::list_atx_devices))
.route("/devices/usb", get(handlers::devices::list_usb_devices))
.route(
"/devices/usb/reset",
post(handlers::devices::reset_usb_device),
)
// Extension management endpoints
.route("/extensions", get(handlers::extensions::list_extensions))
.route("/extensions/{id}", get(handlers::extensions::get_extension))