~ruther/qmk_firmware

589d99b448e6085513799fbb183f6389d4df408d — Ralf Schmitt 11 years ago 5c63751
New macro: ACTION_BACKLIGHT_LEVEL(level)

To have full control of the backlight level.
M common/action.c => common/action.c +4 -1
@@ 294,7 294,7 @@ void process_action(keyrecord_t *record)
#ifdef BACKLIGHT_ENABLE
        case ACT_BACKLIGHT:
            if (!event.pressed) {
                switch (action.backlight.id) {
                switch (action.backlight.opt) {
                    case BACKLIGHT_INCREASE:
                        backlight_increase();
                        break;


@@ 307,6 307,9 @@ void process_action(keyrecord_t *record)
                    case BACKLIGHT_STEP:
                        backlight_step();
                        break;
                    case BACKLIGHT_LEVEL:
                        backlight_level(action.backlight.level);
                        break;
                }
            }
            break;

M common/action_code.h => common/action_code.h +11 -7
@@ 87,7 87,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 1100|1111| id(8)      Macro record?
 *
 * ACT_BACKLIGHT(1101):
 * 1101|xxxx| id(8)      Backlight commands
 * 1101|opt |level(8)    Backlight commands
 *
 * ACT_COMMAND(1110):
 * 1110|opt | id(8)      Built-in Command exec


@@ 163,7 163,9 @@ typedef union {
        uint8_t  kind   :4;
    } usage;
    struct action_backlight {
        uint8_t  id     :8;
        uint8_t  level  :8;
        uint8_t  opt    :4;
        uint8_t  kind   :4;
    } backlight;
    struct action_command {
        uint8_t  id     :8;


@@ 282,21 284,23 @@ enum layer_pram_tap_op {
/*
 * Extensions
 */
enum backlight_id {
enum backlight_opt {
    BACKLIGHT_INCREASE = 0,
    BACKLIGHT_DECREASE = 1,
    BACKLIGHT_TOGGLE   = 2,
    BACKLIGHT_STEP     = 3,
    BACKLIGHT_LEVEL    = 4,
};
/* Macro */
#define ACTION_MACRO(id)                ACTION(ACT_MACRO, (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))
/* 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 */
#define ACTION_COMMAND(id, opt)         ACTION(ACT_COMMAND,  (opt)<<8 | (addr))
/* Function */

M common/backlight.c => common/backlight.c +8 -0
@@ 75,3 75,11 @@ void backlight_step(void)
    dprintf("backlight step: %u\n", 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);
}

M common/backlight.h => common/backlight.h +3 -4
@@ 24,18 24,17 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
typedef union {
    uint8_t raw;
    struct {
        bool    enable:1;
        uint8_t level:7;
        bool    enable :1;
        uint8_t level  :7;
    };
} backlight_config_t;

void backlight_init(void);

void backlight_increase(void);
void backlight_decrease(void);
void backlight_toggle(void);
void backlight_step(void);

void backlight_set(uint8_t level);
void backlight_level(uint8_t level);

#endif

M doc/keymap.md => doc/keymap.md +4 -0
@@ 444,6 444,10 @@ Step through backlight levels.

    ACTION_BACKLIGHT_STEP()

Turn a specific backlight level on or off.

    ACTION_BACKLIGHT_LEVEL(1)

#### 2.5.2 Turn on / off backlight
Turn the backlight on and off without changing level.


M keyboard/lightsaber/backlight.c => keyboard/lightsaber/backlight.c +39 -9
@@ 26,8 26,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * Backside  PD6 (high)
 * TopRight  PD7 (low)
 * F-Row     PE6 (high)
 *
 */

void backlight_set(uint8_t level)
{
    // Set as output.


@@ 35,22 35,52 @@ void backlight_set(uint8_t level)
    DDRD |= (1<<6) | (1<<7);
    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
    {
        PORTB |= (1<<1);
        PORTB &= ~(1<<1);
    }
    if (level & BACKLIGHT_NUMERIC)
    {
        PORTB |= (1<<2);
    }
    else
    {
        PORTB &= ~(1<<2);
    }
    if (level & BACKLIGHT_MODNUM)
    {
        PORTB |= (1<<3);
    }
    else
    {
        PORTB &= ~(1<<3);
    }
    if (level & BACKLIGHT_BACKSIDE)
    {
        PORTD |= (1<<6);
    }
    else
    {
        PORTD &= ~(1<<6);
    }
    if (level & BACKLIGHT_TOPRIGHT)
    {
        PORTD &= ~(1<<7);
    }
    else
    {
        PORTD |= (1<<7);
    }
    if (level & BACKLIGHT_FROW)
    {
        PORTE |= (1<<6);
    }
    else
    {
        PORTE &= ~(1<<6);
    }
}

A keyboard/lightsaber/backlight.h => keyboard/lightsaber/backlight.h +9 -0
@@ 0,0 1,9 @@

enum backlight_level {
    BACKLIGHT_ALPHA    = 0b0000001,
    BACKLIGHT_NUMERIC  = 0b0000010,
    BACKLIGHT_MODNUM   = 0b0000100,
    BACKLIGHT_BACKSIDE = 0b0001000,
    BACKLIGHT_TOPRIGHT = 0b0010000,
    BACKLIGHT_FROW     = 0b0100000,
};

M keyboard/lightsaber/keymap_winkey.h => keyboard/lightsaber/keymap_winkey.h +11 -3
@@ 1,3 1,5 @@
#include "backlight.h"

static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    KEYMAP(\
        ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,      INS,    PSCR,    SLCK,       BRK,      \


@@ 8,14 10,20 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        LCTL,LGUI,LALT,               SPC,                NO,  RALT,RGUI,RCTL,     KP_0,   NO,      KP_DOT,     NO),      \
    KEYMAP(\
        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,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,               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[] = {
    [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)
};