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.

157 lines
5.9 KiB

12 months ago
12 months ago
11 months ago
12 months ago
12 months ago
12 months ago
11 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_modbusblock.enableDump(true)upda;
  38. m_iadc.initialize("Blower-iadc", iadc, ich);
  39. AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000);
  40. m_blowerType = kHighPowerUartBlower;
  41. m_isInitialized = true;
  42. bindFn();
  43. }
  44. void initializeAsMiniPwmBlower(TIM_HandleTypeDef* htim, uint32_t channel, Pin_t enGpio, Pin_t fbGpio) {
  45. m_miniPwmBlower_htim = htim;
  46. m_miniPwmBlower_channle = channel;
  47. m_miniPwmBlower_enGpio.initAsOutput(enGpio, kxs_gpio_nopull, true, false);
  48. m_miniPwmBlower_fbGpio.initAsInput(fbGpio, kxs_gpio_nopull, kxs_gpio_rising_irq, false);
  49. AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000);
  50. m_blowerType = kMiniPwmBlower;
  51. m_isInitialized = true;
  52. bindFn();
  53. }
  54. bool isInitialized() { return m_isInitialized; }
  55. void bindFn() {
  56. BIND_FN(BlowerController, this, fn_blower_ctrl);
  57. BIND_FN(BlowerController, this, fn_blower_ctrl_safe_valve);
  58. BIND_FN(BlowerController, this, fn_blower_read_ei);
  59. BIND_FN(BlowerController, this, fn_blower_is_error);
  60. BIND_FN(BlowerController, this, fn_blower_read_ei_adc_raw);
  61. BIND_FN(BlowerController, this, fn_blower_is_open);
  62. }
  63. /***********************************************************************************************************************
  64. * FN *
  65. ***********************************************************************************************************************/
  66. void blower_ctrl(int32_t val) {}
  67. void blower_ctrl_safe_valve(int32_t val) {}
  68. int32_t blower_read_ei() {
  69. if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) {
  70. return blowserAdcToCurrent(m_iadc.getCacheVal());
  71. }
  72. return 0;
  73. }
  74. int32_t blower_read_iadc() {
  75. if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) {
  76. return m_iadc.getCacheVal();
  77. }
  78. return 0;
  79. }
  80. int32_t blower_is_error() {
  81. // TODO: 栏杆箱消毒机添加故障检测
  82. return 0;
  83. }
  84. void periodTask() {
  85. if (m_iadc.isInited()) m_iadc.updateAdcValToCache();
  86. }
  87. /***********************************************************************************************************************
  88. * PP *
  89. ***********************************************************************************************************************/
  90. void fn_blower_ctrl(ProcessContext* cxt) { //
  91. int32_t val = GET_PARAM(0);
  92. if (m_blowerType == kIOBlower) {
  93. m_ctrlGpio.write(val);
  94. zcanbus_send_ack(cxt->packet, NULL, 0);
  95. isopen = GET_PARAM(0) > 0 ? true : false;
  96. } else if (m_blowerType == kHighPowerUartBlower) {
  97. m_ctrlGpio.write(val);
  98. bool suc = val > 0 ? m_modbusblock.writeReg06(1, 0x2000, 1, 50) : m_modbusblock.writeReg06(1, 0x2000, 6, 50);
  99. if (suc) {
  100. m_ctrlGpio.write(val);
  101. zcanbus_send_ack(cxt->packet, NULL, 0);
  102. isopen = GET_PARAM(0) > 0 ? true : false;
  103. } else {
  104. zcanbus_send_errorack(cxt->packet, kerr_subdevice_overtime);
  105. }
  106. } else if (m_blowerType == kMiniPwmBlower) {
  107. mini_pwm_blower_ctrl(val);
  108. }
  109. }
  110. void fn_blower_ctrl_safe_valve(ProcessContext* cxt) { //
  111. blower_ctrl_safe_valve(GET_PARAM(0));
  112. zcanbus_send_ack(cxt->packet, NULL, 0);
  113. }
  114. void fn_blower_read_ei(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, blower_read_ei()); }
  115. void fn_blower_read_ei_adc_raw(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, m_iadc.getCacheVal()); }
  116. void fn_blower_is_error(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, blower_is_error()); }
  117. void fn_blower_is_open(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, isopen); }
  118. private:
  119. void mini_pwm_blower_ctrl(int32_t duty) {
  120. duty = 100 - duty;
  121. if (duty < 0) duty = 0;
  122. if (duty > 100) duty = 100;
  123. TIM_OC_InitTypeDef sConfigOC = {0};
  124. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  125. sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim);
  126. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  127. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  128. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  129. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  130. HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle);
  131. HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
  132. HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
  133. m_miniPwmBlower_enGpio.write(duty != 0);
  134. }
  135. };
  136. } // namespace iflytop