Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds webusb support #204

Merged
merged 19 commits into from Dec 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Expand Up @@ -13,4 +13,4 @@
url = https://github.com/google/googletest
[submodule "lib/lufa"]
path = lib/lufa
url = https://github.com/qmk/lufa
url = https://github.com/zsa/lufa
6 changes: 5 additions & 1 deletion common_features.mk
Expand Up @@ -234,7 +234,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
CIE1931_CURVE = yes
endif


COMMON_VPATH += $(QUANTUM_DIR)/backlight
SRC += $(QUANTUM_DIR)/backlight/backlight.c
OPT_DEFS += -DBACKLIGHT_ENABLE
Expand Down Expand Up @@ -288,6 +288,10 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes)
include $(TMK_DIR)/protocol/usb_hid.mk
endif

ifeq ($(strip $(WEBUSB_ENABLE)), yes)
SRC += $(TMK_DIR)/common/webusb.c
endif

ifeq ($(strip $(ENCODER_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/encoder.c
OPT_DEFS += -DENCODER_ENABLE
Expand Down
5 changes: 3 additions & 2 deletions keyboards/ergodox_ez/config.h
Expand Up @@ -25,9 +25,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x1307
#define DEVICE_VER 0x0001
#define MANUFACTURER ErgoDox EZ
#define PRODUCT ErgoDox EZ
#define MANUFACTURER ZSA
#define PRODUCT Ergodox EZ
#define DESCRIPTION QMK keyboard firmware for Ergodox EZ
#define WEBUSB_LANDING_PAGE_URL u8"configure.ergodox-ez.com"

/* key matrix size */
#define MATRIX_ROWS 14
Expand Down
65 changes: 65 additions & 0 deletions keyboards/ergodox_ez/ergodox_ez.c
@@ -1,5 +1,9 @@
#include QMK_KEYBOARD_H

#ifdef WEBUSB_ENABLE
#include "webusb.h"
#endif

extern inline void ergodox_board_led_on(void);
extern inline void ergodox_right_led_1_on(void);
extern inline void ergodox_right_led_2_on(void);
Expand Down Expand Up @@ -336,6 +340,17 @@ void keyboard_post_init_kb(void) {


bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
#ifdef WEBUSB_ENABLE
if(webusb_state.paired == true) {
uint8_t event[5];
event[0] = WEBUSB_STATUS_OK;
event[1] = record->event.pressed ? WEBUSB_EVT_KEYDOWN : WEBUSB_EVT_KEYUP;
event[2] = record->event.key.col;
event[3] = record->event.key.row;
event[4] = WEBUSB_STOP_BIT;
webusb_send(event, sizeof(event));
}
#endif
switch (keycode) {
case LED_LEVEL:
if (record->event.pressed) {
Expand Down Expand Up @@ -387,3 +402,53 @@ void eeconfig_init_kb(void) { // EEPROM is getting reset!
eeconfig_update_kb(keyboard_config.raw);
eeconfig_init_user();
}

#ifdef WEBUSB_ENABLE
static uint16_t loops = 0;
static bool is_on = false;

void matrix_scan_kb(void) {
if(webusb_state.pairing == true) {
if(loops == 0) {
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
}
if(loops % WEBUSB_BLINK_STEPS == 0) {
if(is_on) {
ergodox_right_led_2_off();
}
else {
ergodox_right_led_2_on();
}
is_on ^= 1;
}
if(loops > WEBUSB_BLINK_END) {
webusb_state.pairing = false;
layer_state_set_user(layer_state);
loops = 0;
}
loops++;
}
else if(loops > 0) {
loops = 0;
layer_state_set_user(layer_state);
}
matrix_scan_user();
}

uint32_t layer_state_set_kb(uint32_t state) {
state = layer_state_set_user(state);
uint8_t layer = biton32(state);
if(webusb_state.paired == true) {
uint8_t event[4];
event[0] = WEBUSB_STATUS_OK;
event[1] = WEBUSB_EVT_LAYER;
event[2] = layer;
event[3] = WEBUSB_STOP_BIT;
webusb_send(event, sizeof(event));
}
return state;
}
#endif

1 change: 1 addition & 0 deletions keyboards/ergodox_ez/keymaps/webusb/default.png.md
@@ -0,0 +1 @@
https://i.imgur.com/fKX0Zbs.png
1 change: 1 addition & 0 deletions keyboards/ergodox_ez/keymaps/webusb/default_highres.png.md
@@ -0,0 +1 @@
https://i.imgur.com/giAc3M9.jpg
147 changes: 147 additions & 0 deletions keyboards/ergodox_ez/keymaps/webusb/keymap.c
@@ -0,0 +1,147 @@
#include QMK_KEYBOARD_H
#include "version.h"
#include "keymap_german.h"
#include "keymap_nordic.h"
#include "keymap_french.h"
#include "keymap_spanish.h"
#include "keymap_hungarian.h"
#include "keymap_swedish.h"
#include "keymap_br_abnt2.h"
#include "keymap_canadian_multilingual.h"
#include "keymap_german_ch.h"
#include "keymap_jp.h"

#define KC_MAC_UNDO LGUI(KC_Z)
#define KC_MAC_CUT LGUI(KC_X)
#define KC_MAC_COPY LGUI(KC_C)
#define KC_MAC_PASTE LGUI(KC_V)
#define KC_PC_UNDO LCTL(KC_Z)
#define KC_PC_CUT LCTL(KC_X)
#define KC_PC_COPY LCTL(KC_C)
#define KC_PC_PASTE LCTL(KC_V)
#define ES_LESS_MAC KC_GRAVE
#define ES_GRTR_MAC LSFT(KC_GRAVE)
#define ES_BSLS_MAC ALGR(KC_6)

enum custom_keycodes {
RGB_SLD = EZ_SAFE_RANGE,
HSV_172_255_255,
HSV_86_255_128,
HSV_27_255_255,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ergodox_pretty(
WEBUSB_PAIR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_RIGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
KC_DELETE, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1), TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH,
KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(2,KC_SCOLON),LGUI_T(KC_QUOTE),
KC_LSHIFT, LCTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_HYPR, KC_MEH, KC_N, KC_M, KC_COMMA, KC_DOT, RCTL_T(KC_SLASH),KC_RSHIFT,
LT(1,KC_GRAVE), KC_QUOTE, LALT(KC_LSHIFT),KC_LEFT, KC_RIGHT, KC_UP, KC_DOWN, KC_LBRACKET, KC_RBRACKET, MO(1),
LALT_T(KC_APPLICATION),KC_LGUI, KC_LALT, LCTL_T(KC_ESCAPE),
KC_HOME, KC_PGUP,
KC_SPACE, KC_BSPACE, KC_END, KC_PGDOWN, KC_TAB, KC_ENTER
),
[1] = LAYOUT_ergodox_pretty(
KC_ESCAPE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, KC_TRANSPARENT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRANSPARENT, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRANSPARENT, KC_TRANSPARENT, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_TRANSPARENT, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRAVE, KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRANSPARENT,
KC_TRANSPARENT, KC_PERC, KC_CIRC, KC_LBRACKET, KC_RBRACKET, KC_TILD, KC_TRANSPARENT, KC_TRANSPARENT, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLASH, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_DOT, KC_0, KC_EQUAL, KC_TRANSPARENT,
RGB_MOD, HSV_172_255_255,RGB_TOG, RGB_SLD,
HSV_86_255_128, KC_TRANSPARENT,
RGB_VAD, RGB_VAI, HSV_27_255_255, KC_TRANSPARENT, RGB_HUD, RGB_HUI
),
[2] = LAYOUT_ergodox_pretty(
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_UP, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PLAY_PAUSE,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN1, KC_MS_BTN2, KC_AUDIO_VOL_UP,KC_AUDIO_VOL_DOWN,KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT,
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_WWW_BACK
),
};


bool suspended = false;

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case RGB_SLD:
if (record->event.pressed) {
rgblight_mode(1);
}
return false;
case HSV_172_255_255:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
rgblight_mode(1);
rgblight_sethsv(172,255,255);
#endif
}
return false;
case HSV_86_255_128:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
rgblight_mode(1);
rgblight_sethsv(86,255,128);
#endif
}
return false;
case HSV_27_255_255:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable();
rgblight_mode(1);
rgblight_sethsv(27,255,255);
#endif
}
return false;
}
return true;
}

uint32_t layer_state_set_user(uint32_t state) {

uint8_t layer = biton32(state);

ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_3_on();
break;
case 4:
ergodox_right_led_1_on();
ergodox_right_led_2_on();
break;
case 5:
ergodox_right_led_1_on();
ergodox_right_led_3_on();
break;
case 6:
ergodox_right_led_2_on();
ergodox_right_led_3_on();
break;
case 7:
ergodox_right_led_1_on();
ergodox_right_led_2_on();
ergodox_right_led_3_on();
break;
default:
break;
}
return state;

};
15 changes: 15 additions & 0 deletions keyboards/ergodox_ez/keymaps/webusb/readme.md
@@ -0,0 +1,15 @@
# ErgoDox EZ Default Configuration

## Changelog

* Dec 2016:
* Added LED keys
* Refreshed layout graphic, comes from http://configure.ergodox-ez.com now.
* Sep 22, 2016:
* Created a new key in layer 1 (bottom-corner key) that resets the EEPROM.
* Feb 2, 2016 (V1.1):
* Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows).

This is what we ship with out of the factory. :) The image says it all:

![Default](https://i.imgur.com/Be53jH7.png)
1 change: 1 addition & 0 deletions keyboards/ergodox_ez/keymaps/webusb/rules.mk
@@ -0,0 +1 @@
WEBUSB_ENABLE = yes
5 changes: 5 additions & 0 deletions keyboards/planck/ez/config.h
Expand Up @@ -18,7 +18,12 @@
#pragma once

/* USB Device descriptor parameter */
#undef MANUFACTURER
#define MANUFACTURER ZSA
#undef PRODUCT
#define PRODUCT Planck EZ
#define DEVICE_VER 0x0000
#define WEBUSB_LANDING_PAGE_URL u8"configure.ergodox-ez.com"

#undef MATRIX_ROWS
#undef MATRIX_COLS
Expand Down
59 changes: 59 additions & 0 deletions keyboards/planck/ez/ez.c
Expand Up @@ -16,6 +16,9 @@
#include "ez.h"
#include "ch.h"
#include "hal.h"
#ifdef WEBUSB_ENABLE
#include "webusb.h"
#endif

keyboard_config_t keyboard_config;

Expand Down Expand Up @@ -247,6 +250,16 @@ uint32_t layer_state_set_kb(uint32_t state) {
planck_ez_right_led_off();
state = layer_state_set_user(state);
uint8_t layer = biton32(state);
#ifdef WEBUSB_ENABLE
if(webusb_state.paired == true) {
uint8_t event[4];
event[0] = WEBUSB_STATUS_OK;
event[1] = WEBUSB_EVT_LAYER;
event[2] = layer;
event[3] = WEBUSB_STOP_BIT;
webusb_send(event, sizeof(event));
}
#endif
switch (layer) {
case 1:
planck_ez_left_led_on();
Expand All @@ -265,6 +278,17 @@ uint32_t layer_state_set_kb(uint32_t state) {
}

bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
#ifdef WEBUSB_ENABLE
if(webusb_state.paired == true) {
uint8_t event[5];
event[0] = WEBUSB_STATUS_OK;
event[1] = record->event.pressed ? WEBUSB_EVT_KEYDOWN : WEBUSB_EVT_KEYUP;
event[2] = record->event.key.col;
event[3] = record->event.key.row;
event[4] = WEBUSB_STOP_BIT;
webusb_send(event, sizeof(event));
}
#endif
switch (keycode) {
case LED_LEVEL:
if (record->event.pressed) {
Expand Down Expand Up @@ -325,3 +349,38 @@ bool music_mask_kb(uint16_t keycode) {
}
}
#endif
#ifdef WEBUSB_ENABLE
static uint16_t loops = 0;
static bool is_on = false;

void matrix_scan_kb(void) {
if(webusb_state.pairing == true) {
if(loops == 0) {
//lights off
}
if(loops % WEBUSB_BLINK_STEPS == 0) {
if(is_on) {
planck_ez_left_led_on();
planck_ez_right_led_off();
}
else {
planck_ez_left_led_off();
planck_ez_right_led_on();
}
is_on ^= 1;
}
if(loops > WEBUSB_BLINK_END * 2) {
webusb_state.pairing = false;
loops = 0;
planck_ez_left_led_off();
planck_ez_right_led_off();
}
loops++;
}
else if(loops > 0) {
loops = 0;
planck_ez_left_led_off();
planck_ez_right_led_off();
}
}
#endif