diff --git a/keyboards/hexboard/1_1/config.h b/keyboards/hexboard/1_1/config.h new file mode 100644 index 00000000000..81266bf10ec --- /dev/null +++ b/keyboards/hexboard/1_1/config.h @@ -0,0 +1,5 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#pragma once + +#define OLED_DISPLAY_128X128 diff --git a/keyboards/hexboard/1_1/info.json b/keyboards/hexboard/1_1/info.json new file mode 100644 index 00000000000..a96f8df0b1d --- /dev/null +++ b/keyboards/hexboard/1_1/info.json @@ -0,0 +1,446 @@ +{ + "matrix_pins": { + "cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15"], + "io_delay": 50, + "rows": ["GP4", "GP5", "GP2", "GP3", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4"] + }, + "rgb_matrix": { + "layout": [ + {"matrix": [0, 0], "x": 130, "y": 3, "flags": 8}, + {"matrix": [0, 1], "x": 242, "y": 12, "flags": 8}, + {"matrix": [0, 2], "x": 242, "y": 18, "flags": 8}, + {"matrix": [0, 3], "x": 242, "y": 24, "flags": 8}, + {"matrix": [0, 4], "x": 242, "y": 30, "flags": 8}, + {"matrix": [0, 5], "x": 242, "y": 36, "flags": 8}, + {"matrix": [0, 6], "x": 242, "y": 42, "flags": 8}, + {"matrix": [0, 7], "x": 242, "y": 48, "flags": 8}, + {"matrix": [0, 8], "x": 242, "y": 54, "flags": 8}, + {"matrix": [0, 9], "x": 242, "y": 60, "flags": 8}, + {"matrix": [1, 0], "x": 224, "y": 9, "flags": 8}, + {"matrix": [1, 1], "x": 224, "y": 15, "flags": 8}, + {"matrix": [1, 2], "x": 224, "y": 21, "flags": 8}, + {"matrix": [1, 3], "x": 224, "y": 27, "flags": 8}, + {"matrix": [1, 4], "x": 224, "y": 33, "flags": 8}, + {"matrix": [1, 5], "x": 224, "y": 39, "flags": 8}, + {"matrix": [1, 6], "x": 224, "y": 45, "flags": 8}, + {"matrix": [1, 7], "x": 224, "y": 51, "flags": 8}, + {"matrix": [1, 8], "x": 224, "y": 57, "flags": 8}, + {"matrix": [1, 9], "x": 224, "y": 64, "flags": 8}, + {"matrix": [2, 0], "x": 112, "y": 0, "flags": 8}, + {"matrix": [2, 1], "x": 205, "y": 12, "flags": 8}, + {"matrix": [2, 2], "x": 205, "y": 18, "flags": 8}, + {"matrix": [2, 3], "x": 205, "y": 24, "flags": 8}, + {"matrix": [2, 4], "x": 205, "y": 30, "flags": 8}, + {"matrix": [2, 5], "x": 205, "y": 36, "flags": 8}, + {"matrix": [2, 6], "x": 205, "y": 42, "flags": 8}, + {"matrix": [2, 7], "x": 205, "y": 48, "flags": 8}, + {"matrix": [2, 8], "x": 205, "y": 54, "flags": 8}, + {"matrix": [2, 9], "x": 205, "y": 60, "flags": 8}, + {"matrix": [3, 0], "x": 186, "y": 9, "flags": 8}, + {"matrix": [3, 1], "x": 186, "y": 15, "flags": 8}, + {"matrix": [3, 2], "x": 186, "y": 21, "flags": 8}, + {"matrix": [3, 3], "x": 186, "y": 27, "flags": 8}, + {"matrix": [3, 4], "x": 186, "y": 33, "flags": 8}, + {"matrix": [3, 5], "x": 186, "y": 39, "flags": 8}, + {"matrix": [3, 6], "x": 186, "y": 45, "flags": 8}, + {"matrix": [3, 7], "x": 186, "y": 51, "flags": 8}, + {"matrix": [3, 8], "x": 186, "y": 57, "flags": 8}, + {"matrix": [3, 9], "x": 186, "y": 64, "flags": 8}, + {"matrix": [4, 0], "x": 93, "y": 3, "flags": 8}, + {"matrix": [4, 1], "x": 168, "y": 12, "flags": 8}, + {"matrix": [4, 2], "x": 168, "y": 18, "flags": 8}, + {"matrix": [4, 3], "x": 168, "y": 24, "flags": 8}, + {"matrix": [4, 4], "x": 168, "y": 30, "flags": 8}, + {"matrix": [4, 5], "x": 168, "y": 36, "flags": 8}, + {"matrix": [4, 6], "x": 168, "y": 42, "flags": 8}, + {"matrix": [4, 7], "x": 168, "y": 48, "flags": 8}, + {"matrix": [4, 8], "x": 168, "y": 54, "flags": 8}, + {"matrix": [4, 9], "x": 168, "y": 60, "flags": 8}, + {"matrix": [5, 0], "x": 149, "y": 9, "flags": 8}, + {"matrix": [5, 1], "x": 149, "y": 15, "flags": 8}, + {"matrix": [5, 2], "x": 149, "y": 21, "flags": 8}, + {"matrix": [5, 3], "x": 149, "y": 27, "flags": 8}, + {"matrix": [5, 4], "x": 149, "y": 33, "flags": 8}, + {"matrix": [5, 5], "x": 149, "y": 39, "flags": 8}, + {"matrix": [5, 6], "x": 149, "y": 45, "flags": 8}, + {"matrix": [5, 7], "x": 149, "y": 51, "flags": 8}, + {"matrix": [5, 8], "x": 149, "y": 57, "flags": 8}, + {"matrix": [5, 9], "x": 149, "y": 64, "flags": 8}, + {"matrix": [6, 0], "x": 74, "y": 0, "flags": 8}, + {"matrix": [6, 1], "x": 130, "y": 12, "flags": 8}, + {"matrix": [6, 2], "x": 130, "y": 18, "flags": 8}, + {"matrix": [6, 3], "x": 130, "y": 24, "flags": 8}, + {"matrix": [6, 4], "x": 130, "y": 30, "flags": 8}, + {"matrix": [6, 5], "x": 130, "y": 36, "flags": 8}, + {"matrix": [6, 6], "x": 130, "y": 42, "flags": 8}, + {"matrix": [6, 7], "x": 130, "y": 48, "flags": 8}, + {"matrix": [6, 8], "x": 130, "y": 54, "flags": 8}, + {"matrix": [6, 9], "x": 130, "y": 60, "flags": 8}, + {"matrix": [7, 0], "x": 112, "y": 9, "flags": 8}, + {"matrix": [7, 1], "x": 112, "y": 15, "flags": 8}, + {"matrix": [7, 2], "x": 112, "y": 21, "flags": 8}, + {"matrix": [7, 3], "x": 112, "y": 27, "flags": 8}, + {"matrix": [7, 4], "x": 112, "y": 33, "flags": 8}, + {"matrix": [7, 5], "x": 112, "y": 39, "flags": 8}, + {"matrix": [7, 6], "x": 112, "y": 45, "flags": 8}, + {"matrix": [7, 7], "x": 112, "y": 51, "flags": 8}, + {"matrix": [7, 8], "x": 112, "y": 57, "flags": 8}, + {"matrix": [7, 9], "x": 112, "y": 64, "flags": 8}, + {"matrix": [8, 0], "x": 56, "y": 3, "flags": 8}, + {"matrix": [8, 1], "x": 93, "y": 12, "flags": 8}, + {"matrix": [8, 2], "x": 93, "y": 18, "flags": 8}, + {"matrix": [8, 3], "x": 93, "y": 24, "flags": 8}, + {"matrix": [8, 4], "x": 93, "y": 30, "flags": 8}, + {"matrix": [8, 5], "x": 93, "y": 36, "flags": 8}, + {"matrix": [8, 6], "x": 93, "y": 42, "flags": 8}, + {"matrix": [8, 7], "x": 93, "y": 48, "flags": 8}, + {"matrix": [8, 8], "x": 93, "y": 54, "flags": 8}, + {"matrix": [8, 9], "x": 93, "y": 60, "flags": 8}, + {"matrix": [9, 0], "x": 74, "y": 9, "flags": 8}, + {"matrix": [9, 1], "x": 74, "y": 15, "flags": 8}, + {"matrix": [9, 2], "x": 74, "y": 21, "flags": 8}, + {"matrix": [9, 3], "x": 74, "y": 27, "flags": 8}, + {"matrix": [9, 4], "x": 74, "y": 33, "flags": 8}, + {"matrix": [9, 5], "x": 74, "y": 39, "flags": 8}, + {"matrix": [9, 6], "x": 74, "y": 45, "flags": 8}, + {"matrix": [9, 7], "x": 74, "y": 51, "flags": 8}, + {"matrix": [9, 8], "x": 74, "y": 57, "flags": 8}, + {"matrix": [9, 9], "x": 74, "y": 64, "flags": 8}, + {"matrix": [10, 0], "x": 37, "y": 0, "flags": 8}, + {"matrix": [10, 1], "x": 56, "y": 12, "flags": 8}, + {"matrix": [10, 2], "x": 56, "y": 18, "flags": 8}, + {"matrix": [10, 3], "x": 56, "y": 24, "flags": 8}, + {"matrix": [10, 4], "x": 56, "y": 30, "flags": 8}, + {"matrix": [10, 5], "x": 56, "y": 36, "flags": 8}, + {"matrix": [10, 6], "x": 56, "y": 42, "flags": 8}, + {"matrix": [10, 7], "x": 56, "y": 48, "flags": 8}, + {"matrix": [10, 8], "x": 56, "y": 54, "flags": 8}, + {"matrix": [10, 9], "x": 56, "y": 60, "flags": 8}, + {"matrix": [11, 0], "x": 37, "y": 9, "flags": 8}, + {"matrix": [11, 1], "x": 37, "y": 15, "flags": 8}, + {"matrix": [11, 2], "x": 37, "y": 21, "flags": 8}, + {"matrix": [11, 3], "x": 37, "y": 27, "flags": 8}, + {"matrix": [11, 4], "x": 37, "y": 33, "flags": 8}, + {"matrix": [11, 5], "x": 37, "y": 39, "flags": 8}, + {"matrix": [11, 6], "x": 37, "y": 45, "flags": 8}, + {"matrix": [11, 7], "x": 37, "y": 51, "flags": 8}, + {"matrix": [11, 8], "x": 37, "y": 57, "flags": 8}, + {"matrix": [11, 9], "x": 37, "y": 64, "flags": 8}, + {"matrix": [12, 0], "x": 18, "y": 3, "flags": 8}, + {"matrix": [12, 1], "x": 18, "y": 12, "flags": 8}, + {"matrix": [12, 2], "x": 18, "y": 18, "flags": 8}, + {"matrix": [12, 3], "x": 18, "y": 24, "flags": 8}, + {"matrix": [12, 4], "x": 18, "y": 30, "flags": 8}, + {"matrix": [12, 5], "x": 18, "y": 36, "flags": 8}, + {"matrix": [12, 6], "x": 18, "y": 42, "flags": 8}, + {"matrix": [12, 7], "x": 18, "y": 48, "flags": 8}, + {"matrix": [12, 8], "x": 18, "y": 54, "flags": 8}, + {"matrix": [12, 9], "x": 18, "y": 60, "flags": 8}, + {"matrix": [13, 0], "x": 0, "y": 9, "flags": 8}, + {"matrix": [13, 1], "x": 0, "y": 15, "flags": 8}, + {"matrix": [13, 2], "x": 0, "y": 21, "flags": 8}, + {"matrix": [13, 3], "x": 0, "y": 27, "flags": 8}, + {"matrix": [13, 4], "x": 0, "y": 33, "flags": 8}, + {"matrix": [13, 5], "x": 0, "y": 39, "flags": 8}, + {"matrix": [13, 6], "x": 0, "y": 45, "flags": 8}, + {"matrix": [13, 7], "x": 0, "y": 51, "flags": 8}, + {"matrix": [13, 8], "x": 0, "y": 57, "flags": 8}, + {"matrix": [13, 9], "x": 0, "y": 64, "flags": 8} + ] + }, + "usb": { + "device_version": "1.1.0", + "pid": "0x6B02", + "vid": "0x575C" + }, + "layouts": { + "LAYOUT_landscape": { + "layout": [ + {"matrix": [10, 0], "x": 2, "y": 0}, + {"matrix": [6, 0], "x": 4, "y": 0}, + {"matrix": [2, 0], "x": 6, "y": 0}, + {"matrix": [12, 0], "x": 1, "y": 0.5}, + {"matrix": [8, 0], "x": 3, "y": 0.5}, + {"matrix": [4, 0], "x": 5, "y": 0.5}, + {"matrix": [0, 0], "x": 7, "y": 0.5}, + {"matrix": [13, 0], "x": 0, "y": 1.5}, + {"matrix": [11, 0], "x": 2, "y": 1.5}, + {"matrix": [9, 0], "x": 4, "y": 1.5}, + {"matrix": [7, 0], "x": 6, "y": 1.5}, + {"matrix": [5, 0], "x": 8, "y": 1.5}, + {"matrix": [3, 0], "x": 10, "y": 1.5}, + {"matrix": [1, 0], "x": 12, "y": 1.5}, + {"matrix": [12, 1], "x": 1, "y": 2}, + {"matrix": [10, 1], "x": 3, "y": 2}, + {"matrix": [8, 1], "x": 5, "y": 2}, + {"matrix": [6, 1], "x": 7, "y": 2}, + {"matrix": [4, 1], "x": 9, "y": 2}, + {"matrix": [2, 1], "x": 11, "y": 2}, + {"matrix": [0, 1], "x": 13, "y": 2}, + {"matrix": [13, 1], "x": 0, "y": 2.5}, + {"matrix": [11, 1], "x": 2, "y": 2.5}, + {"matrix": [9, 1], "x": 4, "y": 2.5}, + {"matrix": [7, 1], "x": 6, "y": 2.5}, + {"matrix": [5, 1], "x": 8, "y": 2.5}, + {"matrix": [3, 1], "x": 10, "y": 2.5}, + {"matrix": [1, 1], "x": 12, "y": 2.5}, + {"matrix": [12, 2], "x": 1, "y": 3}, + {"matrix": [10, 2], "x": 3, "y": 3}, + {"matrix": [8, 2], "x": 5, "y": 3}, + {"matrix": [6, 2], "x": 7, "y": 3}, + {"matrix": [4, 2], "x": 9, "y": 3}, + {"matrix": [2, 2], "x": 11, "y": 3}, + {"matrix": [0, 2], "x": 13, "y": 3}, + {"matrix": [13, 2], "x": 0, "y": 3.5}, + {"matrix": [11, 2], "x": 2, "y": 3.5}, + {"matrix": [9, 2], "x": 4, "y": 3.5}, + {"matrix": [7, 2], "x": 6, "y": 3.5}, + {"matrix": [5, 2], "x": 8, "y": 3.5}, + {"matrix": [3, 2], "x": 10, "y": 3.5}, + {"matrix": [1, 2], "x": 12, "y": 3.5}, + {"matrix": [12, 3], "x": 1, "y": 4}, + {"matrix": [10, 3], "x": 3, "y": 4}, + {"matrix": [8, 3], "x": 5, "y": 4}, + {"matrix": [6, 3], "x": 7, "y": 4}, + {"matrix": [4, 3], "x": 9, "y": 4}, + {"matrix": [2, 3], "x": 11, "y": 4}, + {"matrix": [0, 3], "x": 13, "y": 4}, + {"matrix": [13, 3], "x": 0, "y": 4.5}, + {"matrix": [11, 3], "x": 2, "y": 4.5}, + {"matrix": [9, 3], "x": 4, "y": 4.5}, + {"matrix": [7, 3], "x": 6, "y": 4.5}, + {"matrix": [5, 3], "x": 8, "y": 4.5}, + {"matrix": [3, 3], "x": 10, "y": 4.5}, + {"matrix": [1, 3], "x": 12, "y": 4.5}, + {"matrix": [12, 4], "x": 1, "y": 5}, + {"matrix": [10, 4], "x": 3, "y": 5}, + {"matrix": [8, 4], "x": 5, "y": 5}, + {"matrix": [6, 4], "x": 7, "y": 5}, + {"matrix": [4, 4], "x": 9, "y": 5}, + {"matrix": [2, 4], "x": 11, "y": 5}, + {"matrix": [0, 4], "x": 13, "y": 5}, + {"matrix": [13, 4], "x": 0, "y": 5.5}, + {"matrix": [11, 4], "x": 2, "y": 5.5}, + {"matrix": [9, 4], "x": 4, "y": 5.5}, + {"matrix": [7, 4], "x": 6, "y": 5.5}, + {"matrix": [5, 4], "x": 8, "y": 5.5}, + {"matrix": [3, 4], "x": 10, "y": 5.5}, + {"matrix": [1, 4], "x": 12, "y": 5.5}, + {"matrix": [12, 5], "x": 1, "y": 6}, + {"matrix": [10, 5], "x": 3, "y": 6}, + {"matrix": [8, 5], "x": 5, "y": 6}, + {"matrix": [6, 5], "x": 7, "y": 6}, + {"matrix": [4, 5], "x": 9, "y": 6}, + {"matrix": [2, 5], "x": 11, "y": 6}, + {"matrix": [0, 5], "x": 13, "y": 6}, + {"matrix": [13, 5], "x": 0, "y": 6.5}, + {"matrix": [11, 5], "x": 2, "y": 6.5}, + {"matrix": [9, 5], "x": 4, "y": 6.5}, + {"matrix": [7, 5], "x": 6, "y": 6.5}, + {"matrix": [5, 5], "x": 8, "y": 6.5}, + {"matrix": [3, 5], "x": 10, "y": 6.5}, + {"matrix": [1, 5], "x": 12, "y": 6.5}, + {"matrix": [12, 6], "x": 1, "y": 7}, + {"matrix": [10, 6], "x": 3, "y": 7}, + {"matrix": [8, 6], "x": 5, "y": 7}, + {"matrix": [6, 6], "x": 7, "y": 7}, + {"matrix": [4, 6], "x": 9, "y": 7}, + {"matrix": [2, 6], "x": 11, "y": 7}, + {"matrix": [0, 6], "x": 13, "y": 7}, + {"matrix": [13, 6], "x": 0, "y": 7.5}, + {"matrix": [11, 6], "x": 2, "y": 7.5}, + {"matrix": [9, 6], "x": 4, "y": 7.5}, + {"matrix": [7, 6], "x": 6, "y": 7.5}, + {"matrix": [5, 6], "x": 8, "y": 7.5}, + {"matrix": [3, 6], "x": 10, "y": 7.5}, + {"matrix": [1, 6], "x": 12, "y": 7.5}, + {"matrix": [12, 7], "x": 1, "y": 8}, + {"matrix": [10, 7], "x": 3, "y": 8}, + {"matrix": [8, 7], "x": 5, "y": 8}, + {"matrix": [6, 7], "x": 7, "y": 8}, + {"matrix": [4, 7], "x": 9, "y": 8}, + {"matrix": [2, 7], "x": 11, "y": 8}, + {"matrix": [0, 7], "x": 13, "y": 8}, + {"matrix": [13, 7], "x": 0, "y": 8.5}, + {"matrix": [11, 7], "x": 2, "y": 8.5}, + {"matrix": [9, 7], "x": 4, "y": 8.5}, + {"matrix": [7, 7], "x": 6, "y": 8.5}, + {"matrix": [5, 7], "x": 8, "y": 8.5}, + {"matrix": [3, 7], "x": 10, "y": 8.5}, + {"matrix": [1, 7], "x": 12, "y": 8.5}, + {"matrix": [12, 8], "x": 1, "y": 9}, + {"matrix": [10, 8], "x": 3, "y": 9}, + {"matrix": [8, 8], "x": 5, "y": 9}, + {"matrix": [6, 8], "x": 7, "y": 9}, + {"matrix": [4, 8], "x": 9, "y": 9}, + {"matrix": [2, 8], "x": 11, "y": 9}, + {"matrix": [0, 8], "x": 13, "y": 9}, + {"matrix": [13, 8], "x": 0, "y": 9.5}, + {"matrix": [11, 8], "x": 2, "y": 9.5}, + {"matrix": [9, 8], "x": 4, "y": 9.5}, + {"matrix": [7, 8], "x": 6, "y": 9.5}, + {"matrix": [5, 8], "x": 8, "y": 9.5}, + {"matrix": [3, 8], "x": 10, "y": 9.5}, + {"matrix": [1, 8], "x": 12, "y": 9.5}, + {"matrix": [12, 9], "x": 1, "y": 10}, + {"matrix": [10, 9], "x": 3, "y": 10}, + {"matrix": [8, 9], "x": 5, "y": 10}, + {"matrix": [6, 9], "x": 7, "y": 10}, + {"matrix": [4, 9], "x": 9, "y": 10}, + {"matrix": [2, 9], "x": 11, "y": 10}, + {"matrix": [0, 9], "x": 13, "y": 10}, + {"matrix": [13, 9], "x": 0, "y": 10.5}, + {"matrix": [11, 9], "x": 2, "y": 10.5}, + {"matrix": [9, 9], "x": 4, "y": 10.5}, + {"matrix": [7, 9], "x": 6, "y": 10.5}, + {"matrix": [5, 9], "x": 8, "y": 10.5}, + {"matrix": [3, 9], "x": 10, "y": 10.5}, + {"matrix": [1, 9], "x": 12, "y": 10.5} + ] + }, + "LAYOUT_portrait": { + "layout": [ + {"matrix": [0, 0], "x": 0.5, "y": 6}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6, "y": 0}, + {"matrix": [0, 6], "x": 7, "y": 0}, + {"matrix": [0, 7], "x": 8, "y": 0}, + {"matrix": [0, 8], "x": 9, "y": 0}, + {"matrix": [0, 9], "x": 10, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 1}, + {"matrix": [1, 1], "x": 2.5, "y": 1}, + {"matrix": [1, 2], "x": 3.5, "y": 1}, + {"matrix": [1, 3], "x": 4.5, "y": 1}, + {"matrix": [1, 4], "x": 5.5, "y": 1}, + {"matrix": [1, 5], "x": 6.5, "y": 1}, + {"matrix": [1, 6], "x": 7.5, "y": 1}, + {"matrix": [1, 7], "x": 8.5, "y": 1}, + {"matrix": [1, 8], "x": 9.5, "y": 1}, + {"matrix": [1, 9], "x": 10.5, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 7}, + {"matrix": [2, 1], "x": 2, "y": 2}, + {"matrix": [2, 2], "x": 3, "y": 2}, + {"matrix": [2, 3], "x": 4, "y": 2}, + {"matrix": [2, 4], "x": 5, "y": 2}, + {"matrix": [2, 5], "x": 6, "y": 2}, + {"matrix": [2, 6], "x": 7, "y": 2}, + {"matrix": [2, 7], "x": 8, "y": 2}, + {"matrix": [2, 8], "x": 9, "y": 2}, + {"matrix": [2, 9], "x": 10, "y": 2}, + {"matrix": [3, 0], "x": 1.5, "y": 3}, + {"matrix": [3, 1], "x": 2.5, "y": 3}, + {"matrix": [3, 2], "x": 3.5, "y": 3}, + {"matrix": [3, 3], "x": 4.5, "y": 3}, + {"matrix": [3, 4], "x": 5.5, "y": 3}, + {"matrix": [3, 5], "x": 6.5, "y": 3}, + {"matrix": [3, 6], "x": 7.5, "y": 3}, + {"matrix": [3, 7], "x": 8.5, "y": 3}, + {"matrix": [3, 8], "x": 9.5, "y": 3}, + {"matrix": [3, 9], "x": 10.5, "y": 3}, + {"matrix": [4, 0], "x": 0.5, "y": 8}, + {"matrix": [4, 1], "x": 2, "y": 4}, + {"matrix": [4, 2], "x": 3, "y": 4}, + {"matrix": [4, 3], "x": 4, "y": 4}, + {"matrix": [4, 4], "x": 5, "y": 4}, + {"matrix": [4, 5], "x": 6, "y": 4}, + {"matrix": [4, 6], "x": 7, "y": 4}, + {"matrix": [4, 7], "x": 8, "y": 4}, + {"matrix": [4, 8], "x": 9, "y": 4}, + {"matrix": [4, 9], "x": 10, "y": 4}, + {"matrix": [5, 0], "x": 1.5, "y": 5}, + {"matrix": [5, 1], "x": 2.5, "y": 5}, + {"matrix": [5, 2], "x": 3.5, "y": 5}, + {"matrix": [5, 3], "x": 4.5, "y": 5}, + {"matrix": [5, 4], "x": 5.5, "y": 5}, + {"matrix": [5, 5], "x": 6.5, "y": 5}, + {"matrix": [5, 6], "x": 7.5, "y": 5}, + {"matrix": [5, 7], "x": 8.5, "y": 5}, + {"matrix": [5, 8], "x": 9.5, "y": 5}, + {"matrix": [5, 9], "x": 10.5, "y": 5}, + {"matrix": [6, 0], "x": 0, "y": 9}, + {"matrix": [6, 1], "x": 2, "y": 6}, + {"matrix": [6, 2], "x": 3, "y": 6}, + {"matrix": [6, 3], "x": 4, "y": 6}, + {"matrix": [6, 4], "x": 5, "y": 6}, + {"matrix": [6, 5], "x": 6, "y": 6}, + {"matrix": [6, 6], "x": 7, "y": 6}, + {"matrix": [6, 7], "x": 8, "y": 6}, + {"matrix": [6, 8], "x": 9, "y": 6}, + {"matrix": [6, 9], "x": 10, "y": 6}, + {"matrix": [7, 0], "x": 1.5, "y": 7}, + {"matrix": [7, 1], "x": 2.5, "y": 7}, + {"matrix": [7, 2], "x": 3.5, "y": 7}, + {"matrix": [7, 3], "x": 4.5, "y": 7}, + {"matrix": [7, 4], "x": 5.5, "y": 7}, + {"matrix": [7, 5], "x": 6.5, "y": 7}, + {"matrix": [7, 6], "x": 7.5, "y": 7}, + {"matrix": [7, 7], "x": 8.5, "y": 7}, + {"matrix": [7, 8], "x": 9.5, "y": 7}, + {"matrix": [7, 9], "x": 10.5, "y": 7}, + {"matrix": [8, 0], "x": 0.5, "y": 10}, + {"matrix": [8, 1], "x": 2, "y": 8}, + {"matrix": [8, 2], "x": 3, "y": 8}, + {"matrix": [8, 3], "x": 4, "y": 8}, + {"matrix": [8, 4], "x": 5, "y": 8}, + {"matrix": [8, 5], "x": 6, "y": 8}, + {"matrix": [8, 6], "x": 7, "y": 8}, + {"matrix": [8, 7], "x": 8, "y": 8}, + {"matrix": [8, 8], "x": 9, "y": 8}, + {"matrix": [8, 9], "x": 10, "y": 8}, + {"matrix": [9, 0], "x": 1.5, "y": 9}, + {"matrix": [9, 1], "x": 2.5, "y": 9}, + {"matrix": [9, 2], "x": 3.5, "y": 9}, + {"matrix": [9, 3], "x": 4.5, "y": 9}, + {"matrix": [9, 4], "x": 5.5, "y": 9}, + {"matrix": [9, 5], "x": 6.5, "y": 9}, + {"matrix": [9, 6], "x": 7.5, "y": 9}, + {"matrix": [9, 7], "x": 8.5, "y": 9}, + {"matrix": [9, 8], "x": 9.5, "y": 9}, + {"matrix": [9, 9], "x": 10.5, "y": 9}, + {"matrix": [10, 0], "x": 0, "y": 11}, + {"matrix": [10, 1], "x": 2, "y": 10}, + {"matrix": [10, 2], "x": 3, "y": 10}, + {"matrix": [10, 3], "x": 4, "y": 10}, + {"matrix": [10, 4], "x": 5, "y": 10}, + {"matrix": [10, 5], "x": 6, "y": 10}, + {"matrix": [10, 6], "x": 7, "y": 10}, + {"matrix": [10, 7], "x": 8, "y": 10}, + {"matrix": [10, 8], "x": 9, "y": 10}, + {"matrix": [10, 9], "x": 10, "y": 10}, + {"matrix": [11, 0], "x": 1.5, "y": 11}, + {"matrix": [11, 1], "x": 2.5, "y": 11}, + {"matrix": [11, 2], "x": 3.5, "y": 11}, + {"matrix": [11, 3], "x": 4.5, "y": 11}, + {"matrix": [11, 4], "x": 5.5, "y": 11}, + {"matrix": [11, 5], "x": 6.5, "y": 11}, + {"matrix": [11, 6], "x": 7.5, "y": 11}, + {"matrix": [11, 7], "x": 8.5, "y": 11}, + {"matrix": [11, 8], "x": 9.5, "y": 11}, + {"matrix": [11, 9], "x": 10.5, "y": 11}, + {"matrix": [12, 0], "x": 0.5, "y": 12}, + {"matrix": [12, 1], "x": 2, "y": 12}, + {"matrix": [12, 2], "x": 3, "y": 12}, + {"matrix": [12, 3], "x": 4, "y": 12}, + {"matrix": [12, 4], "x": 5, "y": 12}, + {"matrix": [12, 5], "x": 6, "y": 12}, + {"matrix": [12, 6], "x": 7, "y": 12}, + {"matrix": [12, 7], "x": 8, "y": 12}, + {"matrix": [12, 8], "x": 9, "y": 12}, + {"matrix": [12, 9], "x": 10, "y": 12}, + {"matrix": [13, 0], "x": 1.5, "y": 13}, + {"matrix": [13, 1], "x": 2.5, "y": 13}, + {"matrix": [13, 2], "x": 3.5, "y": 13}, + {"matrix": [13, 3], "x": 4.5, "y": 13}, + {"matrix": [13, 4], "x": 5.5, "y": 13}, + {"matrix": [13, 5], "x": 6.5, "y": 13}, + {"matrix": [13, 6], "x": 7.5, "y": 13}, + {"matrix": [13, 7], "x": 8.5, "y": 13}, + {"matrix": [13, 8], "x": 9.5, "y": 13}, + {"matrix": [13, 9], "x": 10.5, "y": 13} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/hexboard/1_1/rules.mk b/keyboards/hexboard/1_1/rules.mk new file mode 100644 index 00000000000..2cea8539e1b --- /dev/null +++ b/keyboards/hexboard/1_1/rules.mk @@ -0,0 +1,4 @@ +SRC += matrix.c +CUSTOM_MATRIX = lite + +AUDIO_DRIVER = pwm_hardware diff --git a/keyboards/hexboard/config.h b/keyboards/hexboard/config.h new file mode 100644 index 00000000000..47e6a287abb --- /dev/null +++ b/keyboards/hexboard/config.h @@ -0,0 +1,36 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#pragma once + +#define RP2040_FLASH_GENERIC_03H + +// WS2812_BYTE_ORDER defined by revision +#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 +#define RGB_MATRIX_LED_COUNT 140 +#define ENABLE_RGB_MATRIX_SOLID_COLOR +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +#define ENABLE_RGB_MATRIX_BREATHING +// #define ENABLE_RGB_MATRIX_MULTISPLASH +#define ENABLE_RGB_MATRIX_SOLID_SPLASH +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +// #define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS + +#define AUDIO_PIN GP23 +// From the data sheet, pin 23 is PWM3 B +#define AUDIO_PWM_DRIVER PWMD3 +#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_B +#define AUDIO_INIT_DELAY +#define AUDIO_ENABLE_TONE_MULTIPLEXING +#define AUDIO_TONE_MULTIPLEXING_RATE_DEFAULT 50 + +// From the data sheet, pins 16/17 can use I2C0 DA/CL +#define I2C_DRIVER I2CD0 +// (The name of these defines is confusing...) +#define I2C1_SDA_PIN GP16 +#define I2C1_SCL_PIN GP17 +#define OLED_BRIGHTNESS 55 +#define OLED_IC OLED_IC_SH1106 +// OLED_DISPLAY_ defined by revision + +#define ENCODER_DEFAULT_POS 0x3 diff --git a/keyboards/hexboard/dev/config.h b/keyboards/hexboard/dev/config.h new file mode 100644 index 00000000000..c5a5a83da3e --- /dev/null +++ b/keyboards/hexboard/dev/config.h @@ -0,0 +1,11 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#pragma once + +// The dev unit had a different pixel order +#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB + +// The dev unit used a smaller display +#define OLED_DISPLAY_128X64 +// Needs to be shifted over +#define OLED_COLUMN_OFFSET 2 diff --git a/keyboards/hexboard/dev/dev.c b/keyboards/hexboard/dev/dev.c new file mode 100644 index 00000000000..568816dc2e9 --- /dev/null +++ b/keyboards/hexboard/dev/dev.c @@ -0,0 +1,10 @@ +// Copyright 2022-2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only + +#include "quantum.h" + +#ifdef OLED_ENABLE +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + return OLED_ROTATION_180; +} +#endif diff --git a/keyboards/hexboard/dev/info.json b/keyboards/hexboard/dev/info.json new file mode 100644 index 00000000000..08963a35f48 --- /dev/null +++ b/keyboards/hexboard/dev/info.json @@ -0,0 +1,446 @@ +{ + "matrix_pins": { + "cols": ["GP14", "GP15", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6"], + "io_delay": 50, + "rows": ["GP4", "GP5", "GP2", "GP3", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4", "GP4"] + }, + "rgb_matrix": { + "layout": [ + {"matrix": [0, 0], "x": 224, "y": 64, "flags": 8}, + {"matrix": [0, 1], "x": 224, "y": 57, "flags": 8}, + {"matrix": [0, 2], "x": 224, "y": 51, "flags": 8}, + {"matrix": [0, 3], "x": 224, "y": 45, "flags": 8}, + {"matrix": [0, 4], "x": 224, "y": 39, "flags": 8}, + {"matrix": [0, 5], "x": 224, "y": 33, "flags": 8}, + {"matrix": [0, 6], "x": 224, "y": 27, "flags": 8}, + {"matrix": [0, 7], "x": 224, "y": 21, "flags": 8}, + {"matrix": [0, 8], "x": 224, "y": 15, "flags": 8}, + {"matrix": [0, 9], "x": 120, "y": 3, "flags": 8}, + {"matrix": [1, 0], "x": 206, "y": 67, "flags": 8}, + {"matrix": [1, 1], "x": 206, "y": 60, "flags": 8}, + {"matrix": [1, 2], "x": 206, "y": 54, "flags": 8}, + {"matrix": [1, 3], "x": 206, "y": 48, "flags": 8}, + {"matrix": [1, 4], "x": 206, "y": 42, "flags": 8}, + {"matrix": [1, 5], "x": 206, "y": 36, "flags": 8}, + {"matrix": [1, 6], "x": 206, "y": 30, "flags": 8}, + {"matrix": [1, 7], "x": 206, "y": 24, "flags": 8}, + {"matrix": [1, 8], "x": 206, "y": 18, "flags": 8}, + {"matrix": [1, 9], "x": 206, "y": 12, "flags": 8}, + {"matrix": [2, 0], "x": 189, "y": 64, "flags": 8}, + {"matrix": [2, 1], "x": 189, "y": 57, "flags": 8}, + {"matrix": [2, 2], "x": 189, "y": 51, "flags": 8}, + {"matrix": [2, 3], "x": 189, "y": 45, "flags": 8}, + {"matrix": [2, 4], "x": 189, "y": 39, "flags": 8}, + {"matrix": [2, 5], "x": 189, "y": 33, "flags": 8}, + {"matrix": [2, 6], "x": 189, "y": 27, "flags": 8}, + {"matrix": [2, 7], "x": 189, "y": 21, "flags": 8}, + {"matrix": [2, 8], "x": 189, "y": 15, "flags": 8}, + {"matrix": [2, 9], "x": 103, "y": 0, "flags": 8}, + {"matrix": [3, 0], "x": 172, "y": 67, "flags": 8}, + {"matrix": [3, 1], "x": 172, "y": 60, "flags": 8}, + {"matrix": [3, 2], "x": 172, "y": 54, "flags": 8}, + {"matrix": [3, 3], "x": 172, "y": 48, "flags": 8}, + {"matrix": [3, 4], "x": 172, "y": 42, "flags": 8}, + {"matrix": [3, 5], "x": 172, "y": 36, "flags": 8}, + {"matrix": [3, 6], "x": 172, "y": 30, "flags": 8}, + {"matrix": [3, 7], "x": 172, "y": 24, "flags": 8}, + {"matrix": [3, 8], "x": 172, "y": 18, "flags": 8}, + {"matrix": [3, 9], "x": 172, "y": 12, "flags": 8}, + {"matrix": [4, 0], "x": 155, "y": 64, "flags": 8}, + {"matrix": [4, 1], "x": 155, "y": 57, "flags": 8}, + {"matrix": [4, 2], "x": 155, "y": 51, "flags": 8}, + {"matrix": [4, 3], "x": 155, "y": 45, "flags": 8}, + {"matrix": [4, 4], "x": 155, "y": 39, "flags": 8}, + {"matrix": [4, 5], "x": 155, "y": 33, "flags": 8}, + {"matrix": [4, 6], "x": 155, "y": 27, "flags": 8}, + {"matrix": [4, 7], "x": 155, "y": 21, "flags": 8}, + {"matrix": [4, 8], "x": 155, "y": 15, "flags": 8}, + {"matrix": [4, 9], "x": 86, "y": 3, "flags": 8}, + {"matrix": [5, 0], "x": 137, "y": 67, "flags": 8}, + {"matrix": [5, 1], "x": 137, "y": 60, "flags": 8}, + {"matrix": [5, 2], "x": 137, "y": 54, "flags": 8}, + {"matrix": [5, 3], "x": 137, "y": 48, "flags": 8}, + {"matrix": [5, 4], "x": 137, "y": 42, "flags": 8}, + {"matrix": [5, 5], "x": 137, "y": 36, "flags": 8}, + {"matrix": [5, 6], "x": 137, "y": 30, "flags": 8}, + {"matrix": [5, 7], "x": 137, "y": 24, "flags": 8}, + {"matrix": [5, 8], "x": 137, "y": 18, "flags": 8}, + {"matrix": [5, 9], "x": 137, "y": 12, "flags": 8}, + {"matrix": [6, 0], "x": 120, "y": 64, "flags": 8}, + {"matrix": [6, 1], "x": 120, "y": 57, "flags": 8}, + {"matrix": [6, 2], "x": 120, "y": 51, "flags": 8}, + {"matrix": [6, 3], "x": 120, "y": 45, "flags": 8}, + {"matrix": [6, 4], "x": 120, "y": 39, "flags": 8}, + {"matrix": [6, 5], "x": 120, "y": 33, "flags": 8}, + {"matrix": [6, 6], "x": 120, "y": 27, "flags": 8}, + {"matrix": [6, 7], "x": 120, "y": 21, "flags": 8}, + {"matrix": [6, 8], "x": 120, "y": 15, "flags": 8}, + {"matrix": [6, 9], "x": 68, "y": 0, "flags": 8}, + {"matrix": [7, 0], "x": 103, "y": 67, "flags": 8}, + {"matrix": [7, 1], "x": 103, "y": 60, "flags": 8}, + {"matrix": [7, 2], "x": 103, "y": 54, "flags": 8}, + {"matrix": [7, 3], "x": 103, "y": 48, "flags": 8}, + {"matrix": [7, 4], "x": 103, "y": 42, "flags": 8}, + {"matrix": [7, 5], "x": 103, "y": 36, "flags": 8}, + {"matrix": [7, 6], "x": 103, "y": 30, "flags": 8}, + {"matrix": [7, 7], "x": 103, "y": 24, "flags": 8}, + {"matrix": [7, 8], "x": 103, "y": 18, "flags": 8}, + {"matrix": [7, 9], "x": 103, "y": 12, "flags": 8}, + {"matrix": [8, 0], "x": 86, "y": 64, "flags": 8}, + {"matrix": [8, 1], "x": 86, "y": 57, "flags": 8}, + {"matrix": [8, 2], "x": 86, "y": 51, "flags": 8}, + {"matrix": [8, 3], "x": 86, "y": 45, "flags": 8}, + {"matrix": [8, 4], "x": 86, "y": 39, "flags": 8}, + {"matrix": [8, 5], "x": 86, "y": 33, "flags": 8}, + {"matrix": [8, 6], "x": 86, "y": 27, "flags": 8}, + {"matrix": [8, 7], "x": 86, "y": 21, "flags": 8}, + {"matrix": [8, 8], "x": 86, "y": 15, "flags": 8}, + {"matrix": [8, 9], "x": 51, "y": 3, "flags": 8}, + {"matrix": [9, 0], "x": 68, "y": 67, "flags": 8}, + {"matrix": [9, 1], "x": 68, "y": 60, "flags": 8}, + {"matrix": [9, 2], "x": 68, "y": 54, "flags": 8}, + {"matrix": [9, 3], "x": 68, "y": 48, "flags": 8}, + {"matrix": [9, 4], "x": 68, "y": 42, "flags": 8}, + {"matrix": [9, 5], "x": 68, "y": 36, "flags": 8}, + {"matrix": [9, 6], "x": 68, "y": 30, "flags": 8}, + {"matrix": [9, 7], "x": 68, "y": 24, "flags": 8}, + {"matrix": [9, 8], "x": 68, "y": 18, "flags": 8}, + {"matrix": [9, 9], "x": 68, "y": 12, "flags": 8}, + {"matrix": [10, 0], "x": 51, "y": 64, "flags": 8}, + {"matrix": [10, 1], "x": 51, "y": 57, "flags": 8}, + {"matrix": [10, 2], "x": 51, "y": 51, "flags": 8}, + {"matrix": [10, 3], "x": 51, "y": 45, "flags": 8}, + {"matrix": [10, 4], "x": 51, "y": 39, "flags": 8}, + {"matrix": [10, 5], "x": 51, "y": 33, "flags": 8}, + {"matrix": [10, 6], "x": 51, "y": 27, "flags": 8}, + {"matrix": [10, 7], "x": 51, "y": 21, "flags": 8}, + {"matrix": [10, 8], "x": 51, "y": 15, "flags": 8}, + {"matrix": [10, 9], "x": 34, "y": 0, "flags": 8}, + {"matrix": [11, 0], "x": 34, "y": 67, "flags": 8}, + {"matrix": [11, 1], "x": 34, "y": 60, "flags": 8}, + {"matrix": [11, 2], "x": 34, "y": 54, "flags": 8}, + {"matrix": [11, 3], "x": 34, "y": 48, "flags": 8}, + {"matrix": [11, 4], "x": 34, "y": 42, "flags": 8}, + {"matrix": [11, 5], "x": 34, "y": 36, "flags": 8}, + {"matrix": [11, 6], "x": 34, "y": 30, "flags": 8}, + {"matrix": [11, 7], "x": 34, "y": 24, "flags": 8}, + {"matrix": [11, 8], "x": 34, "y": 18, "flags": 8}, + {"matrix": [11, 9], "x": 34, "y": 12, "flags": 8}, + {"matrix": [12, 0], "x": 17, "y": 64, "flags": 8}, + {"matrix": [12, 1], "x": 17, "y": 57, "flags": 8}, + {"matrix": [12, 2], "x": 17, "y": 51, "flags": 8}, + {"matrix": [12, 3], "x": 17, "y": 45, "flags": 8}, + {"matrix": [12, 4], "x": 17, "y": 39, "flags": 8}, + {"matrix": [12, 5], "x": 17, "y": 33, "flags": 8}, + {"matrix": [12, 6], "x": 17, "y": 27, "flags": 8}, + {"matrix": [12, 7], "x": 17, "y": 21, "flags": 8}, + {"matrix": [12, 8], "x": 17, "y": 15, "flags": 8}, + {"matrix": [12, 9], "x": 17, "y": 3, "flags": 8}, + {"matrix": [13, 0], "x": 0, "y": 67, "flags": 8}, + {"matrix": [13, 1], "x": 0, "y": 60, "flags": 8}, + {"matrix": [13, 2], "x": 0, "y": 54, "flags": 8}, + {"matrix": [13, 3], "x": 0, "y": 48, "flags": 8}, + {"matrix": [13, 4], "x": 0, "y": 42, "flags": 8}, + {"matrix": [13, 5], "x": 0, "y": 36, "flags": 8}, + {"matrix": [13, 6], "x": 0, "y": 30, "flags": 8}, + {"matrix": [13, 7], "x": 0, "y": 24, "flags": 8}, + {"matrix": [13, 8], "x": 0, "y": 18, "flags": 8}, + {"matrix": [13, 9], "x": 0, "y": 12, "flags": 8} + ] + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x6B01", + "vid": "0x575C" + }, + "layouts": { + "LAYOUT_landscape": { + "layout": [ + {"matrix": [10, 9], "x": 2, "y": 0}, + {"matrix": [6, 9], "x": 4, "y": 0}, + {"matrix": [2, 9], "x": 6, "y": 0}, + {"matrix": [12, 9], "x": 1, "y": 0.5}, + {"matrix": [8, 9], "x": 3, "y": 0.5}, + {"matrix": [4, 9], "x": 5, "y": 0.5}, + {"matrix": [0, 9], "x": 7, "y": 0.5}, + {"matrix": [13, 9], "x": 0, "y": 2}, + {"matrix": [11, 9], "x": 2, "y": 2}, + {"matrix": [9, 9], "x": 4, "y": 2}, + {"matrix": [7, 9], "x": 6, "y": 2}, + {"matrix": [5, 9], "x": 8, "y": 2}, + {"matrix": [3, 9], "x": 10, "y": 2}, + {"matrix": [1, 9], "x": 12, "y": 2}, + {"matrix": [12, 8], "x": 1, "y": 2.5}, + {"matrix": [10, 8], "x": 3, "y": 2.5}, + {"matrix": [8, 8], "x": 5, "y": 2.5}, + {"matrix": [6, 8], "x": 7, "y": 2.5}, + {"matrix": [4, 8], "x": 9, "y": 2.5}, + {"matrix": [2, 8], "x": 11, "y": 2.5}, + {"matrix": [0, 8], "x": 13, "y": 2.5}, + {"matrix": [13, 8], "x": 0, "y": 3}, + {"matrix": [11, 8], "x": 2, "y": 3}, + {"matrix": [9, 8], "x": 4, "y": 3}, + {"matrix": [7, 8], "x": 6, "y": 3}, + {"matrix": [5, 8], "x": 8, "y": 3}, + {"matrix": [3, 8], "x": 10, "y": 3}, + {"matrix": [1, 8], "x": 12, "y": 3}, + {"matrix": [12, 7], "x": 1, "y": 3.5}, + {"matrix": [10, 7], "x": 3, "y": 3.5}, + {"matrix": [8, 7], "x": 5, "y": 3.5}, + {"matrix": [6, 7], "x": 7, "y": 3.5}, + {"matrix": [4, 7], "x": 9, "y": 3.5}, + {"matrix": [2, 7], "x": 11, "y": 3.5}, + {"matrix": [0, 7], "x": 13, "y": 3.5}, + {"matrix": [13, 7], "x": 0, "y": 4}, + {"matrix": [11, 7], "x": 2, "y": 4}, + {"matrix": [9, 7], "x": 4, "y": 4}, + {"matrix": [7, 7], "x": 6, "y": 4}, + {"matrix": [5, 7], "x": 8, "y": 4}, + {"matrix": [3, 7], "x": 10, "y": 4}, + {"matrix": [1, 7], "x": 12, "y": 4}, + {"matrix": [12, 6], "x": 1, "y": 4.5}, + {"matrix": [10, 6], "x": 3, "y": 4.5}, + {"matrix": [8, 6], "x": 5, "y": 4.5}, + {"matrix": [6, 6], "x": 7, "y": 4.5}, + {"matrix": [4, 6], "x": 9, "y": 4.5}, + {"matrix": [2, 6], "x": 11, "y": 4.5}, + {"matrix": [0, 6], "x": 13, "y": 4.5}, + {"matrix": [13, 6], "x": 0, "y": 5}, + {"matrix": [11, 6], "x": 2, "y": 5}, + {"matrix": [9, 6], "x": 4, "y": 5}, + {"matrix": [7, 6], "x": 6, "y": 5}, + {"matrix": [5, 6], "x": 8, "y": 5}, + {"matrix": [3, 6], "x": 10, "y": 5}, + {"matrix": [1, 6], "x": 12, "y": 5}, + {"matrix": [12, 5], "x": 1, "y": 5.5}, + {"matrix": [10, 5], "x": 3, "y": 5.5}, + {"matrix": [8, 5], "x": 5, "y": 5.5}, + {"matrix": [6, 5], "x": 7, "y": 5.5}, + {"matrix": [4, 5], "x": 9, "y": 5.5}, + {"matrix": [2, 5], "x": 11, "y": 5.5}, + {"matrix": [0, 5], "x": 13, "y": 5.5}, + {"matrix": [13, 5], "x": 0, "y": 6}, + {"matrix": [11, 5], "x": 2, "y": 6}, + {"matrix": [9, 5], "x": 4, "y": 6}, + {"matrix": [7, 5], "x": 6, "y": 6}, + {"matrix": [5, 5], "x": 8, "y": 6}, + {"matrix": [3, 5], "x": 10, "y": 6}, + {"matrix": [1, 5], "x": 12, "y": 6}, + {"matrix": [12, 4], "x": 1, "y": 6.5}, + {"matrix": [10, 4], "x": 3, "y": 6.5}, + {"matrix": [8, 4], "x": 5, "y": 6.5}, + {"matrix": [6, 4], "x": 7, "y": 6.5}, + {"matrix": [4, 4], "x": 9, "y": 6.5}, + {"matrix": [2, 4], "x": 11, "y": 6.5}, + {"matrix": [0, 4], "x": 13, "y": 6.5}, + {"matrix": [13, 4], "x": 0, "y": 7}, + {"matrix": [11, 4], "x": 2, "y": 7}, + {"matrix": [9, 4], "x": 4, "y": 7}, + {"matrix": [7, 4], "x": 6, "y": 7}, + {"matrix": [5, 4], "x": 8, "y": 7}, + {"matrix": [3, 4], "x": 10, "y": 7}, + {"matrix": [1, 4], "x": 12, "y": 7}, + {"matrix": [12, 3], "x": 1, "y": 7.5}, + {"matrix": [10, 3], "x": 3, "y": 7.5}, + {"matrix": [8, 3], "x": 5, "y": 7.5}, + {"matrix": [6, 3], "x": 7, "y": 7.5}, + {"matrix": [4, 3], "x": 9, "y": 7.5}, + {"matrix": [2, 3], "x": 11, "y": 7.5}, + {"matrix": [0, 3], "x": 13, "y": 7.5}, + {"matrix": [13, 3], "x": 0, "y": 8}, + {"matrix": [11, 3], "x": 2, "y": 8}, + {"matrix": [9, 3], "x": 4, "y": 8}, + {"matrix": [7, 3], "x": 6, "y": 8}, + {"matrix": [5, 3], "x": 8, "y": 8}, + {"matrix": [3, 3], "x": 10, "y": 8}, + {"matrix": [1, 3], "x": 12, "y": 8}, + {"matrix": [12, 2], "x": 1, "y": 8.5}, + {"matrix": [10, 2], "x": 3, "y": 8.5}, + {"matrix": [8, 2], "x": 5, "y": 8.5}, + {"matrix": [6, 2], "x": 7, "y": 8.5}, + {"matrix": [4, 2], "x": 9, "y": 8.5}, + {"matrix": [2, 2], "x": 11, "y": 8.5}, + {"matrix": [0, 2], "x": 13, "y": 8.5}, + {"matrix": [13, 2], "x": 0, "y": 9}, + {"matrix": [11, 2], "x": 2, "y": 9}, + {"matrix": [9, 2], "x": 4, "y": 9}, + {"matrix": [7, 2], "x": 6, "y": 9}, + {"matrix": [5, 2], "x": 8, "y": 9}, + {"matrix": [3, 2], "x": 10, "y": 9}, + {"matrix": [1, 2], "x": 12, "y": 9}, + {"matrix": [12, 1], "x": 1, "y": 9.5}, + {"matrix": [10, 1], "x": 3, "y": 9.5}, + {"matrix": [8, 1], "x": 5, "y": 9.5}, + {"matrix": [6, 1], "x": 7, "y": 9.5}, + {"matrix": [4, 1], "x": 9, "y": 9.5}, + {"matrix": [2, 1], "x": 11, "y": 9.5}, + {"matrix": [0, 1], "x": 13, "y": 9.5}, + {"matrix": [13, 1], "x": 0, "y": 10}, + {"matrix": [11, 1], "x": 2, "y": 10}, + {"matrix": [9, 1], "x": 4, "y": 10}, + {"matrix": [7, 1], "x": 6, "y": 10}, + {"matrix": [5, 1], "x": 8, "y": 10}, + {"matrix": [3, 1], "x": 10, "y": 10}, + {"matrix": [1, 1], "x": 12, "y": 10}, + {"matrix": [12, 0], "x": 1, "y": 10.5}, + {"matrix": [10, 0], "x": 3, "y": 10.5}, + {"matrix": [8, 0], "x": 5, "y": 10.5}, + {"matrix": [6, 0], "x": 7, "y": 10.5}, + {"matrix": [4, 0], "x": 9, "y": 10.5}, + {"matrix": [2, 0], "x": 11, "y": 10.5}, + {"matrix": [0, 0], "x": 13, "y": 10.5}, + {"matrix": [13, 0], "x": 0, "y": 11}, + {"matrix": [11, 0], "x": 2, "y": 11}, + {"matrix": [9, 0], "x": 4, "y": 11}, + {"matrix": [7, 0], "x": 6, "y": 11}, + {"matrix": [5, 0], "x": 8, "y": 11}, + {"matrix": [3, 0], "x": 10, "y": 11}, + {"matrix": [1, 0], "x": 12, "y": 11} + ] + }, + "LAYOUT_portrait": { + "layout": [ + {"matrix": [0, 9], "x": 0.5, "y": 6}, + {"matrix": [0, 8], "x": 2.5, "y": 0}, + {"matrix": [0, 7], "x": 3.5, "y": 0}, + {"matrix": [0, 6], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 2], "x": 8.5, "y": 0}, + {"matrix": [0, 1], "x": 9.5, "y": 0}, + {"matrix": [0, 0], "x": 10.5, "y": 0}, + {"matrix": [1, 9], "x": 2, "y": 1}, + {"matrix": [1, 8], "x": 3, "y": 1}, + {"matrix": [1, 7], "x": 4, "y": 1}, + {"matrix": [1, 6], "x": 5, "y": 1}, + {"matrix": [1, 5], "x": 6, "y": 1}, + {"matrix": [1, 4], "x": 7, "y": 1}, + {"matrix": [1, 3], "x": 8, "y": 1}, + {"matrix": [1, 2], "x": 9, "y": 1}, + {"matrix": [1, 1], "x": 10, "y": 1}, + {"matrix": [1, 0], "x": 11, "y": 1}, + {"matrix": [2, 9], "x": 0, "y": 7}, + {"matrix": [2, 8], "x": 2.5, "y": 2}, + {"matrix": [2, 7], "x": 3.5, "y": 2}, + {"matrix": [2, 6], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 4], "x": 6.5, "y": 2}, + {"matrix": [2, 3], "x": 7.5, "y": 2}, + {"matrix": [2, 2], "x": 8.5, "y": 2}, + {"matrix": [2, 1], "x": 9.5, "y": 2}, + {"matrix": [2, 0], "x": 10.5, "y": 2}, + {"matrix": [3, 9], "x": 2, "y": 3}, + {"matrix": [3, 8], "x": 3, "y": 3}, + {"matrix": [3, 7], "x": 4, "y": 3}, + {"matrix": [3, 6], "x": 5, "y": 3}, + {"matrix": [3, 5], "x": 6, "y": 3}, + {"matrix": [3, 4], "x": 7, "y": 3}, + {"matrix": [3, 3], "x": 8, "y": 3}, + {"matrix": [3, 2], "x": 9, "y": 3}, + {"matrix": [3, 1], "x": 10, "y": 3}, + {"matrix": [3, 0], "x": 11, "y": 3}, + {"matrix": [4, 9], "x": 0.5, "y": 8}, + {"matrix": [4, 8], "x": 2.5, "y": 4}, + {"matrix": [4, 7], "x": 3.5, "y": 4}, + {"matrix": [4, 6], "x": 4.5, "y": 4}, + {"matrix": [4, 5], "x": 5.5, "y": 4}, + {"matrix": [4, 4], "x": 6.5, "y": 4}, + {"matrix": [4, 3], "x": 7.5, "y": 4}, + {"matrix": [4, 2], "x": 8.5, "y": 4}, + {"matrix": [4, 1], "x": 9.5, "y": 4}, + {"matrix": [4, 0], "x": 10.5, "y": 4}, + {"matrix": [5, 9], "x": 2, "y": 5}, + {"matrix": [5, 8], "x": 3, "y": 5}, + {"matrix": [5, 7], "x": 4, "y": 5}, + {"matrix": [5, 6], "x": 5, "y": 5}, + {"matrix": [5, 5], "x": 6, "y": 5}, + {"matrix": [5, 4], "x": 7, "y": 5}, + {"matrix": [5, 3], "x": 8, "y": 5}, + {"matrix": [5, 2], "x": 9, "y": 5}, + {"matrix": [5, 1], "x": 10, "y": 5}, + {"matrix": [5, 0], "x": 11, "y": 5}, + {"matrix": [6, 9], "x": 0, "y": 9}, + {"matrix": [6, 8], "x": 2.5, "y": 6}, + {"matrix": [6, 7], "x": 3.5, "y": 6}, + {"matrix": [6, 6], "x": 4.5, "y": 6}, + {"matrix": [6, 5], "x": 5.5, "y": 6}, + {"matrix": [6, 4], "x": 6.5, "y": 6}, + {"matrix": [6, 3], "x": 7.5, "y": 6}, + {"matrix": [6, 2], "x": 8.5, "y": 6}, + {"matrix": [6, 1], "x": 9.5, "y": 6}, + {"matrix": [6, 0], "x": 10.5, "y": 6}, + {"matrix": [7, 9], "x": 2, "y": 7}, + {"matrix": [7, 8], "x": 3, "y": 7}, + {"matrix": [7, 7], "x": 4, "y": 7}, + {"matrix": [7, 6], "x": 5, "y": 7}, + {"matrix": [7, 5], "x": 6, "y": 7}, + {"matrix": [7, 4], "x": 7, "y": 7}, + {"matrix": [7, 3], "x": 8, "y": 7}, + {"matrix": [7, 2], "x": 9, "y": 7}, + {"matrix": [7, 1], "x": 10, "y": 7}, + {"matrix": [7, 0], "x": 11, "y": 7}, + {"matrix": [8, 9], "x": 0.5, "y": 10}, + {"matrix": [8, 8], "x": 2.5, "y": 8}, + {"matrix": [8, 7], "x": 3.5, "y": 8}, + {"matrix": [8, 6], "x": 4.5, "y": 8}, + {"matrix": [8, 5], "x": 5.5, "y": 8}, + {"matrix": [8, 4], "x": 6.5, "y": 8}, + {"matrix": [8, 3], "x": 7.5, "y": 8}, + {"matrix": [8, 2], "x": 8.5, "y": 8}, + {"matrix": [8, 1], "x": 9.5, "y": 8}, + {"matrix": [8, 0], "x": 10.5, "y": 8}, + {"matrix": [9, 9], "x": 2, "y": 9}, + {"matrix": [9, 8], "x": 3, "y": 9}, + {"matrix": [9, 7], "x": 4, "y": 9}, + {"matrix": [9, 6], "x": 5, "y": 9}, + {"matrix": [9, 5], "x": 6, "y": 9}, + {"matrix": [9, 4], "x": 7, "y": 9}, + {"matrix": [9, 3], "x": 8, "y": 9}, + {"matrix": [9, 2], "x": 9, "y": 9}, + {"matrix": [9, 1], "x": 10, "y": 9}, + {"matrix": [9, 0], "x": 11, "y": 9}, + {"matrix": [10, 9], "x": 0, "y": 11}, + {"matrix": [10, 8], "x": 2.5, "y": 10}, + {"matrix": [10, 7], "x": 3.5, "y": 10}, + {"matrix": [10, 6], "x": 4.5, "y": 10}, + {"matrix": [10, 5], "x": 5.5, "y": 10}, + {"matrix": [10, 4], "x": 6.5, "y": 10}, + {"matrix": [10, 3], "x": 7.5, "y": 10}, + {"matrix": [10, 2], "x": 8.5, "y": 10}, + {"matrix": [10, 1], "x": 9.5, "y": 10}, + {"matrix": [10, 0], "x": 10.5, "y": 10}, + {"matrix": [11, 9], "x": 2, "y": 11}, + {"matrix": [11, 8], "x": 3, "y": 11}, + {"matrix": [11, 7], "x": 4, "y": 11}, + {"matrix": [11, 6], "x": 5, "y": 11}, + {"matrix": [11, 5], "x": 6, "y": 11}, + {"matrix": [11, 4], "x": 7, "y": 11}, + {"matrix": [11, 3], "x": 8, "y": 11}, + {"matrix": [11, 2], "x": 9, "y": 11}, + {"matrix": [11, 1], "x": 10, "y": 11}, + {"matrix": [11, 0], "x": 11, "y": 11}, + {"matrix": [12, 9], "x": 0.5, "y": 12}, + {"matrix": [12, 8], "x": 2.5, "y": 12}, + {"matrix": [12, 7], "x": 3.5, "y": 12}, + {"matrix": [12, 6], "x": 4.5, "y": 12}, + {"matrix": [12, 5], "x": 5.5, "y": 12}, + {"matrix": [12, 4], "x": 6.5, "y": 12}, + {"matrix": [12, 3], "x": 7.5, "y": 12}, + {"matrix": [12, 2], "x": 8.5, "y": 12}, + {"matrix": [12, 1], "x": 9.5, "y": 12}, + {"matrix": [12, 0], "x": 10.5, "y": 12}, + {"matrix": [13, 9], "x": 2, "y": 13}, + {"matrix": [13, 8], "x": 3, "y": 13}, + {"matrix": [13, 7], "x": 4, "y": 13}, + {"matrix": [13, 6], "x": 5, "y": 13}, + {"matrix": [13, 5], "x": 6, "y": 13}, + {"matrix": [13, 4], "x": 7, "y": 13}, + {"matrix": [13, 3], "x": 8, "y": 13}, + {"matrix": [13, 2], "x": 9, "y": 13}, + {"matrix": [13, 1], "x": 10, "y": 13}, + {"matrix": [13, 0], "x": 11, "y": 13} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/hexboard/dev/rules.mk b/keyboards/hexboard/dev/rules.mk new file mode 100644 index 00000000000..2cea8539e1b --- /dev/null +++ b/keyboards/hexboard/dev/rules.mk @@ -0,0 +1,4 @@ +SRC += matrix.c +CUSTOM_MATRIX = lite + +AUDIO_DRIVER = pwm_hardware diff --git a/keyboards/hexboard/halconf.h b/keyboards/hexboard/halconf.h new file mode 100644 index 00000000000..a998df04a5c --- /dev/null +++ b/keyboards/hexboard/halconf.h @@ -0,0 +1,11 @@ +// Copyright 2022 Stefan Kerkmann +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#undef HAL_USE_I2C +#define HAL_USE_I2C TRUE +#undef HAL_USE_PWM +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/hexboard/hexboard.c b/keyboards/hexboard/hexboard.c new file mode 100644 index 00000000000..9ba891cadea --- /dev/null +++ b/keyboards/hexboard/hexboard.c @@ -0,0 +1,32 @@ +// Copyright 2022-2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only + +#include "quantum.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { +#ifdef AUDIO_ENABLE + case QK_MIDI_NOTE_C_0 ... QK_MIDI_NOTE_B_5: + if (record->event.pressed) + process_audio_noteon(keycode - MI_C); + else + process_audio_noteoff(keycode - MI_C); + // Allow the normal handler to handle it as well. + return true; +#endif + } + return process_record_user(keycode, record); +} + +#ifdef OLED_ENABLE +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + oled_write_P(PSTR("HexBoard running QMK\n"), false); + oled_write_P(PSTR("\n"), false); + oled_write_P(PSTR("FW is GPLv3-licensed\n"), false); + oled_write_P(PSTR("https://qmk.fm/\n"), false); + return false; +} +#endif diff --git a/keyboards/hexboard/info.json b/keyboards/hexboard/info.json new file mode 100644 index 00000000000..6c7545b47cc --- /dev/null +++ b/keyboards/hexboard/info.json @@ -0,0 +1,40 @@ +{ + "manufacturer": "Shaping The Silence", + "keyboard_name": "HexBoard", + "maintainer": "earboxer", + "audio": { + "pins": ["GP23"], + "voices": true + }, + "board": "GENERIC_RP_RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP21", "pin_b": "GP20"} + ] + }, + "features": { + "audio": true, + "bootmagic": true, + "encoder": true, + "extrakey": true, + "midi": true, + "mousekey": true, + "oled": true, + "rgb_matrix": true + }, + "matrix_size": { + "cols": 10, + "rows": 14 + }, + "processor": "RP2040", + "rgb_matrix": { + "driver": "ws2812" + }, + "url": "https://shapingthesilence.com", + "ws2812": { + "driver": "vendor", + "pin": "GP22" + } +} \ No newline at end of file diff --git a/keyboards/hexboard/keymaps/default/keymap.c b/keyboards/hexboard/keymaps/default/keymap.c new file mode 100644 index 00000000000..877a36ec120 --- /dev/null +++ b/keyboards/hexboard/keymaps/default/keymap.c @@ -0,0 +1,55 @@ +// Copyright 2022-2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only + +#include QMK_KEYBOARD_H + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU),}, + [1] = {ENCODER_CCW_CW(KC_BRID, KC_BRIU),}, + +}; +#endif + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_landscape( + _______,_______,RGB_HUI, + MO(1), _______,RGB_VAD,RGB_MOD, + + _______,_______,_______,KC_EQL ,_______,_______,KC_PGUP, + _______,_______,KC_LBRC,KC_RBRC,_______,KC_HOME,KC_END , + _______,_______,_______,KC_MINS,_______,_______,KC_PGDN, + _______,KC_F15 ,_______,_______,KC_F20 ,_______,_______, + _______,KC_F14 ,KC_F16 ,_______,KC_F19 ,KC_F21 ,_______, + KC_F13 ,KC_F3 ,KC_F17 ,KC_F18 ,KC_F8 ,KC_F22 ,_______, + _______,KC_F2 ,KC_F4 ,_______,KC_F7 ,KC_F9 ,KC_F23 , + KC_F1 ,KC_3 ,KC_F5 ,KC_F6 ,KC_8 ,KC_F10 ,KC_F24 , + _______,KC_2 ,KC_4 ,_______,KC_7 ,KC_9 ,KC_F11 , + KC_1 ,KC_E ,KC_5 ,KC_6 ,KC_I ,KC_0 ,KC_F12 , + KC_TAB ,KC_W ,KC_R ,_______,KC_U ,KC_O ,KC_BSPC, + KC_Q ,KC_D , KC_T ,KC_Y ,KC_K ,KC_P ,_______, + KC_ESC ,KC_S ,KC_F ,_______,KC_J ,KC_L ,KC_QUOT, + KC_A ,KC_C ,KC_G ,KC_H ,KC_COMM,KC_SCLN,KC_SLSH, + KC_LSFT,KC_X ,KC_V ,_______,KC_M ,KC_DOT ,KC_ENT , + KC_Z ,_______,KC_B ,KC_N ,_______,KC_SLSH,_______, + _______,_______,_______,_______,_______,_______,KC_UP , + KC_LCTL,KC_LGUI,_______,_______,KC_RALT,KC_LEFT,KC_RGHT, + _______,KC_LALT,MO(1) ,KC_SPC ,KC_RGUI,KC_RCTL,KC_DOWN + ), + [1] = LAYOUT_portrait( +_______, _______,_______,_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, +_______, _______,_______,_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, +_______, _______,_______,_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, +_______, _______,_______,_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, +_______, _______,_______,_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, +_______, _______,_______,_______,_______,_______,_______,_______,_______,_______, + KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P , +_______, KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,KC_J ,KC_K ,KC_L , + SFT_T(KC_SPC),KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_B ,KC_N ,KC_M ,RCTL_T(KC_COMM) + ), +}; diff --git a/keyboards/hexboard/keymaps/default/rules.mk b/keyboards/hexboard/keymaps/default/rules.mk new file mode 100644 index 00000000000..582c2ebcf81 --- /dev/null +++ b/keyboards/hexboard/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +ENCODER_MAP_ENABLE = yes +MIDI_ENABLE = no diff --git a/keyboards/hexboard/keymaps/keyboard/config.h b/keyboards/hexboard/keymaps/keyboard/config.h new file mode 100644 index 00000000000..c2019c5ab54 --- /dev/null +++ b/keyboards/hexboard/keymaps/keyboard/config.h @@ -0,0 +1,5 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#pragma once + +#define MIDI_BASIC diff --git a/keyboards/hexboard/keymaps/keyboard/keymap.c b/keyboards/hexboard/keymaps/keyboard/keymap.c new file mode 100644 index 00000000000..8d9ca754ce9 --- /dev/null +++ b/keyboards/hexboard/keymaps/keyboard/keymap.c @@ -0,0 +1,255 @@ +// Copyright 2022-2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#include QMK_KEYBOARD_H +#include "quantum/color.h" + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_LEFT, KC_RIGHT),}, + [1] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU),}, + [2] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI),}, +}; +#endif + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Hexboard Keyboard layout (landscape) + * ___ ___ ___ + * ❬BnU ᚛-᚜AuTg᚛-᚜MiO❭__ + * ❬BnD᚛-᚜MuT᚛-᚜Pnc᚛-᚜Pnc❭ + * ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ + * ___ ___ ___ ___ ___ ___ ___ + * ❬F 5᚛-᚜Gb5᚛-᚜G 5᚛-᚜Ab5᚛-᚜A 5᚛-᚜Bb5᚛-᚜B 5❭__ + * ᚛-᚜D 5᚛-᚜Eb5᚛-᚜E 5᚛-᚜F 5᚛-᚜Gb5᚛-᚜G 5᚛-᚜Ab5❭ + * ❬Bb4᚛-᚜B 4᚛-᚜C 5᚛-᚜Db5᚛-᚜D 5᚛-᚜Eb5᚛-᚜E 5᚛-᚜ + * ᚛-᚜G 4᚛-᚜Ab4᚛-᚜A 4᚛-᚜Bb4᚛-᚜B 4᚛-᚜C 5᚛-᚜Db5❭ + * ❬Eb4᚛-᚜E 4᚛-᚜F 4᚛-᚜Gb4᚛-᚜G 4᚛-᚜Ab4᚛-᚜A 4᚛-᚜ + * ᚛-᚜C 4᚛-᚜Db4᚛-᚜D 4᚛-᚜Eb4᚛-᚜E 4᚛-᚜F 4᚛-᚜Gb4❭ + * ❬Ab3᚛-᚜A 3᚛-᚜Bb3᚛-᚜B 3᚛-᚜C 4᚛-᚜Db4᚛-᚜D 4᚛-᚜ + * ᚛-᚜F 3᚛-᚜Gb3᚛-᚜G 3᚛-᚜Ab3᚛-᚜A 3᚛-᚜Bb3᚛-᚜B 3❭ + * ❬Db3᚛-᚜D 3᚛-᚜Eb3᚛-᚜E 3᚛-᚜F 3᚛-᚜Gb3᚛-᚜G 3᚛-᚜ + * ᚛-᚜ ᚛-᚜ E ᚛-᚜ ᚛-᚜ ᚛-᚜ I ᚛-᚜ ᚛-᚜ ❭ + * ❬TAB᚛-᚜ W ᚛-᚜ R ᚛-᚜ ᚛-᚜ U ᚛-᚜ O ᚛-᚜⌫ ᚛-᚜ + * ᚛-᚜ Q ᚛-᚜ D ᚛-᚜ T ᚛-᚜ Y ᚛-᚜ K ᚛-᚜ P ᚛-᚜ ❭ + * ❬Esc᚛-᚜ S ᚛-᚜ F ᚛-᚜ ᚛-᚜ J ᚛-᚜ L ᚛-᚜ ' ᚛-᚜ + * ᚛-᚜ A ᚛-᚜ C ᚛-᚜ G ᚛-᚜ H ᚛-᚜ , ᚛-᚜ ; ᚛-᚜ ❭ + * ❬sft᚛-᚜ X ᚛-᚜ V ᚛-᚜ ᚛-᚜ M ᚛-᚜ . ᚛-᚜ ⏎ ᚛-᚜ + * ᚛-᚜ Z ᚛-᚜ ᚛-᚜ B ᚛-᚜ N ᚛-᚜ ᚛-᚜ / ᚛-᚜ ❭ + * ❬ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ + * ᚛-᚜Ctl᚛-᚜Sup᚛-᚜ ᚛-᚜ ᚛-᚜ 🡐 ᚛-᚜ 🡑 ᚛-᚜ ⏎ ❭ + * ❬ ᚛-᚜Alt᚛-᚜lyr᚛-᚜ ᚛-᚜LYR᚛-᚜ 🡓 ᚛-᚜ 🡒 ❭‾‾ + * ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ + */ + [0] = LAYOUT_landscape( + MI_BNDU,AU_TOGG, RGB_HUI, + MI_BNDD,MI_TOGG, RGB_VAD, RGB_MOD, + + +MI_F5, MI_Gb5, MI_G5, MI_Ab5, MI_A5, MI_Bb5, MI_B5, + MI_D5, MI_Eb5, MI_E5, MI_F5, MI_Gb5, MI_G5, MI_Ab5, +MI_Bb4,MI_B4, MI_C5, MI_Db5, MI_D5, MI_Eb5, MI_E5, + MI_G4, MI_Ab4, MI_A4, MI_Bb4, MI_B4, MI_C5, MI_Db5, +MI_Eb4,MI_E4, MI_F4, MI_Gb4, MI_G4, MI_Ab4, MI_A4, + MI_C4, MI_Db4, MI_D4, MI_Eb4, MI_E4, MI_F4, MI_Gb4, +MI_Ab3,MI_A3, MI_Bb3, MI_B3, MI_C4, MI_Db4, MI_D4, + MI_F3, MI_Gb3, MI_G3, MI_Ab3, MI_A3, MI_Bb3,MI_B3, +MI_Db3,MI_D3, MI_Eb3, MI_E3, MI_F3, MI_Gb3, MI_G3, + _______,KC_E, _______, _______, KC_I, _______,_______, +KC_TAB, KC_W, KC_R, _______, KC_U, KC_O, KC_BSPC, + KC_Q, KC_D, KC_T, KC_Y, KC_K, KC_P, _______, +KC_ESC, KC_S, KC_F, _______, KC_J, KC_L, KC_QUOT, + KC_A, KC_C, KC_G, KC_H, KC_COMM, KC_SCLN,_______, +KC_LSFT,KC_X, KC_V, _______, KC_M, KC_DOT, KC_ENT, + KC_Z, _______, KC_B, KC_N, _______, KC_SLSH,_______, +_______,_______, _______, _______, _______, _______, _______, + KC_LCTL,KC_LGUI, _______, _______, KC_LEFT, KC_UP,KC_ENT, +_______,KC_LALT, MO(1), KC_SPC, MO(2), KC_DOWN, KC_RGHT + ), + + + // "lower" + /** + * ... top rows fall through to other layer. + * ___ ___ ___ ___ ___ ___ ___ + * ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ + ᚛-᚜ ᚛-᚜ ❭ + * ❬ ~ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ _ ᚛-᚜ { ᚛-᚜ ᚛-᚜ + * ᚛-᚜ ᚛-᚜ # ᚛-᚜ ᚛-᚜ ᚛-᚜ * ᚛-᚜ } ᚛-᚜ ❭ + * ❬ ⌦ ᚛-᚜ @ ᚛-᚜ $ ᚛-᚜ ᚛-᚜ & ᚛-᚜ ( ᚛-᚜ | ᚛-᚜ + * ᚛-᚜ ! ᚛-᚜ ᚛-᚜ % ᚛-᚜ ^ ᚛-᚜ ᚛-᚜ ) ᚛-᚜ ❭ + * ❬sft᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ + * ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ❭ + * ❬ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ + * ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ⇱ ᚛-᚜ ⇑ ᚛-᚜ ❭ + * ❬ ᚛-᚜ ᚛-᚜lyr᚛-᚜ ᚛-᚜LYR᚛-᚜ ⇓ ᚛-᚜ ⇲ ❭‾‾ + * ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ + */ + + [1] = LAYOUT_landscape( + MI_BNDU,AU_TOGG, RGB_M_SN, + MI_BNDD,MI_TOGG, RGB_M_B,RGB_M_SW, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,KC_PLUS,_______,_______, +KC_TILD,_______,_______,_______,KC_UNDS,KC_LCBR,_______, + _______,KC_HASH,_______,_______,KC_ASTR,KC_RCBR,_______, +KC_DEL, KC_AT, KC_DLR,_______, KC_AMPR,KC_LPRN,KC_PIPE, + KC_EXLM,_______,KC_PERC,KC_CIRC,_______,KC_RPRN,_______, +KC_LSFT,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,KC_HOME,KC_PGUP,_______, +_______,_______,_______,_______,_______,KC_PGDN,KC_END + ), + // "raise" + /** + * ... top rows fall through to other layer. + * ___ ___ ___ ___ ___ ___ ___ + * ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ = ᚛-᚜ ᚛-᚜ ❭ + * ❬ ~ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ _ ᚛-᚜ [ ᚛-᚜ ᚛-᚜ + * ᚛-᚜ ᚛-᚜ 3 ᚛-᚜ ᚛-᚜ ᚛-᚜ 8 ᚛-᚜ ] ᚛-᚜ ❭ + * ❬ ⌦ ᚛-᚜ 2 ᚛-᚜ 4 ᚛-᚜ ᚛-᚜ 7 ᚛-᚜ 9 ᚛-᚜ \ ᚛-᚜ + * ᚛-᚜ 1 ᚛-᚜ ᚛-᚜ 5 ᚛-᚜ 6 ᚛-᚜ ᚛-᚜ 0 ᚛-᚜ ❭ + * ❬sft᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ + * ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ❭ + * ❬ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ + * ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ᚛-᚜ ⇱ ᚛-᚜ ⇑ ᚛-᚜ ❭ + * ❬ ᚛-᚜ ᚛-᚜lyr᚛-᚜ ᚛-᚜LYR᚛-᚜ ⇓ ᚛-᚜ ⇲ ❭‾‾ + * ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ + */ + [2] = LAYOUT_landscape( + MI_BNDU,AU_TOGG, RGB_HUI, + MI_BNDD,MU_TOGG, RGB_VAD,RGB_MOD, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,KC_EQL ,_______,_______, +KC_GRV ,_______,_______,_______,KC_MINS,KC_LBRC,_______, + _______, KC_3 ,_______,_______, KC_8 ,KC_RBRC,_______, +KC_DEL , KC_2 , KC_4 ,_______, KC_7 , KC_9 ,KC_BSLS, + KC_1 ,_______, KC_5 , KC_6 ,_______, KC_0 ,_______, +KC_LSFT,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,_______,_______,_______, +_______,_______,_______,_______,_______,_______,_______, + _______,_______,_______,_______,KC_HOME,KC_PGUP,_______, +_______,_______,_______,_______,_______,KC_PGDN,KC_END + ) + + +}; + +// Hue, Saturation, Config +#define HSC_AZURE 132, 102, rgb_matrix_config.hsv.v +#define HSC_BLUE 170, 255, rgb_matrix_config.hsv.v +#define HSC_CHARTREUSE 64, 255, rgb_matrix_config.hsv.v +#define HSC_CORAL 11, 176, rgb_matrix_config.hsv.v +#define HSC_CYAN 128, 255, rgb_matrix_config.hsv.v +#define HSC_GOLD 36, 255, rgb_matrix_config.hsv.v +#define HSC_GOLDENROD 30, 218, rgb_matrix_config.hsv.v +#define HSC_GREEN 85, 255, rgb_matrix_config.hsv.v +#define HSC_MAGENTA 213, 255, rgb_matrix_config.hsv.v +#define HSC_ORANGE 21, 255, rgb_matrix_config.hsv.v +#define HSC_PINK 234, 128, rgb_matrix_config.hsv.v +#define HSC_PURPLE 191, 255, rgb_matrix_config.hsv.v +#define HSC_RED 0, 255, rgb_matrix_config.hsv.v +#define HSC_SPRINGGREEN 106, 255, rgb_matrix_config.hsv.v +#define HSC_TEAL 128, 255, rgb_matrix_config.hsv.v>>1 +#define HSC_TURQUOISE 123, 90, rgb_matrix_config.hsv.v>>1 +#define HSC_WHITE 0, 0, rgb_matrix_config.hsv.v +#define HSC_YELLOW 43, 255, rgb_matrix_config.hsv.v +#define HSC_GRAY 0, 0, rgb_matrix_config.hsv.v>>1 +// Categories +#define HSC_LETTERS HSC_GRAY +#define HSC_SLETTERS HSC_WHITE +#define HSC_NUMBERS HSC_YELLOW >> 1 +#define HSC_SNUMBERS HSC_YELLOW + +void rgb_matrix_set_hsv(uint8_t i, uint8_t h, uint8_t s, uint8_t v) { + HSV hsv = {h, s, v}; + RGB rgb = hsv_to_rgb(hsv); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); +} + +bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + uint8_t layer = get_highest_layer(layer_state); + if (layer < 0) { + return false; + } + for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { + for (uint8_t col = 0; col < MATRIX_COLS; ++col) { + uint8_t index = g_led_config.matrix_co[row][col]; + if (index < led_min || index >= led_max || index == NO_LED) continue; + uint16_t keycode = keymap_key_to_keycode(layer, (keypos_t){col, row}); + if (keycode >= KC_1 && keycode <= KC_0) + rgb_matrix_set_hsv(index, HSC_NUMBERS); + else if (keycode >= S(KC_1) && keycode <= S(KC_0)) + rgb_matrix_set_hsv(index, HSC_SNUMBERS); + else if (keycode == KC_ENTER || keycode == KC_TAB || keycode == KC_SPACE) + rgb_matrix_set_hsv(index, HSC_SPRINGGREEN); + else if (keycode == KC_BACKSPACE || keycode == KC_DELETE) + rgb_matrix_set_hsv(index, HSC_RED); + else if (keycode == KC_CAPS_LOCK) + rgb_matrix_set_hsv(index, HSC_BLUE); + else if (keycode >= KC_A && keycode <= KC_SLASH) + rgb_matrix_set_hsv(index, HSC_LETTERS); + else if (keycode >= S(KC_A) && keycode <= S(KC_SLASH)) + rgb_matrix_set_hsv(index, HSC_SLETTERS); + else if (keycode >= KC_F1 && keycode <= KC_NUM_LOCK) + rgb_matrix_set_hsv(index, HSC_BLUE); + // TODO: numpad keycodes + else if (keycode >= KC_APPLICATION && keycode <= KC_MS_ACCEL2) + rgb_matrix_set_hsv(index, HSC_BLUE); + else if (keycode >= KC_LEFT_CTRL && keycode <= KC_RIGHT_GUI) + rgb_matrix_set_hsv(index, HSC_PURPLE); + // TODO: magic keycodes + else if (keycode >= QK_MIDI_NOTE_C_0 && keycode <= QK_MIDI_NOTE_B_5) { + rgb_matrix_set_hsv(index, ((keycode - QK_MIDI_NOTE_C_0) % 12) * 21, 255, rgb_matrix_config.hsv.v); + } + // sequencer, joystick, programmable, settings... + else if (keycode == MO(1) || keycode == MO(2)) + rgb_matrix_set_hsv(index, HSC_PINK); + } + } + return false; +} + +#ifdef OLED_ENABLE +bool oled_task_user(void) { + // Host Keyboard Layer Status + oled_write_P(PSTR(" Layer: "), false); + + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_P(PSTR("Default\n"), false); + break; + case 1: + oled_write_P(PSTR("symbols\n"), false); + break; + case 2: + oled_write_P(PSTR("numbers\n"), false); + break; + default: + // Or use the write_ln shortcut over adding '\n' to the end of your string + oled_write_ln_P(PSTR("Undefined"), false); + } + + // Host Keyboard LED Status + // led_t led_state = host_keyboard_led_state(); + // oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); + // oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); + // oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); + + return false; +} +#endif diff --git a/keyboards/hexboard/keymaps/keyboard/rules.mk b/keyboards/hexboard/keymaps/keyboard/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/hexboard/keymaps/keyboard/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/hexboard/keymaps/midi/config.h b/keyboards/hexboard/keymaps/midi/config.h new file mode 100644 index 00000000000..97fb2d1f101 --- /dev/null +++ b/keyboards/hexboard/keymaps/midi/config.h @@ -0,0 +1,5 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#pragma once + +#define MIDI_ADVANCED diff --git a/keyboards/hexboard/keymaps/midi/keymap.c b/keyboards/hexboard/keymaps/midi/keymap.c new file mode 100644 index 00000000000..a0539d1a726 --- /dev/null +++ b/keyboards/hexboard/keymaps/midi/keymap.c @@ -0,0 +1,268 @@ +// Copyright 2022-2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only + +#include QMK_KEYBOARD_H + +// Define the keycode, `QK_USER` avoids collisions with existing keycodes +enum keycodes { + KC_CYCLE_LAYERS = QK_USER, + KC_ENCODER_CCW, + KC_ENCODER_CW, +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),}, + [1] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),}, + [2] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),}, + [3] = {ENCODER_CCW_CW(KC_ENCODER_CCW, KC_ENCODER_CW),}, +}; +#endif + +// 1st layer on the cycle +#define LAYER_CYCLE_START 0 +// Last layer on the cycle +#define LAYER_CYCLE_END 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Hexboard Harmonic table layout (landscape) + * ___ ___ ___ + * ❬BnU ᚛-᚜ ᚛-᚜VlM❭__ + * ❬BnD᚛-᚜Mod᚛-᚜VlL᚛-᚜VlH❭ + * ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ + * ___ ___ ___ ___ ___ ___ ___ + * ❬F 5᚛-᚜Gb5᚛-᚜G 5᚛-᚜Ab5᚛-᚜A 5᚛-᚜Bb5᚛-᚜B 5❭__ + * ᚛-᚜D 5᚛-᚜Eb5᚛-᚜E 5᚛-᚜F 5᚛-᚜Gb5᚛-᚜G 5᚛-᚜Ab5❭ + * ❬Bb4᚛-᚜B 4᚛-᚜C 5᚛-᚜Db5᚛-᚜D 5᚛-᚜Eb5᚛-᚜E 5᚛-᚜ + * ᚛-᚜G 4᚛-᚜Ab4᚛-᚜A 4᚛-᚜Bb4᚛-᚜B 4᚛-᚜C 5᚛-᚜Db5❭ + * ❬Eb4᚛-᚜E 4᚛-᚜F 4᚛-᚜Gb4᚛-᚜G 4᚛-᚜Ab4᚛-᚜A 4᚛-᚜ + * ᚛-᚜C 4᚛-᚜Db4᚛-᚜D 4᚛-᚜Eb4᚛-᚜E 4᚛-᚜F 4᚛-᚜Gb4❭ + * ❬Ab3᚛-᚜A 3᚛-᚜Bb3᚛-᚜B 3᚛-᚜C 4᚛-᚜Db4᚛-᚜D 4᚛-᚜ + * ᚛-᚜F 3᚛-᚜Gb3᚛-᚜G 3᚛-᚜Ab3᚛-᚜A 3᚛-᚜Bb3᚛-᚜B 3❭ + * ❬Db3᚛-᚜D 3᚛-᚜Eb3᚛-᚜E 3᚛-᚜F 3᚛-᚜Gb3᚛-᚜G 3᚛-᚜ + * ᚛-᚜Bb2᚛-᚜B 2᚛-᚜C 3᚛-᚜Db3᚛-᚜D 3᚛-᚜Eb3᚛-᚜E 3❭ + * ❬Gb2᚛-᚜G 2᚛-᚜Ab2᚛-᚜A 2᚛-᚜Bb2᚛-᚜B 2᚛-᚜C 3᚛-᚜ + * ᚛-᚜Eb2᚛-᚜E 2᚛-᚜F 2᚛-᚜Gb2᚛-᚜G 2᚛-᚜Ab2᚛-᚜A 2❭ + * ❬B 1᚛-᚜C 2᚛-᚜Db2᚛-᚜D 2᚛-᚜Eb2᚛-᚜E 2᚛-᚜F 2᚛-᚜ + * ᚛-᚜Ab1᚛-᚜A 1᚛-᚜Bb1᚛-᚜B 1᚛-᚜C 2᚛-᚜Db2᚛-᚜D 2❭ + * ❬E 1᚛-᚜F 1᚛-᚜Gb1᚛-᚜G 1᚛-᚜Ab1᚛-᚜A 1᚛-᚜Bb1᚛-᚜ + * ᚛-᚜Db1᚛-᚜D 1᚛-᚜Eb1᚛-᚜E 1᚛-᚜F 1᚛-᚜Gb1᚛-᚜G 1❭ + * ❬A ᚛-᚜Bb ᚛-᚜B ᚛-᚜C 1᚛-᚜Db1᚛-᚜D 1᚛-᚜Eb1᚛-᚜ + * ᚛-᚜Gb ᚛-᚜G ᚛-᚜Ab ᚛-᚜A ᚛-᚜Bb ᚛-᚜B ᚛-᚜C 1❭ + * ❬D ᚛-᚜Eb ᚛-᚜E ᚛-᚜F ᚛-᚜Gb ᚛-᚜G ᚛-᚜Ab ❭‾‾ + * ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ ‾‾‾ + */ + [0] = LAYOUT_landscape( + MI_BNDU,KC_CYCLE_LAYERS,MI_VL5, + MI_BNDD,MI_MOD, MI_VL2,MI_VL10, + + + MI_F5, MI_Gb5, MI_G5, MI_Ab5, MI_A5, MI_Bb5, MI_B5, + MI_D5, MI_Eb5, MI_E5, MI_F5, MI_Gb5, MI_G5, MI_Ab5, + MI_Bb4, MI_B4, MI_C5, MI_Db5, MI_D5, MI_Eb5, MI_E5, + MI_G4, MI_Ab4, MI_A4, MI_Bb4, MI_B4, MI_C5, MI_Db5, + MI_Eb4, MI_E4, MI_F4, MI_Gb4, MI_G4, MI_Ab4, MI_A4, + MI_C4, MI_Db4, MI_D4, MI_Eb4, MI_E4, MI_F4, MI_Gb4, + MI_Ab3, MI_A3, MI_Bb3, MI_B3, MI_C4, MI_Db4, MI_D4, + MI_F3, MI_Gb3, MI_G3, MI_Ab3, MI_A3, MI_Bb3, MI_B3, + MI_Db3, MI_D3, MI_Eb3, MI_E3, MI_F3, MI_Gb3, MI_G3, + MI_Bb2, MI_B2, MI_C3, MI_Db3, MI_D3, MI_Eb3, MI_E3, + MI_Gb2, MI_G2, MI_Ab2, MI_A2, MI_Bb2, MI_B2, MI_C3, + MI_Eb2, MI_E2, MI_F2, MI_Gb2, MI_G2, MI_Ab2, MI_A2, + MI_B1, MI_C2, MI_Db2, MI_D2, MI_Eb2, MI_E2, MI_F2, + MI_Ab1, MI_A1, MI_Bb1, MI_B1, MI_C2, MI_Db2, MI_D2, + MI_E1, MI_F1, MI_Gb1, MI_G1, MI_Ab1, MI_A1, MI_Bb1, + MI_Db1, MI_D1, MI_Eb1, MI_E1, MI_F1, MI_Gb1, MI_G1, + MI_A, MI_Bb, MI_B, MI_C1, MI_Db1, MI_D1, MI_Eb1, + MI_Gb, MI_G, MI_Ab, MI_A, MI_Bb, MI_B, MI_C1, + MI_D, MI_Eb, MI_E, MI_F, MI_Gb1, MI_G, MI_Ab + ), + // wickiHaydenLayout + // ./makeLayout.py 79 2 -7 qmk + [1] = LAYOUT_portrait( +MI_VL10, 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, KC_NO, KC_NO, KC_NO, +MI_VL5, MI_G5, MI_A5, MI_B5, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + MI_C5, MI_D5, MI_E5, MI_Gb5, MI_Ab5, MI_Bb5, KC_NO, KC_NO, KC_NO, KC_NO, +MI_VL2, MI_G4, MI_A4, MI_B4, MI_Db5, MI_Eb5, MI_F5, MI_G5, MI_A5, MI_B5, + MI_C4, MI_D4, MI_E4, MI_Gb4, MI_Ab4, MI_Bb4, MI_C5, MI_D5, MI_E5, MI_Gb5, +QK_USER, MI_G3, MI_A3, MI_B3, MI_Db4, MI_Eb4, MI_F4, MI_G4, MI_A4, MI_B4, + MI_C3, MI_D3, MI_E3, MI_Gb3, MI_Ab3, MI_Bb3, MI_C4, MI_D4, MI_E4, MI_Gb4, +MI_MOD, MI_G2, MI_A2, MI_B2, MI_Db3, MI_Eb3, MI_F3, MI_G3, MI_A3, MI_B3, + MI_C2, MI_D2, MI_E2, MI_Gb2, MI_Ab2, MI_Bb2, MI_C3, MI_D3, MI_E3, MI_Gb3, +MI_BNDU, MI_G1, MI_A1, MI_B1, MI_Db2, MI_Eb2, MI_F2, MI_G2, MI_A2, MI_B2, + MI_C1, MI_D1, MI_E1, MI_Gb1, MI_Ab1, MI_Bb1, MI_C2, MI_D2, MI_E2, MI_Gb2, +MI_BNDD, MI_G, MI_A, MI_B, MI_Db1, MI_Eb1, MI_F1, MI_G1, MI_A1, MI_B1, + MI_C, MI_D, MI_E, MI_Gb, MI_Ab, MI_Bb, MI_C1, MI_D1, MI_E1, MI_Gb1 + ), + // gerhardLayout + // ./makeLayout.py 62 -1 -3 qmk + [2] = LAYOUT_portrait( +MI_VL10, MI_D5, MI_Db5, MI_C5, MI_B4, MI_Bb4, MI_A4, MI_Ab4, MI_G4, MI_Gb4, + MI_B4, MI_Bb4, MI_A4, MI_Ab4, MI_G4, MI_Gb4, MI_F4, MI_E4, MI_Eb4, MI_D4, +MI_VL5, MI_G4, MI_Gb4, MI_F4, MI_E4, MI_Eb4, MI_D4, MI_Db4, MI_C4, MI_B3, + MI_E4, MI_Eb4, MI_D4, MI_Db4, MI_C4, MI_B3, MI_Bb3, MI_A3, MI_Ab3, MI_G3, +MI_VL2, MI_C4, MI_B3, MI_Bb3, MI_A3, MI_Ab3, MI_G3, MI_Gb3, MI_F3, MI_E3, + MI_A3, MI_Ab3, MI_G3, MI_Gb3, MI_F3, MI_E3, MI_Eb3, MI_D3, MI_Db3, MI_C3, +QK_USER, MI_F3, MI_E3, MI_Eb3, MI_D3, MI_Db3, MI_C3, MI_B2, MI_Bb2, MI_A2, + MI_D3, MI_Db3, MI_C3, MI_B2, MI_Bb2, MI_A2, MI_Ab2, MI_G2, MI_Gb2, MI_F2, +MI_MOD, MI_Bb2, MI_A2, MI_Ab2, MI_G2, MI_Gb2, MI_F2, MI_E2, MI_Eb2, MI_D2, + MI_G2, MI_Gb2, MI_F2, MI_E2, MI_Eb2, MI_D2, MI_Db2, MI_C2, MI_B1, MI_Bb1, +MI_BNDU, MI_Eb2, MI_D2, MI_Db2, MI_C2, MI_B1, MI_Bb1, MI_A1, MI_Ab1, MI_G1, + MI_C2, MI_B1, MI_Bb1, MI_A1, MI_Ab1, MI_G1, MI_Gb1, MI_F1, MI_E1, MI_Eb1, +MI_BNDD, MI_Ab1, MI_G1, MI_Gb1, MI_F1, MI_E1, MI_Eb1, MI_D1, MI_Db1, MI_C1, + MI_F1, MI_E1, MI_Eb1, MI_D1, MI_Db1, MI_C1, MI_B, MI_Bb, MI_A, MI_Ab + ), + // "Full" layout -- notably not full in qmk + // ./makeLayout.py 132 -1 -9 qmk + [3] = LAYOUT_portrait( +MI_VL10, 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, KC_NO, KC_NO, KC_NO, +MI_VL5, 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, KC_NO, KC_NO, KC_NO, +MI_VL2, 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, KC_NO, KC_NO, KC_NO, +QK_USER, KC_NO, KC_NO, KC_NO, KC_NO, MI_B5, MI_Bb5, MI_A5, MI_Ab5, MI_G5, + MI_Gb5, MI_F5, MI_E5, MI_Eb5, MI_D5, MI_Db5, MI_C5, MI_B4, MI_Bb4, MI_A4, +MI_MOD, MI_Ab4, MI_G4, MI_Gb4, MI_F4, MI_E4, MI_Eb4, MI_D4, MI_Db4, MI_C4, + MI_B3, MI_Bb3, MI_A3, MI_Ab3, MI_G3, MI_Gb3, MI_F3, MI_E3, MI_Eb3, MI_D3, +MI_BNDU, MI_Db3, MI_C3, MI_B2, MI_Bb2, MI_A2, MI_Ab2, MI_G2, MI_Gb2, MI_F2, + MI_E2, MI_Eb2, MI_D2, MI_Db2, MI_C2, MI_B1, MI_Bb1, MI_A1, MI_Ab1, MI_G1, +MI_BNDD, MI_Gb1, MI_F1, MI_E1, MI_Eb1, MI_D1, MI_Db1, MI_C1, MI_B, MI_Bb, + MI_A, MI_Ab, MI_G, MI_Gb, MI_F, MI_E, MI_Eb, MI_D, MI_Db, MI_C + ), +}; + +void rgb_matrix_set_hsv(uint8_t i, uint8_t h, uint8_t s, uint8_t v) { + HSV hsv = {h, s, v}; + RGB rgb = hsv_to_rgb(hsv); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); +} + +bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + if (get_highest_layer(layer_state) < 0) { + return false; + } + uint8_t layer = get_highest_layer(layer_state); + for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { + for (uint8_t col = 0; col < MATRIX_COLS; ++col) { + uint8_t index = g_led_config.matrix_co[row][col]; + if (index < led_min || index >= led_max || index == NO_LED) continue; + uint16_t keycode = keymap_key_to_keycode(layer, (keypos_t){col, row}); + if (keycode >= QK_MIDI_NOTE_C_0 && keycode <= QK_MIDI_NOTE_B_5) { + rgb_matrix_set_hsv(index, ((keycode - QK_MIDI_NOTE_C_0) % 12) * 21, 255, rgb_matrix_config.hsv.v); + } else if (keycode == QK_MIDI_PITCH_BEND_DOWN || keycode == QK_MIDI_PITCH_BEND_UP) { + // TODO: Make this reflect the internal pitch bend value. + rgb_matrix_set_hsv(index, 0, 255, rgb_matrix_config.hsv.v); + } else if (keycode == QK_MIDI_MODULATION) { + // TODO: Make this reflect the internal modulation value. + rgb_matrix_set_hsv(index, 85, 255, rgb_matrix_config.hsv.v); + } else if (keycode >= QK_MIDI_VELOCITY_0 && keycode <= QK_MIDI_VELOCITY_10) { + uint8_t vlev = keycode - QK_MIDI_VELOCITY_0; // 0-10 + // Set brightness based on which is closest. + uint8_t brightness = 127 - abs((vlev * 12) - midi_config.velocity); + if (brightness > rgb_matrix_config.hsv.v) brightness = rgb_matrix_config.hsv.v; + // Highest velocity is red. + rgb_matrix_set_hsv(index, (10 - (vlev)) * 20, 255, brightness); + } + } + } + return false; +} +uint16_t held_keycode = 0; +// Add the behaviour of this new keycode +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_CYCLE_LAYERS: + // Our logic will happen on presses, nothing is done on releases + if (!record->event.pressed) { + // We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily + return false; + } + + uint8_t current_layer = get_highest_layer(layer_state); + + // Check if we are within the range, if not quit + if (current_layer > LAYER_CYCLE_END || current_layer < LAYER_CYCLE_START) { + return false; + } + + uint8_t next_layer = current_layer + 1; + if (next_layer > LAYER_CYCLE_END) { + next_layer = LAYER_CYCLE_START; + } + layer_move(next_layer); + return false; + // Track the option buttons so they can modify the behavior of the encoder. + case MI_BNDU: + case MI_BNDD: + case MI_MOD: + case MI_VL2: + case MI_VL5: + case MI_VL10: + if (record->event.pressed) { + held_keycode = keycode; + } else if (held_keycode == keycode) { + held_keycode = 0; + } + // process normally + return true; + case KC_ENCODER_CCW: + case KC_ENCODER_CW: + switch (held_keycode) { + case MI_MOD: + if (keycode == KC_ENCODER_CW ? midi_config.modulation_interval != 255 : midi_config.modulation_interval != 0) { + midi_config.modulation_interval += (keycode == KC_ENCODER_CW ? 1 : -1); + } + break; + case MI_VL2: + case MI_VL5: + case MI_VL10: + if (keycode == KC_ENCODER_CW ? midi_config.velocity != 127 : midi_config.velocity != 0) { + midi_config.velocity += (keycode == KC_ENCODER_CW ? 1 : -1); + } + break; + default: + break; + } + // done processing. + return false; + // Process other keycodes normally + default: + return true; + } +} + +#ifdef OLED_ENABLE +bool oled_task_user(void) { + // Host Keyboard Layer Status + oled_write_P(PSTR("Layer:"), false); + switch (get_highest_layer(layer_state)) { + case 0: + // skip the space because this fill the OLED width + oled_write_ln_P(PSTR("Harmonic Table"), false); + break; + case 1: + oled_write_ln_P(PSTR(" Wicki-Hayden"), false); + break; + case 2: + oled_write_ln_P(PSTR(" Gerhard"), false); + break; + case 3: + oled_write_ln_P(PSTR(" 'Full'"), false); + break; + default: + // Or use the write_ln shortcut over adding '\n' to the end of your string + oled_write_ln_P(PSTR("Undefined"), false); + } + oled_write_P(PSTR("Velocity: "), held_keycode >= MI_VL0 && held_keycode <= MI_VL10); + oled_write_ln(get_u8_str(midi_config.velocity, ' '), false); + oled_write_P(PSTR("Octave: "), held_keycode >= MI_OCN2 && held_keycode <= MI_OCTU); + oled_write_ln(get_u8_str(midi_config.octave, ' '), false); + oled_write_P(PSTR("Transposition: "), held_keycode >= MI_TRN6 && held_keycode <= MI_TRSU); + oled_write_ln(get_u8_str(midi_config.transpose, ' '), false); + oled_write_P(PSTR("Mod Int: "), held_keycode >= MI_MOD && held_keycode <= MI_MODU); + oled_write_ln(get_u8_str(midi_config.modulation_interval, ' '), false); + return false; +} +#endif diff --git a/keyboards/hexboard/keymaps/midi/rules.mk b/keyboards/hexboard/keymaps/midi/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/hexboard/keymaps/midi/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/hexboard/matrix.c b/keyboards/hexboard/matrix.c new file mode 100644 index 00000000000..98b3c45960b --- /dev/null +++ b/keyboards/hexboard/matrix.c @@ -0,0 +1,55 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only +#include "matrix.h" + +static const uint8_t columns[MATRIX_COLS] = MATRIX_COL_PINS; + +// At least four of these should be defined! +static const pin_t mux_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; + +void matrix_init_custom(void) { + // Set pinModes for the digital button matrix. + // For each column pin... + for (int pinNumber = 0; pinNumber < MATRIX_COLS; pinNumber++) { + // set the pinMode to INPUT_PULLUP (+3.3V / HIGH). + setPinInputHigh(columns[pinNumber]); + } + setPinOutput(mux_pins[0]); + setPinOutput(mux_pins[1]); + setPinOutput(mux_pins[2]); + setPinOutput(mux_pins[3]); +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + bool matrix_has_changed = false; + + // Button Deck + // Iterate through each of the row pins on the multiplexing chip. + for (int rowIndex = 0; rowIndex < 14; rowIndex++) { + writePin(mux_pins[0], rowIndex & 1); + writePin(mux_pins[1], (rowIndex & 2) >> 1); + writePin(mux_pins[2], (rowIndex & 4) >> 2); + writePin(mux_pins[3], (rowIndex & 8) >> 3); + // Now iterate through each of the column pins that are connected to the current row pin. + for (int columnIndex = 0; columnIndex < MATRIX_COLS; columnIndex++) { + // Hold the currently selected column pin in a variable. + pin_t columnPin = columns[columnIndex]; + // Set that row pin to INPUT_PULLUP mode (+3.3V / HIGH). + setPinInputHigh(columnPin); + matrix_io_delay(); + bool previousValue = (current_matrix[rowIndex] >> columnIndex) & 1; + bool buttonState = !readPin(columnPin); // inverted... + matrix_has_changed |= previousValue != buttonState; + if (buttonState) { + current_matrix[rowIndex] |= (1 << columnIndex); + } else { + current_matrix[rowIndex] &= ~(1 << columnIndex); + } + + // Set the selected column pin back to INPUT mode (0V / LOW). + setPinInput(columnPin); + } + } + + return matrix_has_changed; +} diff --git a/keyboards/hexboard/mcuconf.h b/keyboards/hexboard/mcuconf.h new file mode 100644 index 00000000000..9cd46da260d --- /dev/null +++ b/keyboards/hexboard/mcuconf.h @@ -0,0 +1,15 @@ +// Copyright 2023 Zach DeCook +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include_next + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 FALSE + +// For audio, pin 23 is PWM3 B +#undef RP_PWM_USE_PWM3 +#define RP_PWM_USE_PWM3 TRUE diff --git a/keyboards/hexboard/readme.md b/keyboards/hexboard/readme.md new file mode 100644 index 00000000000..101f69a6300 --- /dev/null +++ b/keyboards/hexboard/readme.md @@ -0,0 +1,34 @@ +# HexBoard + +![HexBoard](https://i.imgur.com/8vtaXb7h.jpg) + +*The HexBoard is a 140-key hexagonal MIDI controller which can double as a 120% keyboard* + +* Keyboard Maintainer: [Zach DeCook](https://github.com/earboxer) +* Hardware Supported: Dev Unit with RP2040 Processor, HexBoard Production Unit (1.1) +* Hardware Not Supported: Dev Unit with Teensy Processor +* Hardware Availability: + * HexBoard Production Unit (1.1) https://shapingthesilence.com/tech/hexboard-midi-controller/ Since 2023. + +The ["Arduino" firmware](https://sr.ht/~earboxer/HexBoard/) remains the official firmware for the HexBoard, but QMK can be used as an alternative which offers keyboard functionality. + +Make example for this keyboard (after setting up your build environment): + + make hexboard/1_1:default + make hexboard/dev:default + +Flashing example for this keyboard: + + make hexboard/1_1:default:flash + make hexboard/dev:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Flashing the Firmware + +0. When you run the flash command, it will say "Waiting for drive to deploy..." +1. On the production model, hold the little button next to the USB-C port when plugging it in. + * On the dev model, hold the little button labeled RPBOOT while plugging it in +2. Mount the device on your computer +3. The flash command will copy the uf2 file onto the mounted device +4. Wait (maybe seven seconds)