Parcourir la source

Implement backlight scheme of TentaPad

old_master
Kai Ryu il y a 9 ans
Parent
révision
e0ea55beeb
3 fichiers modifiés avec 195 ajouts et 35 suppressions
  1. 4
    6
      common/softpwm_led.c
  2. 130
    15
      keyboard/tentapad/backlight.c
  3. 61
    14
      keyboard/tentapad/keymap_default.c

+ 4
- 6
common/softpwm_led.c Voir le fichier

@@ -253,15 +253,13 @@ ISR(TIMER1_COMPA_vect)
{
static uint8_t pwm = 0;
pwm++;
// LED on
if (pwm == 0) {
for (uint8_t i = 0; i < LED_COUNT; i++) {
for (uint8_t i = 0; i < LED_COUNT; i++) {
// LED on
if (pwm == 0) {
softpwm_led_on(i);
softpwm_led_ocr[i] = softpwm_led_ocr_buff[i];
}
}
// LED off
for (uint8_t i = 0; i < LED_COUNT; i++) {
// LED off
if (pwm == softpwm_led_ocr[i]) {
softpwm_led_off(i);
}

+ 130
- 15
keyboard/tentapad/backlight.c Voir le fichier

@@ -20,35 +20,87 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <avr/pgmspace.h>
#include "backlight.h"
#include "softpwm_led.h"
#include "action.h"
#include "keymap_common.h"

#ifdef BACKLIGHT_ENABLE

static const uint8_t backlight_table[] PROGMEM = {
0, 16, 128, 255
static uint8_t backlight_mode;
static const uint8_t backlight_brightness = 0xFF;

enum {
LED_KEY_1 = 0,
LED_KEY_2,
LED_KEY_SIDE,
LED_BOARD_SIDE
};

void backlight_set(uint8_t level)
{
backlight_mode = level;
softpwm_led_set_all(0);
fading_led_set_duration(2);
fading_led_set_direction(FADING_LED_FADE_OUT);
breathing_led_set_duration(3);
switch (level) {
case 0:
softpwm_led_disable();
fading_led_disable_all();
breathing_led_disable_all();
softpwm_led_on(LED_KEY_SIDE);
softpwm_led_on(LED_BOARD_SIDE);
break;
case 1:
softpwm_led_set(LED_BOARD_SIDE, backlight_brightness);
fading_led_disable_all();
fading_led_enable(LED_KEY_SIDE);
breathing_led_disable_all();
softpwm_led_enable();
break;
case 2:
case 3:
softpwm_led_set(LED_KEY_SIDE, backlight_brightness);
fading_led_disable_all();
fading_led_enable(LED_BOARD_SIDE);
breathing_led_disable_all();
softpwm_led_enable();
break;
case 3:
fading_led_disable_all();
breathing_led_disable_all();
softpwm_led_set_all(pgm_read_byte(&backlight_table[level]));
breathing_led_enable(LED_KEY_SIDE);
breathing_led_enable(LED_BOARD_SIDE);
softpwm_led_enable();
break;
case 4:
softpwm_led_set(LED_KEY_SIDE, backlight_brightness);
breathing_led_disable_all();
breathing_led_enable(LED_BOARD_SIDE);
fading_led_disable_all();
softpwm_led_enable();
break;
case 5:
case 6:
softpwm_led_set(LED_BOARD_SIDE, backlight_brightness);
breathing_led_disable_all();
breathing_led_enable(LED_KEY_SIDE);
fading_led_disable_all();
softpwm_led_enable();
breathing_led_enable_all();
breathing_led_set_duration_all(6 - level);
break;
case 0:
default:
case 6:
fading_led_disable_all();
breathing_led_disable_all();
softpwm_led_disable();
break;
case 7:
fading_led_disable_all();
breathing_led_disable_all();
softpwm_led_disable();
break;
case 8:
softpwm_led_set_all(16);
fading_led_disable_all();
breathing_led_disable_all();
softpwm_led_enable();
break;
}
}

@@ -67,9 +119,20 @@ void softpwm_led_init(void)
void softpwm_led_on(uint8_t index)
{
#ifndef EXPERIMENTAL
PORTD |= (1<<PD0);
PORTB |= (1<<PB7);
PORTC |= (1<<PD5 | 1<<PD6);
switch (index) {
case LED_KEY_1:
PORTC |= (1<<PC5);
break;
case LED_KEY_2:
PORTC |= (1<<PC6);
break;
case LED_KEY_SIDE:
PORTB |= (1<<PB7);
break;
case LED_BOARD_SIDE:
PORTD |= (1<<PD0);
break;
}
#else
PORTB |= (1<<PB6);
#endif
@@ -78,13 +141,65 @@ void softpwm_led_on(uint8_t index)
void softpwm_led_off(uint8_t index)
{
#ifndef EXPERIMENTAL
PORTD &= ~(1<<PD0);
PORTB &= ~(1<<PB7);
PORTC &= ~(1<<PD5 | 1<<PD6);
switch (index) {
case LED_KEY_1:
PORTC &= ~(1<<PC5);
break;
case LED_KEY_2:
PORTC &= ~(1<<PC6);
break;
case LED_KEY_SIDE:
PORTB &= ~(1<<PB7);
break;
case LED_BOARD_SIDE:
PORTD &= ~(1<<PD0);
break;
}
#else
PORTB &= ~(1<<PB6);
#endif
}
#endif

extern uint8_t config_mode;

void action_keyevent(keyevent_t event)
{
if (config_mode) return;
if (event.key.col < 2) {
if (event.pressed) {
switch (backlight_mode) {
case 0: case 6:
softpwm_led_on(event.key.col);
break;
case 1 ... 5:
softpwm_led_set(event.key.col, backlight_brightness);
break;
}
}
else {
switch (backlight_mode) {
case 0: case 6:
softpwm_led_off(event.key.col);
break;
case 1 ... 5:
softpwm_led_set(event.key.col, 0);
break;
}
}
}
switch (backlight_mode) {
case 1:
if (event.pressed) {
softpwm_led_increase(LED_KEY_SIDE, 32);
}
break;
case 2:
if (event.pressed) {
softpwm_led_increase(LED_BOARD_SIDE, 32);
}
break;
}
}

#endif

+ 61
- 14
keyboard/tentapad/keymap_default.c Voir le fichier

@@ -68,42 +68,89 @@ uint16_t fn_actions_count(void) {
}
#endif

uint8_t config_mode = 0;
static uint8_t layer = 0;
static uint8_t backlight = 0;
static uint8_t layer_modified = 0;
static uint8_t backlight_modified = 0;
extern backlight_config_t backlight_config;

void enter_config_mode(void);
void exit_config_mode(void);
void switch_layout(void);
void switch_backlight(void);

void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
static uint8_t config_mode = 0;
static uint8_t layer = 0;
static uint8_t backlight = 0;
switch (id) {
case CONFIG_MODE:
if (record->event.pressed) {
if (config_mode) {
config_mode = 0;
layer_off(CONFIG_LAYER);
exit_config_mode();
}
else {
config_mode = 1;
layer = 0;
backlight = 0;
layer_on(CONFIG_LAYER);
enter_config_mode();
}
}
break;
case SWITCH_LAYOUT:
if (record->event.pressed) {
if (config_mode) {
default_layer_set(1UL<<layer);
eeconfig_write_default_layer(1UL<<layer);
layer = (layer + 1) % (last_layer() + 1);
switch_layout();
}
}
break;
case SWITCH_BACKLIGHT:
if (record->event.pressed) {
if (config_mode) {
backlight_level(backlight);
backlight = (backlight + 1) % (BACKLIGHT_LEVELS + 1);
switch_backlight();
}
}
break;
}
}

void enter_config_mode(void)
{
config_mode = 1;
layer_modified = 0;
backlight_modified = 0;
backlight = backlight_config.level;
backlight_level(8);
layer_on(CONFIG_LAYER);
}

void exit_config_mode(void)
{
config_mode = 0;
backlight_level(backlight);
layer_off(CONFIG_LAYER);
if (layer_modified) {
default_layer_set(1UL<<layer);
eeconfig_write_default_layer(1UL<<layer);
}
}

void switch_layout(void)
{
if (!layer_modified) {
layer = 0;
layer_modified = 1;
}
else {
layer = (layer + 1) % (last_layer() + 1);
}
softpwm_led_set(0, 32 * (layer + 1));
}

void switch_backlight(void)
{
if (!backlight_modified) {
backlight = 0;
backlight_modified = 1;
}
else {
backlight = (backlight + 1) % (BACKLIGHT_LEVELS);
}
softpwm_led_set(1, 32 * (backlight + 1));
}