鼠标移动

This commit is contained in:
zqm
2026-04-08 15:15:20 +08:00
parent 8df4f6c473
commit 175e088eed
18 changed files with 4360 additions and 4856 deletions

View File

@@ -18,11 +18,13 @@ fn panic(_info: &core::panic::PanicInfo) -> ! {
// HID 键码常量
const HID_KEY_A: u8 = 0x04;
const REPORT_ID_KEYBOARD: u8 = 1;
const REPORT_ID_MOUSE: u8 = 2;
// FFI 函数声明
extern "C" {
fn rust_is_usb_mounted() -> bool;
fn rust_send_keyboard_report(report_id: u8, modifier: u8, keycode: *const u8);
fn rust_send_mouse_report(report_id: u8, buttons: u8, x: i8, y: i8, wheel: i8, pan: i8);
fn rust_vTaskDelay(xTicksToDelay: u32);
fn rust_esp_log_i(tag: *const u8, format: *const u8);
}
@@ -45,14 +47,62 @@ fn log_info(message: &'static str) {
extern "C" fn rust_app_main() {
// 初始化代码
log_info("Rust app started");
// 等待 USB 挂载成功
wait_usb_mounted();
let mut tick_count = 0;
loop {
log_info("Sending random key...");
send_random_key();
// 等待 5 秒 (5000ms / 10ms per tick = 500 ticks)
log_info("Waiting for 5 seconds...");
unsafe {
rust_vTaskDelay(500);
// 每 5 秒 (500 ticks) 按下一个随机键
if tick_count % 500 == 0 {
log_info("Sending random key...");
send_random_key();
}
// 每 6 秒 (600 ticks) 随机移动一下鼠标
if tick_count % 600 == 0 {
log_info("Sending random mouse move...");
send_random_mouse_move();
}
// 等待 10ms (1 tick)
unsafe {
rust_vTaskDelay(1);
}
tick_count += 1;
}
}
/// 等待 USB 挂载成功
fn wait_usb_mounted() {
// 等待 USB 设备挂载,最多等待 3 秒
const USB_MOUNT_TIMEOUT_TICKS: u32 = 300; // 300 ticks = 3 seconds
let mut elapsed_ticks = 0;
log_info("Waiting for USB to mount...");
loop {
let mounted = unsafe {
rust_is_usb_mounted()
};
if mounted {
log_info("USB mounted successfully!");
break;
}
// 检查是否超时
if elapsed_ticks >= USB_MOUNT_TIMEOUT_TICKS {
log_info("USB mount timeout!");
// 使用 panic! 而不是 unreachable_unchecked
panic!("USB init failed");
}
// 等待 10ms (1 tick)
unsafe {
rust_vTaskDelay(1);
}
elapsed_ticks += 1;
}
}
@@ -62,49 +112,71 @@ 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 {
log_info("USB mounted!");
break;
}
// 等待 100ms (100ms / 10ms per tick = 10 ticks)
log_info("USB not mounted yet");
unsafe {
rust_vTaskDelay(10);
}
// 检查 USB 是否仍然挂载
let mounted = unsafe {
rust_is_usb_mounted()
};
if !mounted {
log_info("USB not mounted, skipping key press");
return;
}
// 生成随机的 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];
log_info("Sending key press event");
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
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];
log_info("Sending key press event");
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
// 等待 50ms (50ms / 10ms per tick = 5 ticks)
log_info("Waiting for 50ms...");
unsafe {
rust_vTaskDelay(5);
}
// 等待 50ms (50ms / 10ms per tick = 5 ticks)
log_info("Waiting for 50ms...");
unsafe {
rust_vTaskDelay(5);
}
// 再次检查 USB 是否仍然挂载
let mounted = unsafe {
rust_is_usb_mounted()
};
if !mounted {
log_info("USB not mounted, skipping key release");
return;
}
// 发送随机键释放事件
let keycode = [0, 0, 0, 0, 0, 0];
log_info("Sending key release event");
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
} else {
log_info("USB not mounted after 10 attempts");
// 发送随机键释放事件
let keycode = [0, 0, 0, 0, 0, 0];
log_info("Sending key release event");
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
}
/// 发送随机鼠标移动事件
fn send_random_mouse_move() {
// 检查 USB 是否仍然挂载
let mounted = unsafe {
rust_is_usb_mounted()
};
if !mounted {
log_info("USB not mounted, skipping mouse move");
return;
}
// 生成随机的鼠标移动距离 (-10 到 10 之间)
let random_x = (get_random_u32() % 21) as i8 - 10;
let random_y = (get_random_u32() % 21) as i8 - 10;
// 发送鼠标移动事件
log_info("Sending mouse move event");
unsafe {
rust_send_mouse_report(REPORT_ID_MOUSE, 0, random_x, random_y, 0, 0);
}
}