鼠标移动

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

@@ -1 +1 @@
00acc757015f994bb3079a41871253d6 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/my_usb_project.bin
89eace7eeff895cdc45d8642be8832b4 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/my_usb_project.bin

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
d2fe260c30181b9fd73b990eef84d6f9acdc80a0
8df4f6c473ba074626c80175ff4fabe361f57ba4

View File

@@ -122,3 +122,19 @@
7702 8228 7973312076854991 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/.bin_timestamp 74d81e5b755f9e2
8228 8576 7973312077022921 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
8228 8576 7973312077022921 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
23 2603 7973320924533116 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
23 2603 7973320924533116 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
36 248 7973327348696584 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
36 248 7973327348696584 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
29 320 7973336751872892 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
29 320 7973336751872892 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
30 197 7973337179858596 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
30 197 7973337179858596 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
33 270 7973345293905082 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
33 270 7973345293905082 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 147 7973347085896683 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 147 7973347085896683 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
26 285 7973352760190699 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
26 285 7973352760190699 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
18 122 7973355379352016 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
18 122 7973355379352016 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -570,6 +570,11 @@ SECTIONS
. = ALIGN(ALIGNOF(.flash.rodata));
} >default_rodata_seg
. = ALIGN(0x10000);
. = ALIGN(0x10000);
. = ALIGN(0x10000);
. = ALIGN(0x10000);
. = ALIGN(0x10000);
. = ALIGN(0x10000);
.flash.rodata : ALIGN(0x10)
{
_flash_rodata_start = ABSOLUTE(.);

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
{
"version": "1.2",
"project_name": "my_usb_project",
"project_version": "d2fe260-dirty",
"project_version": "8df4f6c-dirty",
"project_path": "D:/Projects/trunk/JoyD/ESP32/my_usb_project",
"idf_path": "D:/DiskC/ProgramFiles/Espressif/frameworks/esp-idf-v5.2.6",
"build_dir": "D:/Projects/trunk/JoyD/ESP32/my_usb_project/build",

View File

@@ -99,6 +99,11 @@ void rust_send_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t cons
tud_hid_keyboard_report(report_id, modifier, keycode);
}
// 暴露鼠标报告函数给 Rust
void rust_send_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t wheel, int8_t pan) {
tud_hid_mouse_report(report_id, buttons, x, y, wheel, pan);
}
// 暴露 FreeRTOS 函数给 Rust
void rust_vTaskDelay(uint32_t xTicksToDelay) {
vTaskDelay(xTicksToDelay);

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 {
// 每 5 秒 (500 ticks) 按下一个随机键
if tick_count % 500 == 0 {
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);
}
// 每 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,24 +112,16 @@ 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 {
// 检查 USB 是否仍然挂载
let 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);
}
if !mounted {
log_info("USB not mounted, skipping key press");
return;
}
if mounted {
// 生成随机的 A-Z 键码
let random_value = get_random_u32() % 26;
let random_key = HID_KEY_A + (random_value as u8);
@@ -97,14 +139,44 @@ fn send_random_key() {
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");
}
/// 发送随机鼠标移动事件
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);
}
}