|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "HIDTables.h"
|
|
|
|
|
|
|
|
#include "key_defs_keyboard.h"
|
|
|
|
#include "key_defs_sysctl.h"
|
|
|
|
#include "key_defs_consumerctl.h"
|
|
|
|
#include "key_defs_keymaps.h"
|
|
|
|
|
|
|
|
#include "key_defs_aliases.h"
|
|
|
|
|
|
|
|
#ifdef ARDUINO_VIRTUAL
|
|
|
|
#include "VirtualHID/VirtualHID.h"
|
|
|
|
#else
|
|
|
|
#include "KeyboardioHID.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
typedef union Key_ {
|
|
|
|
|
|
|
|
struct {
|
|
|
|
uint8_t keyCode;
|
|
|
|
uint8_t flags;
|
|
|
|
};
|
|
|
|
uint16_t raw;
|
|
|
|
|
|
|
|
inline bool operator==(uint16_t rhs) {
|
|
|
|
return this->raw == rhs;
|
|
|
|
}
|
|
|
|
inline bool operator==(const Key_ rhs) {
|
|
|
|
return this->raw == rhs.raw;
|
|
|
|
}
|
|
|
|
inline Key_& operator=(uint16_t raw) {
|
|
|
|
this->raw = raw;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
inline bool operator!=(const Key_& rhs) {
|
|
|
|
return !(*this == rhs);
|
|
|
|
}
|
|
|
|
inline bool operator>=(uint16_t raw) {
|
|
|
|
return this->raw >= raw;
|
|
|
|
}
|
|
|
|
inline bool operator<=(uint16_t raw) {
|
|
|
|
return this->raw <= raw;
|
|
|
|
}
|
|
|
|
inline bool operator>(uint16_t raw) {
|
|
|
|
return this->raw > raw;
|
|
|
|
}
|
|
|
|
inline bool operator<(uint16_t raw) {
|
|
|
|
return this->raw < raw;
|
|
|
|
}
|
|
|
|
inline bool operator>=(const Key_& other) {
|
|
|
|
return this->raw >= other.raw;
|
|
|
|
}
|
|
|
|
inline bool operator<=(const Key_& other) {
|
|
|
|
return this->raw <= other.raw;
|
|
|
|
}
|
|
|
|
inline bool operator>(const Key_& other) {
|
|
|
|
return this->raw > other.raw;
|
|
|
|
}
|
|
|
|
inline bool operator<(const Key_& other) {
|
|
|
|
return this->raw < other.raw;
|
|
|
|
}
|
|
|
|
} Key;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define KEY_FLAGS B00000000
|
|
|
|
#define CTRL_HELD B00000001
|
|
|
|
#define LALT_HELD B00000010
|
|
|
|
#define RALT_HELD B00000100
|
|
|
|
#define SHIFT_HELD B00001000
|
|
|
|
#define GUI_HELD B00010000
|
|
|
|
#define SYNTHETIC B01000000
|
|
|
|
#define RESERVED B10000000
|
|
|
|
|
|
|
|
#define LCTRL(k) ((Key) { k.keyCode, k.flags | CTRL_HELD })
|
|
|
|
#define LALT(k) ((Key) { k.keyCode, k.flags | LALT_HELD })
|
|
|
|
#define RALT(k) ((Key) { k.keyCode, k.flags | RALT_HELD })
|
|
|
|
#define LSHIFT(k) ((Key) { k.keyCode, k.flags | SHIFT_HELD })
|
|
|
|
#define LGUI(k) ((Key) { k.keyCode, k.flags | GUI_HELD })
|
|
|
|
|
|
|
|
// we assert that synthetic keys can never have keys held, so we reuse the _HELD bits
|
|
|
|
#define IS_SYSCTL B00000001
|
|
|
|
#define IS_INTERNAL B00000010
|
|
|
|
#define SWITCH_TO_KEYMAP B00000100
|
|
|
|
#define IS_CONSUMER B00001000
|
|
|
|
|
|
|
|
/* HID types we need to encode in the key flags for system and consumer control hid controls
|
|
|
|
Each key can only have one, so we don't need to use a bit vector.
|
|
|
|
We need to keep the top two bits clear for defining the keys as synthetic
|
|
|
|
We need to keep the bottom two bits clear for defining the keys as sysctl / consumerctl
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define HID_TYPE_CL B00000000
|
|
|
|
#define HID_TYPE_LC B00000100
|
|
|
|
#define HID_TYPE_NARY B00001000
|
|
|
|
#define HID_TYPE_OOC B00001100
|
|
|
|
#define HID_TYPE_OSC B00010000
|
|
|
|
#define HID_TYPE_RTC B00010100
|
|
|
|
#define HID_TYPE_SEL B00011000
|
|
|
|
|
|
|
|
|
|
|
|
#define Key_NoKey (Key) { 0, KEY_FLAGS }
|
|
|
|
#define Key_skip (Key) { 0, KEY_FLAGS }
|
|
|
|
#define Key_Transparent (Key){ .raw = 0xffff }
|
|
|
|
#define ___ Key_Transparent
|
|
|
|
#define XXX Key_NoKey
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define KEY_BACKLIGHT_DOWN 0xF1
|
|
|
|
#define KEY_BACKLIGHT_UP 0xF2
|
|
|
|
#define Key_BacklightDown (Key) { KEY_BACKLIGHT_DOWN, KEY_FLAGS }
|
|
|
|
#define Key_BacklightUp (Key) { KEY_BACKLIGHT_UP, KEY_FLAGS }
|
|
|
|
#define KEY_RIGHT_FN2 0xfe
|
|
|
|
#define Key_RFN2 (Key) { KEY_RIGHT_FN2, KEY_FLAGS }
|
|
|
|
#define KEY_LEFT_FN2 0xff
|
|
|
|
#define Key_LFN2 (Key) { KEY_LEFT_FN2, KEY_FLAGS }
|
|
|
|
|
|
|
|
|
|
|
|
/* Most Consumer keys are more then 8bit, the highest Consumer hid code
|
|
|
|
uses 10bit. By using the 11bit as flag to indicate a consumer keys was activate we can
|
|
|
|
use the 10 lsb as the HID Consumer code. If you need to get the keycode of a Consumer key
|
|
|
|
use the CONSUMER(key) macro this will return the 10bit keycode.
|
|
|
|
*/
|
|
|
|
#define CONSUMER(key) (key.raw & 0x03FF)
|
|
|
|
#define CONSUMER_KEY(code, flags) (Key) { .raw = (code) | ((flags | SYNTHETIC|IS_CONSUMER) << 8) }
|