diff --git a/src/HID-APIs/AbsoluteMouseAPI.h b/src/HID-APIs/AbsoluteMouseAPI.h new file mode 100644 index 0000000..44b6fae --- /dev/null +++ b/src/HID-APIs/AbsoluteMouseAPI.h @@ -0,0 +1,82 @@ +/* +Copyright (c) 2014-2015 NicoHood +See the readme for credit to other people. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Include guard +#pragma once + +#include +#include "HID-Settings.h" + +#define MOUSE_LEFT (1 << 0) +#define MOUSE_RIGHT (1 << 1) +#define MOUSE_MIDDLE (1 << 2) +#define MOUSE_PREV (1 << 3) +#define MOUSE_NEXT (1 << 4) +// actually this mouse report has 8 buttons (for smaller descriptor) +// but the last 3 wont do anything from what I tested +#define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE | MOUSE_PREV | MOUSE_NEXT) + + +typedef union{ + // Absolute mouse report: 8 buttons, 2 absolute axis, wheel + uint8_t whole8[]; + uint16_t whole16[]; + uint32_t whole32[]; + struct{ + uint8_t buttons; + int16_t xAxis; + int16_t yAxis; + int8_t wheel; + }; +} HID_MouseAbsoluteReport_Data_t; + + +class AbsoluteMouseAPI +{ +private: + int16_t xAxis; + int16_t yAxis; + uint8_t _buttons; + inline void buttons(uint8_t b); + + inline int16_t qadd16(int16_t base, int16_t increment); + +public: + inline AbsoluteMouseAPI(void); + inline void begin(void); + inline void end(void); + + inline void click(uint8_t b = MOUSE_LEFT); + inline void moveTo(int x, int y, signed char wheel = 0); + inline void move(int x, int y, signed char wheel = 0); + inline void press(uint8_t b = MOUSE_LEFT); + inline void release(uint8_t b = MOUSE_LEFT); + inline bool isPressed(uint8_t b = MOUSE_LEFT); + + // Sending is public in the base class for advanced users. + virtual void SendReport(void* data, int length) = 0; +}; + +// Implementation is inline +#include "AbsoluteMouseAPI.hpp" + diff --git a/src/HID-APIs/AbsoluteMouseAPI.hpp b/src/HID-APIs/AbsoluteMouseAPI.hpp new file mode 100644 index 0000000..23f736e --- /dev/null +++ b/src/HID-APIs/AbsoluteMouseAPI.hpp @@ -0,0 +1,106 @@ +/* +Copyright (c) 2014-2015 NicoHood +See the readme for credit to other people. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Include guard +#pragma once + +void AbsoluteMouseAPI::buttons(uint8_t b){ + if (b != _buttons){ + _buttons = b; + moveTo(xAxis, yAxis, 0); + } +} + +int16_t AbsoluteMouseAPI::qadd16(int16_t base, int16_t increment) { + // Separate between subtracting and adding + if (increment < 0) { + // Subtracting more would cause an undefined overflow + if ((int16_t)0x8000 - increment > base) + base = 0x8000; + else + base += increment; + } + else { + // Adding more would cause an undefined overflow + if ((int16_t)0x7FFF - increment < base) + base = 0x7FFF; + else + base += increment; + } + return base; +} + +AbsoluteMouseAPI::AbsoluteMouseAPI(void): +xAxis(0), yAxis(0), _buttons(0) +{ + // Empty +} + +void AbsoluteMouseAPI::begin(void){ + // release all buttons + end(); +} + +void AbsoluteMouseAPI::end(void){ + _buttons = 0; + moveTo(xAxis, yAxis, 0); +} + +void AbsoluteMouseAPI::click(uint8_t b){ + _buttons = b; + moveTo(xAxis, yAxis, 0); + _buttons = 0; + moveTo(xAxis, yAxis, 0); +} + +void AbsoluteMouseAPI::moveTo(int x, int y, signed char wheel){ + xAxis = x; + yAxis = y; + HID_MouseAbsoluteReport_Data_t report; + report.buttons = _buttons; + report.xAxis = x; + report.yAxis = y; + report.wheel = wheel; + SendReport(&report, sizeof(report)); +} + +void AbsoluteMouseAPI::move(int x, int y, signed char wheel){ + moveTo(qadd16(xAxis, x), qadd16(yAxis, y), wheel); +} + +void AbsoluteMouseAPI::press(uint8_t b){ + // press LEFT by default + buttons(_buttons | b); +} + +void AbsoluteMouseAPI::release(uint8_t b){ + // release LEFT by default + buttons(_buttons & ~b); +} + +bool AbsoluteMouseAPI::isPressed(uint8_t b){ + // check LEFT by default + if ((b & _buttons) > 0) + return true; + return false; +} diff --git a/src/HID-Project.h b/src/HID-Project.h index e619901..199eaef 100644 --- a/src/HID-Project.h +++ b/src/HID-Project.h @@ -38,7 +38,7 @@ THE SOFTWARE. #endif // Include all HID libraries (.a linkage required to work) properly -//#include "AbsoluteMouse.h" +#include "MultiReport/AbsoluteMouse.h" #include "SingleReport/BootMouse.h" #include "MultiReport/ImprovedMouse.h" //#include "Consumer.h" diff --git a/src/MultiReport/AbsoluteMouse.cpp b/src/MultiReport/AbsoluteMouse.cpp new file mode 100644 index 0000000..c4e16c5 --- /dev/null +++ b/src/MultiReport/AbsoluteMouse.cpp @@ -0,0 +1,79 @@ +/* +Copyright (c) 2014-2015 NicoHood +See the readme for credit to other people. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "AbsoluteMouse.h" + + +static const uint8_t _hidMultiReportDescriptorAbsoluteMouse[] PROGMEM = { + /* Mouse absolute */ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) 54 */ + 0x09, 0x02, /* USAGE (Mouse) */ + 0xA1, 0x01, /* COLLECTION (Application) */ + 0x85, HID_REPORTID_MOUSE_ABSOLUTE, /* REPORT_ID */ + + /* 8 Buttons */ + 0x05, 0x09, /* USAGE_PAGE (Button) */ + 0x19, 0x01, /* USAGE_MINIMUM (Button 1) */ + 0x29, 0x08, /* USAGE_MAXIMUM (Button 8) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x08, /* REPORT_COUNT (8) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + + /* X, Y */ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x30, /* USAGE (X) */ + 0x09, 0x31, /* USAGE (Y) */ + 0x16, 0x00, 0x80, /* Logical Minimum (-32768) */ + 0x26, 0xFF, 0x7F, /* Logical Maximum (32767) */ + 0x75, 0x10, /* Report Size (16), */ + 0x95, 0x02, /* Report Count (2), */ + 0x81, 0x02, /* Input (Data, Variable, Absolute) */ + + /* Wheel */ + 0x09, 0x38, /* USAGE (Wheel) */ + 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ + 0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x81, 0x06, /* INPUT (Data,Var,Rel) */ + + /* End */ + 0xc0 /* END_COLLECTION */ +}; + +AbsoluteMouse_::AbsoluteMouse_(void) +{ + static HIDDescriptorListNode node(_hidMultiReportDescriptorAbsoluteMouse, sizeof(_hidMultiReportDescriptorAbsoluteMouse)); + HID().AppendDescriptor(&node); +} + + +void AbsoluteMouse_::SendReport(void* data, int length) +{ + HID().SendReport(HID_REPORTID_MOUSE_ABSOLUTE, data, length); +} + +AbsoluteMouse_ AbsoluteMouse; + diff --git a/src/MultiReport/AbsoluteMouse.h b/src/MultiReport/AbsoluteMouse.h new file mode 100644 index 0000000..be0c2d9 --- /dev/null +++ b/src/MultiReport/AbsoluteMouse.h @@ -0,0 +1,43 @@ +/* +Copyright (c) 2014-2015 NicoHood +See the readme for credit to other people. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Include guard +#pragma once + +#include +#include "PluggableUSB.h" +#include "HID.h" +#include "HID-Settings.h" +#include "../HID-APIs/AbsoluteMouseAPI.h" + + +class AbsoluteMouse_ : public AbsoluteMouseAPI +{ +public: + AbsoluteMouse_(void); + +protected: + virtual inline void SendReport(void* data, int length) override; +}; +extern AbsoluteMouse_ AbsoluteMouse; +