~ruther/qmk_firmware

81ad6cac7e850e1962fcc2c4057f5357a0056838 — gorbachev 6 years ago 9c136e1
[Keymap] Sweet16 as a switch tester (#4822)

* Sweet16 as a switch tester

* pragma once

* QMK_KEYBOARD_H instead of sweet16.h
A keyboards/1upkeyboards/sweet16/keymaps/switchtester/keymap.c => keyboards/1upkeyboards/sweet16/keymaps/switchtester/keymap.c +31 -0
@@ 0,0 1,31 @@
#include QMK_KEYBOARD_H
#include "switches.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  LAYOUT_ortho_4x4(
    KC_NO, KC_NO, KC_NO, KC_NO, 
    KC_NO, KC_NO, KC_NO, KC_NO, 
    KC_NO, KC_NO, KC_NO, KC_NO, 
    KC_NO, KC_NO, KC_NO, KC_NO 
  )
};

struct mechswitch switches[MATRIX_ROWS][MATRIX_COLS] = {
  {CHERRY_MX_BLUE, CHERRY_MX_RED, CHERRY_MX_BLACK, CHERRY_MX_BROWN},
  {GATERON_BLUE, GATERON_RED, GATERON_BLACK, GATERON_BROWN},
  {KAILH_BLUE, KAILH_RED, KAILH_BLACK, KAILH_BROWN},
  {HAKO_CLEAR, HAKO_TRUE, HAKO_VIOLET, HAKO_ROYAL_TRUE}
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  uint8_t col = record->event.key.col;
  uint8_t row = record->event.key.row;

  if (record->event.pressed) {
    char name[MAX_SWITCH_NAME_LENGTH];
    switch_name(switches[row][col], name);
    send_string(name);
    SEND_STRING("\n");
  }
  return false;
}

A keyboards/1upkeyboards/sweet16/keymaps/switchtester/readme.md => keyboards/1upkeyboards/sweet16/keymaps/switchtester/readme.md +5 -0
@@ 0,0 1,5 @@
# Sweet16 as a switch tester

This keymap uses the Sweet16 as a switch tester. The functionality outputs the switch name of whatever key the user pressed.

the `switches` two-dimensional (4x4) array contains the switches attached to the macropad. The switches supported are defined as macros in the `switches.h` header file.

A keyboards/1upkeyboards/sweet16/keymaps/switchtester/rules.mk => keyboards/1upkeyboards/sweet16/keymaps/switchtester/rules.mk +12 -0
@@ 0,0 1,12 @@
# Build Options
#   comment out to disable the options.
#
BOOTMAGIC_ENABLE = no  # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no   # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes  # Audio control and System control(+450)
CONSOLE_ENABLE = yes   # Console for debug(+400)
COMMAND_ENABLE = yes   # Commands for debug and configuration
NKRO_ENABLE = no       # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = no

SRC += switches.c

A keyboards/1upkeyboards/sweet16/keymaps/switchtester/switches.c => keyboards/1upkeyboards/sweet16/keymaps/switchtester/switches.c +99 -0
@@ 0,0 1,99 @@
#include <stdio.h>
#include <string.h>
#include "switches.h"

static const char *BRAND_NAMES[] = {
  "Kailh",
  "Kailh Low Profile Choc",
  "Gateron",
  "Cherry MX",
  "Cherry ML",
  "Outemu",
  "Greetech",
  "Varmilo",
  "MOD",
  "Hako"
};

static const char *COLOR_NAMES[] = {
  "",
  "White",
  "Black",
  "Blue",
  "Red",
  "Yellow",
  "Brown",
  "Green",
  "Clear",
  "Silver",
  "Nature White",
  "Grey",
  "Jade",
  "Navy",
  "Burnt Orange",
  "Pale Blue",
  "Dark Yellow",
  "Gold",
  "Chocolate White",
  "Burgundy",
  "Purple",
  "Light Green",
  "True",
  "Berry",
  "Plum",
  "Sage",
  "Violet",
  "L",
  "M",
  "H",
  "SH"
};

static const char *VARIANT_NAMES[] = {
  "",
  "BOX",
  "BOX Thick",
  "BOX Heavy",
  "Silent",
  "Tactile",
  "Linear",
  "Speed",
  "Speed Heavy",
  "Speed Thick Click",
  "Pro",
  "Pro Heavy",
  "Royal",
  "Thick Click",
  "Heavy"
};

const char *brand_name(struct mechswitch ms) {
  return BRAND_NAMES[ms.brand - 1];
}

const char *variant_name(struct mechswitch ms) {
  return VARIANT_NAMES[ms.variant];
}

const char *color_name(struct mechswitch ms) {
  return COLOR_NAMES[ms.color];
}

void switch_name(struct mechswitch ms, char *buf) {
  const char *v_name = variant_name(ms);
  const char *c_name = color_name(ms);

  snprintf(buf, MAX_SWITCH_NAME_LENGTH, "%s", brand_name(ms));
  strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf));
  if (strlen(v_name) > 0) {
    strncat(buf, v_name, MAX_SWITCH_NAME_LENGTH - strlen(buf));
    strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf));
  }
  if (strlen(c_name) > 0) {
    strncat(buf, c_name, MAX_SWITCH_NAME_LENGTH - strlen(buf));
  }
}

int bitfieldtoi(struct mechswitch ms) {
  return ((ms.brand << 9) | (ms.variant << 5) | ms.color);
}

A keyboards/1upkeyboards/sweet16/keymaps/switchtester/switches.h => keyboards/1upkeyboards/sweet16/keymaps/switchtester/switches.h +189 -0
@@ 0,0 1,189 @@
#pragma once

struct mechswitch
{
  unsigned int brand: 4;
  unsigned int variant: 4;
  unsigned int color: 5;
};

#define MAX_SWITCH_NAME_LENGTH 256

#define BRAND_KAILH     1
#define BRAND_KAILH_LOW 2
#define BRAND_GATERON   3
#define BRAND_CHERRY_MX 4
#define BRAND_CHERRY_ML 5
#define BRAND_OUTEMU    6
#define BRAND_GREETECH  7
#define BRAND_VARMILO   8
#define BRAND_MOD       9
#define BRAND_HAKO      10

#define COLOR_NO 0
#define COLOR_WHITE 1
#define COLOR_BLACK 2
#define COLOR_BLUE 3
#define COLOR_RED 4
#define COLOR_YELLOW 5
#define COLOR_BROWN 6
#define COLOR_GREEN 7
#define COLOR_CLEAR 8
#define COLOR_SILVER 9
#define COLOR_NATURE_WHITE 10
#define COLOR_GREY 11
#define COLOR_JADE 12
#define COLOR_NAVY 13
#define COLOR_BURNT_ORANGE 14
#define COLOR_PALE_BLUE 15
#define COLOR_DARK_YELLOW 16
#define COLOR_GOLD 17
#define COLOR_CHOCOLATE_WHITE 18
#define COLOR_BURGUNDY 19
#define COLOR_PURPLE 20
#define COLOR_LIGHT_GREEN 21
#define COLOR_TRUE 22
#define COLOR_BERRY 23
#define COLOR_PLUM 24
#define COLOR_SAGE 25
#define COLOR_VIOLET 26
#define COLOR_L 27
#define COLOR_M 28
#define COLOR_H 29
#define COLOR_SH 30

#define VARIANT_NO          0
#define VARIANT_BOX         1
#define VARIANT_BOX_THICK   2
#define VARIANT_BOX_HEAVY   3
#define VARIANT_SILENT      4
#define VARIANT_TACTILE     5
#define VARIANT_LINEAR      6
#define VARIANT_SPEED       7
#define VARIANT_SPEED_HEAVY 8
#define VARIANT_SPEED_CLICK_THICK 9
#define VARIANT_PRO         10
#define VARIANT_PRO_HEAVY   11
#define VARIANT_ROYAL       12
#define VARIANT_CLICK_THICK 13

#define CHERRY_MX_BLUE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BLUE}
#define CHERRY_MX_RED {BRAND_CHERRY_MX, VARIANT_NO, COLOR_RED}
#define CHERRY_MX_BROWN {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BROWN}
#define CHERRY_MX_BLACK {BRAND_CHERRY_MX, VARIANT_NO, COLOR_BLACK}
#define CHERRY_MX_GREEN {BRAND_CHERRY_MX, VARIANT_NO, COLOR_GREEN}
#define CHERRY_MX_CLEAR {BRAND_CHERRY_MX, VARIANT_NO, COLOR_CLEAR}
#define CHERRY_MX_WHITE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_WHITE}
#define CHERRY_MX_SILVER {BRAND_CHERRY_MX, VARIANT_NO, COLOR_SILVER}
#define CHERRY_MX_NATURE_WHITE {BRAND_CHERRY_MX, VARIANT_NO, COLOR_NATURE_WHITE}
#define CHERRY_MX_SILENT_BLACK {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_BLACK}
#define CHERRY_MX_SILENT_RED {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_RED}
#define CHERRY_MX_TACTILE_BLACK {BRAND_CHERRY_MX, VARIANT_SILENT, COLOR_GREY}
#define CHERRY_MX_LINEAR_BLACK {BRAND_CHERRY_MX, VARIANT_LINEAR, COLOR_GREY}

#define CHERRY_ML {BRAND_CHERRY_ML, VARIANT_NO, COLOR_NO}

#define GATERON_BLUE {BRAND_GATERON, VARIANT_NO, COLOR_BLUE}
#define GATERON_BROWN {BRAND_GATERON, VARIANT_NO, COLOR_BROWN}
#define GATERON_BLACK {BRAND_GATERON, VARIANT_NO, COLOR_BLACK}
#define GATERON_RED {BRAND_GATERON, VARIANT_NO, COLOR_RED}
#define GATERON_CLEAR {BRAND_GATERON, VARIANT_NO, COLOR_CLEAR}
#define GATERON_GREEN {BRAND_GATERON, VARIANT_NO, COLOR_GREEN}
#define GATERON_YELLOW {BRAND_GATERON, VARIANT_NO, COLOR_YELLOW}

#define GATERON_SILENT_CLEAR {BRAND_GATERON, VARIANT_SILENT, COLOR_CLEAR}
#define GATERON_SILENT_RED {BRAND_GATERON, VARIANT_SILENT, COLOR_RED}
#define GATERON_SILENT_YELLOW {BRAND_GATERON, VARIANT_SILENT, COLOR_YELLOW}
#define GATERON_SILENT_BLACK {BRAND_GATERON, VARIANT_SILENT, COLOR_BLACK}
#define GATERON_SILENT_BROWN {BRAND_GATERON, VARIANT_SILENT, COLOR_BROWN}

#define GREETECH_BLUE {BRAND_GREETECH, VARIANT_NO, COLOR_BLUE}
#define GREETECH_BROWN {BRAND_GREETECH, VARIANT_NO, COLOR_BROWN}
#define GREETECH_BLACK {BRAND_GREETECH, VARIANT_NO, COLOR_BLACK}
#define GREETECH_RED {BRAND_GREETECH, VARIANT_NO, COLOR_RED}

#define OUTEMU_BLUE {BRAND_OUTEMU, VARIANT_NO, COLOR_BLUE}
#define OUTEMU_BROWN {BRAND_OUTEMU, VARIANT_NO, COLOR_BROWN}
#define OUTEMU_BLACK {BRAND_OUTEMU, VARIANT_NO, COLOR_BLACK}
#define OUTEMU_RED {BRAND_OUTEMU, VARIANT_NO, COLOR_RED}

#define KAILH_BLUE {BRAND_KAILH, VARIANT_NO, COLOR_BLUE}
#define KAILH_BROWN {BRAND_KAILH, VARIANT_NO, COLOR_BROWN}
#define KAILH_BLACK {BRAND_KAILH, VARIANT_NO, COLOR_BLACK}
#define KAILH_RED {BRAND_KAILH, VARIANT_NO, COLOR_RED}
#define KAILH_GREEN {BRAND_KAILH, VARIANT_NO, COLOR_GREEN}

#define KAILH_BOX_WHITE {BRAND_KAILH, VARIANT_BOX, COLOR_WHITE}
#define KAILH_BOX_RED {BRAND_KAILH, VARIANT_BOX, COLOR_RED}
#define KAILH_BOX_BLACK {BRAND_KAILH, VARIANT_BOX, COLOR_BLACK}
#define KAILH_BOX_BROWN {BRAND_KAILH, VARIANT_BOX, COLOR_BROWN}
#define KAILH_BOX_ROYAL {BRAND_KAILH, VARIANT_BOX, COLOR_ROYAL}

#define KAILH_BOX_THICK_JADE {BRAND_KAILH, VARIANT_BOX_THICK, COLOR_JADE}
#define KAILH_BOX_THICK_NAVY {BRAND_KAILH, VARIANT_BOX_THICK, COLOR_NAVY}
#define KAILH_BOX_HEAVY_BURNT_ORANGE {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_BURNT_ORANGE}
#define KAILH_BOX_HEAVY_PALE_BLUE {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_PALE_BLUE}
#define KAILH_BOX_HEAVY_DARK_YELLOW {BRAND_KAILH, VARIANT_BOX_HEAVY, COLOR_DARK_YELLOW}

#define KAILH_SPEED_BRONZE {BRAND_KAILH, VARIANT_SPEED, COLOR_BRONZE}
#define KAILH_SPEED_COPPER {BRAND_KAILH, VARIANT_SPEED, COLOR_COPPER}
#define KAILH_SPEED_GOLD {BRAND_KAILH, VARIANT_SPEED, COLOR_GOLD}
#define KAILH_SPEED_SILVER {BRAND_KAILH, VARIANT_SPEED, COLOR_SILVER}

#define KAILH_SPEED_HEAVY_BURNT_ORANGE {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_BURNT_ORANGE}
#define KAILH_SPEED_HEAVY_PALE_BLUE {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_PALE_BLUE}
#define KAILH_SPEED_HEAVY_DARK_YELLOW {BRAND_KAILH, VARIANT_SPEED_HEAVY, COLOR_DARK_YELLOW}

#define KAILH_SPEED_THICK_CLICK_NAVY {BRAND_KAILH, VARIANT_SPEED_CLICK_THICK, COLOR_NAVY}

#define KAILH_PRO_BURGUNDY {BRAND_KAILH, VARIANT_PRO, COLOR_BURGUNDY}
#define KAILH_PRO_PURPLE {BRAND_KAILH, VARIANT_PRO, COLOR_PURPLE}
#define KAILH_PRO_LIGHT_GREEN {BRAND_KAILH, VARIANT_PRO, COLOR_LIGHT_GREEN}

#define KAILH_PRO_HEAVY_BERRY {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_BERRY}
#define KAILH_PRO_HEAVY_PLUM {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_PLUM}
#define KAILH_PRO_GEAVY_SAGE {BRAND_KAILH, VARIANT_PRO_HEAVY, COLOR_SAGE}

#define KAILH_LOW_WHITE {BRAND_KAILH_LOW, VARIANT_NO, COLOR_WHITE}
#define KAILH_LOW_BROWN {BRAND_KAILH_LOW, VARIANT_NO, COLOR_BROWN}
#define KAILH_LOW_RED {BRAND_KAILH_LOW, VARIANT_NO, COLOR_RED}
#define KAILH_LOW_CHOCOLATE_WHITE {BRAND_KAILH_LOW, VARIANT_NO, COLOR_CHOCOLATE_WHITE}
#define KAILH_LOW_THICK_CLICK_NAVY {BRAND_KAILH_LOW, VARIANT_THICK_CLICK, COLOR_NAVY}
#define KAILH_LOW_THICK_CLICK_JADE {BRAND_KAILH_LOW, VARIANT_THICK_CLICK, COLOR_JADE}
#define KAILH_LOW_HEAVY_DARK_YELLOW {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_DARK_YELLOW}
#define KAILH_LOW_HEAVY_BURNT_ORANGE {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_BURNT_ORANGE}
#define KAILH_LOW_HEAVY_PALE_BLUE {BRAND_KAILH_LOW, VARIANT_HEAVY, COLOR_PALE_BLUE}

#define HAKO_ROYAL_CLEAR {BRAND_HAKO, VARIANT_ROYAL, COLOR_CLEAR}
#define HAKO_ROYAL_TRUE {BRAND_HAKO, VARIANT_ROYAL, COLOR_TRUE}

#define HAKO_CLEAR {BRAND_HAKO, VARIANT_NO, COLOR_CLEAR}
#define HAKO_TRUE {BRAND_HAKO, VARIANT_NO, COLOR_TRUE}
#define HAKO_VIOLET {BRAND_HAKO, VARIANT_NO, COLOR_VIOLET}

#define MOD_L_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_L}
#define MOD_M_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_M}
#define MOD_H_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_H}
#define MOD_SH_TACTILE {BRAND_MOD, VARIANT_TACTILE, COLOR_SH}

#define MOD_L_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_L}
#define MOD_M_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_M}
#define MOD_H_LINEAR {BRAND_MOD, VARIANT_LINEAR, COLOR_H}

#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte)  \
  (byte & 0x80 ? '1' : '0'), \
  (byte & 0x40 ? '1' : '0'), \
  (byte & 0x20 ? '1' : '0'), \
  (byte & 0x10 ? '1' : '0'), \
  (byte & 0x08 ? '1' : '0'), \
  (byte & 0x04 ? '1' : '0'), \
  (byte & 0x02 ? '1' : '0'), \
  (byte & 0x01 ? '1' : '0') 


const char *brand_name(struct mechswitch ms);
const char *variant_name(struct mechswitch ms);
const char *color_name(struct mechswitch ms);
void switch_name(struct mechswitch ms, char *buf);
int bitfieldtoi(struct mechswitch ms);