diff options
-rw-r--r-- | common.mk | 2 | ||||
-rw-r--r-- | common/action.c | 2 | ||||
-rw-r--r-- | common/action.h | 13 | ||||
-rw-r--r-- | common/action_layer.c | 2 | ||||
-rw-r--r-- | common/action_layer.h | 2 | ||||
-rw-r--r-- | common/action_macro.c | 8 | ||||
-rw-r--r-- | common/action_macro.h | 8 | ||||
-rw-r--r-- | common/action_util.c | 20 | ||||
-rw-r--r-- | common/action_util.h | 9 | ||||
-rw-r--r-- | common/bootmagic.c | 2 | ||||
-rw-r--r-- | common/host.c | 4 | ||||
-rw-r--r-- | common/keyboard.c | 2 | ||||
-rw-r--r-- | common/keyboard.h | 8 | ||||
-rw-r--r-- | common/keymap.c | 4 | ||||
-rw-r--r-- | common/keymap.h | 2 | ||||
-rw-r--r-- | common/print.h | 2 | ||||
-rw-r--r-- | common/report.h | 22 | ||||
-rw-r--r-- | common/wait.h | 20 | ||||
-rw-r--r-- | keyboard/mbed_onekey/HIDKeyboard.h | 11 | ||||
-rw-r--r-- | keyboard/mbed_onekey/Makefile | 1 | ||||
-rw-r--r-- | keyboard/mbed_onekey/common.mk | 12 |
21 files changed, 92 insertions, 64 deletions
@@ -11,7 +11,7 @@ SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/print.c \ $(COMMON_DIR)/bootloader.c \ $(COMMON_DIR)/suspend.c \ - $(COMMON_DIR)/xprintf.S \ + $(COMMON_DIR)/avr/xprintf.S \ $(COMMON_DIR)/util.c diff --git a/common/action.c b/common/action.c index fddb97c508..94498fe6cb 100644 --- a/common/action.c +++ b/common/action.c @@ -499,7 +499,7 @@ void clear_keyboard_but_mods(void) #endif } -bool is_tap_key(key_t key) +bool is_tap_key(keypos_t key) { action_t action = layer_switch_get_action(key); diff --git a/common/action.h b/common/action.h index 077711c231..8a4736d7bc 100644 --- a/common/action.h +++ b/common/action.h @@ -25,6 +25,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "action_macro.h" +#ifdef __cplusplus +extern "C" { +#endif + /* tapping count and state */ typedef struct { bool interrupted :1; @@ -42,12 +46,11 @@ typedef struct { #endif } keyrecord_t; - /* Execute action per keyevent */ void action_exec(keyevent_t event); /* action for key */ -action_t action_for_key(uint8_t layer, key_t key); +action_t action_for_key(uint8_t layer, keypos_t key); /* macro */ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt); @@ -65,11 +68,15 @@ void unregister_mods(uint8_t mods); void clear_keyboard(void); void clear_keyboard_but_mods(void); void layer_switch(uint8_t new_layer); -bool is_tap_key(key_t key); +bool is_tap_key(keypos_t key); /* debug */ void debug_event(keyevent_t event); void debug_record(keyrecord_t record); void debug_action(action_t action); +#ifdef __cplusplus +} +#endif + #endif /* ACTION_H */ diff --git a/common/action_layer.c b/common/action_layer.c index 526e24d539..c535615f44 100644 --- a/common/action_layer.c +++ b/common/action_layer.c @@ -112,7 +112,7 @@ void layer_debug(void) -action_t layer_switch_get_action(key_t key) +action_t layer_switch_get_action(keypos_t key) { action_t action; action.code = ACTION_TRANSPARENT; diff --git a/common/action_layer.h b/common/action_layer.h index 034e00027b..b6da353cfd 100644 --- a/common/action_layer.h +++ b/common/action_layer.h @@ -72,6 +72,6 @@ void layer_xor(uint32_t state); /* return action depending on current layer status */ -action_t layer_switch_get_action(key_t key); +action_t layer_switch_get_action(keypos_t key); #endif diff --git a/common/action_macro.c b/common/action_macro.c index d85aee3796..ba93fc8b23 100644 --- a/common/action_macro.c +++ b/common/action_macro.c @@ -14,10 +14,10 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <util/delay.h> #include "action.h" #include "action_util.h" #include "action_macro.h" +#include "wait.h" #ifdef DEBUG_ACTION #include "debug.h" @@ -28,7 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef NO_ACTION_MACRO -#define MACRO_READ() (macro = pgm_read_byte(macro_p++)) +#define MACRO_READ() (macro = MACRO_GET(macro_p++)) void action_macro_play(const macro_t *macro_p) { macro_t macro = END; @@ -58,7 +58,7 @@ void action_macro_play(const macro_t *macro_p) case WAIT: MACRO_READ(); dprintf("WAIT(%u)\n", macro); - { uint8_t ms = macro; while (ms--) _delay_ms(1); } + { uint8_t ms = macro; while (ms--) wait_ms(1); } break; case INTERVAL: interval = MACRO_READ(); @@ -77,7 +77,7 @@ void action_macro_play(const macro_t *macro_p) return; } // interval - { uint8_t ms = interval; while (ms--) _delay_ms(1); } + { uint8_t ms = interval; while (ms--) wait_ms(1); } } } #endif diff --git a/common/action_macro.h b/common/action_macro.h index 6218263088..aedc32ec6b 100644 --- a/common/action_macro.h +++ b/common/action_macro.h @@ -17,12 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef ACTION_MACRO_H #define ACTION_MACRO_H #include <stdint.h> -#include <avr/pgmspace.h> +#include "progmem.h" -#define MACRO_NONE 0 -#define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; }) - +#define MACRO_NONE 0 +#define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; }) +#define MACRO_GET(p) pgm_read_byte(p) typedef uint8_t macro_t; diff --git a/common/action_util.c b/common/action_util.c index 5f44b3812c..dbee630d18 100644 --- a/common/action_util.c +++ b/common/action_util.c @@ -31,8 +31,8 @@ static uint8_t real_mods = 0; static uint8_t weak_mods = 0; #ifdef USB_6KRO_ENABLE -#define RO_ADD(a, b) ((a + b) % REPORT_KEYS) -#define RO_SUB(a, b) ((a - b + REPORT_KEYS) % REPORT_KEYS) +#define RO_ADD(a, b) ((a + b) % KEYBOARD_REPORT_KEYS) +#define RO_SUB(a, b) ((a - b + KEYBOARD_REPORT_KEYS) % KEYBOARD_REPORT_KEYS) #define RO_INC(a) RO_ADD(a, 1) #define RO_DEC(a) RO_SUB(a, 1) static int8_t cb_head = 0; @@ -98,7 +98,7 @@ void del_key(uint8_t key) void clear_keys(void) { // not clear mods - for (int8_t i = 1; i < REPORT_SIZE; i++) { + for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { keyboard_report->raw[i] = 0; } } @@ -145,7 +145,7 @@ void clear_oneshot_mods(void) uint8_t has_anykey(void) { uint8_t cnt = 0; - for (uint8_t i = 1; i < REPORT_SIZE; i++) { + for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { if (keyboard_report->raw[i]) cnt++; } @@ -162,7 +162,7 @@ uint8_t get_first_key(void) #ifdef NKRO_ENABLE if (keyboard_nkro) { uint8_t i = 0; - for (; i < REPORT_BITS && !keyboard_report->nkro.bits[i]; i++) + for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++) ; return i<<3 | biton(keyboard_report->nkro.bits[i]); } @@ -234,7 +234,7 @@ static inline void add_key_byte(uint8_t code) #else int8_t i = 0; int8_t empty = -1; - for (; i < REPORT_KEYS; i++) { + for (; i < KEYBOARD_REPORT_KEYS; i++) { if (keyboard_report->keys[i] == code) { break; } @@ -242,7 +242,7 @@ static inline void add_key_byte(uint8_t code) empty = i; } } - if (i == REPORT_KEYS) { + if (i == KEYBOARD_REPORT_KEYS) { if (empty != -1) { keyboard_report->keys[empty] = code; } @@ -278,7 +278,7 @@ static inline void del_key_byte(uint8_t code) } while (i != cb_tail); } #else - for (uint8_t i = 0; i < REPORT_KEYS; i++) { + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { if (keyboard_report->keys[i] == code) { keyboard_report->keys[i] = 0; } @@ -289,7 +289,7 @@ static inline void del_key_byte(uint8_t code) #ifdef NKRO_ENABLE static inline void add_key_bit(uint8_t code) { - if ((code>>3) < REPORT_BITS) { + if ((code>>3) < KEYBOARD_REPORT_BITS) { keyboard_report->nkro.bits[code>>3] |= 1<<(code&7); } else { dprintf("add_key_bit: can't add: %02X\n", code); @@ -298,7 +298,7 @@ static inline void add_key_bit(uint8_t code) static inline void del_key_bit(uint8_t code) { - if ((code>>3) < REPORT_BITS) { + if ((code>>3) < KEYBOARD_REPORT_BITS) { keyboard_report->nkro.bits[code>>3] &= ~(1<<(code&7)); } else { dprintf("del_key_bit: can't del: %02X\n", code); diff --git a/common/action_util.h b/common/action_util.h index f9d3161a80..a955638b46 100644 --- a/common/action_util.h +++ b/common/action_util.h @@ -20,6 +20,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <stdint.h> #include "report.h" +#ifdef __cplusplus +extern "C" { +#endif + extern report_keyboard_t *keyboard_report; void send_keyboard_report(void); @@ -54,4 +58,9 @@ void oneshot_disable(void); uint8_t has_anykey(void); uint8_t has_anymod(void); uint8_t get_first_key(void); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/common/bootmagic.c b/common/bootmagic.c index 642d5face4..b002a58562 100644 --- a/common/bootmagic.c +++ b/common/bootmagic.c @@ -111,7 +111,7 @@ static bool scan_keycode(uint8_t keycode) matrix_row_t matrix_row = matrix_get_row(r); for (uint8_t c = 0; c < MATRIX_COLS; c++) { if (matrix_row & ((matrix_row_t)1<<c)) { - if (keycode == keymap_key_to_keycode(0, (key_t){ .row = r, .col = c })) { + if (keycode == keymap_key_to_keycode(0, (keypos_t){ .row = r, .col = c })) { return true; } } diff --git a/common/host.c b/common/host.c index 2e56971bdd..e9b7916706 100644 --- a/common/host.c +++ b/common/host.c @@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <stdint.h> -#include <avr/interrupt.h> +//#include <avr/interrupt.h> #include "keycode.h" #include "host.h" #include "util.h" @@ -55,7 +55,7 @@ void host_keyboard_send(report_keyboard_t *report) if (debug_keyboard) { dprint("keyboard_report: "); - for (uint8_t i = 0; i < REPORT_SIZE; i++) { + for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { dprintf("%02X ", report->raw[i]); } dprint("\n"); diff --git a/common/keyboard.c b/common/keyboard.c index 2b66f20a01..b71d5bf13c 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -100,7 +100,7 @@ void keyboard_task(void) for (uint8_t c = 0; c < MATRIX_COLS; c++) { if (matrix_change & ((matrix_row_t)1<<c)) { action_exec((keyevent_t){ - .key = (key_t){ .row = r, .col = c }, + .key = (keypos_t){ .row = r, .col = c }, .pressed = (matrix_row & ((matrix_row_t)1<<c)), .time = (timer_read() | 1) /* time should not be 0 */ }); diff --git a/common/keyboard.h b/common/keyboard.h index d1a922420b..60f8a89d1d 100644 --- a/common/keyboard.h +++ b/common/keyboard.h @@ -30,16 +30,16 @@ extern "C" { typedef struct { uint8_t col; uint8_t row; -} key_t; +} keypos_t; /* key event */ typedef struct { - key_t key; + keypos_t key; bool pressed; uint16_t time; } keyevent_t; -/* equivalent test of key_t */ +/* equivalent test of keypos_t */ #define KEYEQ(keya, keyb) ((keya).row == (keyb).row && (keya).col == (keyb).col) /* Rules for No Event: @@ -52,7 +52,7 @@ static inline bool IS_RELEASED(keyevent_t event) { return (!IS_NOEVENT(event) && /* Tick event */ #define TICK (keyevent_t){ \ - .key = (key_t){ .row = 255, .col = 255 }, \ + .key = (keypos_t){ .row = 255, .col = 255 }, \ .pressed = false, \ .time = (timer_read() | 1) \ } diff --git a/common/keymap.c b/common/keymap.c index bfb8ffac1a..0df2e2edff 100644 --- a/common/keymap.c +++ b/common/keymap.c @@ -28,7 +28,7 @@ static action_t keycode_to_action(uint8_t keycode); /* converts key to action */ -action_t action_for_key(uint8_t layer, key_t key) +action_t action_for_key(uint8_t layer, keypos_t key) { uint8_t keycode = keymap_key_to_keycode(layer, key); switch (keycode) { @@ -156,7 +156,7 @@ static action_t keycode_to_action(uint8_t keycode) * Consider using new keymap API instead. */ __attribute__ ((weak)) -uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { return keymap_get_keycode(layer, key.row, key.col); } diff --git a/common/keymap.h b/common/keymap.h index 4c3019a364..e1a6f992e6 100644 --- a/common/keymap.h +++ b/common/keymap.h @@ -43,7 +43,7 @@ keymap_config_t keymap_config; /* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, key_t key); +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key); /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode); diff --git a/common/print.h b/common/print.h index 4001bcf1b5..a8dbbc020a 100644 --- a/common/print.h +++ b/common/print.h @@ -37,7 +37,7 @@ #if defined(__AVR__) -#include "xprintf.h" +#include "avr/xprintf.h" // TODO: avoid collision with arduino/Print.h diff --git a/common/report.h b/common/report.h index 71543cc23f..62190469a4 100644 --- a/common/report.h +++ b/common/report.h @@ -74,19 +74,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* key report size(NKRO or boot mode) */ #if defined(PROTOCOL_PJRC) && defined(NKRO_ENABLE) # include "usb.h" -# define REPORT_SIZE KBD2_SIZE -# define REPORT_KEYS (KBD2_SIZE - 2) -# define REPORT_BITS (KBD2_SIZE - 1) +# define KEYBOARD_REPORT_SIZE KBD2_SIZE +# define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) +# define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) #elif defined(PROTOCOL_LUFA) && defined(NKRO_ENABLE) # include "protocol/lufa/descriptor.h" -# define REPORT_SIZE NKRO_EPSIZE -# define REPORT_KEYS (NKRO_EPSIZE - 2) -# define REPORT_BITS (NKRO_EPSIZE - 1) +# define KEYBOARD_REPORT_SIZE NKRO_EPSIZE +# define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) +# define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) #else -# define REPORT_SIZE 8 -# define REPORT_KEYS 6 +# define KEYBOARD_REPORT_SIZE 8 +# define KEYBOARD_REPORT_KEYS 6 #endif @@ -115,16 +115,16 @@ extern "C" { * */ typedef union { - uint8_t raw[REPORT_SIZE]; + uint8_t raw[KEYBOARD_REPORT_SIZE]; struct { uint8_t mods; uint8_t reserved; - uint8_t keys[REPORT_KEYS]; + uint8_t keys[KEYBOARD_REPORT_KEYS]; }; #ifdef NKRO_ENABLE struct { uint8_t mods; - uint8_t bits[REPORT_BITS]; + uint8_t bits[KEYBOARD_REPORT_BITS]; } nkro; #endif } __attribute__ ((packed)) report_keyboard_t; diff --git a/common/wait.h b/common/wait.h new file mode 100644 index 0000000000..40d00b0c75 --- /dev/null +++ b/common/wait.h @@ -0,0 +1,20 @@ +#ifndef WAIT_H +#define WAIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__AVR__) +# include <util/delay.h> +# define wait_ms(ms) _delay_ms(ms) +# define wait_us(us) _delay_us(us) +#elif defined(__arm__) +# include "wait_api.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/keyboard/mbed_onekey/HIDKeyboard.h b/keyboard/mbed_onekey/HIDKeyboard.h index b00c97b9b0..4ebe610a63 100644 --- a/keyboard/mbed_onekey/HIDKeyboard.h +++ b/keyboard/mbed_onekey/HIDKeyboard.h @@ -3,16 +3,7 @@ #include "stdint.h" #include "stdbool.h" #include "USBHID.h" - - -typedef union { - uint8_t raw[8]; - struct { - uint8_t mods; - uint8_t reserved; - uint8_t keys[6]; - }; -} __attribute__ ((packed)) report_keyboard_t; +#include "report.h" class HIDKeyboard : public USBDevice { diff --git a/keyboard/mbed_onekey/Makefile b/keyboard/mbed_onekey/Makefile index e194052c10..1bc91bc7e7 100644 --- a/keyboard/mbed_onekey/Makefile +++ b/keyboard/mbed_onekey/Makefile @@ -15,6 +15,7 @@ OBJDIR = ./build OBJECTS = \ $(OBJDIR)/./HIDKeyboard.o \ + $(OBJDIR)/./mbed_driver.o \ $(OBJDIR)/./main.o SYS_OBJECTS = diff --git a/keyboard/mbed_onekey/common.mk b/keyboard/mbed_onekey/common.mk index 101a822052..6eb7f76995 100644 --- a/keyboard/mbed_onekey/common.mk +++ b/keyboard/mbed_onekey/common.mk @@ -2,20 +2,20 @@ COMMON_DIR = common OBJECTS += \ $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ $(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ + $(OBJDIR)/$(COMMON_DIR)/action.o \ + $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ + $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ + $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ + $(OBJDIR)/$(COMMON_DIR)/action_util.o \ + $(OBJDIR)/$(COMMON_DIR)/host.o \ INCLUDE_PATHS += \ -I$(TMK_DIR)/$(COMMON_DIR) -# $(OBJDIR)/$(COMMON_DIR)/action.o \ -# $(OBJDIR)/$(COMMON_DIR)/host.o \ # $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_util.o \ # $(OBJDIR)/$(COMMON_DIR)/keymap.o \ # $(OBJDIR)/$(COMMON_DIR)/bootloader.o \ # $(OBJDIR)/$(COMMON_DIR)/suspend.o \ |