/* * FanControl.cpp * * Author: Aleksey Gerasimenko * gerasimenko.aleksey.n@gmail.com */ #include "SYSCTRL/FanControl.h" #define KM11_TURN_OFF (Uint16)0 #define KM11_TURN_ON (Uint16)1 namespace SYSCTRL { //CONSTRUCTOR FanControl::FanControl(): m_mode(SYSCTRL::FanControl::UNDEFINED), m_time_sample(-1.0), m_contact_bounce_period(FP_ZERO), m_voltage_level_on(FP_ZERO), m_voltage_level_off(FP_ZERO), m_km11_control(0), m_km11t_control(0), m_fan_state(false), m_fault(false), m_voltage_relay(), m_delay_off_timer(), m_control_state_timer(), _execute(&SYSCTRL::FanControl::_execute_undef) // {}//CONSTRUCTOR void FanControl::setup(float time_sample) { static bool status = true; if(m_mode == SYSCTRL::FanControl::UNDEFINED) { m_time_sample = time_sample; m_delay_off_timer.setup(m_time_sample); m_control_state_timer.setup(m_time_sample); status &= m_time_sample > FP_ZERO ? true : false; status &= m_delay_off_timer.compare(FLTSYSLIB::FTimer::CONFIGURATE); status &= m_control_state_timer.compare(FLTSYSLIB::FTimer::CONFIGURATE); if(status) { m_mode = SYSCTRL::FanControl::CONFIGURATE; // }//if // }//if // }//setup() // void FanControl::configure(const FanControlConfiguration& config) { static bool status = true; if(m_mode == SYSCTRL::FanControl::CONFIGURATE) { m_voltage_level_on = config.voltage_level_on; m_voltage_level_off = config.voltage_level_off; FLTSYSLIB::HysteresisConfiguration hyst_config; hyst_config.level_high = 1.0; hyst_config.level_low = FP_ZERO; hyst_config.off = m_voltage_level_off; hyst_config.on = m_voltage_level_on; m_voltage_relay.configure(hyst_config); FLTSYSLIB::FTimerConfiguration tm_config; tm_config.period = config.delay_off_timer; m_delay_off_timer.configure(tm_config); tm_config.period = config.control_state_timer; m_control_state_timer.configure(tm_config); status &= m_voltage_relay.compare(FLTSYSLIB::Hysteresis::OPERATIONAL); status &= m_delay_off_timer.compare(FLTSYSLIB::FTimer::OPERATIONAL); status &= m_control_state_timer.compare(FLTSYSLIB::FTimer::OPERATIONAL); if(status) { m_mode = SYSCTRL::FanControl::OPERATIONAL; _execute = &SYSCTRL::FanControl::_execute_undef; // }//if // }//if // }//configure() // #pragma CODE_SECTION("ramfuncs"); SYSCTRL::FanControl::mode_t FanControl::get_mode() { return m_mode; // }//get_mode() // #pragma CODE_SECTION("ramfuncs"); bool FanControl::compare(SYSCTRL::FanControl::mode_t mode) { return m_mode == mode; // }//compare() // #pragma CODE_SECTION("ramfuncs"); Uint16 FanControl::get_km11_control() { return m_km11_control; // }//get_km11_control() // #pragma CODE_SECTION("ramfuncs"); Uint16 FanControl::get_km11t_control() { return m_km11t_control; // }//get_km11t_control() // #pragma CODE_SECTION("ramfuncs"); bool FanControl::is_on() { return m_fan_state; // }//is_on() // #pragma CODE_SECTION("ramfuncs"); bool FanControl::is_off() { return !m_fan_state; // }//is_off() // #pragma CODE_SECTION("ramfuncs"); bool FanControl::is_fault() { return m_fault; // }//get_fault() // #pragma CODE_SECTION("ramfuncs"); void FanControl::execute(float voltage, FLTSYSLIB::DigitalInput& aux_km) { (this->*_execute)(voltage, aux_km); // }//execute() // #pragma CODE_SECTION("ramfuncs"); void FanControl::_execute_undef(float voltage, FLTSYSLIB::DigitalInput& aux_km) { // }//_execute_undef() // #pragma CODE_SECTION("ramfuncs"); void FanControl::_execute_operational(float voltage, FLTSYSLIB::DigitalInput& aux_km) { m_fan_state = aux_km.is_on(); m_voltage_relay.execute(voltage); m_delay_off_timer.execute(); m_control_state_timer.execute(); if(m_voltage_relay.is_on()) { m_km11_control = KM11_TURN_ON; m_km11t_control = KM11_TURN_OFF; m_delay_off_timer.reset(); } else { if((m_delay_off_timer.is_running()) || (m_voltage_relay.is_switched_to_off())) { m_km11_control = KM11_TURN_OFF; m_km11t_control = KM11_TURN_ON; // }//if // if(m_voltage_relay.is_switched_to_off()) { m_delay_off_timer.start(); }//if if(m_delay_off_timer.is_finished()) { m_km11_control = KM11_TURN_OFF; m_km11t_control = KM11_TURN_OFF; // }//if // }//if else // }//_execute_operational() // } /* namespace SYSCTRL */