~ruther/qmk_firmware

616dc7dd5d1bf6e512db9a0c7f3dfcdc42fc9db1 — Garret G 4 years ago 44f9017
[Keyboard] 45-ATS (#10104)

* add ats folder

* fix duplicate matrix key

* fix matrix issues

* fix missing comma in info.json

* clean up info.json

* rm game layer toggle in via keymap

* update via keymap rules.mk

* Update info.json

* clear up layout graphics

* Apply suggestions from code review

* Update 45_ats.c

* Update 45_ats.h

* Update config.h

* Update config.h

* Update keyboards/45_ats/keymaps/default/config.h

* Update keymap.c

* Update keyboards/45_ats/keymaps/default/keymap.c

* Update keymap.c

* Update keyboards/45_ats/keymaps/via/keymap.c

* Apply suggestions from code review

* Update keyboards/45_ats/config.h
A keyboards/45_ats/45_ats.c => keyboards/45_ats/45_ats.c +19 -0
@@ 0,0 1,19 @@
 /* 
 Copyright 2020 Alec Penland
 Copyright 2020 Garret Gartner
  
 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 "45_ats.h"

A keyboards/45_ats/45_ats.h => keyboards/45_ats/45_ats.h +59 -0
@@ 0,0 1,59 @@
 /* 
 Copyright 2020 Alec Penland
 Copyright 2020 Garret Gartner
  
 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"

#define xxx KC_NO

#define LAYOUT_split_space( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C,      k0D, \
    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A,    k1B,        k1D, \
    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A,         k2B,   k2D, \
    k30, k31,  k32,      k33,      k36,        k38,   k39,    k3A, k3B, k3D    \
) { \
    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D }, \
    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, xxx, k1D }, \
    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, xxx, k2D }, \
    { k30, k31, k32, k33, xxx, xxx, k36, xxx, k38, k39, k3A, k3B, xxx, k3D }  \
}

#define LAYOUT_625_space( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C,      k0D, \
    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A,    k1B,        k1D, \
    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A,         k2B,   k2D, \
    k30, k31,  k32,            k36,                 k39,      k3A, k3B, k3D    \
) { \
    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D }, \
    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, xxx, k1D }, \
    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, xxx, k2D }, \
    { k30, k31, k32, xxx, xxx, xxx, k36, xxx, xxx, k39, k3A, k3B, xxx, k3D }  \
}

#define LAYOUT_600_space( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C,      k0D, \
    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A,    k1B,        k1D, \
    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A,         k2B,   k2D, \
    k30, k31,  k32,            k36,           k38,    k39,    k3A, k3B, k3D    \
) { \
    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D }, \
    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, xxx, k1D }, \
    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, xxx, k2D }, \
    { k30, k31, k32, xxx, xxx, xxx, k36, xxx, k38, k39, k3A, k3B, xxx, k3D }  \
}

A keyboards/45_ats/config.h => keyboards/45_ats/config.h +52 -0
@@ 0,0 1,52 @@
 /* 
 Copyright 2020 Alec Penland
 Copyright 2020 Garret Gartner
  
 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"

/* USB Device descriptor parameter */
#define VENDOR_ID       0xAB13
#define PRODUCT_ID      0x4511
#define DEVICE_VER      0x0001
#define MANUFACTURER    Abec13
#define PRODUCT         45ATS

/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 14

#define ENCODERS_PAD_A { B4 }
#define ENCODERS_PAD_B { B5 }

/* key matrix pins */
#define MATRIX_ROW_PINS { D3, D5, D7, D6 }
#define MATRIX_COL_PINS { E6, B0, B1, B2, B3, B7, F6, F5, F4, C7, F7, C6, B6, D4 }
#define UNUSED_PINS

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5

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

A keyboards/45_ats/info.json => keyboards/45_ats/info.json +169 -0
@@ 0,0 1,169 @@
{
    "keyboard_name": "45-ATS",
    "url": "",
    "maintainer": "The-Royal",
    "width": 14.25,
    "height": 4.25,
    "layouts": {
      "LAYOUT_split_space": {
        "layout": [
          {"label":"", "x":0, "y":0},
          {"label":"", "x":1, "y":0},
          {"label":"", "x":2, "y":0},
          {"label":"", "x":3, "y":0},
          {"label":"", "x":4, "y":0},
          {"label":"", "x":5, "y":0},
          {"label":"", "x":6, "y":0},
          {"label":"", "x":7, "y":0},
          {"label":"", "x":8, "y":0},
          {"label":"", "x":9, "y":0},
          {"label":"", "x":10, "y":0},
          {"label":"", "x":11, "y":0},
          {"label":"", "x":12, "y":0},
          {"label":"", "x":13.5, "y":0},
          {"label":"", "x":0, "y":1, "w":1.25},
          {"label":"", "x":1.25, "y":1},
          {"label":"", "x":2.25, "y":1},
          {"label":"", "x":3.25, "y":1},
          {"label":"", "x":4.25, "y":1},
          {"label":"", "x":5.25, "y":1},
          {"label":"", "x":6.25, "y":1},
          {"label":"", "x":7.25, "y":1},
          {"label":"", "x":8.25, "y":1},
          {"label":"", "x":9.25, "y":1},
          {"label":"", "x":10.25, "y":1},
          {"label":"", "x":11.25, "y":1, "w":1.75},
          {"label":"", "x":13.5, "y":1},
          {"label":"", "x":0, "y":2, "w":1.75},
          {"label":"", "x":1.75, "y":2},
          {"label":"", "x":2.75, "y":2},
          {"label":"", "x":3.75, "y":2},
          {"label":"", "x":4.75, "y":2},
          {"label":"", "x":5.75, "y":2},
          {"label":"", "x":6.75, "y":2},
          {"label":"", "x":7.75, "y":2},
          {"label":"", "x":8.75, "y":2},
          {"label":"", "x":9.75, "y":2},
          {"label":"", "x":10.75, "y":2, "w":1.25},
          {"label":"", "x":12.25, "y":2.25},
          {"label":"", "x":13.5, "y":2},
          {"label":"", "x":0, "y":3, "w":1.25},
          {"label":"", "x":1.25, "y":3},
          {"label":"", "x":2.25, "y":3, "w":1.25},
          {"label":"", "x":3.5, "y":3, "w":2.75},
          {"label":"", "x":6.25, "y":3, "w":2.25},
          {"label":"", "x":8.5, "y":3, "w":1.25},
          {"label":"", "x":9.75, "y":3, "w":1.25},
          {"label":"", "x":11.25, "y":3.25},
          {"label":"", "x":12.25, "y":3.25},
          {"label":"", "x":13.25, "y":3.25}
        ]
      },
      "LAYOUT_625_space": {
        "layout": [
          {"label":"", "x":0, "y":0},
          {"label":"", "x":1, "y":0},
          {"label":"", "x":2, "y":0},
          {"label":"", "x":3, "y":0},
          {"label":"", "x":4, "y":0},
          {"label":"", "x":5, "y":0},
          {"label":"", "x":6, "y":0},
          {"label":"", "x":7, "y":0},
          {"label":"", "x":8, "y":0},
          {"label":"", "x":9, "y":0},
          {"label":"", "x":10, "y":0},
          {"label":"", "x":11, "y":0},
          {"label":"", "x":12, "y":0},
          {"label":"", "x":13.5, "y":0},
          {"label":"", "x":0, "y":1, "w":1.25},
          {"label":"", "x":1.25, "y":1},
          {"label":"", "x":2.25, "y":1},
          {"label":"", "x":3.25, "y":1},
          {"label":"", "x":4.25, "y":1},
          {"label":"", "x":5.25, "y":1},
          {"label":"", "x":6.25, "y":1},
          {"label":"", "x":7.25, "y":1},
          {"label":"", "x":8.25, "y":1},
          {"label":"", "x":9.25, "y":1},
          {"label":"", "x":10.25, "y":1},
          {"label":"", "x":11.25, "y":1, "w":1.75},
          {"label":"", "x":13.5, "y":1},
          {"label":"", "x":0, "y":2, "w":1.75},
          {"label":"", "x":1.75, "y":2},
          {"label":"", "x":2.75, "y":2},
          {"label":"", "x":3.75, "y":2},
          {"label":"", "x":4.75, "y":2},
          {"label":"", "x":5.75, "y":2},
          {"label":"", "x":6.75, "y":2},
          {"label":"", "x":7.75, "y":2},
          {"label":"", "x":8.75, "y":2},
          {"label":"", "x":9.75, "y":2},
          {"label":"", "x":10.75, "y":2, "w":1.25},
          {"label":"", "x":12.25, "y":2.25},
          {"label":"K", "x":13.5, "y":2},
          {"label":"", "x":0, "y":3, "w":1.25},
          {"label":"", "x":1.25, "y":3},
          {"label":"", "x":2.25, "y":3, "w":1.25},
          {"label":"", "x":3.5, "y":3, "w":6.25},
          {"label":"", "x":9.75, "y":3, "w":1.25},
          {"label":"", "x":11.25, "y":3.25},
          {"label":"", "x":12.25, "y":3.25},
          {"label":"", "x":13.25, "y":3.25}
        ]
      },
      "LAYOUT_600_space": {
        "layout": [
          {"label":"", "x":0, "y":0},
          {"label":"", "x":1, "y":0},
          {"label":"", "x":2, "y":0},
          {"label":"", "x":3, "y":0},
          {"label":"", "x":4, "y":0},
          {"label":"", "x":5, "y":0},
          {"label":"", "x":6, "y":0},
          {"label":"", "x":7, "y":0},
          {"label":"", "x":8, "y":0},
          {"label":"", "x":9, "y":0},
          {"label":"", "x":10, "y":0},
          {"label":"", "x":11, "y":0},
          {"label":"", "x":12, "y":0},
          {"label":"", "x":13.5, "y":0},
          {"label":"", "x":0, "y":1, "w":1.25},
          {"label":"", "x":1.25, "y":1},
          {"label":"", "x":2.25, "y":1},
          {"label":"", "x":3.25, "y":1},
          {"label":"", "x":4.25, "y":1},
          {"label":"", "x":5.25, "y":1},
          {"label":"", "x":6.25, "y":1},
          {"label":"", "x":7.25, "y":1},
          {"label":"", "x":8.25, "y":1},
          {"label":"", "x":9.25, "y":1},
          {"label":"", "x":10.25, "y":1},
          {"label":"", "x":11.25, "y":1, "w":1.75},
          {"label":"", "x":13.5, "y":1},
          {"label":"", "x":0, "y":2, "w":1.75},
          {"label":"", "x":1.75, "y":2},
          {"label":"", "x":2.75, "y":2},
          {"label":"", "x":3.75, "y":2},
          {"label":"", "x":4.75, "y":2},
          {"label":"", "x":5.75, "y":2},
          {"label":"", "x":6.75, "y":2},
          {"label":"", "x":7.75, "y":2},
          {"label":"", "x":8.75, "y":2},
          {"label":"", "x":9.75, "y":2},
          {"label":"", "x":10.75, "y":2, "w":1.25},
          {"label":"", "x":12.25, "y":2.25},
          {"label":"", "x":13.5, "y":2},
          {"label":"", "x":0, "y":3},
          {"label":"", "x":1, "y":3},
          {"label":"", "x":2, "y":3},
          {"label":"", "x":3, "y":3, "w":6.00},
          {"label":"", "x":9, "y":3},
          {"label":"", "x":10, "y":3},
          {"label":"", "x":11.25, "y":3.25},
          {"label":"", "x":12.25, "y":3.25},
          {"label":"", "x":13.25, "y":3.25}
        ]
      }
    }
  }
  

A keyboards/45_ats/keymaps/default/config.h => keyboards/45_ats/keymaps/default/config.h +25 -0
@@ 0,0 1,25 @@
 /* 
 Copyright 2020 Alec Penland
 Copyright 2020 Garret Gartner
  
 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 TAPPING_TERM 175

#define PERMISSIVE_HOLD

#define MOD_TAP_INTERUPT

A keyboards/45_ats/keymaps/default/keymap.c => keyboards/45_ats/keymaps/default/keymap.c +107 -0
@@ 0,0 1,107 @@
 /* 
 Copyright 2020 Alec Penland
 Copyright 2020 Garret Gartner
  
 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

// Layer names
enum ats_layers{
  // - Base layer:
  _BASE,
  // - Symbols, numbers, and functions:
  _FN,
  // - Alternate Function layer:
  _LN
};

#define RS_SLS RSFT_T(KC_SLSH)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Default QWERTY layer 
     * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐   ┌───┐
     * │Esc│ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │Del│BkS│   │PgU│
     * ├───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤   ├───┤
     * │Tab │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ' │Enter │   │PgD│
     * ├────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┘   ├───┤
     * │LShift│ Z │ X │ C │ V │ B │ N │ M │ , │ . │Sft/│ ┌───┐ │CAP│
     * ├────┬─┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┴┬───┘ │ ↑ │ └───┘
     * │LCtl│OS │LAlt│    Fn    │  Space │RAlt│ Ln │ ┌───┼───┼───┐
     * └────┴───┴────┴──────────┴────────┴────┴────┘ │ ← │ ↓ │ → │
     *                                               └───┴───┴───┘
     */
    [_BASE] = LAYOUT_split_space(
        KC_ESC,   KC_Q,     KC_W,    KC_E,  KC_R,  KC_T,  KC_Y,  KC_U,  KC_I,     KC_O,    KC_P,      KC_DEL, KC_BSPC,         KC_PGUP,
        KC_TAB,   KC_A,     KC_S,    KC_D,  KC_F,  KC_G,  KC_H,  KC_J,  KC_K,     KC_L,    KC_QUOTE,      KC_ENT,              KC_PGDN,
        KC_LSFT,  KC_Z,     KC_X,    KC_C,  KC_V,  KC_B,  KC_N,  KC_M,  KC_COMM,  KC_DOT,  RS_SLS,                 KC_UP,      KC_CAPS,
        KC_LCTL,  KC_LGUI,  KC_LALT,          MO(_FN),      KC_SPACE,        KC_RALT,      MO(_LN),       KC_LEFT, KC_DOWN, KC_RIGHT
    ),
    /* Main Numbers, Symbols & Function Layer (MOMENTARY)
     * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐   ┌───┐
     * │   │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ [ │ ] │ \ │   │   │Hme│
     * ├───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤   ├───┤
     * │    │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │      │   │End│
     * ├────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┘   ├───┤
     * │      │ ( │ ) │ ; │ . │   │ - │ + │ * │ / │ =  │ ┌───┐ │   │
     * ├────┬─┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┴┬───┘ │   │ └───┘
     * │    │   │    │          │        │    │    │ ┌───┼───┼───┐
     * └────┴───┴────┴──────────┴────────┴────┴────┘ │   │   │   │
     *                                               └───┴───┴───┘
     */
    [_FN] = LAYOUT_split_space(
        _______,  KC_EXLM,  KC_AT,    KC_HASH,  KC_DLR,  KC_PERC,  KC_CIRC,  KC_AMPR,  KC_ASTR,  KC_LBRC,  KC_RBRC,  KC_BSLS,   _______,             KC_HOME,
        _______,  KC_1,     KC_2,     KC_3,     KC_4,    KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,          KC_ENTER,                  KC_END,
        _______,  KC_LPRN,  KC_RPRN,  KC_SCLN,  KC_DOT,  _______,  KC_MINS,  KC_PLUS,  KC_ASTR,  KC_SLSH,  KC_EQL,                     _______,      _______,
        _______,  _______,  _______,                _______,            _______,            _______,       _______,          _______,  _______,   _______
    ),

    /* ALTERNATE Function layer (MOMENTARY)
     * ┌────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐   ┌───┐
     * │ PWR│F1 │F2 │F3 │F4 │F5 │F6 │   │   │   │   │PRV│NXT│   │VL+│
     * ├────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤   ├───┤
     * │ SLP │F7 │F8 │F9 │F10│F11│F12│   │   │   │   │ PLAY │   │VL-│
     * ├─────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┘   ├───┤
     * │ WAKE  │   │   │   │   │   │   │   │   │   │    │ ┌───┐ │   │
     * ├────┬──┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┴┬───┘ │   │ └───┘
     * │RSET│    │    │          │        │    │    │ ┌───┼───┼───┐
     * └────┴────┴────┴──────────┴────────┴────┴────┘ │   │   │   │
     *                                                └───┴───┴───┘
     */
    [_LN] = LAYOUT_split_space(
        KC_PWR,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    _______,  _______,  _______,  _______,  KC_MPRV,  KC_MNXT,               KC_VOLU,
        KC_SLEP,  KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   _______,  _______,  _______,  _______,       KC_MPLY,                    KC_VOLD,
        KC_WAKE,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,                    _______,       _______,
        RESET,    _______,  _______,                 _______,            _______,            _______,       _______,          _______,  _______,   _______
    )
};

//function for layer indicator LED
layer_state_t layer_state_set_user(layer_state_t state) {
    writePin(D0, layer_state_cmp(state, 0));
    writePin(D1, layer_state_cmp(state, 1));
    writePin(D2, layer_state_cmp(state, 2));
    return state;
}

void encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) {
        if (clockwise) {
            tap_code(KC_VOLU);
        } else {
            tap_code(KC_VOLD);
        }
    }
}

A keyboards/45_ats/keymaps/via/keymap.c => keyboards/45_ats/keymaps/via/keymap.c +107 -0
@@ 0,0 1,107 @@
 /* 
 Copyright 2020 Alec Penland
 Copyright 2020 Garret Gartner
  
 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

// Layer names
enum ats_layers{
  // - Base layer:
  _BASE,
  // - Symbols, numbers, and functions:
  _FN,
  // - Alternate Function layer:
  _LN
};

#define RS_SLS RSFT_T(KC_SLSH)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Default QWERTY layer 
     * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐   ┌───┐
     * │Esc│ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │Del│BkS│   │PgU│
     * ├───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤   ├───┤
     * │Tab │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ' │Enter │   │PgD│
     * ├────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┘   ├───┤
     * │LShift│ Z │ X │ C │ V │ B │ N │ M │ , │ . │Sft/│ ┌───┐ │CAP│
     * ├────┬─┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┴┬───┘ │ ↑ │ └───┘
     * │LCtl│OS │LAlt│    Fn    │  Space │RAlt│ Ln │ ┌───┼───┼───┐
     * └────┴───┴────┴──────────┴────────┴────┴────┘ │ ← │ ↓ │ → │
     *                                               └───┴───┴───┘
     */
    [_BASE] = LAYOUT_split_space(
        KC_ESC,   KC_Q,     KC_W,    KC_E,  KC_R,  KC_T,  KC_Y,  KC_U,  KC_I,     KC_O,    KC_P,      KC_DEL, KC_BSPC,         KC_PGUP,
        KC_TAB,   KC_A,     KC_S,    KC_D,  KC_F,  KC_G,  KC_H,  KC_J,  KC_K,     KC_L,    KC_QUOTE,      KC_ENT,              KC_PGDN,
        KC_LSFT,  KC_Z,     KC_X,    KC_C,  KC_V,  KC_B,  KC_N,  KC_M,  KC_COMM,  KC_DOT,  RS_SLS,                 KC_UP,      KC_CAPS,
        KC_LCTL,  KC_LGUI,  KC_LALT,          MO(_FN),      KC_SPACE,        KC_RALT,      MO(_LN),       KC_LEFT, KC_DOWN, KC_RIGHT
    ),
    /* Main Numbers, Symbols & Function Layer (MOMENTARY)
     * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐   ┌───┐
     * │   │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ [ │ ] │ \ │   │   │Hme│
     * ├───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤   ├───┤
     * │    │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │      │   │End│
     * ├────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┘   ├───┤
     * │      │ ( │ ) │ ; │ . │   │ - │ + │ * │ / │ =  │ ┌───┐ │   │
     * ├────┬─┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┴┬───┘ │   │ └───┘
     * │    │   │    │          │        │    │    │ ┌───┼───┼───┐
     * └────┴───┴────┴──────────┴────────┴────┴────┘ │   │   │   │
     *                                               └───┴───┴───┘
     */
    [_FN] = LAYOUT_split_space(
        _______,  KC_EXLM,  KC_AT,    KC_HASH,  KC_DLR,  KC_PERC,  KC_CIRC,  KC_AMPR,  KC_ASTR,  KC_LBRC,  KC_RBRC,  KC_BSLS,   _______,             KC_HOME,
        _______,  KC_1,     KC_2,     KC_3,     KC_4,    KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,          KC_ENTER,                  KC_END,
        _______,  KC_LPRN,  KC_RPRN,  KC_SCLN,  KC_DOT,  _______,  KC_MINS,  KC_PLUS,  KC_ASTR,  KC_SLSH,  KC_EQL,                     _______,      _______,
        _______,  _______,  _______,                _______,            _______,            _______,       _______,          _______,  _______,   _______
    ),

    /* ALTERNATE Function layer (MOMENTARY)
     * ┌────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐   ┌───┐
     * │ PWR│F1 │F2 │F3 │F4 │F5 │F6 │   │   │   │   │PRV│NXT│   │VL+│
     * ├────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤   ├───┤
     * │ SLP │F7 │F8 │F9 │F10│F11│F12│   │   │   │   │ PLAY │   │VL-│
     * ├─────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┘   ├───┤
     * │ WAKE  │   │   │   │   │   │   │   │   │   │    │ ┌───┐ │   │
     * ├────┬──┴─┬─┴──┬┴───┴───┴─┬─┴───┴──┬┴───┼───┴┬───┘ │   │ └───┘
     * │RSET│    │    │          │        │    │    │ ┌───┼───┼───┐
     * └────┴────┴────┴──────────┴────────┴────┴────┘ │   │   │   │
     *                                                └───┴───┴───┘
     */
    [_LN] = LAYOUT_split_space(
        KC_PWR,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    _______,  _______,  _______,  _______,  KC_MPRV,  KC_MNXT,               KC_VOLU,
        KC_SLEP,  KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   _______,  _______,  _______,  _______,       KC_MPLY,                    KC_VOLD,
        KC_WAKE,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,                    _______,       _______,
        RESET,    _______,  _______,                 _______,            _______,            _______,       _______,          _______,  _______,   _______
    )
};

//function for layer indicator LED
layer_state_t layer_state_set_user(layer_state_t state) {
    writePin(D0, layer_state_cmp(state, 0));
    writePin(D1, layer_state_cmp(state, 1));
    writePin(D2, layer_state_cmp(state, 2));
    return state;
}

void encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) {
        if (clockwise) {
            tap_code(KC_VOLU);
        } else {
            tap_code(KC_VOLD);
        }
    }
}

A keyboards/45_ats/keymaps/via/readme.md => keyboards/45_ats/keymaps/via/readme.md +3 -0
@@ 0,0 1,3 @@
# 45-ATS VIA Firmware

This keymap is to enable the use of VIA on the 45-ATS Keyboard.

A keyboards/45_ats/keymaps/via/rules.mk => keyboards/45_ats/keymaps/via/rules.mk +1 -0
@@ 0,0 1,1 @@
VIA_ENABLE = yes

A keyboards/45_ats/readme.md => keyboards/45_ats/readme.md +16 -0
@@ 0,0 1,16 @@
# 45-ATS 

![45ats](https://i.imgur.com/Paqx5zGl.png)

A Premium and Beautiful 45% (And-Then-Some) Keyboard. Concept and Design by [Abec13](https://www.reddit.com/user/abec13).

- Keyboard Designer: [Abec13](https://reddit.com/u/abec13/)
- Keyboard Maintainer: [The-Royal](https://github.com/the-royal)
- Hardware Supported: 45-ATS v1.0 PCB
- Hardware Availability: Through Group Buy - Dec. 2019

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

    make 45_ats:default

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).

A keyboards/45_ats/rules.mk => keyboards/45_ats/rules.mk +22 -0
@@ 0,0 1,22 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = full     # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = yes        # Console for debug
COMMAND_ENABLE = yes        # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no       # Enable Bluetooth
AUDIO_ENABLE = no           # Audio output