logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

led_matrix_module.inc (2475B)


  1. // Copyright 2024-2025 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. LED_MATRIX_EFFECT(FLOW)
  15. #ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS
  16. // "Flow" animated effect. Draws moving wave patterns mimicking the appearance
  17. // of flowing liquid. For interesting variety of patterns, space coordinates are
  18. // slowly rotated and a function of several sine waves is evaluated.
  19. static bool FLOW(effect_params_t* params) {
  20. LED_MATRIX_USE_LIMITS(led_min, led_max);
  21. static uint16_t wrap_correction = 0;
  22. static uint8_t last_high_byte = 0;
  23. const uint8_t time_scale = 1 + led_matrix_eeconfig.speed / 8;
  24. const uint8_t high_byte = (uint8_t)(g_led_timer >> 16);
  25. if (last_high_byte != high_byte) {
  26. last_high_byte = high_byte;
  27. wrap_correction += ((uint16_t)time_scale) << 8;
  28. }
  29. const uint16_t time = scale16by8(g_led_timer, time_scale) + wrap_correction;
  30. // Compute rotation coefficients with 7 fractional bits.
  31. const int8_t rot_c = cos8(time / 4) - 128;
  32. const int8_t rot_s = sin8(time / 4) - 128;
  33. const uint8_t omega = 32 + sin8(time) / 4;
  34. for (uint8_t i = led_min; i < led_max; ++i) {
  35. LED_MATRIX_TEST_LED_FLAGS();
  36. const uint8_t x = g_led_config.point[i].x;
  37. const uint8_t y = g_led_config.point[i].y;
  38. // Rotate (x, y) by the 2x2 rotation matrix described by rot_c, rot_s.
  39. const uint8_t x1 = (uint8_t)((((int16_t)rot_c) * ((int16_t)x)) / 128) - (uint8_t)((((int16_t)rot_s) * ((int16_t)y)) / 128);
  40. const uint8_t y1 = (uint8_t)((((int16_t)rot_s) * ((int16_t)x)) / 128) + (uint8_t)((((int16_t)rot_c) * ((int16_t)y)) / 128);
  41. uint8_t value = scale8(sin8(x1 - 2 * time), omega) + y1 + time / 4;
  42. value = (value <= 127) ? value : (255 - value);
  43. led_matrix_set_value(i, scale8(led_matrix_eeconfig.val, value));
  44. }
  45. return led_matrix_check_finished_leds(led_max);
  46. }
  47. #endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS