/* @filename ctrl_machine.cpp * @author Derek Ditch * @date 03 NOV 2008 * */ #include #include #include #include #include #include #include namespace sc = boost::statechart; #include namespace mpl = boost::mpl; #include "ctrl_machine.hpp" Controller::Controller() : m_temp(0), m_switch(false) {} void Controller::setTemp( double p_temp ) { m_temp = p_temp; process_event( EvTemp() ); process_event( EvTemp() ); } int16_t Controller::getAirFlow() { int16_t flow = 0; // XXX Does NOT work when compiled with mex if(state_downcast< const Fan1On *>() != 0 ) { flow = 0; flow += 1; } if( state_downcast< const Fan2On *>() != 0 ) { flow += 1; } return flow; } void Controller::toggleSwitch() { m_switch ^= true; process_event( EvSwitch() ); std::cerr << "Switch activated" << std::endl; } sc::result Fan1On::react( const EvTemp & evt) { std::cerr << "Fan1On Reacting; Temp " << context< Controller >().m_temp << std::endl; if( context< Controller >().m_temp < 120 ) { std::cerr << "Entering Fan1Off" << std::endl; post_event( EvTemp() ); return transit< Fan1Off >(); } else { return forward_event(); } } sc::result Fan1Off::react( const EvTemp & ) { std::cerr << "Fan1Off Reacting; Temp " << context< Controller >().m_temp << std::endl; if( context< Controller >().m_temp >= 120 ) { std::cerr << "Entering Fan1On" << std::endl; post_event( EvTemp() ); return transit< Fan1On >(); } else { return forward_event(); } } sc::result Fan2On::react( const EvTemp & ) { if( context< Controller >().m_temp < 150 ) { std::cerr << "Entering Fan2Off" << std::endl; post_event( EvTemp() ); return transit< Fan2Off >(); } else { return forward_event(); } } sc::result Fan2Off::react( const EvTemp & ) { if( context< Controller >().m_temp >= 150 ) { std::cerr << "Entering Fan2On" << std::endl; post_event( EvTemp() ); return transit< Fan2On >(); } else { return forward_event(); } }