intermediate checkin: LOTS of things still changing

partial-rewrite
Ben Blazak 2013-01-08 19:05:26 -08:00
parent b409cf1b1e
commit c85dfd2aa6
20 changed files with 1285 additions and 857 deletions

3
TODO
View File

@ -1,3 +0,0 @@
- rewrite/rework 'references.md'
- write 'firmware/coding-conventions.md'

View File

@ -1,3 +1,5 @@
<!-- TODO: rewrite / rework -->
# References
@ -113,6 +115,11 @@
(http://stackoverflow.com/questions/4606301/gcc-why-the-lm-flag-is-needed-to-link-the-math-library)
(on <http://stackoverflow.com/>)
* [cdecl]
(http://cdecl.org)
Nice little web interface to a really helpful (when you're dealing with
confusing type signatures in C) command line program.
### C++ Stuff
* [Google C++ Style Guide]

View File

@ -1,11 +1,14 @@
/* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
/**
* - file description: The keyboard interface
* - description: |
* The keyboard interface, and related definitions
*
* Prefix: `kb__`
*/
@ -14,14 +17,38 @@
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include <stdbool.h>
#include <stdint.h>
#include <avr/pgmspace.h>
#include "../firmware/lib/layout/key-functions.h"
// ----------------------------------------------------------------------------
#if MAKE__KEYBOARD == 'ergodox'
#define KB__ROWS 6
#define KB__COLUMNS 14
#endif
// ----------------------------------------------------------------------------
typedef struct {
kf__function_pointer_t press_function;
uint16_t press_value;
kf__function_pointer_t release_function;
uint16_t release_value;
} kb__key_t;
typedef const kb__key_t * const PROGMEM kb__key_pointer_t
// ----------------------------------------------------------------------------
// controller
int8_t kb__init (void);
int8_t kb__update_matrix (bool matrix[MAKE__KB_ROWS][MAKE__KB_COLUMNS]);
int8_t kb__update_matrix (bool matrix[KB__ROWS][KB__COLUMNS]);
// LED
void kb__led__on (int8_t led);
@ -32,175 +59,220 @@ void kb__led__all_on (void);
void kb__led__all_off (void);
void kb__led__all_set (float n);
// -------
void kb__led_state__power_on (void);
void kb__led_state__ready (void);
void kb__led_delay__usb_init (void);
void kb__led__state__power_on (void);
void kb__led__state__ready (void);
void kb__led__delay__usb_init (void);
// layout
void kb__led__logical_on (char led);
void kb__led__logical_off (char led);
// -------
// TODO
// struct main__key kb__layout__get_key ( uint8_t layer, uint8_t row, uint8_t column );
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// documentation : functions --------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// controller -----------------------------------------------------------------
/**
* - function:
* name: kb__init
* description: Initialize the keyboard.
* return value:
* type: int8_t
* values:
* - { name: 0, description: success }
* - { name: '[other]', description: error }
* notes:
* - Should be called exactly once by `main()` before entering the run
* loop.
*
* - function:
* name: kb__update_matrix
* description:
* Update the given matrix to the current state of the keyboard.
* arguments:
* - type: bool[][]
* name: matrix
* description: A pointer to the matrix to update.
* notes:
* - Matrix dimensions are `[MAKE__KB_ROWS][MAKE__KB_COLUMNS]`.
* return value:
* type: int8_t
* values:
* - { name: 0, description: success }
* - { name: '[other]', description: error }
*/
// ----------------------------------------------------------------------------
// LED ------------------------------------------------------------------------
/**
* - .ignore:
*
* - &kb__led___int8_t__led
* type: int8_t
* name: led
* description:
* The number of the LED to set. Should an integer between 1 and 5
* inclusive; behavior is undefined otherwise.
* notes:
* - For US keyboards, likely only LEDs 1 through 3 will be present. But
* the function should handle 4 through 5 gracefully anyway.
*
* - &kb__led___float__n
* type: float
* name: n
* description:
* The percent of the highest possible brightness at which to set the
* LED. Should be a float between 0 and 1 inclusive; behavior is
* undefined otherwise.
*/
/**
* - function:
* name: kb__led__on
* description: Set the given LED 'on'.
* arguments:
* - *kb__led___int8_t__led
*
* - function:
* name: kb__led__off
* description: Set the given LED 'off'.
* arguments:
* - *kb__led___int8_t__led
*
* - function:
* name: kb__led__set
* description: Set the given LED's brightness (by percent).
* arguments:
* - *kb__led___int8_t__led
* - *kb__led___float__n
*/
/**
* - function:
* name: kb__led__all_on
* description: Set all the LEDs 'on'.
*
* - function:
* name: kb__led__all_off
* description: Set all the LEDs 'off'.
*
* - function:
* name: kb__led__all_set
* description: Set all the LEDs brightness (by percent).
* arguments:
* - *kb__led___float__n
*/
/**
* - function:
* name: kb__led_state__power_on
* description:
* Set the LEDs to the state that indicates the keyboard just powered on.
*
* - function:
* name: kb__led_state__ready
* description:
* Set the LEDs to the state that indicates the keyboard is ready to
* receive keystrokes.
*
* - function:
* name: kb__led_delay__usb_init
* description:
* Delay for a total of ~1 second, to allow the host to load drivers and
* such.
*/
// ----------------------------------------------------------------------------
// layout ---------------------------------------------------------------------
/**
* - .ignore:
*
* - &kb__led__logical___arguments
* - type: char
* name: led
* values:
* - { name: N, description: numlock }
* - { name: C, description: capslock }
* - { name: S, description: scroll lock }
* - { name: O, description: compose }
* - { name: K, description: kana }
*/
/**
* - function:
* name: kb__led__logical_on
* description:
* Set LEDs on based on their meaning (e.g. 'numlock', 'capslock').
* arguments: *kb__led__logical___arguments
*
* - function:
* name: kb__led__logical_off
* description:
* Set LEDs off based on their meaning (e.g. 'numlock', 'capslock').
* arguments: *kb__led__logical___arguments
*/
/**
* # TODO
* - function:
* name: kb__layout__get_key
*/
void kb__layout__exec_key ( bool pressed,
int8_t layer,
int8_t row,
int8_t column );
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__FIRMWARE__KEYBOARD__H
// TODO: rewrite, coz of changes
/** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# macros ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--
- macro:
name: '`KB__ROWS`'
values:
- { name: '`6`', description: for the ErgoDox }
- macro:
name: '`KB__COLUMNS`'
values:
- { name: '`14`', description: for the ErgoDox }
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# typedefs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- typedef:
type: '`struct`'
name: '`kb__key_t`'
description: The type of each key in the layout matrix.
values:
- type: '`uint8_t`'
name: '`value`'
description:
The value passed to the appropriate function when the key changes
state. The function may do as it wishes with this value, but it
will most commonly be a keycode to send to the host.
- type: '`kf__function_pointer_t`'
name: '`press`'
description:
The function to call when the key changes from 'released' to
'pressed'.
- type: '`kf__function_pointer_t`'
name: '`release`'
description:
The function to call when the key changes from 'pressed' to
'released'.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# controller ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-
- function:
name: '`kb__init`'
description: Initialize the keyboard.
return value:
type: '`int8_t`'
values:
- { name: '`0`', description: success }
- { name: '[other]', description: error }
notes:
- Should be called exactly once by `main()` before entering the run
loop.
- function:
name: '`kb__update_matrix`'
description:
Update the given matrix to the current state of the keyboard.
arguments:
- type: '`bool[][]`'
name: '`matrix`'
description: A pointer to the matrix to update.
notes:
- Matrix dimensions are `[KB__ROWS][KB__COLUMNS]`.
return value:
type: '`int8_t`'
values:
- { name: '`0`', description: success }
- { name: '[other]', description: error }
# LED ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--
- .ignore:
- &kb__led___int8_t__led
type: '`int8_t`'
name: '`led`'
description:
The number of the LED to set. Should an integer between 1 and 5
inclusive; behavior is undefined otherwise.
notes:
- For US keyboards, likely only LEDs 1 through 3 will be present. But
the function should handle 4 through 5 gracefully anyway.
- &kb__led___float__n
type: '`float`'
name: '`n`'
description:
The percent of the highest possible brightness at which to set the
LED. Should be a float between 0 and 1 inclusive; behavior is
undefined otherwise.
# ~~~~~~~
- function:
name: '`kb__led__on`'
description: Set the given LED 'on'.
arguments:
- *kb__led___int8_t__led
- function:
name: '`kb__led__off`'
description: Set the given LED 'off'.
arguments:
- *kb__led___int8_t__led
- function:
name: '`kb__led__set`'
description: Set the given LED's brightness (by percent).
arguments:
- *kb__led___int8_t__led
- *kb__led___float__n
# ~~~~~~~
- function:
name: '`kb__led__all_on`'
description: Set all the LEDs 'on'.
- function:
name: '`kb__led__all_off`'
description: Set all the LEDs 'off'.
- function:
name: '`kb__led__all_set`'
description: Set all the LEDs brightness (by percent).
arguments:
- *kb__led___float__n
# ~~~~~~~
- function:
name: '`kb__led__state__power_on`'
description:
Set the LEDs to the state that indicates the keyboard just powered on.
- function:
name: '`kb__led__state__ready`'
description:
Set the LEDs to the state that indicates the keyboard is ready to
receive keystrokes.
- function:
name: '`kb__led__delay__usb_init`'
description:
Delay for a total of ~1 second, to allow the host to load drivers and
such.
# layout ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--
- .ignore:
- &kb__led__logical___arguments
- type: '`char`'
name: '`led`'
values:
- { name: '`N`', description: numlock }
- { name: '`C`', description: capslock }
- { name: '`S`', description: scroll lock }
- { name: '`O`', description: compose }
- { name: '`K`', description: kana }
# ~~~~~~~
- function:
name: '`kb__led__logical_on`'
description:
Set LEDs on based on their meaning (e.g. 'numlock', 'capslock').
arguments: *kb__led__logical___arguments
- function:
name: '`kb__led__logical_off`'
description:
Set LEDs off based on their meaning (e.g. 'numlock', 'capslock').
arguments: *kb__led__logical___arguments
# ~~~~~~~
- function:
name: '`kb__layout__get_key`'
description:
Look up and return the contents of the layout matrix at the given
point.
arguments:
- { type: '`uint8_t`', name: '`layer`' }
- { type: '`uint8_t`', name: '`row`' }
- { type: '`uint8_t`', name: '`column`' }
return value:
type: '`kb__key_t`'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **/

View File

@ -143,6 +143,6 @@
-------------------------------------------------------------------------------
Copyright &copy; 2012 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (MIT) (see "license.md")
Released under The MIT License (see "license.md")
Project located at <https://github.com/benblazak/ergodox-firmware>

View File

@ -143,6 +143,6 @@
-------------------------------------------------------------------------------
Copyright &copy; 2012 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (MIT) (see "license.md")
Released under The MIT License (see "license.md")
Project located at <https://github.com/benblazak/ergodox-firmware>

View File

@ -0,0 +1,135 @@
/* ----------------------------------------------------------------------------
* Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
/**
* - description: |
* A QWERTY layout adapted from the default Kinesis layout.
*/
#include <stddef.h>
#include <avr/pgmspace.h>
#include "../../../../firmware/lib/layout/key-functions.h"
#include "../../../../firmware/lib/usb/usage-page/keyboard.h"
#include "../../../../firmware/keyboard.h"
#include "../../../../firmware/keyboard/ergodox/matrix.h"
// ----------------------------------------------------------------------------
// layout
// ----------------------------------------------------------------------------
#define KEY_T const kb__key_t * const PROGMEM
#define KEYS__DEFAULT(name, value) \
KEY_T name = { \
.press_function = &kf__press, \
.press_value = value, \
.release_function = &kf__release, \
.release_value = value, \
}
#define KEYS__SHIFTED(name, value) \
const uint16_t PROGMEM name##__press[] = { 2, \
&kf__press, KEY__LeftShift, \
&kf__press, value }; \
const uint16_t PROGMEM name##__release[] = { 2, \
&kf__release, KEY__LeftShift, \
&kf__release, value }; \
KEY_T name = { &kf__macro, &name##__press, \
&kf__macro, &name##__release }
// ----------------------------------------------------------------------------
// TODO
// - finish transcribing layout
// include default key definitions
#include "../../../../firmware/lib/layout/keys.h"
// special meaning
KEY_T Transp = NULL; // transparent
KEY_T NA = { NULL, 0, NULL, 0 }; // do nothing
// special function
KEYS__DEFAULT( Power, KEY__Power );
KEYS__DEFAULT( VolumeU, KEY__VolumeUp );
KEYS__DEFAULT( VolumeD, KEY__VolumeDown );
KEYS__DEFAULT( Mute, KEY__Mute );
// layer
KEY_T L0pu1 = { &kf__layer__push, 0x01, NULL, 0 };
KEY_T L0po = { &kf__layer__pop, 0x0, NULL, 0 };
KEY_T L0pu1po = { &kf__layer__push, 0x01, &kf__layer__pop, 0x0 };
KEY_T L1pu2po = { &kf__layer__push, 0x12, &kf__layer__pop, 0x1 };
KEY_T L2pu3 = { &kf__layer__push, 0x23, NULL, 0 };
KEY_T L2po = { &kf__layer__pop, 0x2, NULL, 0 };
// ----------------------------------------------------------------------------
KEY_T layout[][KB__ROWS][KB__COLUMNS] = {
// ----------------------------------------------------------------------------
MATRIX__LAYER( // layer 0 : default
// unused
NA,
// left hand ...... ......... ......... ......... ......... ......... .........
Equal, K1, K2, K3, K4, K5, Esc,
Bkslash, Q, W, E, R, T, L0pu1,
Tab, A, S, D, F, G,
ShiftL, Z, X, C, V, B, L0pu1po,
GUIL, Grave, Bkslash, ArrowL, ArrowR,
CtrlL, AltL,
NA, NA, Home,
Bs, Del, End,
// right hand ..... ......... ......... ......... ......... ......... .........
L2pu3, K6, K7, K8, K9, K0, Dash,
BrktL, Y, U, I, O, P, BrktR,
H, J, K, L, Semicol, Slash,
L0pu1po, N, M, Comma, Period, Slash, ShiftR,
ArrowL, ArrowD, ArrowU, ArrowR, GUIR,
AltR, CtrlR,
PageU, Nothing, NA,
PageD, Enter, Space ),
// ----------------------------------------------------------------------------
MATRIX__LAYER( // layer 1 : function and symbol keys
// TODO: still checking this, especially for shifted keys
// unused
NA,
// left hand ...... ......... ......... ......... ......... ......... .........
NA, F1, F2, F3, F4, F5, F11,
Transp, BraceL, BraceR, BrktL, BrktR, NA, L0po,
Transp, Semicol, Slash, Dash, KP0, Semicol,
Transp, KP6, KP7, KP8, KP9, Equal, L1pu2po,
Transp, Transp, Transp, Transp, Transp,
Transp, Transp,
Transp, Transp, Transp,
Transp, Transp, Transp,
// right hand ..... ......... ......... ......... ......... ......... .........
F12, F6, F7, F8, F9, F10, Power,
Transp, NA, Dash, Comma, Period, Dollar, VolumeU,
Bkslash, KP1, ParenL, ParenR, Equal, VolumeD,
L1pu2po, Asterisk, KP2, KP3, KP4, KP5, Mute,
Transp, Transp, Transp, Transp, Transp,
Transp, Transp,
Transp, Transp, Transp,
Transp, Transp, Transp ),
};
// ----------------------------------------------------------------------------
// LED control
// ----------------------------------------------------------------------------
// TODO
// - also, should this be moved to its own file?
// ----------------------------------------------------------------------------
// matrix control
// ----------------------------------------------------------------------------
// TODO
// - also, should this be moved to its own file?

View File

@ -0,0 +1,93 @@
/* ----------------------------------------------------------------------------
* Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
/**
* - description: |
* Information about the matrix
*
* Prefix: `MATRIX__`
*/
#ifndef ERGODOX_FIRMWARE__FIRMWARE__KEYBOARD__ERGODOX__MATRIX_H
#define ERGODOX_FIRMWARE__FIRMWARE__KEYBOARD__ERGODOX__MATRIX_H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
/**
* - macro:
* name: '`MATRIX__LAYER`"
* description: |
* Mapping from spatial position to matrix position.
*
* - Spatial position: Where the key is spatially, relative to other
* keys, both on the keyboard and in the layout.
* - Matrix position: The coordinate in the matrix to which a key is
* scanned by the update functions.
*
* - Location numbers are in the format `row##column`, where both 'row'
* and 'column' are single digit hex numbers corresponding to the
* matrix position (which also corresponds to the row and column pin
* labels used in the Teensy and MCP23018 files).
*
* - Coordinates:
* - optional keys
* k15, k16 (left hand thumb group)
* k17, k18 (right hand thumb group)
* - unused keys
* k36, k00 (left hand)
* k37, k0D (right hand)
* notes:
* - |
* ```
* --- other info -------------------------------------
* rows x columns = positions; used, unused
* per hand: 6 x 7 = 42; 40, 2
* total: 6 x 14 = 84; 80, 4
*
* left hand : rows 0..5, cols 0..6
* right hand : rows 0..5, cols 7..D
* ----------------------------------------------------
* ```
*/
#define MATRIX__LAYER( \
/* for unused positions */ \
na, \
\
/* left hand, spatial positions */ \
k50,k51,k52,k53,k54,k55,k56, \
k40,k41,k42,k43,k44,k45,k46, \
k30,k31,k32,k33,k34,k35, \
k20,k21,k22,k23,k24,k25,k26, \
k10,k11,k12,k13,k14, \
k05,k06, \
k15,k16,k04, \
k03,k02,k01, \
\
/* right hand, spatial positions */ \
k57,k58,k59,k5A,k5B,k5C,k5D, \
k47,k48,k49,k4A,k4B,k4C,k4D, \
k38,k39,k3A,k3B,k3C,k3D, \
k27,k28,k29,k2A,k2B,k2C,k2D, \
k19,k1A,k1B,k1C,k1D, \
k07,k08, \
k09,k17,k18, \
k0C,k0B,k0A ) \
\
/* matrix positions */ \
{{ na,k01,k02,k03,k04,k05,k06, k07,k08,k09,k0A,k0B,k0C, na }, \
{ k10,k11,k12,k13,k14,k15,k16, k17,k18,k19,k1A,k1B,k1C,k1D }, \
{ k20,k21,k22,k23,k24,k25,k26, k27,k28,k29,k2A,k2B,k2C,k2D }, \
{ k30,k31,k32,k33,k34,k35, na, na,k38,k39,k3A,k3B,k3C,k3D }, \
{ k40,k41,k42,k43,k44,k45,k46, k47,k48,k49,k4A,k4B,k4C,k4D }, \
{ k50,k51,k52,k53,k54,k55,k56, k57,k58,k59,k5A,k5B,k5C,k5D }}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__FIRMWARE__KEYBOARD__ERGODOX__MATRIX_H

View File

@ -1,10 +0,0 @@
# Files from [PJRC] (http://pjrc.com/teensy/)
* [usb_keyboard] (http://pjrc.com/teensy/usb_keyboard.zip)
-------------------------------------------------------------------------------
Copyright &copy; 2012 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (MIT) (see "license.md")
Project located at <https://github.com/benblazak/ergodox-firmware>

View File

@ -1,21 +1,35 @@
/* ----------------------------------------------------------------------------
* Originally from PJRC
* (See '.c' file for copyright and such)
* ------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------------
* Modified 2012 by Ben Blazak
* ------------------------------------------------------------------------- */
/**
* - description: |
* The USB interface
*
* Prefix: `usb__`
*
* File History:
* * Originally from [PJRC] (http://pjrc.com/teensy/) : [usb_keyboard]
* (http://pjrc.com/teensy/usb_keyboard.zip). Modified 2012, Ben Blazak.
* I'd like to rewrite it someday (partly to add a few extra features
* (like mous keys), mostly to learn how); but alas, someday has not yet
* come.
*/
#ifndef usb_serial_h__
#define usb_serial_h__
#ifndef ERGODOX_FIRMWARE__FIRMWARE__LIB__FROM_PJRC__USB_KEYBOARD__USB_KEYBOARD__H
#define ERGODOX_FIRMWARE__FIRMWARE__LIB__FROM_PJRC__USB_KEYBOARD__USB_KEYBOARD__H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include <stdint.h>
// ----------------------------------------------------------------------------
void usb__init (void); // initialize everything
uint8_t usb__is_configured (void); // is the USB port configured?
int8_t usb__kb__send (void);
int8_t usb__kb__send (void);
extern uint8_t usb__kb__modifier_keys;
extern uint8_t usb__kb__keys[6];
@ -23,10 +37,11 @@ extern volatile uint8_t usb__kb__leds;
// ----------------------------------------------------------------------------
// Everything below this point is only intended for usb_serial.c
// Everything below this point is only intended for usb_serial.c --------------
// ----------------------------------------------------------------------------
#ifdef USB_SERIAL_PRIVATE_INCLUDE
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
@ -72,7 +87,7 @@ extern volatile uint8_t usb__kb__leds;
#define PLL_CONFIG() (PLLCSR = 0x16)
#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE)))
#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK)))
#endif
#endif // defined(__AVR_AT90USB162__)
// standard control endpoint request types
#define GET_STATUS 0
@ -95,5 +110,12 @@ extern volatile uint8_t usb__kb__leds;
#define CDC_SET_LINE_CODING 0x20
#define CDC_GET_LINE_CODING 0x21
#define CDC_SET_CONTROL_LINE_STATE 0x22
#endif
#endif
#endif // USB_SERIAL_PRIVATE_INCLUDE
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__FIRMWARE__LIB__FROM_PJRC__USB_KEYBOARD__USB_KEYBOARD__H

View File

@ -0,0 +1,176 @@
/* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
/**
* - description: |
* Some generally useful key-functions, and related definitions
*
* Prefix: `kf__`
*/
#ifndef ERGODOX_FIRMWARE__FIRMWARE__LIB__LAYOUT__KEY_FUNCTIONS__H
#define ERGODOX_FIRMWARE__FIRMWARE__LIB__LAYOUT__KEY_FUNCTIONS__H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include <stdint.h>
// ----------------------------------------------------------------------------
typedef void (*kf__function_pointer_t)(uint16_t value);
// ----------------------------------------------------------------------------
// basic
void kf__press (uint16_t value);
void kf__release (uint16_t value);
void kf__send (uint16_t value);
void kf__toggle (uint16_t value);
void kf__macro (uint16_t value);
void kf__layer__push (uint16_t value);
void kf__layer__pop (uint16_t value);
// device
void kf__jump_to_bootloader (uint16_t value);
// special
void kf__two_keys_capslock_press_release (uint16_t value);
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__FIRMWARE__LIB__LAYOUT__KEY_FUNCTIONS__H
// TODO:
// - move documentation to the '.c' files
// - rewrite, coz of changes
/** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# typedefs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- typedef
type: '`void (*kf__function_pointer_t)(void)`'
name: '`kf__function_pointer_t`'
description: The pointer type for all key-functions.
notes:
- All key-functions must have the same type so that we can easily store
pointers to them, and call them using the pointers without knowing
which function specifically is being pointed to.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# basic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- function:
name: '`kf__press_release`'
description: Generate a normal keypress or keyrelease.
- function:
name: '`kf__toggle`'
description: Toggle the key pressed or unpressed.
- function:
name: '`kf__transparent`'
description:
Execute the key that would have been executed if the current layer was
not active.
# layer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- .ignore:
- &kf__layer__push
description:
Push a layer element containing the layer value specified in the keymap
to the top of the stack.
- &kf__layer__pop
description:
Pop the layer element created by the corresponding "layer push"
function out of the layer stack.
notes:
- The layer element is popped out of the stack no matter where it is in
the stack, without touching any of the other elements.
# ~~~~~~~
- function: { name: '`kf__layer__push_0`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_1`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_2`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_3`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_4`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_5`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_6`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_7`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_8`', << : *kf__layer__push }
- function: { name: '`kf__layer__push_9`', << : *kf__layer__push }
- function: { name: '`kf__layer__pop_0`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_1`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_2`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_3`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_4`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_5`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_6`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_7`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_8`', << : *kf__layer__pop }
- function: { name: '`kf__layer__pop_9`', << : *kf__layer__pop }
# device ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- function:
name: '`kf__jump_to_bootloader`'
description: For reflashing the controller
# special ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- function:
name: '`kf__shift_press_release`'
description:
Generate a "shift" press or release before the normal keypress or
keyrelease.
- function:
name: '`kf__two_keys_capslock_press_release`'
description:
When assigned to two keys (e.g. the physical left and right shift keys)
(in both the press and release matrices), pressing and holding down on
of the keys will make the second key toggle capslock.
notes:
- If either of the shifts are pressed when the second key is pressed,
they will be released so that capslock will register properly when
pressed. Capslock will then be pressed and released, and the
original state of the shifts will be restored.
- function:
name: '`kf__layer__push_numpad`'
description:
Set the numpad to on (put the numpad layer, specified in the keymap, in
a layer element at the top of the layer stack) and toggle numlock
(regardless of whether or not numlock is currently on)
notes:
- Meant to be assigned (along with "numpad off") *instead* of a normal
numlock key.
- function:
name: '`kf__layer__pop_numpad`'
description:
Set the numpad to off (pop the layer element created by "numpad on" out
of the stack) and toggle numlock (regardless of whether or not numlock
is currently on).
notes:
- Meant to be assigned (along with "numpad on") *instead* of a normal
numlock key.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **/

225
firmware/lib/layout/keys.h Normal file
View File

@ -0,0 +1,225 @@
/* ----------------------------------------------------------------------------
* Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
/**
* - description: |
* Partial key descriptions for the "Boot Keyboard Required" keys (see
* <../../../firmware/lib/usb/usage-page/keyboard.h>).
*
* Prefixes: `KEYS__`, [none]
*
* Usage: `#define` `KEYS__DEFAULT` before `#include`ing.
*
* Note: This header is meant to be included, not as an interface to
* anything, but in order to centralize a bit of code that would otherwise
* be duplicated by most layouts.
*/
#ifndef ERGODOX_FIRMWARE__FIRMWARE__LIB__LAYOUT__KEYS__H
#define ERGODOX_FIRMWARE__FIRMWARE__LIB__LAYOUT__KEYS__H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include "../../../firmware/lib/usb/usage-page/keyboard.h"
// ----------------------------------------------------------------------------
#ifndef KEYS__DEFAULT
#error "You must define `KEYS__DEFAULT`"
#endif
#ifndef KEYS__SHIFTED
#error "You must define `KEYS__SHIFTED`"
#endif
// ----------------------------------------------------------------------------
// letters
KEYS__DEFAULT( A, KEY__a_A );
KEYS__DEFAULT( B, KEY__b_B );
KEYS__DEFAULT( C, KEY__c_C );
KEYS__DEFAULT( D, KEY__d_D );
KEYS__DEFAULT( E, KEY__e_E );
KEYS__DEFAULT( F, KEY__f_F );
KEYS__DEFAULT( G, KEY__g_G );
KEYS__DEFAULT( H, KEY__h_H );
KEYS__DEFAULT( I, KEY__i_I );
KEYS__DEFAULT( J, KEY__j_J );
KEYS__DEFAULT( K, KEY__k_K );
KEYS__DEFAULT( L, KEY__l_L );
KEYS__DEFAULT( M, KEY__m_M );
KEYS__DEFAULT( N, KEY__n_N );
KEYS__DEFAULT( O, KEY__o_O );
KEYS__DEFAULT( P, KEY__p_P );
KEYS__DEFAULT( Q, KEY__q_Q );
KEYS__DEFAULT( R, KEY__r_R );
KEYS__DEFAULT( S, KEY__s_S );
KEYS__DEFAULT( T, KEY__t_T );
KEYS__DEFAULT( U, KEY__u_U );
KEYS__DEFAULT( V, KEY__v_V );
KEYS__DEFAULT( W, KEY__w_W );
KEYS__DEFAULT( X, KEY__x_X );
KEYS__DEFAULT( Y, KEY__y_Y );
KEYS__DEFAULT( Z, KEY__z_Z );
// --- (shifted) ---
KEYS__SHIFTED( CA, KEY__a_A );
KEYS__SHIFTED( CB, KEY__b_B );
KEYS__SHIFTED( CC, KEY__c_C );
KEYS__SHIFTED( CD, KEY__d_D );
KEYS__SHIFTED( CE, KEY__e_E );
KEYS__SHIFTED( CF, KEY__f_F );
KEYS__SHIFTED( CG, KEY__g_G );
KEYS__SHIFTED( CH, KEY__h_H );
KEYS__SHIFTED( CI, KEY__i_I );
KEYS__SHIFTED( CJ, KEY__j_J );
KEYS__SHIFTED( CK, KEY__k_K );
KEYS__SHIFTED( CL, KEY__l_L );
KEYS__SHIFTED( CM, KEY__m_M );
KEYS__SHIFTED( CN, KEY__n_N );
KEYS__SHIFTED( CO, KEY__o_O );
KEYS__SHIFTED( CP, KEY__p_P );
KEYS__SHIFTED( CQ, KEY__q_Q );
KEYS__SHIFTED( CR, KEY__r_R );
KEYS__SHIFTED( CS, KEY__s_S );
KEYS__SHIFTED( CT, KEY__t_T );
KEYS__SHIFTED( CU, KEY__u_U );
KEYS__SHIFTED( CV, KEY__v_V );
KEYS__SHIFTED( CW, KEY__w_W );
KEYS__SHIFTED( CX, KEY__x_X );
KEYS__SHIFTED( CY, KEY__y_Y );
KEYS__SHIFTED( CZ, KEY__z_Z );
// numbers
KEYS__DEFAULT( K0, KEY__0_RightParenthesis );
KEYS__DEFAULT( K1, KEY__1_Exclamation );
KEYS__DEFAULT( K2, KEY__2_At );
KEYS__DEFAULT( K3, KEY__3_Pound );
KEYS__DEFAULT( K4, KEY__4_Dollar );
KEYS__DEFAULT( K5, KEY__5_Percent );
KEYS__DEFAULT( K6, KEY__6_Caret );
KEYS__DEFAULT( K7, KEY__7_Ampersand );
KEYS__DEFAULT( K8, KEY__8_Asterisk );
KEYS__DEFAULT( K9, KEY__9_LeftParenthesis );
// --- (shifted) ---
KEYS__SHIFTED( ParenR, KEY__0_RightParenthesis );
KEYS__SHIFTED( Exclam, KEY__1_Exclamation );
KEYS__SHIFTED( At, KEY__2_At );
KEYS__SHIFTED( Pound, KEY__3_Pound );
KEYS__SHIFTED( Dollar, KEY__4_Dollar );
KEYS__SHIFTED( Percent, KEY__5_Percent );
KEYS__SHIFTED( Caret, KEY__6_Caret );
KEYS__SHIFTED( Amp, KEY__7_Ampersand );
KEYS__SHIFTED( Asterisk, KEY__8_Asterisk );
KEYS__SHIFTED( ParenL, KEY__9_LeftParenthesis );
// --- (keypad) ---
KEYS__DEFAULT( KP0, KEYPAD__0_Insert );
KEYS__DEFAULT( KP1, KEYPAD__1_End );
KEYS__DEFAULT( KP2, KEYPAD__2_DownArrow );
KEYS__DEFAULT( KP3, KEYPAD__3_PageDown );
KEYS__DEFAULT( KP4, KEYPAD__4_LeftArrow );
KEYS__DEFAULT( KP5, KEYPAD__5 );
KEYS__DEFAULT( KP6, KEYPAD__6_RightArrow );
KEYS__DEFAULT( KP7, KEYPAD__7_Home );
KEYS__DEFAULT( KP8, KEYPAD__8_UpArrow );
KEYS__DEFAULT( KP9, KEYPAD__9_PageUp );
// function
KEYS__DEFAULT( F1, KEY__F1 );
KEYS__DEFAULT( F2, KEY__F2 );
KEYS__DEFAULT( F3, KEY__F3 );
KEYS__DEFAULT( F4, KEY__F4 );
KEYS__DEFAULT( F5, KEY__F5 );
KEYS__DEFAULT( F6, KEY__F6 );
KEYS__DEFAULT( F7, KEY__F7 );
KEYS__DEFAULT( F8, KEY__F8 );
KEYS__DEFAULT( F9, KEY__F9 );
KEYS__DEFAULT( F10, KEY__F10 );
KEYS__DEFAULT( F11, KEY__F11 );
KEYS__DEFAULT( F12, KEY__F12 );
// whitespace and symbols
KEYS__DEFAULT( Enter, KEY__ReturnEnter );
KEYS__DEFAULT( Space, KEY__Spacebar );
KEYS__DEFAULT( Tab, KEY__Tab );
// ---
KEYS__DEFAULT( Bkslash, KEY__Backslash_Pipe );
KEYS__DEFAULT( BrktL, KEY__LeftBracket_LeftBrace );
KEYS__DEFAULT( BrktR, KEY__RightBracket_RightBrace );
KEYS__DEFAULT( Comma, KEY__Comma_LessThan );
KEYS__DEFAULT( Dash, KEY__Dash_Underscore );
KEYS__DEFAULT( Equal, KEY__Equal_Plus );
KEYS__DEFAULT( Grave, KEY__GraveAccent_Tilde );
KEYS__DEFAULT( Period, KEY__Period_GreaterThan );
KEYS__DEFAULT( Quote, KEY__SingleQuote_DoubleQuote );
KEYS__DEFAULT( Semicol, KEY__Semicolon_Colon );
KEYS__DEFAULT( Slash, KEY__Slash_Question );
// --- (shifted) ---
KEYS__SHIFTED( Pipe, KEY__Backslash_Pipe );
KEYS__SHIFTED( BraceL, KEY__LeftBracket_LeftBrace );
KEYS__SHIFTED( BraceR, KEY__RightBracket_RightBrace );
KEYS__SHIFTED( LessThan, KEY__Comma_LessThan );
KEYS__SHIFTED( Undersc, KEY__Dash_Underscore );
KEYS__SHIFTED( Plus, KEY__Equal_Plus );
KEYS__SHIFTED( Tilde, KEY__GraveAccent_Tilde );
KEYS__SHIFTED( GrtrThan, KEY__Period_GreaterThan );
KEYS__SHIFTED( DblQuote, KEY__SingleQuote_DoubleQuote );
KEYS__SHIFTED( Colon, KEY__Semicolon_Colon );
KEYS__SHIFTED( Question, KEY__Slash_Question );
// --- (keypad) ---
KEYS__DEFAULT( KPEnter, KEYPAD__Enter );
// ---
KEYS__DEFAULT( KPDec, KEYPAD__Period_Delete );
// ---
KEYS__DEFAULT( KPAdd, KEYPAD__Plus );
KEYS__DEFAULT( KPSub, KEYPAD__Minus );
KEYS__DEFAULT( KPMul, KEYPAD__Asterisk );
KEYS__DEFAULT( KPDiv, KEYPAD__Slash );
// text control
KEYS__DEFAULT( ArrowU, KEY__UpArrow );
KEYS__DEFAULT( ArrowD, KEY__DownArrow );
KEYS__DEFAULT( ArrowL, KEY__LeftArrow );
KEYS__DEFAULT( ArrowR, KEY__RightArrow );
KEYS__DEFAULT( Bs, KEY__DeleteBackspace );
KEYS__DEFAULT( Del, KEY__DeleteForward );
KEYS__DEFAULT( End, KEY__End );
KEYS__DEFAULT( Esc, KEY__Escape );
KEYS__DEFAULT( Home, KEY__Home );
KEYS__DEFAULT( Ins, KEY__Insert );
KEYS__DEFAULT( PageU, KEY__PageUp );
KEYS__DEFAULT( PageD, KEY__PageDown );
// modifier
KEYS__DEFAULT( AltR, KEY__RightAlt );
KEYS__DEFAULT( AltL, KEY__LeftAlt );
KEYS__DEFAULT( CtrlL, KEY__LeftControl );
KEYS__DEFAULT( CtrlR, KEY__RightControl );
KEYS__DEFAULT( GUIL, KEY__LeftGUI );
KEYS__DEFAULT( GUIR, KEY__RightGUI );
KEYS__DEFAULT( ShiftL, KEY__LeftShift );
KEYS__DEFAULT( ShiftR, KEY__RightShift );
// lock
KEYS__DEFAULT( Caps, KEY__CapsLock );
KEYS__DEFAULT( Scrl, KEY__ScrollLock );
// --- (keypad) ---
KEYS__DEFAULT( Num, KEYPAD__NumLock_Clear );
// special function
KEYS__DEFAULT( App, KEY__Application );
KEYS__DEFAULT( Pause, KEY__Pause );
KEYS__DEFAULT( PrScr, KEY__PrintScreen );
// international and language
KEYS__DEFAULT( NonUSBackslash, KEY__NonUS_Backslash_Pipe );
KEYS__DEFAULT( NonUSPound, KEY__NonUS_Pound_Tilde );
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__FIRMWARE__LIB__LAYOUT__KEYS__H

View File

@ -8,7 +8,7 @@
* - Device Class Definition for Human Interface Devices (HID): version 1.11
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */

View File

@ -4,7 +4,7 @@
* See "notes from usb 2.0 spec sec 9 (usb device framework).h".
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */

View File

@ -22,6 +22,6 @@
-------------------------------------------------------------------------------
Copyright &copy; 2012 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (MIT) (see "license.md")
Released under The MIT License (see "license.md")
Project located at <https://github.com/benblazak/ergodox-firmware>

View File

@ -23,7 +23,7 @@
*
* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (MIT) (see "license.md")
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */

View File

@ -5,9 +5,11 @@
* ------------------------------------------------------------------------- */
/**
* - file description: |
* - description: |
* USB Keyboard Key Codes (usage page 0x07)
*
* Prefixes: `KEY__`, `KEYPAD__`
*
* Taken from [the HID Usage Tables pdf][1], Section 10, which can be
* found on [the HID Page][2] at <http://www.usb.org>
*
@ -33,246 +35,246 @@
// ----------------------------------------------------------------------------
// Name ID // PC Mac Unix Boot Keyboard Req.
// --------------------------- ---- -- --- ---- ---------------------
// Name ID // PC Mac Unix Boot Keyboard Req.
// ---------------------------- ---- -- --- ---- --------------------
// (Reserved) 0x00 // √ √ √ 84/101/104
// (Reserved) 0x00 // √ √ √ 84/101/104
#define KEY_ErrorRollOver 0x01 // √ √ √ 84/101/104
#define KEY_POSTFail 0x02 // √ √ √ 84/101/104
#define KEY_ErrorUndefined 0x03 // √ √ √ 84/101/104
#define KEY_a_A 0x04 // √ √ √ 84/101/104
#define KEY_b_B 0x05 // √ √ √ 84/101/104
#define KEY_c_C 0x06 // √ √ √ 84/101/104
#define KEY_d_D 0x07 // √ √ √ 84/101/104
#define KEY_e_E 0x08 // √ √ √ 84/101/104
#define KEY_f_F 0x09 // √ √ √ 84/101/104
#define KEY_g_G 0x0A // √ √ √ 84/101/104
#define KEY_h_H 0x0B // √ √ √ 84/101/104
#define KEY_i_I 0x0C // √ √ √ 84/101/104
#define KEY_j_J 0x0D // √ √ √ 84/101/104
#define KEY_k_K 0x0E // √ √ √ 84/101/104
#define KEY_l_L 0x0F // √ √ √ 84/101/104
#define KEY_m_M 0x10 // √ √ √ 84/101/104
#define KEY_n_N 0x11 // √ √ √ 84/101/104
#define KEY_o_O 0x12 // √ √ √ 84/101/104
#define KEY_p_P 0x13 // √ √ √ 84/101/104
#define KEY_q_Q 0x14 // √ √ √ 84/101/104
#define KEY_r_R 0x15 // √ √ √ 84/101/104
#define KEY_s_S 0x16 // √ √ √ 84/101/104
#define KEY_t_T 0x17 // √ √ √ 84/101/104
#define KEY_u_U 0x18 // √ √ √ 84/101/104
#define KEY_v_V 0x19 // √ √ √ 84/101/104
#define KEY_w_W 0x1A // √ √ √ 84/101/104
#define KEY_x_X 0x1B // √ √ √ 84/101/104
#define KEY_y_Y 0x1C // √ √ √ 84/101/104
#define KEY_z_Z 0x1D // √ √ √ 84/101/104
#define KEY_1_Exclamation 0x1E // √ √ √ 84/101/104
#define KEY_2_At 0x1F // √ √ √ 84/101/104
#define KEY_3_Pound 0x20 // √ √ √ 84/101/104
#define KEY_4_Dollar 0x21 // √ √ √ 84/101/104
#define KEY_5_Percent 0x22 // √ √ √ 84/101/104
#define KEY_6_Caret 0x23 // √ √ √ 84/101/104
#define KEY_7_Ampersand 0x24 // √ √ √ 84/101/104
#define KEY_8_Asterisk 0x25 // √ √ √ 84/101/104
#define KEY_9_LeftParenthesis 0x26 // √ √ √ 84/101/104
#define KEY_0_RightParenthesis 0x27 // √ √ √ 84/101/104
#define KEY_ReturnEnter 0x28 // √ √ √ 84/101/104
#define KEY_Escape 0x29 // √ √ √ 84/101/104
#define KEY_DeleteBackspace 0x2A // √ √ √ 84/101/104
#define KEY_Tab 0x2B // √ √ √ 84/101/104
#define KEY_Spacebar 0x2C // √ √ √ 84/101/104
#define KEY_Dash_Underscore 0x2D // √ √ √ 84/101/104
#define KEY_Equal_Plus 0x2E // √ √ √ 84/101/104
#define KEY_LeftBracket_LeftBrace 0x2F // √ √ √ 84/101/104
#define KEY_RightBracket_RightBrace 0x30 // √ √ √ 84/101/104
#define KEY_Backslash_Pipe 0x31 // √ √ √ 84/101/104
#define KEY_NonUS_Pound_Tilde 0x32 // √ √ √ 84/101/104
#define KEY_Semicolon_Colon 0x33 // √ √ √ 84/101/104
#define KEY_SingleQuote_DoubleQuote 0x34 // √ √ √ 84/101/104
#define KEY_GraveAccent_Tilde 0x35 // √ √ √ 84/101/104
#define KEY_Comma_LessThan 0x36 // √ √ √ 84/101/104
#define KEY_Period_GreaterThan 0x37 // √ √ √ 84/101/104
#define KEY_Slash_Question 0x38 // √ √ √ 84/101/104
#define KEY_CapsLock 0x39 // √ √ √ 84/101/104
#define KEY_F1 0x3A // √ √ √ 84/101/104
#define KEY_F2 0x3B // √ √ √ 84/101/104
#define KEY_F3 0x3C // √ √ √ 84/101/104
#define KEY_F4 0x3D // √ √ √ 84/101/104
#define KEY_F5 0x3E // √ √ √ 84/101/104
#define KEY_F6 0x3F // √ √ √ 84/101/104
#define KEY_F7 0x40 // √ √ √ 84/101/104
#define KEY_F8 0x41 // √ √ √ 84/101/104
#define KEY_F9 0x42 // √ √ √ 84/101/104
#define KEY_F10 0x43 // √ √ √ 84/101/104
#define KEY_F11 0x44 // √ √ √ 101/104
#define KEY_F12 0x45 // √ √ √ 101/104
#define KEY_PrintScreen 0x46 // √ √ √ 101/104
#define KEY_ScrollLock 0x47 // √ √ √ 84/101/104
#define KEY_Pause 0x48 // √ √ √ 101/104
#define KEY_Insert 0x49 // √ √ √ 101/104
#define KEY_Home 0x4A // √ √ √ 101/104
#define KEY_PageUp 0x4B // √ √ √ 101/104
#define KEY_DeleteForward 0x4C // √ √ √ 101/104
#define KEY_End 0x4D // √ √ √ 101/104
#define KEY_PageDown 0x4E // √ √ √ 101/104
#define KEY_RightArrow 0x4F // √ √ √ 101/104
#define KEY_LeftArrow 0x50 // √ √ √ 101/104
#define KEY_DownArrow 0x51 // √ √ √ 101/104
#define KEY_UpArrow 0x52 // √ √ √ 101/104
#define KEY__ErrorRollOver 0x01 // √ √ √ 84/101/104
#define KEY__POSTFail 0x02 // √ √ √ 84/101/104
#define KEY__ErrorUndefined 0x03 // √ √ √ 84/101/104
#define KEY__a_A 0x04 // √ √ √ 84/101/104
#define KEY__b_B 0x05 // √ √ √ 84/101/104
#define KEY__c_C 0x06 // √ √ √ 84/101/104
#define KEY__d_D 0x07 // √ √ √ 84/101/104
#define KEY__e_E 0x08 // √ √ √ 84/101/104
#define KEY__f_F 0x09 // √ √ √ 84/101/104
#define KEY__g_G 0x0A // √ √ √ 84/101/104
#define KEY__h_H 0x0B // √ √ √ 84/101/104
#define KEY__i_I 0x0C // √ √ √ 84/101/104
#define KEY__j_J 0x0D // √ √ √ 84/101/104
#define KEY__k_K 0x0E // √ √ √ 84/101/104
#define KEY__l_L 0x0F // √ √ √ 84/101/104
#define KEY__m_M 0x10 // √ √ √ 84/101/104
#define KEY__n_N 0x11 // √ √ √ 84/101/104
#define KEY__o_O 0x12 // √ √ √ 84/101/104
#define KEY__p_P 0x13 // √ √ √ 84/101/104
#define KEY__q_Q 0x14 // √ √ √ 84/101/104
#define KEY__r_R 0x15 // √ √ √ 84/101/104
#define KEY__s_S 0x16 // √ √ √ 84/101/104
#define KEY__t_T 0x17 // √ √ √ 84/101/104
#define KEY__u_U 0x18 // √ √ √ 84/101/104
#define KEY__v_V 0x19 // √ √ √ 84/101/104
#define KEY__w_W 0x1A // √ √ √ 84/101/104
#define KEY__x_X 0x1B // √ √ √ 84/101/104
#define KEY__y_Y 0x1C // √ √ √ 84/101/104
#define KEY__z_Z 0x1D // √ √ √ 84/101/104
#define KEY__1_Exclamation 0x1E // √ √ √ 84/101/104
#define KEY__2_At 0x1F // √ √ √ 84/101/104
#define KEY__3_Pound 0x20 // √ √ √ 84/101/104
#define KEY__4_Dollar 0x21 // √ √ √ 84/101/104
#define KEY__5_Percent 0x22 // √ √ √ 84/101/104
#define KEY__6_Caret 0x23 // √ √ √ 84/101/104
#define KEY__7_Ampersand 0x24 // √ √ √ 84/101/104
#define KEY__8_Asterisk 0x25 // √ √ √ 84/101/104
#define KEY__9_LeftParenthesis 0x26 // √ √ √ 84/101/104
#define KEY__0_RightParenthesis 0x27 // √ √ √ 84/101/104
#define KEY__ReturnEnter 0x28 // √ √ √ 84/101/104
#define KEY__Escape 0x29 // √ √ √ 84/101/104
#define KEY__DeleteBackspace 0x2A // √ √ √ 84/101/104
#define KEY__Tab 0x2B // √ √ √ 84/101/104
#define KEY__Spacebar 0x2C // √ √ √ 84/101/104
#define KEY__Dash_Underscore 0x2D // √ √ √ 84/101/104
#define KEY__Equal_Plus 0x2E // √ √ √ 84/101/104
#define KEY__LeftBracket_LeftBrace 0x2F // √ √ √ 84/101/104
#define KEY__RightBracket_RightBrace 0x30 // √ √ √ 84/101/104
#define KEY__Backslash_Pipe 0x31 // √ √ √ 84/101/104
#define KEY__NonUS_Pound_Tilde 0x32 // √ √ √ 84/101/104
#define KEY__Semicolon_Colon 0x33 // √ √ √ 84/101/104
#define KEY__SingleQuote_DoubleQuote 0x34 // √ √ √ 84/101/104
#define KEY__GraveAccent_Tilde 0x35 // √ √ √ 84/101/104
#define KEY__Comma_LessThan 0x36 // √ √ √ 84/101/104
#define KEY__Period_GreaterThan 0x37 // √ √ √ 84/101/104
#define KEY__Slash_Question 0x38 // √ √ √ 84/101/104
#define KEY__CapsLock 0x39 // √ √ √ 84/101/104
#define KEY__F1 0x3A // √ √ √ 84/101/104
#define KEY__F2 0x3B // √ √ √ 84/101/104
#define KEY__F3 0x3C // √ √ √ 84/101/104
#define KEY__F4 0x3D // √ √ √ 84/101/104
#define KEY__F5 0x3E // √ √ √ 84/101/104
#define KEY__F6 0x3F // √ √ √ 84/101/104
#define KEY__F7 0x40 // √ √ √ 84/101/104
#define KEY__F8 0x41 // √ √ √ 84/101/104
#define KEY__F9 0x42 // √ √ √ 84/101/104
#define KEY__F10 0x43 // √ √ √ 84/101/104
#define KEY__F11 0x44 // √ √ √ 101/104
#define KEY__F12 0x45 // √ √ √ 101/104
#define KEY__PrintScreen 0x46 // √ √ √ 101/104
#define KEY__ScrollLock 0x47 // √ √ √ 84/101/104
#define KEY__Pause 0x48 // √ √ √ 101/104
#define KEY__Insert 0x49 // √ √ √ 101/104
#define KEY__Home 0x4A // √ √ √ 101/104
#define KEY__PageUp 0x4B // √ √ √ 101/104
#define KEY__DeleteForward 0x4C // √ √ √ 101/104
#define KEY__End 0x4D // √ √ √ 101/104
#define KEY__PageDown 0x4E // √ √ √ 101/104
#define KEY__RightArrow 0x4F // √ √ √ 101/104
#define KEY__LeftArrow 0x50 // √ √ √ 101/104
#define KEY__DownArrow 0x51 // √ √ √ 101/104
#define KEY__UpArrow 0x52 // √ √ √ 101/104
#define KEYPAD_NumLock_Clear 0x53 // √ √ √ 101/104
#define KEYPAD_Slash 0x54 // √ √ √ 101/104
#define KEYPAD_Asterisk 0x55 // √ √ √ 84/101/104
#define KEYPAD_Minus 0x56 // √ √ √ 84/101/104
#define KEYPAD_Plus 0x57 // √ √ √ 84/101/104
#define KEYPAD_ENTER 0x58 // √ √ √ 101/104
#define KEYPAD_1_End 0x59 // √ √ √ 84/101/104
#define KEYPAD_2_DownArrow 0x5A // √ √ √ 84/101/104
#define KEYPAD_3_PageDown 0x5B // √ √ √ 84/101/104
#define KEYPAD_4_LeftArrow 0x5C // √ √ √ 84/101/104
#define KEYPAD_5 0x5D // √ √ √ 84/101/104
#define KEYPAD_6_RightArrow 0x5E // √ √ √ 84/101/104
#define KEYPAD_7_Home 0x5F // √ √ √ 84/101/104
#define KEYPAD_8_UpArrow 0x60 // √ √ √ 84/101/104
#define KEYPAD_9_PageUp 0x61 // √ √ √ 84/101/104
#define KEYPAD_0_Insert 0x62 // √ √ √ 84/101/104
#define KEYPAD_Period_Delete 0x63 // √ √ √ 84/101/104
#define KEYPAD__NumLock_Clear 0x53 // √ √ √ 101/104
#define KEYPAD__Slash 0x54 // √ √ √ 101/104
#define KEYPAD__Asterisk 0x55 // √ √ √ 84/101/104
#define KEYPAD__Minus 0x56 // √ √ √ 84/101/104
#define KEYPAD__Plus 0x57 // √ √ √ 84/101/104
#define KEYPAD__Enter 0x58 // √ √ √ 101/104
#define KEYPAD__1_End 0x59 // √ √ √ 84/101/104
#define KEYPAD__2_DownArrow 0x5A // √ √ √ 84/101/104
#define KEYPAD__3_PageDown 0x5B // √ √ √ 84/101/104
#define KEYPAD__4_LeftArrow 0x5C // √ √ √ 84/101/104
#define KEYPAD__5 0x5D // √ √ √ 84/101/104
#define KEYPAD__6_RightArrow 0x5E // √ √ √ 84/101/104
#define KEYPAD__7_Home 0x5F // √ √ √ 84/101/104
#define KEYPAD__8_UpArrow 0x60 // √ √ √ 84/101/104
#define KEYPAD__9_PageUp 0x61 // √ √ √ 84/101/104
#define KEYPAD__0_Insert 0x62 // √ √ √ 84/101/104
#define KEYPAD__Period_Delete 0x63 // √ √ √ 84/101/104
#define KEY_NonUS_Backslash_Pipe 0x64 // √ √ √ 84/101/104
#define KEY_Application 0x65 // √ - √ 104
#define KEY_Power 0x66 // - √ √ -
#define KEY__NonUS_Backslash_Pipe 0x64 // √ √ √ 84/101/104
#define KEY__Application 0x65 // √ - √ 104
#define KEY__Power 0x66 // - √ √ -
#define KEYPAD_Equal 0x67 // - √ - -
#define KEYPAD__Equal 0x67 // - √ - -
#define KEY_F13 0x68 // - √ - -
#define KEY_F14 0x69 // - √ - -
#define KEY_F15 0x6A // - √ - -
#define KEY_F16 0x6B // - - - -
#define KEY_F17 0x6C // - - - -
#define KEY_F18 0x6D // - - - -
#define KEY_F19 0x6E // - - - -
#define KEY_F20 0x6F // - - - -
#define KEY_F21 0x70 // - - - -
#define KEY_F22 0x71 // - - - -
#define KEY_F23 0x72 // - - - -
#define KEY_F24 0x73 // - - - -
#define KEY_Execute 0x74 // - - √ -
#define KEY_Help 0x75 // - - √ -
#define KEY_Menu 0x76 // - - √ -
#define KEY_Select 0x77 // - - √ -
#define KEY_Stop 0x78 // - - √ -
#define KEY_Again 0x79 // - - √ -
#define KEY_Undo 0x7A // - - √ -
#define KEY_Cut 0x7B // - - √ -
#define KEY_Copy 0x7C // - - √ -
#define KEY_Paste 0x7D // - - √ -
#define KEY_Find 0x7E // - - √ -
#define KEY_Mute 0x7F // - - √ -
#define KEY_VolumeUp 0x80 // - - √ -
#define KEY_VolumeDown 0x81 // - - √ -
#define KEY_LockingCapsLock 0x82 // - - √ -
#define KEY_LockingNumLock 0x83 // - - √ -
#define KEY_LockingScrollLock 0x84 // - - √ -
#define KEY__F13 0x68 // - √ - -
#define KEY__F14 0x69 // - √ - -
#define KEY__F15 0x6A // - √ - -
#define KEY__F16 0x6B // - - - -
#define KEY__F17 0x6C // - - - -
#define KEY__F18 0x6D // - - - -
#define KEY__F19 0x6E // - - - -
#define KEY__F20 0x6F // - - - -
#define KEY__F21 0x70 // - - - -
#define KEY__F22 0x71 // - - - -
#define KEY__F23 0x72 // - - - -
#define KEY__F24 0x73 // - - - -
#define KEY__Execute 0x74 // - - √ -
#define KEY__Help 0x75 // - - √ -
#define KEY__Menu 0x76 // - - √ -
#define KEY__Select 0x77 // - - √ -
#define KEY__Stop 0x78 // - - √ -
#define KEY__Again 0x79 // - - √ -
#define KEY__Undo 0x7A // - - √ -
#define KEY__Cut 0x7B // - - √ -
#define KEY__Copy 0x7C // - - √ -
#define KEY__Paste 0x7D // - - √ -
#define KEY__Find 0x7E // - - √ -
#define KEY__Mute 0x7F // - - √ -
#define KEY__VolumeUp 0x80 // - - √ -
#define KEY__VolumeDown 0x81 // - - √ -
#define KEY__LockingCapsLock 0x82 // - - √ -
#define KEY__LockingNumLock 0x83 // - - √ -
#define KEY__LockingScrollLock 0x84 // - - √ -
#define KEYPAD_Comma 0x85 // - - - -
#define KEYPAD_EqualSign 0x86 // - - - -
#define KEYPAD__Comma 0x85 // - - - -
#define KEYPAD__EqualSign 0x86 // - - - -
#define KEY_International1 0x87 // - - - -
#define KEY_International2 0x88 // - - - -
#define KEY_International3 0x89 // - - - -
#define KEY_International4 0x8A // - - - -
#define KEY_International5 0x8B // - - - -
#define KEY_International6 0x8C // - - - -
#define KEY_International7 0x8D // - - - -
#define KEY_International8 0x8E // - - - -
#define KEY_International9 0x8F // - - - -
#define KEY_LANG1 0x90 // - - - -
#define KEY_LANG2 0x91 // - - - -
#define KEY_LANG3 0x92 // - - - -
#define KEY_LANG4 0x93 // - - - -
#define KEY_LANG5 0x94 // - - - -
#define KEY_LANG6 0x95 // - - - -
#define KEY_LANG7 0x96 // - - - -
#define KEY_LANG8 0x97 // - - - -
#define KEY_LANG9 0x98 // - - - -
#define KEY_AlternateErase 0x99 // - - - -
#define KEY_SysReq_Attention 0x9A // - - - -
#define KEY_Cancel 0x9B // - - - -
#define KEY_Clear 0x9C // - - - -
#define KEY_Prior 0x9D // - - - -
#define KEY_Return 0x9E // - - - -
#define KEY_Separator 0x9F // - - - -
#define KEY_Out 0xA0 // - - - -
#define KEY_Oper 0xA1 // - - - -
#define KEY_Clear_Again 0xA2 // - - - -
#define KEY_CrSel_Props 0xA3 // - - - -
#define KEY_ExSel 0xA4 // - - - -
#define KEY__International1 0x87 // - - - -
#define KEY__International2 0x88 // - - - -
#define KEY__International3 0x89 // - - - -
#define KEY__International4 0x8A // - - - -
#define KEY__International5 0x8B // - - - -
#define KEY__International6 0x8C // - - - -
#define KEY__International7 0x8D // - - - -
#define KEY__International8 0x8E // - - - -
#define KEY__International9 0x8F // - - - -
#define KEY__LANG1 0x90 // - - - -
#define KEY__LANG2 0x91 // - - - -
#define KEY__LANG3 0x92 // - - - -
#define KEY__LANG4 0x93 // - - - -
#define KEY__LANG5 0x94 // - - - -
#define KEY__LANG6 0x95 // - - - -
#define KEY__LANG7 0x96 // - - - -
#define KEY__LANG8 0x97 // - - - -
#define KEY__LANG9 0x98 // - - - -
#define KEY__AlternateErase 0x99 // - - - -
#define KEY__SysReq_Attention 0x9A // - - - -
#define KEY__Cancel 0x9B // - - - -
#define KEY__Clear 0x9C // - - - -
#define KEY__Prior 0x9D // - - - -
#define KEY__Return 0x9E // - - - -
#define KEY__Separator 0x9F // - - - -
#define KEY__Out 0xA0 // - - - -
#define KEY__Oper 0xA1 // - - - -
#define KEY__Clear_Again 0xA2 // - - - -
#define KEY__CrSel_Props 0xA3 // - - - -
#define KEY__ExSel 0xA4 // - - - -
// (Reserved) 0xA5..0xAF // - - - -
// (Reserved) 0xA5..0xAF // - - - -
#define KEYPAD_00 0xB0 // - - - -
#define KEYPAD_000 0xB1 // - - - -
#define KEYPAD__00 0xB0 // - - - -
#define KEYPAD__000 0xB1 // - - - -
#define KEY_ThousandsSeparator 0xB2 // - - - -
#define KEY_DecimalSeparator 0xB3 // - - - -
#define KEY_CurrencyUnit 0xB4 // - - - -
#define KEY_CurrencySubunit 0xB5 // - - - -
#define KEY__ThousandsSeparator 0xB2 // - - - -
#define KEY__DecimalSeparator 0xB3 // - - - -
#define KEY__CurrencyUnit 0xB4 // - - - -
#define KEY__CurrencySubunit 0xB5 // - - - -
#define KEYPAD_LeftParenthesis 0xB6 // - - - -
#define KEYPAD_RightParenthesis 0xB7 // - - - -
#define KEYPAD_LeftBrace 0xB8 // - - - -
#define KEYPAD_RightBrace 0xB9 // - - - -
#define KEYPAD__LeftParenthesis 0xB6 // - - - -
#define KEYPAD__RightParenthesis 0xB7 // - - - -
#define KEYPAD__LeftBrace 0xB8 // - - - -
#define KEYPAD__RightBrace 0xB9 // - - - -
#define KEYPAD_Tab 0xBA // - - - -
#define KEYPAD_Backspace 0xBB // - - - -
#define KEYPAD_A 0xBC // - - - -
#define KEYPAD_B 0xBD // - - - -
#define KEYPAD_C 0xBE // - - - -
#define KEYPAD_D 0xBF // - - - -
#define KEYPAD_E 0xC0 // - - - -
#define KEYPAD_F 0xC1 // - - - -
#define KEYPAD_XOR 0xC2 // - - - -
#define KEYPAD_Caret 0xC3 // - - - -
#define KEYPAD_Percent 0xC4 // - - - -
#define KEYPAD_LessThan 0xC5 // - - - -
#define KEYPAD_GreaterThan 0xC6 // - - - -
#define KEYPAD_Ampersand 0xC7 // - - - -
#define KEYPAD_AmpersandAmpersand 0xC8 // - - - -
#define KEYPAD_Pipe 0xC9 // - - - -
#define KEYPAD_PipePipe 0xCA // - - - -
#define KEYPAD_Colon 0xCB // - - - -
#define KEYPAD_Pound 0xCC // - - - -
#define KEYPAD_Space 0xCD // - - - -
#define KEYPAD_At 0xCE // - - - -
#define KEYPAD_Exclamation 0xCF // - - - -
#define KEYPAD_MemoryStore 0xD0 // - - - -
#define KEYPAD_MemoryRecall 0xD1 // - - - -
#define KEYPAD_MemoryClear 0xD2 // - - - -
#define KEYPAD_MemoryAdd 0xD3 // - - - -
#define KEYPAD_MemorySubtract 0xD4 // - - - -
#define KEYPAD_MemoryMultiply 0xD5 // - - - -
#define KEYPAD_MemoryDivide 0xD6 // - - - -
#define KEYPAD_PlusMinus 0xD7 // - - - -
#define KEYPAD_Clear 0xD8 // - - - -
#define KEYPAD_ClearEntry 0xD9 // - - - -
#define KEYPAD_Binary 0xDA // - - - -
#define KEYPAD_Octal 0xDB // - - - -
#define KEYPAD_Decimal 0xDC // - - - -
#define KEYPAD_Hexadecimal 0xDD // - - - -
#define KEYPAD__Tab 0xBA // - - - -
#define KEYPAD__Backspace 0xBB // - - - -
#define KEYPAD__A 0xBC // - - - -
#define KEYPAD__B 0xBD // - - - -
#define KEYPAD__C 0xBE // - - - -
#define KEYPAD__D 0xBF // - - - -
#define KEYPAD__E 0xC0 // - - - -
#define KEYPAD__F 0xC1 // - - - -
#define KEYPAD__XOR 0xC2 // - - - -
#define KEYPAD__Caret 0xC3 // - - - -
#define KEYPAD__Percent 0xC4 // - - - -
#define KEYPAD__LessThan 0xC5 // - - - -
#define KEYPAD__GreaterThan 0xC6 // - - - -
#define KEYPAD__Ampersand 0xC7 // - - - -
#define KEYPAD__AmpersandAmpersand 0xC8 // - - - -
#define KEYPAD__Pipe 0xC9 // - - - -
#define KEYPAD__PipePipe 0xCA // - - - -
#define KEYPAD__Colon 0xCB // - - - -
#define KEYPAD__Pound 0xCC // - - - -
#define KEYPAD__Space 0xCD // - - - -
#define KEYPAD__At 0xCE // - - - -
#define KEYPAD__Exclamation 0xCF // - - - -
#define KEYPAD__MemoryStore 0xD0 // - - - -
#define KEYPAD__MemoryRecall 0xD1 // - - - -
#define KEYPAD__MemoryClear 0xD2 // - - - -
#define KEYPAD__MemoryAdd 0xD3 // - - - -
#define KEYPAD__MemorySubtract 0xD4 // - - - -
#define KEYPAD__MemoryMultiply 0xD5 // - - - -
#define KEYPAD__MemoryDivide 0xD6 // - - - -
#define KEYPAD__PlusMinus 0xD7 // - - - -
#define KEYPAD__Clear 0xD8 // - - - -
#define KEYPAD__ClearEntry 0xD9 // - - - -
#define KEYPAD__Binary 0xDA // - - - -
#define KEYPAD__Octal 0xDB // - - - -
#define KEYPAD__Decimal 0xDC // - - - -
#define KEYPAD__Hexadecimal 0xDD // - - - -
// (Reserved) 0xDE..0xDF // - - - -
// (Reserved) 0xDE..0xDF // - - - -
#define KEY_LeftControl 0xE0 // √ √ √ 84/101/104
#define KEY_LeftShift 0xE1 // √ √ √ 84/101/104
#define KEY_LeftAlt 0xE2 // √ √ √ 84/101/104
#define KEY_LeftGUI 0xE3 // √ √ √ 104
#define KEY_RightControl 0xE4 // √ √ √ 101/104
#define KEY_RightShift 0xE5 // √ √ √ 84/101/104
#define KEY_RightAlt 0xE6 // √ √ √ 101/104
#define KEY_RightGUI 0xE7 // √ √ √ 104
#define KEY__LeftControl 0xE0 // √ √ √ 84/101/104
#define KEY__LeftShift 0xE1 // √ √ √ 84/101/104
#define KEY__LeftAlt 0xE2 // √ √ √ 84/101/104
#define KEY__LeftGUI 0xE3 // √ √ √ 104
#define KEY__RightControl 0xE4 // √ √ √ 101/104
#define KEY__RightShift 0xE5 // √ √ √ 84/101/104
#define KEY__RightAlt 0xE6 // √ √ √ 101/104
#define KEY__RightGUI 0xE7 // √ √ √ 104
// (Reserved) 0xE8..0xFFFF // - - - -
// (Reserved) 0xE8..0xFFFF // - - - -
// ----------------------------------------------------------------------------

View File

@ -1,315 +0,0 @@
/* ----------------------------------------------------------------------------
* Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
* Released under The MIT License (see "license.md")
* Project located at <https://github.com/benblazak/ergodox-firmware>
* ------------------------------------------------------------------------- */
/**
* - file description: |
* USB Keyboard Key Codes : short names
*
* These are for convenience (and to help with formatting, keeping stuff
* from getting too long). See <../keyboard.h> for definitions and
* everything.
* ----------------------------------------------------------------------------
*/
#ifndef ERGODOX_FIRMWARE__FIRMWARE__LIB__USB__USAGE_PAGE__KEYBOARD__SHORT_NAMES__H
#define ERGODOX_FIRMWARE__FIRMWARE__LIB__USB__USAGE_PAGE__KEYBOARD__SHORT_NAMES__H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include "./long-names.h"
// ----------------------------------------------------------------------------
// protocol
// ----------------------------------------------------------------------------
// error
#define _ErrRollover KEY_ErrorRollOver
#define _PostFail KEY_POSTFail
#define _ErrUndef KEY_ErrorUndefined
// ----------------------------------------------------------------------------
// main keyboard
// ----------------------------------------------------------------------------
// letters
#define _A KEY_a_A
#define _B KEY_b_B
#define _C KEY_c_C
#define _D KEY_d_D
#define _E KEY_e_E
#define _F KEY_f_F
#define _G KEY_g_G
#define _H KEY_h_H
#define _I KEY_i_I
#define _J KEY_j_J
#define _K KEY_k_K
#define _L KEY_l_L
#define _M KEY_m_M
#define _N KEY_n_N
#define _O KEY_o_O
#define _P KEY_p_P
#define _Q KEY_q_Q
#define _R KEY_r_R
#define _S KEY_s_S
#define _T KEY_t_T
#define _U KEY_u_U
#define _V KEY_v_V
#define _W KEY_w_W
#define _X KEY_x_X
#define _Y KEY_y_Y
#define _Z KEY_z_Z
// numbers
#define _0 KEY_0_RightParenthesis
#define _1 KEY_1_Exclamation
#define _2 KEY_2_At
#define _3 KEY_3_Pound
#define _4 KEY_4_Dollar
#define _5 KEY_5_Percent
#define _6 KEY_6_Caret
#define _7 KEY_7_Ampersand
#define _8 KEY_8_Asterisk
#define _9 KEY_9_LeftParenthesis
// function
#define _F1 KEY_F1
#define _F2 KEY_F2
#define _F3 KEY_F3
#define _F4 KEY_F4
#define _F5 KEY_F5
#define _F6 KEY_F6
#define _F7 KEY_F7
#define _F8 KEY_F8
#define _F9 KEY_F9
#define _F10 KEY_F10
#define _F11 KEY_F11
#define _F12 KEY_F12
#define _F13 KEY_F13
#define _F14 KEY_F14
#define _F15 KEY_F15
#define _F16 KEY_F16
#define _F17 KEY_F17
#define _F18 KEY_F18
#define _F19 KEY_F19
#define _F20 KEY_F20
#define _F21 KEY_F21
#define _F22 KEY_F22
#define _F23 KEY_F23
#define _F24 KEY_F24
// whitespace and symbols
#define _enter KEY_ReturnEnter
#define _space KEY_Spacebar
#define _tab KEY_Tab
// ---
#define _backslash KEY_Backslash_Pipe
#define _bracketL KEY_LeftBracket_LeftBrace
#define _bracketR KEY_RightBracket_RightBrace
#define _comma KEY_Comma_LessThan
#define _dash KEY_Dash_Underscore
#define _equal KEY_Equal_Plus
#define _grave KEY_GraveAccent_Tilde
#define _period KEY_Period_GreaterThan
#define _quote KEY_SingleQuote_DoubleQuote
#define _semicolon KEY_Semicolon_Colon
#define _slash KEY_Slash_Question
// ---
#define _sep_dec KEY_DecimalSeparator
#define _sep_thousands KEY_ThousandsSeparator
#define _currencyUnit KEY_CurrencyUnit
#define _currencySubunit KEY_CurrencySubunit
// international and language
#define _int1 KEY_International1
#define _int2 KEY_International2
#define _int3 KEY_International3
#define _int4 KEY_International4
#define _int5 KEY_International5
#define _int6 KEY_International6
#define _int7 KEY_International7
#define _int8 KEY_International8
#define _int9 KEY_International9
// ---
#define _lang1 KEY_LANG1
#define _lang2 KEY_LANG2
#define _lang3 KEY_LANG3
#define _lang4 KEY_LANG4
#define _lang5 KEY_LANG5
#define _lang6 KEY_LANG6
#define _lang7 KEY_LANG7
#define _lang8 KEY_LANG8
#define _lang9 KEY_LANG9
// ---
#define _backslash_nonUS KEY_NonUS_Backslash_Pipe
#define _pound_nonUS KEY_NonUS_Pound_Tilde
// text control
#define _bs KEY_DeleteBackspace
#define _del KEY_DeleteForward
#define _home KEY_Home
#define _end KEY_End
#define _pageU KEY_PageUp
#define _pageD KEY_PageDown
#define _arrowU KEY_UpArrow
#define _arrowD KEY_DownArrow
#define _arrowL KEY_LeftArrow
#define _arrowR KEY_RightArrow
#define _esc KEY_Escape
#define _insert KEY_Insert
// modifier
#define _altL KEY_LeftAlt
#define _altR KEY_RightAlt
#define _ctrlL KEY_LeftControl
#define _ctrlR KEY_RightControl
#define _guiL KEY_LeftGUI
#define _guiR KEY_RightGUI
#define _shiftL KEY_LeftShift
#define _shiftR KEY_RightShift
// lock
#define _capsLock KEY_CapsLock
#define _scrollLock KEY_ScrollLock
// (numlock is under keypad)
// --- not generally used
#define _capsLock_locking KEY_LockingCapsLock
#define _numLock_locking KEY_LockingNumLock
#define _scrollLock_locking KEY_LockingScrollLock
// special function
#define _pause KEY_Pause
#define _print KEY_PrintScreen
// ---
#define _application KEY_Application
#define _execute KEY_Execute
#define _power KEY_Power
// ---
#define _help KEY_Help
#define _menu KEY_Menu
// ---
#define _cut KEY_Cut
#define _copy KEY_Copy
#define _paste KEY_Paste
#define _find KEY_Find
#define _select KEY_Select
#define _stop KEY_Stop
#define _undo KEY_Undo
// ---
#define _mute KEY_Mute
#define _volumeU KEY_VolumeUp
#define _volumeD KEY_VolumeDown
// ---
#define _altErase KEY_AlternateErase
// ---
#define _again KEY_Again
#define _cancel KEY_Cancel
#define _clear_again KEY_Clear_Again
#define _clear KEY_Clear
#define _oper KEY_Oper
#define _out KEY_Out
#define _prior KEY_Prior
#define _return KEY_Return
#define _separator KEY_Separator
// ---
#define _crSel KEY_CrSel_Props
#define _exSel KEY_ExSel
#define _sysReq KEY_SysReq_Attention
// ----------------------------------------------------------------------------
// keypad
// ----------------------------------------------------------------------------
// numbers and hex letters
#define _1_kp KEYPAD_1_End
#define _2_kp KEYPAD_2_DownArrow
#define _3_kp KEYPAD_3_PageDown
#define _4_kp KEYPAD_4_LeftArrow
#define _5_kp KEYPAD_5
#define _6_kp KEYPAD_6_RightArrow
#define _7_kp KEYPAD_7_Home
#define _8_kp KEYPAD_8_UpArrow
#define _9_kp KEYPAD_9_PageUp
#define _0_kp KEYPAD_0_Insert
#define _A_kp KEYPAD_A
#define _B_kp KEYPAD_B
#define _C_kp KEYPAD_C
#define _D_kp KEYPAD_D
#define _E_kp KEYPAD_E
#define _F_kp KEYPAD_F
// ---
#define _00_kp KEYPAD_00
#define _000_kp KEYPAD_000
// whitespace and symbols
#define _tab_kp KEYPAD_Tab
#define _space_kp KEYPAD_Space
#define _enter_kp KEYPAD_ENTER
// ---
#define _dec_del_kp KEYPAD_Period_Delete
#define _comma_kp KEYPAD_Comma
#define _equal_kp KEYPAD_Equal
#define _equalSign_kp KEYPAD_EqualSign
#define _parenL_kp KEYPAD_LeftParenthesis
#define _parenR_kp KEYPAD_RightParenthesis
#define _braceL_kp KEYPAD_LeftBrace
#define _braceR_kp KEYPAD_RightBrace
// operations
// --- basic
#define _add_kp KEYPAD_Plus
#define _sub_kp KEYPAD_Minus
#define _mul_kp KEYPAD_Asterisk
#define _div_kp KEYPAD_Slash
#define _plusMinus_kp KEYPAD_PlusMinus
// --- logical
#define _lt_kp KEYPAD_LessThan
#define _gt_kp KEYPAD_GreaterThan
#define _xor_kp KEYPAD_XOR
#define _and_kp KEYPAD_Ampersand
#define _andand_kp KEYPAD_AmpersandAmpersand
#define _pipe_kp KEYPAD_Pipe
#define _pipepipe_kp KEYPAD_PipePipe
#define _caret_kp KEYPAD_Caret
#define _exclamation_kp KEYPAD_Exclamation
// --- other
#define _at_kp KEYPAD_At
#define _colon_kp KEYPAD_Colon
#define _percent_kp KEYPAD_Percent
#define _pound_kp KEYPAD_Pound
// radix
#define _bin_kp KEYPAD_Binary
#define _oct_kp KEYPAD_Octal
#define _dec_kp KEYPAD_Decimal
#define _hex_kp KEYPAD_Hexadecimal
// text control
#define _bs_kp KEYPAD_Backspace
#define _clear_kp KEYPAD_Clear
#define _clearEntry_kp KEYPAD_ClearEntry
// lock
#define _numLock_kp KEYPAD_NumLock_Clear
// memory control
#define _memStore_kp KEYPAD_MemoryStore
#define _memRecall_kp KEYPAD_MemoryRecall
#define _memClear_kp KEYPAD_MemoryClear
#define _memAdd_kp KEYPAD_MemoryAdd
#define _memSub_kp KEYPAD_MemorySubtract
#define _memMul_kp KEYPAD_MemoryMultiply
#define _memDiv_kp KEYPAD_MemoryDivide
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__SRC__LIB__USB__USAGE_PAGE__KEYBOARD__SHORT_NAMES__H

View File

@ -5,9 +5,11 @@
* ------------------------------------------------------------------------- */
/**
* - file description: |
* - description: |
* USB LED Codes (usage page 0x08)
*
* Prefix: `LED__`
*
* Taken from [the HID Usage Tables pdf][1], Section 11,
* which can be found on [the HID Page][2] at <http://www.usb.org>
*
@ -29,90 +31,90 @@
// ----------------------------------------------------------------------------
// Name ID Usage Type Section of HID Tables
// --------------------------- ---- ---------- ----------------------
// Name ID Usage Type Section of HID Tables
// ---------------------------- ---- ---------- ---------------------
// (Undefined) 0x00 // - -
// (Undefined) 0x00 // - -
#define LED_NumLock 0x01 // OOC 11.1
#define LED_CapsLock 0x02 // OOC 11.1
#define LED_ScrollLock 0x03 // OOC 11.1
#define LED_Compose 0x04 // OOC 11.1
#define LED_Kana 0x05 // OOC 11.1
#define LED_Power 0x06 // OOC 11.6
#define LED_Shift 0x07 // OOC 11.1
#define LED_DoNotDisturb 0x08 // OOC 11.2
#define LED_Mute 0x09 // OOC 11.3
#define LED_ToneEnable 0x0A // OOC 11.3
#define LED_HighCutFilter 0x0B // OOC 11.3
#define LED_LowCutFilter 0x0C // OOC 11.3
#define LED_EqualizerEnable 0x0D // OOC 11.3
#define LED_SoundFieldOn 0x0E // OOC 11.3
#define LED_SurroundOn 0x0F // OOC 11.3
#define LED_Repeat 0x10 // OOC 11.3
#define LED_Stereo 0x11 // OOC 11.3
#define LED_SamplingRateDetect 0x12 // OOC 11.3
#define LED_Spinning 0x13 // OOC 11.4
#define LED_CAV 0x14 // OOC 11.3
#define LED_CLV 0x15 // OOC 11.3
#define LED_RecordingFormatDetect 0x16 // OOC 11.4
#define LED_OffHook 0x17 // OOC 11.2
#define LED_Ring 0x18 // OOC 11.2
#define LED_MessageWaiting 0x19 // OOC 11.2
#define LED_DataMode 0x1A // OOC 11.2
#define LED_BatteryOperation 0x1B // OOC 11.6
#define LED_BatteryOK 0x1C // OOC 11.6
#define LED_BatteryLow 0x1D // OOC 11.6
#define LED_Speaker 0x1E // OOC 11.2
#define LED_HeadSet 0x1F // OOC 11.2
#define LED_Hold 0x20 // OOC 11.2
#define LED_Microphone 0x21 // OOC 11.2
#define LED_Coverage 0x22 // OOC 11.2
#define LED_NightMode 0x23 // OOC 11.2
#define LED_SendCalls 0x24 // OOC 11.2
#define LED_CallPickup 0x25 // OOC 11.2
#define LED_Conference 0x26 // OOC 11.2
#define LED_Standby 0x27 // OOC 11.6
#define LED_CameraOn 0x28 // OOC 11.3
#define LED_CameraOff 0x29 // OOC 11.3
#define LED_OnLine 0x2A // OOC 11.6
#define LED_OffLine 0x2B // OOC 11.6
#define LED_Busy 0x2C // OOC 11.6
#define LED_Ready 0x2D // OOC 11.6
#define LED_PaperOut 0x2E // OOC 11.5
#define LED_PaperJam 0x2F // OOC 11.5
#define LED_Remote 0x30 // OOC 11.6
#define LED_Forward 0x31 // OOC 11.4
#define LED_Reverse 0x32 // OOC 11.4
#define LED_Stop 0x33 // OOC 11.4
#define LED_Rewind 0x34 // OOC 11.4
#define LED_FastForward 0x35 // OOC 11.4
#define LED_Play 0x36 // OOC 11.4
#define LED_Pause 0x37 // OOC 11.4
#define LED_Record 0x38 // OOC 11.4
#define LED_Error 0x39 // OOC 11.6
#define LED_UsageSelectedIndicator 0x3A // US 11.6
#define LED_UsageInUseIndicator 0x3B // US 11.6
#define LED_UsageMultiModeIndicator 0x3C // UM 11.6
#define LED_IndicatorOn 0x3D // Sel 11.6
#define LED_IndicatorFlash 0x3E // Sel 11.6
#define LED_IndicatorSlowBlink 0x3F // Sel 11.6
#define LED_IndicatorFastBlink 0x40 // Sel 11.6
#define LED_IndicatorOff 0x41 // Sel 11.6
#define LED_FlashOnTime 0x42 // DV 11.6
#define LED_SlowBlinkOnTime 0x43 // DV 11.6
#define LED_SlowBlinkOffTime 0x44 // DV 11.6
#define LED_FastBlinkOnTime 0x45 // DV 11.6
#define LED_FastBlinkOffTime 0x46 // DV 11.6
#define LED_UsageIndicatorColor 0x47 // UM 11.6
#define LED_IndicatorRed 0x48 // Sel 11.6
#define LED_IndicatorGreen 0x49 // Sel 11.6
#define LED_IndicatorAmber 0x4A // Sel 11.6
#define LED_GenericIndicator 0x4B // OOC 11.6
#define LED_SystemSuspend 0x4C // OOC 11.6
#define LED_ExternalPowerConnected 0x4D // OOC 11.6
#define LED__NumLock 0x01 // OOC 11.1
#define LED__CapsLock 0x02 // OOC 11.1
#define LED__ScrollLock 0x03 // OOC 11.1
#define LED__Compose 0x04 // OOC 11.1
#define LED__Kana 0x05 // OOC 11.1
#define LED__Power 0x06 // OOC 11.6
#define LED__Shift 0x07 // OOC 11.1
#define LED__DoNotDisturb 0x08 // OOC 11.2
#define LED__Mute 0x09 // OOC 11.3
#define LED__ToneEnable 0x0A // OOC 11.3
#define LED__HighCutFilter 0x0B // OOC 11.3
#define LED__LowCutFilter 0x0C // OOC 11.3
#define LED__EqualizerEnable 0x0D // OOC 11.3
#define LED__SoundFieldOn 0x0E // OOC 11.3
#define LED__SurroundOn 0x0F // OOC 11.3
#define LED__Repeat 0x10 // OOC 11.3
#define LED__Stereo 0x11 // OOC 11.3
#define LED__SamplingRateDetect 0x12 // OOC 11.3
#define LED__Spinning 0x13 // OOC 11.4
#define LED__CAV 0x14 // OOC 11.3
#define LED__CLV 0x15 // OOC 11.3
#define LED__RecordingFormatDetect 0x16 // OOC 11.4
#define LED__OffHook 0x17 // OOC 11.2
#define LED__Ring 0x18 // OOC 11.2
#define LED__MessageWaiting 0x19 // OOC 11.2
#define LED__DataMode 0x1A // OOC 11.2
#define LED__BatteryOperation 0x1B // OOC 11.6
#define LED__BatteryOK 0x1C // OOC 11.6
#define LED__BatteryLow 0x1D // OOC 11.6
#define LED__Speaker 0x1E // OOC 11.2
#define LED__HeadSet 0x1F // OOC 11.2
#define LED__Hold 0x20 // OOC 11.2
#define LED__Microphone 0x21 // OOC 11.2
#define LED__Coverage 0x22 // OOC 11.2
#define LED__NightMode 0x23 // OOC 11.2
#define LED__SendCalls 0x24 // OOC 11.2
#define LED__CallPickup 0x25 // OOC 11.2
#define LED__Conference 0x26 // OOC 11.2
#define LED__Standby 0x27 // OOC 11.6
#define LED__CameraOn 0x28 // OOC 11.3
#define LED__CameraOff 0x29 // OOC 11.3
#define LED__OnLine 0x2A // OOC 11.6
#define LED__OffLine 0x2B // OOC 11.6
#define LED__Busy 0x2C // OOC 11.6
#define LED__Ready 0x2D // OOC 11.6
#define LED__PaperOut 0x2E // OOC 11.5
#define LED__PaperJam 0x2F // OOC 11.5
#define LED__Remote 0x30 // OOC 11.6
#define LED__Forward 0x31 // OOC 11.4
#define LED__Reverse 0x32 // OOC 11.4
#define LED__Stop 0x33 // OOC 11.4
#define LED__Rewind 0x34 // OOC 11.4
#define LED__FastForward 0x35 // OOC 11.4
#define LED__Play 0x36 // OOC 11.4
#define LED__Pause 0x37 // OOC 11.4
#define LED__Record 0x38 // OOC 11.4
#define LED__Error 0x39 // OOC 11.6
#define LED__UsageSelectedIndicator 0x3A // US 11.6
#define LED__UsageInUseIndicator 0x3B // US 11.6
#define LED__UsageMultiModeIndicator 0x3C // UM 11.6
#define LED__IndicatorOn 0x3D // Sel 11.6
#define LED__IndicatorFlash 0x3E // Sel 11.6
#define LED__IndicatorSlowBlink 0x3F // Sel 11.6
#define LED__IndicatorFastBlink 0x40 // Sel 11.6
#define LED__IndicatorOff 0x41 // Sel 11.6
#define LED__FlashOnTime 0x42 // DV 11.6
#define LED__SlowBlinkOnTime 0x43 // DV 11.6
#define LED__SlowBlinkOffTime 0x44 // DV 11.6
#define LED__FastBlinkOnTime 0x45 // DV 11.6
#define LED__FastBlinkOffTime 0x46 // DV 11.6
#define LED__UsageIndicatorColor 0x47 // UM 11.6
#define LED__IndicatorRed 0x48 // Sel 11.6
#define LED__IndicatorGreen 0x49 // Sel 11.6
#define LED__IndicatorAmber 0x4A // Sel 11.6
#define LED__GenericIndicator 0x4B // OOC 11.6
#define LED__SystemSuspend 0x4C // OOC 11.6
#define LED__ExternalPowerConnected 0x4D // OOC 11.6
// (Reserved) 0x4E..0xFFFF // - -
// (Reserved) 0x4E..0xFFFF // - -
// ----------------------------------------------------------------------------

View File

@ -1,9 +1,10 @@
# ----------------------------------------------------------------------------
# Global options
# ----------------------------------------------------------------------------
# Copyright (c) 2012 Ben Blazak <benblazak.dev@gmail.com>
# Copyright (c) 2013 Ben Blazak <benblazak.dev@gmail.com>
# Released under The MIT License (see "doc/license.md")
# Project located at <https://github.com/benblazak/ergodox-firmware>
# ----------------------------------------------------------------------------
# TODO

View File

@ -10,55 +10,76 @@
### Comments
`/** ... */` comments are to be written in YAML, so they can be processed by
external tools to generate documentation, and for other purposes. The format
is as follows (with all elements being optional):
external tools to generate documentation, and for other purposes.
- .ignore: <anything>
* When read the following will be stripped:
* The first line (typically `/**`)
* The last line (typically ` */`)
* The first two characters of each line (typically ` *`)
- file description: <string.markdown>
- function:
name: <string>
description: <string>
arguments:
- type: <string>
name: <string>
description: <string>
values:
- name: <string>
description: <string>
notes:
- <string>
notes:
- <string>
return value:
type: <string>
description: <string>
values:
- name: <string>
description: <string>
notes:
- <string>
notes:
- <string>
notes:
- <string>
* All elements are optional.
* All list elements are repeatable.
* All of these elements may all be specified from within any scanned file.
* Some of these elements have defaults (commented below); giving them a value
explicitly will override that.
* The element `.ignore` may appear in any list, and should be ignored.
### "Namespace" prefixes
"Namespace" prefixes are prepended to variables and macros (in lower and upper
case, respectively), sometimes hierarchically, separated by `__`. I call them
what I do because this is somewhat similar to using `::` for namespace
separation as in C++.
- &atom '<boolean>|<number>|<string.markdown>'
* `KB`: from `firmware/keyboard/...`
- &value-map
type: *atom
name: *atom
description: *atom
values: [ *value-map ]
notes: [ *atom ]
* `MAKE`: passed to the compiler by `make` (i.e. a global option)
- &description-map
# the file description
description: *atom
- &function-map
function:
<< : *value-map
arguments: *value-map
return value: *value-map
- &macro-map
macro: { << : *value-map }
- &typedef-map
typedef: { << : *value-map }
- &file-map
file:
# name: taken from the filesystem
# description: taken from the '[filename].md' if it exists
<< : [ *description-map, *value-map ]
functions: [ *function-map ]
macros: [ *macro-map ]
typedefs: [ *typedef-map ]
- &directory-map
directory:
# name: taken from filesystem
# description: taken from the 'readme.md' if it exists
<< : *value-map
files: [ *file-map ]
directories: [ *directory-map ]
- &project-map
project:
<< : *value-map
directories: [ *directory-map ]
- projects: [ *project-map ]
-------------------------------------------------------------------------------
Copyright &copy; 2012 Ben Blazak <benblazak.dev@gmail.com>
Copyright &copy; 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
Released under The MIT License (see "license.md")
Project located at <https://github.com/benblazak/ergodox-firmware>