~ruther/qmk_firmware

afa4763ef55abcf122c07700e1c1fd012973fea2 — MechMerlin 6 years ago 80e7337
[Keyboard] Update the Scarlet Bandana (#5058)

* remove unneeded file

* make an appropriate readme

* amend the LAYOUT macro to adhere to new QMK standards and create an appropriate keymap

* add QMK Configurator support

* a bunch of changes lol

* delete unneeded routines

* update date to modern times

* remove a useless prototype

* add in drashna's suggestions on PR
M keyboards/scarletbandana/config.h => keyboards/scarletbandana/config.h +5 -2
@@ 1,5 1,5 @@
/*
Copyright 2017 Cole Markham
Copyright 2019 Cole Markham

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


@@ 25,7 25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define DEVICE_VER      0x0001
#define MANUFACTURER    WoodKeys.click
#define PRODUCT         Scarlet Bandana Version IV mark.2
#define DESCRIPTION     What keyboard is that?
#define DESCRIPTION     65% with macro keys

/* key matrix size */
#define MATRIX_ROWS 5


@@ 52,4 52,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define NO_MUSIC_MODE
#endif

#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION

#define DEBOUNCING_DELAY 5

A keyboards/scarletbandana/info.json => keyboards/scarletbandana/info.json +12 -0
@@ 0,0 1,12 @@
{
    "keyboard_name": "Scarlet Bandana Version IV Mark 2", 
    "url": "", 
    "maintainer": "qmk", 
    "width": 18.5, 
    "height": 5, 
    "layouts": {
        "LAYOUT_all": {
            "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":5.5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":10.5, "y":0}, {"x":11.5, "y":0}, {"x":12.5, "y":0}, {"x":13.5, "y":0}, {"x":14.5, "y":0}, {"x":15.5, "y":0}, {"x":16.5, "y":0}, {"x":17.5, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2.5, "y":1, "w":1.5}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":15, "y":1}, {"x":16, "y":1, "w":1.5}, {"x":17.5, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2.5, "y":2, "w":1.75}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":8.25, "y":2}, {"x":9.25, "y":2}, {"x":10.25, "y":2}, {"x":11.25, "y":2}, {"x":12.25, "y":2}, {"x":13.25, "y":2}, {"x":14.25, "y":2}, {"x":15.25, "y":2, "w":2.25}, {"x":17.5, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2.5, "y":3, "w":2.25}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":8.75, "y":3}, {"x":9.75, "y":3}, {"x":10.75, "y":3}, {"x":11.75, "y":3}, {"x":12.75, "y":3}, {"x":13.75, "y":3}, {"x":14.75, "y":3, "w":1.75}, {"x":16.5, "y":3}, {"x":17.5, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":1.25}, {"x":5, "y":4, "w":1.25}, {"x":6.25, "y":4, "w":2.25}, {"x":8.5, "y":4, "w":1.75}, {"x":10.25, "y":4, "w":2.25}, {"x":12.5, "y":4}, {"x":13.5, "y":4}, {"x":14.5, "y":4}, {"x":15.5, "y":4}, {"x":16.5, "y":4}, {"x":17.5, "y":4}]
        }
    }
}
\ No newline at end of file

M keyboards/scarletbandana/keymaps/default/config.h => keyboards/scarletbandana/keymaps/default/config.h +1 -1
@@ 1,4 1,4 @@
/* Copyright 2017 Cole Markham, WoodKeys.click
/* Copyright 2019 Cole Markham, WoodKeys.click
 *
 * 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

M keyboards/scarletbandana/keymaps/default/keymap.c => keyboards/scarletbandana/keymaps/default/keymap.c +14 -18
@@ 1,4 1,4 @@
/* Copyright 2017 Cole Markham
/* Copyright 2019 Cole Markham
 *
 * 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


@@ 13,7 13,7 @@
 * 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 "../../scarletbandana.h"
#include QMK_KEYBOARD_H

#ifdef RGBLIGHT_ENABLE
//Following line allows macro to read current RGB settings


@@ 41,39 41,35 @@ bool TOG_STATUS = false;
int RGB_current_mode;

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        [_QWERTY] = KEYMAP(
        KC_F1, KC_F2,   KC_ESC,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_PGUP,\
        [_QWERTY] = LAYOUT_all(
        KC_F1, KC_F2,   KC_ESC, 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_DEL, KC_PGUP,\
        KC_F3, KC_F4,   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_PGDN,\
        KC_F5, KC_F6,   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_DEL, KC_HOME,\
        KC_F5, KC_F6,   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_HOME,\
        KC_F7, KC_F8,   KC_LSFT,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLASH,KC_RSFT,KC_UP,KC_END,\
        KC_F9, KC_F10,  KC_LCTL,KC_LGUI,KC_LALT, RAISE, KC_SPACE, LOWER, KC_RALT,KC_APP,KC_RCTRL,KC_LEFT,KC_DOWN,KC_RIGHT),

        [_RAISE] = KEYMAP(
        RGB_MOD, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        [_RAISE] = LAYOUT_all(
        RGB_MOD, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,\
        _______, _______,  _______,_______,_______, _______, _______, _______, _______,_______,_______,_______,_______,_______),

        [_LOWER] = KEYMAP(
        RGB_MOD, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        [_LOWER] = LAYOUT_all(
        RGB_MOD, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,  _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,\
        _______, _______,  _______,_______,_______, _______, _______, _______, _______,_______,_______,_______,_______,_______),

        [_ADJUST] = KEYMAP(
        RESET, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        [_ADJUST] = LAYOUT_all(
        RESET, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,  _______,\
        _______, _______,   _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,\
        _______, _______,  _______,_______,_______, _______, _______, _______, _______,_______,_______,_______,_______,_______)
};

const uint16_t PROGMEM fn_actions[] = {

};

// Setting ADJUST layer RGB back to default
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
  if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {

D keyboards/scarletbandana/matrix.c => keyboards/scarletbandana/matrix.c +0 -326
@@ 1,326 0,0 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2017 Cole Markham <cole@ccmcomputing.net>

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/>.
*/

/*
 * scan matrix
 */
#include <stdint.h>
#include <stdbool.h>
#if defined(__AVR__)
#include <avr/io.h>
#include "pincontrol.h"
#endif
#include "wait.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "config.h"
#include "timer.h"
//#include "audio.h"

#ifndef DEBOUNCING_DELAY
#   define DEBOUNCING_DELAY 5
#endif

#if (DEBOUNCING_DELAY > 0)
    static uint16_t debouncing_time;
    static bool debouncing = false;
#endif

#if (MATRIX_COLS <= 8)
#    define print_matrix_header()  print("\nr/c 01234567\n")
#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row))
#    define matrix_bitpop(i)       bitpop(matrix[i])
#    define ROW_SHIFTER ((uint8_t)1)
#elif (MATRIX_COLS <= 16)
#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n")
#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row))
#    define matrix_bitpop(i)       bitpop16(matrix[i])
#    define ROW_SHIFTER ((uint16_t)1)
#elif (MATRIX_COLS <= 32)
#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row))
#    define matrix_bitpop(i)       bitpop32(matrix[i])
#    define ROW_SHIFTER  ((uint32_t)1)
#endif

static matrix_row_t matrix_debouncing[MATRIX_ROWS];

static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static const uint8_t col_pins[4] = MATRIX_COL_PINS;
static const uint8_t xcol_pins[MATRIX_COLS - 16] = MATRIX_XCOL_PINS;
//
//float init_song[][2]     = SONG(QWERTY_SOUND);

/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
static void init_rows(void);
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col);
static void unselect_cols(void);
static void init_cols(void);
static void select_col(uint8_t col);
//static void demux_enable(bool enabled);

__attribute__ ((weak))
void matrix_init_quantum(void) {
    matrix_init_kb();
}

__attribute__ ((weak))
void matrix_scan_quantum(void) {
    matrix_scan_kb();
}

__attribute__ ((weak))
void matrix_init_kb(void) {
    matrix_init_user();
}

__attribute__ ((weak))
void matrix_scan_kb(void) {
    matrix_scan_user();
}

__attribute__ ((weak))
void matrix_init_user(void) {
}

__attribute__ ((weak))
void matrix_scan_user(void) {
}

inline
uint8_t matrix_rows(void)
{
    return MATRIX_ROWS;
}

inline
uint8_t matrix_cols(void)
{
    return MATRIX_COLS;
}

void matrix_init(void)
{
    debug_enable = true;
    debug_matrix = true;
    debug_mouse = true;
    dprintf("matrix init");
    // initialize row and col
    init_cols();
    init_rows();


//    PLAY_NOTE_ARRAY(init_song, false, 0);


    // initialize matrix state: all keys off
    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
        matrix[i] = 0;
        matrix_debouncing[i] = 0;
    }

    matrix_init_quantum();

}

uint8_t _matrix_scan(void)
{
    // Set col, read rows
    for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
#       if (DEBOUNCING_DELAY > 0)
            bool matrix_changed = read_rows_on_col(matrix_debouncing, current_col);
            if (matrix_changed) {
                debouncing = true;
                debouncing_time = timer_read();
            }
#       else
             read_rows_on_col(matrix, current_col);
#       endif

    }

    // Unselect cols
    unselect_cols();

#   if (DEBOUNCING_DELAY > 0)
        if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) {
            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
                matrix[i] = matrix_debouncing[i];
            }
            debouncing = false;
        }
#   endif

	return 1;
}

uint8_t matrix_scan(void)
{
	uint8_t ret = _matrix_scan();
	matrix_scan_quantum();
	return ret;
}

bool matrix_is_modified(void)
{
    if (debouncing) return false;
    return true;
}

inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
    return (matrix[row] & ((matrix_row_t)1<<col));
}

inline
matrix_row_t matrix_get_row(uint8_t row)
{
    return matrix[row];
}

void matrix_print(void)
{
    print("\nr/c 0123456789ABCDEF\n");
    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
        phex(row); print(": ");
        pbin_reverse16(matrix_get_row(row));
        print("\n");
    }
}

uint8_t matrix_key_count(void)
{
    uint8_t count = 0;
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        count += bitpop16(matrix[i]);
    }
    return count;
}


static void init_rows(void)
{
    for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
        uint8_t pin = row_pins[x];
        pinMode(pin, PinDirectionInput);
        digitalWrite(pin, PinLevelHigh);
    }
}


static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
{
    bool matrix_changed = false;

    // Select col and wait for col selection to stabilize
    select_col(current_col);
    wait_us(30);
//    wait_ms(1000);
//    PLAY_NOTE_ARRAY(init_song, false, 0);

    // For each row...
    for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++)
    {

        // Store last value of row prior to reading
        matrix_row_t last_row_value = current_matrix[row_index];

        // Check row pin state
        uint8_t pin = row_pins[row_index];
        if (digitalRead(pin) == 0)
        {
            // Pin LO, set col bit
            current_matrix[row_index] |= (ROW_SHIFTER << current_col);
        }
        else
        {
            // Pin HI, clear col bit
            current_matrix[row_index] &= ~(ROW_SHIFTER << current_col);
        }

        // Determine if the matrix changed state
        if ((last_row_value != current_matrix[row_index]) && !(matrix_changed))
        {
            matrix_changed = true;
        }
    }

    return matrix_changed;
}

static void select_col(uint8_t col)
{
  for (uint8_t y = 16; y < MATRIX_COLS; y++) {
    uint8_t pin = xcol_pins[y-16];
    if (y == col) {
      digitalWrite(pin, PinLevelLow);
    } else {
      digitalWrite(pin, PinLevelHigh);
    }
  }
  if (col >= 16) {
//    demux_enable(false);
//    digitalWrite(MATRIX_EN_PIN, PinLevelHigh);
  } else {
    for(uint8_t x = 0; x < 4; x++) {
      uint8_t pin = col_pins[x];
      pinMode(pin, PinDirectionOutput);
      digitalWrite(pin, (col >> x) & 0x1);
    }
//    demux_enable(true);
    digitalWrite(MATRIX_EN_PIN, PinLevelLow);
  }
}

static void init_cols(void) {
  for (uint8_t y = 16; y < MATRIX_COLS; y++) {
      uint8_t pin = xcol_pins[y-16];
      pinMode(pin, PinDirectionOutput);
    }
  for(uint8_t x = 0; x < 4; x++) {
        uint8_t pin = col_pins[x];
        pinMode(pin, PinDirectionOutput);
  }
  pinMode(MATRIX_EN_PIN, PinDirectionOutput);
//  digitalWrite(MATRIX_EN_PIN, PinLevelHigh);
  unselect_cols();
}

static void unselect_cols(void)
{
  for (uint8_t y = 16; y < MATRIX_COLS; y++) {
    uint8_t pin = xcol_pins[y-16];
    digitalWrite(pin, PinLevelHigh);
  }
//  demux_enable(false);
//  digitalWrite(MATRIX_EN_PIN, PinLevelHigh);
}

//static void demux_enable(uint8_t state)
//{
//  if (enabled){
//    digitalWrite(F7, PinLevelLow);
//  } else {
//    digitalWrite(F7, PinLevelHigh);
//  }
//}

M keyboards/scarletbandana/readme.md => keyboards/scarletbandana/readme.md +5 -25
@@ 1,31 1,11 @@
# Meira

![Miera](https://imgur.com/kF4MFlW)

A 4x12 ortholinear low-profile keyboard.
# Scarlet Bandana Version IV Mark 2

Keyboard Maintainer: [Cole Markham](https://github.com/colemarkham)  
Hardware Supported: Meira/ProMicro, Meira/FeatherBLE  
Hardware Availability: [WoodKeys.click](https://woodkeys.click/meira)  

Two controllers are support: the Pro Micro, and the Adafruit Feather BLE 32u4. Support for each is defined as a hardware revision subfolder in QMK. Main differences include processor frequencies and matrix pinouts.
Hardware Supported: Scarlet Bandana Version IV Mark 2  
Hardware Availability: [WoodKeys.click](https://woodkeys.click/product/scarlet-bandana-version-iv-mark-2/)  

Make example for this keyboard (after setting up your build environment):

    make meira/promicro:default

or

    make meira/featherble:default

See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information on generic QMK configuration and setup.

Both the Pro Micro and the Feather BLE use the Catalina bootloader, which is typically programmed using avrdude.

## Matrix

In order to have enough pins for the matrix and other functions, a custom matrix is implemented using a demultiplexer to scan the columns. Since the demux is active low, the diodes must be oriented with the cathode connected to the demux pin. When looking at the bottom of the board with the controller at the top right, the cathode mark on the diode should be toward the left.

## LED Controller
    make scarletbandana:default

The in-switch LEDs are driven by an ISSI LED controller (IS31FL3731). The micro controller communicates with this chip using I2C. Individual LED control is possible, but currently only general backlighting support is implemented. This functionality is located in lighting.c, issi.c, and TWILib.c.
\ No newline at end of file
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).

M keyboards/scarletbandana/rules.mk => keyboards/scarletbandana/rules.mk +3 -2
@@ 45,13 45,13 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
#   Atmel DFU loader 4096
#   LUFA bootloader  4096
#   USBaspLoader     2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
BOOTLOADER = atmel-dfu


# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
CONSOLE_ENABLE = no        # Console for debug(+400)


@@ 67,3 67,4 @@ AUDIO_ENABLE = yes          # Audio output on port C6
RGBLIGHT_ENABLE = yes       # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality, also set ISSI_ENABLE below for Miera
EXTRAFLAGS += -flto

M keyboards/scarletbandana/scarletbandana.c => keyboards/scarletbandana/scarletbandana.c +1 -81
@@ 1,4 1,4 @@
/* Copyright 2017 Cole Markham, WoodKeys.click
/* Copyright 2019 Cole Markham, WoodKeys.click
 *
 * 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


@@ 14,89 14,9 @@
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include "scarletbandana.h"
#include <LUFA/Common/Common.h>

#include "quantum.h"

#ifdef AUDIO_ENABLE
    float tone_startup[][2] = SONG(STARTUP_SOUND);
    float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
#endif


void shutdown_user(void) {
    #ifdef AUDIO_ENABLE
        PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
    _delay_ms(150);
    stop_all_notes();
    #endif
}


void matrix_init_kb(void)
{
  // This is required to access the pins in the F-register
  JTAG_DISABLE();
    debug_enable=true;
    print("sb matrix_init_kb\n");
#ifdef AUDIO_ENABLE
    _delay_ms(20); // gets rid of tick
    PLAY_NOTE_ARRAY(tone_startup, false, 0);
#endif


    // put your keyboard start-up code here
    // runs once when the firmware starts up
    matrix_init_user();
}

void matrix_scan_kb(void)
{
    matrix_scan_user();
}

bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
    // Test code that turns on the switch led for the key that is pressed
    // set_backlight_by_keymap(record->event.key.col, record->event.key.row);
    if (keycode == RESET) {
        reset_keyboard_kb();
    } else {
    }
	return process_record_user(keycode, record);
}

void led_set_kb(uint8_t usb_led) {
	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
	led_set_user(usb_led);
}

//void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
//{
//#ifdef AUDIO_ENABLE
//    int8_t sign = 1;
//#endif
//    if(id == LFK_ESC_TILDE){
//        // Send ~ on shift-esc
//        void (*method)(uint8_t) = (event->event.pressed) ? &add_key : &del_key;
//        uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
//        method(shifted ? KC_GRAVE : KC_ESCAPE);
//        send_keyboard_report();
//    }else if(event->event.pressed){
//        switch(id){
//            case LFK_CLEAR:
//                // Go back to default layer
//                layer_clear();
//                break;
//#ifdef ISSI_ENABLE
//            case LFK_LED_TEST:
//                led_test();
//                break;
//#endif
//        }
//    }
//}

void reset_keyboard_kb(){
    xprintf("programming!\n");
    reset_keyboard();
}

M keyboards/scarletbandana/scarletbandana.h => keyboards/scarletbandana/scarletbandana.h +6 -11
@@ 1,4 1,4 @@
/* Copyright 2017 Cole Markham
/* Copyright 2019 Cole Markham
 *
 * 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


@@ 13,23 13,20 @@
 * 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 SCARLETBANDANA_H
#define SCARLETBANDANA_H
#pragma once

#include "quantum.h"

void reset_keyboard_kb(void);

// This a shortcut to help you visually see your layout.
// The following is an example using the Planck MIT layout
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
  k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, \
#define LAYOUT_all( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k2f, k0g, \
	k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, \
	k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, \
	k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e,      k2g, \
	k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c,      k3e, k3f, k3g, \
  k40, k41, k42, k43, k44, k45,      k47,      k49, k4a, k4b, k4c,      k4e, k4f, k4g \
    k40, k41, k42, k43, k44, k45,      k47,      k49, k4a, k4b, k4c,      k4e, k4f, k4g \
) \
{ \
	{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g }, \


@@ 39,5 36,3 @@ void reset_keyboard_kb(void);
	{ k40, k41, k42, k43, k44, k45, KC_NO, k47, KC_NO, k49, k4a, k4b, k4c, KC_NO, k4e, k4f, k4g } \
}

#endif