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.

156 lines
5.8 KiB

12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
  1. #pragma once
  2. #include "base/appdep.hpp"
  3. namespace iflytop {
  4. using namespace transmit_disfection_protocol;
  5. typedef enum {
  6. kIOBlower,
  7. kHighPowerUartBlower,
  8. kMiniPwmBlower,
  9. } BlowerType_t;
  10. class BlowerController {
  11. BlowerType_t m_blowerType = kIOBlower;
  12. // kIOBlower
  13. ZGPIO m_ctrlGpio;
  14. // kHighPowerUartBlower
  15. ModbusBlockHost m_modbusblock;
  16. // kMiniPwmBlower
  17. TIM_HandleTypeDef* m_miniPwmBlower_htim;
  18. uint32_t m_miniPwmBlower_channle;
  19. ZGPIO m_miniPwmBlower_enGpio;
  20. ZGPIO m_miniPwmBlower_fbGpio;
  21. ZADC m_iadc;
  22. bool m_iadcIsInit = false;
  23. bool m_isInitialized = false;
  24. bool isopen = false;
  25. public:
  26. void initialize(Pin_t ctrlGpio, ADC_HandleTypeDef* iadc, uint32_t ich) {
  27. m_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false);
  28. m_iadc.initialize("Blower-iadc", iadc, ich);
  29. AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000);
  30. m_blowerType = kIOBlower;
  31. m_isInitialized = true;
  32. bindFn();
  33. }
  34. void initializeAsHighPowerUartBlower(Pin_t ctrlGpio, UART_HandleTypeDef* huart, ADC_HandleTypeDef* iadc, uint32_t ich) {
  35. m_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false);
  36. m_modbusblock.initialize(huart);
  37. m_iadc.initialize("Blower-iadc", iadc, ich);
  38. AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000);
  39. m_blowerType = kHighPowerUartBlower;
  40. m_isInitialized = true;
  41. bindFn();
  42. }
  43. void initializeAsMiniPwmBlower(TIM_HandleTypeDef* htim, uint32_t channel, Pin_t enGpio, Pin_t fbGpio) {
  44. m_miniPwmBlower_htim = htim;
  45. m_miniPwmBlower_channle = channel;
  46. m_miniPwmBlower_enGpio.initAsOutput(enGpio, kxs_gpio_nopull, true, false);
  47. m_miniPwmBlower_fbGpio.initAsInput(fbGpio, kxs_gpio_nopull, kxs_gpio_rising_irq, false);
  48. AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000);
  49. m_blowerType = kMiniPwmBlower;
  50. m_isInitialized = true;
  51. bindFn();
  52. }
  53. bool isInitialized() { return m_isInitialized; }
  54. void bindFn() {
  55. BIND_FN(BlowerController, this, fn_blower_ctrl);
  56. BIND_FN(BlowerController, this, fn_blower_ctrl_safe_valve);
  57. BIND_FN(BlowerController, this, fn_blower_read_ei);
  58. BIND_FN(BlowerController, this, fn_blower_is_error);
  59. BIND_FN(BlowerController, this, fn_blower_read_ei_adc_raw);
  60. BIND_FN(BlowerController, this, fn_blower_is_open);
  61. }
  62. /***********************************************************************************************************************
  63. * FN *
  64. ***********************************************************************************************************************/
  65. void blower_ctrl(int32_t val) {}
  66. void blower_ctrl_safe_valve(int32_t val) {}
  67. int32_t blower_read_ei() {
  68. if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) {
  69. return blowserAdcToCurrent(m_iadc.getCacheVal());
  70. }
  71. return 0;
  72. }
  73. int32_t blower_read_iadc() {
  74. if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) {
  75. return m_iadc.getCacheVal();
  76. }
  77. return 0;
  78. }
  79. int32_t blower_is_error() {
  80. // TODO: 栏杆箱消毒机添加故障检测
  81. return 0;
  82. }
  83. void periodTask() {
  84. if (m_iadc.isInited()) m_iadc.updateAdcValToCache();
  85. }
  86. /***********************************************************************************************************************
  87. * PP *
  88. ***********************************************************************************************************************/
  89. void fn_blower_ctrl(ProcessContext* cxt) { //
  90. int32_t val = GET_PARAM(0);
  91. if (m_blowerType == kIOBlower) {
  92. m_ctrlGpio.write(val);
  93. zcanbus_send_ack(cxt->packet, NULL, 0);
  94. isopen = GET_PARAM(0) > 0 ? true : false;
  95. } else if (m_blowerType == kHighPowerUartBlower) {
  96. m_ctrlGpio.write(val);
  97. bool suc = val > 0 ? m_modbusblock.writeReg06(1, 0x2000, 1, 50) : m_modbusblock.writeReg06(1, 0x2000, 6, 50);
  98. if (suc) {
  99. m_ctrlGpio.write(val);
  100. zcanbus_send_ack(cxt->packet, NULL, 0);
  101. isopen = GET_PARAM(0) > 0 ? true : false;
  102. } else {
  103. zcanbus_send_errorack(cxt->packet, err::kerr_overtime);
  104. }
  105. } else if (m_blowerType == kMiniPwmBlower) {
  106. mini_pwm_blower_ctrl(val);
  107. }
  108. }
  109. void fn_blower_ctrl_safe_valve(ProcessContext* cxt) { //
  110. blower_ctrl_safe_valve(GET_PARAM(0));
  111. zcanbus_send_ack(cxt->packet, NULL, 0);
  112. }
  113. void fn_blower_read_ei(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, blower_read_ei()); }
  114. void fn_blower_read_ei_adc_raw(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, m_iadc.getCacheVal()); }
  115. void fn_blower_is_error(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, blower_is_error()); }
  116. void fn_blower_is_open(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, isopen); }
  117. private:
  118. void mini_pwm_blower_ctrl(int32_t duty) {
  119. duty = 100 - duty;
  120. if (duty < 0) duty = 0;
  121. if (duty > 100) duty = 100;
  122. TIM_OC_InitTypeDef sConfigOC = {0};
  123. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  124. sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim);
  125. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  126. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  127. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  128. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  129. HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle);
  130. HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
  131. HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
  132. m_miniPwmBlower_enGpio.write(duty != 0);
  133. }
  134. };
  135. } // namespace iflytop