/*..........................................................................*/ QState Bomb_timing(Bomb *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { QActive_arm((QActive *)me, BSP_TICKS_PER_SEC/4); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { QActive_arm((QActive *)me, BSP_TICKS_PER_SEC/4); if (me->ctr > (uint8_t)0) { if ((me->ctr & 0x01) != 0) { LED_on(); } else { LED_off(); } --me->ctr; } else { /* timeout expired */ return Q_TRAN(&Bomb_blast); } return Q_HANDLED(); } } return Q_IGNORED(); }
/*..........................................................................*/ QState Sensor_polling(Sensor *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { /* timeout in 1/2 second */ QActive_arm((QActive *)me, BSP_TICKS_PER_SEC/2); return Q_HANDLED(); } case Q_EXIT_SIG: { QActive_disarm((QActive *)me); return Q_HANDLED(); } case Q_INIT_SIG: { return Q_TRAN(&Sensor_processing); } case Q_TIMEOUT_SIG: { /* timeout in 1/2 second */ QActive_arm((QActive *)me, BSP_TICKS_PER_SEC/2); ++me->pollCtr; printf("poll %3d\n", me->pollCtr); if ((me->pollCtr & 0x3) == 0) { /* modulo 4 */ QActive_post((QActive *)me, DATA_READY_SIG, 0); } return Q_HANDLED(); } case TERMINATE_SIG: { return Q_TRAN(&Sensor_final); } } return Q_SUPER(&QHsm_top); }
static QState mmi_busy(struct mmi_ao *me) { static const char busy_char[] = ". "; static uint8_t busy_index; switch (Q_SIG(me)) { case Q_ENTRY_SIG: // Print hello message lcd_clear(); lcd_write(0, 0, "Busy ...", 0); QActive_arm((QActive *) me, TIMEOUT_BUSY); return Q_HANDLED(); case Q_EXIT_SIG: QActive_disarm((QActive *) me); return Q_HANDLED(); case Q_TIMEOUT_SIG: lcd_char(15, 0, busy_char[busy_index]); busy_index = (busy_index + 1) % (sizeof(busy_char) - 1); QActive_arm((QActive *) me, TIMEOUT_BUSY); return Q_HANDLED(); case SIG_KEY_PRESS: if (Q_PAR(me) == KEY_LEFT) { QActive_post((QActive *) &prog_ao, SIG_PROG_STOP, 0); return Q_TRAN(mmi_navigate); } return Q_HANDLED(); case SIG_PROG_DONE: return Q_TRAN(mmi_navigate); } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState Ped_wait(Ped *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(me->super.prio, "wait"); me->retryCtr = N_ATTEMPTS; QActive_arm((QActive *)me, WAIT_TOUT); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { if ((--me->retryCtr) != 0) { QActive_arm((QActive *)me, WAIT_TOUT); QActive_post((QActive *)&AO_Pelican, PEDS_WAITING_SIG, 0); } else { return Q_TRAN(&Ped_off); } return Q_HANDLED(); } case TERMINATE_SIG: { QF_stop(); return Q_HANDLED(); } } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState AlarmClock_mode24hr(AlarmClock *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { printf("*** 24-hour mode\n"); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { /* timeout in one second */ QActive_arm((QActive *)me, BSP_TICKS_PER_SEC); if (++me->current_time == 24*60) { /* roll over in 24-hr mode? */ me->current_time = 0; } printf("%02d:%02d\n", me->current_time/60, me->current_time%60); /* synchronously dispatch to the orthogonal component */ Q_SIG(&me->alarm) = TIME_SIG; Q_PAR(&me->alarm) = me->current_time; Alarm_dispatch(&me->alarm); return Q_HANDLED(); } } return Q_SUPER(&AlarmClock_timekeeping); }
/*..........................................................................*/ QState AlarmClock_mode12hr(AlarmClock *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { printf("*** 12-hour mode\n"); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { uint32_t h; /* temporary variable to hold hour */ /* timeout in one second */ QActive_arm((QActive *)me, BSP_TICKS_PER_SEC); if (++me->current_time == 12*60) { /* roll over in 12-hr mode? */ me->current_time = 0; } h = me->current_time/60; printf("%02d:%02d %s\n", (h % 12) ? (h % 12) : 12, me->current_time % 60, (h / 12) ? "PM" : "AM"); /* synchronously dispatch to the orthogonal component */ Q_SIG(&me->alarm) = TIME_SIG; Q_PAR(&me->alarm) = me->current_time; Alarm_dispatch(&me->alarm); return Q_HANDLED(); } } return Q_SUPER(&AlarmClock_timekeeping); }
/*${AOs::Blink::SM::OFF} ...................................................*/ static QState Blink_OFF(Blink * const me) { QState status_; switch (Q_SIG(me)) { /* ${AOs::Blink::SM::OFF} */ case Q_ENTRY_SIG: { BSP_ledOff(); QActive_arm((QActive *)me, BLINK_TOUT); status_ = Q_HANDLED(); break; } /* ${AOs::Blink::SM::OFF} */ case Q_EXIT_SIG: { QActive_disarm((QActive *)me); status_ = Q_HANDLED(); break; } /* ${AOs::Blink::SM::OFF::Q_TIMEOUT} */ case Q_TIMEOUT_SIG: { status_ = Q_TRAN(&Blink_ON); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; }
/*..........................................................................*/ QState Bomb_blast(Bomb *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { QActive_arm((QActive *)me, 2 * BSP_TICKS_PER_SEC); LED_on(); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { return Q_TRAN(&Bomb_off); } } return Q_IGNORED(); }
/*..........................................................................*/ QState TServer_authorizing(TServer *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { printf("-> authorizing\n"); /* one-shot timeout in 2 seconds */ QActive_arm((QActive *)me, 2*BSP_TICKS_PER_SEC); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { return Q_TRAN(&TServer_idle); } } return Q_SUPER(&TServer_operational); }
static QState buzzerState(struct ExternalBell *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: BSP_buzzer(external_bell_buzz, 8); QActive_arm((QActive*)me, 7); return Q_HANDLED(); case Q_TIMEOUT_SIG: return Q_TRAN(offState); case Q_EXIT_SIG: BSP_buzzer(0, 0); return Q_HANDLED(); } return Q_SUPER(topState); }
/*..........................................................................*/ QState Philo_thinking(Philo *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { QActive_arm((QActive *)me, THINK_TIME); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { BSP_busyDelay(); return Q_TRAN(&Philo_hungry); } // case EAT_SIG: // case DONE_SIG: { // Q_ERROR(); /* these events should never arrive in this state */ // return Q_HANDLED(); // } } return Q_IGNORED(); }
/*..........................................................................*/ QState Ped_off(Ped *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(me->super.prio, "off"); QActive_arm((QActive *)me, OFF_TOUT); QActive_post((QActive *)&AO_Pelican, OFF_SIG, 0); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { QActive_post((QActive *)&AO_Pelican, ON_SIG, 0); return Q_TRAN(&Ped_wait); } case TERMINATE_SIG: { QF_stop(); return Q_HANDLED(); } } return Q_SUPER(&QHsm_top); }
static QState mmi_show_msg(struct mmi_ao *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: QActive_arm((QActive *) me, TICKS(Q_PAR(me) * 1000)); return Q_HANDLED(); case Q_EXIT_SIG: QActive_disarm((QActive *) me); return Q_HANDLED(); case Q_TIMEOUT_SIG: return Q_TRAN(mmi_navigate); case SIG_KEY_PRESS: if (Q_PAR(me) == KEY_ENTER) { return Q_TRAN(mmi_navigate); } return Q_HANDLED();; } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState Sensor_busy(Sensor *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { printf("-> busy\n"); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { /* timeout in 1/2 second */ QActive_arm((QActive *)me, BSP_TICKS_PER_SEC/2); ++me->procCtr; printf("process %3d\n", me->procCtr); if ((me->procCtr & 0x1) == 0) { /* modulo 2 */ return Q_TRAN(&Sensor_idle); } return Q_HANDLED(); } } return Q_SUPER(&Sensor_processing); }
/*..........................................................................*/ QState Philo_eating(Philo *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { QActive_arm((QActive *)me, EAT_TIME); return Q_HANDLED(); } case Q_EXIT_SIG: { BSP_busyDelay(); QActive_post((QActive *)&AO_Table, DONE_SIG, me->super.prio); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { return Q_TRAN(&Philo_thinking); } case EAT_SIG: case DONE_SIG: { Q_ERROR(); /* these events should never arrive in this state */ } } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState Oper_run(Oper *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { QActive_arm((QActive *)me, me->interval); return Q_HANDLED(); } case Q_EXIT_SIG: { uint8_t timeout = me->bomb_prev + 1; if (timeout > me->bomb_max) { timeout = me->bomb_min; } me->bomb_prev = timeout; QActive_post((QActive *)&AO_Bomb, ARM_SIG, timeout); return Q_HANDLED(); } case Q_TIMEOUT_SIG: { return Q_TRAN(&Oper_run); /* transition to self */ } } return Q_IGNORED(); }
/*${components::aoGrinder::SM::settling} ...................................*/ static QState aoGrinder_settling(aoGrinder * const me) { QState status_; switch (Q_SIG(me)) { /* ${components::aoGrinder::SM::settling} */ case Q_ENTRY_SIG: { QActive_arm((QActive *)me, GRINDER_SETTLING_TIME); status_ = Q_HANDLED(); break; } /* ${components::aoGrinder::SM::settling::Q_TIMEOUT} */ case Q_TIMEOUT_SIG: { status_ = Q_TRAN(&aoGrinder_done); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; }
/*..........................................................................*/ QState AlarmClock_timekeeping(AlarmClock *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { /* timeout in one second */ QActive_arm((QActive *)me, BSP_TICKS_PER_SEC); return Q_HANDLED(); } case Q_EXIT_SIG: { QActive_disarm((QActive *)me); return Q_HANDLED(); } case Q_INIT_SIG: { return Q_TRAN(&AlarmClock_mode24hr); } case CLOCK_12H_SIG: { return Q_TRAN(&AlarmClock_mode12hr); } case CLOCK_24H_SIG: { return Q_TRAN(&AlarmClock_mode24hr); } case ALARM_SIG: { printf("Wake up!!!\n"); return Q_HANDLED(); } case ALARM_SET_SIG: case ALARM_ON_SIG: case ALARM_OFF_SIG: { /* synchronously dispatch to the orthogonal component */ Q_SIG(&me->alarm) = Q_SIG(me); Q_PAR(&me->alarm) = Q_PAR(me); Alarm_dispatch(&me->alarm); return Q_HANDLED(); } case TERMINATE_SIG: { return Q_TRAN(&AlarmClock_final); } } return Q_SUPER(&QHsm_top); }
/* @(/1/0/0/2) .............................................................*/ static QState Blinky_on(Blinky * const me) { QState status_; switch (Q_SIG(me)) { /* @(/1/0/0/2) */ case Q_ENTRY_SIG: { QActive_arm((QActive *)me, BSP_TICKS_PER_SEC/2); /* 1/2 sec */ BSP_ledOn(); status_ = Q_HANDLED(); break; } /* @(/1/0/0/2/0) */ case Q_TIMEOUT_SIG: { status_ = Q_TRAN(&Blinky_off); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; }
/** * Hello state. * Prints a hello message and waits for keypress or timeout to switch to main menu. */ static QState mmi_hello(struct mmi_ao *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: // Print hello message lcd_write(0, 0, " CamControl 0.1", 0); lcd_write(0, 1, "----------------", 0); QActive_post((QActive *) &backlight_ao, SIG_BACKLIGHT_ACTIVATE, 0); QActive_arm((QActive *) me, TIMEOUT_HELLO); return Q_HANDLED(); case Q_EXIT_SIG: // Clear screen QActive_disarm((QActive *) me); return Q_HANDLED(); case Q_TIMEOUT_SIG: case SIG_ENCODER: case SIG_KEY_PRESS: case SIG_KEY_RELEASE: return Q_TRAN(mmi_navigate); } return Q_SUPER(&QHsm_top); }