From 61f95410666319ac5ef0cb3d533b820f45ae237c Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Tue, 25 Sep 2018 16:38:04 -0600 Subject: Keymap: Velocikey implemented at userspace, readme is more helpful (#3974) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna * removed homerow mods, more flashy lighting! * changed delays for lighting. * velocikey code retro fit into userspace to match typing speed currently "working" but isn't as reactive as I want. * Readme and other documentation hidden throughout code * Added a pretty picture * pretty picture actually added * More readme updates * Velocikey now working inside my userspace! * Changed repo macro and fixed readme * Removed media layer, moved media control to LAZY layer * fixed more merge issues when I had to merge... --- users/arkag/arkag.c | 238 ++++++++++++++++++++++++---------------------- users/arkag/arkag.h | 27 ++---- users/arkag/mechmini2.jpg | Bin 0 -> 3548191 bytes users/arkag/readme.md | 28 ++++++ 4 files changed, 159 insertions(+), 134 deletions(-) create mode 100644 users/arkag/mechmini2.jpg (limited to 'users') diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c index c716b5e93..a35e13ed6 100644 --- a/users/arkag/arkag.c +++ b/users/arkag/arkag.c @@ -1,5 +1,10 @@ #include "arkag.h" +/* + Current Layout and Keeb: + https://github.com/arkag/qmk_firmware/blob/master/keyboards/mechmini/v2/keymaps/arkag/keymap.c +*/ + // Start: Written by konstantin: vomindoraan #include #include @@ -8,38 +13,68 @@ void send_unicode_hex_string(const char *str) { if (!str) { return; } // Saftey net while (*str) { - // Find the next code point (token) in the string - for (; *str == ' '; str++); - size_t n = strcspn(str, " "); // Length of the current token - char code_point[n+1]; - strncpy(code_point, str, n); - code_point[n] = '\0'; // Make sure it's null-terminated - - // Normalize the code point: make all hex digits lowercase - for (char *p = code_point; *p; p++) { - *p = tolower(*p); - } - - // Send the code point as a Unicode input string - unicode_input_start(); - send_string(code_point); - unicode_input_finish(); - str += n; // Move to the first ' ' (or '\0') after the current token + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower(*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + str += n; // Move to the first ' ' (or '\0') after the current token } } // End: Written by konstantin: vomindoraan -uint8_t current_os, mod_primary_mask, fade_delay; -uint16_t flash_timer_one, flash_timer_two, - fade_timer_one, fade_timer_two, - active_timer_one, active_timer_two, - elapsed = 0, +// Start: Written by Chris Lewis +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define TYPING_SPEED_MAX_VALUE 200 +uint8_t typing_speed = 0; + +void velocikey_accelerate() { + if (typing_speed < TYPING_SPEED_MAX_VALUE) typing_speed += (TYPING_SPEED_MAX_VALUE / 50); +} + +void velocikey_decelerate() { + static uint16_t decay_timer = 0; + + if (timer_elapsed(decay_timer) > 500 || decay_timer == 0) { + if (typing_speed > 0) typing_speed -= 1; + //Decay a little faster at half of max speed + if (typing_speed > TYPING_SPEED_MAX_VALUE / 2) typing_speed -= 1; + //Decay even faster at 3/4 of max speed + if (typing_speed > TYPING_SPEED_MAX_VALUE / 4 * 3) typing_speed -= 3; + decay_timer = timer_read(); + } +} + +uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue) { + return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE)); +} +// End: Written by Chris Lewis + +uint8_t current_os, + mod_primary_mask, + fade_interval, num_extra_flashes_off = 0; Color underglow, flash_color, saved_color, - hsv_none = {0,0,0}, - hsv_white = {0,0,127}; + hsv_none = {0,0,0}; flashState flash_state = no_flash; fadeState fade_state = add_fade; activityState state = boot; @@ -79,134 +114,103 @@ Color mod_color(Color current_color, bool should_add, uint8_t change_amount) { return current_color; } -void reverse_fade (void) { - if (fade_state == add_fade){ - fade_state = sub_fade; - } else { - fade_state = add_fade; - } -} - void check_state (void) { - static bool activated, deactivated, slept; - switch (state) { - case active: - if (!activated) { - fade_delay = LED_FADE_DELAY; - reverse_fade(); - activated = true; - deactivated = false; - } - active_timer_two = timer_read(); - elapsed = active_timer_two - active_timer_one; - if (elapsed < INACTIVE_DELAY) {return;} - state = inactive; - return; - - case inactive: - if (!deactivated) { - fade_delay = LED_FADE_DELAY * 2; - reverse_fade(); - deactivated = true; - slept = false; - activated = false; - } - active_timer_two = timer_read(); - elapsed = active_timer_two - active_timer_one; - if (elapsed < SLEEP_DELAY) {return;} - state = sleeping; - return; - - case sleeping: - if (!slept) { - fade_delay = LED_FADE_DELAY * 6; - reverse_fade(); - slept = true; - deactivated = false; - activated = false; - } - return; - - case boot: - return; - } + static uint16_t active_timer; + if (!active_timer) {active_timer = timer_read();} + static bool activated, deactivated, slept; + switch (state) { + case active: + if (!activated) { + if (slept) {rgblight_mode_noeeprom(1);} + activated = true; + deactivated = false; + slept = false; + } + fade_interval = velocikey_match_speed(1, 25); + if (timer_elapsed(active_timer) < INACTIVE_DELAY) {return;} + active_timer = timer_read(); + state = inactive; + return; + + case inactive: + if (!deactivated) { + deactivated = true; + activated = false; + slept = false; + } + velocikey_decelerate(); + fade_interval = velocikey_match_speed(1, 25); + if (timer_elapsed(active_timer) < SLEEP_DELAY) {return;} + state = sleeping; + return; + + case sleeping: + if (!slept) { + rgblight_mode_noeeprom(4); + slept = true; + activated = false; + deactivated = false; + } + return; + + case boot: + return; + } } void fade_rgb (void) { - static bool ran_once; - if (flash_state != no_flash) {return;} + static uint16_t fade_timer; if (state == boot) {return;} + if (!fade_timer) {fade_timer = timer_read();} + if (timer_elapsed(fade_timer) < fade_interval) {return;} switch (fade_state) { case add_fade: - if (!ran_once) { - fade_timer_one = timer_read(); - ran_once = true; - } - fade_timer_two = timer_read(); - elapsed = fade_timer_two - fade_timer_one; - if (elapsed < fade_delay) {return;} if (underglow.h == 359) { fade_state = sub_fade; return; } underglow.h = underglow.h + 1; - set_color(underglow, false); - // set_color_at(underglow, 0); - fade_timer_one = fade_timer_two; - return; + break; case sub_fade: - fade_timer_two = timer_read(); - elapsed = fade_timer_two - fade_timer_one; - if (elapsed < fade_delay) {return;} if (underglow.h == 0) { fade_state = add_fade; return; } underglow.h = underglow.h - 1; + break; + } + fade_timer = timer_read(); + if (flash_state == no_flash) { set_color(underglow, false); - // set_color_at(underglow, 0); - fade_timer_one = fade_timer_two; - return; } } void flash_rgb (void) { - static bool ran_once; + static uint16_t flash_timer; switch(flash_state) { case no_flash: return; case flash_off: - if (!ran_once) { - set_color(hsv_none, false); - flash_timer_one = timer_read(); - ran_once = true; - flash_state = flash_on; - return; - } - flash_timer_two = timer_read(); - elapsed = flash_timer_two - flash_timer_one; - if (elapsed >= LED_FLASH_DELAY) { + if (!flash_timer) {flash_timer = timer_read();} + if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) { set_color(hsv_none, false); - flash_timer_one = timer_read(); + flash_timer = timer_read(); flash_state = flash_on; } return; case flash_on: - flash_timer_two = timer_read(); - elapsed = flash_timer_two - flash_timer_one; - if (elapsed >= LED_FLASH_DELAY) { + if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) { set_color(flash_color, false); - flash_timer_one = timer_read(); + flash_timer = timer_read(); if (num_extra_flashes_off > 0) { flash_state = flash_off; num_extra_flashes_off--; } else { set_color(underglow, false); flash_state = no_flash; - ran_once = false; } } return; @@ -239,8 +243,9 @@ void set_os (uint8_t os, bool update) { mod_primary_mask = MOD_CTL_MASK; } set_color(underglow, update); - flash_color = underglow; - flash_state = flash_off; + flash_color = underglow; + flash_state = flash_off; + state = boot; num_extra_flashes_off = 1; } @@ -462,7 +467,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case M_REPO: if (record->event.pressed) { - SEND_STRING("https://github.com/arkag/qmk_firmware/tree/master/keyboards/mechmini/v2/keymaps/arkag"); + SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); } return false; @@ -505,10 +510,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_LSFT: if (record->event.pressed) { - set_color(mod_color(underglow, true, 50), false); + save_color(underglow); + underglow = mod_color(underglow, true, 75); SEND_STRING(SS_DOWN(X_LSHIFT)); } else { - set_color(underglow, false); + reset_color(); SEND_STRING(SS_UP(X_LSHIFT)); } return false; @@ -522,8 +528,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { default: if (record->event.pressed) { - active_timer_one = timer_read(); state = active; + velocikey_accelerate(); } return true; } diff --git a/users/arkag/arkag.h b/users/arkag/arkag.h index 9c81e4487..a4672a8e8 100644 --- a/users/arkag/arkag.h +++ b/users/arkag/arkag.h @@ -25,26 +25,13 @@ #define MOD_GUI_MASK (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) #define MOD_SFT_MASK (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) -#define TAP_A LALT_T(KC_A) -#define TAP_SCN RALT_T(KC_SCOLON) - -#define TAP_S LCTL_T(KC_S) -#define TAP_L RCTL_T(KC_L) - -#define TAP_D LSFT_T(KC_D) -#define TAP_K RSFT_T(KC_K) - -#define TAP_F LGUI_T(KC_F) -#define TAP_J RGUI_T(KC_J) - -#define TAP_EQ LSFT_T(KC_EQUAL) -#define TAP_5 RSFT_T(KC_5) - #define LED_FLASH_DELAY 150 -#define LED_FADE_DELAY 10 -#define INACTIVE_DELAY 200 -#define SLEEP_DELAY 60000 +#define ACCEL_DELAY 500 +#define DEACCEL_DELAY 500 + +#define INACTIVE_DELAY 250 +#define SLEEP_DELAY 180000 enum { _QWERTY = 0, @@ -124,6 +111,10 @@ enum tapdances { void send_unicode_hex_string(const char *str); +void velocikey_accelerate(void); +void velocikey_decelerate(void); +uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue); + void set_color (Color new, bool update); void save_color(Color to_save); void reset_color(void); diff --git a/users/arkag/mechmini2.jpg b/users/arkag/mechmini2.jpg new file mode 100644 index 000000000..611a0859c Binary files /dev/null and b/users/arkag/mechmini2.jpg differ diff --git a/users/arkag/readme.md b/users/arkag/readme.md index 76a5c4525..c685892f8 100644 --- a/users/arkag/readme.md +++ b/users/arkag/readme.md @@ -1,3 +1,26 @@ +# Shot on Pixel 2 XL with Cheap Lamp at Work + +![mmm, tasty](mechmini2.jpg) + +# I don't know what I'm doing + +Some links: +* [Layout File: Mech Mini 2](layout_mm2) +* [Userspace Header](arkag_h) +* [Userspace Main](arkag_c) + +Here's a list of some things I have working with my currently [keyboard](mm2_home): + +* Reactive (sort of) fading while typing, ported from [Velocikey](https://github.com/qmk/qmk_firmware/pull/3754). +* OS Switching, storing to EEPROM +* OS Specific Macros and Shortcuts(WIN+SHIFT+S for Windows and CMD+SHIFT+4 for MacOS) +* Flashing RGB LED on OS change +* Hex Unicode Macros dependent on OS(half works on Windows due to [WinCompose](https://github.com/SamHocevar/wincompose) not functioning properly just yet). +* "Sleep" function activates after 3 minutes (breathing). +* Markdown style macros for surround type __eve__ ~~ryw~~ *her* **eee** (apparently only certain places support underline and strikethrough ಠ__ಠ) + +# License Stuff + Copyright 2018 arkag arkag@pm.me This program is free software: you can redistribute it and/or modify @@ -12,3 +35,8 @@ 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 . + +[arkag_c]: /users/arkag/arkag.c +[arkag_h]: /users/arkag/arkag.h +[layout_mm2]: /keyboards/mechmini/v2/keymaps/arkag/keymap.c +[mm2_home]: https://cartel.ltd/projects/mechmini2/ -- cgit v1.2.3-24-g4f1b