commit
a5e20e94d2
15 changed files with 80 additions and 68 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "HID.wiki"]
|
||||
path = HID.wiki
|
||||
url = https://github.com/NicoHood/HID.wiki.git
|
||||
1
HID.wiki
Submodule
1
HID.wiki
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit a1a0b086985dec037d7e7d86c6b2d5816207f202
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
Arduino HID Project 2.4.3
|
||||
Arduino HID Project 2.4.4
|
||||
=========================
|
||||
|
||||

|
||||
|
|
@ -41,14 +41,16 @@ An offline snapshot is available in [releases](https://github.com/NicoHood/HID/r
|
|||
Contact
|
||||
=======
|
||||
|
||||
You can contact me on my wordpress blog in the contact section.
|
||||
|
||||
www.nicohood.de
|
||||
|
||||
|
||||
Version History
|
||||
===============
|
||||
```
|
||||
2.4.4 Release (27.01.2017)
|
||||
* Added releaseAll() to Mouse API
|
||||
* Fix flexible array errors
|
||||
|
||||
2.4.3 Release (02.03.2016)
|
||||
* Fixed NKRO Keyboard modifier add() #76
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
name=HID-Project
|
||||
version=2.4.3
|
||||
version=2.4.4
|
||||
author=NicoHood
|
||||
maintainer=NicoHood <blog@NicoHood.de>
|
||||
sentence=Extended HID Functions for Arduino
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@ THE SOFTWARE.
|
|||
|
||||
typedef union{
|
||||
// Absolute mouse report: 8 buttons, 2 absolute axis, wheel
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
struct{
|
||||
uint8_t buttons;
|
||||
int16_t xAxis;
|
||||
|
|
@ -71,12 +71,12 @@ public:
|
|||
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 void releaseAll(void);
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ void AbsoluteMouseAPI::buttons(uint8_t b){
|
|||
}
|
||||
|
||||
int16_t AbsoluteMouseAPI::qadd16(int16_t base, int16_t increment) {
|
||||
// Separate between subtracting and adding
|
||||
// Separate between subtracting and adding
|
||||
if (increment < 0) {
|
||||
// Subtracting more would cause an undefined overflow
|
||||
if ((int16_t)0x8000 - increment > base)
|
||||
|
|
@ -50,7 +50,7 @@ int16_t AbsoluteMouseAPI::qadd16(int16_t base, int16_t increment) {
|
|||
return base;
|
||||
}
|
||||
|
||||
AbsoluteMouseAPI::AbsoluteMouseAPI(void):
|
||||
AbsoluteMouseAPI::AbsoluteMouseAPI(void):
|
||||
xAxis(0), yAxis(0), _buttons(0)
|
||||
{
|
||||
// Empty
|
||||
|
|
@ -98,6 +98,11 @@ void AbsoluteMouseAPI::release(uint8_t b){
|
|||
buttons(_buttons & ~b);
|
||||
}
|
||||
|
||||
void AbsoluteMouseAPI::releaseAll(void){
|
||||
_buttons = 0;
|
||||
moveTo(xAxis, yAxis, 0);
|
||||
}
|
||||
|
||||
bool AbsoluteMouseAPI::isPressed(uint8_t b){
|
||||
// check LEFT by default
|
||||
if ((b & _buttons) > 0)
|
||||
|
|
|
|||
|
|
@ -450,9 +450,9 @@ enum ConsumerKeycode : uint16_t {
|
|||
|
||||
typedef union {
|
||||
// Every usable Consumer key possible, up to 4 keys presses possible
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
ConsumerKeycode keys[4];
|
||||
struct {
|
||||
ConsumerKeycode key1;
|
||||
|
|
@ -472,7 +472,7 @@ public:
|
|||
inline void press(ConsumerKeycode m);
|
||||
inline void release(ConsumerKeycode m);
|
||||
inline void releaseAll(void);
|
||||
|
||||
|
||||
// Sending is public in the base class for advanced users.
|
||||
virtual void SendReport(void* data, int length) = 0;
|
||||
|
||||
|
|
@ -482,4 +482,3 @@ protected:
|
|||
|
||||
// Implementation is inline
|
||||
#include "ConsumerAPI.hpp"
|
||||
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ THE SOFTWARE.
|
|||
|
||||
typedef union{
|
||||
// Low level key report: up to 6 keys and shift, ctrl etc at once
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
struct{
|
||||
uint8_t modifiers;
|
||||
uint8_t reserved;
|
||||
|
|
@ -74,4 +74,3 @@ private:
|
|||
|
||||
// Implementation is inline
|
||||
#include "DefaultKeyboardAPI.hpp"
|
||||
|
||||
|
|
|
|||
|
|
@ -41,9 +41,9 @@ THE SOFTWARE.
|
|||
|
||||
typedef union {
|
||||
// 32 Buttons, 6 Axis, 2 D-Pads
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
uint32_t buttons;
|
||||
|
||||
struct{
|
||||
|
|
@ -117,7 +117,7 @@ public:
|
|||
inline void rzAxis(int8_t a);
|
||||
inline void dPad1(int8_t d);
|
||||
inline void dPad2(int8_t d);
|
||||
|
||||
|
||||
// Sending is public in the base class for advanced users.
|
||||
virtual void SendReport(void* data, int length) = 0;
|
||||
|
||||
|
|
@ -127,4 +127,3 @@ protected:
|
|||
|
||||
// Implementation is inline
|
||||
#include "GamepadAPI.hpp"
|
||||
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@ THE SOFTWARE.
|
|||
|
||||
typedef union{
|
||||
// Mouse report: 8 buttons, position, wheel
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
struct{
|
||||
uint8_t buttons;
|
||||
int8_t xAxis;
|
||||
|
|
@ -53,9 +53,9 @@ typedef union{
|
|||
typedef union{
|
||||
// BootMouse report: 3 buttons, position
|
||||
// Wheel is not supported by boot protocol
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
struct{
|
||||
uint8_t buttons;
|
||||
int8_t xAxis;
|
||||
|
|
@ -70,14 +70,15 @@ public:
|
|||
inline void begin(void);
|
||||
inline void end(void);
|
||||
inline void click(uint8_t b = MOUSE_LEFT);
|
||||
inline void move(signed char x, signed char y, signed char wheel = 0);
|
||||
inline void move(signed char x, signed char y, signed char wheel = 0);
|
||||
inline void press(uint8_t b = MOUSE_LEFT); // press LEFT by default
|
||||
inline void release(uint8_t b = MOUSE_LEFT); // release LEFT by default
|
||||
inline void releaseAll(void);
|
||||
inline bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default
|
||||
|
||||
|
||||
// Sending is public in the base class for advanced users.
|
||||
virtual void SendReport(void* data, int length) = 0;
|
||||
|
||||
|
||||
protected:
|
||||
uint8_t _buttons;
|
||||
inline void buttons(uint8_t b);
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ MouseAPI::MouseAPI(void) : _buttons(0)
|
|||
// Empty
|
||||
}
|
||||
|
||||
void MouseAPI::begin(void)
|
||||
void MouseAPI::begin(void)
|
||||
{
|
||||
end();
|
||||
}
|
||||
|
||||
void MouseAPI::end(void)
|
||||
void MouseAPI::end(void)
|
||||
{
|
||||
_buttons = 0;
|
||||
move(0, 0, 0);
|
||||
|
|
@ -67,7 +67,7 @@ void MouseAPI::buttons(uint8_t b)
|
|||
}
|
||||
}
|
||||
|
||||
void MouseAPI::press(uint8_t b)
|
||||
void MouseAPI::press(uint8_t b)
|
||||
{
|
||||
buttons(_buttons | b);
|
||||
}
|
||||
|
|
@ -77,10 +77,15 @@ void MouseAPI::release(uint8_t b)
|
|||
buttons(_buttons & ~b);
|
||||
}
|
||||
|
||||
void MouseAPI::releaseAll(void)
|
||||
{
|
||||
_buttons = 0;
|
||||
move(0,0,0);
|
||||
}
|
||||
|
||||
bool MouseAPI::isPressed(uint8_t b)
|
||||
{
|
||||
if ((b & _buttons) > 0)
|
||||
if ((b & _buttons) > 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@ THE SOFTWARE.
|
|||
|
||||
typedef union{
|
||||
// Modifier + keymap + 1 custom key
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
struct{
|
||||
uint8_t modifiers;
|
||||
uint8_t keys[NKRO_KEY_COUNT / 8];
|
||||
|
|
@ -43,7 +43,7 @@ typedef union{
|
|||
uint8_t allkeys[2 + NKRO_KEY_COUNT / 8];
|
||||
} HID_NKROKeyboardReport_Data_t;
|
||||
|
||||
|
||||
|
||||
class NKROKeyboardAPI : public KeyboardAPI
|
||||
{
|
||||
public:
|
||||
|
|
@ -62,4 +62,3 @@ private:
|
|||
|
||||
// Implementation is inline
|
||||
#include "NKROKeyboardAPI.hpp"
|
||||
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ enum SystemKeycode : uint8_t {
|
|||
|
||||
typedef union{
|
||||
// Every usable system control key possible
|
||||
uint8_t whole8[];
|
||||
uint8_t whole8[0];
|
||||
uint8_t key;
|
||||
} HID_SystemControlReport_Data_t;
|
||||
|
||||
|
|
@ -89,7 +89,7 @@ public:
|
|||
inline void press(SystemKeycode s);
|
||||
inline void release(void);
|
||||
inline void releaseAll(void);
|
||||
|
||||
|
||||
// Sending is public in the base class for advanced users.
|
||||
virtual void SendReport(void* data, int length) = 0;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ THE SOFTWARE.
|
|||
#pragma once
|
||||
|
||||
// Software version
|
||||
#define HID_PROJECT_VERSION 243
|
||||
#define HID_PROJECT_VERSION 244
|
||||
|
||||
#if ARDUINO < 10607
|
||||
#error HID Project requires Arduino IDE 1.6.7 or greater. Please update your IDE.
|
||||
|
|
|
|||
|
|
@ -54,17 +54,17 @@ THE SOFTWARE.
|
|||
|
||||
typedef union{
|
||||
// a RAWHID_TX_SIZE byte buffer for tx
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
uint8_t buff[RAWHID_TX_SIZE];
|
||||
} HID_RawKeyboardTXReport_Data_t;
|
||||
|
||||
typedef union{
|
||||
// a RAWHID_TX_SIZE byte buffer for rx
|
||||
uint8_t whole8[];
|
||||
uint16_t whole16[];
|
||||
uint32_t whole32[];
|
||||
uint8_t whole8[0];
|
||||
uint16_t whole16[0];
|
||||
uint32_t whole32[0];
|
||||
uint8_t buff[RAWHID_RX_SIZE];
|
||||
} HID_RawKeyboardRXReport_Data_t;
|
||||
|
||||
|
|
@ -77,23 +77,23 @@ public:
|
|||
if(length > 0){
|
||||
featureReport = (uint8_t*)report;
|
||||
featureLength = length;
|
||||
|
||||
|
||||
// Disable feature report by default
|
||||
disableFeatureReport();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int availableFeatureReport(void){
|
||||
if(featureLength < 0){
|
||||
return featureLength & ~0x8000;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void enableFeatureReport(void){
|
||||
featureLength &= ~0x8000;
|
||||
}
|
||||
|
||||
|
||||
void disableFeatureReport(void){
|
||||
featureLength |= 0x8000;
|
||||
}
|
||||
|
|
@ -110,22 +110,22 @@ public:
|
|||
disable();
|
||||
dataLength = 0;
|
||||
}
|
||||
|
||||
|
||||
void enable(void){
|
||||
dataAvailable = 0;
|
||||
}
|
||||
|
||||
|
||||
void disable(void){
|
||||
dataAvailable = -1;
|
||||
}
|
||||
|
||||
|
||||
virtual int available(void){
|
||||
if(dataAvailable < 0){
|
||||
return 0;
|
||||
}
|
||||
return dataAvailable;
|
||||
}
|
||||
|
||||
|
||||
virtual int read(){
|
||||
// Check if we have data available
|
||||
if(dataAvailable > 0)
|
||||
|
|
@ -135,7 +135,7 @@ public:
|
|||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
virtual int peek(){
|
||||
// Check if we have data available
|
||||
if(dataAvailable > 0){
|
||||
|
|
@ -143,7 +143,7 @@ public:
|
|||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
virtual void flush(void){
|
||||
// Writing will always flush by the USB driver
|
||||
}
|
||||
|
|
@ -157,24 +157,23 @@ public:
|
|||
virtual size_t write(uint8_t *buffer, size_t size){
|
||||
return USB_Send(pluggedEndpoint | TRANSFER_RELEASE, buffer, size);
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
// Implementation of the PUSBListNode
|
||||
int getInterface(uint8_t* interfaceCount);
|
||||
int getDescriptor(USBSetup& setup);
|
||||
bool setup(USBSetup& setup);
|
||||
|
||||
|
||||
uint8_t epType[1];
|
||||
uint8_t protocol;
|
||||
uint8_t idle;
|
||||
|
||||
|
||||
// Buffer pointers to hold the received data
|
||||
int dataLength;
|
||||
int dataAvailable;
|
||||
uint8_t* data;
|
||||
|
||||
|
||||
uint8_t* featureReport;
|
||||
int featureLength;
|
||||
};
|
||||
extern RawHID_ RawHID;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue