github方案移植 步骤二 方案的代码部分AbsMouse - 可打印的版本 +- LightGunDiyer 光枪爱好者 (http://www.wukongxuetang.com/bbs) +-- 版块: 光枪原理与光枪DIY (http://www.wukongxuetang.com/bbs/forumdisplay.php?fid=1) +--- 版块: 光枪-创意设计 (http://www.wukongxuetang.com/bbs/forumdisplay.php?fid=6) +--- 主题: github方案移植 步骤二 方案的代码部分AbsMouse (/showthread.php?tid=30) |
github方案移植 步骤二 方案的代码部分AbsMouse - wukong - 04-29-2024 此文件为鼠标驱动库文件,arduino官方也可以找到该库,使用含有usb hid功能的单片机 #ifndef ABSMOUSE_h #define ABSMOUSE_h #include "HID.h" #if !defined(_USING_HID) #warning "AbsMouse not compatible with this device and/or firmware" #else #define MOUSE_LEFT 0x01 #define MOUSE_RIGHT 0x02 #define MOUSE_MIDDLE 0x04 class AbsMouse_ { private: uint8_t _buttons; uint16_t _x; uint16_t _y; uint32_t _width; uint32_t _height; bool _autoReport; public: AbsMouse_(void); void init(uint16_t width = 32767, uint16_t height = 32767, bool autoReport = true); void report(void); void move(uint16_t x, uint16_t y); void press(uint8_t b = MOUSE_LEFT); void release(uint8_t b = MOUSE_LEFT); }; extern AbsMouse_ AbsMouse; #endif #endif #下面代码为AbsMouse.cpp,上面为头文件 #include "AbsMouse.h" #if defined(_USING_HID) static const uint8_t HID_REPORT_DESCRIPTOR[] PROGMEM = { 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x02, // Usage (Mouse) 0xA1, 0x01, // Collection (Application) 0x09, 0x01, // Usage (Pointer) 0xA1, 0x00, // Collection (Physical) 0x85, 0x01, // Report ID (1) 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Minimum (0x01) 0x29, 0x03, // Usage Maximum (0x03) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x95, 0x03, // Report Count (3) 0x75, 0x01, // Report Size (1) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x95, 0x01, // Report Count (1) 0x75, 0x05, // Report Size (5) 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x30, // Usage (X) 0x09, 0x31, // Usage (Y) 0x16, 0x00, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 0x36, 0x00, 0x00, // Physical Minimum (0) 0x46, 0xFF, 0x7F, // Physical Maximum (32767) 0x75, 0x10, // Report Size (16) 0x95, 0x02, // Report Count (2) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xC0, // End Collection 0xC0 // End Collection }; AbsMouse_::AbsMouse_(void) : _buttons(0), _x(0), _y(0) { static HIDSubDescriptor descriptorNode(HID_REPORT_DESCRIPTOR, sizeof(HID_REPORT_DESCRIPTOR)); HID().AppendDescriptor(&descriptorNode); } void AbsMouse_::init(uint16_t width, uint16_t height, bool autoReport) { _width = width; _height = height; _autoReport = autoReport; } void AbsMouse_::report(void) { uint8_t buffer[5]; buffer[0] = _buttons; buffer[1] = _x & 0xFF; buffer[2] = (_x >> 8) & 0xFF; buffer[3] = _y & 0xFF; buffer[4] = (_y >> 8) & 0xFF; HID().SendReport(1, buffer, 5); } void AbsMouse_::move(uint16_t x, uint16_t y) { _x = (uint16_t) ((32767l * ((uint32_t) x)) / _width); _y = (uint16_t) ((32767l * ((uint32_t) y)) / _height); if (_autoReport) { report(); } } void AbsMouse_::press(uint8_t button) { _buttons |= button; if (_autoReport) { report(); } } void AbsMouse_::release(uint8_t button) { _buttons &= ~button; if (_autoReport) { report(); } } AbsMouse_ AbsMouse; #endif |