From 99d89b124f51f79d272e4b8b89bc56f7700480b5 Mon Sep 17 00:00:00 2001
From: just-another-jxliu <just-another-jxliu@users.noreply.github.com>
Date: Thu, 15 Aug 2019 00:51:54 -0700
Subject: [PATCH] Drop FW Fixes for massdrop alt, ctrl, rocketeer & shift
 keyboards (#8)

- In config.h of each, added '#define BOOTKEY_HOLD_MS  2000' to define hold time required to active Boot key (was 500ms hardcode)
- Updated all active keymap.c files to use this define
- Added line in quantum.c in MAGIC_TOGGLE_NKRO case to clear_keyboard() before toggling nkro state to fix stuck key issues when switching NKRO.
---
 keyboards/massdrop/alt/config.h                          | 3 +++
 keyboards/massdrop/alt/keymaps/default/keymap.c          | 2 +-
 keyboards/massdrop/alt/keymaps/default_md/keymap.c       | 2 +-
 keyboards/massdrop/alt/keymaps/mac/keymap.c              | 2 +-
 keyboards/massdrop/alt/keymaps/mac_md/keymap.c           | 2 +-
 keyboards/massdrop/ctrl/config.h                         | 3 +++
 keyboards/massdrop/ctrl/keymaps/default/keymap.c         | 2 +-
 keyboards/massdrop/ctrl/keymaps/default_md/keymap.c      | 2 +-
 keyboards/massdrop/ctrl/keymaps/mac/keymap.c             | 2 +-
 keyboards/massdrop/ctrl/keymaps/mac_md/keymap.c          | 2 +-
 keyboards/massdrop/rocketeer/config.h                    | 3 +++
 keyboards/massdrop/rocketeer/keymaps/default_md/keymap.c | 2 +-
 keyboards/massdrop/rocketeer/keymaps/mac_md/keymap.c     | 2 +-
 keyboards/massdrop/shift/config.h                        | 3 +++
 keyboards/massdrop/shift/keymaps/default_md/keymap.c     | 2 +-
 keyboards/massdrop/shift/keymaps/mac_md/keymap.c         | 2 +-
 quantum/quantum.c                                        | 1 +
 17 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/keyboards/massdrop/alt/config.h b/keyboards/massdrop/alt/config.h
index 05199b2da6c9..6ed4208166bf 100644
--- a/keyboards/massdrop/alt/config.h
+++ b/keyboards/massdrop/alt/config.h
@@ -94,6 +94,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 #define DEBOUNCE 5
 
+// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
+#define BOOTKEY_HOLD_MS		2000
+
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 //#define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c
index 83cbe622cdf1..39cd97eb0839 100644
--- a/keyboards/massdrop/alt/keymaps/default/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/default/keymap.c
@@ -84,7 +84,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/alt/keymaps/default_md/keymap.c b/keyboards/massdrop/alt/keymaps/default_md/keymap.c
index 443ad03d1c3a..122e8be641b3 100644
--- a/keyboards/massdrop/alt/keymaps/default_md/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/default_md/keymap.c
@@ -231,7 +231,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c
index 900504e4d46d..9ea817e260e5 100644
--- a/keyboards/massdrop/alt/keymaps/mac/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c
@@ -84,7 +84,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/alt/keymaps/mac_md/keymap.c b/keyboards/massdrop/alt/keymaps/mac_md/keymap.c
index facfd10a150b..e505ef9a83eb 100644
--- a/keyboards/massdrop/alt/keymaps/mac_md/keymap.c
+++ b/keyboards/massdrop/alt/keymaps/mac_md/keymap.c
@@ -231,7 +231,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/ctrl/config.h b/keyboards/massdrop/ctrl/config.h
index b67f3b711761..035f954218a0 100644
--- a/keyboards/massdrop/ctrl/config.h
+++ b/keyboards/massdrop/ctrl/config.h
@@ -94,6 +94,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 #define DEBOUNCE 5
 
+// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
+#define BOOTKEY_HOLD_MS		2000
+
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 //#define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c
index 75c9fd35fa10..0637055d92d1 100644
--- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c
@@ -87,7 +87,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/ctrl/keymaps/default_md/keymap.c b/keyboards/massdrop/ctrl/keymaps/default_md/keymap.c
index ddd90a8fa803..73891473a048 100644
--- a/keyboards/massdrop/ctrl/keymaps/default_md/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/default_md/keymap.c
@@ -234,7 +234,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c
index cceaa1078056..20cd74b5d8a1 100644
--- a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c
@@ -87,7 +87,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/ctrl/keymaps/mac_md/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac_md/keymap.c
index fcf1057d7576..f2b072833873 100644
--- a/keyboards/massdrop/ctrl/keymaps/mac_md/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/mac_md/keymap.c
@@ -234,7 +234,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/rocketeer/config.h b/keyboards/massdrop/rocketeer/config.h
index 3caa0fdf7a3f..d9bab749b27d 100644
--- a/keyboards/massdrop/rocketeer/config.h
+++ b/keyboards/massdrop/rocketeer/config.h
@@ -95,6 +95,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 #define DEBOUNCE 5
 
+// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
+#define BOOTKEY_HOLD_MS		2000
+
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 //#define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
diff --git a/keyboards/massdrop/rocketeer/keymaps/default_md/keymap.c b/keyboards/massdrop/rocketeer/keymaps/default_md/keymap.c
index 633c8a8c7969..c184d750a6c1 100644
--- a/keyboards/massdrop/rocketeer/keymaps/default_md/keymap.c
+++ b/keyboards/massdrop/rocketeer/keymaps/default_md/keymap.c
@@ -231,7 +231,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/rocketeer/keymaps/mac_md/keymap.c b/keyboards/massdrop/rocketeer/keymaps/mac_md/keymap.c
index f227978d58ce..77aaa01fc2fc 100644
--- a/keyboards/massdrop/rocketeer/keymaps/mac_md/keymap.c
+++ b/keyboards/massdrop/rocketeer/keymaps/mac_md/keymap.c
@@ -231,7 +231,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/shift/config.h b/keyboards/massdrop/shift/config.h
index d5a9bb6406ec..f89c7703e8a5 100644
--- a/keyboards/massdrop/shift/config.h
+++ b/keyboards/massdrop/shift/config.h
@@ -125,6 +125,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 #define DEBOUNCE 5
 
+// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
+#define BOOTKEY_HOLD_MS		2000
+
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 //#define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
diff --git a/keyboards/massdrop/shift/keymaps/default_md/keymap.c b/keyboards/massdrop/shift/keymaps/default_md/keymap.c
index 5a9933a99286..9386c291da3c 100644
--- a/keyboards/massdrop/shift/keymaps/default_md/keymap.c
+++ b/keyboards/massdrop/shift/keymaps/default_md/keymap.c
@@ -243,7 +243,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/keyboards/massdrop/shift/keymaps/mac_md/keymap.c b/keyboards/massdrop/shift/keymaps/mac_md/keymap.c
index c4b7a5975b6e..d5977c5c145b 100644
--- a/keyboards/massdrop/shift/keymaps/mac_md/keymap.c
+++ b/keyboards/massdrop/shift/keymaps/mac_md/keymap.c
@@ -243,7 +243,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
             if (record->event.pressed) {
                 key_timer = timer_read32();
             } else {
-                if (timer_elapsed32(key_timer) >= 500) {
+                if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
                     reset_keyboard();
                 }
             }
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 6530738b71d3..e01e98ff0015 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -647,6 +647,7 @@ bool process_record_quantum(keyrecord_t *record) {
             #endif
             break;
           case MAGIC_TOGGLE_NKRO:
+            clear_keyboard();   // clear first buffer to prevent stuck keys -PS080919
             keymap_config.nkro = !keymap_config.nkro;
             break;
           default: