//! Rust application for ESP32-S3 //! //! This module provides the main Rust application logic //! that interacts with the USB HID interface implemented in C/TinyUSB. #![no_std] use esp_backtrace as _; #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { loop { core::hint::spin_loop(); } } // HID 键码常量 const HID_KEY_A: u8 = 0x04; const REPORT_ID_KEYBOARD: u8 = 1; const PD_MS_TO_TICKS: u32 = 1; // FFI 函数声明 extern "C" { fn rust_is_usb_mounted() -> bool; fn rust_send_keyboard_report(report_id: u8, modifier: u8, keycode: *const u8); fn rust_vTaskDelay(xTicksToDelay: u32); } #[no_mangle] extern "C" fn rust_app_main() { // 初始化代码 loop { send_random_key(); // 等待 5 秒 unsafe { rust_vTaskDelay(5000 * PD_MS_TO_TICKS); } } } #[export_name = "rust_usb_callback"] pub unsafe extern "C" fn usb_callback(_event: u32) { } /// 发送 A-Z 随机键的按键事件 fn send_random_key() { // 等待 USB 设备挂载 let mut mounted = false; for _ in 0..10 { mounted = unsafe { rust_is_usb_mounted() }; if mounted { break; } // 等待 100ms unsafe { rust_vTaskDelay(100 * PD_MS_TO_TICKS); } } if mounted { // 生成随机的 A-Z 键码 let random_value = get_random_u32() % 26; let random_key = HID_KEY_A + (random_value as u8); // 发送随机键按下事件 let keycode = [random_key, 0, 0, 0, 0, 0]; unsafe { rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr()); } // 等待 50ms unsafe { rust_vTaskDelay(50 * PD_MS_TO_TICKS); } // 发送随机键释放事件 let keycode = [0, 0, 0, 0, 0, 0]; unsafe { rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr()); } } } /// 获取随机数 fn get_random_u32() -> u32 { // 使用简单的线性同余生成器 static mut SEED: u32 = 42; unsafe { SEED = SEED.wrapping_mul(1103515245).wrapping_add(12345); SEED } }