diff options
27 files changed, 1401 insertions, 27 deletions
diff --git a/docs/feature_audio.md b/docs/feature_audio.md index b7b572974f..9ffbc2cba8 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -131,12 +131,14 @@ You can override the default songs by doing something like this in your `config. ```c #ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(STARTUP_SOUND) +# define STARTUP_SONG SONG(STARTUP_SOUND) #endif ``` A full list of sounds can be found in [quantum/audio/song_list.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/song_list.h) - feel free to add your own to this list! All available notes can be seen in [quantum/audio/musical_notes.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/musical_notes.h). +Additionally, if you with to maintain your own list of songs (such as ones that may be copyrighted) and not have them added to the repo, you can create a `user_song_list.h` file and place it in your keymap (or userspace) folder. This file will be automatically included, it just needs to exist. + To play a custom sound at a particular time, you can define a song like this (near the top of the file): ```c diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md index d2dc6103a6..f3b659b1bc 100644 --- a/docs/feature_oled_driver.md +++ b/docs/feature_oled_driver.md @@ -263,22 +263,11 @@ void oled_write(const char *data, bool invert); void oled_write_ln(const char *data, bool invert); // Pans the buffer to the right (or left by passing true) by moving contents of the buffer -// Useful for moving the screen in preparation for new drawing +// Useful for moving the screen in preparation for new drawing // oled_scroll_left or oled_scroll_right should be preferred for all cases of moving a static // image such as a logo or to avoid burn-in as it's much, much less cpu intensive void oled_pan(bool left); -// Writes a PROGMEM string to the buffer at current cursor position -// Advances the cursor while writing, inverts the pixels if true -// Remapped to call 'void oled_write(const char *data, bool invert);' on ARM -void oled_write_P(const char *data, bool invert); - -// Writes a PROGMEM string to the buffer at current cursor position -// Advances the cursor while writing, inverts the pixels if true -// Advances the cursor to the next page, wiring ' ' to the remainder of the current page -// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM -void oled_write_ln_P(const char *data, bool invert); - // Returns a pointer to the requested start index in the buffer plus remaining // buffer length as struct oled_buffer_reader_t oled_read_raw(uint16_t start_index); @@ -289,13 +278,24 @@ void oled_write_raw(const char *data, uint16_t size); // Writes a single byte into the buffer at the specified index void oled_write_raw_byte(const char data, uint16_t index); -// Writes a PROGMEM string to the buffer at current cursor position -void oled_write_raw_P(const char *data, uint16_t size); - // Sets a specific pixel on or off // Coordinates start at top-left and go right and down for positive x and y void oled_write_pixel(uint8_t x, uint8_t y, bool on); +// Writes a PROGMEM string to the buffer at current cursor position +// Advances the cursor while writing, inverts the pixels if true +// Remapped to call 'void oled_write(const char *data, bool invert);' on ARM +void oled_write_P(const char *data, bool invert); + +// Writes a PROGMEM string to the buffer at current cursor position +// Advances the cursor while writing, inverts the pixels if true +// Advances the cursor to the next page, wiring ' ' to the remainder of the current page +// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM +void oled_write_ln_P(const char *data, bool invert); + +// Writes a PROGMEM string to the buffer at current cursor position +void oled_write_raw_P(const char *data, uint16_t size); + // Can be used to manually turn on the screen if it is off // Returns true if the screen was on or turns on bool oled_on(void); diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c index 082115d534..8e5ed5f070 100644 --- a/drivers/oled/oled_driver.c +++ b/drivers/oled/oled_driver.c @@ -115,7 +115,7 @@ bool oled_initialized = false; bool oled_active = false; bool oled_scrolling = false; uint8_t oled_brightness = OLED_BRIGHTNESS; -uint8_t oled_rotation = 0; +oled_rotation_t oled_rotation = 0; uint8_t oled_rotation_width = 0; uint8_t oled_scroll_speed = 0; // this holds the speed after being remapped to ssd1306 internal values uint8_t oled_scroll_start = 0; @@ -158,7 +158,7 @@ static void InvertCharacter(uint8_t *cursor) { } } -bool oled_init(uint8_t rotation) { +bool oled_init(oled_rotation_t rotation) { #if defined(USE_I2C) && defined(SPLIT_KEYBOARD) if (!is_keyboard_master()) { return true; @@ -491,8 +491,9 @@ void oled_write_raw(const char *data, uint16_t size) { uint16_t cursor_start_index = oled_cursor - &oled_buffer[0]; if ((size + cursor_start_index) > OLED_MATRIX_SIZE) size = OLED_MATRIX_SIZE - cursor_start_index; for (uint16_t i = cursor_start_index; i < cursor_start_index + size; i++) { - if (oled_buffer[i] == data[i]) continue; - oled_buffer[i] = data[i]; + uint8_t c = *data++; + if (oled_buffer[i] == c) continue; + oled_buffer[i] = c; oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE)); } } diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h index cbf5380ee0..a6b85f37e6 100644 --- a/drivers/oled/oled_driver.h +++ b/drivers/oled/oled_driver.h @@ -226,13 +226,17 @@ void oled_write(const char *data, bool invert); void oled_write_ln(const char *data, bool invert); // Pans the buffer to the right (or left by passing true) by moving contents of the buffer +// Useful for moving the screen in preparation for new drawing void oled_pan(bool left); // Returns a pointer to the requested start index in the buffer plus remaining // buffer length as struct oled_buffer_reader_t oled_read_raw(uint16_t start_index); +// Writes a string to the buffer at current cursor position void oled_write_raw(const char *data, uint16_t size); + +// Writes a single byte into the buffer at the specified index void oled_write_raw_byte(const char data, uint16_t index); // Sets a specific pixel on or off @@ -251,17 +255,11 @@ void oled_write_P(const char *data, bool invert); // Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM void oled_write_ln_P(const char *data, bool invert); +// Writes a PROGMEM string to the buffer at current cursor position void oled_write_raw_P(const char *data, uint16_t size); #else -// Writes a string to the buffer at current cursor position -// Advances the cursor while writing, inverts the pixels if true # define oled_write_P(data, invert) oled_write(data, invert) - -// Writes a string to the buffer at current cursor position -// Advances the cursor while writing, inverts the pixels if true -// Advances the cursor to the next page, wiring ' ' to the remainder of the current page # define oled_write_ln_P(data, invert) oled_write(data, invert) - # define oled_write_raw_P(data, size) oled_write_raw(data, size) #endif // defined(__AVR__) diff --git a/keyboards/babyv/keymaps/melonbred/keymap.c b/keyboards/babyv/keymaps/melonbred/keymap.c new file mode 100644 index 0000000000..ea62241e9d --- /dev/null +++ b/keyboards/babyv/keymaps/melonbred/keymap.c @@ -0,0 +1,62 @@ +/* Copyright 2020 melonbred + * + * 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 + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + LAYER0, + LAYER1, + LAYER2, +}; + + +// Tap Dance Declarations +enum { + TD_M_D = 0, + TD_P_M +}; + +// Tap Dance Definition +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for minus, tap twice for divide + [TD_M_D] = ACTION_TAP_DANCE_DOUBLE(KC_PMNS, KC_PSLS), + //Tap once for plus, tap twice for multiply + [TD_P_M] = ACTION_TAP_DANCE_DOUBLE(KC_PPLS, KC_PAST) +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [LAYER0] = LAYOUT_2u( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + CTL_T(KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + MO(LAYER2), KC_LALT, LT(LAYER1, KC_SPC), KC_SPC, KC_RALT, KC_LGUI + ), + + [LAYER1] = LAYOUT_2u( + KC_GRV, KC_QUOT, _______, KC_UP, _______, _______, KC_7, KC_8, KC_9, KC_PMNS, KC_PSLS, KC_DEL, + KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_4, KC_5, KC_6, KC_PPLS, KC_PAST, KC_ENT, + KC_LSFT, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_1, KC_2, KC_3, XXXXXXX, XXXXXXX, KC_RSFT, + XXXXXXX, _______, _______, KC_0, KC_PDOT, _______ + ), + + [LAYER2] = LAYOUT_2u( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_VOLU, KC_MPLY, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_VOLD, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, KC_RCTL, KC_RALT, KC_DEL, XXXXXXX, + _______, KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), +}; diff --git a/keyboards/kmac_pad/config.h b/keyboards/kmac_pad/config.h new file mode 100644 index 0000000000..eb33a994b3 --- /dev/null +++ b/keyboards/kmac_pad/config.h @@ -0,0 +1,102 @@ +/* +Copyright 2021 talsu <talsu84@gmail.com> + +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 0x4B4D // KM +#define PRODUCT_ID 0x4143 // AC +#define DEVICE_VER 0x0104 +#define MANUFACTURER KBDMania +#define PRODUCT KMAC PAD + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 4 + +/* + * Keyboard Matrix Assignments + * The KMAC uses demultiplexers for the cols, they are only included here as documentation. + * See matrix.c for more details. + */ +#define MATRIX_ROW_PINS { E2, D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { C7, C6, B6, B5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL*/ +// #define DIODE_DIRECTION COL2ROW + +// #define LED_CAPS_LOCK_PIN B0 +// #define LED_SCROLL_LOCK_PIN E6 +// #define LED_PIN_ON_STATE 0 + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* 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 + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION diff --git a/keyboards/kmac_pad/info.json b/keyboards/kmac_pad/info.json new file mode 100644 index 0000000000..6a17b3d452 --- /dev/null +++ b/keyboards/kmac_pad/info.json @@ -0,0 +1,35 @@ +{ + "keyboard_name": "KMAC PAD", + "maintainer": "talsu", + "width": 4, + "height": 6.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"K00", "x":3, "y":0}, + + {"label":"K10", "x":0, "y":1.25}, + {"label":"K11", "x":1, "y":1.25}, + {"label":"K12", "x":2, "y":1.25}, + {"label":"K13", "x":3, "y":1.25}, + + {"label":"K20", "x":0, "y":2.25}, + {"label":"K21", "x":1, "y":2.25}, + {"label":"K22", "x":2, "y":2.25}, + {"label":"K23", "x":3, "y":2.25, "h":2}, + + {"label":"K30", "x":0, "y":3.25}, + {"label":"K31", "x":1, "y":3.25}, + {"label":"K32", "x":2, "y":3.25}, + + {"label":"K40", "x":0, "y":4.25}, + {"label":"K41", "x":1, "y":4.25}, + {"label":"K42", "x":2, "y":4.25}, + {"label":"K43", "x":3, "y":4.25, "h":2}, + + {"label":"K50", "x":0, "y":5.25, "w":2}, + {"label":"K52", "x":2, "y":5.25} + ] + } + } +} diff --git a/keyboards/kmac_pad/keymaps/default/keymap.c b/keyboards/kmac_pad/keymaps/default/keymap.c new file mode 100644 index 0000000000..b9b9f823fb --- /dev/null +++ b/keyboards/kmac_pad/keymaps/default/keymap.c @@ -0,0 +1,143 @@ +/* +Copyright 2021 talsu <talsu84@gmail.com> + +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 + +enum kmac_pad_keycodes { + MD_BOOT = SAFE_RANGE, + MCR1, + MCR2, + MCR3, + MCR4, + MCR5, + MCR6, + MCR7, + MCR8, + MCR9, + MCR10, + MCR11, + MCR12 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + TG(1), + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_P4, KC_P5, KC_P6, + KC_P1, KC_P2, KC_P3, KC_PENT, + KC_P0, KC_PDOT ), + [1] = LAYOUT( /* FN */ + KC_TRNS, + MCR1, MCR2, MCR3, KC_TRNS, + MCR4, MCR5, MCR6, KC_TRNS, + MCR7, MCR8, MCR9, + MCR10, MCR11, MCR12, KC_TRNS, + KC_TRNS, MD_BOOT ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case MD_BOOT: + { + static uint32_t key_timer; + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 2000) { + reset_keyboard(); + } + } + return false; + } + case MCR1: + if (record->event.pressed) { + SEND_STRING("Macro 1"); + } + return false; + case MCR2: + if (record->event.pressed) { + SEND_STRING("Macro 2"); + } + return false; + case MCR3: + if (record->event.pressed) { + SEND_STRING("Macro 3"); + } + return false; + case MCR4: + if (record->event.pressed) { + SEND_STRING("Macro 4"); + } + return false; + case MCR5: + if (record->event.pressed) { + SEND_STRING("Macro 5"); + } + return false; + case MCR6: + if (record->event.pressed) { + SEND_STRING("Macro 6"); + } + return false; + case MCR7: + if (record->event.pressed) { + SEND_STRING("Macro 7"); + } + return false; + case MCR8: + if (record->event.pressed) { + SEND_STRING("Macro 8"); + } + return false; + case MCR9: + if (record->event.pressed) { + SEND_STRING("Macro 9"); + } + return false; + case MCR10: + if (record->event.pressed) { + SEND_STRING("Macro 10"); + } + return false; + case MCR11: + if (record->event.pressed) { + SEND_STRING("Macro 12"); + } + return false; + case MCR12: + if (record->event.pressed) { + SEND_STRING("Macro 12"); + } + return false; + default: + return true; + } + +} + +bool led_update_user(led_t led_state) { + writePin(B1, led_state.num_lock); + return false; +} + + +layer_state_t layer_state_set_user(layer_state_t state) { + writePin(B3, !IS_LAYER_ON_STATE(state, 0)); + return state; +} diff --git a/keyboards/kmac_pad/keymaps/default/readme.md b/keyboards/kmac_pad/keymaps/default/readme.md new file mode 100644 index 0000000000..3b9b739a2a --- /dev/null +++ b/keyboards/kmac_pad/keymaps/default/readme.md @@ -0,0 +1,61 @@ +# The default keymap for KMAC PAD + +This is the default keymap. It implements the same features as the official default KMAC PAD firmware. + +## Layers + +The keymap has two layers. Press the 'FN' key to toggle the Default layer and Function layer. + +### Layer 1: Default Layer + + ,---. + |TG1| + `---' + ,---------------. + |NUM| / | * | - | + |---------------| + | 7 | 8 | 9 | | + |-----------| + | + | 4 | 5 | 6 | | + |---------------| + | 1 | 2 | 3 | | + |-----------|Ent| + | 0 | . | | + '---------------' + +### Layer 2: Function Layer + + ,---. + |TG1| + `---' + ,---------------. + |M1 |M2 |M3 | | + |---------------| + |M4 |M5 |M6 | | + |-----------| | + |M7 |M8 |M9 | | + |---------------| + |M10|M11|M12| | + |-----------| | + | | | | + '---------------' + +## Macros + +The default macro is typed with meaningless strings that exist as samples. + + +| Macro | Action | +|:-----:| -------------------------------------- | +| 1 | Types `Macro 1` | +| 2 | Types `Macro 2` | +| 3 | Types `Macro 3` | +| 4 | Types `Macro 4` | +| 5 | Types `Macro 5` | +| 6 | Types `Macro 6` | +| 7 | Types `Macro 7` | +| 8 | Types `Macro 8` | +| 9 | Types `Macro 9` | +| 10 | Types `Macro 10` | +| 11 | Types `Macro 11` | +| 12 | Types `Macro 12` | diff --git a/keyboards/kmac_pad/kmac_pad.c b/keyboards/kmac_pad/kmac_pad.c new file mode 100644 index 0000000000..87083668cc --- /dev/null +++ b/keyboards/kmac_pad/kmac_pad.c @@ -0,0 +1,29 @@ +/* +Copyright 2021 talsu <talsu84@gmail.com> + +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 "kmac_pad.h" + +void keyboard_pre_init_kb(void) { + + /* Set Backlight pin as output + * FN Pin PB3 + * PAD Pin PB1 + */ + setPinOutput(B3); + setPinOutput(B1); + keyboard_pre_init_user(); +} diff --git a/keyboards/kmac_pad/kmac_pad.h b/keyboards/kmac_pad/kmac_pad.h new file mode 100644 index 0000000000..9979608339 --- /dev/null +++ b/keyboards/kmac_pad/kmac_pad.h @@ -0,0 +1,37 @@ +/* +Copyright 2021 talsu <talsu84@gmail.com> + +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( \ + K00, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, \ + K40, K41, K42, K43, \ + K50, K52 \ +) \ +{ \ + { K00, KC_NO, KC_NO, KC_NO }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, KC_NO }, \ + { K40, K41, K42, K43 }, \ + { K50, KC_NO, K52, KC_NO } \ +} diff --git a/keyboards/kmac_pad/matrix.c b/keyboards/kmac_pad/matrix.c new file mode 100644 index 0000000000..476e40f514 --- /dev/null +++ b/keyboards/kmac_pad/matrix.c @@ -0,0 +1,111 @@ +/* +Copyright 2021 talsu <talsu84@gmail.com> + +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 "wait.h" +#include "matrix.h" +#include "quantum.h" + +static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* Columns 0 - 3 + * col / pin: + * 0: C7 + * 1: C6 + * 2: B6 + * 3: B5 + */ +static void unselect_cols(void) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + setPinOutput(col_pins[col]); + writePinLow(col_pins[col]); + } +} + +static void select_col(uint8_t col) { + writePinHigh(col_pins[col]); +} + +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { + bool matrix_changed = false; + + // Select col and wait for col selecton to stabilize + select_col(current_col); + wait_us(30); + + // row:0 , col:0 FN key is DIRECT_PIN + if (current_col == 0) { + + matrix_row_t last_row_value = current_matrix[0]; + if (readPin(row_pins[0]) == 0) { + // Pin LO, set col bit + current_matrix[0] |= (1 << current_col); + } else { + // Pin HI, clear col bit + current_matrix[0] &= ~(1 << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[0]) && !(matrix_changed)) { + matrix_changed = true; + } + } + + // other row use MATRIX + for (uint8_t row_index = 1; row_index < MATRIX_ROWS; row_index++) { + + matrix_row_t last_row_value = current_matrix[row_index]; + if (readPin(row_pins[row_index]) == 0) { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(1 << current_col); + } else { + // Pin LO, set col bit + current_matrix[row_index] |= (1 << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) { + matrix_changed = true; + } + } + + + // Unselect cols + unselect_cols(); + + return matrix_changed; +} + +void matrix_init_custom(void) { + // initialize hardware and global matrix state here + unselect_cols(); + + // initialize key pins + for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { + setPinInputHigh(row_pins[row_index]); + } +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + bool changed = false; + + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { + changed |= read_rows_on_col(current_matrix, current_col); + } + + return changed; +} diff --git a/keyboards/kmac_pad/readme.md b/keyboards/kmac_pad/readme.md new file mode 100644 index 0000000000..7605501f3a --- /dev/null +++ b/keyboards/kmac_pad/readme.md @@ -0,0 +1,56 @@ +# KMAC PAD + +![kmac_pad](https://i.imgur.com/4P1ybgNl.jpg) + +KMAC PAD is a num pad keyboard. +It can be used independently, but can also be used by connecting with KMAC keyboard case. + +* Keyboard Maintainer: [talsu](https://github.com/talsu) +* Hardware Supported: KMAC PAD +* Hardware Availability: http://www.kbdmania.net/xe/news/5232321 + +Make example for this keyboard (after setting up your build environment): + + make kmac_pad:default + +Flashing example for this keyboard: + + make kmac_pad: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). + +## Bootloader + +The PCB is hardwired to run the bootloader if the key at the `FN` position (the only key in first row) is held down when connecting the keyboard. + +## PCB + +![Imgur](https://i.imgur.com/ML66cvfl.jpg) +![Imgur](https://i.imgur.com/Kr2Wdtkl.jpg) + +### Switch Pins + +The FN key in the `Row 0` is directly connected to the E2 pin. +The rest of the rows below that use MATRIX. (`Row 1 ~ Row 5`) +| Row | Pin | +|:-----:| -------- |