This guide if for maintaining and writing new classes for the keybrd library and its extension libraries. The most common reason for adding new classes are:
This guide is for the maintainers and developers of the keybrd library and it’s extensions. It is assumed the reader is familiar with the C++ language including pointers, objects, classes, static class variables, composition, aggregation, inheritance, polymorphism, and enum. Row, Scanner, and Debouncer classes use bit manipulation.
Keybrd library class inheritance diagram
Row
___ ScannerInterface ___
/ | \
Scanner_uC Scanner_IOE Scanner_ShiftRegsPISO
PortIOE
PortWriteInterface
/ \
PortWrite_PCA9655E PortWrite_MCP23S17 (one PortWrite class for each IOE type)
PortReadInterface
/ \
PortRead_PCA9655E PortRead_MCP23S17 (one PortRead class for each IOE type)
_ LED _
/ \
LED_uC LED_PCA9655E
DebouncerInterface
|
Debouncer_Samples
ScanDelay
LayerStateInterface
|
LayerState
Key
|____
| \
| Key_LayeredKeysBase
| \____________________
| / \
| Key_LayeredKeys Key_LayeredKeys1
|
|___________________________
| \ \
| Key_LayeredScScBase Key_LayeredCodeScBase
| | |
| Key_LayeredScSc Key_LayeredCodeSc
|
Code
|_____________________
| \ \
| Code_LayerLock Code_LayerHold
|
\________________________________________________________
\ \ \ \ \
Code_Sc Code_Shift Code_AutoShift Code_LEDLock Code_Null
/ \
Code_ScS Code_ScNS
Dependency diagram of example single-layer keyboard with LEDs
____ Row ______
/ | \
Scanner_uC Debouncer Key ___
| | \
readPins Code Code_LEDLock
|
LED_PinNumber
Dependency diagram of example multi-layer keyboard with layer LEDs
LayerStates
___________ Row ________________/__ | \
/ / \ / \ | \
Scanner_uC Debouncer Key_LayeredKeys / Code_Layer LED_PinNumber
| \ /
readPins Code
Dependency diagram of example shift registers Row
_______ Row _______
/ | \
RowScanner_ShiftRegsPISO Debouncer Key
|
Code
Dependency diagram of example I/O expander matrix with LEDs
_________ Row ________
/ \ \
__ Scanner_IOE __ Debouncer Key
/ | \ / \
strobePin PortWrite PortRead Code Code_LEDLock
| \ / \ |
| PortIOE readPins LED
\___________________________/ \
pin
Class names start with upper case letter. Most derived-class names start with the base class name followed by “_” and a name e.g.
Code
|
Code_LayerLock
This convention leads to class names that convey information about the classes inheritance. Underscore delineates base class name and sub-class name. Capital letters delineate words.
Interface class names end with “Interface”. Except for Key, because sketches look nicer with short names defining Key[] arrays.
Layer classes are explained in tutorial_3a_multi-layer_keyboard.md.
Code_Layer class names are concatenations of “Code_“, “Layer” or layer name, and persistence. Example persistences are:
Example Code_Layer class names:
LayerState class names start with “LayerState” and end with a descriptive name. Example LayerState class names:
Key_Layered class names start with “Key_Layered” and end with a descriptive name. Example Key_Layered class names:
Following the style guide makes it easier for the next programmer to understand your code.
void printArray(char[] array);
not
void printArray( char* array);
Arduino does not have a debugger. So here is a list of functions in the order that they are called. The trace is of a one-row single-layer keybrd scan.
loop() for each row
Row::process()
Scanner_uC::scan() strobe row on
for each readPin
set readState bit
strobe row off
Debouncer_Samples::debounce() debounce
Row::send() for each key in row
if falling edge
Key_*::release() scanCode->release()
Code_*::release() Keyboard.release(scancode)
if rising edge
Key_*::press() scanCode->press()
Code_*::press() Keyboard.press(scancode)
scanDelay.delay();
The keybrd libraries compile on the Arduino IDE and make extensive use of the following Arduino libraries:
#include <Arduino.h>
#include <Wire.h>
#include <Keyboard.h>
#include <Mouse.h>
keybrd guide by Wolfram Volpi is licensed under a Creative Commons Attribution 4.0 International License.
Permissions beyond the scope of this license may be available at https://github.com/wolfv6/keybrd/issues/new.