keymap.c (2575B)
1 /* 2 Copyright 2018 Cole Markham 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #include QMK_KEYBOARD_H 19 20 static const char * const ANSWERS[] = { 21 // "Yes" answers 22 "It is certain\n", 23 "It is decidedly so\n", 24 "Without a doubt\n", 25 "Yes definitely\n", 26 "You may rely on it\n", 27 "As I see it, yes\n", 28 "Most likely\n", 29 "Outlook good\n", 30 "Yes\n", 31 "Signs point to yes\n", 32 // Uncertain answers, index 10 33 "Reply hazy try again\n", 34 "Ask again later\n", 35 "Better not tell you now\n", 36 "Cannot predict now\n", 37 "Concentrate and ask again\n", 38 // "No" answers, index 15 39 "Don't count on it\n", 40 "My reply is no\n", 41 "My sources say no\n", 42 "Outlook not so good\n", 43 "Very doubtful\n" 44 }; 45 46 #define UNCERTAIN_BREAK 10 47 #define NO_BREAK 15 48 #define NUM_ANSWERS 20 49 // Timeout of answer color in ms 50 #define ANSWER_TIMEOUT 3000 51 52 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 53 54 LAYOUT( 55 KC_A), 56 }; 57 58 59 void reset_rgb(void); 60 61 bool initialized = 0; 62 uint32_t lastTime = 0; 63 64 void matrix_init_user(void) { 65 if (!initialized){ 66 dprintf("Initializing in matrix_scan_user"); 67 rgblight_enable(); 68 reset_rgb(); 69 initialized = 1; 70 } 71 } 72 73 void matrix_scan_user(void) { 74 if (lastTime > 0 && timer_elapsed32(lastTime) > ANSWER_TIMEOUT) { 75 lastTime = 0; 76 reset_rgb(); 77 } 78 } 79 80 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 81 switch (keycode) { 82 case KC_A: 83 if (record->event.pressed) { 84 uint8_t num = rand() / (RAND_MAX / NUM_ANSWERS + 1); 85 rgblight_mode(1); 86 if (num < UNCERTAIN_BREAK) { 87 rgblight_setrgb(RGB_GREEN); 88 } else if (num < NO_BREAK) { 89 rgblight_setrgb(RGB_YELLOW); 90 } else { 91 rgblight_setrgb(RGB_RED); 92 } 93 send_string(ANSWERS[num]); 94 lastTime = timer_read32(); 95 return false; 96 } 97 } 98 return true; 99 } 100 101 void reset_rgb(void) { 102 // This gets called on init and after the timeout for the answer color 103 // If you want to change the default color/mode, do it here 104 rgblight_sethsv(HSV_BLUE); 105 rgblight_mode(7); 106 }