diff --git a/chip/zpwm_generator_muti_channel.cpp b/chip/zpwm_generator_muti_channel.cpp index 3371703..73eb8f4 100644 --- a/chip/zpwm_generator_muti_channel.cpp +++ b/chip/zpwm_generator_muti_channel.cpp @@ -81,10 +81,9 @@ void ZPWMGeneratorMutiChannel::startPWM(int32_t channelindex /*1 void ZPWMGeneratorMutiChannel::stopPWM(int32_t channelindex) { if (channelindex < 1 || channelindex > 4) return; m_pwmstate[channelindex] = false; - float duty = 0; - if (!m_polarity) { - duty = 100.0 - duty; - } + // if (!m_polarity) { + // duty = 100.0 - duty; + // } // HAL_TIM_PWM_Stop(m_htim, m_channel); - startPWM(channelindex, duty); + startPWM(channelindex, 0); } diff --git a/components/api/zi_dc_motor_ctrl_module.hpp b/components/api/zi_dc_motor_ctrl_module.hpp index 50509e9..b0e8897 100644 --- a/components/api/zi_dc_motor_ctrl_module.hpp +++ b/components/api/zi_dc_motor_ctrl_module.hpp @@ -13,7 +13,12 @@ class ZIDcMotorCtrlModule { virtual void setSpeed(int32_t duty) = 0; virtual void stop() = 0; - virtual bool isError() = 0; - virtual bool dumpErrorInfo() = 0; + + virtual bool isWorking() = 0; + + virtual bool dumpErrorInfo() = 0; + + virtual bool isError() = 0; + virtual void clearError() = 0; }; } // namespace iflytop \ No newline at end of file diff --git a/components/api/zi_pwm_fan_ctrl_module.hpp b/components/api/zi_pwm_fan_ctrl_module.hpp index b972108..79af681 100644 --- a/components/api/zi_pwm_fan_ctrl_module.hpp +++ b/components/api/zi_pwm_fan_ctrl_module.hpp @@ -13,6 +13,10 @@ class ZIPWMFanCtrlModule { virtual void setFanSpeed(int32_t duty) = 0; virtual void stop() = 0; - virtual bool isError() = 0; + + virtual bool isWorking() = 0; + + virtual bool isError() = 0; + virtual void clearError() = 0; }; } // namespace iflytop \ No newline at end of file diff --git a/components/api/zi_pwm_pump_ctrl_module.hpp b/components/api/zi_pwm_pump_ctrl_module.hpp index 0438a6e..ae2e82b 100644 --- a/components/api/zi_pwm_pump_ctrl_module.hpp +++ b/components/api/zi_pwm_pump_ctrl_module.hpp @@ -13,7 +13,10 @@ class ZIPWMPumpCtrlModule { virtual void setPumpSpeed(int32_t duty) = 0; virtual void stop() = 0; - virtual bool isError() = 0; + virtual bool isWorking() = 0; + + virtual bool isError() = 0; + virtual void clearError() = 0; }; } // namespace iflytop \ No newline at end of file diff --git a/components/fan_group_ctrl_module/fan_group_ctrl_module.cpp b/components/fan_group_ctrl_module/fan_group_ctrl_module.cpp deleted file mode 100644 index b9dd60a..0000000 --- a/components/fan_group_ctrl_module/fan_group_ctrl_module.cpp +++ /dev/null @@ -1,153 +0,0 @@ -#include "fan_group_ctrl_module.hpp" - -#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp" -#include "sdk\components\zprotocols\zcancmder_v2\api\errorcode.hpp" -using namespace iflytop; -#define TAG "FGCM" -void FanGroupCtrlMoudle::initialize(config_t* pcfg) { - ZASSERT(pcfg->name != nullptr); - ZASSERT(pcfg); - m_mutex.init(); - // ZASSERT(pcfg->fanCtrlTim); - cfg = *pcfg; - m_enablefbcheck = pcfg->enablefbcheck; - - if (m_enablefbcheck) { - for (int32_t i = 0; i < ZARRAY_SIZE(cfg.fanFBGpioCfg); i++) { - if (cfg.fanFBGpioCfg[i].pin != PinNull) { - m_fanFBGpio[i].initAsInput(cfg.fanFBGpioCfg[i].pin, // - cfg.fanFBGpioCfg[i].mode, // - ZGPIO::kIRQ_risingIrq, // - cfg.fanFBGpioCfg[i].mirror); - m_fanFBGpio[i].regListener([this, i](ZGPIO* GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent) { onfbgpioirq(i); }); - m_nfanFBGpio++; - } - } - ZASSERT(pcfg->nfan == m_nfanFBGpio); - } - - for (int32_t i = 0; i < ZARRAY_SIZE(cfg.fanPowerGpioCfg); i++) { - if (cfg.fanPowerGpioCfg[i].pin != PinNull) { - m_fanPowerGpio[i].initAsOutput(cfg.fanPowerGpioCfg[i].pin, // - cfg.fanPowerGpioCfg[i].mode, // - cfg.fanPowerGpioCfg[i].initLevel, // - cfg.fanPowerGpioCfg[i].mirror); - m_fanPowerGpio[i].enableTrace(pcfg->enableTrace); - m_nfanPowerPin++; - } - } - cfg.pwm_cfg.calltrace = pcfg->enableTrace; - m_fanCtrlPwm.initialize(&cfg.pwm_cfg); - OSDefaultSchduler::getInstance()->regPeriodJob([this](OSDefaultSchduler::Context&) { checkfanState(); }, 1000); -} - -int32_t FanGroupCtrlMoudle::module_xxx_reg(int32_t param_id, bool read, int32_t& val) { - switch (param_id) { - MODULE_COMMON_PROCESS_REG_CB(); - default: - return err::kmodule_not_find_config_index; - break; - } - return 0; -} - -void FanGroupCtrlMoudle::onfbgpioirq(int32_t fanindex) { - // IRQ Context,中断上下文 - m_fanstate[fanindex].fanFBCount++; - m_fanstate[fanindex].lastupdateFanFBCountTime = zos_get_tick(); -} - -int32_t FanGroupCtrlMoudle::startModule(int32_t duty) { - // ZLOGI("startModule duty:%d", duty); - zlock_guard lck(m_mutex); - if (duty < 20) duty = 20; - fanisworking = true; - - clearError(); - startFanPWM(duty); - powerON(); - m_lastcheckTime = zos_get_tick(); - return 0; -} -int32_t FanGroupCtrlMoudle::stopModule() { - zlock_guard lck(m_mutex); - - fanisworking = false; - stopFanPWM(); - powerOff(); - return 0; -} - -int32_t FanGroupCtrlMoudle::getSubModuleErrorState(int32_t fanindex, int32_t* error_state) { - if (fanindex > 3) { - return err::kfail; - } - - *error_state = m_fanstate[fanindex].fanerrorstate; - return 0; -} - -bool FanGroupCtrlMoudle::isError() { - bool iserror = false; - for (int32_t i = 0; i < cfg.nfan; i++) { - if (m_fanstate[i].fanerrorstate > 0) { - iserror = true; - break; - } - } - return iserror; -} - -void FanGroupCtrlMoudle::checkfanState() { - zlock_guard lck(m_mutex); - if (!m_enablefbcheck) return; - - if (zos_haspassedms(m_lastcheckTime) < 3 * 1000) { - return; - } - - m_lastcheckTime = zos_get_tick(); - for (int32_t i = 0; i < cfg.nfan; i++) { - checkfanState(i); - } -} - -void FanGroupCtrlMoudle::checkfanState(int32_t fanindex) { - if (fanisworking && zos_haspassedms(m_fanstate[fanindex].lastupdateFanFBCountTime) > 10 * 1000) { - m_fanstate[fanindex].fanerrorstate = 1; - ZLOGE(TAG, "%s checkfanState fanindex:%d error", cfg.name, fanindex); - stopModule(); - } -} - -void FanGroupCtrlMoudle::powerON() { - for (int32_t i = 0; i < m_nfanPowerPin; i++) { - m_fanPowerGpio[i].setState(true); - } -} -void FanGroupCtrlMoudle::powerOff() { - for (int32_t i = 0; i < m_nfanPowerPin; i++) { - m_fanPowerGpio[i].setState(false); - } -} - -void FanGroupCtrlMoudle::clearError() { - for (int32_t i = 0; i < cfg.nfan; i++) { - m_fanstate[i].fanerrorstate = 0; - } -} - -void FanGroupCtrlMoudle::startFanPWM(int32_t duty) { - for (int32_t i = 0; i < ZARRAY_SIZE(cfg.fan0Channel); i++) { - if (cfg.fan0Channel[i] != 0) { - m_fanCtrlPwm.startPWM(cfg.fan0Channel[i], duty); - } - } -} -void FanGroupCtrlMoudle::stopFanPWM() { - for (int32_t i = 0; i < ZARRAY_SIZE(cfg.fan0Channel); i++) { - if (cfg.fan0Channel[i] != 0) { - m_fanCtrlPwm.stopPWM(cfg.fan0Channel[i]); - } - } -} diff --git a/components/fan_group_ctrl_module/fan_group_ctrl_module.hpp b/components/fan_group_ctrl_module/fan_group_ctrl_module.hpp deleted file mode 100644 index 97e5c87..0000000 --- a/components/fan_group_ctrl_module/fan_group_ctrl_module.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once -/** - * @file - * @author zhaohe (h_zhaohe@163.com) - * @brief - * @version 0.1 - * @date 2023-04-14 - * - * @copyright Copyright (c) 2023 - * - */ -#include - -#include "sdk/os/zos.hpp" -#include "sdk\chip\zpwm_generator_muti_channel.hpp" -#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp" -#include "sdk\components\zprotocols\zcancmder_v2\api\zi_module.hpp" -#include "sdk\os\mutex.hpp" -// - -namespace iflytop { -// SUPPORT REG - -class FanGroupCtrlMoudle : public ZIModule { - ENABLE_MODULE(FanGroupCtrlMoudle, kfan_ctrl_module, 1); - - public: - typedef struct { - // TIM_HandleTypeDef* fanCtrlTim; - const char* name; - - ZPWMGeneratorMutiChannel::hardware_config_t pwm_cfg; - - int32_t nfan; - int32_t fan0Channel[4]; - ZGPIO::InputGpioCfg_t fanFBGpioCfg[4]; - ZGPIO::OutputGpioCfg_t fanPowerGpioCfg[4]; - bool enablefbcheck; - bool enableTrace; - } config_t; - - typedef struct { - int32_t fanFBCount; - uint32_t lastupdateFanFBCountTime; - int32_t fanerrorstate; - } fanState_t; - - ZPWMGeneratorMutiChannel m_fanCtrlPwm; - - ZGPIO m_fanFBGpio[4]; - int32_t m_nfanFBGpio = 0; - - ZGPIO m_fanPowerGpio[4]; - int32_t m_nfanPowerPin = 0; - - fanState_t m_fanstate[4]; - bool fanisworking = false; - uint32_t m_lastcheckTime = 0; - - config_t cfg; - - bool m_enablefbcheck = false; - zmutex m_mutex; - - public: - FanGroupCtrlMoudle(){}; - - void initialize(config_t* fangroup); - - int32_t startModule(int32_t duty); - int32_t stopModule(); - - int32_t getSubModuleErrorState(int32_t fanindex, int32_t* error_state); - bool isError(); - - private: - void checkfanState(); - void onfbgpioirq(int32_t fanindex); - - private: - void checkfanState(int32_t fanindex); - void powerON(); - void powerOff(); - void clearError(); - void startFanPWM(int32_t duty); - void stopFanPWM(); - - virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t& val) override; -}; - -} // namespace iflytop diff --git a/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp b/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp index efb574b..bccf1e4 100644 --- a/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp +++ b/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp @@ -26,7 +26,7 @@ class PWMSpeedCtrlModule { public: typedef struct { // TIM_HandleTypeDef* fanCtrlTim; - const char* name; + const char* name; ZPWMGeneratorMutiChannel::hardware_config_t pwm_cfg; int32_t nfan; @@ -68,8 +68,11 @@ class PWMSpeedCtrlModule { int32_t startModule(int32_t duty); int32_t stopModule(); + bool isWorking() { return fanisworking; } + int32_t getSubModuleErrorState(int32_t fanindex, int32_t* error_state); bool isError(); + void clearError(); private: void checkfanState(); @@ -79,7 +82,6 @@ class PWMSpeedCtrlModule { void checkfanState(int32_t fanindex); void powerON(); void powerOff(); - void clearError(); void startFanPWM(int32_t duty); void stopFanPWM(); }; diff --git a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp index 37acace..af53439 100644 --- a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp +++ b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp @@ -13,42 +13,14 @@ using namespace iflytop; #define ACTION_TEST_DUMP_DC_MOTOR_STATE 4 void WaterCoolingTemperatureControlModule::initialize(int32_t id, config_t* cfg, hardwared_config_t* hardwaredconfig) { -#if 0 - ZITemperatureSensor* temperature_sensor[4]; - PWMSpeedCtrlModule* fanTable[4]; - PWMSpeedCtrlModule* pump; - DRV8710* peltier_ctrl[2]; - - ZGPIO::OutputGpioCfg_t ext_input[10]; - ZGPIO::InputGpioCfg_t ext_output[10]; -#endif - m_id = id; -#if 0 - for (int32_t i = 0; i < ZARRAY_SIZE(hardwaredconfig->temperature_sensor); i++) { - if (!hardwaredconfig->temperature_sensor[i]) break; - m_temperature_sensor[i] = hardwaredconfig->temperature_sensor[i]; - m_n_temperature_sensor++; - } - - for (int32_t i = 0; i < ZARRAY_SIZE(hardwaredconfig->fanTable); i++) { - if (!hardwaredconfig->fanTable[i]) break; - m_fanTable[i] = hardwaredconfig->fanTable[i]; - m_fanNum++; - } - - m_pump = hardwaredconfig->pump; - - for (int32_t i = 0; i < ZARRAY_SIZE(hardwaredconfig->peltier_ctrl); i++) { - if (!hardwaredconfig->peltier_ctrl[i]) break; - m_peltier_ctrl[i] = hardwaredconfig->peltier_ctrl[i]; - m_peltier_ctrl_num++; - } -#endif + m_id = id; + m_hardwared_config = *hardwaredconfig; for (int32_t i = 0; i < ZARRAY_SIZE(hardwaredconfig->temperature_sensor); i++) { if (!hardwaredconfig->temperature_sensor[i]) break; m_temperature_sensor[i] = hardwaredconfig->temperature_sensor[i]; m_n_temperature_sensor++; } + ZASSERT(m_temperature_sensor[m_hardwared_config.temp_fb_index] != nullptr); m_fan_ctrl = hardwaredconfig->fan_ctrl; m_pelter_ctrl = hardwaredconfig->pelter_ctrl; @@ -142,22 +114,17 @@ int32_t WaterCoolingTemperatureControlModule::module_factory_reset() { return 0; int32_t WaterCoolingTemperatureControlModule::module_flush_cfg() { return 0; } int32_t WaterCoolingTemperatureControlModule::module_active_cfg() { return 0; } -int32_t WaterCoolingTemperatureControlModule::module_stop() { - m_thread.stop(); - return 0; -} int32_t WaterCoolingTemperatureControlModule::module_start() { m_thread.stop(); - m_com_reg.module_errorcode = 0; + module_clear_error(); ZLOGI(TAG, "module_start"); m_thread.start([this]() { workloop(); }); return 0; } -int32_t WaterCoolingTemperatureControlModule::module_break() { +int32_t WaterCoolingTemperatureControlModule::module_stop() { m_thread.stop(); return 0; } - void WaterCoolingTemperatureControlModule::workloop() { /** * @brief @@ -205,8 +172,8 @@ int32_t WaterCoolingTemperatureControlModule::checkdevice() { BIT(m_com_reg.module_errorbitflag0, 0), BIT(m_com_reg.module_errorbitflag0, 1), BIT(m_com_reg.module_errorbitflag0, 2)); m_pelter_ctrl->dumpErrorInfo(); m_com_reg.module_errorcode = err::khwardware_error; + return 1; } - return 0; } @@ -214,7 +181,7 @@ int32_t WaterCoolingTemperatureControlModule::checkdevice() { * BASIC * *******************************************************************************/ -float WaterCoolingTemperatureControlModule::read_pid_temperature() { return m_temperature_sensor[0]->getTemperature(); } +float WaterCoolingTemperatureControlModule::read_pid_temperature() { return m_temperature_sensor[m_hardwared_config.temp_fb_index]->getTemperature(); } void WaterCoolingTemperatureControlModule::pump_start(int32_t pump_speed) { ZLOGI(TAG, "pump_start %d", pump_speed); @@ -262,7 +229,6 @@ int32_t WaterCoolingTemperatureControlModule::getworkstate() { if (m_com_reg.module_errorcode != 0) { return 2; } - if (!m_thread.isworking()) { return 0; } else { diff --git a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp index 4e48f0a..2d67de0 100644 --- a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp +++ b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp @@ -45,13 +45,8 @@ class WaterCoolingTemperatureControlModule : public ZIModule { } config_t; typedef struct { -#if 0 - ZITemperatureSensor* temperature_sensor[4]; - PWMSpeedCtrlModule* fanTable[4]; - PWMSpeedCtrlModule* pump; - DRV8710* peltier_ctrl[2]; -#endif ZITemperatureSensor* temperature_sensor[4]; + int32_t temp_fb_index = 0; ZIPWMFanCtrlModule* fan_ctrl; ZIDcMotorCtrlModule* pelter_ctrl; ZIPWMPumpCtrlModule* pump_ctrl; @@ -67,19 +62,7 @@ class WaterCoolingTemperatureControlModule : public ZIModule { ZIDcMotorCtrlModule* m_pelter_ctrl; ZIPWMPumpCtrlModule* m_pump_ctrl; -#if 0 - // 温度传感器 - ZITemperatureSensor* m_temperature_sensor[4] = {0}; - int32_t m_n_temperature_sensor = 0; - // 风扇 - PWMSpeedCtrlModule* m_fanTable[4] = {0}; - int32_t m_fanNum = 0; - // 水泵 - PWMSpeedCtrlModule* m_pump = nullptr; - // 帕尔贴控制器 - DRV8710* m_peltier_ctrl[2]; - int32_t m_peltier_ctrl_num = 0; -#endif + hardwared_config_t m_hardwared_config; PidModule m_pidmodule; ZThread m_thread; @@ -105,7 +88,6 @@ class WaterCoolingTemperatureControlModule : public ZIModule { virtual int32_t module_stop() override; virtual int32_t module_start() override; - virtual int32_t module_break() override; virtual int32_t module_clear_error() override; diff --git a/components/zcancmder_module/zcan_fan_ctrl_module.cpp b/components/zcancmder_module/zcan_fan_ctrl_module.cpp new file mode 100644 index 0000000..fd7ba31 --- /dev/null +++ b/components/zcancmder_module/zcan_fan_ctrl_module.cpp @@ -0,0 +1,74 @@ +#include "zcan_fan_ctrl_module.hpp" +using namespace iflytop; +using namespace std; +#if 1 +#define TAG "ZcanFanCtrlModule" +void ZcanFanCtrlModule::initialize(int32_t id, ZIPWMFanCtrlModule* fanmodule, int32_t default_speed) { + m_id = id; + m_fanmodule = fanmodule; + ZASSERT(m_fanmodule != nullptr); + + OSDefaultSchduler::getInstance()->regPeriodJob( + [this](OSDefaultSchduler::Context& context) { // + if (m_isworking && m_com_reg.module_errorcode == 0) { + if (m_fanmodule->isError()) { + ZLOGE(TAG, "detect fan error,stop fan"); + m_com_reg.module_errorcode = err::khwardware_error; + m_fanmodule->clearError(); + module_stop(); + } + } + }, + 10); +} + +int32_t ZcanFanCtrlModule::getid(int32_t* id) { + *id = m_id; + return 0; +} +int32_t ZcanFanCtrlModule::module_get_status(int32_t* status) { + if (m_com_reg.module_errorcode != 0) { + *status = 2; + } else if (m_isworking) { + *status = 1; + } else { + *status = 0; + } + return 0; +} +int32_t ZcanFanCtrlModule::set_fan_default_speed(int32_t default_speed) { + m_default_speed = default_speed; + if (m_isworking) m_fanmodule->setFanSpeed(default_speed); + return 0; +} + +int32_t ZcanFanCtrlModule::module_xxx_reg(int32_t param_id, bool read, int32_t& val) { + switch (param_id) { + MODULE_COMMON_PROCESS_REG_CB(); + PROCESS_REG(kreg_fan0_ctrl_speed_level, REG_GET(m_default_speed), set_fan_default_speed(val)); + break; + default: + return err::kmodule_not_find_config_index; + } + return err::kmodule_not_find_config_index; +} + +int32_t ZcanFanCtrlModule::module_stop() { + m_isworking = false; + m_fanmodule->stop(); + return 0; +} +int32_t ZcanFanCtrlModule::module_start() { + module_clear_error(); + + if (m_default_speed == 0) { + module_stop(); + } + + m_isworking = true; + m_fanmodule->setFanSpeed(m_default_speed); + return 0; +} + +int32_t ZcanFanCtrlModule::do_action(int32_t actioncode) { return 0; } +#endif \ No newline at end of file diff --git a/components/zcancmder_module/zcan_fan_ctrl_module.hpp b/components/zcancmder_module/zcan_fan_ctrl_module.hpp new file mode 100644 index 0000000..4d26381 --- /dev/null +++ b/components/zcancmder_module/zcan_fan_ctrl_module.hpp @@ -0,0 +1,56 @@ +#pragma once +/** + * @file tmp117.hpp + * @author zhaohe (h_zhaohe@163.com) + * @brief + * @version 0.1 + * @date 2023-04-14 + * + * @copyright Copyright (c) 2023 + * + * + * 1. 参考:https://github.com/rkiyak/TMP117.git + * 2. 同级目录有芯片的datasheet。 + */ +#include + +#include "sdk/os/zos.hpp" +// +#include "sdk\components\api\zi_pwm_fan_ctrl_module.hpp" +#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp" + +namespace iflytop { +/** + * @brief + * 水冷温度控制模块 + */ + +class ZcanFanCtrlModule : public ZIModule { + ENABLE_MODULE(ZcanFanCtrlModule, kfan_ctrl_module, 1); + + public: + ZIPWMFanCtrlModule* m_fanmodule = nullptr; + int32_t m_id = 0; + + bool m_isworking = false; + + int32_t m_default_speed = 50; + + public: + ZcanFanCtrlModule(){}; + virtual ~ZcanFanCtrlModule(){}; + + void initialize(int32_t id, ZIPWMFanCtrlModule* fanmodule, int32_t default_speed); + + virtual int32_t getid(int32_t* id) override; + virtual int32_t module_get_status(int32_t* status) override; + virtual int32_t module_start() override; + virtual int32_t module_stop() override; + virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t& val) override; + + public: + virtual int32_t set_fan_default_speed(int32_t default_speed); + virtual int32_t do_action(int32_t actioncode) override; +}; + +} // namespace iflytop diff --git a/components/zprotocols/zcancmder_v2 b/components/zprotocols/zcancmder_v2 index ab90926..5763680 160000 --- a/components/zprotocols/zcancmder_v2 +++ b/components/zprotocols/zcancmder_v2 @@ -1 +1 @@ -Subproject commit ab909260b588f575c9286bf4d3a72560f2f1ede7 +Subproject commit 57636804cb7e8bd84466ce009d57c372cc20b9ea