forked from mirrors/qmk_firmware
Port action_* to mbed
This commit is contained in:
parent
04fe78ee0a
commit
c67ae2a6b5
21 changed files with 92 additions and 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
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 */
|
||||
});
|
||||
|
|
|
@ -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) \
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
#if defined(__AVR__)
|
||||
|
||||
#include "xprintf.h"
|
||||
#include "avr/xprintf.h"
|
||||
|
||||
|
||||
// TODO: avoid collision with arduino/Print.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;
|
||||
|
|
20
common/wait.h
Normal file
20
common/wait.h
Normal file
|
@ -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
|
|
@ -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 {
|
||||
|
|
|
@ -15,6 +15,7 @@ OBJDIR = ./build
|
|||
|
||||
OBJECTS = \
|
||||
$(OBJDIR)/./HIDKeyboard.o \
|
||||
$(OBJDIR)/./mbed_driver.o \
|
||||
$(OBJDIR)/./main.o
|
||||
|
||||
SYS_OBJECTS =
|
||||
|
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in a new issue