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

#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