diff options
18 files changed, 1440 insertions, 0 deletions
| diff --git a/keyboards/clueboard/2x1800/2021/.noci b/keyboards/clueboard/2x1800/2021/.noci new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/.noci diff --git a/keyboards/clueboard/2x1800/2021/2021.c b/keyboards/clueboard/2x1800/2021/2021.c new file mode 100644 index 0000000000..40f2a2ed67 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/2021.c @@ -0,0 +1,154 @@ +/* Copyright 2017 Zach White <[email protected]> + * + * 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 "2021.h" +#include "max7219.h" +#include "font.h" + +#ifndef DRAWING_TOY_MODE +static uint16_t led_frame_timer = 0; + +void matrix_scan_kb(void) { +    if (timer_elapsed(led_frame_timer) > 100) { +        max7219_message_sign_task(true); +        led_frame_timer = timer_read(); +    } +} +#endif + +void matrix_init_kb(void) { +    max7219_init(); + +#if defined(MAX7219_LED_TEST) +    while(1) { +        for (int i=0; i<MAX7219_CONTROLLERS; i++) { +            max7219_display_test(i, true); +            wait_ms(500); +            max7219_display_test(i, false); +        } +    } +#elif defined(MAX7219_LED_ITERATE) +    while (1) { +        for (int row=0; row<8; row++) { +            for(int col=0;col<8*MAX7219_CONTROLLERS;col++) { +                max7219_set_led(row, col, true); +                wait_ms(500); +                max7219_set_led(row, col, false); +            } +        } +    } +#elif defined(MAX7219_LED_DANCE) +    while (1) { +        for (int col=0; col<8; col++) { +            for (int device_num=0; device_num<MAX7219_CONTROLLERS; device_num++) { +                if (col % 2 == 0) { +                    max7219_led_a[col][device_num] = 0b01010101; +                } else { +                    max7219_led_a[col][device_num] = 0b10101010; +                } +            } +        } +        max7219_write_frame(); +        wait_ms(500); +        for (int col=0; col<8; col++) { +            for (int device_num=0; device_num<MAX7219_CONTROLLERS; device_num++) { +                if (col % 2 == 0) { +                    max7219_led_a[col][device_num] = 0b10101010; +                } else { +                    max7219_led_a[col][device_num] = 0b01010101; +                } +            } +        } +        max7219_write_frame(); +        wait_ms(500); +    } +#elif defined(MAX7219_LED_FONTTEST) +    uint8_t message[MSG_FONTTEST_LEN][6] = MSG_FONTTEST; +    max7219_message_sign(message, MSG_FONTTEST_LEN); +#elif defined(MAX7219_LED_CLUEBOARD) +    uint8_t message[MSG_CLUEBOARD_LEN][6] = MSG_CLUEBOARD; +    max7219_message_sign(message, MSG_CLUEBOARD_LEN); +#elif defined(MAX7219_LED_KONAMI) +    uint8_t message[MSG_KONAMI_LEN][6] = MSG_KONAMI; +    max7219_message_sign(message, MSG_KONAMI_LEN); +#elif defined(MAX7219_LED_QMK_POWERED) +    uint8_t message[MSG_QMK_POWERED_LEN][6] = MSG_QMK_POWERED; +    max7219_message_sign(message, MSG_QMK_POWERED_LEN); +#elif defined(DRAWING_TOY_MODE) +    max7219_set_led(0, 0, true); +#endif +} + +__attribute__ ((weak)) +bool encoder_update_keymap(int8_t index, bool clockwise) { +    return false; +} + +#define NUM_COLUMNS 8*MAX7219_CONTROLLERS +uint8_t led_position[2] = {0,0};  // The location of the cursor in the matrix + +bool encoder_update_kb(uint8_t index, bool clockwise) { +    if (!encoder_update_keymap(index, clockwise)) { +#if defined(DRAWING_TOY_MODE) +        // Encoder 1, left +        if (index == 0 && clockwise) { +            if (led_position[0] < NUM_COLUMNS-1) {  // turned right +                led_position[0]++; +            } else { +                led_position[0]=0; +            } +        } else if (index == 0) { +            if (led_position[0] > 0) {  // turned left +                led_position[0]--; +            } else { +                led_position[0]=NUM_COLUMNS-1; +            } +        } + +        // Encoder 2, right +        else if (index == 1 && clockwise) { +            if (led_position[1] < 7) {  // turned right +                led_position[1]++; +            } else { +                led_position[1]=0; +            } +        } else if (index == 1) { +            if (led_position[1] > 0) {  // turned left +                led_position[1]--; +            } else { +                led_position[1]=7; +            } +        } + +        max7219_set_led(led_position[1], led_position[0], true); +#else +        // Encoder 1, left +        if (index == 0 && clockwise) { +            tap_code(KC_MS_R);  // turned right +        } else if (index == 0) { +            tap_code(KC_MS_L);  // turned left +        } + +        // Encoder 2, right +        else if (index == 1 && clockwise) { +            tap_code(KC_MS_U);  // turned right +        } else if (index == 1) { +            tap_code(KC_MS_D);  // turned left +        } +#endif +    } +    return true; +} diff --git a/keyboards/clueboard/2x1800/2021/2021.h b/keyboards/clueboard/2x1800/2021/2021.h new file mode 100644 index 0000000000..ecb9e00c4e --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/2021.h @@ -0,0 +1,18 @@ +/* Copyright 2017 Zach White <[email protected]> + * + * 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/>. + */ +#pragma once + +#include "quantum.h" diff --git a/keyboards/clueboard/2x1800/2021/config.h b/keyboards/clueboard/2x1800/2021/config.h new file mode 100644 index 0000000000..eccede6a41 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/config.h @@ -0,0 +1,96 @@ +/* +Copyright 2017 Zach White <[email protected]> + +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/>. +*/ + +#pragma once + +#include "config_common.h" + +/* audio support */ +#define AUDIO_PIN_ALT B7 +#define AUDIO_PIN C4 +#define AUDIO_CLICKY + +/* + * Encoder Assignments + */ +#define ENCODERS_PAD_A { D0, C5 } +#define ENCODERS_PAD_B { D1, C6 } +#define ENCODER_RESOLUTION 4 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE + +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +// Configure our MAX7219's +//#define MAX7219_LOAD B0 +//#define MAX7219_CONTROLLERS 4 +//#define MAX7219_LED_INTENSITY 1  // Max: 15 + +// Define this to disable the startup test +//#define MAX7219_NO_STARTUP_TEST + +/* This controls the speed of the sign, lower is faster. This is the minimal + * time between animation frames, in ms. Actual time between frames will + * always be slightly longer due to other keyboard tasks. + */ +//#define MAX7219_SCROLL_TIME 100 + +/* This setting controls how big the scrollable area for your message sign + * is. If you set it to 0 your display will not work. If you set it to 1 + * you will have no buffer area, and you will only be able to display a + * total of 6 characters. Every number after that increases the buffer area + * by 32 columns. + * + * You can calculate how big to make this for the number of characters you + * want to display: + * + *     <number of characters in message> * 6 / 32 + 1 + * + * You do not need to tune this unless you are trying to save ram. + */ +//#define MAX7219_BUFFER_MULTIPLIER 24 + +// You can only define one of these at a time: + +// Define this to test all LEDs. Keyboard functions will not work. +//#define MAX7219_LED_TEST + +// Define this to iterate through LEDs 1 by 1. Keyboard functions will not work. +//#define MAX7219_LED_ITERATE + +// Define this to show a simple animation. Keyboard functions will not work. +//#define MAX7219_LED_DANCE + +// Define this to show all the characters available +//#define MAX7219_LED_FONTTEST + +// Define this to show Clueboard on the sign +//#define MAX7219_LED_CLUEBOARD + +// Define this to show the Konami code on the sign +//#define MAX7219_LED_KONAMI + +// Define this to show QMK on the sign +//#define MAX7219_LED_QMK_POWERED + +// Define this to treat the message board like an etch-a-sketch +//#define DRAWING_TOY_MODE + +// Define this if you don't want any of the above +//#define MAX7219_LED_CUSTOM diff --git a/keyboards/clueboard/2x1800/2021/font.h b/keyboards/clueboard/2x1800/2021/font.h new file mode 100644 index 0000000000..5ddcbfba56 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/font.h @@ -0,0 +1,156 @@ +/* 5x8 Font for Clueboard 2x1800. + * + * Copyright (c) 2021 Zach White <[email protected]> + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * This permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +// Top row of keyboard, when shift held +#define CHR_TILDE      {0b00110000, 0b01000000, 0b00110000, 0b00001000, 0b00110000, 0b00000000} +#define CHR_BANG       {0b00000000, 0b00000000, 0b11111010, 0b10000000, 0b00000000, 0b00000000} +#define CHR_AT         {0b01001100, 0b10010010, 0b10011110, 0b10000010, 0b01111100, 0b00000000} +#define CHR_POUND      {0b00101000, 0b11111110, 0b00101000, 0b11111110, 0b00101000, 0b00000000} +#define CHR_DOLLAR     {0b00100100, 0b01010100, 0b11111110, 0b10101010, 0b01001000, 0b00000000} +#define CHR_PERCENT    {0b11000010, 0b11000100, 0b00010000, 0b00100110, 0b01000110, 0b00000000} +#define CHR_CARET      {0b00100000, 0b01000000, 0b10000000, 0b01000000, 0b00100000, 0b00000000} +#define CHR_AMPERSAND  {0b01101100, 0b10010010, 0b10101010, 0b01000100, 0b00001010, 0b00000000} +#define CHR_ASTERISK   {0b00101000, 0b00010000, 0b01111100, 0b00010000, 0b00101000, 0b00000000} +#define CHR_LPAREN     {0b00000000, 0b00111000, 0b01000100, 0b10000010, 0b00000000, 0b00000000} +#define CHR_RPAREN     {0b00000000, 0b10000010, 0b01000100, 0b00111000, 0b00000000, 0b00000000} +#define CHR_UNDERSCORE {0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000010, 0b00000000} +#define CHR_PLUS       {0b00010000, 0b00010000, 0b01111100, 0b00010000, 0b00010000, 0b00000000} + +// Top row of keyboard, without shift +#define CHR_BACKTICK {0b00000000, 0b11000000, 0b01100000, 0b10000000, 0b00000000, 0b00000000} +#define CHR_1        {0b00100000, 0b01000010, 0b11111110, 0b00000010, 0b00000010, 0b00000000} +#define CHR_2        {0b01000010, 0b10000110, 0b10001010, 0b10010010, 0b01100010, 0b00000000} +#define CHR_3        {0b10000100, 0b10000010, 0b10100010, 0b11010010, 0b10001100, 0b00000000} +#define CHR_4        {0b00011000, 0b00101000, 0b01001000, 0b11111110, 0b00001000, 0b00000000} +#define CHR_5        {0b11100100, 0b10100010, 0b10100010, 0b10100010, 0b10011100, 0b00000000} +#define CHR_6        {0b00111100, 0b01010010, 0b10010010, 0b10010010, 0b00001100, 0b00000000} +#define CHR_7        {0b11000000, 0b10001110, 0b10010000, 0b10100000, 0b11000000, 0b00000000} +#define CHR_8        {0b01101100, 0b10010010, 0b10010010, 0b10010010, 0b01101100, 0b00000000} +#define CHR_9        {0b01100000, 0b10010010, 0b10010010, 0b10010010, 0b01111000, 0b00000000} +#define CHR_0        {0b01111100, 0b10001010, 0b10010010, 0b10100010, 0b01111100, 0b00000000} +#define CHR_DASH     {0b00000000, 0b00010000, 0b00010000, 0b00010000, 0b00000000, 0b00000000} +#define CHR_EQUAL    {0b00000000, 0b00101000, 0b00101000, 0b00101000, 0b00000000, 0b00000000} + +// Letters +#define CHR_A {0b01111110, 0b10001000, 0b10001000, 0b10001000, 0b01111110, 0b00000000} +#define CHR_B {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100, 0b00000000} +#define CHR_C {0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01000100, 0b00000000} +#define CHR_D {0b11111110, 0b10000010, 0b10000010, 0b10000010, 0b01111100, 0b00000000} +#define CHR_E {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b10000010, 0b00000000} +#define CHR_F {0b11111110, 0b10010000, 0b10010000, 0b10010000, 0b10000000, 0b00000000} +#define CHR_G {0b01111100, 0b10000010, 0b10010010, 0b10010010, 0b01011100, 0b00000000} +#define CHR_H {0b11111110, 0b00010000, 0b00010000, 0b00010000, 0b11111110, 0b00000000} +#define CHR_I {0b00000000, 0b10000010, 0b11111110, 0b10000010, 0b00000000, 0b00000000} +#define CHR_J {0b00000100, 0b00000010, 0b10000010, 0b11111100, 0b10000000, 0b00000000} +#define CHR_K {0b11111110, 0b00010000, 0b00101000, 0b01000100, 0b10000010, 0b00000000} +#define CHR_L {0b00000000, 0b11111110, 0b00000010, 0b00000010, 0b00000010, 0b00000000} +#define CHR_M {0b11111110, 0b01000000, 0b00110000, 0b01000000, 0b11111110, 0b00000000} +#define CHR_N {0b11111110, 0b01100000, 0b00010000, 0b00001100, 0b11111110, 0b00000000} +#define CHR_O {0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01111100, 0b00000000} +#define CHR_P {0b11111110, 0b10010000, 0b10010000, 0b10010000, 0b01100000, 0b00000000} +#define CHR_Q {0b01111100, 0b10000010, 0b10001010, 0b10000100, 0b01111010, 0b00000000} +#define CHR_R {0b11111110, 0b10010000, 0b10011000, 0b10010100, 0b01100010, 0b00000000} +#define CHR_S {0b01100100, 0b10010010, 0b10010010, 0b10010010, 0b01001100, 0b00000000} +#define CHR_T {0b10000000, 0b10000000, 0b11111110, 0b10000000, 0b10000000, 0b00000000} +#define CHR_U {0b11111100, 0b00000010, 0b00000010, 0b00000010, 0b11111100, 0b00000000} +#define CHR_V {0b11111000, 0b00000100, 0b00000010, 0b00000100, 0b11111000, 0b00000000} +#define CHR_W {0b11111100, 0b00000010, 0b00011100, 0b00000010, 0b11111110, 0b00000000} +#define CHR_X {0b11000110, 0b00101000, 0b00010000, 0b00101000, 0b11000110, 0b00000000} +#define CHR_Y {0b11100000, 0b00010000, 0b00001110, 0b00010000, 0b11100000, 0b00000000} +#define CHR_Z {0b10000110, 0b10001010, 0b10010010, 0b10100010, 0b11000010, 0b00000000} + +#define CHR_a {0b00000100, 0b00101010, 0b00101010, 0b00101010, 0b00011110, 0b00000000} +#define CHR_b {0b11111110, 0b00010010, 0b00100010, 0b00100010, 0b00011100, 0b00000000} +#define CHR_c {0b00011100, 0b00100010, 0b00100010, 0b00100010, 0b00000100, 0b00000000} +#define CHR_d {0b00011100, 0b00100010, 0b00100010, 0b00010010, 0b11111110, 0b00000000} +#define CHR_e {0b00011100, 0b00101010, 0b00101010, 0b00101010, 0b00011000, 0b00000000} +#define CHR_f {0b00000000, 0b00010000, 0b01111110, 0b10010000, 0b10000000, 0b01000000} +#define CHR_g {0b00011000, 0b00100101, 0b00100101, 0b00100101, 0b00111110, 0b00000000} +#define CHR_h {0b11111110, 0b00010000, 0b00100000, 0b00100000, 0b00011110, 0b00000000} +#define CHR_i {0b00000000, 0b00010010, 0b10111110, 0b00000010, 0b00000000, 0b00000000} +#define CHR_j {0b00000100, 0b00000010, 0b00100010, 0b10111100, 0b00000000, 0b00000000} +#define CHR_k {0b11111110, 0b00001000, 0b00010100, 0b00100010, 0b00000000, 0b00000000} +#define CHR_l {0b00000000, 0b10000010, 0b11111110, 0b00000010, 0b00000000, 0b00000000} +#define CHR_m {0b00111110, 0b00100000, 0b00111110, 0b00100000, 0b00111110, 0b00000000} +#define CHR_n {0b00111110, 0b00010000, 0b00100000, 0b00100000, 0b00011110, 0b00000000} +#define CHR_o {0b00011100, 0b00100010, 0b00100010, 0b00100010, 0b00011100, 0b00000000} +#define CHR_p {0b00111111, 0b00100100, 0b00100100, 0b00100100, 0b00011000, 0b00000000} +#define CHR_q {0b00011000, 0b00100100, 0b00100100, 0b00011000, 0b00111111, 0b00000000} +#define CHR_r {0b00111110, 0b00010000, 0b00100000, 0b00100000, 0b00010000, 0b00000000} +#define CHR_s {0b00010010, 0b00101010, 0b00101010, 0b00101010, 0b00000100, 0b00000000} +#define CHR_t {0b00100000, 0b11111100, 0b00100010, 0b00000010, 0b00000100, 0b00000000} +#define CHR_u {0b00111100, 0b00000010, 0b00000010, 0b00000100, 0b00111110, 0b00000000} +#define CHR_v {0b00111000, 0b00000100, 0b00000010, 0b00000100, 0b00111000, 0b00000000} +#define CHR_w {0b00111100, 0b00000010, 0b00111100, 0b00000010, 0b00111100, 0b00000000} +#define CHR_x {0b00100010, 0b00010100, 0b00001000, 0b00010100, 0b00100010, 0b00000000} +#define CHR_y {0b00111000, 0b00000101, 0b00000101, 0b00000101, 0b00111110, 0b00000000} +#define CHR_z {0b00100010, 0b00100110, 0b00101010, 0b00110010, 0b00100010, 0b00000000} + +// Punctuation +#define CHR_LCURLY       {0b00000000, 0b00010000, 0b01101100, 0b10000010, 0b00000000, 0b00000000} +#define CHR_RCURLY       {0b00000000, 0b10000010, 0b01101100, 0b00010000, 0b00000000, 0b00000000} +#define CHR_PIPE         {0b00000000, 0b00000000, 0b11101110, 0b00000000, 0b00000000, 0b00000000} +#define CHR_COLON        {0b00000000, 0b00000000, 0b01101100, 0b01101100, 0b00000000, 0b00000000} +#define CHR_QUOTE        {0b00000000, 0b01110000, 0b00000000, 0b01110000, 0b00000000, 0b00000000} +#define CHR_LESSTHAN     {0b00010000, 0b00101000, 0b01000100, 0b10000010, 0b00000000, 0b00000000} +#define CHR_GREATERTHAN  {0b10000010, 0b01000100, 0b00101000, 0b00010000, 0b00000000, 0b00000000} +#define CHR_QUESTIONMARK {0b01000000, 0b10000000, 0b10001010, 0b10010000, 0b01100000, 0b00000000} +#define CHR_INTERROBANG  {0b01100000, 0b10000000, 0b11101010, 0b10010000, 0b01100000, 0b00000000} +#define CHR_LBRACKET     {0b00000000, 0b11111110, 0b10000010, 0b10000010, 0b00000000, 0b00000000} +#define CHR_RBRACKET     {0b00000000, 0b10000010, 0b10000010, 0b11111110, 0b00000000, 0b00000000} +#define CHR_BACKSLASH    {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000000} +#define CHR_SEMICOLON    {0b00000000, 0b00000000, 0b01101010, 0b01101100, 0b00000000, 0b00000000} +#define CHR_APOSTROPHE   {0b00000000, 0b00000000, 0b01110000, 0b00000000, 0b00000000, 0b00000000} +#define CHR_COMMA        {0b00000000, 0b00000000, 0b00001010, 0b00001100, 0b00000000, 0b00000000} +#define CHR_PERIOD       {0b00000000, 0b00000000, 0b00000110, 0b00000110, 0b00000000, 0b00000000} +#define CHR_SLASH        {0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b00000000} +#define CHR_SPACE        {0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000} +#define CHR_DEGREES      {0b11000000, 0b11000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000} + +// Graphics +#define CHR_CENT         {0b00111000, 0b01000100, 0b11111110, 0b01000100, 0b00101000, 0b00000000} +#define CHR_DEGREES_C    {0b11000000, 0b11001100, 0b00010010, 0b00010010, 0b00000000, 0b00000000} +#define CHR_DEGREES_F    {0b11000000, 0b11011110, 0b00010100, 0b00010000, 0b00000000, 0b00000000} +#define CHR_DIVISION     {0b00010000, 0b00010000, 0b01010100, 0b00010000, 0b00010000, 0b00000000} +#define CHR_LEFT_ARROW   {0b00010000, 0b00111000, 0b01010100, 0b00010000, 0b00010000, 0b00000000} +#define CHR_RIGHT_ARROW  {0b00010000, 0b00010000, 0b01010100, 0b00111000, 0b00010000, 0b00000000} +#define CHR_UP_ARROW     {0b00010000, 0b00100000, 0b01111110, 0b00100000, 0b00010000, 0b00000000} +#define CHR_DOWN_ARROW   {0b00001000, 0b00000100, 0b01111110, 0b00000100, 0b00001000, 0b00000000} +#define CHR_PI           {0b00100010, 0b00111100, 0b00100000, 0b00111110, 0b00100010, 0b00000000} +#define CHR_PSI          {0b01111000, 0b00001000, 0b01111110, 0b00001000, 0b01111000, 0b00000000} + +// Predefined messages +#define MSG_FONTTEST {CHR_TILDE, CHR_BANG, CHR_AT, CHR_POUND, CHR_PERCENT, CHR_CARET, CHR_AMPERSAND, CHR_LPAREN, CHR_RPAREN, CHR_UNDERSCORE, CHR_PLUS, CHR_BACKTICK, CHR_1, CHR_2, CHR_3, CHR_4, CHR_5, CHR_6, CHR_7, CHR_8, CHR_9, CHR_0, CHR_DASH, CHR_EQUAL, CHR_A, CHR_B, CHR_C, CHR_D, CHR_E, CHR_F, CHR_G, CHR_H, CHR_I, CHR_J, CHR_K, CHR_L, CHR_M, CHR_N, CHR_O, CHR_P, CHR_Q, CHR_R, CHR_S, CHR_T, CHR_U, CHR_V, CHR_W, CHR_X, CHR_Y, CHR_Z, CHR_a, CHR_b, CHR_c, CHR_d, CHR_e, CHR_f, CHR_g, CHR_h, CHR_i, CHR_j, CHR_k, CHR_l, CHR_m, CHR_n, CHR_o, CHR_p, CHR_q, CHR_r, CHR_s, CHR_t, CHR_u, CHR_v, CHR_w, CHR_x, CHR_y, CHR_z, CHR_LCURLY, CHR_RCURLY, CHR_PIPE, CHR_COLON, CHR_QUOTE, CHR_LESSTHAN, CHR_GREATERTHAN, CHR_QUESTIONMARK, CHR_INTERROBANG, CHR_LBRACKET, CHR_RBRACKET, CHR_BACKSLASH, CHR_SEMICOLON, CHR_APOSTROPHE, CHR_COMMA, CHR_PERIOD, CHR_SLASH, CHR_CENT, CHR_DEGREES, CHR_DEGREES_C, CHR_DEGREES_F, CHR_DIVISION, CHR_LEFT_ARROW, CHR_RIGHT_ARROW, CHR_UP_ARROW, CHR_DOWN_ARROW, CHR_PI, CHR_PSI} +#define MSG_FONTTEST_LEN 104 + +#define MSG_CLUEBOARD {CHR_INTERROBANG, CHR_C, CHR_l, CHR_u, CHR_e, CHR_b, CHR_o, CHR_a, CHR_r, CHR_d} +#define MSG_CLUEBOARD_LEN 10 + +#define MSG_KONAMI {CHR_UP_ARROW, CHR_SPACE, CHR_UP_ARROW, CHR_SPACE, CHR_DOWN_ARROW, CHR_SPACE, CHR_DOWN_ARROW, CHR_SPACE, CHR_LEFT_ARROW, CHR_SPACE, CHR_RIGHT_ARROW, CHR_SPACE, CHR_LEFT_ARROW, CHR_SPACE, CHR_RIGHT_ARROW, CHR_SPACE, CHR_B, CHR_SPACE, CHR_A, CHR_SPACE, CHR_LESSTHAN, CHR_S, CHR_E, CHR_L, CHR_E, CHR_C, CHR_T, CHR_GREATERTHAN, CHR_SPACE, CHR_LESSTHAN, CHR_S, CHR_T, CHR_A, CHR_R, CHR_T, CHR_GREATERTHAN} +#define MSG_KONAMI_LEN 36 + +#define MSG_QMK_POWERED {CHR_PSI, CHR_P, CHR_o, CHR_w, CHR_e, CHR_r, CHR_e, CHR_d, CHR_SPACE, CHR_b, CHR_y, CHR_SPACE, CHR_Q, CHR_M, CHR_K} +#define MSG_QMK_POWERED_LEN 15 diff --git a/keyboards/clueboard/2x1800/2021/info.json b/keyboards/clueboard/2x1800/2021/info.json new file mode 100644 index 0000000000..460be68cb6 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/info.json @@ -0,0 +1,425 @@ +{ +    "manufacturer": "Clueboard", +    "keyboard_name": "Clueboard 2x1800 2021", +    "maintainer": "skullydazed", +    "height": 6.5, +    "width": 24, +    "bootloader": "halfkay", +    "debounce": 5, +    "diode_direction": "ROW2COL", +    "features": { +        "audio": true, +        "bootmagic": false, +        "console": true, +        "encoder": true, +        "extrakey": true, +        "mousekey": true, +        "nkro": true +    }, +    "indicators": { +        "caps_lock": "B5", +        "num_lock": "B4", +        "scroll_lock": "B6" +    }, +    "matrix_pins": { +        "cols": ["D2", "D3", "D4", "D5", "D7", "E0", "E1", "F0", "E6", "A0", "E7"], +        "rows": ["C0", "C1", "C2", "C3", "C7", "F7", "F1", "F2", "F3", "F4", "F5", "F6"] +    }, +    "processor": "at90usb1286", +    "usb": { +        "pid": "0x23A0" +    }, +    "layout_aliases": { +        "KEYMAP": "LAYOUT_all", +        "LAYOUT": "LAYOUT_all" +    }, +    "layouts": { +        "LAYOUT_4u_space": { +            "key_count": 124, +            "layout": [ +                { "matrix": [0, 0], "w": 1, "x": 0, "y": 0 }, +                { "matrix": [0, 1], "w": 1, "x": 1, "y": 0 }, +                { "matrix": [0, 2], "w": 1, "x": 2, "y": 0 }, +                { "matrix": [0, 3], "w": 1, "x": 3, "y": 0 }, +                { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 }, +                { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 }, +                { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 }, +                { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 }, +                { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 }, +                { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 }, +                { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 }, +                { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 }, +                { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 }, +                { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 }, +                { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 }, +                { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 }, +                { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 }, +                { "matrix": [6, 7], "w": 1, "x": 20, "y": 0 }, +                { "matrix": [6, 8], "w": 1, "x": 21, "y": 0 }, +                { "matrix": [6, 9], "w": 1, "x": 22, "y": 0 }, +                { "matrix": [6, 10], "w": 1, "x": 23, "y": 0 }, +                { "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 }, +                { "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 }, +                { "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 }, +                { "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 }, +                { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 }, +                { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 }, +                { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 }, +                { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 }, +                { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 }, +                { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 }, +                { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 }, +                { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 }, +                { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 }, +                { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 }, +                { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 }, +                { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 }, +                { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 }, +                { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 }, +                { "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 }, +                { "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 }, +                { "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 }, +                { "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 }, +                { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 }, +                { "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 }, +                { "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 }, +                { "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 }, +                { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 }, +                { "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 }, +                { "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 }, +                { "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 }, +                { "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 }, +                { "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 }, +                { "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 }, +                { "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 }, +                { "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 }, +                { "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 }, +                { "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 }, +                { "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 }, +                { "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 }, +                { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 }, +                { "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 }, +                { "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 }, +                { "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 }, +                { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 }, +                { "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 }, +                { "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 }, +                { "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 }, +                { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 }, +                { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 }, +                { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 }, +                { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 }, +                { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 }, +                { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 }, +                { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 }, +                { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 }, +                { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 }, +                { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 }, +                { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 }, +                { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 }, +                { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 }, +                { "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 }, +                { "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 }, +                { "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 }, +                { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 }, +                { "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 }, +                { "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 }, +                { "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 }, +                { "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 }, +                { "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 }, +                { "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 }, +                { "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 }, +                { "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 }, +                { "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 }, +                { "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 }, +                { "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 }, +                { "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 }, +                { "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 }, +                { "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 }, +                { "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 }, +                { "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 }, +                { "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 }, +                { "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 }, +                { "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 }, +                { "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 }, +                { "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 }, +                { "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 }, +                { "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 }, +                { "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 }, +                { "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 }, +                { "matrix": [5, 5], "w": 1, "x": 8.5, "y": 5.25 }, +                { "matrix": [5, 6], "w": 4, "x": 9.5, "y": 5.25 }, +                { "matrix": [5, 7], "w": 1, "x": 13.5, "y": 5.25 }, +                { "matrix": [5, 8], "w": 1, "x": 14.5, "y": 5.25 }, +                { "matrix": [11, 0], "w": 1, "x": 15.5, "y": 5.25 }, +                { "matrix": [11, 2], "w": 1, "x": 16.5, "y": 5.25 }, +                { "matrix": [11, 3], "w": 1, "x": 21, "y": 5.25 }, +                { "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 }, +                { "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 }, +                { "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 }, +                { "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 }, +                { "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 }, +                { "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 }, +                { "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 } +            ] +        }, +        "LAYOUT_7u_space": { +            "key_count": 121, +            "layout": [ +                { "matrix": [0, 0], "w": 1, "x": 0, "y": 0 }, +                { "matrix": [0, 1], "w": 1, "x": 1, "y": 0 }, +                { "matrix": [0, 2], "w": 1, "x": 2, "y": 0 }, +                { "matrix": [0, 3], "w": 1, "x": 3, "y": 0 }, +                { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 }, +                { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 }, +                { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 }, +                { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 }, +                { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 }, +                { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 }, +                { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 }, +                { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 }, +                { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 }, +                { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 }, +                { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 }, +                { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 }, +                { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 }, +                { "matrix": [6, 7], "w": 1, "x": 20, "y": 0 }, +                { "matrix": [6, 8], "w": 1, "x": 21, "y": 0 }, +                { "matrix": [6, 9], "w": 1, "x": 22, "y": 0 }, +                { "matrix": [6, 10], "w": 1, "x": 23, "y": 0 }, +                { "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 }, +                { "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 }, +                { "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 }, +                { "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 }, +                { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 }, +                { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 }, +                { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 }, +                { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 }, +                { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 }, +                { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 }, +                { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 }, +                { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 }, +                { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 }, +                { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 }, +                { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 }, +                { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 }, +                { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 }, +                { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 }, +                { "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 }, +                { "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 }, +                { "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 }, +                { "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 }, +                { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 }, +                { "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 }, +                { "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 }, +                { "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 }, +                { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 }, +                { "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 }, +                { "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 }, +                { "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 }, +                { "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 }, +                { "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 }, +                { "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 }, +                { "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 }, +                { "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 }, +                { "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 }, +                { "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 }, +                { "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 }, +                { "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 }, +                { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 }, +                { "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 }, +                { "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 }, +                { "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 }, +                { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 }, +                { "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 }, +                { "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 }, +                { "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 }, +                { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 }, +                { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 }, +                { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 }, +                { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 }, +                { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 }, +                { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 }, +                { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 }, +                { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 }, +                { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 }, +                { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 }, +                { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 }, +                { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 }, +                { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 }, +                { "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 }, +                { "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 }, +                { "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 }, +                { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 }, +                { "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 }, +                { "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 }, +                { "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 }, +                { "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 }, +                { "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 }, +                { "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 }, +                { "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 }, +                { "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 }, +                { "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 }, +                { "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 }, +                { "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 }, +                { "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 }, +                { "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 }, +                { "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 }, +                { "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 }, +                { "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 }, +                { "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 }, +                { "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 }, +                { "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 }, +                { "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 }, +                { "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 }, +                { "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 }, +                { "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 }, +                { "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 }, +                { "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 }, +                { "matrix": [5, 5], "w": 7, "x": 8.5, "y": 5.25 }, +                { "matrix": [5, 6], "w": 1, "x": 15.5, "y": 5.25 }, +                { "matrix": [5, 7], "w": 1, "x": 16.5, "y": 5.25 }, +                { "matrix": [11, 0], "w": 1, "x": 21, "y": 5.25 }, +                { "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 }, +                { "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 }, +                { "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 }, +                { "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 }, +                { "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 }, +                { "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 }, +                { "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 } +            ] +        }, +        "LAYOUT_all": { +            "key_count": 127, +            "layout": [ +                { "label": "Home", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 }, +                { "label": "End", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 }, +                { "label": "PgUp", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 }, +                { "label": "PgDn", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 }, +                { "label": "Esc", "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 }, +                { "label": "F1", "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 }, +                { "label": "F2", "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 }, +                { "label": "F3", "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 }, +                { "label": "F4", "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 }, +                { "label": "F5", "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 }, +                { "label": "F6", "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 }, +                { "label": "F7", "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 }, +                { "label": "F8", "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 }, +                { "label": "F9", "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 }, +                { "label": "F10", "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 }, +                { "label": "F11", "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 }, +                { "label": "F12", "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 }, +                { "label": "PrtSc", "matrix": [6, 7], "w": 1, "x": 20, "y": 0 }, +                { "label": "Scroll Lock", "matrix": [6, 8], "w": 1, "x": 21, "y": 0 }, +                { "label": "Pause", "matrix": [6, 9], "w": 1, "x": 22, "y": 0 }, +                { "label": "Insert", "matrix": [6, 10], "w": 1, "x": 23, "y": 0 }, +                { "label": "-", "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 }, +                { "label": "Num Lock", "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 }, +                { "label": "/", "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 }, +                { "label": "*", "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 }, +                { "label": "~", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 }, +                { "label": "!", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 }, +                { "label": "@", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 }, +                { "label": "#", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 }, +                { "label": "$", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 }, +                { "label": "%", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 }, +                { "label": "^", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 }, +                { "label": "&", "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 }, +                { "label": "*", "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 }, +                { "label": "(", "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 }, +                { "label": ")", "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 }, +                { "label": "_", "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 }, +                { "label": "+", "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 }, +                { "label": "Backspace", "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 }, +                { "label": "Num Lock", "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 }, +                { "label": "/", "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 }, +                { "label": "*", "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 }, +                { "label": "-", "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 }, +                { "h": 2, "label": "+", "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 }, +                { "label": "7", "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 }, +                { "label": "8", "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 }, +                { "label": "9", "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 }, +                { "label": "Tab", "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 }, +                { "label": "Q", "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 }, +                { "label": "W", "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 }, +                { "label": "E", "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 }, +                { "label": "R", "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 }, +                { "label": "T", "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 }, +                { "label": "Y", "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 }, +                { "label": "U", "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 }, +                { "label": "I", "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 }, +                { "label": "O", "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 }, +                { "label": "P", "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 }, +                { "label": "{", "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 }, +                { "label": "}", "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 }, +                { "label": "|", "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 }, +                { "label": "7", "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 }, +                { "label": "8", "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 }, +                { "label": "9", "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 }, +                { "h": 2, "label": "+", "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 }, +                { "label": "4", "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 }, +                { "label": "5", "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 }, +                { "label": "6", "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 }, +                { "label": "Caps Lock", "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 }, +                { "label": "A", "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 }, +                { "label": "S", "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 }, +                { "label": "D", "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 }, +                { "label": "F", "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 }, +                { "label": "G", "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 }, +                { "label": "H", "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 }, +                { "label": "J", "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 }, +                { "label": "K", "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 }, +                { "label": "L", "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 }, +                { "label": ":", "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 }, +                { "label": "\"", "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 }, +                { "label": "Enter", "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 }, +                { "label": "4", "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 }, +                { "label": "5", "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 }, +                { "label": "6", "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 }, +                { "h": 2, "label": "Enter", "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 }, +                { "label": "1", "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 }, +                { "label": "2", "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 }, +                { "label": "3", "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 }, +                { "label": "\\u2191", "matrix": [4, 4], "w": 1, "x": 4.25, "y": 4.5 }, +                { "label": "Shift", "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 4.25 }, +                { "label": "Z", "matrix": [4, 6], "w": 1, "x": 6.75, "y": 4.25 }, +                { "label": "X", "matrix": [4, 7], "w": 1, "x": 7.75, "y": 4.25 }, +                { "label": "C", "matrix": [4, 8], "w": 1, "x": 8.75, "y": 4.25 }, +                { "label": "V", "matrix": [4, 9], "w": 1, "x": 9.75, "y": 4.25 }, +                { "label": "B", "matrix": [4, 10], "w": 1, "x": 10.75, "y": 4.25 }, +                { "label": "N", "matrix": [10, 0], "w": 1, "x": 11.75, "y": 4.25 }, +                { "label": "M", "matrix": [10, 1], "w": 1, "x": 12.75, "y": 4.25 }, +                { "label": "<", "matrix": [10, 2], "w": 1, "x": 13.75, "y": 4.25 }, +                { "label": ">", "matrix": [10, 3], "w": 1, "x": 14.75, "y": 4.25 }, +                { "label": "?", "matrix": [10, 4], "w": 1, "x": 15.75, "y": 4.25 }, +                { "label": "Shift", "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 4.25 }, +                { "label": "\\u2191", "matrix": [9, 6], "w": 1, "x": 18.75, "y": 4.5 }, +                { "label": "1", "matrix": [10, 7], "w": 1, "x": 20, "y": 4.25 }, +                { "label": "2", "matrix": [10, 8], "w": 1, "x": 21, "y": 4.25 }, +                { "label": "3", "matrix": [10, 9], "w": 1, "x": 22, "y": 4.25 }, +                { "h": 2, "label": "Enter", "matrix": [10, 10], "w": 1, "x": 23, "y": 4.25 }, +                { "label": "0", "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 }, +                { "label": ".", "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 }, +                { "label": "\\u2190", "matrix": [5, 3], "w": 1, "x": 3.25, "y": 5.5 }, +                { "label": "\\u2193", "matrix": [5, 4], "w": 1, "x": 4.25, "y": 5.5 }, +                { "label": "\\u2192", "matrix": [5, 5], "w": 1, "x": 5.25, "y": 5.5 }, +                { "label": "Ctrl", "matrix": [5, 6], "w": 1, "x": 6.5, "y": 5.25 }, +                { "label": "Win", "matrix": [5, 7], "w": 1, "x": 7.5, "y": 5.25 }, +                { "label": "Alt", "matrix": [5, 8], "w": 1, "x": 8.5, "y": 5.25 }, +                { "label": "1u", "matrix": [5, 9], "w": 1, "x": 9.5, "y": 5.25 }, +                { "label": "1u", "matrix": [5, 10], "w": 1, "x": 10.5, "y": 5.25 }, +                { "label": "1u", "matrix": [11, 0], "w": 1, "x": 11.5, "y": 5.25 }, +                { "label": "1u", "matrix": [11, 1], "w": 1, "x": 12.5, "y": 5.25 }, +                { "label": "Alt", "matrix": [11, 2], "w": 1, "x": 13.5, "y": 5.25 }, +                { "label": "Win", "matrix": [11, 3], "w": 1, "x": 14.5, "y": 5.25 }, +                { "label": "Menu", "matrix": [11, 4], "w": 1, "x": 15.5, "y": 5.25 }, +                { "label": "Ctrl", "matrix": [11, 5], "w": 1, "x": 16.5, "y": 5.25 }, +                { "label": "\\u2190", "matrix": [10, 6], "w": 1, "x": 17.75, "y": 5.5 }, +                { "label": "\\u2193", "matrix": [11, 6], "w": 1, "x": 18.75, "y": 5.5 }, +                { "label": "\\u2192", "matrix": [11, 7], "w": 1, "x": 19.75, "y": 5.5 }, +                { "label": "0", "matrix": [11, 8], "w": 1, "x": 21, "y": 5.25 }, +                { "label": ".", "matrix": [11, 9], "w": 1, "x": 22, "y": 5.25 } +            ] +        } +    } +} diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json b/keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json new file mode 100644 index 0000000000..7122f42d4f --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/default/keymap.json @@ -0,0 +1,18 @@ +{ +    "version": 1, +    "author": "skullydazed", +    "notes": "", +    "keyboard": "clueboard/2x1800/2018", +    "keymap": "default", +    "layout": "LAYOUT_all", +    "layers": [ +                [ +                        "KC_HOME", "KC_END", "KC_PGUP", "KC_PGDN", "KC_ESC", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "KC_PSCR", "KC_SLCK", "KC_PAUS", "KC_INS", +                        "KC_PMNS", "KC_NLCK", "KC_PSLS", "KC_PAST", "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_MINS", "KC_EQL", "KC_BSPC", "KC_NLCK", "KC_PSLS", "KC_PAST", "KC_PMNS", +                        "KC_PPLS", "KC_P7", "KC_P8", "KC_P9", "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_P7", "KC_P8", "KC_P9", "KC_PPLS", +                        "KC_P4", "KC_P5", "KC_P6", "KC_CAPS", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_QUOT", "KC_ENT", "KC_P4", "KC_P5", "KC_P6", +                        "KC_PENT", "KC_P1", "KC_P2", "KC_P3", "KC_UP", "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_RSFT", "KC_UP", "KC_P1", "KC_P2", "KC_P3", "KC_PENT", +                        "KC_P0", "KC_PDOT", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_SPC", "KC_SPC", "KC_SPC", "KC_RALT", "KC_RGUI", "KC_APP", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_P0", "KC_PDOT" +                ] +    ] +} diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c new file mode 100644 index 0000000000..14d76a59fc --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/keymap.c @@ -0,0 +1,28 @@ +/* Copyright 2017 Zach White <[email protected]> + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_4u_space( +      KC_HOME, KC_END,  KC_PGUP, KC_PGDN,       KC_ESC,    KC_F1,   KC_F2,   KC_F3,   KC_F4,     KC_F5,   KC_F6,   KC_F7,   KC_F8,     KC_F9,   KC_F10,   KC_F11,  KC_F12,        KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,  \ +                                                                                                                                                                                                                      \ +      KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST,      KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,   KC_BSPC,     KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ +      KC_PPLS, KC_P7,   KC_P8,   KC_P9,        KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, KC_LBRC, KC_RBRC, KC_BSLS,       KC_P7, KC_P8, KC_P9, KC_PPLS,       \ +               KC_P4,   KC_P5,   KC_P6,        KC_CAPS,     KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,    KC_QUOT, KC_ENT,         KC_P4, KC_P5, KC_P6,                \ +      KC_PENT, KC_P1,   KC_P2,   KC_P3,     KC_UP,  KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M, KC_COMM, KC_DOT, KC_SLSH,   KC_RSFT,      KC_UP,      KC_P1, KC_P2, KC_P3, KC_PENT,       \ +               KC_P0,   KC_PDOT,  KC_LEFT, KC_DOWN, KC_RGHT,  KC_LCTL, KC_LGUI, KC_LALT,                 KC_SPC,         KC_RALT, KC_RGUI, KC_APP, KC_RCTL,  KC_LEFT, KC_DOWN, KC_RGHT,  KC_P0, KC_PDOT               \ +) +}; diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md new file mode 100644 index 0000000000..a696972e8c --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/default_4u/readme.md @@ -0,0 +1 @@ +# The default keymap for 2x1800 with 4u Spacebar diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c new file mode 100644 index 0000000000..3717bd5408 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/keymap.c @@ -0,0 +1,49 @@ +/* Copyright 2017 Zach White <[email protected]> + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_7u_space( +      KC_HOME, KC_END,  KC_PGUP, KC_PGDN,       KC_ESC,    KC_F1,   KC_F2,   KC_F3,   KC_F4,     KC_F5,   KC_F6,   KC_F7,   KC_F8,     KC_F9,   KC_F10,   KC_F11,  KC_F12,        KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL,  \ +                                                                                                                                                                                                                      \ +      KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST,      KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,   KC_BSPC,     KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ +      KC_PPLS, KC_P7,   KC_P8,   KC_P9,        KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, KC_LBRC, KC_RBRC, KC_BSLS,       KC_P7, KC_P8, KC_P9, KC_PPLS,       \ +               KC_P4,   KC_P5,   KC_P6,        KC_CAPS,     KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,    KC_QUOT, KC_ENT,         KC_P4, KC_P5, KC_P6,                \ +      KC_PENT, KC_P1,   KC_P2,   KC_P3,     KC_UP,  KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M, KC_COMM, KC_DOT, KC_SLSH,    KC_RSFT,     KC_UP,      KC_P1, KC_P2, KC_P3, KC_PENT,       \ +               KC_P0,   KC_PDOT,  KC_LEFT, KC_DOWN, KC_RGHT,  KC_LCTL, KC_LALT,                  KC_SPC,                                  KC_LGUI, KC_APP,   KC_LEFT, KC_DOWN, KC_RGHT,  KC_P0, KC_PDOT               \ +) +}; + + +#ifdef AUDIO_ENABLE +  float song_one_up[][2] = SONG(ONE_UP_SOUND); +#endif + +volatile uint8_t runonce = true; +static uint16_t my_timer; + +void matrix_init_user(void) { +  my_timer = timer_read(); +} + +void matrix_scan_user(void) { +  if (runonce && timer_elapsed(my_timer) > 500) { +    runonce = false; +#ifdef AUDIO_ENABLE +    PLAY_SONG(song_one_up); +#endif +  } +} diff --git a/keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md new file mode 100644 index 0000000000..f5718e842d --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/default_7u/readme.md @@ -0,0 +1 @@ +# The default keymap for 2x1800 with 7u spacebar diff --git a/keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h b/keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h new file mode 100644 index 0000000000..81995d66f3 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/signboard/config.h @@ -0,0 +1,20 @@ +/* Copyright 2017 Zach White <[email protected]> + * + * 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/>. + */ + +#pragma once +#define MAX7219_LED_FONTTEST + +// place overrides here diff --git a/keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c b/keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c new file mode 100644 index 0000000000..3559455b66 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/signboard/keymap.c @@ -0,0 +1,50 @@ +#include QMK_KEYBOARD_H +#include "font.h" +#include "max7219.h" + +enum custom_keycodes { +    MSG_CB =  SAFE_RANGE, +    MSG_CS, +    MSG_KMI, +    MSG_QMK, +}; + +uint8_t custom_message[5][6] = {CHR_M, CHR_y, CHR_SPACE, CHR_2, CHR_CENT}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +	[0] = LAYOUT_all( +        MSG_CB,  MSG_QMK, MSG_KMI, MSG_CS,    KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,   KC_F10,  KC_F11,  KC_F12,                    KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, +        KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST,   KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,   KC_6,   KC_7,   KC_8,   KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, +        KC_PPLS, KC_P7,   KC_P8,   KC_P9,     KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,          KC_P7,   KC_P8,   KC_P9, KC_PPLS, +                 KC_P4,   KC_P5,   KC_P6,     KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,   KC_H,   KC_J,   KC_K,   KC_L,    KC_SCLN, KC_QUOT,       KC_ENT,              KC_P4,   KC_P5,   KC_P6, +        KC_PENT, KC_P1,   KC_P2,   KC_P3,     KC_UP,   KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM, KC_DOT,  KC_SLSH,       KC_RSFT,    KC_UP,   KC_P1, KC_P2, KC_P3, KC_PENT, +                 KC_P0,   KC_PDOT,   KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT +    ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +    if (record->event.pressed) { +        switch (keycode) { +            case MSG_CB: +                max7219_led_scrolling=true; +                uint8_t cb_msg[MSG_CLUEBOARD_LEN][6] = MSG_CLUEBOARD; +                max7219_message_sign(cb_msg, MSG_CLUEBOARD_LEN); +                return true; +            case MSG_CS: +                max7219_led_scrolling=false; +                max7219_message_sign(custom_message, 5); +                return true; +            case MSG_KMI: +                max7219_led_scrolling=true; +                uint8_t kmi_msg[MSG_KONAMI_LEN][6] = MSG_KONAMI; +                max7219_message_sign(kmi_msg, MSG_KONAMI_LEN); +                return true; +            case MSG_QMK: +                max7219_led_scrolling=true; +                uint8_t qmk_msg[MSG_QMK_POWERED_LEN][6] = MSG_QMK_POWERED; +                max7219_message_sign(qmk_msg, MSG_QMK_POWERED_LEN); +                return true; +        } +    } +    return true; +}; diff --git a/keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md b/keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md new file mode 100644 index 0000000000..4e3457efce --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/keymaps/signboard/readme.md @@ -0,0 +1 @@ +# The default keymap for 2x1800 diff --git a/keyboards/clueboard/2x1800/2021/max7219.c b/keyboards/clueboard/2x1800/2021/max7219.c new file mode 100644 index 0000000000..1ba22362fe --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/max7219.c @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2021 Zach White <[email protected]> + * Copyright (c) 2007 Eberhard Fahle + * + *    max7219.c - A library for controling Leds with a MAX7219/MAX7221 + * + *    Permission is hereby granted, free of charge, to any person + *    obtaining a copy of this software and associated documentation + *    files (the "Software"), to deal in the Software without + *    restriction, including without limitation the rights to use, + *    copy, modify, merge, publish, distribute, sublicense, and/or sell + *    copies of the Software, and to permit persons to whom the + *    Software is furnished to do so, subject to the following + *    conditions: + * + *    This permission notice shall be included in all copies or + *    substantial portions of the Software. + * + *    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + *    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + *    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + *    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + *    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + *    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + *    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + *    OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * This driver started as a port of Arduino's LedControl to QMK. The + * original Arduino code can be found here: + * + * https://github.com/wayoda/LedControl + * + * Unlike LedControl we are using the native SPI support, you will need to + * use the native SPI pins for your MCU. You can set the CS pin with + * `#define MAX7219_LOAD <pin>`. + * + * This has only been tested on AVR, specifically a Teensy 2.0++. + */ + +#include "max7219.h" +#include "font.h" + +// Datastructures +bool max7219_led_scrolling = true; +uint16_t max7219_buffer_end = 0; +uint8_t max7219_spidata[MAX_BYTES]; +uint8_t max7219_led_a[8][MAX7219_BUFFER_SIZE]; + +/* Write max7219_spidata to all the max7219's + */ +void max7219_write_all(void) { +    dprintf("max7219_write_all()\n"); +    if (spi_start(MAX7219_LOAD, false, 0, 8)) { +        for(int i = MAX_BYTES; i>0; i--) { +            dprintf("spi_write(%d)\n", max7219_spidata[i-1]); +            spi_write(max7219_spidata[i-1]); +        } +        spi_stop(); +    } else { +        xprintf("Could not spi_start!\n"); +    } +} + +/* Write the current frame in max7219_led_a to all the max7219's + */ +void max7219_write_frame(void) { +    dprintf("max7219_write_frame()\n"); + +    // Set our opcode and data +    for (int col=0; col<8; col++) { +        for (int device_num=0; device_num<MAX7219_CONTROLLERS; device_num++) { +            int offset=device_num*2; +            max7219_spidata[offset] = max7219_led_a[col][device_num]; +            max7219_spidata[offset+1] = col+1; +        } +        max7219_write_all(); +    } +} + +/* Stores a message in the sign buffer. + * + * message should be a 2d array with the outer array having a length of your + * message and the inner array having a length of 6. Use the CHR_<letter> + * macros from font.h to populate your array. + * + * Example: + * + *      uint8_t message[10][6] = {CHR_INTERROBANG, CHR_C, CHR_l, CHR_u, CHR_e, CHR_b, CHR_o, CHR_a, CHR_r, CHR_d}; + *      max7219_message(message, 10); + */ +void max7219_message_sign(uint8_t message[][6], size_t message_len) { +    uint8_t letter_num = 0; +    uint8_t letter_col = 0; +    max7219_buffer_end = message_len * 6 + 32; + +    for (int device_num=0; device_num<MAX7219_BUFFER_SIZE; device_num++) { +        for (int col=0; col<8; col++) { +            if (letter_num >= message_len) { +                max7219_led_a[col][device_num] = 0b00000000; +            } else { +                max7219_led_a[col][device_num] = message[letter_num][letter_col]; +                if (letter_col == 5) { +                    letter_num++; +                    letter_col = 0; +                } else { +                    letter_col++; +                } +            } +        } +    } + +    max7219_write_frame(); +} + +/* Scroll the content on the sign left by 1 column. + * + * When loop_message is true columns that slide off the left will be added + * to the right to be displayed again. + */ +void max7219_message_sign_task(bool loop_message) { +    uint8_t left_col = 0b00000000; + +    if (!max7219_led_scrolling) { +        return; +    } + +    if (loop_message) { +        left_col = max7219_led_a[0][0]; +    } + +    int i=0; + +    for (int device_num=0; device_num<MAX7219_BUFFER_SIZE; device_num++) { +        for (int col=0; col<8; col++) { +            i++; + +            if (i == max7219_buffer_end) { +                max7219_led_a[col][device_num] = left_col; +                device_num=MAX7219_BUFFER_SIZE; +                break; +            } else if (col < 7) { +                max7219_led_a[col][device_num] = max7219_led_a[col+1][device_num]; +            } else if (device_num == MAX7219_BUFFER_SIZE-1) { +                max7219_led_a[col][device_num] = left_col; +            } else { +                max7219_led_a[col][device_num] = max7219_led_a[0][device_num+1]; +            } +        } +    } +    max7219_write_frame(); +} + +/* Write data to a single max7219 + */ +void max7219_write(int device_num, volatile uint8_t opcode, volatile uint8_t data) { +    dprintf("max7219_write(%d, %d, %d)\n", device_num, opcode, data); + +    // Clear the data array +    for(int i = MAX_BYTES; i>0; i--) { +        max7219_spidata[i-1]=0; +    } + +    // Set our opcode and data +    uint8_t offset = device_num*2; +    max7219_spidata[offset] = data; +    max7219_spidata[offset+1] = opcode; + +    // Write the data +    max7219_write_all(); +} + +/* Turn off all the LEDs + */ +void max7219_clear_display(void) { +    dprintf("max7219_clear_display();\n"); + +    for (int col=0; col<8; col++) { +        for (int device_num=0; device_num<MAX7219_BUFFER_SIZE; device_num++) { +            max7219_led_a[col][device_num] = 0b00000000; +        } +    } +    max7219_write_frame(); +} + +/* Enable the display test (IE turn on all 64 LEDs) + */ +void max7219_display_test(int device_num, bool enabled) { +    dprintf("max7219_display_test(%d, %d);\n", device_num, enabled); + +    if (device_num<0 || device_num >= MAX7219_CONTROLLERS) { +        return; +    } + +    max7219_write(device_num, OP_DISPLAYTEST, enabled); +} + +/* Initialize the max7219 system and set the controller(s) to a default state. + */ +void max7219_init(void) { +    wait_ms(1500); +    dprintf("max7219_init()\n"); + +    setPinOutput(MAX7219_LOAD); +    writePinHigh(MAX7219_LOAD); +    spi_init(); + +    for (int i=0; i<MAX7219_CONTROLLERS; i++) { +        max7219_shutdown(i, true); +    } + +    for (int i=0; i<MAX7219_CONTROLLERS; i++) { +        // Reset everything to defaults and enable the display +        max7219_display_test(i, false); +        max7219_set_scan_limit(i, 7); +        max7219_set_decode_mode(i, 0); +        max7219_set_intensity(i, MAX7219_LED_INTENSITY); +    } + +    max7219_clear_display(); + +#ifndef MAX7219_NO_STARTUP_TEST +    for (int i=0; i<MAX7219_CONTROLLERS; i++) { +        // Test this display +        max7219_display_test(i, true); +        wait_ms(75); +        max7219_display_test(i, false); +    } +#endif + +    for (int i=0; i<MAX7219_CONTROLLERS; i++) { +        max7219_shutdown(i, false); +    } +} + +/* Set the decode mode of the controller. You probably don't want to change this. + */ +void max7219_set_decode_mode(int device_num, int mode) { +    dprintf("max7219_set_decode_mode(%d, %d);\n", device_num, mode); + +    if (device_num<0 || device_num >= MAX7219_CONTROLLERS) { +        return; +    } + +    max7219_write(device_num, OP_DECODEMODE, mode); +} + +/* Set the intensity (brightness) for the LEDs. + */ +void max7219_set_intensity(int device_num, int intensity) { +    dprintf("max7219_set_intensity(%d, %d);\n", device_num, intensity); + +    if (device_num<0 || device_num >= MAX7219_CONTROLLERS) { +        return; +    } + +    if (intensity >= 0 && intensity<16) { +            max7219_write(device_num, OP_INTENSITY, intensity); +    } +} + +/* Control a single LED. + */ +void max7219_set_led(int row, int column, bool state) { +    dprintf("max7219_set_led(%d, %d, %d);\n", row, column, state); + +    if (column<0 || column>8*MAX7219_CONTROLLERS) { +        xprintf("max7219_set_led: column (%d) out of bounds\n", column); +        return; +    } + +    if (row<0 || row>7) { +        xprintf("max7219_set_led: row (%d) out of bounds\n", row); +        return; +    } + +    /* At this point we reverse the sense of row and column to match the +     * physical layout of my LEDs. +     */ +    uint8_t device_num = column / 8; +    uint8_t col = column % 8; +    uint8_t val = 0b10000000 >> row; + +    if (state) { +        max7219_led_a[col][device_num] = max7219_led_a[col][device_num]|val; +    } else { +        val = ~val; +        max7219_led_a[col][device_num] = max7219_led_a[col][device_num]&val; +    } +    max7219_write(device_num, col+1, max7219_led_a[col][device_num]); +} + +/* Set the number of digits (rows) to be scanned. + */ +void max7219_set_scan_limit(int device_num, int limit) { +    dprintf("max7219_set_scan_limit(%d, %d);\n", device_num, limit); + +    if (device_num<0 || device_num >= MAX7219_CONTROLLERS) { +        return; +    } + +    if (limit >= 0 && limit < 8) { +        max7219_write(device_num, OP_SCANLIMIT, limit); +    } +} + +/* Enable (true) or disable (false) the controller. + */ +void max7219_shutdown(int device_num, bool shutdown) { +    dprintf("max7219_shutdown(%d, %d);\n", device_num, shutdown); + +    if (device_num<0 || device_num >= MAX7219_CONTROLLERS) { +        return; +    } + +    max7219_write(device_num, OP_SHUTDOWN, !shutdown); +} diff --git a/keyboards/clueboard/2x1800/2021/max7219.h b/keyboards/clueboard/2x1800/2021/max7219.h new file mode 100644 index 0000000000..95d1d9389d --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/max7219.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Zach White <[email protected]> + * Copyright (c) 2007 Eberhard Fahle + * + *    max7219.h - A library for controling Leds with a MAX7219/MAX7221 + * + *    Permission is hereby granted, free of charge, to any person + *    obtaining a copy of this software and associated documentation + *    files (the "Software"), to deal in the Software without + *    restriction, including without limitation the rights to use, + *    copy, modify, merge, publish, distribute, sublicense, and/or sell + *    copies of the Software, and to permit persons to whom the + *    Software is furnished to do so, subject to the following + *    conditions: + * + *    This permission notice shall be included in all copies or + *    substantial portions of the Software. + * + *    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + *    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + *    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + *    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + *    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + *    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + *    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + *    OTHER DEALINGS IN THE SOFTWARE. + */ +#pragma once +#include "quantum.h" +#include "spi_master.h" + +// Set defaults if they're not set +#ifndef MAX7219_LOAD +#    define MAX7219_LOAD B0 +#endif + +#ifndef MAX7219_CONTROLLERS +#    define MAX7219_CONTROLLERS 4 +#endif + +#ifndef MAX7219_LED_INTENSITY +#    define MAX7219_LED_INTENSITY 1 +#endif + +#ifndef MAX7219_SCROLL_TIME +#    define MAX7219_SCROLL_TIME 100 +#endif + +#ifndef MAX7219_BUFFER_MULTIPLIER +#    define MAX7219_BUFFER_MULTIPLIER 24 +#endif + +#if !defined(MAX7219_LED_TEST) && !defined(MAX7219_LED_ITERATE) && !defined(MAX7219_LED_DANCE) && !defined(MAX7219_LED_FONTTEST) && !defined(MAX7219_LED_CLUEBOARD) && !defined(MAX7219_LED_KONAMI) && !defined(MAX7219_LED_QMK_POWERED) && !defined(MAX7219_DRAWING_TOY_MODE) && !defined(MAX7219_LED_CUSTOM) +#    define MAX7219_QMK_POWERED +#endif + +// Configure our MAX7219's +#define MAX_BYTES MAX7219_CONTROLLERS * 2 +#define LED_COUNT MAX7219_CONTROLLERS * 64 +#define MAX7219_BUFFER_SIZE MAX7219_CONTROLLERS*MAX7219_BUFFER_MULTIPLIER + +// Opcodes for the MAX7219 +#define OP_DECODEMODE  9 +#define OP_INTENSITY   10 +#define OP_SCANLIMIT   11 +#define OP_SHUTDOWN    12 +#define OP_DISPLAYTEST 15 + +// Datastructures +extern uint8_t max7219_led_a[8][MAX7219_BUFFER_SIZE]; +extern bool max7219_led_scrolling; + +// Functions +void max7219_write(int device_num, volatile uint8_t opcode, volatile uint8_t data); +void max7219_write_all(void); +void max7219_write_frame(void); +void max7219_clear_display(void); +void max7219_display_test(int device_num, bool enabled); +void max7219_init(void); +void max7219_message_sign(uint8_t message[][6], size_t message_len); +void max7219_message_sign_task(bool loop_message); +void max7219_set_decode_mode(int device_num, int mode); +void max7219_set_intensity(int device_num, int intensity); +void max7219_set_led(int row, int column, bool state); +void max7219_set_all_leds(uint8_t led_matrix[LED_COUNT]); +void max7219_set_scan_limit(int device_num, int limit); +void max7219_shutdown(int device_num, bool is_in_shutdown); diff --git a/keyboards/clueboard/2x1800/2021/readme.md b/keyboards/clueboard/2x1800/2021/readme.md new file mode 100644 index 0000000000..97d536740b --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/readme.md @@ -0,0 +1,17 @@ +# Clueboard 2x1800 + +Clueboard 2x1800 LED Sign Edition + +* Keyboard Maintainer: [Zach White](https://github.com/skullydazed) +* Hardware Supported: Clueboard 2x1800 PCB +* Hardware Availability: 2021 Apr 1 Group Buy + +Make example for this keyboard: + +    make clueboard/2x1800/2021:default + +Flashing example for this keyboard: + +    make clueboard/2x1800/2021:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/clueboard/2x1800/2021/rules.mk b/keyboards/clueboard/2x1800/2021/rules.mk new file mode 100644 index 0000000000..e9f44d7bd2 --- /dev/null +++ b/keyboards/clueboard/2x1800/2021/rules.mk @@ -0,0 +1 @@ +QUANTUM_LIB_SRC += max7219.c spi_master.c | 
