To have full control of the backlight level.tags/v1.9
#ifdef BACKLIGHT_ENABLE | #ifdef BACKLIGHT_ENABLE | ||||
case ACT_BACKLIGHT: | case ACT_BACKLIGHT: | ||||
if (!event.pressed) { | if (!event.pressed) { | ||||
switch (action.backlight.id) { | |||||
switch (action.backlight.opt) { | |||||
case BACKLIGHT_INCREASE: | case BACKLIGHT_INCREASE: | ||||
backlight_increase(); | backlight_increase(); | ||||
break; | break; | ||||
case BACKLIGHT_STEP: | case BACKLIGHT_STEP: | ||||
backlight_step(); | backlight_step(); | ||||
break; | break; | ||||
case BACKLIGHT_LEVEL: | |||||
backlight_level(action.backlight.level); | |||||
break; | |||||
} | } | ||||
} | } | ||||
break; | break; |
* 1100|1111| id(8) Macro record? | * 1100|1111| id(8) Macro record? | ||||
* | * | ||||
* ACT_BACKLIGHT(1101): | * ACT_BACKLIGHT(1101): | ||||
* 1101|xxxx| id(8) Backlight commands | |||||
* 1101|opt |level(8) Backlight commands | |||||
* | * | ||||
* ACT_COMMAND(1110): | * ACT_COMMAND(1110): | ||||
* 1110|opt | id(8) Built-in Command exec | * 1110|opt | id(8) Built-in Command exec | ||||
uint8_t kind :4; | uint8_t kind :4; | ||||
} usage; | } usage; | ||||
struct action_backlight { | struct action_backlight { | ||||
uint8_t id :8; | |||||
uint8_t level :8; | |||||
uint8_t opt :4; | |||||
uint8_t kind :4; | |||||
} backlight; | } backlight; | ||||
struct action_command { | struct action_command { | ||||
uint8_t id :8; | uint8_t id :8; | ||||
/* | /* | ||||
* Extensions | * Extensions | ||||
*/ | */ | ||||
enum backlight_id { | |||||
enum backlight_opt { | |||||
BACKLIGHT_INCREASE = 0, | BACKLIGHT_INCREASE = 0, | ||||
BACKLIGHT_DECREASE = 1, | BACKLIGHT_DECREASE = 1, | ||||
BACKLIGHT_TOGGLE = 2, | BACKLIGHT_TOGGLE = 2, | ||||
BACKLIGHT_STEP = 3, | BACKLIGHT_STEP = 3, | ||||
BACKLIGHT_LEVEL = 4, | |||||
}; | }; | ||||
/* Macro */ | /* Macro */ | ||||
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id)) | #define ACTION_MACRO(id) ACTION(ACT_MACRO, (id)) | ||||
#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id)) | #define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id)) | ||||
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id)) | #define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id)) | ||||
/* Backlight */ | /* Backlight */ | ||||
#define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE) | |||||
#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE) | |||||
#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE) | |||||
#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP) | |||||
#define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE << 8) | |||||
#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8) | |||||
#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8) | |||||
#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8) | |||||
#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level) | |||||
/* Command */ | /* Command */ | ||||
#define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr)) | #define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr)) | ||||
/* Function */ | /* Function */ |
dprintf("backlight step: %u\n", backlight_config.level); | dprintf("backlight step: %u\n", backlight_config.level); | ||||
backlight_set(backlight_config.level); | backlight_set(backlight_config.level); | ||||
} | } | ||||
void backlight_level(uint8_t level) | |||||
{ | |||||
backlight_config.level ^= level; | |||||
backlight_config.enable = !!backlight_config.level; | |||||
eeconfig_write_backlight(backlight_config.raw); | |||||
backlight_set(backlight_config.level); | |||||
} |
typedef union { | typedef union { | ||||
uint8_t raw; | uint8_t raw; | ||||
struct { | struct { | ||||
bool enable:1; | |||||
uint8_t level:7; | |||||
bool enable :1; | |||||
uint8_t level :7; | |||||
}; | }; | ||||
} backlight_config_t; | } backlight_config_t; | ||||
void backlight_init(void); | void backlight_init(void); | ||||
void backlight_increase(void); | void backlight_increase(void); | ||||
void backlight_decrease(void); | void backlight_decrease(void); | ||||
void backlight_toggle(void); | void backlight_toggle(void); | ||||
void backlight_step(void); | void backlight_step(void); | ||||
void backlight_set(uint8_t level); | void backlight_set(uint8_t level); | ||||
void backlight_level(uint8_t level); | |||||
#endif | #endif |
ACTION_BACKLIGHT_STEP() | ACTION_BACKLIGHT_STEP() | ||||
Turn a specific backlight level on or off. | |||||
ACTION_BACKLIGHT_LEVEL(1) | |||||
#### 2.5.2 Turn on / off backlight | #### 2.5.2 Turn on / off backlight | ||||
Turn the backlight on and off without changing level. | Turn the backlight on and off without changing level. | ||||
* Backside PD6 (high) | * Backside PD6 (high) | ||||
* TopRight PD7 (low) | * TopRight PD7 (low) | ||||
* F-Row PE6 (high) | * F-Row PE6 (high) | ||||
* | |||||
*/ | */ | ||||
void backlight_set(uint8_t level) | void backlight_set(uint8_t level) | ||||
{ | { | ||||
// Set as output. | // Set as output. | ||||
DDRD |= (1<<6) | (1<<7); | DDRD |= (1<<6) | (1<<7); | ||||
DDRE |= (1<<6); | DDRE |= (1<<6); | ||||
if(level & (1<<0)) | |||||
if (level & BACKLIGHT_ALPHA) | |||||
{ | { | ||||
PORTB &= ~(1<<1); | |||||
PORTB &= ~(1<<2); | |||||
PORTB &= ~(1<<3); | |||||
PORTD &= ~(1<<6); | |||||
PORTD |= (1<<7); | |||||
PORTE &= ~(1<<6); | |||||
PORTB |= (1<<1); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
PORTB |= (1<<1); | |||||
PORTB &= ~(1<<1); | |||||
} | |||||
if (level & BACKLIGHT_NUMERIC) | |||||
{ | |||||
PORTB |= (1<<2); | PORTB |= (1<<2); | ||||
} | |||||
else | |||||
{ | |||||
PORTB &= ~(1<<2); | |||||
} | |||||
if (level & BACKLIGHT_MODNUM) | |||||
{ | |||||
PORTB |= (1<<3); | PORTB |= (1<<3); | ||||
} | |||||
else | |||||
{ | |||||
PORTB &= ~(1<<3); | |||||
} | |||||
if (level & BACKLIGHT_BACKSIDE) | |||||
{ | |||||
PORTD |= (1<<6); | PORTD |= (1<<6); | ||||
} | |||||
else | |||||
{ | |||||
PORTD &= ~(1<<6); | |||||
} | |||||
if (level & BACKLIGHT_TOPRIGHT) | |||||
{ | |||||
PORTD &= ~(1<<7); | PORTD &= ~(1<<7); | ||||
} | |||||
else | |||||
{ | |||||
PORTD |= (1<<7); | |||||
} | |||||
if (level & BACKLIGHT_FROW) | |||||
{ | |||||
PORTE |= (1<<6); | PORTE |= (1<<6); | ||||
} | } | ||||
else | |||||
{ | |||||
PORTE &= ~(1<<6); | |||||
} | |||||
} | } |
enum backlight_level { | |||||
BACKLIGHT_ALPHA = 0b0000001, | |||||
BACKLIGHT_NUMERIC = 0b0000010, | |||||
BACKLIGHT_MODNUM = 0b0000100, | |||||
BACKLIGHT_BACKSIDE = 0b0001000, | |||||
BACKLIGHT_TOPRIGHT = 0b0010000, | |||||
BACKLIGHT_FROW = 0b0100000, | |||||
}; |
#include "backlight.h" | |||||
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
KEYMAP(\ | KEYMAP(\ | ||||
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, PSCR, SLCK, BRK, \ | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, PSCR, SLCK, BRK, \ | ||||
LCTL,LGUI,LALT, SPC, NO, RALT,RGUI,RCTL, KP_0, NO, KP_DOT, NO), \ | LCTL,LGUI,LALT, SPC, NO, RALT,RGUI,RCTL, KP_0, NO, KP_DOT, NO), \ | ||||
KEYMAP(\ | KEYMAP(\ | ||||
CALC,MYCM,WSCH,WHOM,MAIL,MUTE,VOLD,VOLU,MSEL,MSTP,MPLY,MPRV,MNXT,TRNS, TRNS, WAKE, PWR, SLEP, \ | CALC,MYCM,WSCH,WHOM,MAIL,MUTE,VOLD,VOLU,MSEL,MSTP,MPLY,MPRV,MNXT,TRNS, TRNS, WAKE, PWR, SLEP, \ | ||||
TRNS,TRNS,TRNS,TRNS,END ,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | |||||
FN1, FN2, FN3, FN4, FN5, FN6, FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | |||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | ||||
TRNS,TRNS,TRNS,TRNS,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | TRNS,TRNS,TRNS,TRNS,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | ||||
TRNS, TRNS,TRNS,TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | TRNS, TRNS,TRNS,TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \ | ||||
TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS) | |||||
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS) | |||||
}; | }; | ||||
static const uint16_t PROGMEM fn_actions[] = { | static const uint16_t PROGMEM fn_actions[] = { | ||||
[0] = ACTION_LAYER_MOMENTARY(1), | [0] = ACTION_LAYER_MOMENTARY(1), | ||||
[1] = ACTION_BACKLIGHT_STEP() | |||||
[1] = ACTION_BACKLIGHT_TOGGLE(), | |||||
[2] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_ALPHA), | |||||
[3] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_MODNUM), | |||||
[4] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_NUMERIC), | |||||
[5] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_FROW), | |||||
[6] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_BACKSIDE), | |||||
[7] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_TOPRIGHT) | |||||
}; | }; |