From 08f6cf85ec27f44c4c31fbba2f9b04238af686e3 Mon Sep 17 00:00:00 2001 From: Kai Ryu Date: Wed, 10 Dec 2014 19:51:11 +0900 Subject: [PATCH] New features for SMART68 - SoftPWM LED - Breathing LED - Fading LED - Typing LED - Ledmap - Ledmap in EEPROM - Built-in function tricky esc --- keyboard/smart68/Makefile | 11 ++- keyboard/smart68/Makefile.pjrc | 11 ++- keyboard/smart68/backlight.c | 109 +++++++++++++++++++++++++++++- keyboard/smart68/config.h | 17 +++++ keyboard/smart68/keymap_common.c | 2 +- keyboard/smart68/keymap_default.c | 28 ++++++++ keyboard/smart68/led.c | 3 + keyboard/smart68/ledmap.c | 65 ++++++++++++++++++ 8 files changed, 238 insertions(+), 8 deletions(-) create mode 100644 keyboard/smart68/ledmap.c diff --git a/keyboard/smart68/Makefile b/keyboard/smart68/Makefile index b9e18697..e4d8dc4e 100644 --- a/keyboard/smart68/Makefile +++ b/keyboard/smart68/Makefile @@ -51,7 +51,8 @@ TARGET_DIR = . SRC = keymap_common.c \ matrix.c \ led.c \ - backlight.c + backlight.c \ + ledmap.c ifdef KEYMAP SRC := keymap_$(KEYMAP).c $(SRC) @@ -130,9 +131,13 @@ NKRO_ENABLE = yes # USB Nkey Rollover USB_6KRO_ENABLE = yes # USB 6Key Rollover #PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom -KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor +KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom +#KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor +SOFTPWM_LED_ENABLE = yes # Enable SoftPWM to drive backlight +FADING_LED_ENABLE = yes # Enable fading backlight BREATHING_LED_ENABLE = yes # Enable breathing backlight +LEDMAP_ENABLE = yes # Enable LED mapping +LEDMAP_IN_EEPROM_ENABLE = yes # Read LED mapping from eeprom # Optimize size but this may cause error "relocation truncated to fit" diff --git a/keyboard/smart68/Makefile.pjrc b/keyboard/smart68/Makefile.pjrc index 913e1671..08797080 100644 --- a/keyboard/smart68/Makefile.pjrc +++ b/keyboard/smart68/Makefile.pjrc @@ -51,7 +51,8 @@ TARGET_DIR = . SRC = keymap_common.c \ matrix.c \ led.c \ - backlight.c + backlight.c \ + ledmap.c ifdef KEYMAP SRC := keymap_$(KEYMAP).c $(SRC) @@ -100,9 +101,13 @@ NKRO_ENABLE = yes # USB Nkey Rollover USB_6KRO_ENABLE = yes # USB 6Key Rollover #PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom -KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor +KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom +#KEYMAP_SECTION_ENABLE = yes # Fixed address keymap for keymap editor +SOFTPWM_LED_ENABLE = yes # Enable SoftPWM to drive backlight +FADING_LED_ENABLE = yes # Enable fading backlight BREATHING_LED_ENABLE = yes # Enable breathing backlight +LEDMAP_ENABLE = yes # Enable LED mapping +LEDMAP_IN_EEPROM_ENABLE = yes # Read LED mapping from eeprom diff --git a/keyboard/smart68/backlight.c b/keyboard/smart68/backlight.c index f92e6a74..c2aa615f 100644 --- a/keyboard/smart68/backlight.c +++ b/keyboard/smart68/backlight.c @@ -19,7 +19,14 @@ along with this program. If not, see . #include #include #include "backlight.h" +#ifdef SOFTPWM_LED_ENABLE +#include "softpwm_led.h" +#else #include "breathing_led.h" +#endif +#include "action.h" + +#ifdef BACKLIGHT_ENABLE static const uint8_t backlight_table[] PROGMEM = { 0, 16, 128, 255 @@ -27,9 +34,16 @@ static const uint8_t backlight_table[] PROGMEM = { inline void backlight_set_raw(uint8_t raw); +#ifdef SOFTPWM_LED_ENABLE +#ifdef FADING_LED_ENABLE +static uint8_t backlight_mode; +#endif +#endif + /* Backlight pin configuration - * PWM: PB7 + * PWM: PB7(OC1C) */ +#ifndef SOFTPWM_LED_ENABLE void backlight_enable(void) { // Turn on PWM @@ -48,29 +62,76 @@ void backlight_disable(void) TCCR1B &= ~( (1<. #define DEBOUNCE 5 /* number of backlight levels */ +#ifdef SOFTPWM_LED_ENABLE #ifdef BREATHING_LED_ENABLE +#ifdef FADING_LED_ENABLE +#define BACKLIGHT_LEVELS 8 +#else +#define BACKLIGHT_LEVELS 6 +#endif +#else +#define BACKLIGHT_LEVELS 3 +#endif +#else +#ifdef BREATHING_LED_ENABLE +#define BREATHING_LED_TIMER1 #define BACKLIGHT_LEVELS 6 #else #define BACKLIGHT_LEVELS 3 #endif +#endif +#define BACKLIGHT_CUSTOM + +/* number of leds */ +#define LED_COUNT 2 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE diff --git a/keyboard/smart68/keymap_common.c b/keyboard/smart68/keymap_common.c index 6ab88064..5d03cffe 100644 --- a/keyboard/smart68/keymap_common.c +++ b/keyboard/smart68/keymap_common.c @@ -17,7 +17,7 @@ along with this program. If not, see . #include "keymap_common.h" /* 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) { #ifndef KEYMAP_IN_EEPROM_ENABLE return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); diff --git a/keyboard/smart68/keymap_default.c b/keyboard/smart68/keymap_default.c index 04d72441..e897b697 100644 --- a/keyboard/smart68/keymap_default.c +++ b/keyboard/smart68/keymap_default.c @@ -76,3 +76,31 @@ uint16_t fn_actions_count(void) { return sizeof(fn_actions) / sizeof(fn_actions[0]); } #endif + +enum function_id { + TRICKY_ESC = 0, +}; + +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + static uint8_t tricky_esc_registered; + switch (id) { + case TRICKY_ESC: + if (record->event.pressed) { + if (get_mods() & MODS_SHIFT_MASK) { + tricky_esc_registered = KC_GRV; + } + else { + tricky_esc_registered = KC_ESC; + } + register_code(tricky_esc_registered); + send_keyboard_report(); + } + else { + unregister_code(tricky_esc_registered); + send_keyboard_report(); + } + break; + } +} diff --git a/keyboard/smart68/led.c b/keyboard/smart68/led.c index 5899603f..2cf429f8 100644 --- a/keyboard/smart68/led.c +++ b/keyboard/smart68/led.c @@ -19,6 +19,7 @@ along with this program. If not, see . #include "stdint.h" #include "led.h" +#ifndef LEDMAP_ENABLE void led_set(uint8_t usb_led) { @@ -32,3 +33,5 @@ void led_set(uint8_t usb_led) PORTB &= ~(1< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +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 . +*/ + +#include +#include "ledmap.h" + + +#ifdef LEDMAP_ENABLE + +static const uint16_t ledmaps[LED_COUNT] PROGMEM = { + [0] = LEDMAP_CAPS_LOCK, // CapsLock - PB2 + [1] = LEDMAP_BACKLIGHT, // PWM - PB7 +}; + +ledmap_t ledmap_get_code(uint8_t index) +{ + return (ledmap_t) { .code = pgm_read_word(&ledmaps[index]) }; +} + +void ledmap_led_init(void) +{ + DDRB |= (1<