|
|
#pragma once
#include "base/appdep.hpp"
namespace iflytop { using namespace transmit_disfection_protocol;
typedef enum { kIOBlower, kHighPowerUartBlower, kMiniPwmBlower, } BlowerType_t;
class BlowerController { BlowerType_t m_blowerType = kIOBlower;
// kIOBlower
ZGPIO m_ctrlGpio;
// kHighPowerUartBlower
ModbusBlockHost m_modbusblock;
// kMiniPwmBlower
TIM_HandleTypeDef* m_miniPwmBlower_htim; uint32_t m_miniPwmBlower_channle; ZGPIO m_miniPwmBlower_enGpio; ZGPIO m_miniPwmBlower_fbGpio;
ZADC m_iadc; bool m_iadcIsInit = false;
bool m_isInitialized = false; bool isopen = false;
public: void initialize(Pin_t ctrlGpio, ADC_HandleTypeDef* iadc, uint32_t ich) { m_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false); m_iadc.initialize("Blower-iadc", iadc, ich); AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000); m_blowerType = kIOBlower; m_isInitialized = true; bindFn(); }
void initializeAsHighPowerUartBlower(Pin_t ctrlGpio, UART_HandleTypeDef* huart, ADC_HandleTypeDef* iadc, uint32_t ich) { m_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false); m_modbusblock.initialize(huart); // m_modbusblock.enableDump(true)upda;
m_iadc.initialize("Blower-iadc", iadc, ich); AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000); m_blowerType = kHighPowerUartBlower; m_isInitialized = true; bindFn(); } void initializeAsMiniPwmBlower(TIM_HandleTypeDef* htim, uint32_t channel, Pin_t enGpio, Pin_t fbGpio) { m_miniPwmBlower_htim = htim; m_miniPwmBlower_channle = channel; m_miniPwmBlower_enGpio.initAsOutput(enGpio, kxs_gpio_nopull, true, false); m_miniPwmBlower_fbGpio.initAsInput(fbGpio, kxs_gpio_nopull, kxs_gpio_rising_irq, false); AppPeriodTaskMgr::ins()->regTask("AC-ADC", [this]() { periodTask(); }, 1000); m_blowerType = kMiniPwmBlower; m_isInitialized = true; bindFn(); }
bool isInitialized() { return m_isInitialized; }
void bindFn() { BIND_FN(BlowerController, this, fn_blower_ctrl); BIND_FN(BlowerController, this, fn_blower_ctrl_safe_valve); BIND_FN(BlowerController, this, fn_blower_read_ei); BIND_FN(BlowerController, this, fn_blower_is_error); BIND_FN(BlowerController, this, fn_blower_read_ei_adc_raw); BIND_FN(BlowerController, this, fn_blower_is_open); }
/***********************************************************************************************************************
* FN * ***********************************************************************************************************************/ void blower_ctrl(int32_t val) {} void blower_ctrl_safe_valve(int32_t val) {} int32_t blower_read_ei() { if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) { return blowserAdcToCurrent(m_iadc.getCacheVal()); } return 0; } int32_t blower_read_iadc() { if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) { return m_iadc.getCacheVal(); } return 0; }
int32_t blower_is_error() { // TODO: 栏杆箱消毒机添加故障检测
return 0; }
void periodTask() { if (m_iadc.isInited()) m_iadc.updateAdcValToCache(); }
/***********************************************************************************************************************
* PP * ***********************************************************************************************************************/ void fn_blower_ctrl(ProcessContext* cxt) { //
int32_t val = GET_PARAM(0); if (m_blowerType == kIOBlower) { m_ctrlGpio.write(val); zcanbus_send_ack(cxt->packet, NULL, 0); isopen = GET_PARAM(0) > 0 ? true : false; } else if (m_blowerType == kHighPowerUartBlower) { m_ctrlGpio.write(val); bool suc = val > 0 ? m_modbusblock.writeReg06(1, 0x2000, 1, 50) : m_modbusblock.writeReg06(1, 0x2000, 6, 50); if (suc) { m_ctrlGpio.write(val); zcanbus_send_ack(cxt->packet, NULL, 0); isopen = GET_PARAM(0) > 0 ? true : false; } else { zcanbus_send_errorack(cxt->packet, kerr_subdevice_overtime); }
} else if (m_blowerType == kMiniPwmBlower) { mini_pwm_blower_ctrl(val); } } void fn_blower_ctrl_safe_valve(ProcessContext* cxt) { //
blower_ctrl_safe_valve(GET_PARAM(0)); zcanbus_send_ack(cxt->packet, NULL, 0); } void fn_blower_read_ei(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, blower_read_ei()); } void fn_blower_read_ei_adc_raw(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, m_iadc.getCacheVal()); } void fn_blower_is_error(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, blower_is_error()); } void fn_blower_is_open(ProcessContext* cxt) { zcanbus_send_ack(cxt->packet, isopen); }
private: void mini_pwm_blower_ctrl(int32_t duty) { duty = 100 - duty; if (duty < 0) duty = 0; if (duty > 100) duty = 100;
TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim); sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle); HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle); HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
m_miniPwmBlower_enGpio.write(duty != 0); } }; } // namespace iflytop
|