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.

136 lines
3.7 KiB

2 years ago
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 LIGHT_PWM_DRIVER 1
  7. // LED_GREEN_PIN
  8. #if LIGHT_PWM_DRIVER
  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. #endif
  16. static pwm_light_ctrl_t light_ctrl = {
  17. .driver = NRF_DRV_PWM_INSTANCE(LIGHT_PWM_INSTANCE),
  18. .seq_values = {0},
  19. .seq =
  20. {
  21. .values.p_individual = &light_ctrl.seq_values,
  22. .length = NRF_PWM_VALUES_LENGTH(light_ctrl.seq_values),
  23. .repeats = 0,
  24. .end_delay = 0,
  25. },
  26. .config =
  27. {
  28. .output_pins =
  29. {
  30. LED_GREEN_PIN, //
  31. NRF_DRV_PWM_PIN_NOT_USED,
  32. NRF_DRV_PWM_PIN_NOT_USED,
  33. NRF_DRV_PWM_PIN_NOT_USED,
  34. },
  35. .irq_priority = APP_IRQ_PRIORITY_LOWEST,
  36. .base_clock = NRF_PWM_CLK_250kHz,
  37. .count_mode = NRF_PWM_MODE_UP,
  38. .top_value = 100, // 125kHz / 46 = 2.717k
  39. .load_mode = NRF_PWM_LOAD_INDIVIDUAL,
  40. .step_mode = NRF_PWM_STEP_AUTO,
  41. },
  42. };
  43. static LightEffect m_light_effect;
  44. static bool m_led_green_light_state;
  45. static int m_blink_cnt;
  46. APP_TIMER_DEF(m_green_light_effect_tmr);
  47. void BoardLight_setGreenLightState(bool state) {
  48. #if LIGHT_PWM_DRIVER
  49. if (state) {
  50. light_ctrl.seq_values.channel_0 = 95; // ����ռ�ձȣ���ֵ���󲻳��� top_value
  51. nrfx_pwm_simple_playback(&light_ctrl.driver, &light_ctrl.seq, 1, NRF_DRV_PWM_FLAG_LOOP);
  52. } else {
  53. nrfx_pwm_stop(&light_ctrl.driver, true);
  54. }
  55. #else
  56. if (state) {
  57. nrf_gpio_pin_set(LED_GREEN_PIN);
  58. m_led_green_light_state = true;
  59. } else {
  60. nrf_gpio_pin_clear(LED_GREEN_PIN);
  61. m_led_green_light_state = false;
  62. }
  63. #endif
  64. }
  65. static void BoardLight_effect_tmr_handler(void* p_context) { //
  66. if (m_light_effect == kLightEffect_close) {
  67. if (m_led_green_light_state) {
  68. BoardLight_setGreenLightState(false);
  69. }
  70. } else if (m_light_effect == kLightEffect_open) {
  71. if (!m_led_green_light_state) {
  72. BoardLight_setGreenLightState(true);
  73. }
  74. } else if (m_light_effect == kLightEffect_slowFlash) {
  75. if (m_blink_cnt < 2) {
  76. if (m_blink_cnt % 2 == 0) {
  77. BoardLight_setGreenLightState(true);
  78. } else if (m_blink_cnt % 2 == 1) {
  79. BoardLight_setGreenLightState(false);
  80. }
  81. } else {
  82. if (BLINK_PERIOD_MS * m_blink_cnt >= 1000) {
  83. m_blink_cnt = 0;
  84. return;
  85. }
  86. }
  87. }
  88. m_blink_cnt++;
  89. }
  90. void BoardLight_Init() {
  91. ZERROR_CHECK(app_timer_create(&m_green_light_effect_tmr, APP_TIMER_MODE_REPEATED, BoardLight_effect_tmr_handler));
  92. #if LIGHT_PWM_DRIVER
  93. APP_ERROR_CHECK(nrfx_pwm_init(&light_ctrl.driver, &light_ctrl.config, NULL));
  94. #else
  95. znrf_gpio_cfg_output(LED_GREEN_PIN, NRF_GPIO_PIN_NOPULL);
  96. #endif
  97. }
  98. void BoardLight_load() {}
  99. void BoardLight_unload() { BoardLight_setGreenLightEffect(kLightEffect_close); }
  100. void BoardLight_toggleGreenLightState() { nrf_gpio_pin_toggle(LED_GREEN_PIN); }
  101. void BoardLight_setGreenLightEffect(LightEffect effect) {
  102. m_light_effect = effect;
  103. switch (effect) {
  104. case kLightEffect_close:
  105. app_timer_stop(m_green_light_effect_tmr);
  106. BoardLight_setGreenLightState(false);
  107. break;
  108. case kLightEffect_open:
  109. app_timer_stop(m_green_light_effect_tmr);
  110. BoardLight_setGreenLightState(true);
  111. break;
  112. case kLightEffect_slowFlash:
  113. app_timer_start(m_green_light_effect_tmr, APP_TIMER_TICKS(BLINK_PERIOD_MS), NULL);
  114. break;
  115. default:
  116. break;
  117. }
  118. return;
  119. }