aboutsummaryrefslogtreecommitdiff
path: root/keyboards/planck/ez
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/planck/ez')
-rw-r--r--keyboards/planck/ez/config.h17
-rw-r--r--keyboards/planck/ez/ez.c243
-rw-r--r--keyboards/planck/ez/ez.h24
-rw-r--r--keyboards/planck/ez/readme.md41
-rw-r--r--keyboards/planck/ez/rules.mk7
5 files changed, 300 insertions, 32 deletions
diff --git a/keyboards/planck/ez/config.h b/keyboards/planck/ez/config.h
index 142382dab1..0cb428dd85 100644
--- a/keyboards/planck/ez/config.h
+++ b/keyboards/planck/ez/config.h
@@ -43,7 +43,6 @@
#define MATRIX_ROW_PINS { A10, A9, A8, B15, C13, C14, C15, A2 }
#define MATRIX_COL_PINS { B11, B10, B2, B1, A7, B0 }
-#define NUMBER_OF_ENCODERS 1
#define ENCODERS_PAD_A { B12 }
#define ENCODERS_PAD_B { B13 }
@@ -139,3 +138,19 @@
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
#define RGB_MATRIX_KEYPRESSES
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#define RGB_DISABLE_WHEN_USB_SUSPENDED true
+
+#define RGB_MATRIX_LED_PROCESS_LIMIT 5
+#define RGB_MATRIX_LED_FLUSH_LIMIT 26
+
+
+#define IGNORE_MOD_TAP_INTERRUPT
+
+#define TAPPING_TOGGLE 1
+
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_TIME_TO_MAX 60
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_WHEEL_DELAY 0
diff --git a/keyboards/planck/ez/ez.c b/keyboards/planck/ez/ez.c
index e739b90b8c..8369ce50c1 100644
--- a/keyboards/planck/ez/ez.c
+++ b/keyboards/planck/ez/ez.c
@@ -14,6 +14,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ez.h"
+#include "ch.h"
+#include "hal.h"
+
+keyboard_config_t keyboard_config;
#ifdef RGB_MATRIX_ENABLE
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
@@ -102,6 +106,7 @@ led_config_t g_led_config = { {
} };
void suspend_power_down_kb(void) {
+ rgb_matrix_set_color_all(0, 0, 0);
rgb_matrix_set_suspend_state(true);
suspend_power_down_user();
}
@@ -112,39 +117,225 @@ void suspend_power_down_kb(void) {
}
#endif
-void matrix_init_kb(void) {
- matrix_init_user();
+/* Left B9 Right B8 */
+
+// See http://jared.geek.nz/2013/feb/linear-led-pwm
+static uint16_t cie_lightness(uint16_t v) {
+ if (v <= 5243) // if below 8% of max
+ return v / 9; // same as dividing by 900%
+ else {
+ uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
+ // to get a useful result with integer division, we shift left in the expression above
+ // and revert what we've done again after squaring.
+ y = y * y * y >> 8;
+ if (y > 0xFFFFUL) // prevent overflow
+ return 0xFFFFU;
+ else
+ return (uint16_t) y;
+ }
+}
- palSetPadMode(GPIOB, 8, PAL_MODE_OUTPUT_PUSHPULL);
- palSetPadMode(GPIOB, 9, PAL_MODE_OUTPUT_PUSHPULL);
+static PWMConfig pwmCFG = {
+ 0xFFFF,/* PWM clock frequency */
+ 256,/* initial PWM period (in ticks) 1S (1/10kHz=0.1mS 0.1ms*10000 ticks=1S) */
+ NULL,
+ {
+ {PWM_OUTPUT_DISABLED, NULL}, /* channel 0 -> TIM1-CH1 = PA8 */
+ {PWM_OUTPUT_DISABLED, NULL}, /* channel 1 -> TIM1-CH2 = PA9 */
+ {PWM_OUTPUT_ACTIVE_HIGH, NULL},
+ {PWM_OUTPUT_ACTIVE_HIGH, NULL}
+ },
+ 0, /* HW dependent part.*/
+ 0
+};
- palClearPad(GPIOB, 8);
- palClearPad(GPIOB, 9);
+static uint32_t planck_ez_right_led_duty;
+static uint32_t planck_ez_left_led_duty;
+
+void planck_ez_right_led_level(uint8_t level) {
+ planck_ez_right_led_duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t) level / 255));
+ if (level == 0) {
+ // Turn backlight off
+ pwmDisableChannel(&PWMD4, 2);
+ } else {
+ // Turn backlight on
+ pwmEnableChannel(&PWMD4, 2, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_right_led_duty));
+ }
}
-void matrix_scan_kb(void) {
- matrix_scan_user();
+
+void planck_ez_right_led_on(void){
+ pwmEnableChannel(&PWMD4, 2, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_right_led_duty));
}
-uint32_t layer_state_set_kb(uint32_t state) {
+void planck_ez_right_led_off(void){
+ pwmDisableChannel(&PWMD4, 2);
+}
- palClearPad(GPIOB, 8);
- palClearPad(GPIOB, 9);
- state = layer_state_set_user(state);
- uint8_t layer = biton32(state);
- switch (layer) {
- case 3:
- palSetPad(GPIOB, 9);
- break;
- case 4:
- palSetPad(GPIOB, 8);
- break;
- case 6:
- palSetPad(GPIOB, 9);
- palSetPad(GPIOB, 8);
- break;
- default:
- break;
+void planck_ez_left_led_level(uint8_t level) {
+ planck_ez_left_led_duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t) level / 255));
+ if (level == 0) {
+ // Turn backlight off
+ pwmDisableChannel(&PWMD4, 3);
+ } else {
+ // Turn backlight on
+ pwmEnableChannel(&PWMD4, 3, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_left_led_duty));
+ }
+}
+
+void planck_ez_left_led_on(void){
+ pwmEnableChannel(&PWMD4, 3, PWM_FRACTION_TO_WIDTH(&PWMD4,0xFFFF,planck_ez_left_led_duty));
+}
+
+void planck_ez_left_led_off(void){
+ pwmDisableChannel(&PWMD4, 3);
+}
+
+
+void led_initialize_hardware(void) {
+ pwmStart(&PWMD4, &pwmCFG);
+
+ // set up defaults
+ planck_ez_right_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
+ palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(2));
+ planck_ez_left_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
+ palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(2));
+
+
+ // turn LEDs off by default
+ planck_ez_left_led_off();
+ planck_ez_right_led_off();
+}
+
+void keyboard_pre_init_kb(void) {
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+ // read kb settings from eeprom
+ keyboard_config.raw = eeconfig_read_kb();
+#if defined(RGB_MATRIX_ENABLE) && defined(ORYX_CONFIGURATOR)
+ if (keyboard_config.rgb_matrix_enable) {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ } else {
+ rgb_matrix_set_flags(LED_FLAG_NONE);
+ }
+#endif
+ led_initialize_hardware();
+ keyboard_pre_init_user();
+}
+
+#if defined(RGB_MATRIX_ENABLE) && defined(ORYX_CONFIGURATOR)
+void keyboard_post_init_kb(void) {
+ rgb_matrix_enable_noeeprom();
+ keyboard_post_init_user();
+}
+#endif
+
+void eeconfig_init_kb(void) { // EEPROM is getting reset!
+ keyboard_config.raw = 0;
+ keyboard_config.rgb_matrix_enable = true;
+ keyboard_config.led_level = 4;
+ eeconfig_update_kb(keyboard_config.raw);
+ eeconfig_init_user();
+}
+
+
+#ifdef ORYX_CONFIGURATOR
+
+#ifndef PLANCK_EZ_USER_LEDS
+
+#ifndef PLANCK_EZ_LED_LOWER
+# define PLANCK_EZ_LED_LOWER 3
+#endif
+#ifndef PLANCK_EZ_LED_RAISE
+# define PLANCK_EZ_LED_RAISE 4
+#endif
+#ifndef PLANCK_EZ_LED_ADJUST
+# define PLANCK_EZ_LED_ADJUST 6
+#endif
+
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ planck_ez_left_led_off();
+ planck_ez_right_led_off();
+ state = layer_state_set_user(state);
+ uint8_t layer = biton32(state);
+ switch (layer) {
+ case PLANCK_EZ_LED_LOWER:
+ planck_ez_left_led_on();
+ break;
+ case PLANCK_EZ_LED_RAISE:
+ planck_ez_right_led_on();
+ break;
+ case PLANCK_EZ_LED_ADJUST:
+ planck_ez_right_led_on();
+ planck_ez_left_led_on();
+ break;
+ default:
+ break;
}
return state;
}
+#endif
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LED_LEVEL:
+ if (record->event.pressed) {
+ keyboard_config.led_level++;
+ if (keyboard_config.led_level > 4) {
+ keyboard_config.led_level = 0;
+ }
+ planck_ez_right_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
+ planck_ez_left_led_level((uint8_t)keyboard_config.led_level * 255 / 4 );
+ eeconfig_update_kb(keyboard_config.raw);
+ layer_state_set_kb(layer_state);
+ }
+ break;
+#ifdef RGB_MATRIX_ENABLE
+ case TOGGLE_LAYER_COLOR:
+ if (record->event.pressed) {
+ keyboard_config.disable_layer_led ^= 1;
+ if (keyboard_config.disable_layer_led)
+ rgb_matrix_set_color_all(0, 0, 0);
+ eeconfig_update_kb(keyboard_config.raw);
+ }
+ break;
+ case RGB_TOG:
+ if (record->event.pressed) {
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_NONE);
+ keyboard_config.rgb_matrix_enable = false;
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ keyboard_config.rgb_matrix_enable = true;
+ }
+ break;
+ }
+ eeconfig_update_kb(keyboard_config.raw);
+ }
+ return false;
+#endif
+ }
+ return process_record_user(keycode, record);
+}
+#endif
+
+#ifdef AUDIO_ENABLE
+bool music_mask_kb(uint16_t keycode) {
+ switch (keycode) {
+ case QK_LAYER_TAP ... QK_ONE_SHOT_LAYER_MAX:
+ case QK_LAYER_TAP_TOGGLE ... QK_LAYER_MOD_MAX:
+ case QK_MOD_TAP ... QK_MOD_TAP_MAX:
+ case AU_ON ... MUV_DE:
+ case RESET:
+ case EEP_RST:
+ return false;
+ default:
+ return music_mask_user(keycode);
+ }
+}
+#endif
diff --git a/keyboards/planck/ez/ez.h b/keyboards/planck/ez/ez.h
index 55c4032422..29bcc1b83c 100644
--- a/keyboards/planck/ez/ez.h
+++ b/keyboards/planck/ez/ez.h
@@ -50,3 +50,27 @@ LAYOUT_planck_1x2uC( \
#define KEYMAP LAYOUT_ortho_4x12
#define LAYOUT_planck_mit LAYOUT_planck_1x2uC
#define LAYOUT_planck_grid LAYOUT_ortho_4x12
+
+void planck_ez_right_led_on(void);
+void planck_ez_right_led_off(void);
+void planck_ez_right_led_level(uint8_t level);
+void planck_ez_left_led_on(void);
+void planck_ez_left_led_off(void);
+void planck_ez_left_led_level(uint8_t level);
+
+enum planck_ez_keycodes {
+ LED_LEVEL = SAFE_RANGE,
+ TOGGLE_LAYER_COLOR,
+ EZ_SAFE_RANGE,
+};
+
+typedef union {
+ uint32_t raw;
+ struct {
+ uint8_t led_level :3;
+ bool disable_layer_led :1;
+ bool rgb_matrix_enable :1;
+ };
+} keyboard_config_t;
+
+extern keyboard_config_t keyboard_config;
diff --git a/keyboards/planck/ez/readme.md b/keyboards/planck/ez/readme.md
index 9bd161abdf..df8d1b46bb 100644
--- a/keyboards/planck/ez/readme.md
+++ b/keyboards/planck/ez/readme.md
@@ -13,3 +13,44 @@ Make example for this keyboard (after setting up your build environment):
make planck/ez:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Planck EZ Configuration (from Oryx)
+
+### Indicator LEDs
+
+The two front "teeth" LED indicators are PWM controlled. If you have `ORYX_CONFIGURATOR` defined in your keymap's `config.h`, you can use the `LED_LEVEL` to cycle through preset vales (0, 25%, 50%, 75%, 100%), and will be saved to EEPROM (persistent storage)
+
+Alternatively, you can set the brightness by calling the following functions:
+
+```c
+void planck_ez_right_led_level(uint8_t level);
+void planck_ez_left_led_level(uint8_t level);
+```
+
+These settings are not persistent, so you'd need to reset it every time the board starts.
+
+These are on a 0-255 scale
+
+#### Layer indication
+
+By default, the indicator lights are used for layer indication, expecting the specific layers used in the default keymap. However, this may not work for you. And if that is the case, you can add `#define PLANCK_EZ_USER_LEDS` to your `config.h` file.
+
+This will remove the default behavior for changing the LEDs based on layer, and allow you to control them manually.
+
+Alternatively, you can use the following defines in your keymap's `config.h` to control which layers are used, as long as you have `ORYX_CONFIGURATOR` defined in your keymap's `config.h` file, as well.
+
+```c
+#define PLANCK_EZ_LED_LOWER 3
+#define PLANCK_EZ_LED_RAISE 4
+#define PLANCK_EZ_LED_ADJUST 6
+```
+
+This will allow you to change the layers that are used, without having to add anything code to your `keymap.c`
+
+### RGB Matrix Features
+
+If you're using the Smart LED (layer indication) feature from the Oryx Configurator, you want to make sure that you enable these options by adding `#define ORYX_CONFIGURATOR` to your keymap's `config.h`.
+
+This changes the `RGB_TOG` keycode so that it will toggle the lights on and off, in a way that will allow the Smart LEDs to continue to work, even with the rest of the LEDs turned off.
+
+Additionally, a new keycode has been added to toggle the Smart LEDs. Use `TOGGLE_LAYER_COLOR`, if you aren't already.
diff --git a/keyboards/planck/ez/rules.mk b/keyboards/planck/ez/rules.mk
index 4aa431fdaa..7fb0dec50f 100644
--- a/keyboards/planck/ez/rules.mk
+++ b/keyboards/planck/ez/rules.mk
@@ -1,8 +1,5 @@
-# Cortex version
-MCU = STM32F303
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+# MCU name
+MCU = STM32F303
# Build Options
# change to "no" to disable the options, or define them in the Makefile in