Browse Source

Implement led mapping feature

yuk86
Kai Ryu 10 years ago
parent
commit
aa7182e87c
6 changed files with 191 additions and 22 deletions
  1. 19
    14
      common.mk
  2. 6
    0
      common/action_layer.c
  3. 8
    0
      common/action_layer.h
  4. 99
    0
      common/ledmap.c
  5. 52
    1
      common/ledmap.h
  6. 7
    7
      common/softpwm_led.c

+ 19
- 14
common.mk View File

COMMON_DIR = common COMMON_DIR = common
SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/keyboard.c \
$(COMMON_DIR)/action.c \
$(COMMON_DIR)/action_tapping.c \
$(COMMON_DIR)/action_macro.c \
$(COMMON_DIR)/action_layer.c \
$(COMMON_DIR)/action_util.c \
$(COMMON_DIR)/keymap.c \
$(COMMON_DIR)/timer.c \
$(COMMON_DIR)/print.c \
$(COMMON_DIR)/bootloader.c \
$(COMMON_DIR)/suspend.c \
$(COMMON_DIR)/xprintf.S \
$(COMMON_DIR)/util.c
SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/keyboard.c \
$(COMMON_DIR)/action.c \
$(COMMON_DIR)/action_tapping.c \
$(COMMON_DIR)/action_macro.c \
$(COMMON_DIR)/action_layer.c \
$(COMMON_DIR)/action_util.c \
$(COMMON_DIR)/keymap.c \
$(COMMON_DIR)/timer.c \
$(COMMON_DIR)/print.c \
$(COMMON_DIR)/bootloader.c \
$(COMMON_DIR)/suspend.c \
$(COMMON_DIR)/xprintf.S \
$(COMMON_DIR)/util.c




# Option modules # Option modules
OPT_DEFS += -DBACKLIGHT_ENABLE OPT_DEFS += -DBACKLIGHT_ENABLE
endif endif


ifdef LEDMAP_ENABLE
SRC += $(COMMON_DIR)/ledmap.c
OPT_DEFS += -DLEDMAP_ENABLE
endif

ifdef KEYMAP_SECTION_ENABLE ifdef KEYMAP_SECTION_ENABLE
OPT_DEFS += -DKEYMAP_SECTION_ENABLE OPT_DEFS += -DKEYMAP_SECTION_ENABLE
EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x

+ 6
- 0
common/action_layer.c View File

default_layer_debug(); debug(" to "); default_layer_debug(); debug(" to ");
default_layer_state = state; default_layer_state = state;
default_layer_debug(); debug("\n"); default_layer_debug(); debug("\n");
#ifdef LEDMAP_ENABLE
default_layer_state_change(state);
#endif
clear_keyboard_but_mods(); // To avoid stuck keys clear_keyboard_but_mods(); // To avoid stuck keys
} }


layer_debug(); dprint(" to "); layer_debug(); dprint(" to ");
layer_state = state; layer_state = state;
layer_debug(); dprintln(); layer_debug(); dprintln();
#ifdef LEDMAP_ENABLE
layer_state_change(state);
#endif
clear_keyboard_but_mods(); // To avoid stuck keys clear_keyboard_but_mods(); // To avoid stuck keys
} }



+ 8
- 0
common/action_layer.h View File

#define layer_debug() #define layer_debug()
#endif #endif


#ifdef LEDMAP_ENABLE
void default_layer_state_change(uint32_t state);
void layer_state_change(uint32_t state);
#else
#define default_layer_state_change()
#define layer_state_change()
#endif



/* return action depending on current layer status */ /* return action depending on current layer status */
action_t layer_switch_get_action(key_t key); action_t layer_switch_get_action(key_t key);

+ 99
- 0
common/ledmap.c View File

#include "ledmap.h" #include "ledmap.h"
#include "led.h"
#include "softpwm_led.h"
#include "action_layer.h"

static led_state_t led_state = 0;
static led_state_t led_state_last = 0;

static void update_led_state(void);

void led_set(uint8_t usb_led)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
uint8_t code = ledmap_get_code(i);
switch (code) {
case LEDMAP_NUM_LOCK:
usb_led & (1 << USB_LED_NUM_LOCK) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
break;
case LEDMAP_CAPS_LOCK:
usb_led & (1 << USB_LED_CAPS_LOCK) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
break;
case LEDMAP_SCROLL_LOCK:
usb_led & (1 << USB_LED_SCROLL_LOCK) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
break;
case LEDMAP_COMPOSE:
usb_led & (1 << USB_LED_COMPOSE) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
break;
case LEDMAP_KANA:
usb_led & (1 << USB_LED_KANA) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
break;
default:
break;
}
}
update_led_state();
}

#ifndef NO_ACTION_LAYER
void default_layer_state_change(uint32_t state)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
uint8_t code = ledmap_get_code(i);
if (code >= LEDMAP_DEFAULT_LAYER_0 && code < LEDMAP_DEFAULT_LAYER_31) {
state & (1UL << (code - LEDMAP_DEFAULT_LAYER_0)) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
}
}
update_led_state();
}

void layer_state_change(uint32_t state)
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
uint8_t code = ledmap_get_code(i);
if (code >= LEDMAP_LAYER_0 && code < LEDMAP_LAYER_31) {
state & (1UL << (code - LEDMAP_LAYER_0)) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
}
}
update_led_state();
}
#endif

#ifdef SOFTPWM_LED_ENABLE
void softpwm_led_on()
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
uint8_t code = ledmap_get_code(i);
if (code == LEDMAP_BACKLIGHT) {
ledmap_led_on(i);
}
}
}

void softpwm_led_off()
{
for (uint8_t i = 0; i < LED_COUNT; i++) {
uint8_t code = ledmap_get_code(i);
if (code == LEDMAP_BACKLIGHT) {
ledmap_led_off(i);
}
}
}
#endif

void update_led_state(void)
{
uint8_t diff = led_state_last ^ led_state;
if (diff) {
for (uint8_t i = 0; i < LED_COUNT; i++) {
if (diff & LED_BIT(i)) {
if (led_state & LED_BIT(i)) {
ledmap_led_on(i);
}
else {
ledmap_led_off(i);
}
}
}
led_state_last = led_state;
}
}

+ 52
- 1
common/ledmap.h View File

#ifndef LEDMAP_H #ifndef LEDMAP_H
#define LEDMAP_H #define LEDMAP_H


#ifdef LEDMAP_ENABLE
#include "stdint.h"

#if (LED_COUNT <= 8)
typedef uint8_t led_pack_t;
#elif (LED_COUNT <= 16)
typedef uint16_t led_pack_t;
#elif (LED_COUNT <= 32)
typedef uint32_t led_pack_t;
#else
#error "LED_COUNT: invalid value"
#endif


typedef led_pack_t led_state_t;

#if (LED_COUNT <= 16)
#define LED_BIT(i) (1U<<(i))
#elif (LED_COUNT <= 32)
#define LED_BIT(i) (1UL<<(i))
#else
#error "LED_COUNT: invalid value"
#endif

#define LED_BIT_ON(state, i) ((state) |= LED_BIT(i))
#define LED_BIT_OFF(state, i) ((state) &= ~LED_BIT(i))

typedef enum {
LEDMAP_DEFAULT_LAYER_0 = 0,
LEDMAP_DEFAULT_LAYER_31 = 31,
LEDMAP_LAYER_0 = 32,
LEDMAP_LAYER_31 = 63,
LEDMAP_NUM_LOCK = 64,
LEDMAP_CAPS_LOCK,
LEDMAP_SCROLL_LOCK,
LEDMAP_COMPOSE,
LEDMAP_KANA,
LEDMAP_BACKLIGHT
} ledmap_code_t;

#define LEDMAP_LAYER(x) (x)
#define LEDMAP_DEFAULT_LAYER(x) (32 + x)

void ledmap_init(void);

#ifdef LEDMAP_ENABLE
uint8_t ledmap_get_code(uint8_t index);
void ledmap_led_init(void);
void ledmap_led_on(uint8_t index);
void ledmap_led_off(uint8_t index);
#else #else
#define ledmaps
#define ledmap_get()
#define ledmap_led_init()
#define ledmap_led_on()
#define ledmap_led_off()
#endif #endif


#endif #endif

+ 7
- 7
common/softpwm_led.c View File

/* Enable Compare Match Interrupt */ /* Enable Compare Match Interrupt */
#ifdef SOFTPWM_LED_TIMER3 #ifdef SOFTPWM_LED_TIMER3
TIMSK3 |= (1<<OCIE3A); TIMSK3 |= (1<<OCIE3A);
dprintf("softpwm led on: %u\n", TIMSK3 & (1<<OCIE3A));
//dprintf("softpwm led on: %u\n", TIMSK3 & (1<<OCIE3A));
#else #else
TIMSK1 |= (1<<OCIE1A); TIMSK1 |= (1<<OCIE1A);
dprintf("softpwm led on: %u\n", TIMSK1 & (1<<OCIE1A));
//dprintf("softpwm led on: %u\n", TIMSK1 & (1<<OCIE1A));
#endif #endif
} }


/* Disable Compare Match Interrupt */ /* Disable Compare Match Interrupt */
#ifdef SOFTPWM_LED_TIMER3 #ifdef SOFTPWM_LED_TIMER3
TIMSK3 &= ~(1<<OCIE3A); TIMSK3 &= ~(1<<OCIE3A);
dprintf("softpwm led off: %u\n", TIMSK3 & (1<<OCIE3A));
//dprintf("softpwm led off: %u\n", TIMSK3 & (1<<OCIE3A));
#else #else
TIMSK1 &= ~(1<<OCIE1A); TIMSK1 &= ~(1<<OCIE1A);
dprintf("softpwm led off: %u\n", TIMSK1 & (1<<OCIE1A));
//dprintf("softpwm led off: %u\n", TIMSK1 & (1<<OCIE1A));
#endif #endif
} }


/* Disable Compare Match Interrupt */ /* Disable Compare Match Interrupt */
#ifdef SOFTPWM_LED_TIMER3 #ifdef SOFTPWM_LED_TIMER3
TIMSK3 ^= (1<<OCIE3A); TIMSK3 ^= (1<<OCIE3A);
dprintf("softpwm led toggle: %u\n", TIMSK3 & (1<<OCIE3A));
//dprintf("softpwm led toggle: %u\n", TIMSK3 & (1<<OCIE3A));
#else #else
TIMSK1 ^= (1<<OCIE1A); TIMSK1 ^= (1<<OCIE1A);
dprintf("softpwm led toggle: %u\n", TIMSK1 & (1<<OCIE1A));
//dprintf("softpwm led toggle: %u\n", TIMSK1 & (1<<OCIE1A));
#endif #endif
} }


void breathing_led_set_duration(uint8_t dur) void breathing_led_set_duration(uint8_t dur)
{ {
breathing_led_duration = dur; breathing_led_duration = dur;
dprintf("breathing led set duration: %u\n", breathing_led_duration);
//dprintf("breathing led set duration: %u\n", breathing_led_duration);
} }


#endif #endif