Tom Larkworthy / Mbed 2 deprecated MeshNetwork

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers network.cpp Source File

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