rgb_matrix_user.inc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. /* Copyright 2021 Felix Springer
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. RGB_MATRIX_EFFECT(base_effect)
  17. RGB_MATRIX_EFFECT(base_ad_effect)
  18. RGB_MATRIX_EFFECT(vi_effect)
  19. RGB_MATRIX_EFFECT(fn_indicator)
  20. RGB_MATRIX_EFFECT(kb_indicator)
  21. RGB_MATRIX_EFFECT(kitt_effect)
  22. #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
  23. /*
  24. [_LEDS] = LAYOUT_65_ansi(
  25. 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 ,
  26. 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 ,
  27. 30 , 31 A, 32 S, 33 D, 34 F, 35 G, 36 H, 37 J, 38 K, 39 L, 40 , 41 , 42 , 43 ,
  28. 44 , 45 Z, 46 X, 47 C, 48 V, 49 B, 50 N, 51 M, 52 , 53 , 54 , 55 , 56 , 57 ,
  29. 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67
  30. )
  31. */
  32. // variable for startup animation
  33. bool BASE_EFFECT_NOT_STARTED_YET = true;
  34. uint8_t base_effect_startup_counter = 255;
  35. static HSV base_effect_math(HSV hsv, uint8_t i, uint8_t time) {
  36. if (BASE_EFFECT_NOT_STARTED_YET) {
  37. base_effect_startup_counter = 0;
  38. BASE_EFFECT_NOT_STARTED_YET = false;
  39. }
  40. // startup animation
  41. if (base_effect_startup_counter < 255) {
  42. // jump to correct indices for alpha keys
  43. if (i == 0) { // only run for one key (key 0 is an arbitrary choice)
  44. if (base_effect_startup_counter == 0) {
  45. base_effect_startup_counter = 1;
  46. } else if (base_effect_startup_counter == 1) {
  47. base_effect_startup_counter = 17;
  48. } else if (base_effect_startup_counter == 26) {
  49. base_effect_startup_counter = 31;
  50. } else if (base_effect_startup_counter == 40) {
  51. base_effect_startup_counter = 45;
  52. } else if (base_effect_startup_counter == 52) {
  53. base_effect_startup_counter = 100;
  54. } else if (base_effect_startup_counter == 120) {
  55. base_effect_startup_counter = 255;
  56. } else {
  57. base_effect_startup_counter++;
  58. }
  59. }
  60. // overwrite some highlit keys
  61. if (3 + 39 - i < base_effect_startup_counter - 100 && i >= 36 && i <= 39) {
  62. hsv.s = hsv.s;
  63. } else if (3 + 39 - i < base_effect_startup_counter - 100 && i >= 31 && i <= 34) {
  64. hsv.s = hsv.s;
  65. // light up alpha keys
  66. } else if (i < base_effect_startup_counter && i >= 16 && i <= 25) {
  67. hsv.s = 0;
  68. } else if (31 + 39 - i < base_effect_startup_counter && i >= 31 && i <= 39) {
  69. hsv.s = 0;
  70. } else if (i < base_effect_startup_counter && i >= 45 && i <= 51) {
  71. hsv.s = 0;
  72. // light up number row
  73. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 2) {
  74. hsv.s = 0;
  75. hsv.v = 1 * (hsv.v / 8);
  76. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 3) {
  77. hsv.s = 0;
  78. hsv.v = 2 * (hsv.v / 8);
  79. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 4) {
  80. hsv.s = 0;
  81. hsv.v = 3 * (hsv.v / 8);
  82. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i >= 5 && i <= 8) {
  83. hsv.v = hsv.v;
  84. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 9) {
  85. hsv.s = 0;
  86. hsv.v = 3 * (hsv.v / 8);
  87. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 10) {
  88. hsv.s = 0;
  89. hsv.v = 2 * (hsv.v / 8);
  90. } else if (12 + 1 - i < base_effect_startup_counter - 100 && i == 11) {
  91. hsv.s = 0;
  92. hsv.v = 1 * (hsv.v / 8);
  93. // light up punctuation keys
  94. } else if (27 + 1 - i < base_effect_startup_counter - 100 && i >= 26 && i <= 27) {
  95. hsv.s = 0;
  96. hsv.v = hsv.v / 8;
  97. } else if (41 + 2 - i < base_effect_startup_counter - 100 && i >= 40 && i <= 41) {
  98. hsv.s = 0;
  99. hsv.v = hsv.v / 8;
  100. } else if (54 + 3 - i < base_effect_startup_counter - 100 && i >= 52 && i <= 54) {
  101. hsv.s = 0;
  102. hsv.v = hsv.v / 8;
  103. // rest
  104. } else {
  105. hsv.v = 0;
  106. }
  107. } else {
  108. switch (i) {
  109. // number row
  110. case 0:
  111. hsv.v = 0;
  112. break;
  113. case 1:
  114. hsv.v = 0;
  115. break;
  116. case 2:
  117. hsv.s = 0;
  118. hsv.v = 1 * (hsv.v / 8);
  119. break;
  120. case 3:
  121. hsv.s = 0;
  122. hsv.v = 2 * (hsv.v / 8);
  123. break;
  124. case 4:
  125. hsv.s = 0;
  126. hsv.v = 3 * (hsv.v / 8);
  127. break;
  128. case 5:
  129. hsv.v = hsv.v;
  130. break;
  131. case 6:
  132. hsv.v = hsv.v;
  133. break;
  134. case 7:
  135. hsv.v = hsv.v;
  136. break;
  137. case 8:
  138. hsv.v = hsv.v;
  139. break;
  140. case 9:
  141. hsv.s = 0;
  142. hsv.v = 3 * (hsv.v / 8);
  143. break;
  144. case 10:
  145. hsv.s = 0;
  146. hsv.v = 2 * (hsv.v / 8);
  147. break;
  148. case 11:
  149. hsv.s = 0;
  150. hsv.v = 1 * (hsv.v / 8);
  151. break;
  152. case 12:
  153. hsv.v = 0;
  154. break;
  155. // punctuation keys
  156. case 26:
  157. hsv.s = 0;
  158. hsv.v = hsv.v / 8;
  159. break;
  160. case 27:
  161. hsv.s = 0;
  162. hsv.v = hsv.v / 8;
  163. break;
  164. case 40:
  165. hsv.s = 0;
  166. hsv.v = hsv.v / 8;
  167. break;
  168. case 41:
  169. hsv.s = 0;
  170. hsv.v = hsv.v / 8;
  171. break;
  172. case 52:
  173. hsv.s = 0;
  174. hsv.v = hsv.v / 8;
  175. break;
  176. case 53:
  177. hsv.s = 0;
  178. hsv.v = hsv.v / 8;
  179. break;
  180. case 54:
  181. hsv.s = 0;
  182. hsv.v = hsv.v / 8;
  183. break;
  184. default:
  185. if (
  186. (i > 15 && i <= 25) ||
  187. (i > 30 && i <= 39) ||
  188. (i > 44 && i <= 51)
  189. ) {
  190. if (i > 35 && i <= 39) {
  191. hsv.s = hsv.s;
  192. } else if (i > 30 && i <= 34) {
  193. hsv.s = hsv.s;
  194. } else {
  195. hsv.s = 0;
  196. }
  197. } else {
  198. hsv.v = 0;
  199. }
  200. break;
  201. }
  202. }
  203. return hsv;
  204. }
  205. bool base_effect(effect_params_t* params) {
  206. return effect_runner_i(params, &base_effect_math);
  207. }
  208. static HSV base_ad_effect_math(HSV hsv, uint8_t i, uint8_t time) {
  209. // no startup animation
  210. if (BASE_EFFECT_NOT_STARTED_YET) {
  211. base_effect_startup_counter = 255; // act like startup is already completed
  212. BASE_EFFECT_NOT_STARTED_YET = false;
  213. }
  214. switch (i) {
  215. // delete
  216. case 14:
  217. hsv.h = 0;
  218. hsv.s = 255;
  219. break;
  220. // insert
  221. case 29:
  222. hsv.h = 255/3;
  223. hsv.s = 255;
  224. break;
  225. // home
  226. case 43:
  227. hsv.s = 0;
  228. break;
  229. // end
  230. case 57:
  231. hsv.s = 255;
  232. break;
  233. default:
  234. hsv = base_effect_math(hsv, i, time);
  235. break;
  236. }
  237. return hsv;
  238. }
  239. bool base_ad_effect(effect_params_t* params) {
  240. return effect_runner_i(params, &base_ad_effect_math);
  241. }
  242. static HSV vi_effect_math(HSV hsv, uint8_t i, uint8_t time) {
  243. // no startup animation
  244. if (BASE_EFFECT_NOT_STARTED_YET) {
  245. base_effect_startup_counter = 255; // act like startup is already completed
  246. BASE_EFFECT_NOT_STARTED_YET = false;
  247. }
  248. switch (i) {
  249. // hjkl
  250. case 36:
  251. break;
  252. case 37:
  253. break;
  254. case 38:
  255. break;
  256. case 39:
  257. break;
  258. // page up
  259. case 22:
  260. hsv.s = 0;
  261. break;
  262. // page down
  263. case 33:
  264. hsv.s = 0;
  265. break;
  266. // find
  267. case 54:
  268. hsv.s = 0;
  269. break;
  270. default:
  271. hsv.v = 0;
  272. break;
  273. }
  274. return hsv;
  275. }
  276. bool vi_effect(effect_params_t* params) {
  277. return effect_runner_i(params, &vi_effect_math);
  278. }
  279. static HSV fn_indicator_math(HSV hsv, uint8_t i, uint8_t time) {
  280. // cancel base effect startup
  281. base_effect_startup_counter = 255;
  282. switch (i) {
  283. // F1 - F12
  284. case 1:
  285. hsv.h = 0 * 255 / 3;
  286. hsv.s = 255;
  287. break;
  288. case 2:
  289. hsv.h = 0 * 255 / 3;
  290. hsv.s = 255;
  291. break;
  292. case 3:
  293. hsv.h = 0 * 255 / 3;
  294. hsv.s = 255;
  295. break;
  296. case 4:
  297. hsv.h = 0 * 255 / 3;
  298. hsv.s = 255;
  299. break;
  300. case 5:
  301. hsv.h = 1 * 255 / 3;
  302. hsv.s = 255;
  303. break;
  304. case 6:
  305. hsv.h = 1 * 255 / 3;
  306. hsv.s = 255;
  307. break;
  308. case 7:
  309. hsv.h = 1 * 255 / 3;
  310. hsv.s = 255;
  311. break;
  312. case 8:
  313. hsv.h = 1 * 255 / 3;
  314. hsv.s = 255;
  315. break;
  316. case 9:
  317. hsv.h = 2 * 255 / 3;
  318. hsv.s = 255;
  319. break;
  320. case 10:
  321. hsv.h = 2 * 255 / 3;
  322. hsv.s = 255;
  323. break;
  324. case 11:
  325. hsv.h = 2 * 255 / 3;
  326. hsv.s = 255;
  327. break;
  328. case 12:
  329. hsv.h = 2 * 255 / 3;
  330. hsv.s = 255;
  331. break;
  332. // delete/insert
  333. case 13:
  334. hsv.h = 0;
  335. hsv.s = 255;
  336. break;
  337. case 14:
  338. hsv.h = 1 * (255 / 3);
  339. hsv.s = 255;
  340. break;
  341. // paste/copy/cut
  342. case 29:
  343. hsv.s = 0;
  344. break;
  345. case 43:
  346. hsv.h = 200;
  347. hsv.s = 255;
  348. break;
  349. case 57:
  350. hsv.h = 0;
  351. hsv.s = 255;
  352. break;
  353. // print/scroll/pause
  354. case 25:
  355. hsv.s = 0;
  356. break;
  357. case 26:
  358. hsv.s = 0;
  359. break;
  360. case 27:
  361. hsv.s = 0;
  362. break;
  363. // caps lock
  364. case 30:
  365. hsv.s = 0;
  366. break;
  367. // modifier
  368. case 44:
  369. hsv.s = 0;
  370. hsv.v = hsv.v / 2;
  371. break;
  372. case 55:
  373. hsv.s = 0;
  374. hsv.v = hsv.v / 2;
  375. break;
  376. case 58:
  377. hsv.s = 0;
  378. hsv.v = hsv.v / 2;
  379. break;
  380. case 59:
  381. hsv.s = 0;
  382. hsv.v = hsv.v / 2;
  383. break;
  384. case 60:
  385. hsv.s = 0;
  386. hsv.v = hsv.v / 2;
  387. break;
  388. case 64:
  389. hsv.s = 0;
  390. hsv.v = hsv.v / 2;
  391. break;
  392. // volume
  393. case 18: // mute
  394. hsv.h = 0;
  395. break;
  396. case 17: // increase
  397. hsv.s = 255;
  398. break;
  399. case 32: // decrease
  400. hsv.s = 0;
  401. break;
  402. // brightness
  403. case 33: // increase
  404. hsv.s = 255;
  405. break;
  406. case 31: // decrease
  407. hsv.s = 0;
  408. break;
  409. // media
  410. case 65: // previous
  411. hsv.s = 0;
  412. break;
  413. case 67: // next
  414. hsv.s = 0;
  415. break;
  416. case 56: // stop
  417. hsv.h = 0;
  418. break;
  419. case 66: // play/pause
  420. hsv.h = 255/3;
  421. break;
  422. // menu
  423. case 51:
  424. hsv.s = 0;
  425. break;
  426. // toggle AD layer
  427. case 36:
  428. hsv.h = 0;
  429. break;
  430. // toggle VI layer
  431. case 37:
  432. hsv.h = 255/3;
  433. break;
  434. // KB layer
  435. case 62:
  436. hsv.h = time;
  437. hsv.s = 255;
  438. break;
  439. // no function
  440. default:
  441. hsv.v = 0;
  442. break;
  443. }
  444. return hsv;
  445. }
  446. bool fn_indicator(effect_params_t* params) {
  447. return effect_runner_i(params, &fn_indicator_math);
  448. }
  449. static HSV kb_indicator_math(HSV hsv, uint8_t i, uint8_t time) {
  450. // cancel base effect startup
  451. base_effect_startup_counter = 255;
  452. switch (i) {
  453. // test HSV
  454. case 14:
  455. break;
  456. case 29:
  457. break;
  458. case 43:
  459. break;
  460. case 57:
  461. break;
  462. case 67:
  463. break;
  464. // toggle RGB
  465. case 16:
  466. hsv.s = 0;
  467. if (time < (255 / 2)) {
  468. hsv.v = 255;
  469. } else {
  470. hsv.v = 0;
  471. }
  472. break;
  473. // cycle effect
  474. case 17:
  475. hsv.s = 255;
  476. hsv.v = 255;
  477. if (time < (255 / 3)) {
  478. hsv.h = 0;
  479. } else if (time < (2 * 255 / 3)) {
  480. hsv.h = 255 / 3;
  481. } else {
  482. hsv.h = 2 * 255 / 3;
  483. }
  484. break;
  485. // adjust hue
  486. case 18:
  487. hsv.h = time;
  488. hsv.s = 255;
  489. hsv.v = 255;
  490. break;
  491. case 19:
  492. hsv.h = 255 - time;
  493. hsv.s = 255;
  494. hsv.v = 255;
  495. break;
  496. // adjust saturation
  497. case 32:
  498. hsv.s = 255;
  499. hsv.v = 255;
  500. break;
  501. case 33:
  502. hsv.s = 0;
  503. hsv.v = 255;
  504. break;
  505. // adjust value
  506. case 45:
  507. hsv.v = 255;
  508. break;
  509. case 46:
  510. hsv.v = 63;
  511. break;
  512. // adjust speed
  513. case 4:
  514. if (((time / 8) % 2) == 0) {
  515. hsv.v = 255;
  516. } else {
  517. hsv.v = 63;
  518. }
  519. break;
  520. case 5:
  521. if (((time / 16) % 2) == 0) {
  522. hsv.v = 63;
  523. } else {
  524. hsv.v = 255;
  525. }
  526. break;
  527. // set main effect
  528. case 36: // BASE
  529. hsv.s = 0;
  530. break;
  531. case 37: // KITT
  532. hsv.h = 0;
  533. hsv.s = 255;
  534. if (time < 128) {
  535. hsv.v = time;
  536. } else {
  537. hsv.v = 255 - time;
  538. }
  539. break;
  540. // reset (for flashing)
  541. case 13:
  542. hsv.s = 0;
  543. if (time < 16) {
  544. hsv.v = 255 - time * 128 / 16;
  545. } else {
  546. hsv.v = 127;
  547. }
  548. break;
  549. // reset (reinitialize EEPROM)
  550. case 42:
  551. hsv.s = 0;
  552. hsv.v = 127;
  553. break;
  554. // shift
  555. case 44:
  556. hsv.s = 0;
  557. hsv.v = 63;
  558. break;
  559. case 55:
  560. hsv.s = 0;
  561. hsv.v = 63;
  562. break;
  563. // no function
  564. default:
  565. hsv.v = 0;
  566. }
  567. return hsv;
  568. }
  569. bool kb_indicator(effect_params_t* params) {
  570. return effect_runner_i(params, &kb_indicator_math);
  571. }
  572. uint8_t led_count = 7;
  573. uint8_t led_first = 33;
  574. static uint8_t time_to_led(uint8_t time, uint8_t led_behind) {
  575. uint16_t led_time = led_count * time;
  576. uint16_t step = ((2 * led_count + (led_time / 128)) - led_behind) % (2 * led_count);
  577. uint8_t led;
  578. if (step < led_count) {
  579. led = step;
  580. } else {
  581. led = led_count - 1 - (step - led_count);
  582. }
  583. return led;
  584. }
  585. static HSV kitt_effect_math(HSV hsv, uint8_t i, uint8_t time) {
  586. // reset base effect startup
  587. if (i == 0) {
  588. BASE_EFFECT_NOT_STARTED_YET = true;
  589. }
  590. hsv.h = 0;
  591. hsv.s = 255;
  592. if (i >= led_first && i < led_first + led_count) {
  593. uint8_t j = i - led_first;
  594. if (j == time_to_led(time, 0)) {
  595. hsv.v = hsv.v;
  596. } else if (j == time_to_led(time, 1)) {
  597. hsv.v = hsv.v/2;
  598. } else if (j == time_to_led(time, 2)) {
  599. hsv.v = hsv.v/4;
  600. } else if (j == time_to_led(time, 3)) {
  601. hsv.v = hsv.v/8;
  602. } else {
  603. hsv.v = 0;
  604. }
  605. } else {
  606. hsv.v = 0;
  607. }
  608. return hsv;
  609. }
  610. bool kitt_effect(effect_params_t* params) {
  611. return effect_runner_i(params, &kitt_effect_math);
  612. }
  613. #endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
  614. // vim: syntax=c