# Oak-Type
### Open Analog Keyboard
## Goal
Oak-Type's purpose is to be an analog-first firmware for keyboards and other computer
input devices, with an easily adjustable module system for defining new types of inputs
and outputs.
* Input and output types should be defined in a controller-agnostic way with traits and modules
* Implementations for specific hardware should require minimal code on top of a HAL
in conjunction with the oak-type library
* Configuring layouts should be able to be done through one or more config files which are
independent of the firmware
* Config files should be writable in any hierarchical format, such a JSON, XML, and YML
* Configuration files should be able to be loaded without requiring a reflash of the firmware,
ideally by saving the files to a mass-storage sector of keyboard memory
* The configured input and output types are mapped to one another in a tree data structure
## Analog First
While oak-type should be able to handle digital inputs, the first first-class input type
is analog. Analog keyboard inputs enable features such as varying the input based on how
deep a key is pressed; differential inputs, such as sending a signal while the key is going
down, and stopping as soon as the key starts going up; and joystick-like inputs for steering
right from wasd.
## Firmware-independent configuration file
With config files that can be deployed after the firmware is flashed, QOL options start to
open up.
* Wireless keyboards don't have to be plugged in to be modified
* Less data needs to be transferred, speeding up iteration and reducing turnaround time
* A bad config file can't brick an otherwise functioning board
## Configuration layers in a tree structure
Layers are fantastic, and pass through keys that aren't configured on one layer functioning
the way they do on the next lower layer saves a lot of time writing config files, but leaves
a little to be desired.
In a tree structure, a board's root layer could be a typical qwerty, dvorak, or colemak layout.
The first branch could be games, disabling the meta key, with minor differences for what
game or genre you're playing. Another could be for coding modifying an underscore key to a
sticky shift when switching between a snake-case and camel-case language.
Another option could be for OS level differences. I hate reaching for the meta key when
working in one OS, when my brain tells me I need the cmd key. If they are the same button,
the brain doesn't have to care after the layer is changed
```
root
├─ games
│ ├─ shooter
│ ├─ rhythm
│ ├─ rts
├─ coding
│ ├─ Rust
│ ├─ Python
│ ├─ Java
├─ vim
```