QP/C
qfsm_dis.c
Go to the documentation of this file.
00001 /*****************************************************************************
00002 * Product: QEP/C
00003 * Last Updated for Version: 4.4.00
00004 * Date of the Last Update:  Jan 21, 2012
00005 *
00006 *                    Q u a n t u m     L e a P s
00007 *                    ---------------------------
00008 *                    innovating embedded systems
00009 *
00010 * Copyright (C) 2002-2011 Quantum Leaps, LLC. All rights reserved.
00011 *
00012 * This software may be distributed and modified under the terms of the GNU
00013 * General Public License version 2 (GPL) as published by the Free Software
00014 * Foundation and appearing in the file GPL.TXT included in the packaging of
00015 * this file. Please note that GPL Section 2[b] requires that all works based
00016 * on this software must also be made publicly available under the terms of
00017 * the GPL ("Copyleft").
00018 *
00019 * Alternatively, this software may be distributed and modified under the
00020 * terms of Quantum Leaps commercial licenses, which expressly supersede
00021 * the GPL and are specifically designed for licensees interested in
00022 * retaining the proprietary status of their code.
00023 *
00024 * Contact information:
00025 * Quantum Leaps Web site:  http://www.quantum-leaps.com
00026 * e-mail:                  info@quantum-leaps.com
00027 *****************************************************************************/
00028 #include "qep_pkg.h"
00029 
00036 /*..........................................................................*/
00037 void QFsm_dispatch(QFsm *me, QEvent const *e) {
00038     QStateHandler s = me->state;                  /* save the current state */
00039     QS_CRIT_STAT_
00040     QState r = (*s)(me, e);                       /* call the event handler */
00041 
00042     if (r == Q_RET_TRAN) {                             /* transition taken? */
00043 
00044         QS_BEGIN_(QS_QEP_TRAN, QS_smObj_, me)
00045             QS_TIME_();                                       /* time stamp */
00046             QS_SIG_(e->sig);                     /* the signal of the event */
00047             QS_OBJ_(me);                       /* this state machine object */
00048             QS_FUN_(s);                     /* the source of the transition */
00049             QS_FUN_(me->state);                     /* the new active state */
00050         QS_END_()
00051 
00052         (void)QEP_TRIG_(s, Q_EXIT_SIG);                  /* exit the source */
00053         (void)QEP_TRIG_(me->state, Q_ENTRY_SIG);        /* enter the target */
00054     }
00055     else {                                          /* transition not taken */
00056 #ifdef Q_SPY
00057         if (r == Q_RET_HANDLED) {
00058 
00059             QS_BEGIN_(QS_QEP_INTERN_TRAN, QS_smObj_, me)
00060                 QS_TIME_();                                   /* time stamp */
00061                 QS_SIG_(e->sig);                 /* the signal of the event */
00062                 QS_OBJ_(me);                   /* this state machine object */
00063                 QS_FUN_(s);             /* the state that handled the event */
00064             QS_END_()
00065         }
00066         else {
00067 
00068             QS_BEGIN_(QS_QEP_IGNORED, QS_smObj_, me)
00069                 QS_TIME_();                                   /* time stamp */
00070                 QS_SIG_(e->sig);                 /* the signal of the event */
00071                 QS_OBJ_(me);                   /* this state machine object */
00072                 QS_FUN_(me->state);                    /* the current state */
00073             QS_END_()
00074 
00075         }
00076 #endif
00077     }
00078 }