| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700 |
- /* Copyright 2021 Felix Springer
- *
- * 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/>.
- */
- RGB_MATRIX_EFFECT(base_effect)
- RGB_MATRIX_EFFECT(base_ad_effect)
- RGB_MATRIX_EFFECT(vi_effect)
- RGB_MATRIX_EFFECT(fn_indicator)
- RGB_MATRIX_EFFECT(kb_indicator)
- RGB_MATRIX_EFFECT(kitt_effect)
- #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
- /*
- [_LEDS] = LAYOUT_65_ansi(
- 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 ,
- 15 , 16 Q, 17 W, 18 E, 19 R, 20 T, 21 Y, 22 U, 23 I, 24 O, 25 P, 26 , 27 , 28 , 29 ,
- 30 , 31 A, 32 S, 33 D, 34 F, 35 G, 36 H, 37 J, 38 K, 39 L, 40 , 41 , 42 , 43 ,
- 44 , 45 Z, 46 X, 47 C, 48 V, 49 B, 50 N, 51 M, 52 , 53 , 54 , 55 , 56 , 57 ,
- 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67
- )
- */
- // variable for startup animation
- bool BASE_EFFECT_NOT_STARTED_YET = true;
- uint8_t base_effect_startup_counter = 255;
- static HSV base_effect_math(HSV hsv, uint8_t i, uint8_t time) {
- if (BASE_EFFECT_NOT_STARTED_YET) {
- base_effect_startup_counter = 0;
- BASE_EFFECT_NOT_STARTED_YET = false;
- }
- // startup animation
- if (base_effect_startup_counter < 255) {
- // jump to correct indices for alpha keys
- if (i == 0) { // only run for one key (key 0 is an arbitrary choice)
- if (base_effect_startup_counter == 0) {
- base_effect_startup_counter = 1;
- } else if (base_effect_startup_counter == 1) {
- base_effect_startup_counter = 17;
- } else if (base_effect_startup_counter == 26) {
- base_effect_startup_counter = 31;
- } else if (base_effect_startup_counter == 40) {
- base_effect_startup_counter = 45;
- } else if (base_effect_startup_counter == 52) {
- base_effect_startup_counter = 100;
- } else if (base_effect_startup_counter == 120) {
- base_effect_startup_counter = 255;
- } else {
- base_effect_startup_counter++;
- }
- }
- // overwrite some highlit keys
- if (3 + 39 - i < base_effect_startup_counter - 100 && i >= 36 && i <= 39) {
- hsv.s = hsv.s;
- } else if (3 + 39 - i < base_effect_startup_counter - 100 && i >= 31 && i <= 34) {
- hsv.s = hsv.s;
- // light up alpha keys
- } else if (i < base_effect_startup_counter && i >= 16 && i <= 25) {
- hsv.s = 0;
- } else if (31 + 39 - i < base_effect_startup_counter && i >= 31 && i <= 39) {
- hsv.s = 0;
- } else if (i < base_effect_startup_counter && i >= 45 && i <= 51) {
- hsv.s = 0;
- // light up number row
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 2) {
- hsv.s = 0;
- hsv.v = 1 * (hsv.v / 8);
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 3) {
- hsv.s = 0;
- hsv.v = 2 * (hsv.v / 8);
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 4) {
- hsv.s = 0;
- hsv.v = 3 * (hsv.v / 8);
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i >= 5 && i <= 8) {
- hsv.v = hsv.v;
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 9) {
- hsv.s = 0;
- hsv.v = 3 * (hsv.v / 8);
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 10) {
- hsv.s = 0;
- hsv.v = 2 * (hsv.v / 8);
- } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 11) {
- hsv.s = 0;
- hsv.v = 1 * (hsv.v / 8);
- // light up punctuation keys
- } else if (27 + 1 - i < base_effect_startup_counter - 100 && i >= 26 && i <= 27) {
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- } else if (41 + 2 - i < base_effect_startup_counter - 100 && i >= 40 && i <= 41) {
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- } else if (54 + 3 - i < base_effect_startup_counter - 100 && i >= 52 && i <= 54) {
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- // rest
- } else {
- hsv.v = 0;
- }
- } else {
- switch (i) {
- // number row
- case 0:
- hsv.v = 0;
- break;
- case 1:
- hsv.v = 0;
- break;
- case 2:
- hsv.s = 0;
- hsv.v = 1 * (hsv.v / 8);
- break;
- case 3:
- hsv.s = 0;
- hsv.v = 2 * (hsv.v / 8);
- break;
- case 4:
- hsv.s = 0;
- hsv.v = 3 * (hsv.v / 8);
- break;
- case 5:
- hsv.v = hsv.v;
- break;
- case 6:
- hsv.v = hsv.v;
- break;
- case 7:
- hsv.v = hsv.v;
- break;
- case 8:
- hsv.v = hsv.v;
- break;
- case 9:
- hsv.s = 0;
- hsv.v = 3 * (hsv.v / 8);
- break;
- case 10:
- hsv.s = 0;
- hsv.v = 2 * (hsv.v / 8);
- break;
- case 11:
- hsv.s = 0;
- hsv.v = 1 * (hsv.v / 8);
- break;
- case 12:
- hsv.v = 0;
- break;
- // punctuation keys
- case 26:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- case 27:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- case 40:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- case 41:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- case 52:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- case 53:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- case 54:
- hsv.s = 0;
- hsv.v = hsv.v / 8;
- break;
- default:
- if (
- (i > 15 && i <= 25) ||
- (i > 30 && i <= 39) ||
- (i > 44 && i <= 51)
- ) {
- if (i > 35 && i <= 39) {
- hsv.s = hsv.s;
- } else if (i > 30 && i <= 34) {
- hsv.s = hsv.s;
- } else {
- hsv.s = 0;
- }
- } else {
- hsv.v = 0;
- }
- break;
- }
- }
- return hsv;
- }
- bool base_effect(effect_params_t* params) {
- return effect_runner_i(params, &base_effect_math);
- }
- static HSV base_ad_effect_math(HSV hsv, uint8_t i, uint8_t time) {
- // no startup animation
- if (BASE_EFFECT_NOT_STARTED_YET) {
- base_effect_startup_counter = 255; // act like startup is already completed
- BASE_EFFECT_NOT_STARTED_YET = false;
- }
- switch (i) {
- // delete
- case 14:
- hsv.h = 0;
- hsv.s = 255;
- break;
- // insert
- case 29:
- hsv.h = 255/3;
- hsv.s = 255;
- break;
- // home
- case 43:
- hsv.s = 0;
- break;
- // end
- case 57:
- hsv.s = 255;
- break;
- default:
- hsv = base_effect_math(hsv, i, time);
- break;
- }
- return hsv;
- }
- bool base_ad_effect(effect_params_t* params) {
- return effect_runner_i(params, &base_ad_effect_math);
- }
- static HSV vi_effect_math(HSV hsv, uint8_t i, uint8_t time) {
- // no startup animation
- if (BASE_EFFECT_NOT_STARTED_YET) {
- base_effect_startup_counter = 255; // act like startup is already completed
- BASE_EFFECT_NOT_STARTED_YET = false;
- }
- switch (i) {
- // hjkl
- case 36:
- break;
- case 37:
- break;
- case 38:
- break;
- case 39:
- break;
- // page up
- case 22:
- hsv.s = 0;
- break;
- // page down
- case 33:
- hsv.s = 0;
- break;
- // find
- case 54:
- hsv.s = 0;
- break;
- default:
- hsv.v = 0;
- break;
- }
- return hsv;
- }
- bool vi_effect(effect_params_t* params) {
- return effect_runner_i(params, &vi_effect_math);
- }
- static HSV fn_indicator_math(HSV hsv, uint8_t i, uint8_t time) {
- // cancel base effect startup
- base_effect_startup_counter = 255;
- switch (i) {
- // F1 - F12
- case 1:
- hsv.h = 0 * 255 / 3;
- hsv.s = 255;
- break;
- case 2:
- hsv.h = 0 * 255 / 3;
- hsv.s = 255;
- break;
- case 3:
- hsv.h = 0 * 255 / 3;
- hsv.s = 255;
- break;
- case 4:
- hsv.h = 0 * 255 / 3;
- hsv.s = 255;
- break;
- case 5:
- hsv.h = 1 * 255 / 3;
- hsv.s = 255;
- break;
- case 6:
- hsv.h = 1 * 255 / 3;
- hsv.s = 255;
- break;
- case 7:
- hsv.h = 1 * 255 / 3;
- hsv.s = 255;
- break;
- case 8:
- hsv.h = 1 * 255 / 3;
- hsv.s = 255;
- break;
- case 9:
- hsv.h = 2 * 255 / 3;
- hsv.s = 255;
- break;
- case 10:
- hsv.h = 2 * 255 / 3;
- hsv.s = 255;
- break;
- case 11:
- hsv.h = 2 * 255 / 3;
- hsv.s = 255;
- break;
- case 12:
- hsv.h = 2 * 255 / 3;
- hsv.s = 255;
- break;
- // delete/insert
- case 13:
- hsv.h = 0;
- hsv.s = 255;
- break;
- case 14:
- hsv.h = 1 * (255 / 3);
- hsv.s = 255;
- break;
- // paste/copy/cut
- case 29:
- hsv.s = 0;
- break;
- case 43:
- hsv.h = 200;
- hsv.s = 255;
- break;
- case 57:
- hsv.h = 0;
- hsv.s = 255;
- break;
- // print/scroll/pause
- case 25:
- hsv.s = 0;
- break;
- case 26:
- hsv.s = 0;
- break;
- case 27:
- hsv.s = 0;
- break;
- // caps lock
- case 30:
- hsv.s = 0;
- break;
- // modifier
- case 44:
- hsv.s = 0;
- hsv.v = hsv.v / 2;
- break;
- case 55:
- hsv.s = 0;
- hsv.v = hsv.v / 2;
- break;
- case 58:
- hsv.s = 0;
- hsv.v = hsv.v / 2;
- break;
- case 59:
- hsv.s = 0;
- hsv.v = hsv.v / 2;
- break;
- case 60:
- hsv.s = 0;
- hsv.v = hsv.v / 2;
- break;
- case 64:
- hsv.s = 0;
- hsv.v = hsv.v / 2;
- break;
- // volume
- case 18: // mute
- hsv.h = 0;
- break;
- case 17: // increase
- hsv.s = 255;
- break;
- case 32: // decrease
- hsv.s = 0;
- break;
- // brightness
- case 33: // increase
- hsv.s = 255;
- break;
- case 31: // decrease
- hsv.s = 0;
- break;
- // media
- case 65: // previous
- hsv.s = 0;
- break;
- case 67: // next
- hsv.s = 0;
- break;
- case 56: // stop
- hsv.h = 0;
- break;
- case 66: // play/pause
- hsv.h = 255/3;
- break;
- // menu
- case 51:
- hsv.s = 0;
- break;
- // toggle AD layer
- case 36:
- hsv.h = 0;
- break;
- // toggle VI layer
- case 37:
- hsv.h = 255/3;
- break;
- // KB layer
- case 62:
- hsv.h = time;
- hsv.s = 255;
- break;
- // no function
- default:
- hsv.v = 0;
- break;
- }
- return hsv;
- }
- bool fn_indicator(effect_params_t* params) {
- return effect_runner_i(params, &fn_indicator_math);
- }
- static HSV kb_indicator_math(HSV hsv, uint8_t i, uint8_t time) {
- // cancel base effect startup
- base_effect_startup_counter = 255;
- switch (i) {
- // test HSV
- case 14:
- break;
- case 29:
- break;
- case 43:
- break;
- case 57:
- break;
- case 67:
- break;
- // toggle RGB
- case 16:
- hsv.s = 0;
- if (time < (255 / 2)) {
- hsv.v = 255;
- } else {
- hsv.v = 0;
- }
- break;
- // cycle effect
- case 17:
- hsv.s = 255;
- hsv.v = 255;
- if (time < (255 / 3)) {
- hsv.h = 0;
- } else if (time < (2 * 255 / 3)) {
- hsv.h = 255 / 3;
- } else {
- hsv.h = 2 * 255 / 3;
- }
- break;
- // adjust hue
- case 18:
- hsv.h = time;
- hsv.s = 255;
- hsv.v = 255;
- break;
- case 19:
- hsv.h = 255 - time;
- hsv.s = 255;
- hsv.v = 255;
- break;
- // adjust saturation
- case 32:
- hsv.s = 255;
- hsv.v = 255;
- break;
- case 33:
- hsv.s = 0;
- hsv.v = 255;
- break;
- // adjust value
- case 45:
- hsv.v = 255;
- break;
- case 46:
- hsv.v = 63;
- break;
- // adjust speed
- case 4:
- if (((time / 8) % 2) == 0) {
- hsv.v = 255;
- } else {
- hsv.v = 63;
- }
- break;
- case 5:
- if (((time / 16) % 2) == 0) {
- hsv.v = 63;
- } else {
- hsv.v = 255;
- }
- break;
- // set main effect
- case 36: // BASE
- hsv.s = 0;
- break;
- case 37: // KITT
- hsv.h = 0;
- hsv.s = 255;
- if (time < 128) {
- hsv.v = time;
- } else {
- hsv.v = 255 - time;
- }
- break;
- // reset (for flashing)
- case 13:
- hsv.s = 0;
- if (time < 16) {
- hsv.v = 255 - time * 128 / 16;
- } else {
- hsv.v = 127;
- }
- break;
- // reset (reinitialize EEPROM)
- case 42:
- hsv.s = 0;
- hsv.v = 127;
- break;
- // shift
- case 44:
- hsv.s = 0;
- hsv.v = 63;
- break;
- case 55:
- hsv.s = 0;
- hsv.v = 63;
- break;
- // no function
- default:
- hsv.v = 0;
- }
- return hsv;
- }
- bool kb_indicator(effect_params_t* params) {
- return effect_runner_i(params, &kb_indicator_math);
- }
- uint8_t led_count = 7;
- uint8_t led_first = 33;
- static uint8_t time_to_led(uint8_t time, uint8_t led_behind) {
- uint16_t led_time = led_count * time;
- uint16_t step = ((2 * led_count + (led_time / 128)) - led_behind) % (2 * led_count);
- uint8_t led;
- if (step < led_count) {
- led = step;
- } else {
- led = led_count - 1 - (step - led_count);
- }
- return led;
- }
- static HSV kitt_effect_math(HSV hsv, uint8_t i, uint8_t time) {
- // reset base effect startup
- if (i == 0) {
- BASE_EFFECT_NOT_STARTED_YET = true;
- }
- hsv.h = 0;
- hsv.s = 255;
- if (i >= led_first && i < led_first + led_count) {
- uint8_t j = i - led_first;
- if (j == time_to_led(time, 0)) {
- hsv.v = hsv.v;
- } else if (j == time_to_led(time, 1)) {
- hsv.v = hsv.v/2;
- } else if (j == time_to_led(time, 2)) {
- hsv.v = hsv.v/4;
- } else if (j == time_to_led(time, 3)) {
- hsv.v = hsv.v/8;
- } else {
- hsv.v = 0;
- }
- } else {
- hsv.v = 0;
- }
- return hsv;
- }
- bool kitt_effect(effect_params_t* params) {
- return effect_runner_i(params, &kitt_effect_math);
- }
- #endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
- // vim: syntax=c
|