You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.3 KiB

  1. #include "ws2812.h"
  2. #include "rgbsps.h"
  3. cRGB led[RGBSPS_NUM];
  4. void rgbsps_set(uint8_t index, uint8_t r, uint8_t g, uint8_t b) {
  5. led[index].r = r;
  6. led[index].g = g;
  7. led[index].b = b;
  8. }
  9. void rgbsps_setall(uint8_t r, uint8_t g, uint8_t b) {
  10. for (uint16_t i = 0; i < RGBSPS_NUM; i++) {
  11. rgbsps_set(i, r, g, b);
  12. }
  13. }
  14. void rgbsps_turnoff(void) {
  15. rgbsps_setall(0, 0, 0);
  16. }
  17. void rgbsps_send(void) {
  18. ws2812_setleds(led, RGBSPS_NUM);
  19. }
  20. void rgbsps_sethsv(uint8_t index, uint16_t hue, uint8_t sat, uint8_t val) {
  21. uint8_t r = 0, g = 0, b = 0, base, color;
  22. if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
  23. r = val;
  24. g = val;
  25. b = val;
  26. } else {
  27. base = ((255 - sat) * val) >> 8;
  28. color = (val - base) * (hue % 60) / 60;
  29. switch (hue / 60) {
  30. case 0:
  31. r = val;
  32. g = base + color;
  33. b = base;
  34. break;
  35. case 1:
  36. r = val - color;
  37. g = val;
  38. b = base;
  39. break;
  40. case 2:
  41. r = base;
  42. g = val;
  43. b = base + color;
  44. break;
  45. case 3:
  46. r = base;
  47. g = val - color;
  48. b = val;
  49. break;
  50. case 4:
  51. r = base + color;
  52. g = base;
  53. b = val;
  54. break;
  55. case 5:
  56. r = val;
  57. g = base;
  58. b = val - color;
  59. break;
  60. }
  61. }
  62. rgbsps_set(index, r, g, b);
  63. }