~ruther/qmk_firmware

1eb8523e9506c752fb726208d8853a82f06e6659 — Wraul 12 years ago 9de9d71
Add support for backlight
M README.md => README.md +1 -0
@@ 23,6 23,7 @@ These features can be used in your keyboard.
* Virtual DIP Switch  - Configurations stored EEPROM(Boot Magic)
* Locking CapsLock    - Mechanical switch support for CapsLock
* Breathing Sleep LED - Sleep indicator with charm during USB suspend
* Backlight           - Control backlight levels


Projects

M common.mk => common.mk +5 -0
@@ 63,6 63,11 @@ ifdef SLEEP_LED_ENABLE
    OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
endif

ifdef BACKLIGHT_ENABLE
    SRC += $(COMMON_DIR)/backlight.c
    OPT_DEFS += -DBACKLIGHT_ENABLE
endif


# Search Path
VPATH += $(TOP_DIR)/common

M common/action.c => common/action.c +21 -0
@@ 20,6 20,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include "mousekey.h"
#include "command.h"
#include "led.h"
#include "backlight.h"
#include "action_layer.h"
#include "action_tapping.h"
#include "action_oneshot.h"


@@ 292,6 293,26 @@ void process_action(keyrecord_t *record)
            action_macro_play(action_get_macro(record, action.func.id, action.func.opt));
            break;
#endif
#ifdef BACKLIGHT_ENABLE
        case ACT_BACKLIGHT:
            if (!event.pressed) {
                switch (action.backlight.id) {
                    case BACKLIGHT_INCREASE:
                        backlight_increase();
                        break;
                    case BACKLIGHT_DECREASE:
                        backlight_decrease();
                        break;
                    case BACKLIGHT_TOGGLE:
                        backlight_toggle();
                        break;
                    case BACKLIGHT_STEP:
                        backlight_step();
                        break;
                }
            }
            break;
#endif
        case ACT_COMMAND:
            break;
#ifndef NO_ACTION_FUNCTION

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


@@ 109,6 112,7 @@ enum action_kind_id {
    ACT_LAYER_TAP1      = 0b1011,
    /* Extensions */
    ACT_MACRO           = 0b1100,
    ACT_BACKLIGHT       = 0b1101,
    ACT_COMMAND         = 0b1110,
    ACT_FUNCTION        = 0b1111
};


@@ 157,6 161,9 @@ typedef union {
        uint8_t  page   :2;
        uint8_t  kind   :4;
    } usage;
    struct action_backlight {
        uint8_t  id     :8;
    } backlight;
    struct action_command {
        uint8_t  id     :8;
        uint8_t  opt    :4;


@@ 272,10 279,21 @@ enum layer_pram_tap_op {
/*
 * Extensions
 */
enum backlight_id {
    BACKLIGHT_INCREASE = 0,
    BACKLIGHT_DECREASE = 1,
    BACKLIGHT_TOGGLE   = 2,
    BACKLIGHT_STEP     = 3,
};
/* 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)
/* Command */
#define ACTION_COMMAND(id, opt)         ACTION(ACT_COMMAND,  (opt)<<8 | (addr))
/* Function */

A common/backlight.c => common/backlight.c +77 -0
@@ 0,0 1,77 @@
/*
Copyright 2013 Mathias Andersson <wraul@dbox.se>

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 <http://www.gnu.org/licenses/>.
*/

#include "backlight.h"
#include "eeconfig.h"
#include "debug.h"

backlight_config_t backlight_config;

void backlight_init(void)
{
    /* check signature */
    if (!eeconfig_is_enabled()) {
        eeconfig_init();
    }
    backlight_config.raw = eeconfig_read_backlight();
    backlight_set(backlight_config.enable ? backlight_config.level : 0);
}

void backlight_increase(void)
{
    if(backlight_config.level < BACKLIGHT_LEVELS)
    {
        backlight_config.level++;
        backlight_config.enable = 1;
        eeconfig_write_backlight(backlight_config.raw);
    }
    dprintf("backlight increase: %u\n", backlight_config.level);
    backlight_set(backlight_config.level);
}

void backlight_decrease(void)
{
    if(backlight_config.level > 0)
    {
        backlight_config.level--;
        backlight_config.enable = !!backlight_config.level;
        eeconfig_write_backlight(backlight_config.raw);
    }
    dprintf("backlight decrease: %u\n", backlight_config.level);
    backlight_set(backlight_config.level);
}

void backlight_toggle(void)
{
    backlight_config.enable ^= 1;
    eeconfig_write_backlight(backlight_config.raw);
    dprintf("backlight toggle: %u\n", backlight_config.enable);
    backlight_set(backlight_config.enable ? backlight_config.level : 0);
}

void backlight_step(void)
{
    backlight_config.level++;
    if(backlight_config.level > BACKLIGHT_LEVELS)
    {
        backlight_config.level = 0;
    }
    backlight_config.enable = !!backlight_config.level;
    eeconfig_write_backlight(backlight_config.raw);
    dprintf("backlight step: %u\n", backlight_config.level);
    backlight_set(backlight_config.level);
}

A common/backlight.h => common/backlight.h +41 -0
@@ 0,0 1,41 @@
/*
Copyright 2013 Mathias Andersson <wraul@dbox.se>

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 <http://www.gnu.org/licenses/>.
*/

#ifndef BACKLIGHT_H
#define BACKLIGHT_H

#include <stdint.h>
#include <stdbool.h>

typedef union {
    uint8_t raw;
    struct {
        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);

#endif

M common/command.c => common/command.c +7 -0
@@ 31,6 31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include "sleep_led.h"
#include "led.h"
#include "command.h"
#include "backlight.h"

#ifdef MOUSEKEY_ENABLE
#include "mousekey.h"


@@ 149,6 150,12 @@ static void print_eeconfig(void)
    print(".no_gui: "); print_dec(kc.no_gui); print("\n");
    print(".swap_grave_esc: "); print_dec(kc.swap_grave_esc); print("\n");
    print(".swap_backslash_backspace: "); print_dec(kc.swap_backslash_backspace); print("\n");

    backlight_config_t bc;
    bc.raw = eeconfig_read_backlight();
    print("backlight_config.raw: "); print_hex8(bc.raw); print("\n");
    print(".enable: "); print_dec(bc.enable); print("\n");
    print(".level: "); print_dec(bc.level); print("\n");
}
#endif


M common/eeconfig.c => common/eeconfig.c +4 -0
@@ 10,6 10,7 @@ void eeconfig_init(void)
    eeprom_write_byte(EECONFIG_DEFAULT_LAYER,  0);
    eeprom_write_byte(EECONFIG_KEYMAP,         0);
    eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0);
    eeprom_write_byte(EECONFIG_BACKLIGHT,      0);
}

void eeconfig_enable(void)


@@ 35,3 36,6 @@ void eeconfig_write_default_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFA

uint8_t eeconfig_read_keymap(void)      { return eeprom_read_byte(EECONFIG_KEYMAP); }
void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); }

uint8_t eeconfig_read_backlight(void)      { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }

M common/eeconfig.h => common/eeconfig.h +5 -0
@@ 19,6 19,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define EECONFIG_H

#include <stdint.h>
#include <stdbool.h>


#define EECONFIG_MAGIC_NUMBER                       (uint16_t)0xFEED


@@ 29,6 30,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define EECONFIG_DEFAULT_LAYER                      (uint8_t *)3
#define EECONFIG_KEYMAP                             (uint8_t *)4
#define EECONFIG_MOUSEKEY_ACCEL                     (uint8_t *)5
#define EECONFIG_BACKLIGHT                          (uint8_t *)6


/* debug bit */


@@ 64,4 66,7 @@ void eeconfig_write_default_layer(uint8_t val);
uint8_t eeconfig_read_keymap(void);
void eeconfig_write_keymap(uint8_t val);

uint8_t eeconfig_read_backlight(void);
void eeconfig_write_backlight(uint8_t val);

#endif

M common/keyboard.c => common/keyboard.c +5 -0
@@ 31,6 31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include "bootmagic.h"
#include "eeconfig.h"
#include "mousekey.h"
#include "backlight.h"


#ifdef MATRIX_HAS_GHOST


@@ 65,6 66,10 @@ void keyboard_init(void)
#ifdef BOOTMAGIC_ENABLE
    bootmagic();
#endif

#ifdef BACKLIGHT_ENABLE
    backlight_init();
#endif
}

/*

M common/suspend.c => common/suspend.c +7 -0
@@ 1,10 1,14 @@
#include "suspend.h"
#include "matrix.h"
#include "action.h"
#include "backlight.h"


void suspend_power_down(void)
{
#ifdef BACKLIGHT_ENABLE
    backlight_set(0);
#endif
#ifndef NO_SUSPEND_POWER_DOWN
    // Enable watchdog to wake from MCU sleep
    cli();


@@ 50,6 54,9 @@ void suspend_wakeup_init(void)
    // clear matrix and keyboard state
    matrix_init();
    clear_keyboard();
#ifdef BACKLIGHT_ENABLE
    backlight_init();
#endif
}

#ifndef NO_SUSPEND_POWER_DOWN

M doc/build.md => doc/build.md +1 -0
@@ 132,6 132,7 @@ Optional. Note that ***comment out*** to disable them.
    COMMAND_ENABLE = yes        # Commands for debug and configuration
    SLEEP_LED_ENABLE = yes      # Breathing sleep LED during USB suspend
    #NKRO_ENABLE = yes          # USB Nkey Rollover - not yet supported in LUFA
    #BACKLIGHT_ENABLE = yes     # Enable keyboard backlight functionality

### 3. Programmer
Optional. Set proper command for your controller, bootloader and programmer. This command can be used with `make program`. Not needed if you use `FLIP`, `dfu-programmer` or `Teesy Loader`.

M doc/keymap.md => doc/keymap.md +21 -0
@@ 430,6 430,27 @@ See `keyboard/hhkb/keymap.c` for sample.



### 2.5 Backlight Action
These actions control the backlight.

#### 2.5.1 Change backlight level
Increase backlight level.

    ACTION_BACKLIGHT_INCREASE()

Decrease backlight level.

    ACTION_BACKLIGHT_DECREASE()

Step through backlight levels.

    ACTION_BACKLIGHT_STEP()

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

    ACTION_BACKLIGHT_TOGGLE()



## 3. Layer switching Example