Calc is the model of the Calculator described in Chapter 4 of PSiCC2. Calculator state machine constructor : QMsm(Q_STATE_CAST(&Calc::initial)) BSP_clear(); (void)e; // unused parameter BSP_message("on-ENTRY;"); BSP_message("on-EXIT;"); BSP_message("on-INIT;"); BSP_clear(); BSP_message("ready-ENTRY;"); BSP_message("ready-EXIT;"); BSP_message("ready-INIT;"); BSP_clear(); BSP_clear(); BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_clear(); BSP_insert((int)'0'); BSP_insert((int)'.'); me->m_op1 = BSP_get_value(); me->m_oper = Q_EVT_CAST(CalcEvt)->key_code; BSP_message("result-ENTRY;"); BSP_message("result-EXIT;"); BSP_message("begin-ENTRY;"); BSP_message("begin-EXIT;"); Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS else BSP_message("operand1-XP:ce;"); me->m_op1 = BSP_get_value(); me->m_oper = Q_EVT_CAST(CalcEvt)->key_code; BSP_message("opEntered-ENTRY;"); BSP_message("opEntered-EXIT;"); BSP_clear(); BSP_clear(); BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_clear(); BSP_insert((int)'0'); BSP_insert((int)'.'); Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS else BSP_message("error-ENTRY;"); BSP_message("error-EXIT;"); BSP_message("operand2-XP:ce;"); else BSP_eval(me->m_op1, me->m_oper, BSP_get_value()) else BSP_eval(me->m_op1, me->m_oper, BSP_get_value()) BSP_message("final-ENTRY;"); BSP_exit(); BSP_message("operand-ENTRY;"); BSP_message("operand-EXIT;"); BSP_message("operand::zero-EP;"); BSP_message("operand::intgr-EP;"); BSP_message("operand::frac-EP;"); BSP_message("operand::neg-EP;"); BSP_message("operand-INIT;"); BSP_message("operand::CE;"); BSP_clear(); BSP_message("operand::zero-ENTRY;"); BSP_message("operand::zero-EXIT;"); ; BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_insert((int)'0'); BSP_insert((int)'.'); BSP_message("operand::intgr-ENTRY;"); BSP_message("operand::intgr-EXIT;"); BSP_insert((int)'.'); BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_message("operand::frac-ENTRY;"); BSP_message("operand::frac-EXIT;"); ; BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_message("operand::neg-ENTRY;"); BSP_negate(); BSP_message("operand::neg-EXIT;"); BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); BSP_insert(Q_EVT_CAST(CalcEvt)->key_code); else Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS ; #ifndef calc1_sub_h #define calc1_sub_h enum CalcSignals { C_SIG = QP::Q_USER_SIG, CE_SIG, DIGIT_0_SIG, DIGIT_1_9_SIG, POINT_SIG, OPER_SIG, EQUALS_SIG, OFF_SIG }; $declare(Events::CalcEvt) extern QP::QMsm * const the_calc; // "opaque" pointer to calculator MSM #endif // calc1_sub_h #include "qpcpp.h" // QP/C++ #include "bsp.h" // board support package #include "calc1_sub.h" // application $declare(SMs::Calc) static Calc l_calc; // the only instance of the Calc class // global-scope definitions -------------------------------------- QP::QMsm * const the_calc = &l_calc; // "opaque" pointer to MSM $define(SMs::Calc)