2026-03-31 11:04:43 +08:00
|
|
|
//! 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 {
|
2026-04-01 11:39:33 +08:00
|
|
|
core::hint::spin_loop();
|
2026-03-31 11:04:43 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-07 17:09:58 +08:00
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-31 11:04:43 +08:00
|
|
|
#[no_mangle]
|
|
|
|
|
extern "C" fn rust_app_main() {
|
2026-04-01 13:57:22 +08:00
|
|
|
// 初始化代码
|
2026-04-08 10:02:53 +08:00
|
|
|
loop {
|
|
|
|
|
send_random_key();
|
|
|
|
|
// 等待 5 秒
|
|
|
|
|
unsafe {
|
|
|
|
|
rust_vTaskDelay(5000 * PD_MS_TO_TICKS);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-31 11:04:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[export_name = "rust_usb_callback"]
|
2026-04-01 11:39:33 +08:00
|
|
|
pub unsafe extern "C" fn usb_callback(_event: u32) {
|
2026-04-07 17:09:58 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-08 10:02:53 +08:00
|
|
|
/// 发送 A-Z 随机键的按键事件
|
|
|
|
|
fn send_random_key() {
|
2026-04-07 17:09:58 +08:00
|
|
|
// 等待 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 {
|
2026-04-08 10:02:53 +08:00
|
|
|
// 生成随机的 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];
|
2026-04-07 17:09:58 +08:00
|
|
|
unsafe {
|
|
|
|
|
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 等待 50ms
|
|
|
|
|
unsafe {
|
|
|
|
|
rust_vTaskDelay(50 * PD_MS_TO_TICKS);
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-08 10:02:53 +08:00
|
|
|
// 发送随机键释放事件
|
2026-04-07 17:09:58 +08:00
|
|
|
let keycode = [0, 0, 0, 0, 0, 0];
|
|
|
|
|
unsafe {
|
|
|
|
|
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-08 10:02:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// 获取随机数
|
|
|
|
|
fn get_random_u32() -> u32 {
|
|
|
|
|
// 使用简单的线性同余生成器
|
|
|
|
|
static mut SEED: u32 = 42;
|
|
|
|
|
unsafe {
|
|
|
|
|
SEED = SEED.wrapping_mul(1103515245).wrapping_add(12345);
|
|
|
|
|
SEED
|
|
|
|
|
}
|
2026-04-01 11:39:33 +08:00
|
|
|
}
|