/*..........................................................................*/ static void initialize(void) { uint8_t p; QActive *a; /* set priorities all registered active objects... */ for (p = (uint8_t)1; p <= (uint8_t)QF_MAX_ACTIVE; ++p) { a = QF_ROM_ACTIVE_GET_(p); Q_ASSERT(a != (QActive *)0); /* QF_active[p] must be initialized */ a->prio = p; /* set the priority of the active object */ } /* trigger initial transitions in all registered active objects... */ for (p = (uint8_t)1; p <= (uint8_t)QF_MAX_ACTIVE; ++p) { a = QF_ROM_ACTIVE_GET_(p); #ifndef QF_FSM_ACTIVE QHsm_init(&a->super); /* initial tran. */ #else QFsm_init(&a->super); /* initial tran. */ #endif } QF_INT_DISABLE(); QK_currPrio_ = (uint8_t)0; /* set the priority for the QK idle loop */ p = QK_schedPrio_(); if (p != (uint8_t)0) { QK_sched_(p); /* process all events produced so far */ } QF_INT_ENABLE(); }
/*..........................................................................*/ void main() { Bomb4_ctor(&l_bomb, 0x0D); /* the secret defuse code, 1101 binary */ printf("Time Bomb (QEP QFsm class)\n" "Press 'u' for UP event\n" "Press 'd' for DOWN event\n" "Press 'a' for ARM event\n" "Press <Esc> to quit.\n"); QFsm_init((QFsm *)&l_bomb, (QEvent *)0); /* take the initial transition */ for (;;) { /* event loop */ static TickEvt tick_evt = { TICK_SIG, 0, 0}; delay(100); /* 100 ms delay */ if (++tick_evt.fine_time == 10) { tick_evt.fine_time = 0; } printf("T(%1d)%c", tick_evt.fine_time, (tick_evt.fine_time == 0) ? '\n' : ' '); QFsm_dispatch((QFsm *)&l_bomb, (QEvent *)&tick_evt); if (kbhit()) { static QEvent const up_evt = { UP_SIG, 0 }; static QEvent const down_evt = { DOWN_SIG, 0 }; static QEvent const arm_evt = { ARM_SIG, 0 }; QEvent const *e = (QEvent *)0; switch (getch()) { case 'u': { /* UP event */ printf("\nUP : "); e = &up_evt; /* generate the UP event */ break; } case 'd': { /* DOWN event */ printf("\nDOWN: "); e = &down_evt; /* generate the DOWN event */ break; } case 'a': { /* ARM event */ printf("\nARM : "); e = &arm_evt; /* generate the ARM event */ break; } case '\33': { /* <Esc> key */ printf("\nESC : Bye! Bye!"); exit(0); break; } } if (e != (QEvent *)0) { /* keyboard event available? */ QFsm_dispatch((QFsm *)&l_bomb, e); /* dispatch the event */ } } } }
void QHsmTagInit(void) { Tag *a = &Tag_; Tag_ctor(a); #ifndef QF_FSM_ACTIVE QHsm_init(&a->super); /* take the initial transition in HSM */ #else QFsm_init(&a->super); /* take the initial transition in FSM */ #endif }