/*..........................................................................*/
QState Calc_zero1(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("zero1-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("zero1-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case DIGIT_0_SIG: {
            ;                                          /* explicitly ignore */
            status = Q_HANDLED();
            break;
        }
        case DIGIT_1_9_SIG: {
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_int1);
            break;
        }
        case POINT_SIG: {
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_frac1);
            break;
        }
        default: {
            status = Q_SUPER(&Calc_operand1);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_on(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("on-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("on-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case Q_INIT_SIG: {
            BSP_message("on-INIT;");
            status = Q_TRAN(&Calc_ready);
            break;
        }
        case C_SIG: {
            BSP_clear();
            status = Q_TRAN(&Calc_on);                  /* transition-to-self */
            break;
        }
        case OFF_SIG: {
            status = Q_TRAN(&Calc_final);
            break;
        }
        default: {
            status = Q_SUPER(&QHsm_top);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_frac2(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("frac2-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("frac2-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case DIGIT_0_SIG:                     /* intentionally fall through */
        case DIGIT_1_9_SIG: {
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_HANDLED();
            break;
        }
        case POINT_SIG: {
            ;                                          /* explicitly ignore */
            status = Q_HANDLED();
            break;
        }
        default: {
            status = Q_SUPER(&Calc_operand2);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_operand1(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("operand1-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("operand1-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case CE_SIG: {
            BSP_clear();
            status = Q_TRAN(&Calc_begin);
            break;
        }
        case OPER_SIG: {
            me->operand1 = BSP_get_value();
            me->operator = ((CalcEvt const *)e)->key_code;
            status = Q_TRAN(&Calc_opEntered);
            break;
        }
        case EQUALS_SIG: {
            status = Q_TRAN(&Calc_result);
            break;
        }
        default: {
            status = Q_SUPER(&Calc_on);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_begin(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("begin-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("begin-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case OPER_SIG: {
            if (((CalcEvt const *)e)->key_code == KEY_MINUS) {
                status = Q_TRAN(&Calc_negated1);
            }
            else {
                status = Q_UNHANDLED();
            }
            break;
        }
        default: {
            status = Q_SUPER(&Calc_ready);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_negated1(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("negated1-ENTRY;");
            BSP_negate();
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("negated1-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case OPER_SIG: {
            if (((CalcEvt const *)e)->key_code == KEY_MINUS) {
                ;                                      /* explicitly ignore */
                status = Q_HANDLED();                      /* event handled */
            }
            else {
                status = Q_HANDLED();
            }
            break;
        }
        case CE_SIG: {
            BSP_clear();
            status = Q_TRAN(&Calc_begin);
            break;
        }
        case DIGIT_0_SIG: {
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_zero1);
            break;
        }
        case DIGIT_1_9_SIG: {
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_int1);
            break;
        }
        case POINT_SIG: {
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_frac1);
            break;
        }
        default: {
            status = Q_SUPER(&Calc_on);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_ready(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("ready-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("ready-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case Q_INIT_SIG: {
            BSP_message("ready-INIT;");
            status = Q_TRAN(&Calc_begin);
            break;
        }
        case DIGIT_0_SIG: {
            BSP_clear();
            status = Q_TRAN(&Calc_zero1);
            break;
        }
        case DIGIT_1_9_SIG: {
            BSP_clear();
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_int1);
            break;
        }
        case POINT_SIG: {
            BSP_clear();
            BSP_insert((int)'0');
            BSP_insert((int)'.');
            status = Q_TRAN(&Calc_frac1);
            break;
        }
        case OPER_SIG: {
            me->operand1 = BSP_get_value();
            me->operator = ((CalcEvt const *)e)->key_code;
            status = Q_TRAN(&Calc_opEntered);
            break;
        }
        default: {
            status = Q_SUPER(&Calc_on);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_opEntered(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("opEntered-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("opEntered-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case OPER_SIG: {
            if (((CalcEvt const *)e)->key_code == KEY_MINUS) {
                BSP_clear();
                status = Q_TRAN(&Calc_negated2);
            }
            break;
        }
        case DIGIT_0_SIG: {
            BSP_clear();
            status = Q_TRAN(&Calc_zero2);
            break;
        }
        case DIGIT_1_9_SIG: {
            BSP_clear();
            BSP_insert(((CalcEvt const *)e)->key_code);
            status = Q_TRAN(&Calc_int2);
            break;
        }
        case POINT_SIG: {
            BSP_clear();
            BSP_insert((int)'0');
            BSP_insert((int)'.');
            status = Q_TRAN(&Calc_frac2);
        }
        default: {
            status = Q_SUPER(&Calc_on);
            break;
        }
    }
    return status;
}
/*..........................................................................*/
QState Calc_result(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("result-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("result-EXIT;");
            status = Q_HANDLED();
            break;
        }
        default: {
            status = Q_SUPER(&Calc_ready);
            break;
        }
    }
    return status;
}
Пример #10
0
/* ${SMs::Calc::SM::on::ready::initial} */
static QState Calc_ready_i(Calc * const me) {
    static struct {
        QMState const *target;
        QActionHandler act[2];
    } const tatbl_ = { /* transition-action table */
        &Calc_begin_s, /* target state */
        {
            Q_ACTION_CAST(&Calc_begin_e), /* entry */
            Q_ACTION_CAST(0) /* zero terminator */
        }
    };
    /* ${SMs::Calc::SM::on::ready::initial} */
    BSP_message("ready-INIT;");
    return QM_TRAN_INIT(&tatbl_);
}
/*..........................................................................*/
QState Calc_final(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("final-ENTRY;");
            BSP_exit();
            status = Q_HANDLED();
            break;
        }
        default: {
            status = Q_SUPER(&QHsm_top);
            break;
        }
    }
    return status;
}
Пример #12
0
/* ${SMs::Calc::SM::on::negated2} */
static QState Calc_negated2_x(Calc * const me) {
    BSP_message("negated2-EXIT;");
    (void)me; /* avoid compiler warning in case 'me' is not used */
    return QM_EXIT(&Calc_negated2_s);
}
Пример #13
0
/* ${SMs::Calc::SM::on::opEntered} */
static QState Calc_opEntered_x(Calc * const me) {
    BSP_message("opEntered-EXIT;");
    (void)me; /* avoid compiler warning in case 'me' is not used */
    return QM_EXIT(&Calc_opEntered_s);
}
Пример #14
0
/* ${SMs::Calc::SM::on::operand1::frac1} */
static QState Calc_frac1_e(Calc * const me) {
    BSP_message("frac1-ENTRY;");
    (void)me; /* avoid compiler warning in case 'me' is not used */
    return QM_ENTRY(&Calc_frac1_s);
}
/*..........................................................................*/
QState Calc_operand2(Calc * const me, QEvt const * const e) {
    QState status;
    switch (e->sig) {
        case Q_ENTRY_SIG: {
            BSP_message("operand2-ENTRY;");
            status = Q_HANDLED();
            break;
        }
        case Q_EXIT_SIG: {
            BSP_message("operand2-EXIT;");
            status = Q_HANDLED();
            break;
        }
        case CE_SIG: {
            BSP_clear();
            status = Q_TRAN(&Calc_opEntered);
            break;
        }
        case OPER_SIG: {
            if (BSP_eval(me->operand1, me->operator, BSP_get_value())) {
                me->operand1 = BSP_get_value();
                me->operator = ((CalcEvt const *)e)->key_code;
                status = Q_TRAN(&Calc_opEntered);
            }
            else {
                status = Q_TRAN(&Calc_error);
            }
            break;
        }
        case EQUALS_SIG: {
            if (BSP_eval(me->operand1, me->operator, BSP_get_value())) {
                status = Q_TRAN(&Calc_result);
            }
            else {
                status = Q_TRAN(&Calc_error);
            }
            break;
        }
        case PERCENT_SIG: {
            double operand2 = 0.0;
            switch (me->operator) {
                case KEY_PLUS:
                case KEY_MINUS: {
                    operand2 = (me->operand1 * BSP_get_value())/100.0;
                    break;
                }
                case KEY_MULT:
                case KEY_DIVIDE: {
                    operand2 = BSP_get_value()/100.0;
                    break;
                }
            }

            if (BSP_eval(me->operand1, me->operator, operand2)) {
                status = Q_TRAN(&Calc_result);
            }
            else {
                status = Q_TRAN(&Calc_error);
            }
            break;
        }
        default: {
            status = Q_SUPER(&Calc_on);
            break;
        }
    }
    return status;
}