Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
network.cpp
00001 ////////////////////////////////////////////////////////////////////////////// 00002 // Model: Network.qm 00003 // File: ./network.cpp 00004 // 00005 // This file has been generated automatically by QP Modeler (QM). 00006 // DO NOT EDIT THIS FILE MANUALLY. 00007 // 00008 // Please visit www.state-machine.com/qm for more information. 00009 ////////////////////////////////////////////////////////////////////////////// 00010 #include "qp_port.h" 00011 #include "bsp.h" 00012 #include "network.h" 00013 00014 Q_DEFINE_THIS_FILE 00015 00016 enum PelicanTimeouts { // various timeouts in ticks 00017 CARS_GREEN_MIN_TOUT = BSP_TICKS_PER_SEC * 8, // min green for cars 00018 CARS_YELLOW_TOUT = BSP_TICKS_PER_SEC * 3, // yellow for cars 00019 PEDS_WALK_TOUT = BSP_TICKS_PER_SEC * 3, // walking time for peds 00020 PEDS_FLASH_TOUT = BSP_TICKS_PER_SEC / 5, // flashing timeout for peds 00021 PEDS_FLASH_NUM = 5*2, // number of flashes for peds 00022 OFF_FLASH_TOUT = BSP_TICKS_PER_SEC / 2 // flashing timeout when off 00023 }; 00024 00025 enum SenseTimeouts { // various timeouts in ticks 00026 SENSE1_N1_TOUT = BSP_TICKS_PER_SEC * 3, 00027 TOGGLE_TOUT = BSP_TICKS_PER_SEC/5 00028 }; 00029 00030 enum PollTimeouts { // various timeouts in ticks 00031 POLL_TOUT = BSP_TICKS_PER_SEC /10, // poll wait 00032 }; 00033 00034 // Pelican class ------------------------------------------------------------- 00035 // $(components::Pelican) .................................................... 00036 class Pelican : public QActive { 00037 private: 00038 QTimeEvt m_timeout; 00039 uint8_t m_flashCtr; 00040 00041 public: 00042 Pelican() : QActive((QStateHandler)&Pelican::initial), m_timeout(TIMEOUT_SIG) { 00043 } 00044 00045 protected: 00046 static QState initial(Pelican *me, QEvent const *e); 00047 static QState operational(Pelican *me, QEvent const *e); 00048 static QState carsEnabled(Pelican *me, QEvent const *e); 00049 static QState carsGreen(Pelican *me, QEvent const *e); 00050 static QState carsGreenNoPed(Pelican *me, QEvent const *e); 00051 static QState carsGreenInt(Pelican *me, QEvent const *e); 00052 static QState carsGreenPedWait(Pelican *me, QEvent const *e); 00053 static QState carsYellow(Pelican *me, QEvent const *e); 00054 static QState pedsEnabled(Pelican *me, QEvent const *e); 00055 static QState pedsWalk(Pelican *me, QEvent const *e); 00056 static QState pedsFlash(Pelican *me, QEvent const *e); 00057 static QState offline(Pelican *me, QEvent const *e); 00058 }; 00059 // $(components::Sense1_N1) .................................................. 00060 class Sense1_N1 : public QActive { 00061 private: 00062 QTimeEvt m_timeout; 00063 00064 public: 00065 Sense1_N1(); 00066 00067 protected: 00068 static QState initial(Sense1_N1 *me, QEvent const *e); 00069 static QState disconnected(Sense1_N1 *me, QEvent const *e); 00070 static QState connected(Sense1_N1 *me, QEvent const *e); 00071 static QState toggle_sense(Sense1_N1 *me, QEvent const *e); 00072 static QState detect_down(Sense1_N1 *me, QEvent const *e); 00073 }; 00074 // $(components::Poll) ....................................................... 00075 class Poll : public QActive { 00076 private: 00077 QTimeEvt m_timeout; 00078 00079 public: 00080 Poll(); 00081 00082 protected: 00083 static QState initial(Poll *me, QEvent const *e); 00084 static QState poll(Poll *me, QEvent const *e); 00085 }; 00086 00087 // Local objects ------------------------------------------------------------- 00088 static Pelican l_Pelican; // the single instance of Pelican active object 00089 static Sense1_N1 l_Sense1_N1; // the single instance of Pelican active 00090 static Poll l_Poll; // the single instance of Poll 00091 00092 00093 // Global objects ------------------------------------------------------------ 00094 QActive * const AO_Pelican = &l_Pelican; // the opaque pointer 00095 QActive * const AO_Sense1_N1 = &l_Sense1_N1; // the opaque pointer 00096 QActive * const AO_Poll = &l_Poll; // the opaque pointer 00097 00098 // Pelican class definition -------------------------------------------------- 00099 // $(components::Pelican) .................................................... 00100 00101 // $(components::Pelican::Statechart) ........................................ 00102 // @(/1/0/3/0) 00103 QState Pelican::initial(Pelican *me, QEvent const *e) { 00104 me->subscribe(PEDS_WAITING_SIG); 00105 00106 QS_OBJ_DICTIONARY(&l_Pelican); 00107 QS_OBJ_DICTIONARY(&l_Pelican.m_timeout); 00108 00109 QS_FUN_DICTIONARY(&QHsm::top); 00110 QS_FUN_DICTIONARY(&Pelican::initial); 00111 QS_FUN_DICTIONARY(&Pelican::offline); 00112 QS_FUN_DICTIONARY(&Pelican::operational); 00113 QS_FUN_DICTIONARY(&Pelican::carsEnabled); 00114 QS_FUN_DICTIONARY(&Pelican::carsGreen); 00115 QS_FUN_DICTIONARY(&Pelican::carsGreenNoPed); 00116 QS_FUN_DICTIONARY(&Pelican::carsGreenPedWait); 00117 QS_FUN_DICTIONARY(&Pelican::carsGreenInt); 00118 QS_FUN_DICTIONARY(&Pelican::carsYellow); 00119 QS_FUN_DICTIONARY(&Pelican::pedsEnabled); 00120 QS_FUN_DICTIONARY(&Pelican::pedsWalk); 00121 QS_FUN_DICTIONARY(&Pelican::pedsFlash); 00122 00123 QS_SIG_DICTIONARY(PEDS_WAITING_SIG, 0); // global signals 00124 QS_SIG_DICTIONARY(ON_SIG, 0); 00125 QS_SIG_DICTIONARY(OFF_SIG, 0); 00126 00127 QS_SIG_DICTIONARY(TIMEOUT_SIG, &l_Pelican); // just for Pelican 00128 return Q_TRAN(&Pelican::operational); 00129 } 00130 // $(components::Pelican::Statechart::operational) ........................... 00131 QState Pelican::operational(Pelican *me, QEvent const *e) { 00132 switch (e->sig) { 00133 // @(/1/0/3/1) 00134 case Q_ENTRY_SIG: { 00135 BSP_signalCars(CARS_RED); 00136 BSP_signalPeds(PEDS_DONT_WALK); 00137 return Q_HANDLED(); 00138 } 00139 // @(/1/0/3/1/0) 00140 case Q_INIT_SIG: { 00141 return Q_TRAN(&Pelican::carsEnabled); 00142 } 00143 // @(/1/0/3/1/1) 00144 case OFF_SIG: { 00145 return Q_TRAN(&Pelican::offline); 00146 } 00147 } 00148 return Q_SUPER(&QHsm::top); 00149 } 00150 // $(components::Pelican::Statechart::operational::carsEnabled) .............. 00151 QState Pelican::carsEnabled(Pelican *me, QEvent const *e) { 00152 switch (e->sig) { 00153 // @(/1/0/3/1/2) 00154 case Q_EXIT_SIG: { 00155 BSP_signalCars(CARS_RED); 00156 return Q_HANDLED(); 00157 } 00158 // @(/1/0/3/1/2/0) 00159 case Q_INIT_SIG: { 00160 return Q_TRAN(&Pelican::carsGreen); 00161 } 00162 } 00163 return Q_SUPER(&Pelican::operational); 00164 } 00165 // $(components::Pelican::Statechart::operational::carsEnabled::carsGreen) ... 00166 QState Pelican::carsGreen(Pelican *me, QEvent const *e) { 00167 switch (e->sig) { 00168 // @(/1/0/3/1/2/1) 00169 case Q_ENTRY_SIG: { 00170 BSP_signalCars(CARS_GREEN); 00171 me->m_timeout.postIn(me, CARS_GREEN_MIN_TOUT); 00172 return Q_HANDLED(); 00173 } 00174 // @(/1/0/3/1/2/1) 00175 case Q_EXIT_SIG: { 00176 me->m_timeout.disarm(); 00177 return Q_HANDLED(); 00178 } 00179 // @(/1/0/3/1/2/1/0) 00180 case Q_INIT_SIG: { 00181 return Q_TRAN(&Pelican::carsGreenNoPed); 00182 } 00183 } 00184 return Q_SUPER(&Pelican::carsEnabled); 00185 } 00186 // $(components::Pelican::Statechart::operational::carsEnabled::carsGreen::carsGreenNoPed) 00187 QState Pelican::carsGreenNoPed(Pelican *me, QEvent const *e) { 00188 switch (e->sig) { 00189 // @(/1/0/3/1/2/1/1) 00190 case Q_ENTRY_SIG: { 00191 BSP_showState("carsGreenNoPed"); 00192 return Q_HANDLED(); 00193 } 00194 // @(/1/0/3/1/2/1/1/0) 00195 case PEDS_WAITING_SIG: { 00196 return Q_TRAN(&Pelican::carsGreenPedWait); 00197 } 00198 // @(/1/0/3/1/2/1/1/1) 00199 case TIMEOUT_SIG: { 00200 return Q_TRAN(&Pelican::carsGreenInt); 00201 } 00202 } 00203 return Q_SUPER(&Pelican::carsGreen); 00204 } 00205 // $(components::Pelican::Statechart::operational::carsEnabled::carsGreen::carsGreenInt) 00206 QState Pelican::carsGreenInt(Pelican *me, QEvent const *e) { 00207 switch (e->sig) { 00208 // @(/1/0/3/1/2/1/2) 00209 case Q_ENTRY_SIG: { 00210 BSP_showState("carsGreenInt"); 00211 return Q_HANDLED(); 00212 } 00213 // @(/1/0/3/1/2/1/2/0) 00214 case PEDS_WAITING_SIG: { 00215 return Q_TRAN(&Pelican::carsYellow); 00216 } 00217 } 00218 return Q_SUPER(&Pelican::carsGreen); 00219 } 00220 // $(components::Pelican::Statechart::operational::carsEnabled::carsGreen::carsGreenPedWait) 00221 QState Pelican::carsGreenPedWait(Pelican *me, QEvent const *e) { 00222 switch (e->sig) { 00223 // @(/1/0/3/1/2/1/3) 00224 case Q_ENTRY_SIG: { 00225 BSP_showState("carsGreenPedWait"); 00226 return Q_HANDLED(); 00227 } 00228 // @(/1/0/3/1/2/1/3/0) 00229 case TIMEOUT_SIG: { 00230 return Q_TRAN(&Pelican::carsYellow); 00231 } 00232 } 00233 return Q_SUPER(&Pelican::carsGreen); 00234 } 00235 // $(components::Pelican::Statechart::operational::carsEnabled::carsYellow) .. 00236 QState Pelican::carsYellow(Pelican *me, QEvent const *e) { 00237 switch (e->sig) { 00238 // @(/1/0/3/1/2/2) 00239 case Q_ENTRY_SIG: { 00240 BSP_showState("carsYellow"); 00241 BSP_signalCars(CARS_YELLOW); 00242 me->m_timeout.postIn(me, CARS_YELLOW_TOUT); 00243 return Q_HANDLED(); 00244 } 00245 // @(/1/0/3/1/2/2) 00246 case Q_EXIT_SIG: { 00247 me->m_timeout.disarm(); 00248 return Q_HANDLED(); 00249 } 00250 // @(/1/0/3/1/2/2/0) 00251 case TIMEOUT_SIG: { 00252 return Q_TRAN(&Pelican::pedsEnabled); 00253 } 00254 } 00255 return Q_SUPER(&Pelican::carsEnabled); 00256 } 00257 // $(components::Pelican::Statechart::operational::pedsEnabled) .............. 00258 QState Pelican::pedsEnabled(Pelican *me, QEvent const *e) { 00259 switch (e->sig) { 00260 // @(/1/0/3/1/3) 00261 case Q_EXIT_SIG: { 00262 BSP_signalPeds(PEDS_DONT_WALK); 00263 return Q_HANDLED(); 00264 } 00265 // @(/1/0/3/1/3/0) 00266 case Q_INIT_SIG: { 00267 return Q_TRAN(&Pelican::pedsWalk); 00268 } 00269 } 00270 return Q_SUPER(&Pelican::operational); 00271 } 00272 // $(components::Pelican::Statechart::operational::pedsEnabled::pedsWalk) .... 00273 QState Pelican::pedsWalk(Pelican *me, QEvent const *e) { 00274 switch (e->sig) { 00275 // @(/1/0/3/1/3/1) 00276 case Q_ENTRY_SIG: { 00277 BSP_showState("pedsWalk"); 00278 BSP_signalPeds(PEDS_WALK); 00279 me->m_timeout.postIn(me, PEDS_WALK_TOUT); 00280 return Q_HANDLED(); 00281 } 00282 // @(/1/0/3/1/3/1) 00283 case Q_EXIT_SIG: { 00284 me->m_timeout.disarm(); 00285 return Q_HANDLED(); 00286 } 00287 // @(/1/0/3/1/3/1/0) 00288 case TIMEOUT_SIG: { 00289 return Q_TRAN(&Pelican::pedsFlash); 00290 } 00291 } 00292 return Q_SUPER(&Pelican::pedsEnabled); 00293 } 00294 // $(components::Pelican::Statechart::operational::pedsEnabled::pedsFlash) ... 00295 QState Pelican::pedsFlash(Pelican *me, QEvent const *e) { 00296 switch (e->sig) { 00297 // @(/1/0/3/1/3/2) 00298 case Q_ENTRY_SIG: { 00299 BSP_showState("pedsFlash"); 00300 me->m_timeout.postEvery(me, PEDS_FLASH_TOUT); 00301 me->m_flashCtr = PEDS_FLASH_NUM*2 + 1; 00302 return Q_HANDLED(); 00303 } 00304 // @(/1/0/3/1/3/2) 00305 case Q_EXIT_SIG: { 00306 me->m_timeout.disarm(); 00307 return Q_HANDLED(); 00308 } 00309 // @(/1/0/3/1/3/2/0) 00310 case TIMEOUT_SIG: { 00311 // @(/1/0/3/1/3/2/0/0) 00312 if (me->m_flashCtr != 0) { 00313 --me->m_flashCtr; 00314 // @(/1/0/3/1/3/2/0/0/0) 00315 if ((me->m_flashCtr & 1) == 0) { 00316 BSP_signalPeds(PEDS_DONT_WALK); 00317 return Q_HANDLED(); 00318 } 00319 // @(/1/0/3/1/3/2/0/0/1) 00320 else { 00321 BSP_signalPeds(PEDS_BLANK); 00322 return Q_HANDLED(); 00323 } 00324 } 00325 // @(/1/0/3/1/3/2/0/1) 00326 else { 00327 return Q_TRAN(&Pelican::carsEnabled); 00328 } 00329 } 00330 } 00331 return Q_SUPER(&Pelican::pedsEnabled); 00332 } 00333 // $(components::Pelican::Statechart::offline) ............................... 00334 QState Pelican::offline(Pelican *me, QEvent const *e) { 00335 switch (e->sig) { 00336 // @(/1/0/3/2) 00337 case Q_ENTRY_SIG: { 00338 BSP_showState("offline"); 00339 me->m_timeout.postEvery(me, OFF_FLASH_TOUT); 00340 me->m_flashCtr = 0; 00341 return Q_HANDLED(); 00342 } 00343 // @(/1/0/3/2) 00344 case Q_EXIT_SIG: { 00345 me->m_timeout.disarm(); 00346 return Q_HANDLED(); 00347 } 00348 // @(/1/0/3/2/0) 00349 case TIMEOUT_SIG: { 00350 me->m_flashCtr ^= 1; 00351 // @(/1/0/3/2/0/0) 00352 if ((me->m_flashCtr & 1) == 0) { 00353 BSP_signalCars(CARS_RED); 00354 BSP_signalPeds(PEDS_DONT_WALK); 00355 return Q_HANDLED(); 00356 } 00357 // @(/1/0/3/2/0/1) 00358 else { 00359 BSP_signalCars(CARS_BLANK); 00360 BSP_signalPeds(PEDS_BLANK); 00361 return Q_HANDLED(); 00362 } 00363 } 00364 // @(/1/0/3/2/1) 00365 case ON_SIG: { 00366 return Q_TRAN(&Pelican::operational); 00367 } 00368 } 00369 return Q_SUPER(&QHsm::top); 00370 } 00371 00372 // $(components::Sense1_N1) .................................................. 00373 // $(components::Sense1_N1::Sense1_N1) ....................................... 00374 Sense1_N1::Sense1_N1() : QActive((QStateHandler)&Sense1_N1::initial), m_timeout(TIMEOUT_SIG) { 00375 } 00376 // $(components::Sense1_N1::Statechart) ...................................... 00377 // @(/1/2/2/0) 00378 QState Sense1_N1::initial(Sense1_N1 *me, QEvent const *e) { 00379 me->subscribe(SENSE1_N1_UP_SIG); 00380 me->subscribe(SENSE1_N1_DOWN_SIG); 00381 me->subscribe(SENSE_N1_SIG); 00382 00383 QS_OBJ_DICTIONARY(&l_Sense1_N1); 00384 QS_OBJ_DICTIONARY(&l_Sense1_N1.m_timeout); 00385 00386 QS_FUN_DICTIONARY(&QHsm::top); 00387 QS_FUN_DICTIONARY(&Sense1_N1::initial); 00388 QS_FUN_DICTIONARY(&Sense1_N1::disconnected); 00389 QS_FUN_DICTIONARY(&Sense1_N1::connected); 00390 QS_FUN_DICTIONARY(&Sense1_N1::toggle_sense); 00391 QS_FUN_DICTIONARY(&Sense1_N1::detect_down); 00392 00393 QS_SIG_DICTIONARY(SENSE1_N1_UP_SIG, 0); // global signals 00394 QS_SIG_DICTIONARY(SENSE1_N1_DOWN_SIG,0); 00395 QS_SIG_DICTIONARY(SENSE_N1_SIG,0); 00396 00397 QS_SIG_DICTIONARY(TIMEOUT_SIG, &l_Sense1_N1); // just for Sense1_N1 00398 return Q_TRAN(&Sense1_N1::disconnected); 00399 } 00400 // $(components::Sense1_N1::Statechart::disconnected) ........................ 00401 QState Sense1_N1::disconnected(Sense1_N1 *me, QEvent const *e) { 00402 switch (e->sig) { 00403 // @(/1/2/2/1) 00404 case Q_ENTRY_SIG: { 00405 BSP_signalSense(SENSE_1_DIS); 00406 return Q_HANDLED(); 00407 } 00408 // @(/1/2/2/1/0) 00409 case SENSE1_N1_UP_SIG: { 00410 return Q_TRAN(&Sense1_N1::connected); 00411 } 00412 } 00413 return Q_SUPER(&QHsm::top); 00414 } 00415 // $(components::Sense1_N1::Statechart::connected) ........................... 00416 QState Sense1_N1::connected(Sense1_N1 *me, QEvent const *e) { 00417 switch (e->sig) { 00418 // @(/1/2/2/2) 00419 case Q_ENTRY_SIG: { 00420 BSP_signalSense(SENSE_1_CON); 00421 return Q_HANDLED(); 00422 } 00423 // @(/1/2/2/2/0) 00424 case SENSE1_N1_DOWN_SIG: { 00425 return Q_TRAN(&Sense1_N1::disconnected); 00426 } 00427 // @(/1/2/2/2/1) 00428 case SENSE_N1_SIG: { 00429 return Q_TRAN(&Sense1_N1::toggle_sense); 00430 } 00431 } 00432 return Q_SUPER(&QHsm::top); 00433 } 00434 // $(components::Sense1_N1::Statechart::toggle_sense) ........................ 00435 QState Sense1_N1::toggle_sense(Sense1_N1 *me, QEvent const *e) { 00436 switch (e->sig) { 00437 // @(/1/2/2/3) 00438 case Q_ENTRY_SIG: { 00439 me->m_timeout.postIn(me, TOGGLE_TOUT); 00440 return Q_HANDLED(); 00441 } 00442 // @(/1/2/2/3) 00443 case Q_EXIT_SIG: { 00444 me->m_timeout.disarm(); 00445 return Q_HANDLED(); 00446 } 00447 // @(/1/2/2/3/0) 00448 case TIMEOUT_SIG: { 00449 return Q_TRAN(&Sense1_N1::connected); 00450 } 00451 // @(/1/2/2/3/1) 00452 case SENSE1_N1_DOWN_SIG: { 00453 return Q_TRAN(&Sense1_N1::detect_down); 00454 } 00455 } 00456 return Q_SUPER(&QHsm::top); 00457 } 00458 // $(components::Sense1_N1::Statechart::detect_down) ......................... 00459 QState Sense1_N1::detect_down(Sense1_N1 *me, QEvent const *e) { 00460 switch (e->sig) { 00461 // @(/1/2/2/4) 00462 case Q_ENTRY_SIG: { 00463 me->m_timeout.postIn(me, TOGGLE_TOUT); 00464 return Q_HANDLED(); 00465 } 00466 // @(/1/2/2/4) 00467 case Q_EXIT_SIG: { 00468 me->m_timeout.disarm(); 00469 return Q_HANDLED(); 00470 } 00471 // @(/1/2/2/4/0) 00472 case TIMEOUT_SIG: { 00473 return Q_TRAN(&Sense1_N1::disconnected); 00474 } 00475 // @(/1/2/2/4/1) 00476 case SENSE1_N1_UP_SIG: { 00477 return Q_TRAN(&Sense1_N1::connected); 00478 } 00479 } 00480 return Q_SUPER(&QHsm::top); 00481 } 00482 00483 // $(components::Poll) ....................................................... 00484 // $(components::Poll::Poll) ................................................. 00485 Poll::Poll() : QActive((QStateHandler)&Poll::initial), m_timeout(TIMEOUT_SIG) { 00486 } 00487 // $(components::Poll::Statechart) ........................................... 00488 // @(/1/1/2/0) 00489 QState Poll::initial(Poll *me, QEvent const *e) { 00490 QS_OBJ_DICTIONARY(&l_Poll); 00491 QS_OBJ_DICTIONARY(&l_Poll.m_timeout); 00492 00493 00494 QS_FUN_DICTIONARY(&QHsm::top); 00495 QS_FUN_DICTIONARY(&Poll::initial); 00496 QS_FUN_DICTIONARY(&Poll::poll); 00497 00498 00499 QS_SIG_DICTIONARY(TIMEOUT_SIG, &l_Poll); // just for Ped 00500 00501 me->m_timeout.postEvery(me, POLL_TOUT); 00502 00503 return Q_TRAN(&Poll::poll); 00504 } 00505 // $(components::Poll::Statechart::poll) ..................................... 00506 QState Poll::poll(Poll *me, QEvent const *e) { 00507 switch (e->sig) { 00508 // @(/1/1/2/1) 00509 case Q_EXIT_SIG: { 00510 BSP_chk_io(); 00511 return Q_HANDLED(); 00512 } 00513 // @(/1/1/2/1/0) 00514 case TIMEOUT_SIG: { 00515 return Q_TRAN(&Poll::poll); 00516 } 00517 } 00518 return Q_SUPER(&QHsm::top); 00519 } 00520
Generated on Tue Aug 2 2022 11:35:56 by
1.7.2