00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00028 #include "qep_pkg.h"
00029 #include "qassert.h"
00030
00031 Q_DEFINE_THIS_MODULE(qhsm_dis)
00032
00033
00034
00035
00036
00037
00038 void QHsm::dispatch(QEvent const *e) {
00039 QStateHandler path[QEP_MAX_NEST_DEPTH_];
00040 QStateHandler s;
00041 QStateHandler t;
00042 QState r;
00043 QS_INT_LOCK_KEY_
00044
00045 t = m_state;
00046
00047 do {
00048 s = m_state;
00049 r = (*s)(this, e);
00050 } while (r == Q_RET_SUPER);
00051
00052 if (r == Q_RET_TRAN) {
00053 #ifdef Q_SPY
00054 QStateHandler src = s;
00055 #endif
00056 int8_t ip = (int8_t)(-1);
00057 int8_t iq;
00058
00059 path[0] = m_state;
00060 path[1] = t;
00061
00062 while (t != s) {
00063 if (QEP_TRIG_(t, Q_EXIT_SIG) == Q_RET_HANDLED) {
00064 QS_BEGIN_(QS_QEP_STATE_EXIT, QS::smObj_, this)
00065 QS_OBJ_(this);
00066 QS_FUN_(t);
00067 QS_END_()
00068
00069 (void)QEP_TRIG_(t, QEP_EMPTY_SIG_);
00070 }
00071 t = m_state;
00072 }
00073
00074 t = path[0];
00075
00076 if (s == t) {
00077 QEP_EXIT_(s)
00078 ip = (int8_t)0;
00079 }
00080 else {
00081 (void)QEP_TRIG_(t, QEP_EMPTY_SIG_);
00082 t = m_state;
00083 if (s == t) {
00084 ip = (int8_t)0;
00085 }
00086 else {
00087 (void)QEP_TRIG_(s, QEP_EMPTY_SIG_);
00088
00089 if (m_state == t) {
00090 QEP_EXIT_(s)
00091 ip = (int8_t)0;
00092 }
00093 else {
00094
00095 if (m_state == path[0]) {
00096 QEP_EXIT_(s)
00097 }
00098 else {
00099
00100
00101 iq = (int8_t)0;
00102 ip = (int8_t)1;
00103 path[1] = t;
00104 t = m_state;
00105
00106 r = QEP_TRIG_(path[1], QEP_EMPTY_SIG_);
00107 while (r == Q_RET_SUPER) {
00108 path[++ip] = m_state;
00109 if (m_state == s) {
00110 iq = (int8_t)1;
00111
00112 Q_ASSERT(ip < (int8_t)QEP_MAX_NEST_DEPTH_);
00113 --ip;
00114 r = Q_RET_HANDLED;
00115 }
00116 else {
00117 r = QEP_TRIG_(m_state, QEP_EMPTY_SIG_);
00118 }
00119 }
00120 if (iq == (int8_t)0) {
00121
00122
00123 Q_ASSERT(ip < (int8_t)QEP_MAX_NEST_DEPTH_);
00124
00125 QEP_EXIT_(s)
00126
00127
00128
00129
00130 iq = ip;
00131 r = Q_RET_IGNORED;
00132 do {
00133 if (t == path[iq]) {
00134 r = Q_RET_HANDLED;
00135 ip = (int8_t)(iq - 1);
00136 iq = (int8_t)(-1);
00137 }
00138 else {
00139 --iq;
00140 }
00141 } while (iq >= (int8_t)0);
00142
00143 if (r != Q_RET_HANDLED) {
00144
00145
00146
00147 r = Q_RET_IGNORED;
00148 do {
00149
00150 if (QEP_TRIG_(t, Q_EXIT_SIG)
00151 == Q_RET_HANDLED)
00152 {
00153 QS_BEGIN_(QS_QEP_STATE_EXIT,
00154 QS::smObj_, this)
00155 QS_OBJ_(this);
00156 QS_FUN_(t);
00157 QS_END_()
00158
00159 (void)QEP_TRIG_(t, QEP_EMPTY_SIG_);
00160 }
00161 t = m_state;
00162 iq = ip;
00163 do {
00164 if (t == path[iq]) {
00165
00166 ip = (int8_t)(iq - 1);
00167 iq = (int8_t)(-1);
00168 r = Q_RET_HANDLED;
00169 }
00170 else {
00171 --iq;
00172 }
00173 } while (iq >= (int8_t)0);
00174 } while (r != Q_RET_HANDLED);
00175 }
00176 }
00177 }
00178 }
00179 }
00180 }
00181
00182 for (; ip >= (int8_t)0; --ip) {
00183 QEP_ENTER_(path[ip])
00184 }
00185 t = path[0];
00186 m_state = t;
00187
00188
00189 while (QEP_TRIG_(t, Q_INIT_SIG) == Q_RET_TRAN) {
00190
00191 QS_BEGIN_(QS_QEP_STATE_INIT, QS::smObj_, this)
00192 QS_OBJ_(this);
00193 QS_FUN_(t);
00194 QS_FUN_(m_state);
00195 QS_END_()
00196
00197 ip = (int8_t)0;
00198 path[0] = m_state;
00199 (void)QEP_TRIG_(m_state, QEP_EMPTY_SIG_);
00200 while (m_state != t) {
00201 path[++ip] = m_state;
00202 (void)QEP_TRIG_(m_state, QEP_EMPTY_SIG_);
00203 }
00204 m_state = path[0];
00205
00206 Q_ASSERT(ip < (int8_t)QEP_MAX_NEST_DEPTH_);
00207
00208 do {
00209 QEP_ENTER_(path[ip])
00210 } while ((--ip) >= (int8_t)0);
00211
00212 t = path[0];
00213 }
00214
00215 QS_BEGIN_(QS_QEP_TRAN, QS::smObj_, this)
00216 QS_TIME_();
00217 QS_SIG_(e->sig);
00218 QS_OBJ_(this);
00219 QS_FUN_(src);
00220 QS_FUN_(t);
00221 QS_END_()
00222
00223 }
00224 else {
00225 #ifdef Q_SPY
00226 if (r == Q_RET_IGNORED) {
00227
00228 QS_BEGIN_(QS_QEP_IGNORED, QS::smObj_, this)
00229 QS_TIME_();
00230 QS_SIG_(e->sig);
00231 QS_OBJ_(this);
00232 QS_FUN_(t);
00233 QS_END_()
00234
00235 }
00236 else {
00237
00238 QS_BEGIN_(QS_QEP_INTERN_TRAN, QS::smObj_, this)
00239 QS_TIME_();
00240 QS_SIG_(e->sig);
00241 QS_OBJ_(this);
00242 QS_FUN_(s);
00243 QS_END_()
00244
00245 }
00246 #endif
00247 }
00248 m_state = t;
00249 }