~ruther/qmk_firmware

c67ae2a6b546c822759352586c14cd9dccbbe0ff — tmk 11 years ago 04fe78e
Port action_* to mbed
M common.mk => common.mk +1 -1
@@ 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



M common/action.c => common/action.c +1 -1
@@ 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);


M common/action.h => common/action.h +10 -3
@@ 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 */

M common/action_layer.c => common/action_layer.c +1 -1
@@ 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;

M common/action_layer.h => common/action_layer.h +1 -1
@@ 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

M common/action_macro.c => common/action_macro.c +4 -4
@@ 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

M common/action_macro.h => common/action_macro.h +4 -4
@@ 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;


M common/action_util.c => common/action_util.c +10 -10
@@ 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);

M common/action_util.h => common/action_util.h +9 -0
@@ 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

M common/bootmagic.c => common/bootmagic.c +1 -1
@@ 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;
                }
            }

M common/host.c => common/host.c +2 -2
@@ 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");

M common/keyboard.c => common/keyboard.c +1 -1
@@ 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 */
                    });

M common/keyboard.h => common/keyboard.h +4 -4
@@ 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)                          \
}

M common/keymap.c => common/keymap.c +2 -2
@@ 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);
}

M common/keymap.h => common/keymap.h +1 -1
@@ 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);

M common/print.h => common/print.h +1 -1
@@ 37,7 37,7 @@

#if defined(__AVR__)

#include "xprintf.h"
#include "avr/xprintf.h"


// TODO: avoid collision with arduino/Print.h

M common/report.h => common/report.h +11 -11
@@ 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;

A common/wait.h => common/wait.h +20 -0
@@ 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

M keyboard/mbed_onekey/HIDKeyboard.h => keyboard/mbed_onekey/HIDKeyboard.h +1 -10
@@ 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 {

M keyboard/mbed_onekey/Makefile => keyboard/mbed_onekey/Makefile +1 -0
@@ 15,6 15,7 @@ OBJDIR = ./build

OBJECTS = \
	$(OBJDIR)/./HIDKeyboard.o \
	$(OBJDIR)/./mbed_driver.o \
	$(OBJDIR)/./main.o

SYS_OBJECTS = 

M keyboard/mbed_onekey/common.mk => keyboard/mbed_onekey/common.mk +6 -6
@@ 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 \