PEdestrian LIghto CONtrolled (PELICA) crossing PEdestrian LIght CONtrolled (PELICAN) crossing constructor me->subscribe(PEDS_WAITING_SIG); me->subscribe(TERMINATE_SIG); QS_OBJ_DICTIONARY(&l_Pelican); QS_OBJ_DICTIONARY(&l_Pelican.m_timeout); QS_FUN_DICTIONARY(&QP::QHsm::top); QS_FUN_DICTIONARY(&Pelican::initial); QS_FUN_DICTIONARY(&Pelican::offline); QS_FUN_DICTIONARY(&Pelican::operational); QS_FUN_DICTIONARY(&Pelican::carsEnabled); QS_FUN_DICTIONARY(&Pelican::carsGreen); QS_FUN_DICTIONARY(&Pelican::carsGreenNoPed); QS_FUN_DICTIONARY(&Pelican::carsGreenPedWait); QS_FUN_DICTIONARY(&Pelican::carsGreenInt); QS_FUN_DICTIONARY(&Pelican::carsYellow); QS_FUN_DICTIONARY(&Pelican::pedsEnabled); QS_FUN_DICTIONARY(&Pelican::pedsWalk); QS_FUN_DICTIONARY(&Pelican::pedsFlash); QS_SIG_DICTIONARY(PEDS_WAITING_SIG, (void *)0); // global signals QS_SIG_DICTIONARY(ON_SIG, (void *)0); QS_SIG_DICTIONARY(OFF_SIG, (void *)0); QS_SIG_DICTIONARY(TIMEOUT_SIG, &l_Pelican); // just for Pelican BSP_signalCars(CARS_RED); BSP_signalPeds(PEDS_DONT_WALK); BSP_terminate(0); BSP_signalCars(CARS_RED); BSP_signalCars(CARS_GREEN); me->m_timeout.postIn(me, CARS_GREEN_MIN_TOUT); (void)me->m_timeout.disarm(); BSP_showState("carsGreenNoPed"); BSP_showState("carsGreenInt"); BSP_showState("carsGreenPedWait"); BSP_showState("carsYellow"); BSP_signalCars(CARS_YELLOW); me->m_timeout.postIn(me, CARS_YELLOW_TOUT); (void)me->m_timeout.disarm(); BSP_signalPeds(PEDS_DONT_WALK); BSP_showState("pedsWalk"); BSP_signalPeds(PEDS_WALK); me->m_timeout.postIn(me, PEDS_WALK_TOUT); (void)me->m_timeout.disarm(); BSP_showState("pedsFlash"); me->m_timeout.postIn(me, PEDS_FLASH_TOUT); me->m_flashCtr = PEDS_FLASH_NUM*2 + 1; (void)me->m_timeout.disarm(); me->m_flashCtr != 0U --me->m_flashCtr; (me->m_flashCtr & 1U) == 0U BSP_signalPeds(PEDS_DONT_WALK); else BSP_signalPeds(PEDS_BLANK); else BSP_showState("offline"); me->m_timeout.postEvery(me, OFF_FLASH_TOUT); me->m_flashCtr = 0U; (void)me->m_timeout.disarm(); me->m_flashCtr ^= 1U; (me->m_flashCtr & 1U) == 0U BSP_signalCars(CARS_RED); BSP_signalPeds(PEDS_DONT_WALK); else BSP_signalCars(CARS_BLANK); BSP_signalPeds(PEDS_BLANK); BSP_terminate(0); #ifndef pelican_h #define pelican_h namespace PELICAN { enum PelicanSignals { PEDS_WAITING_SIG = QP::Q_USER_SIG, TERMINATE_SIG, MAX_PUB_SIG, // the last published signal ON_SIG, OFF_SIG, TIMEOUT_SIG, MAX_SIG // keep always last }; // active objects .................................................. $declare(components::AO_Pelican) // opaque pointer to Pelican AO } // namespace PELICAN #endif // pelican_h #include "qp_port.h" #include "bsp.h" #include "pelican.h" namespace PELICAN { Q_DEFINE_THIS_FILE enum PelicanTimeouts { // various timeouts in ticks CARS_GREEN_MIN_TOUT = BSP_TICKS_PER_SEC * 8, // min green for cars CARS_YELLOW_TOUT = BSP_TICKS_PER_SEC * 3, // yellow for cars PEDS_WALK_TOUT = BSP_TICKS_PER_SEC * 3, // walking time for peds PEDS_FLASH_TOUT = BSP_TICKS_PER_SEC / 5, // flashing timeout for peds PEDS_FLASH_NUM = 5*2, // number of flashes for peds OFF_FLASH_TOUT = BSP_TICKS_PER_SEC / 2 // flashing timeout when off }; // Pelican class ------------------------------------------------------------- $declare(components::Pelican) // Local objects ------------------------------------------------------------- static Pelican l_Pelican; // the single instance of Pelican active object // Global objects ------------------------------------------------------------ QP::QActive * const AO_Pelican = &l_Pelican; // the opaque pointer // Pelican class definition -------------------------------------------------- $define(components::Pelican) } // namespace PELICAN