aboutsummaryrefslogtreecommitdiffstats
path: root/docs/custom_quantum_functions.md
diff options
context:
space:
mode:
authoryulei <yuleiz@gmail.com>2020-08-23 04:45:06 +0800
committerGitHub <noreply@github.com>2020-08-22 13:45:06 -0700
commitac3dfa742a92de541f86846b94269aab87d55d3c (patch)
treea14cd8d42a963e8aa2e50b214e57f89973f9ea8e /docs/custom_quantum_functions.md
parente02f4798f97f7432e8df55846f8eb496b6ac45d1 (diff)
downloadfirmware-ac3dfa742a92de541f86846b94269aab87d55d3c.tar.gz
firmware-ac3dfa742a92de541f86846b94269aab87d55d3c.tar.bz2
firmware-ac3dfa742a92de541f86846b94269aab87d55d3c.zip
[Keyboard] added matrix 8xv2.0 additional (#9470)
* added matrix 8xv2.0 additional keyboard * Apply suggestions from code review Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * add copyright and speed up the matrix scanning * Update keyboards/matrix/m20add/rules.mk Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> Co-authored-by: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'docs/custom_quantum_functions.md')
0 files changed, 0 insertions, 0 deletions
n127' href='#n127'>127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
/* Copyright 2017 Fred Sundvik
 *
 * 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 "lcd_keyframes.h"
#include <string.h>
#include "action_util.h"
#include "led.h"
#include "resources/resources.h"

bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)animation;
    gdispClear(White);
    gdispDrawString(0, 10, state->layer_text, state->font_dejavusansbold12, Black);
    return false;
}

static void format_layer_bitmap_string(uint16_t default_layer, uint16_t layer, char* buffer) {
    for (int i=0; i<16;i++)
    {
        uint32_t mask = (1u << i);
        if (default_layer & mask) {
            if (layer & mask) {
                *buffer = 'B';
            } else {
                *buffer = 'D';
            }
        } else if (layer & mask) {
            *buffer = '1';
        } else {
            *buffer = '0';
        }
        ++buffer;

        if (i==3 || i==7 || i==11) {
            *buffer = ' ';
            ++buffer;
        }
    }
    *buffer = 0;
}

bool lcd_keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)animation;
    const char* layer_help = "1=On D=Default B=Both";
    char layer_buffer[16 + 4]; // 3 spaces and one null terminator
    gdispClear(White);
    gdispDrawString(0, 0, layer_help, state->font_fixed5x8, Black);
    format_layer_bitmap_string(state->status.default_layer, state->status.layer, layer_buffer);
    gdispDrawString(0, 10, layer_buffer, state->font_fixed5x8, Black);
    format_layer_bitmap_string(state->status.default_layer >> 16, state->status.layer >> 16, layer_buffer);
    gdispDrawString(0, 20, layer_buffer, state->font_fixed5x8, Black);
    return false;
}

static void format_mods_bitmap_string(uint8_t mods, char* buffer) {
    *buffer = ' ';
    ++buffer;

    for (int i = 0; i<8; i++)
    {
        uint32_t mask = (1u << i);
        if (mods & mask) {
            *buffer = '1';
        } else {
            *buffer = '0';
        }
        ++buffer;

        if (i==3) {
            *buffer = ' ';
            ++buffer;
        }
    }
    *buffer = 0;
}

bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)animation;

    const char* title = "Modifier states";
    const char* mods_header = " CSAG CSAG ";
    char status_buffer[12];

    gdispClear(White);
    gdispDrawString(0, 0, title, state->font_fixed5x8, Black);
    gdispDrawString(0, 10, mods_header, state->font_fixed5x8, Black);
    format_mods_bitmap_string(state->status.mods, status_buffer);
    gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black);

    return false;
}

#define LED_STATE_STRING_SIZE sizeof("NUM CAPS SCRL COMP KANA")

static void get_led_state_string(char* output, visualizer_state_t* state) {
    uint8_t pos = 0;

    if (state->status.leds & (1u << USB_LED_NUM_LOCK)) {
       memcpy(output + pos, "NUM ", 4);
       pos += 4;
    }
    if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
       memcpy(output + pos, "CAPS ", 5);
       pos += 5;
    }
    if (state->status.leds & (1u << USB_LED_SCROLL_LOCK)) {
       memcpy(output + pos, "SCRL ", 5);
       pos += 5;
    }
    if (state->status.leds & (1u << USB_LED_COMPOSE)) {
       memcpy(output + pos, "COMP ", 5);
       pos += 5;
    }
    if (state->status.leds & (1u << USB_LED_KANA)) {
       memcpy(output + pos, "KANA", 4);
       pos += 4;
    }
    output[pos] = 0;
}

bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state)
{
    (void)animation;
    char output[LED_STATE_STRING_SIZE];
    get_led_state_string(output, state);
    gdispClear(White);
    gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black);
    return false;
}

bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)animation;
    gdispClear(White);
    uint8_t y = 10;
    if (state->status.leds) {
        char output[LED_STATE_STRING_SIZE];
        get_led_state_string(output, state);
        gdispDrawString(0, 1, output, state->font_dejavusansbold12, Black);
        y = 17;
    }
    gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black);
    return false;
}

bool lcd_keyframe_draw_logo(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)state;
    (void)animation;
    // Read the uGFX documentation for information how to use the displays
    // http://wiki.ugfx.org/index.php/Main_Page
    gdispClear(White);

    // You can use static variables for things that can't be found in the animation
    // or state structs, here we use the image

    //gdispGBlitArea is a tricky function to use since it supports blitting part of the image
    // if you have full screen image, then just use LCD_WIDTH and LCD_HEIGHT for both source and target dimensions
    gdispGBlitArea(GDISP, 0, 0, LCD_WIDTH, LCD_HEIGHT, 0, 0, LCD_WIDTH, (pixel_t*)resource_lcd_logo);

    return false;
}


bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)animation;
    (void)state;
    gdispSetPowerMode(powerOff);
    return false;
}

bool lcd_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state) {
    (void)animation;
    (void)state;
    gdispSetPowerMode(powerOn);
    return false;
}