furi_hal_light.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <core/common_defines.h>
  2. #include "furi_hal_resources.h"
  3. #include <furi_hal_light.h>
  4. #include <lp5562.h>
  5. #include <stdint.h>
  6. #define LED_CURRENT_RED 50
  7. #define LED_CURRENT_GREEN 50
  8. #define LED_CURRENT_BLUE 50
  9. #define LED_CURRENT_WHITE 150
  10. void furi_hal_light_init() {
  11. furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
  12. lp5562_reset(&furi_hal_i2c_handle_power);
  13. lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelRed, LED_CURRENT_RED);
  14. lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelGreen, LED_CURRENT_GREEN);
  15. lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelBlue, LED_CURRENT_BLUE);
  16. lp5562_set_channel_current(&furi_hal_i2c_handle_power, LP5562ChannelWhite, LED_CURRENT_WHITE);
  17. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelRed, 0x00);
  18. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelGreen, 0x00);
  19. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelBlue, 0x00);
  20. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelWhite, 0x00);
  21. lp5562_enable(&furi_hal_i2c_handle_power);
  22. lp5562_configure(&furi_hal_i2c_handle_power);
  23. furi_hal_i2c_release(&furi_hal_i2c_handle_power);
  24. }
  25. void furi_hal_light_set(Light light, uint8_t value) {
  26. furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
  27. if(light & LightRed) {
  28. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelRed, value);
  29. }
  30. if(light & LightGreen) {
  31. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelGreen, value);
  32. }
  33. if(light & LightBlue) {
  34. lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelBlue, value);
  35. }
  36. if(light & LightBacklight) {
  37. uint8_t prev = lp5562_get_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelWhite);
  38. lp5562_execute_ramp(
  39. &furi_hal_i2c_handle_power, LP5562Engine1, LP5562ChannelWhite, prev, value, 100);
  40. }
  41. furi_hal_i2c_release(&furi_hal_i2c_handle_power);
  42. }
  43. void furi_hal_light_blink_start(Light light, uint8_t brightness, uint16_t on_time, uint16_t period) {
  44. furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
  45. lp5562_set_channel_src(
  46. &furi_hal_i2c_handle_power,
  47. LP5562ChannelRed | LP5562ChannelGreen | LP5562ChannelBlue,
  48. LP5562Direct);
  49. LP5562Channel led_ch = 0;
  50. if(light & LightRed) led_ch |= LP5562ChannelRed;
  51. if(light & LightGreen) led_ch |= LP5562ChannelGreen;
  52. if(light & LightBlue) led_ch |= LP5562ChannelBlue;
  53. lp5562_execute_blink(
  54. &furi_hal_i2c_handle_power, LP5562Engine2, led_ch, on_time, period, brightness);
  55. furi_hal_i2c_release(&furi_hal_i2c_handle_power);
  56. }
  57. void furi_hal_light_blink_stop() {
  58. furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
  59. lp5562_set_channel_src(
  60. &furi_hal_i2c_handle_power,
  61. LP5562ChannelRed | LP5562ChannelGreen | LP5562ChannelBlue,
  62. LP5562Direct);
  63. lp5562_stop_program(&furi_hal_i2c_handle_power, LP5562Engine2);
  64. furi_hal_i2c_release(&furi_hal_i2c_handle_power);
  65. }
  66. void furi_hal_light_blink_set_color(Light light) {
  67. furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
  68. LP5562Channel led_ch = 0;
  69. lp5562_set_channel_src(
  70. &furi_hal_i2c_handle_power,
  71. LP5562ChannelRed | LP5562ChannelGreen | LP5562ChannelBlue,
  72. LP5562Direct);
  73. if(light & LightRed) led_ch |= LP5562ChannelRed;
  74. if(light & LightGreen) led_ch |= LP5562ChannelGreen;
  75. if(light & LightBlue) led_ch |= LP5562ChannelBlue;
  76. lp5562_set_channel_src(&furi_hal_i2c_handle_power, led_ch, LP5562Engine2);
  77. furi_hal_i2c_release(&furi_hal_i2c_handle_power);
  78. }
  79. void furi_hal_light_sequence(const char* sequence) {
  80. do {
  81. if(*sequence == 'R') {
  82. furi_hal_light_set(LightRed, 0xFF);
  83. } else if(*sequence == 'r') {
  84. furi_hal_light_set(LightRed, 0x00);
  85. } else if(*sequence == 'G') {
  86. furi_hal_light_set(LightGreen, 0xFF);
  87. } else if(*sequence == 'g') {
  88. furi_hal_light_set(LightGreen, 0x00);
  89. } else if(*sequence == 'B') {
  90. furi_hal_light_set(LightBlue, 0xFF);
  91. } else if(*sequence == 'b') {
  92. furi_hal_light_set(LightBlue, 0x00);
  93. } else if(*sequence == 'W') {
  94. furi_hal_light_set(LightBacklight, 0xFF);
  95. } else if(*sequence == 'w') {
  96. furi_hal_light_set(LightBacklight, 0x00);
  97. } else if(*sequence == '.') {
  98. furi_delay_ms(250);
  99. } else if(*sequence == '-') {
  100. furi_delay_ms(500);
  101. }
  102. sequence++;
  103. } while(*sequence != 0);
  104. }