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.

153 lines
4.5 KiB

2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "board_light_ctrl.h"
  2. #include "board.h"
  3. #include "znordic.h"
  4. #define BLINK_CNT 1
  5. #define BLINK_PERIOD_MS (100)
  6. #define QUICK_BLINK_PERIOD_MS (100)
  7. #define SLOW_BLINK_PERIOD_MS (2000)
  8. // LED_GREEN_PIN
  9. typedef struct {
  10. nrf_drv_pwm_t driver;
  11. nrf_pwm_values_individual_t seq_values;
  12. nrf_pwm_sequence_t seq;
  13. nrf_drv_pwm_config_t config;
  14. } pwm_light_ctrl_t;
  15. static pwm_light_ctrl_t light_ctrl = {
  16. .driver = NRF_DRV_PWM_INSTANCE(LIGHT_PWM_INSTANCE),
  17. .seq_values = {0},
  18. .seq =
  19. {
  20. .values.p_individual = &light_ctrl.seq_values,
  21. .length = NRF_PWM_VALUES_LENGTH(light_ctrl.seq_values),
  22. .repeats = 0,
  23. .end_delay = 0,
  24. },
  25. .config =
  26. {
  27. .output_pins =
  28. {
  29. LED_BLUE_PIN, //
  30. NRF_DRV_PWM_PIN_NOT_USED,
  31. NRF_DRV_PWM_PIN_NOT_USED,
  32. NRF_DRV_PWM_PIN_NOT_USED,
  33. },
  34. .irq_priority = APP_IRQ_PRIORITY_LOWEST,
  35. .base_clock = NRF_PWM_CLK_250kHz,
  36. .count_mode = NRF_PWM_MODE_UP,
  37. .top_value = 100, // 125kHz / 46 = 2.717k
  38. .load_mode = NRF_PWM_LOAD_INDIVIDUAL,
  39. .step_mode = NRF_PWM_STEP_AUTO,
  40. },
  41. };
  42. static LightEffect_t m_light_effect;
  43. static bool m_led_green_light_state;
  44. static int m_blink_cnt;
  45. APP_TIMER_DEF(m_green_light_effect_tmr);
  46. static bool m_boardlight_greenlightstate = false;
  47. void BoardLight_toggleGreenLightState() { BoardLight_setGreenLightState(!m_boardlight_greenlightstate); }
  48. void BoardLight_setGreenLightState(bool state) {
  49. m_boardlight_greenlightstate = state;
  50. if (state) {
  51. light_ctrl.seq_values.channel_0 = 90; // ����ռ�ձȣ���ֵ���󲻳��� top_value
  52. nrfx_pwm_simple_playback(&light_ctrl.driver, &light_ctrl.seq, 1, NRF_DRV_PWM_FLAG_LOOP);
  53. } else {
  54. nrfx_pwm_stop(&light_ctrl.driver, true);
  55. }
  56. }
  57. static void BoardLight_effect_tmr_handler(void* p_context) { //
  58. if (m_light_effect == kLightEffect_close) {
  59. if (m_led_green_light_state) {
  60. BoardLight_setGreenLightState(false);
  61. }
  62. } else if (m_light_effect == kLightEffect_open) {
  63. if (!m_led_green_light_state) {
  64. BoardLight_setGreenLightState(true);
  65. }
  66. } else if (m_light_effect == kLightEffect_slowFlash) {
  67. if (m_blink_cnt < 2) {
  68. if (m_blink_cnt % 2 == 0) {
  69. BoardLight_setGreenLightState(true);
  70. } else if (m_blink_cnt % 2 == 1) {
  71. BoardLight_setGreenLightState(false);
  72. }
  73. } else {
  74. if (BLINK_PERIOD_MS * m_blink_cnt >= SLOW_BLINK_PERIOD_MS) {
  75. m_blink_cnt = 0;
  76. return;
  77. }
  78. }
  79. } else if (m_light_effect == kLightEffect_quickFlash) {
  80. if (BLINK_PERIOD_MS * m_blink_cnt >= QUICK_BLINK_PERIOD_MS) {
  81. BoardLight_toggleGreenLightState();
  82. m_blink_cnt = 0;
  83. return;
  84. }
  85. }
  86. m_blink_cnt++;
  87. }
  88. void BoardLight_Init() {
  89. ZERROR_CHECK(app_timer_create(&m_green_light_effect_tmr, APP_TIMER_MODE_REPEATED, BoardLight_effect_tmr_handler));
  90. APP_ERROR_CHECK(nrfx_pwm_init(&light_ctrl.driver, &light_ctrl.config, NULL));
  91. }
  92. static bool m_boardlight_loaded = false;
  93. void BoardLight_load() {
  94. if (m_boardlight_loaded) {
  95. return;
  96. }
  97. m_boardlight_loaded = true;
  98. BoardLight_setGreenLightState(false);
  99. }
  100. void BoardLight_unload() {
  101. if (!m_boardlight_loaded) {
  102. return;
  103. }
  104. m_boardlight_loaded = false;
  105. app_timer_stop(m_green_light_effect_tmr);
  106. BoardLight_setGreenLightEffect(kLightEffect_close);
  107. // nrfx_pwm_uninit(&light_ctrl.driver);
  108. }
  109. void BoardLight_setGreenLightEffect(LightEffect_t effect) {
  110. if (m_light_effect == effect) return;
  111. m_light_effect = effect;
  112. switch (effect) {
  113. case kLightEffect_close:
  114. app_timer_stop(m_green_light_effect_tmr);
  115. BoardLight_setGreenLightState(false);
  116. break;
  117. case kLightEffect_open:
  118. app_timer_stop(m_green_light_effect_tmr);
  119. BoardLight_setGreenLightState(true);
  120. break;
  121. case kLightEffect_slowFlash:
  122. app_timer_start(m_green_light_effect_tmr, APP_TIMER_TICKS(BLINK_PERIOD_MS), NULL);
  123. break;
  124. case kLightEffect_quickFlash:
  125. app_timer_start(m_green_light_effect_tmr, APP_TIMER_TICKS(BLINK_PERIOD_MS), NULL);
  126. break;
  127. default:
  128. break;
  129. }
  130. return;
  131. }
  132. void BoardLight_blockFlash(int times, int periodms) {
  133. for (int i = 0; i < times; i++) {
  134. BoardLight_setGreenLightState(true);
  135. nrf_delay_ms(periodms);
  136. BoardLight_setGreenLightState(false);
  137. nrf_delay_ms(periodms);
  138. }
  139. }