intermediate checkin

partial-rewrite
Ben Blazak 2013-01-10 03:08:25 -08:00
parent 9bb6198878
commit f70568c1c0
8 changed files with 348 additions and 94 deletions

View File

@ -42,8 +42,6 @@ typedef struct {
uint16_t release_value;
} kb__key_t;
typedef const kb__key_t * const PROGMEM kb__key_pointer_t
// ----------------------------------------------------------------------------
// controller

View File

@ -0,0 +1,38 @@
/* ----------------------------------------------------------------------------
* 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 place for all things common to the other default files, including
* `#include`s. Other code (especially functions defined in this directory)
* may break if you change things defined here, so be careful if you do.
*/
#ifndef ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__COMMON_H
#define ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__COMMON_H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include "../../../../../firmware/keyboard.h"
#include "../../../../../firmware/lib/layout/key-functions.h"
#include "../../../../../firmware/lib/usb/usage-page/keyboard.h"
// ----------------------------------------------------------------------------
typedef const kb__key_t * const PROGMEM key_t
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__COMMON_H

View File

@ -0,0 +1,48 @@
/* ----------------------------------------------------------------------------
* 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 default way to execute keys. Meant to be included by the layout using
* it (and nowhere else, since it's actual code).
*
* Note: This oddish setup is used to allow layouts to easily change some
* default things without having to deal with all of them.
*/
#ifndef ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__EXEC_KEY_C_H
#define ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__EXEC_KEY_C_H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include "./common.h"
extern key_t layout[][KB__ROWS][KB__COLUMNS];
// ----------------------------------------------------------------------------
void kb__layout__exec_key( bool pressed,
int8_t layer,
int8_t row,
int8_t column ) {
// TODO
// - check for key redefinition in the EEPROM
// - if there is one, execute it, according to the appropriate rules
// - lookup key in PROGMEM
// - if it's transparent, look up the one below it, and so on
// - NULL key pointers are transparent
// - { NULL, 0, NULL, 0 } keys do nothing; this is the default, if no
// key can be found
// - call the press or release function, with the appropriate argument
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__EXEC_KEY_C_H

View File

@ -0,0 +1,106 @@
/* ----------------------------------------------------------------------------
* 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: |
* Extended (from the definitions in ".../lib/layout/keys.h") default key
* definitions. Feel free not to use them, if they're not convenient.
*/
#ifndef ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__KEYS_H
#define ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__KEYS_H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include "./common.h"
// ----------------------------------------------------------------------------
// `keys__` macros (needed by ".../lib/layout/keys.h")
#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__progmem, &name##__press, \
&kf__macro__progmem, &name##__release }
// default key definitions
#include "../../../../firmware/lib/layout/keys.h"
// other `keys__` macros (in the `keys__` namespace for consistency)
#define KEYS__TWO_KEYS_CAPSLOCK_PRESS_RELEASE(name, value) \
const uint16_t PROGMEM name##__press[] = { \
2, &kf__two_keys_capslock, 1, \
&kf__press, value }; \
const uint16_t PROGMEM name##__release[] = { \
2, &kf__two_keys_capslock, 0, \
&kf__release, value }; \
key_t name = { &kf__macro__progmem, &name##__press, \
&kf__macro__progmem, &name##release }
// ----------------------------------------------------------------------------
// special meaning
key_t Transp = NULL; // transparent
key_t NA = { NULL, 0, NULL, 0 }; // do nothing
// special keycode
KEYS__DEFAULT( Power, KEY__Power );
KEYS__DEFAULT( VolumeU, KEY__VolumeUp );
KEYS__DEFAULT( VolumeD, KEY__VolumeDown );
KEYS__DEFAULT( Mute, KEY__Mute );
// special function
// --- Sh2KCapL
KEYS__TWO_KEYS_CAPSLOCK_PRESS_RELEASE( Sh2KCapL, KEY__LeftShift );
// --- Sh2KCapR
KEYS__TWO_KEYS_CAPSLOCK_PRESS_RELEASE( Sh2KCapR, KEY__RightShift );
// --- Btldr
key_t Btldr = { &kf__jump_to_bootloader, 0, NULL, 0 };
// --- NumPush
const uint16_t PROGMEM NumPush__press[] = {
2, &kf__layer__push, 0x0203,
&kf__press, KEY__LockingNumLock };
key_t NumPush = { &kf__macro__progmem, &NumPush__press,
&kf__release, KEY__LockingNumLock };
// --- NumPop
const uint16_t PROGMEM NumPop__press[] = {
2, &kf__layer__pop, 0x02,
&kf__press, KEY__LockingNumLock };
key_t NumPop = { &kf__macro__progmem, &NumPop__press,
&kf__release, KEY__LockingNumLock };
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__KEYBOARD__ERGODOX__LAYOUT__DEFAULT__KEYS_H

View File

@ -6,7 +6,8 @@
/**
* - description: |
* A QWERTY layout adapted from the default Kinesis layout.
* A QWERTY layout adapted from the default Kinesis layout. The position of
* the symbol keys on the function layer was taken from the Arensito layout.
*/
@ -18,72 +19,61 @@
#include "../../../../firmware/keyboard/ergodox/matrix.h"
// ----------------------------------------------------------------------------
// matrix control
// ----------------------------------------------------------------------------
#include "./default/exec_key.c.h"
// ----------------------------------------------------------------------------
// LED control
// ----------------------------------------------------------------------------
void kb__led__logical_on(char led) {
switch led {
case 'N': kb__led__on(1); break; // numlock
case 'C': kb__led__on(2); break; // capslock
case 'S': kb__led__on(3); break; // scroll lock
case 'O': break; // compose
case 'K': break; // kana
};
}
void kb__led__logical_off(char led) {
switch led {
case 'N': kb__led__off(1); break; // numlock
case 'C': kb__led__off(2); break; // capslock
case 'S': kb__led__off(3); break; // scroll lock
case 'O': break; // compose
case 'K': break; // kana
};
}
// ----------------------------------------------------------------------------
// keys
// ----------------------------------------------------------------------------
#include "./default/keys.h"
// layer
key_t L0pu1 = { &kf__layer__push, 0x0001, NULL, 0 };
key_t L0po = { &kf__layer__pop, 0x00, NULL, 0 };
key_t L0pu1po = { &kf__layer__push, 0x0001, &kf__layer__pop, 0x00 };
key_t L1pu2po = { &kf__layer__push, 0x0102, &kf__layer__pop, 0x01 };
// ----------------------------------------------------------------------------
// layout
// ----------------------------------------------------------------------------
#define KEY_T const kb__key_t * const PROGMEM
// needed by ".../lib/layout/keys.h"
#define KEYS__DEFAULT(name, value) \
KEY_T name = { \
.press_function = &kf__press, \
.press_value = value, \
.release_function = &kf__release, \
.release_value = value, \
}
// needed by ".../lib/layout/keys.h"
#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 }
key_t layout[][KB__ROWS][KB__COLUMNS] = {
// ----------------------------------------------------------------------------
// 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 keycode
KEYS__DEFAULT( Power, KEY__Power );
KEYS__DEFAULT( VolumeU, KEY__VolumeUp );
KEYS__DEFAULT( VolumeD, KEY__VolumeDown );
KEYS__DEFAULT( Mute, KEY__Mute );
// special function
#define TWO_KEYS_CAPSLOCK kf__two_keys_capslock_press_release
KEY_T Sh2KCapL = { &TWO_KEYS_CAPSLOCK, (1<<8)|KEY__LeftShift,
&TWO_KEYS_CAPSLOCK, (0<<8)|KEY__LeftShift };
KEY_T Sh2KCapR = { &TWO_KEYS_CAPSLOCK, (1<<8)|KEY__RightShift,
&TWO_KEYS_CAPSLOCK, (0<<8)|KEY__RightShift };
#undef TWO_KEYS_CAPSLOCK
KEY_T Btldr = { &kf__jump_to_bootloader, 0, NULL, 0 };
// TODO
KEY_T NumPush = { &kf__layer__push, 0x23, NULL, 0 };
KEY_T NumPop = { &kf__layer__pop, 0x2, NULL, 0 };
// /TODO
// 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 layout[][KB__ROWS][KB__COLUMNS] = {
// ----------------------------------------------------------------------------
MATRIX__LAYER( // layer 0 : default
// unused
NA,
// left hand ...... ......... ......... ......... ......... ......... .........
@ -98,50 +88,85 @@ Sh2KCapL, Z, X, C, V, B, L0pu1po,
// right hand ..... ......... ......... ......... ......... ......... .........
NumPush, K6, K7, K8, K9, K0, Dash,
BrktL, Y, U, I, O, P, BrktR,
H, J, K, L, Semicol, Slash,
H, J, K, L, Semicol, Quote,
L0pu1po, N, M, Comma, Period, Slash, Sh2KCapR,
ArrowL, ArrowD, ArrowU, ArrowR, GUIR,
AltR, CtrlR,
PageU, Nothing, NA,
PageU, NA, 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, Semicol, Slash, Dash, KP0, Colon,
Transp, KP6, KP7, KP8, KP9, Plus, 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,
F12, F6, F7, F8, F9, F10, Power,
Transp, NA, Undersc, LessThan, GrtrThan, 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 ),
// ----------------------------------------------------------------------------
MATRIX__LAYER( // layer 2 : keyboard functions
// unused
NA,
// left hand ...... ......... ......... ......... ......... ......... .........
Btldr, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA,
NA, NA,
NA, NA, NA,
NA, NA, NA,
// right hand ..... ......... ......... ......... ......... ......... .........
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA,
NA, NA,
NA, NA, NA,
NA, NA, NA ),
// ----------------------------------------------------------------------------
MATRIX__LAYER( // layer 3 : numpad
// unused
NA,
// left hand ...... ......... ......... ......... ......... ......... .........
Transp, Transp, Transp, Transp, Transp, Transp, Transp,
Transp, Transp, Transp, Transp, Transp, Transp, Transp,
Transp, Transp, Transp, Transp, Transp, Transp,
Transp, Transp, Transp, Transp, Transp, Transp, Transp,
Transp, Ins, Transp, Transp, Transp,
Transp, Transp,
Transp, Transp, Transp,
Transp, Transp, Transp,
// right hand ..... ......... ......... ......... ......... ......... .........
NumPop, Transp, NumPop, Equal, KPDiv, KPMul,
Transp, Transp, KP7, KP8, KP9, KPSub, Transp,
Transp, KP4, KP5, KP6, KPAdd, Transp,
Transp, Transp, KP1, KP2, KP3, KPEnter, Transp,
Transp, Transp, Period, KPEnter, Transp,
Transp, Transp,
Transp, Transp, Transp,
Transp, Transp, KP0 ),
// ----------------------------------------------------------------------------
};
// ----------------------------------------------------------------------------
// 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

@ -54,7 +54,7 @@
* ----------------------------------------------------
* ```
*/
#define MATRIX__LAYER( \
#define MATRIX__LAYER( \
/* for unused positions */ \
na, \
\

View File

@ -26,19 +26,20 @@ 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);
void kf__press (uint16_t keycode);
void kf__release (uint16_t keycode);
void kf__send (uint16_t ignore);
void kf__toggle (uint16_t keycode);
void kf__layer__push (uint16_t layer_stack_id__layer_number);
void kf__layer__pop (uint16_t layer_stack_id);
void kf__macro__progmem (uint16_t pointer);
void kf__macro__eeprom (uint16_t pointer);
// device
void kf__jump_to_bootloader (uint16_t value);
void kf__jump_to_bootloader (uint16_t ignore);
// special
void kf__two_keys_capslock_press_release (uint16_t value);
void kf__two_keys_capslock (uint16_t pressed);
// ----------------------------------------------------------------------------

38
firmware/main.h Normal file
View File

@ -0,0 +1,38 @@
/* ----------------------------------------------------------------------------
* 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: |
* Things kept track of by `main()` that need to be accessible to other parts
* of the program.
*
* Prefix: `main__`
*/
#ifndef ERGODOX_FIRMWARE__FIRMWARE__MAIN_H
#define ERGODOX_FIRMWARE__FIRMWARE__MAIN_H
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
uint8_t main__layer_stack__peek (uint8_t offset);
uint8_t main__layer_stack__push (uint8_t layer_id, uint8_t layer_number);
uint8_t main__layer_stack__pop_id (uint8_t layer_id);
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#endif // ERGODOX_FIRMWARE__FIRMWARE__MAIN_H
// TODO
/** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **/