furi_hal_light.c 4.6 KB

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