鼠标移动
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
|||||||
d2fe260c30181b9fd73b990eef84d6f9acdc80a0
|
8df4f6c473ba074626c80175ff4fabe361f57ba4
|
||||||
|
|||||||
@@ -122,3 +122,19 @@
|
|||||||
7702 8228 7973312076854991 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/.bin_timestamp 74d81e5b755f9e2
|
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 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
|
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
Binary file not shown.
@@ -570,6 +570,11 @@ SECTIONS
|
|||||||
. = ALIGN(ALIGNOF(.flash.rodata));
|
. = ALIGN(ALIGNOF(.flash.rodata));
|
||||||
} >default_rodata_seg
|
} >default_rodata_seg
|
||||||
. = ALIGN(0x10000);
|
. = ALIGN(0x10000);
|
||||||
|
. = ALIGN(0x10000);
|
||||||
|
. = ALIGN(0x10000);
|
||||||
|
. = ALIGN(0x10000);
|
||||||
|
. = ALIGN(0x10000);
|
||||||
|
. = ALIGN(0x10000);
|
||||||
.flash.rodata : ALIGN(0x10)
|
.flash.rodata : ALIGN(0x10)
|
||||||
{
|
{
|
||||||
_flash_rodata_start = ABSOLUTE(.);
|
_flash_rodata_start = ABSOLUTE(.);
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": "1.2",
|
"version": "1.2",
|
||||||
"project_name": "my_usb_project",
|
"project_name": "my_usb_project",
|
||||||
"project_version": "d2fe260-dirty",
|
"project_version": "8df4f6c-dirty",
|
||||||
"project_path": "D:/Projects/trunk/JoyD/ESP32/my_usb_project",
|
"project_path": "D:/Projects/trunk/JoyD/ESP32/my_usb_project",
|
||||||
"idf_path": "D:/DiskC/ProgramFiles/Espressif/frameworks/esp-idf-v5.2.6",
|
"idf_path": "D:/DiskC/ProgramFiles/Espressif/frameworks/esp-idf-v5.2.6",
|
||||||
"build_dir": "D:/Projects/trunk/JoyD/ESP32/my_usb_project/build",
|
"build_dir": "D:/Projects/trunk/JoyD/ESP32/my_usb_project/build",
|
||||||
|
|||||||
@@ -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);
|
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
|
// 暴露 FreeRTOS 函数给 Rust
|
||||||
void rust_vTaskDelay(uint32_t xTicksToDelay) {
|
void rust_vTaskDelay(uint32_t xTicksToDelay) {
|
||||||
vTaskDelay(xTicksToDelay);
|
vTaskDelay(xTicksToDelay);
|
||||||
|
|||||||
@@ -18,11 +18,13 @@ fn panic(_info: &core::panic::PanicInfo) -> ! {
|
|||||||
// HID 键码常量
|
// HID 键码常量
|
||||||
const HID_KEY_A: u8 = 0x04;
|
const HID_KEY_A: u8 = 0x04;
|
||||||
const REPORT_ID_KEYBOARD: u8 = 1;
|
const REPORT_ID_KEYBOARD: u8 = 1;
|
||||||
|
const REPORT_ID_MOUSE: u8 = 2;
|
||||||
|
|
||||||
// FFI 函数声明
|
// FFI 函数声明
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn rust_is_usb_mounted() -> bool;
|
fn rust_is_usb_mounted() -> bool;
|
||||||
fn rust_send_keyboard_report(report_id: u8, modifier: u8, keycode: *const u8);
|
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_vTaskDelay(xTicksToDelay: u32);
|
||||||
fn rust_esp_log_i(tag: *const u8, format: *const u8);
|
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() {
|
extern "C" fn rust_app_main() {
|
||||||
// 初始化代码
|
// 初始化代码
|
||||||
log_info("Rust app started");
|
log_info("Rust app started");
|
||||||
|
|
||||||
|
// 等待 USB 挂载成功
|
||||||
|
wait_usb_mounted();
|
||||||
|
|
||||||
|
let mut tick_count = 0;
|
||||||
loop {
|
loop {
|
||||||
log_info("Sending random key...");
|
// 每 5 秒 (500 ticks) 按下一个随机键
|
||||||
send_random_key();
|
if tick_count % 500 == 0 {
|
||||||
// 等待 5 秒 (5000ms / 10ms per tick = 500 ticks)
|
log_info("Sending random key...");
|
||||||
log_info("Waiting for 5 seconds...");
|
send_random_key();
|
||||||
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,49 +112,71 @@ pub unsafe extern "C" fn usb_callback(_event: u32) {
|
|||||||
|
|
||||||
/// 发送 A-Z 随机键的按键事件
|
/// 发送 A-Z 随机键的按键事件
|
||||||
fn send_random_key() {
|
fn send_random_key() {
|
||||||
// 等待 USB 设备挂载
|
// 检查 USB 是否仍然挂载
|
||||||
let mut mounted = false;
|
let mounted = unsafe {
|
||||||
for _ in 0..10 {
|
rust_is_usb_mounted()
|
||||||
mounted = unsafe {
|
};
|
||||||
rust_is_usb_mounted()
|
|
||||||
};
|
if !mounted {
|
||||||
if mounted {
|
log_info("USB not mounted, skipping key press");
|
||||||
log_info("USB mounted!");
|
return;
|
||||||
break;
|
|
||||||
}
|
|
||||||
// 等待 100ms (100ms / 10ms per tick = 10 ticks)
|
|
||||||
log_info("USB not mounted yet");
|
|
||||||
unsafe {
|
|
||||||
rust_vTaskDelay(10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if mounted {
|
// 生成随机的 A-Z 键码
|
||||||
// 生成随机的 A-Z 键码
|
let random_value = get_random_u32() % 26;
|
||||||
let random_value = get_random_u32() % 26;
|
let random_key = HID_KEY_A + (random_value as u8);
|
||||||
let random_key = HID_KEY_A + (random_value as u8);
|
|
||||||
|
|
||||||
// 发送随机键按下事件
|
// 发送随机键按下事件
|
||||||
let keycode = [random_key, 0, 0, 0, 0, 0];
|
let keycode = [random_key, 0, 0, 0, 0, 0];
|
||||||
log_info("Sending key press event");
|
log_info("Sending key press event");
|
||||||
unsafe {
|
unsafe {
|
||||||
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
|
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 等待 50ms (50ms / 10ms per tick = 5 ticks)
|
// 等待 50ms (50ms / 10ms per tick = 5 ticks)
|
||||||
log_info("Waiting for 50ms...");
|
log_info("Waiting for 50ms...");
|
||||||
unsafe {
|
unsafe {
|
||||||
rust_vTaskDelay(5);
|
rust_vTaskDelay(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送随机键释放事件
|
// 再次检查 USB 是否仍然挂载
|
||||||
let keycode = [0, 0, 0, 0, 0, 0];
|
let mounted = unsafe {
|
||||||
log_info("Sending key release event");
|
rust_is_usb_mounted()
|
||||||
unsafe {
|
};
|
||||||
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
|
|
||||||
}
|
if !mounted {
|
||||||
} else {
|
log_info("USB not mounted, skipping key release");
|
||||||
log_info("USB not mounted after 10 attempts");
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 发送随机鼠标移动事件
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user