?? pelican.c
字號:
/****************************************************************************** PELICAN crossing example* Last Updated for Version: 1.5.00* Date of the Last Update: Sep 17, 2006** Copyright (C) 2002-2006 Quantum Leaps, LLC. All rights reserved.** This software may be distributed and modified under the terms of the GNU* General Public License version 2 (GPL) as published by the Free Software* Foundation and appearing in the file GPL.TXT included in the packaging of* this file. Please note that GPL Section 2[b] requires that all works based* on this software must also be made publicly available under the terms of* the GPL ("Copyleft").** Alternatively, this software may be distributed and modified under the* terms of Quantum Leaps commercial licenses, which expressly allow the* licensees to retain the proprietary status of their code. The licensees* who use this software under one of Quantum Leaps commercial licenses do* not use this software under the GPL and therefore are not subject to any* of its terms.** Contact information:* Quantum Leaps Web site: http://www.quantum-leaps.com* Quantum Leaps licensing: http://www.quantum-leaps.com/licensing* Quantum Leaps products: http://www.quantum-leaps.com/products* e-mail: sales@quantum-leaps.com*****************************************************************************/#include "qpn_port.h"#include "bsp.h"#include "pelican.h"/* Pelican class -----------------------------------------------------------*/static QSTATE Pelican_initial(Pelican *me);static QSTATE Pelican_offline(Pelican *me);static QSTATE Pelican_offFlash(Pelican *me);static QSTATE Pelican_offPause(Pelican *me);static QSTATE Pelican_operational(Pelican *me);static QSTATE Pelican_carsEnabled(Pelican *me);static QSTATE Pelican_carsGreen(Pelican *me);static QSTATE Pelican_carsGreenNoPed(Pelican *me);static QSTATE Pelican_carsGreenPedWait(Pelican *me);static QSTATE Pelican_carsGreenInt(Pelican *me);static QSTATE Pelican_carsYellow(Pelican *me);static QSTATE Pelican_pedsEnabled(Pelican *me);static QSTATE Pelican_pedsWalk(Pelican *me);static QSTATE Pelican_pedsFlash(Pelican *me);/*--------------------------------------------------------------------------*/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 */};/*..........................................................................*/void Pelican_ctor(Pelican *me) { QActive_ctor(me, &Pelican_initial);}/* HSM definition ----------------------------------------------------------*/QSTATE Pelican_initial(Pelican *me) { switch (Q_SIG(me)) { case Q_TOP_INIT_SIG: { Q_TRAN(&Pelican_operational); return (QSTATE)0; } } return (QSTATE)&QHsm_top;}/*..........................................................................*/QSTATE Pelican_operational(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_signalCars(CARS_RED); BSP_signalPeds(PEDS_DONT_WALK); return (QSTATE)0; } case Q_INIT_SIG: { Q_INIT(&Pelican_carsEnabled); return (QSTATE)0; } case OFF_SIG: { Q_TRAN(&Pelican_offline); return (QSTATE)0; } } return (QSTATE)&QHsm_top;}/*..........................................................................*/QSTATE Pelican_carsEnabled(Pelican *me) { switch (Q_SIG(me)) { case Q_EXIT_SIG: { BSP_signalCars(CARS_RED); return (QSTATE)0; } case Q_INIT_SIG: { Q_INIT(&Pelican_carsGreen); return (QSTATE)0; } } return (QSTATE)&Pelican_operational;}/*..........................................................................*/QSTATE Pelican_carsGreen(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { QActive_arm((QActive *)me, CARS_GREEN_MIN_TOUT); BSP_signalCars(CARS_GREEN); return (QSTATE)0; } case Q_INIT_SIG: { Q_INIT(&Pelican_carsGreenNoPed); return (QSTATE)0; } case Q_TIMEOUT_SIG: { Q_TRAN(&Pelican_carsGreenInt); return (QSTATE)0; } } return (QSTATE)&Pelican_carsEnabled;}/*..........................................................................*/QSTATE Pelican_carsGreenNoPed(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "carsGreenNoPed"); return (QSTATE)0; } case PEDS_WAITING_SIG: { Q_TRAN(&Pelican_carsGreenPedWait); return (QSTATE)0; } } return (QSTATE)&Pelican_carsGreen;}/*..........................................................................*/QSTATE Pelican_carsGreenPedWait(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "carsGreenPedWait"); return (QSTATE)0; } case Q_TIMEOUT_SIG: { Q_TRAN(&Pelican_carsYellow); return (QSTATE)0; } } return (QSTATE)&Pelican_carsGreen;}/*..........................................................................*/QSTATE Pelican_carsGreenInt(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "carsGreenInt"); return (QSTATE)0; } case PEDS_WAITING_SIG: { Q_TRAN(&Pelican_carsYellow); return (QSTATE)0; } } return (QSTATE)&Pelican_carsEnabled;}/*..........................................................................*/QSTATE Pelican_carsYellow(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "carsYellow"); QActive_arm((QActive *)me, CARS_YELLOW_TOUT); BSP_signalCars(CARS_YELLOW); return (QSTATE)0; } case Q_TIMEOUT_SIG: { Q_TRAN(&Pelican_pedsEnabled); return (QSTATE)0; } } return (QSTATE)&Pelican_carsEnabled;}/*..........................................................................*/QSTATE Pelican_pedsEnabled(Pelican *me) { switch (Q_SIG(me)) { case Q_EXIT_SIG: { BSP_signalPeds(PEDS_DONT_WALK); return (QSTATE)0; } case Q_INIT_SIG: { Q_INIT(&Pelican_pedsWalk); return (QSTATE)0; } } return (QSTATE)&Pelican_operational;}/*..........................................................................*/QSTATE Pelican_pedsWalk(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "pedsWalk"); QActive_arm((QActive *)me, PEDS_WALK_TOUT); BSP_signalPeds(PEDS_WALK); return (QSTATE)0; } case Q_TIMEOUT_SIG: { Q_TRAN(&Pelican_pedsFlash); return (QSTATE)0; } } return (QSTATE)&Pelican_pedsEnabled;}/*..........................................................................*/QSTATE Pelican_pedsFlash(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "pedsWalk"); QActive_arm((QActive *)me, PEDS_FLASH_TOUT); me->pedFlashCtr__ = PEDS_FLASH_NUM*2 + 1; return (QSTATE)0; } case Q_TIMEOUT_SIG: { if (me->pedFlashCtr__ != 0) { /* still flashing? */ if ((me->pedFlashCtr__ & 1) == 0) { /* even counter? */ BSP_signalPeds(PEDS_DONT_WALK); } else { /* must be odd counter */ BSP_signalPeds(PEDS_BLANK); } --me->pedFlashCtr__; QActive_arm((QActive *)me, PEDS_FLASH_TOUT); } else { /* done flashing */ Q_TRAN(&Pelican_carsEnabled); } return (QSTATE)0; } } return (QSTATE)&Pelican_pedsEnabled;}/*..........................................................................*/QSTATE Pelican_offline(Pelican *me) { switch (Q_SIG(me)) { case Q_INIT_SIG: { Q_INIT(&Pelican_offFlash); return (QSTATE)0; } case ON_SIG: { Q_TRAN(&Pelican_operational); return (QSTATE)0; } } return (QSTATE)&QHsm_top;}/*..........................................................................*/QSTATE Pelican_offFlash(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "offFlash"); QActive_arm((QActive *)me, OFF_FLASH_TOUT); BSP_signalCars(CARS_YELLOW); BSP_signalPeds(PEDS_DONT_WALK); return (QSTATE)0; } case Q_TIMEOUT_SIG: { Q_TRAN(&Pelican_offPause); return (QSTATE)0; } } return (QSTATE)&Pelican_offline;}/*..........................................................................*/QSTATE Pelican_offPause(Pelican *me) { switch (Q_SIG(me)) { case Q_ENTRY_SIG: { BSP_showState(PELICAN_PRIO, "offPause"); QActive_arm((QActive *)me, OFF_FLASH_TOUT); BSP_signalCars(CARS_OFF); BSP_signalPeds(PEDS_BLANK); return (QSTATE)0; } case Q_TIMEOUT_SIG: { Q_TRAN(&Pelican_offFlash); return (QSTATE)0; } } return (QSTATE)&Pelican_offline;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -