From 6c834dea7b506db480ae7a96f3b35f955824d4ec Mon Sep 17 00:00:00 2001
From: Ethan Durrant <5387347+emdarcher@users.noreply.github.com>
Date: Sun, 8 Dec 2019 23:31:30 -0700
Subject: [PATCH] [Keyboard] Adding Navi10 macropad (#7556)

* working on keymap and files for the navi10

* fixing and modifying tap dance keys and layers

* cleanup, and adding my separate keymap

* edited and simplified the default keymap

* cleaned up files and added support for future rev2 board

* readme edits

* moved rev0 specific keymap to it's own folder

* added revision data to the config files

* added DEFAULT_FOLDER

* added note on compiling for a specific revision

* documentation and readme edits

* moved keymaps around and cleaned up

* added photo

* formatting and cleanup

* fixing whitespace

* moving the tap dance enable to keymap folders
---
 keyboards/navi10/info.json                   |  12 ++
 keyboards/navi10/keymaps/default/keymap.c    | 131 +++++++++++++
 keyboards/navi10/keymaps/default/readme.md   |  11 ++
 keyboards/navi10/keymaps/default/rules.mk    |   1 +
 keyboards/navi10/keymaps/emdarcher/keymap.c  | 182 +++++++++++++++++++
 keyboards/navi10/keymaps/emdarcher/readme.md |  16 ++
 keyboards/navi10/keymaps/emdarcher/rules.mk  |   1 +
 keyboards/navi10/readme.md                   |  19 ++
 keyboards/navi10/rev0/config.h               |  51 ++++++
 keyboards/navi10/rev0/rev0.c                 |  30 +++
 keyboards/navi10/rev0/rev0.h                 |  34 ++++
 keyboards/navi10/rev0/rules.mk               |  33 ++++
 keyboards/navi10/rev2/config.h               |  51 ++++++
 keyboards/navi10/rev2/rev2.c                 |  30 +++
 keyboards/navi10/rev2/rev2.h                 |  34 ++++
 keyboards/navi10/rev2/rules.mk               |  33 ++++
 keyboards/navi10/rev3/config.h               |  51 ++++++
 keyboards/navi10/rev3/rev3.c                 |  30 +++
 keyboards/navi10/rev3/rev3.h                 |  34 ++++
 keyboards/navi10/rev3/rules.mk               |  33 ++++
 keyboards/navi10/rules.mk                    |   1 +
 21 files changed, 818 insertions(+)
 create mode 100644 keyboards/navi10/info.json
 create mode 100644 keyboards/navi10/keymaps/default/keymap.c
 create mode 100644 keyboards/navi10/keymaps/default/readme.md
 create mode 100644 keyboards/navi10/keymaps/default/rules.mk
 create mode 100644 keyboards/navi10/keymaps/emdarcher/keymap.c
 create mode 100644 keyboards/navi10/keymaps/emdarcher/readme.md
 create mode 100644 keyboards/navi10/keymaps/emdarcher/rules.mk
 create mode 100644 keyboards/navi10/readme.md
 create mode 100644 keyboards/navi10/rev0/config.h
 create mode 100644 keyboards/navi10/rev0/rev0.c
 create mode 100644 keyboards/navi10/rev0/rev0.h
 create mode 100644 keyboards/navi10/rev0/rules.mk
 create mode 100644 keyboards/navi10/rev2/config.h
 create mode 100644 keyboards/navi10/rev2/rev2.c
 create mode 100644 keyboards/navi10/rev2/rev2.h
 create mode 100644 keyboards/navi10/rev2/rules.mk
 create mode 100644 keyboards/navi10/rev3/config.h
 create mode 100644 keyboards/navi10/rev3/rev3.c
 create mode 100644 keyboards/navi10/rev3/rev3.h
 create mode 100644 keyboards/navi10/rev3/rules.mk
 create mode 100644 keyboards/navi10/rules.mk

diff --git a/keyboards/navi10/info.json b/keyboards/navi10/info.json
new file mode 100644
index 0000000000..dc92144d9d
--- /dev/null
+++ b/keyboards/navi10/info.json
@@ -0,0 +1,12 @@
+{
+    "keyboard_name": "Navi10", 
+    "url": "", 
+    "maintainer": "emdarcher", 
+    "width": 3, 
+    "height": 5, 
+    "layouts": {
+        "LAYOUT": {
+            "layout": [{"label":"Fn", "x":0, "y":0}, {"label":"Home", "x":1, "y":0}, {"label":"PgUp", "x":2, "y":0}, {"label":"Del", "x":0, "y":1}, {"label":"End", "x":1, "y":1}, {"label":"PgDn", "x":2, "y":1}, {"label":"Up", "x":1, "y":3}, {"label":"Left", "x":0, "y":4}, {"label":"Down", "x":1, "y":4}, {"label":"Right", "x":2, "y":4}]
+        }
+    }
+}
diff --git a/keyboards/navi10/keymaps/default/keymap.c b/keyboards/navi10/keymaps/default/keymap.c
new file mode 100644
index 0000000000..d1b3127760
--- /dev/null
+++ b/keyboards/navi10/keymaps/default/keymap.c
@@ -0,0 +1,131 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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
+
+//create the tap type
+typedef struct {
+    bool is_press_action;
+    int state;
+} tap;
+
+//tap dance states
+enum {
+    SINGLE_TAP = 1,
+    SINGLE_HOLD = 2,
+};
+
+//tap dance keys
+enum {
+    TAPPY_KEY = 0
+};
+
+//function to handle all the tap dances
+int cur_dance(qk_tap_dance_state_t *state);
+
+//functions for each tap dance
+void tk_finished(qk_tap_dance_state_t *state, void *user_data);
+void tk_reset(qk_tap_dance_state_t *state, void *user_data);
+
+#define INDICATOR_LED   B5
+
+#define _FN0    1
+#define _ML1    2
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    [0] = LAYOUT(/* Base */
+                 TD(TAPPY_KEY),KC_HOME, KC_PGUP,
+                 KC_DEL,    KC_END,     KC_PGDN,
+                 
+                            KC_UP,
+                 KC_LEFT,   KC_DOWN,    KC_RIGHT),
+    [_FN0] = LAYOUT(/* function layer */
+                 KC_TRNS,   KC_PAUS,    KC_VOLU,
+                 KC_ENTER,  KC_SLCK,    KC_VOLD,
+                 
+                            KC_TRNS,
+                 KC_TRNS,   KC_TRNS,    KC_TRNS),
+    [_ML1] = LAYOUT(/* media function layer, toggled on a single tap */
+                 KC_TRNS,   KC_TRNS,    KC_VOLU, 
+                 KC_MUTE,   KC_TRNS,    KC_VOLD,
+                 
+                            KC_SPC,
+                 KC_MRWD,   KC_MPLY,    KC_MFFD),
+};
+
+//determine the current tap dance state
+int cur_dance (qk_tap_dance_state_t *state){
+    if(state->count == 1){
+        //if a tap was registered
+        if(!state->pressed){
+            //if not still pressed, then was a single tap
+            return SINGLE_TAP;
+        } else {
+            //if still pressed/held down, then it's a single hold
+            return SINGLE_HOLD;
+        }
+    } else {
+        return 8;
+    }
+}
+
+//initialize the tap structure for the tap key
+static tap tk_tap_state = {
+    .is_press_action = true,
+    .state = 0
+};
+
+//functions that control what our tap dance key does
+void tk_finished(qk_tap_dance_state_t *state, void *user_data){
+    tk_tap_state.state = cur_dance(state);
+    switch(tk_tap_state.state){
+        case SINGLE_TAP:
+            //send desired key when tapped:
+            //setting to the media layer
+            if(layer_state_is(_ML1)){
+                //if already active, toggle it to off
+                layer_off(_ML1);
+                //turn off the indicator LED
+                //set LED HI to turn it off
+                writePinHigh(INDICATOR_LED);
+            } else {
+                //turn on the media layer
+                layer_on(_ML1);
+                //turn on the indicator LED
+                //set LED pin to LOW to turn it on
+                writePinLow(INDICATOR_LED);
+            }
+            break;
+        case SINGLE_HOLD:
+            //set to desired layer when held:
+            //setting to the function layer
+            layer_on(_FN0);
+            break;
+    }
+}
+
+void tk_reset(qk_tap_dance_state_t *state, void *user_data){
+    //if held and released, leave the layer
+    if(tk_tap_state.state == SINGLE_HOLD){
+        layer_off(_FN0);
+    }
+    //reset the state
+    tk_tap_state.state = 0; 
+}
+
+//associate the tap dance key with its functionality
+qk_tap_dance_action_t tap_dance_actions[] = {
+    [TAPPY_KEY] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, tk_finished, tk_reset, 275)
+};
diff --git a/keyboards/navi10/keymaps/default/readme.md b/keyboards/navi10/keymaps/default/readme.md
new file mode 100644
index 0000000000..9e54a3f20a
--- /dev/null
+++ b/keyboards/navi10/keymaps/default/readme.md
@@ -0,0 +1,11 @@
+# The default keymap for the Navi10
+
+This keymap keeps a basic Navigation Cluster layout, but utilizes the Insert key as a FN/Tap key to access 2 layers.
+
+- Base Layer: 
+  * Navigation Cluster (sans Insert Key)
+- Hold Insert -> Function Layer: 
+  * Maps Volume Control on PgUp/PgDN, Pause/Scroll-Lock on Home/End (MacOS brightness), and Delete to Enter. 
+- Tap Insert Once -> Media Layer (Tap again to leave): 
+  * Has mappings for Audio control on MacOS using the arrow keys, PgUp/PgDn, and Delete.
+  * Lights up the Central 3mm indicator LED.
diff --git a/keyboards/navi10/keymaps/default/rules.mk b/keyboards/navi10/keymaps/default/rules.mk
new file mode 100644
index 0000000000..e5ddcae8d9
--- /dev/null
+++ b/keyboards/navi10/keymaps/default/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/navi10/keymaps/emdarcher/keymap.c b/keyboards/navi10/keymaps/emdarcher/keymap.c
new file mode 100644
index 0000000000..40efed48d5
--- /dev/null
+++ b/keyboards/navi10/keymaps/emdarcher/keymap.c
@@ -0,0 +1,182 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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
+
+typedef struct {
+    bool is_press_action;
+    int state;
+} tap;
+
+//tap dance states
+enum {
+    SINGLE_TAP = 1,
+    SINGLE_HOLD = 2,
+    DOUBLE_TAP = 3,
+    TRIPLE_TAP = 4
+};
+
+//tap dance keys
+enum {
+    TAPPY_KEY = 0
+};
+
+//function to handle all the tap dances
+int cur_dance(qk_tap_dance_state_t *state);
+
+//functions for each tap dance
+void tk_finished(qk_tap_dance_state_t *state, void *user_data);
+void tk_reset(qk_tap_dance_state_t *state, void *user_data);
+
+#define INDICATOR_LED   B5
+#define TX_LED          D5
+#define RX_LED          B0
+
+#define _FN0    1
+#define _ML1    2
+#define _CL0    3
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    [0] = LAYOUT(/* Base */
+                 TD(TAPPY_KEY),KC_HOME, KC_PGUP,
+                 KC_DEL,    KC_END,     KC_PGDN,
+                 
+                            KC_UP,
+                 KC_LEFT,   KC_DOWN,    KC_RIGHT),
+    [_FN0] = LAYOUT(/* function layer */
+                 KC_TRNS,   KC_PAUS,    KC_VOLU,
+                 KC_ENTER,  KC_SLCK,    KC_VOLD,
+                 
+                            KC_TRNS,
+                 KC_TRNS,   KC_TRNS,    KC_TRNS),
+    [_ML1] = LAYOUT(/* media function layer on double tap */
+                 KC_TRNS,   KC_TRNS,    KC_VOLU, 
+                 KC_MUTE,   KC_TRNS,    KC_VOLD,
+                 
+                            KC_SPC,
+                 KC_MRWD,   KC_MPLY,    KC_MFFD),
+    [_CL0] = LAYOUT(/* control layer on single tap */
+                 KC_TRNS,   KC_TRNS,    KC_TRNS,
+                 KC_TRNS,   KC_TRNS,    KC_TRNS,
+
+                                LCTL(KC_UP),
+                 LCTL(KC_LEFT), LCTL(KC_DOWN), LCTL(KC_RIGHT) ),
+};
+
+void matrix_init_user(void) {
+    //init the Pro Micro on-board LEDs
+    setPinOutput(TX_LED);
+    setPinOutput(RX_LED);
+    //set to off
+    writePinHigh(TX_LED);
+    writePinHigh(RX_LED);
+}
+
+//determine the current tap dance state
+int cur_dance (qk_tap_dance_state_t *state){
+    if(state->count == 1){
+        //if a tap was registered
+        if(!state->pressed){
+            //if not still pressed, then was a single tap
+            return SINGLE_TAP;
+        } else {
+            //if still pressed/held down, then it's a single hold
+            return SINGLE_HOLD;
+        }
+    } else if(state->count == 2){
+        //if tapped twice, set to double tap
+        return DOUBLE_TAP;
+    } else if(state->count == 3){
+        //if tapped thrice, set to triple tap
+        return TRIPLE_TAP;
+    } else {
+        return 8;
+    }
+}
+
+
+//initialize the tap structure for the tap key
+static tap tk_tap_state = {
+    .is_press_action = true,
+    .state = 0
+};
+
+//functions that control what our tap dance key does
+void tk_finished(qk_tap_dance_state_t *state, void *user_data){
+    tk_tap_state.state = cur_dance(state);
+    switch(tk_tap_state.state){
+        case SINGLE_TAP:
+            //toggle desired layer when tapped:
+            if(layer_state_is(_CL0)){
+                //if already active, toggle it to off
+                layer_off(_CL0);
+                //turn off LEDs
+                writePinHigh(TX_LED);
+                writePinHigh(RX_LED);
+            } else {
+                //turn on the command layer
+                layer_on(_CL0);
+                //turn on the LEDs
+                writePinLow(TX_LED);
+                writePinLow(RX_LED);
+            }
+            break;
+        case SINGLE_HOLD:
+            //set to desired layer when held:
+            //setting to the function layer
+            layer_on(_FN0);
+            break;
+        case DOUBLE_TAP:
+            //set to desired layer when double tapped:
+            //setting to the media layer
+            if(layer_state_is(_ML1)){
+                //if already active, toggle it to off
+                layer_off(_ML1);
+                //turn off the indicator LED
+                //set LED HI to turn it off
+                writePinHigh(INDICATOR_LED);
+            } else {
+                //turn on the media layer
+                layer_on(_ML1);
+                //turn on the indicator LED
+                //set LED pin to LOW to turn it on
+                writePinLow(INDICATOR_LED);
+            }
+            break;
+        case TRIPLE_TAP:
+            //reset all layers
+            layer_clear();
+            //set all LEDs off
+            writePinHigh(TX_LED);
+            writePinHigh(RX_LED);
+            writePinHigh(INDICATOR_LED);
+            break;
+    }
+}
+
+void tk_reset(qk_tap_dance_state_t *state, void *user_data){
+    //if held and released, leave the layer
+    if(tk_tap_state.state == SINGLE_HOLD){
+        layer_off(_FN0);
+    }
+    //reset the state
+    tk_tap_state.state = 0; 
+}
+
+
+//associate the tap dance key with its functionality
+qk_tap_dance_action_t tap_dance_actions[] = {
+    [TAPPY_KEY] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, tk_finished, tk_reset, 275)
+};
diff --git a/keyboards/navi10/keymaps/emdarcher/readme.md b/keyboards/navi10/keymaps/emdarcher/readme.md
new file mode 100644
index 0000000000..b4ae6d75ff
--- /dev/null
+++ b/keyboards/navi10/keymaps/emdarcher/readme.md
@@ -0,0 +1,16 @@
+# emdarcher's keymap for the Navi10
+
+This is my personal keymap for the Navi10, developed for the original Rev0 prototype. It uses Tap Dance extensively on the INSERT key to access different layers.
+
+- Base Layer: 
+  * Regular Navigation Cluster except for the INSERT key which is for tapping.
+- Hold Insert -> Function Layer: 
+  * Maps Volume Control on PgUp/PgDN, Pause/Scroll-Lock on Home/End (MacOS brightness), and Delete to Enter. 
+- 2 Taps -> Media Layer: 
+  * Has mappings for Audio control on MacOS using the arrow keys, PgUp/PgDn, and Delete.
+  * Lights up the Central 3mm indicator LED.
+- 1 Tap -> Control Layer: 
+  * Binds the arrow keys as LCTRL + Arrow Key for use in changing workspaces in MacOS.
+  * Lights the Pro Micro TX/RX LEDs. These are visible through the board if you use clear PCB mount switch bases.
+
+
diff --git a/keyboards/navi10/keymaps/emdarcher/rules.mk b/keyboards/navi10/keymaps/emdarcher/rules.mk
new file mode 100644
index 0000000000..e5ddcae8d9
--- /dev/null
+++ b/keyboards/navi10/keymaps/emdarcher/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/navi10/readme.md b/keyboards/navi10/readme.md
new file mode 100644
index 0000000000..58a94711f2
--- /dev/null
+++ b/keyboards/navi10/readme.md
@@ -0,0 +1,19 @@
+# Navi10 / ナビ10
+
+![navi10](https://i.imgur.com/QpFCMFd.jpg)
+
+A simple and fun navigation cluster macropad with exposed components.
+
+* Keyboard Maintainer: [emdarcher](https://github.com/emdarcher)
+* Hardware Supported: Navi10
+* Hardware Availability: [KeyHive](https://www.keyhive.xyz/)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make navi10:default
+
+Make example for a specific revision (ex. rev2):
+
+    make navi10/rev2: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).
diff --git a/keyboards/navi10/rev0/config.h b/keyboards/navi10/rev0/config.h
new file mode 100644
index 0000000000..23fad9dbc3
--- /dev/null
+++ b/keyboards/navi10/rev0/config.h
@@ -0,0 +1,51 @@
+/*
+Copyright 2019 Ethan Durrant (emdarcher)
+
+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           0xFEED
+#define PRODUCT_ID          0x0000
+#define DEVICE_VER          0x0001
+#define MANUFACTURER        emdarcher
+#define PRODUCT             Navi10
+#define DESCRIPTION         A simple and fun navigation cluster macropad with retro Sci-Fi vibes.
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 3
+
+/* Keyboard Matrix Assignments */
+#define MATRIX_ROW_PINS \
+    { B6, B2, B3, B4 }
+#define MATRIX_COL_PINS \
+    { D1, D0, F6 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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
+
diff --git a/keyboards/navi10/rev0/rev0.c b/keyboards/navi10/rev0/rev0.c
new file mode 100644
index 0000000000..f6c1f362ca
--- /dev/null
+++ b/keyboards/navi10/rev0/rev0.c
@@ -0,0 +1,30 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 "rev0.h"
+
+void matrix_init_kb(void) {
+  // put your keyboard start-up code here
+  // runs once when the firmware starts up
+
+  //set the indicator LED pin to Output
+  setPinOutput(B5);
+  //set HIGH for off.
+  writePinHigh(B5);
+
+  //call any user functions
+  matrix_init_user();
+}
+
diff --git a/keyboards/navi10/rev0/rev0.h b/keyboards/navi10/rev0/rev0.h
new file mode 100644
index 0000000000..b162d14425
--- /dev/null
+++ b/keyboards/navi10/rev0/rev0.h
@@ -0,0 +1,34 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 LAYOUT( \
+    k0, k1, k2, \
+    k3, k4, k5, \
+                \
+        k6, \
+    k7, k8, k9 \
+) \
+{ \
+    {k0, k1, k2}, \
+    {k3, k4, k5}, \
+    {KC_NO, k6, KC_NO}, \
+    {k7, k8, k9}, \
+}
+
+
diff --git a/keyboards/navi10/rev0/rules.mk b/keyboards/navi10/rev0/rules.mk
new file mode 100644
index 0000000000..79950e2a8f
--- /dev/null
+++ b/keyboards/navi10/rev0/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+#   Teensy       halfkay
+#   Pro Micro    caterina
+#   Atmel DFU    atmel-dfu
+#   LUFA DFU     lufa-dfu
+#   QMK DFU      qmk-dfu
+#   ATmega32A    bootloadHID
+#   ATmega328P   USBasp
+BOOTLOADER = caterina
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no        # 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
+MIDI_ENABLE = no            # MIDI support 
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no           # Audio output on port C6
+FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no         # Enable support for HD44780 based LCDs 
diff --git a/keyboards/navi10/rev2/config.h b/keyboards/navi10/rev2/config.h
new file mode 100644
index 0000000000..f739f2ce29
--- /dev/null
+++ b/keyboards/navi10/rev2/config.h
@@ -0,0 +1,51 @@
+/*
+Copyright 2019 Ethan Durrant (emdarcher)
+
+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           0xFEED
+#define PRODUCT_ID          0x0000
+#define DEVICE_VER          0x0002
+#define MANUFACTURER        emdarcher
+#define PRODUCT             Navi10
+#define DESCRIPTION         A simple and fun navigation cluster macropad with exposed components.
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 3
+
+/* Keyboard Matrix Assignments */
+#define MATRIX_ROW_PINS \
+    { B6, B2, B3, B4 }
+#define MATRIX_COL_PINS \
+    { D4, C6, B1 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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
+
diff --git a/keyboards/navi10/rev2/rev2.c b/keyboards/navi10/rev2/rev2.c
new file mode 100644
index 0000000000..fed0e03897
--- /dev/null
+++ b/keyboards/navi10/rev2/rev2.c
@@ -0,0 +1,30 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 "rev2.h"
+
+void matrix_init_kb(void) {
+  // put your keyboard start-up code here
+  // runs once when the firmware starts up
+
+  //set the indicator LED pin to Output
+  setPinOutput(B5);
+  //set HIGH for off.
+  writePinHigh(B5);
+
+  //call any user functions
+  matrix_init_user();
+}
+
diff --git a/keyboards/navi10/rev2/rev2.h b/keyboards/navi10/rev2/rev2.h
new file mode 100644
index 0000000000..b162d14425
--- /dev/null
+++ b/keyboards/navi10/rev2/rev2.h
@@ -0,0 +1,34 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 LAYOUT( \
+    k0, k1, k2, \
+    k3, k4, k5, \
+                \
+        k6, \
+    k7, k8, k9 \
+) \
+{ \
+    {k0, k1, k2}, \
+    {k3, k4, k5}, \
+    {KC_NO, k6, KC_NO}, \
+    {k7, k8, k9}, \
+}
+
+
diff --git a/keyboards/navi10/rev2/rules.mk b/keyboards/navi10/rev2/rules.mk
new file mode 100644
index 0000000000..79950e2a8f
--- /dev/null
+++ b/keyboards/navi10/rev2/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+#   Teensy       halfkay
+#   Pro Micro    caterina
+#   Atmel DFU    atmel-dfu
+#   LUFA DFU     lufa-dfu
+#   QMK DFU      qmk-dfu
+#   ATmega32A    bootloadHID
+#   ATmega328P   USBasp
+BOOTLOADER = caterina
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no        # 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
+MIDI_ENABLE = no            # MIDI support 
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no           # Audio output on port C6
+FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no         # Enable support for HD44780 based LCDs 
diff --git a/keyboards/navi10/rev3/config.h b/keyboards/navi10/rev3/config.h
new file mode 100644
index 0000000000..a203cf73b5
--- /dev/null
+++ b/keyboards/navi10/rev3/config.h
@@ -0,0 +1,51 @@
+/*
+Copyright 2019 Ethan Durrant (emdarcher)
+
+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           0xFEED
+#define PRODUCT_ID          0x0000
+#define DEVICE_VER          0x0003
+#define MANUFACTURER        emdarcher
+#define PRODUCT             Navi10
+#define DESCRIPTION         A simple and fun navigation cluster macropad with exposed components.
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 3
+
+/* Keyboard Matrix Assignments */
+#define MATRIX_ROW_PINS \
+    { B6, B2, B3, B4 }
+#define MATRIX_COL_PINS \
+    { D4, E6, B1 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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
+
diff --git a/keyboards/navi10/rev3/rev3.c b/keyboards/navi10/rev3/rev3.c
new file mode 100644
index 0000000000..2b0355aa36
--- /dev/null
+++ b/keyboards/navi10/rev3/rev3.c
@@ -0,0 +1,30 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 "rev3.h"
+
+void matrix_init_kb(void) {
+  // put your keyboard start-up code here
+  // runs once when the firmware starts up
+
+  //set the indicator LED pin to Output
+  setPinOutput(B5);
+  //set HIGH for off.
+  writePinHigh(B5);
+
+  //call any user functions
+  matrix_init_user();
+}
+
diff --git a/keyboards/navi10/rev3/rev3.h b/keyboards/navi10/rev3/rev3.h
new file mode 100644
index 0000000000..b162d14425
--- /dev/null
+++ b/keyboards/navi10/rev3/rev3.h
@@ -0,0 +1,34 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 LAYOUT( \
+    k0, k1, k2, \
+    k3, k4, k5, \
+                \
+        k6, \
+    k7, k8, k9 \
+) \
+{ \
+    {k0, k1, k2}, \
+    {k3, k4, k5}, \
+    {KC_NO, k6, KC_NO}, \
+    {k7, k8, k9}, \
+}
+
+
diff --git a/keyboards/navi10/rev3/rules.mk b/keyboards/navi10/rev3/rules.mk
new file mode 100644
index 0000000000..b98e7eb2d6
--- /dev/null
+++ b/keyboards/navi10/rev3/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+#   Teensy       halfkay
+#   Pro Micro    caterina
+#   Atmel DFU    atmel-dfu
+#   LUFA DFU     lufa-dfu
+#   QMK DFU      qmk-dfu
+#   ATmega32A    bootloadHID
+#   ATmega328P   USBasp
+BOOTLOADER = caterina
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no        # 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
+MIDI_ENABLE = no            # MIDI support 
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = yes          # Audio output on port C6
+FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no         # Enable support for HD44780 based LCDs 
diff --git a/keyboards/navi10/rules.mk b/keyboards/navi10/rules.mk
new file mode 100644
index 0000000000..cc08312b77
--- /dev/null
+++ b/keyboards/navi10/rules.mk
@@ -0,0 +1 @@
+DEFAULT_FOLDER = navi10/rev3