//............................................................................ QState Mine1::initial(Mine1 *me, QEvent const *) { static uint8_t dict_sent; if (!dict_sent) { QS_OBJ_DICTIONARY(&l_mine1[0]); // obj. dictionaries for Mine1 pool QS_OBJ_DICTIONARY(&l_mine1[1]); QS_OBJ_DICTIONARY(&l_mine1[2]); QS_OBJ_DICTIONARY(&l_mine1[3]); QS_OBJ_DICTIONARY(&l_mine1[4]); QS_FUN_DICTIONARY(&Mine1::initial); // fun. dictionaries for Mine1 HSM QS_FUN_DICTIONARY(&Mine1::unused); QS_FUN_DICTIONARY(&Mine1::used); QS_FUN_DICTIONARY(&Mine1::planted); QS_FUN_DICTIONARY(&Mine1::exploding); dict_sent = 1; } QS_SIG_DICTIONARY(MINE_PLANT_SIG, me); // local signals QS_SIG_DICTIONARY(MINE_DISABLED_SIG, me); QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, me); QS_SIG_DICTIONARY(SHIP_IMG_SIG, me); QS_SIG_DICTIONARY(MISSILE_IMG_SIG, me); return Q_TRAN(&Mine1::unused); }
/* @(/2/0/2/0) */ QState Philo_initial(Philo *me, QEvent const *e) { static uint8_t registered; /* starts off with 0, per C-standard */ (void)e; /* suppress the compiler warning about unused parameter */ if (!registered) { QS_OBJ_DICTIONARY(&l_philo[0]); QS_OBJ_DICTIONARY(&l_philo[0].timeEvt); QS_OBJ_DICTIONARY(&l_philo[1]); QS_OBJ_DICTIONARY(&l_philo[1].timeEvt); QS_OBJ_DICTIONARY(&l_philo[2]); QS_OBJ_DICTIONARY(&l_philo[2].timeEvt); QS_OBJ_DICTIONARY(&l_philo[3]); QS_OBJ_DICTIONARY(&l_philo[3].timeEvt); QS_OBJ_DICTIONARY(&l_philo[4]); QS_OBJ_DICTIONARY(&l_philo[4].timeEvt); QS_FUN_DICTIONARY(&Philo_initial); QS_FUN_DICTIONARY(&Philo_thinking); QS_FUN_DICTIONARY(&Philo_hungry); QS_FUN_DICTIONARY(&Philo_eating); registered = (uint8_t)1; } QS_SIG_DICTIONARY(HUNGRY_SIG, me); /* signal for each Philos */ QS_SIG_DICTIONARY(TIMEOUT_SIG, me); /* signal for each Philos */ QActive_subscribe(&me->super, EAT_SIG); return Q_TRAN(&Philo_thinking); }
/*..........................................................................*/ QState Mine2_initial(Mine2 *me, QEvt const *e) { static uint8_t dict_sent; (void)e; /* avoid the "unreferenced parameter" warning */ if (!dict_sent) { QS_OBJ_DICTIONARY(&l_mine2[0]); /* obj. dictionaries for Mine2 pool */ QS_OBJ_DICTIONARY(&l_mine2[1]); QS_OBJ_DICTIONARY(&l_mine2[2]); QS_OBJ_DICTIONARY(&l_mine2[3]); QS_OBJ_DICTIONARY(&l_mine2[4]); QS_FUN_DICTIONARY(&Mine2_initial);/*fun. dictionaries for Mine2 HSM */ QS_FUN_DICTIONARY(&Mine2_unused); QS_FUN_DICTIONARY(&Mine2_used); QS_FUN_DICTIONARY(&Mine2_planted); QS_FUN_DICTIONARY(&Mine2_exploding); dict_sent = 1; } QS_SIG_DICTIONARY(MINE_PLANT_SIG, me); /* local signals */ QS_SIG_DICTIONARY(MINE_DISABLED_SIG, me); QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, me); QS_SIG_DICTIONARY(SHIP_IMG_SIG, me); QS_SIG_DICTIONARY(MISSILE_IMG_SIG, me); return Q_TRAN(&Mine2_unused); }
//${AOs::Philo::SM} .......................................................... Q_STATE_DEF(Philo, initial) { //${AOs::Philo::SM::initial} static bool registered = false; // starts off with 0, per C-standard (void)e; // suppress the compiler warning about unused parameter subscribe(EAT_SIG); subscribe(TEST_SIG); if (!registered) { registered = true; QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); QS_FUN_DICTIONARY(&initial); QS_FUN_DICTIONARY(&thinking); QS_FUN_DICTIONARY(&hungry); QS_FUN_DICTIONARY(&eating); } QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal for each Philos QS_SIG_DICTIONARY(TIMEOUT_SIG, this); // signal for each Philos return tran(&thinking); }
//............................................................................ void BSP_init(void) { // set the system clock as specified in lm3s_config.h (20MHz from PLL) SystemInit(); // enable clock to the peripherals used by the application SYSCTL->RCGC2 |= 1U | (1U << 2); // enable clock to GPIOA & C __NOP(); // wait after enabling clocks __NOP(); __NOP(); // configure the LED and push button GPIOC->DIR |= USER_LED; // set direction: output GPIOC->DEN |= USER_LED; // digital enable GPIOC->DATA_Bits[USER_LED] = 0U; // turn the User LED off GPIOC->DIR &= ~PUSH_BUTTON; // set direction: input GPIOC->DEN |= PUSH_BUTTON; // digital enable Display96x16x1Init(1U); // initialize the OLED display Display96x16x1StringDraw(&"Dining Philos"[0], 0U, 0U); Display96x16x1StringDraw(&"0 ,1 ,2 ,3 ,4"[0], 0U, 1U); Q_ALLEGE(QS_INIT(static_cast<void *>(0))); QS_OBJ_DICTIONARY(&l_SysTick_Handler); QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); QS_USR_DICTIONARY(PHILO_STAT); }
//............................................................................ QState Philo::initial(Philo *me, QEvt const *) { static uint8_t registered; // starts off with 0, per C-standard if (!registered) { QS_OBJ_DICTIONARY(&l_philo[0]); QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[1]); QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[2]); QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[3]); QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[4]); QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); QS_FUN_DICTIONARY(&Philo::initial); QS_FUN_DICTIONARY(&Philo::thinking); QS_FUN_DICTIONARY(&Philo::hungry); QS_FUN_DICTIONARY(&Philo::eating); registered = (uint8_t)1; } QS_SIG_DICTIONARY(HUNGRY_SIG, me); // signal for each Philos QS_SIG_DICTIONARY(TIMEOUT_SIG, me); // signal for each Philos me->subscribe(EAT_SIG); return Q_TRAN(&Philo::thinking); }
// @(/3/0/2) ................................................................. // @(/3/0/2/0) QP::QState Philo::initial(Philo * const me, QP::QEvt const * const e) { static QP::QActionHandler const act_[] = { Q_ACTION_CAST(&Philo::thinking_e), Q_ACTION_CAST(0) }; static bool registered = false; // starts off with 0, per C-standard (void)e; // suppress the compiler warning about unused parameter if (!registered) { registered = true; QS_OBJ_DICTIONARY(&l_philo[0]); QS_OBJ_DICTIONARY(&l_philo[0].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[1]); QS_OBJ_DICTIONARY(&l_philo[1].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[2]); QS_OBJ_DICTIONARY(&l_philo[2].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[3]); QS_OBJ_DICTIONARY(&l_philo[3].m_timeEvt); QS_OBJ_DICTIONARY(&l_philo[4]); QS_OBJ_DICTIONARY(&l_philo[4].m_timeEvt); QS_FUN_DICTIONARY(&Philo::initial); QS_FUN_DICTIONARY(&Philo::thinking); QS_FUN_DICTIONARY(&Philo::hungry); QS_FUN_DICTIONARY(&Philo::eating); } QS_SIG_DICTIONARY(HUNGRY_SIG, me); // signal for each Philos QS_SIG_DICTIONARY(TIMEOUT_SIG, me); // signal for each Philos me->subscribe(EAT_SIG); return QM_INITIAL(&Philo::thinking_s, act_); }
/* BSP functions ===========================================================*/ void BSP_init(void) { /* NOTE: SystemInit() has been already called from the startup code * but SystemCoreClock needs to be updated */ SystemCoreClockUpdate(); /* enable GPIOA clock for the LED */ RCC->AHBENR |= (1U << 0); /* configure LED (PA.5) pin as push-pull outputs, No pull-up, pull-down */ GPIOA->MODER &= ~((3U << 2*5)); GPIOA->MODER |= ((1U << 2*5)); GPIOA->OTYPER &= ~((1U << 5)); GPIOA->OSPEEDR &= ~((3U << 2*5)); GPIOA->OSPEEDR |= ((1U << 2*5)); GPIOA->PUPDR &= ~((3U << 2*5)); /* enable GPIOC clock for the Button */ RCC->AHBENR |= (1ul << 2); /* configure BTN (PC.13) pin as push-pull outputs, No pull-up, pull-down */ GPIOC->MODER &= ~(3ul << 2*13); GPIOC->OSPEEDR &= ~(3ul << 2*13); GPIOC->OSPEEDR |= (1ul << 2*13); GPIOC->PUPDR &= ~(3ul << 2*13); BSP_randomSeed(1234U); if (QS_INIT((void *)0) == 0U) { /* initialize the QS software tracing */ Q_ERROR(); } QS_OBJ_DICTIONARY(&l_tickHook); QS_OBJ_DICTIONARY(&l_EXTI0_IRQHandler); }
/* @(/2/4/3/0) */ static QState Mine2_initial(Mine2 * const me, QEvt const * const e) { static uint8_t dict_sent; if (!dict_sent) { /* object dictionaries for Mine2 pool... */ QS_OBJ_DICTIONARY(&l_mine2[0]); QS_OBJ_DICTIONARY(&l_mine2[1]); QS_OBJ_DICTIONARY(&l_mine2[2]); QS_OBJ_DICTIONARY(&l_mine2[3]); QS_OBJ_DICTIONARY(&l_mine2[4]); /*function dictionaries for Mine2 HSM... */ QS_FUN_DICTIONARY(&Mine2_initial); QS_FUN_DICTIONARY(&Mine2_unused); QS_FUN_DICTIONARY(&Mine2_used); QS_FUN_DICTIONARY(&Mine2_planted); QS_FUN_DICTIONARY(&Mine2_exploding); dict_sent = 1U; } /* local signals... */ QS_SIG_DICTIONARY(MINE_PLANT_SIG, me); QS_SIG_DICTIONARY(MINE_DISABLED_SIG, me); QS_SIG_DICTIONARY(MINE_RECYCLE_SIG, me); QS_SIG_DICTIONARY(SHIP_IMG_SIG, me); QS_SIG_DICTIONARY(MISSILE_IMG_SIG, me); (void)e; /* avoid the "unreferenced parameter" warning */ return QM_INITIAL(&Mine2_unused_s, &QMsm_emptyAction_[0]); }
/*..........................................................................*/ int main(int argc, char *argv[]) { UI_ctor(); /* instantiate the UI Active Object */ BSP_init(argc, argv); /* initialize the Board Support Package */ QF_init(); /* initialize the framework and the underlying RT kernel */ /* initialize the event pools... */ QF_poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); // QF_poolInit(l_medPoolSto, sizeof(l_medPoolSto), sizeof(l_medPoolSto[0])); QF_psInit(l_subscrSto, Q_DIM(l_subscrSto)); /* init publish-subscribe */ /* setup the QS filters... */ /* send object dictionaries for event queues... */ QS_OBJ_DICTIONARY(l_uiQueueSto); /* send object dictionaries for event pools... */ QS_OBJ_DICTIONARY(l_smlPoolSto); // QS_OBJ_DICTIONARY(l_medPoolSto); /* send signal dictionaries for globally published events... */ QS_SIG_DICTIONARY(QUIT_SIG, 0); /* start the active objects... */ QActive_start(AO_UI, 1, /* priority */ l_uiQueueSto, Q_DIM(l_uiQueueSto), /* evt queue */ (void *)0, 0, /* no per-thread stack */ (QEvt *)0); /* no initialization event */ return QF_run(); /* run the QF application */ }
/*..........................................................................*/ void BSP_init(void) { /* Set up system clocks, see manual 8.2.1 * 12MHz clock * I Clk = 96 MHz * B Clk = 24 MHz * P Clock = 48 MHz */ SYSTEM.SCKCR.LONG = ((0UL << 24) | (2UL << 16) | (1UL << 8)); /* init LEDs (GPIOs and LED states to OFF) */ PORTD.DDR.BYTE = 0xFF; PORTE.DDR.BYTE |= 0x0F; PORTD.DR.BYTE = 0xFF; /* initialize all LEDs to OFF state */ PORTE.DR.BYTE |= 0x0F; /* initialize all LEDs to OFF state */ /* Init buttons as GPIO inputs * Config GPIO Port 4 as input for reading buttons * Not needed after POR because this is the default value... */ PORT4.DDR.BYTE = 0; if (QS_INIT((void *)0) == 0) { /* initialize the QS software tracing */ Q_ERROR(); } QS_OBJ_DICTIONARY(&QS_Excep_CMTU0_CMT0); QS_OBJ_DICTIONARY(&QS_Excep_IRQ8); QS_OBJ_DICTIONARY(&QS_Excep_IRQ9); QS_OBJ_DICTIONARY(&QS_Excep_IRQ10); }
/* BSP functions ===========================================================*/ void BSP_init(void) { /* NOTE: SystemInit() has been already called from the startup code * but SystemCoreClock needs to be updated */ SystemCoreClockUpdate(); /* turn the GPIO clock on */ LPC_SC->PCONP |= (1U << 15); /* setup the GPIO pin functions for the LEDs... */ LPC_PINCON->PINSEL3 &= ~(3U << 4); /* LED_1: function P1.18 to GPIO */ LPC_PINCON->PINSEL3 &= ~(3U << 8); /* LED_2: function P1.20 to GPIO */ LPC_PINCON->PINSEL3 &= ~(3U << 10); /* LED_3: function P1.21 to GPIO */ LPC_PINCON->PINSEL3 &= ~(3U << 14); /* LED_4: function P1.23 to GPIO */ /* Set GPIO-P1 LED pins to output */ LPC_GPIO1->FIODIR |= (LED_1 | LED_2 | LED_3 | LED_4); /* setup the GPIO pin function for the Button... */ LPC_PINCON->PINSEL0 &= ~(3U << 12); /* function P0.6 to GPIO, pull-up */ /* Set GPIO-P0 Button pin as input */ LPC_GPIO0->FIODIR &= ~BTN_EXT; BSP_randomSeed(1234U); if (QS_INIT((void *)0) == 0U) { /* initialize the QS software tracing */ Q_ERROR(); } QS_OBJ_DICTIONARY(&l_SysTick_Handler); QS_OBJ_DICTIONARY(&l_EINT0_IRQHandler); QS_USR_DICTIONARY(PHILO_STAT); }
/*--------------------------------------------------------------------------*/ void BSP_init(void) { RCONbits.SWDTEN = 0; /* disable Watchdog */ LATA = 0xFF00; /* set LEDs (D3-D10/RA0-RA7) drive state low */ TRISA = 0xFF00; /* set LED pins (D3-D10/RA0-RA7) as outputs */ if (QS_INIT((void *)0) == 0) { /* initialize the QS software tracing */ Q_ERROR(); } QS_OBJ_DICTIONARY(&l_T2Interrupt); QS_OBJ_DICTIONARY(&l_INT0Interrupt); }
/*..........................................................................*/ QState LwIPMgr_initial(LwIPMgr *me, QEvent const *e) { uint8_t macaddr[NETIF_MAX_HWADDR_LEN]; (void)e; /* suppress the compiler warning about unused parameter */ /* Configure the hardware MAC address for the Ethernet Controller */ /* * Set up the MAC address and make sure it's not all FF values * TODO: This will evetually be read somewhere */ /* the MAC address must have been programmed! */ Q_ASSERT((STATIC_IPADDR0 != 0xFF) && (STATIC_IPADDR1 != 0xFF) && (STATIC_IPADDR2 != 0xFF) && (STATIC_IPADDR3 != 0xFF)); macaddr[0] = DEF_MAC_ADDR0; macaddr[1] = DEF_MAC_ADDR1; macaddr[2] = DEF_MAC_ADDR2; macaddr[3] = DEF_MAC_ADDR3; macaddr[4] = DEF_MAC_ADDR4; macaddr[5] = DEF_MAC_ADDR5; /* initialize the Ethernet Driver */ me->netif = eth_driver_init((QActive *)me, macaddr); me->ip_addr = 0xFFFFFFFF; /* initialize to impossible value */ /* initialize the lwIP applications... */ httpd_init(); /* initialize the simple HTTP-Deamon (web server) */ http_set_ssi_handler(&ssi_handler, ssi_tags, Q_DIM(ssi_tags)); http_set_cgi_handlers(cgi_handlers, Q_DIM(cgi_handlers)); me->upcb = udp_new(); udp_bind(me->upcb, IP_ADDR_ANY, 777); /* use port 777 for UDP */ udp_recv(me->upcb, &udp_rx_handler, me); QS_OBJ_DICTIONARY(&l_lwIPMgr); QS_OBJ_DICTIONARY(&l_lwIPMgr.te_LWIP_SLOW_TICK); QS_FUN_DICTIONARY(&QHsm_top); QS_FUN_DICTIONARY(&LwIPMgr_initial); QS_FUN_DICTIONARY(&LwIPMgr_running); QS_SIG_DICTIONARY(SEND_UDP_SIG, (QActive *)me); QS_SIG_DICTIONARY(LWIP_SLOW_TICK_SIG, (QActive *)me); QS_SIG_DICTIONARY(LWIP_RX_READY_SIG, (QActive *)me); QS_SIG_DICTIONARY(LWIP_TX_READY_SIG, (QActive *)me); QS_SIG_DICTIONARY(LWIP_RX_OVERRUN_SIG,(QActive *)me); return Q_TRAN(&LwIPMgr_running); }
//............................................................................ void BSP_init(void) { SystemInit(); // initialize the clocking system GPIOInit(); // initialize GPIO (sets up clock) GPIOSetDir(LED_PORT, LED_BIT, 1); // set port for LED to output if (QS_INIT((void *)0) == 0) { // initialize the QS software tracing Q_ERROR(); } QS_OBJ_DICTIONARY(&l_SysTick_Handler); QS_OBJ_DICTIONARY(&l_GPIOPortA_IRQHandler); }
/*..........................................................................*/ void BSP_init(void) { SystemInit(); /* initialize the clocking system */ GPIOInit(); /* initialize GPIO (sets up clock) */ GPIOSetDir(LED_PORT, LED_BIT, 1); /* set port for LED to output */ if (QS_INIT((void *)0) == 0) { /* initialize the QS software tracing */ Q_ERROR(); } QS_RESET(); QS_OBJ_DICTIONARY(&l_SysTick_Handler); QS_OBJ_DICTIONARY(&l_PIOINT0_IRQHandler); }
/*..........................................................................*/ void main(int argc, char *argv[]) { /* explicitly invoke the active objects' ctors... */ Missile_ctor(); Ship_ctor(); Tunnel_ctor(); BSP_init(argc, argv); /* initialize the Board Support Package */ QF_init(); /* initialize the framework and the underlying RT kernel */ /* initialize the event pools... */ QF_poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0])); QF_poolInit(l_medPoolSto, sizeof(l_medPoolSto), sizeof(l_medPoolSto[0])); QF_psInit(l_subscrSto, Q_DIM(l_subscrSto)); /* init publish-subscribe */ /* send object dictionaries for event queues... */ QS_OBJ_DICTIONARY(l_missileQueueSto); QS_OBJ_DICTIONARY(l_shipQueueSto); QS_OBJ_DICTIONARY(l_tunnelQueueSto); /* send object dictionaries for event pools... */ QS_OBJ_DICTIONARY(l_smlPoolSto); QS_OBJ_DICTIONARY(l_medPoolSto); /* send signal dictionaries for globally published events... */ QS_SIG_DICTIONARY(TIME_TICK_SIG, 0); QS_SIG_DICTIONARY(PLAYER_TRIGGER_SIG, 0); QS_SIG_DICTIONARY(PLAYER_QUIT_SIG, 0); QS_SIG_DICTIONARY(GAME_OVER_SIG, 0); /* start the active objects... */ QActive_start(AO_Missile, 1, /* priority */ l_missileQueueSto, Q_DIM(l_missileQueueSto), /* evt queue */ (void *)0, 0, /* no per-thread stack */ (QEvent *)0); /* no initialization event */ QActive_start(AO_Ship, 2, /* priority */ l_shipQueueSto, Q_DIM(l_shipQueueSto), /* evt queue */ (void *)0, 0, /* no per-thread stack */ (QEvent *)0); /* no initialization event */ QActive_start(AO_Tunnel, 3, /* priority */ l_tunnelQueueSto, Q_DIM(l_tunnelQueueSto), /* evt queue */ (void *)0, 0, /* no per-thread stack */ (QEvent *)0); /* no initialization event */ QF_run(); /* run the QF application */ }
//............................................................................ int main() { static QP::QEvt const * missileQueueSto[2]; static QP::QEvt const * shipQueueSto[3]; static QP::QEvt const * tunnelQueueSto[GAME_MINES_MAX + 5]; static QF_MPOOL_EL(QP::QEvt) smlPoolSto[10]; static QF_MPOOL_EL(GAME::ObjectImageEvt) medPoolSto[2*GAME_MINES_MAX +10]; static QP::QSubscrList subscrSto[GAME::MAX_PUB_SIG]; QP::QF::init(); // initialize the framework and the underlying RT kernel GAME::BSP_init(); // initialize the Board Support Package // initialize the event pools... QP::QF::poolInit(smlPoolSto, sizeof(smlPoolSto), sizeof(smlPoolSto[0])); QP::QF::poolInit(medPoolSto, sizeof(medPoolSto), sizeof(medPoolSto[0])); // init publish-subscribe QP::QF::psInit(subscrSto, Q_DIM(subscrSto)); // send object dictionaries for event queues... QS_OBJ_DICTIONARY(missileQueueSto); QS_OBJ_DICTIONARY(shipQueueSto); QS_OBJ_DICTIONARY(tunnelQueueSto); // send object dictionaries for event pools... QS_OBJ_DICTIONARY(smlPoolSto); QS_OBJ_DICTIONARY(medPoolSto); // send signal dictionaries for globally published events... QS_SIG_DICTIONARY(GAME::TIME_TICK_SIG, static_cast<void *>(0)); QS_SIG_DICTIONARY(GAME::PLAYER_TRIGGER_SIG, static_cast<void *>(0)); QS_SIG_DICTIONARY(GAME::PLAYER_QUIT_SIG, static_cast<void *>(0)); QS_SIG_DICTIONARY(GAME::GAME_OVER_SIG, static_cast<void *>(0)); // start the active objects... GAME::AO_Tunnel ->start(1U, // priority tunnelQueueSto, Q_DIM(tunnelQueueSto), // evt queue static_cast<void *>(0), 0U); // no per-thread stack GAME::AO_Ship ->start(2U, // priority shipQueueSto, Q_DIM(shipQueueSto), // evt queue static_cast<void *>(0), 0U); // no per-thread stack GAME::AO_Missile->start(3U, // priority missileQueueSto, Q_DIM(missileQueueSto), // evt queue static_cast<void *>(0), 0U); // no per-thread stack return QP::QF::run(); // run the QF application }
/*..........................................................................*/ void BSP_init(void) { SystemInit(); /* initialize STM32 system (clock, PLL and Flash) */ /* initialize LEDs on Olimex P207 eval board */ omxEval_led_init(); /* initialize LCD on Olimex P207 eval board */ InitLcd(); /* initialize RS-232 serial port on Olimex P207 eval board */ omxEval_rs232_init(); /* initialize LEDs, Key Button, and LCD on STM322XX-EVAL board */ // alu: TODO BSP_ButtonAndLED_Init(); /* initialize the Serial for printfs to the serial port */ // alu: TODO BSP_USART_Init(); /* initialize the EXTI Line0 interrupt used for testing */ // alu: TODO BSP_EXTI_Init(); /* initialize the ETH GPIO */ ETH_GPIO_Config(); /* initialize the ETH MACDMA */ ETH_MACDMA_Config(); QS_OBJ_DICTIONARY(&l_SysTick_Handler); }
/*${AOs::Ship::SM} .........................................................*/ static QState Ship_initial(Ship * const me, QEvt const * const e) { static struct { QMState const *target; QActionHandler act[2]; } const tatbl_ = { /* transition-action table */ &Ship_active_s, /* target state */ { Q_ACTION_CAST(&Ship_active_i), /* init.tran. */ Q_ACTION_CAST(0) /* zero terminator */ } }; /* ${AOs::Ship::SM::initial} */ (void)e; /* avoid the compiler warning 'usused parameter' */ QActive_subscribe((QActive *)me, TIME_TICK_SIG); QActive_subscribe((QActive *)me, PLAYER_TRIGGER_SIG); /* object dictionaries... */ QS_OBJ_DICTIONARY(&l_ship); /* function dictionaries for Ship HSM... */ QS_FUN_DICTIONARY(&Ship_initial); QS_FUN_DICTIONARY(&Ship_active); QS_FUN_DICTIONARY(&Ship_parked); QS_FUN_DICTIONARY(&Ship_flying); QS_FUN_DICTIONARY(&Ship_exploding); /* local signals... */ QS_SIG_DICTIONARY(PLAYER_SHIP_MOVE_SIG, &l_ship); QS_SIG_DICTIONARY(TAKE_OFF_SIG, &l_ship); QS_SIG_DICTIONARY(HIT_WALL_SIG, &l_ship); QS_SIG_DICTIONARY(HIT_MINE_SIG, &l_ship); QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, &l_ship); return QM_TRAN_INIT(&tatbl_); }
//${AOs::Table::SM} .......................................................... Q_STATE_DEF(Table, initial) { //${AOs::Table::SM::initial} (void)e; // suppress the compiler warning about unused parameter QS_OBJ_DICTIONARY(&l_table); QS_FUN_DICTIONARY(&QP::QHsm::top); QS_FUN_DICTIONARY(&Table::initial); QS_FUN_DICTIONARY(&Table::active); QS_FUN_DICTIONARY(&Table::serving); QS_FUN_DICTIONARY(&Table::paused); QS_SIG_DICTIONARY(DONE_SIG, (void *)0); // global signals QS_SIG_DICTIONARY(EAT_SIG, (void *)0); QS_SIG_DICTIONARY(PAUSE_SIG, (void *)0); QS_SIG_DICTIONARY(TERMINATE_SIG, (void *)0); QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal just for Table subscribe(DONE_SIG); subscribe(PAUSE_SIG); subscribe(TERMINATE_SIG); for (uint8_t n = 0U; n < N_PHILO; ++n) { m_fork[n] = FREE; m_isHungry[n] = false; BSP_displayPhilStat(n, THINKING); } QS_FUN_DICTIONARY(&active); QS_FUN_DICTIONARY(&serving); QS_FUN_DICTIONARY(&paused); return tran(&serving); }
//............................................................................ void BSP_init(void) { // set the system clock as specified in lm3s_config.h (20MHz from PLL) SystemInit(); // enable clock to the peripherals used by the application SYSCTL->RCGC2 |= (1 << 0) | (1 << 2); // enable clock to GPIOA & C __NOP(); // wait after enabling clocks __NOP(); __NOP(); // configure the LED and push button GPIOC->DIR |= USER_LED; // set direction: output GPIOC->DEN |= USER_LED; // digital enable GPIOC->DATA_Bits[USER_LED] = 0; // turn the User LED off GPIOC->DIR &= ~PUSH_BUTTON; // set direction: input GPIOC->DEN |= PUSH_BUTTON; // digital enable Display96x16x1Init(1); // initialize the OLED display Display96x16x1StringDraw("Dining Philos", 0, 0); Display96x16x1StringDraw("0 ,1 ,2 ,3 ,4", 0, 1); if (QS_INIT((void *)0) == 0) { // initialize the QS software tracing Q_ERROR(); } QS_OBJ_DICTIONARY(&l_SysTick_Handler); }
/*..........................................................................*/ void QF_run(void) { struct sched_param sparam; struct timeval timeout = { 0 }; /* timeout for select() */ QF_onStartup(); /* invoke startup callback */ /* try to maximize the priority of the ticker thread, see NOTE01 */ sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &sparam) == 0) { /* success, this application has sufficient privileges */ } else { /* setting priority failed, probably due to insufficient privieges */ } QS_OBJ_DICTIONARY(&l_ticker); /* the QS dictionary for the ticker */ l_running = (uint8_t)1; while (l_running) { QF_TICK(&l_ticker); /* process a time tick */ timeout.tv_usec = 8000; select(0, 0, 0, 0, &timeout); /* sleep for the full tick , NOTE05 */ } QF_onCleanup(); /* invoke cleanup callback */ pthread_mutex_destroy(&QF_pThreadMutex_); }
/*..........................................................................*/ void BSP_init(void) { uint32_t i; for (i = 0; i < Q_DIM(l_led); ++i) { /* initialize the LEDs... */ AT91C_BASE_PIOA->PIO_PER = l_led[i]; /* enable pin */ AT91C_BASE_PIOA->PIO_OER = l_led[i]; /* configure as output pin */ LED_OFF(i); /* extinguish the LED */ } /* configure Advanced Interrupt Controller (AIC) of AT91... */ AT91C_BASE_AIC->AIC_IDCR = ~0; /* disable all interrupts */ AT91C_BASE_AIC->AIC_ICCR = ~0; /* clear all interrupts */ for (i = 0; i < 8; ++i) { AT91C_BASE_AIC->AIC_EOICR = 0; /* write AIC_EOICR 8 times */ } /* set the desired ticking rate for the PIT... */ i = (MCK / 16 / BSP_TICKS_PER_SEC) - 1; AT91C_BASE_PITC->PITC_PIMR = (AT91C_PITC_PITEN | AT91C_PITC_PITIEN | i); if (QS_INIT((void *)0) == 0) { /* initialize the QS software tracing */ Q_ERROR(); } QS_OBJ_DICTIONARY(&QS_tickIRQ); }
/*..........................................................................*/ void BSP_init(void) { WDTCTL = (WDTPW | WDTHOLD); /* Stop WDT */ /* configure the Basic Clock Module */ DCOCTL = CALDCO_8MHZ; /* Set DCO to 8MHz */ BCSCTL1 = CALBC1_8MHZ; TACTL = (ID_3 | TASSEL_2 | MC_1); /* SMCLK, /8 divider, upmode */ TACCR0 = (((BSP_SMCLK / 8) + BSP_TICKS_PER_SEC/2) / BSP_TICKS_PER_SEC); P1DIR |= (BIT0 | BIT1); /* P1.0 and P1.1 outputs (LEDs) */ P1DIR &= ~BIT2; /* P1.2 input (Switch TS1) */ P1REN |= BIT2; /* enable pull-up resistor on P1.2 */ P1SEL &= ~BIT2; /* enable I/O function on P1.2 */ P1IES |= BIT2; /* interrupt edge select high->low */ P1IFG &= ~BIT2; /* clear interrupt source */ BSP_randomSeed(1234U); if (QS_INIT((void *)0) == 0) { /* initialize the QS software tracing */ Q_ERROR(); } QS_RESET(); QS_OBJ_DICTIONARY(&l_timerA_ISR); }
/*..........................................................................*/ QState UI_num_handler(UI_num *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { /* send object dictionaries for UI objects */ QS_OBJ_DICTIONARY(&me->num_entry); /* instantiate the state-local objects */ NumEntry_ctor(&me->num_entry); /* take the initial transition in the component */ QHsm_init((QHsm *)&me->num_entry, (QEvt *)0); return Q_HANDLED(); } case Q_EXIT_SIG: { me->super.history = QHsm_state((QHsm const *)me);/*save history */ /* destroy the state-local objects... */ NumEntry_xtor(&me->num_entry); return Q_HANDLED(); } case Q_INIT_SIG: { return Q_TRAN(&UI_num_sd_handler); } case HELP_SIG: { return Q_TRAN(&UI_help_handler); /* Help screen */ } } return Q_SUPER(&UI_top_handler); }
/* BSP functions ===========================================================*/ void BSP_init(void) { /* NOTE: SystemInit() has been already called from the startup code * but SystemCoreClock needs to be updated */ SystemCoreClockUpdate(); /* enable GPIOA clock port for the LED LD2 */ RCC->AHBENR |= (1U << 0); /* configure LED (PA.5) pin as push-pull output, no pull-up, pull-down */ GPIOA->MODER &= ~((3U << 2*5)); GPIOA->MODER |= ((1U << 2*5)); GPIOA->OTYPER &= ~((1U << 5)); GPIOA->OSPEEDR &= ~((3U << 2*5)); GPIOA->OSPEEDR |= ((1U << 2*5)); GPIOA->PUPDR &= ~((3U << 2*5)); /* enable GPIOC clock port for the Button B1 */ RCC->AHBENR |= (1U << 2); /* configure Button (PC.13) pins as input, no pull-up, pull-down */ GPIOC->MODER &= ~(3U << 2*13); GPIOC->OSPEEDR &= ~(3U << 2*13); GPIOC->OSPEEDR |= (1U << 2*13); GPIOC->PUPDR &= ~(3U << 2*13); BSP_randomSeed(1234U); /* seed the random number generator */ /* initialize the QS software tracing... */ if (QS_INIT((void *)0) == 0U) { Q_ERROR(); } QS_OBJ_DICTIONARY(&l_SysTick_Handler); }
//${AOs::Table::SM} .......................................................... QP::QState Table::initial(Table * const me, QP::QEvt const * const e) { // ${AOs::Table::SM::initial} (void)e; // suppress the compiler warning about unused parameter QS_OBJ_DICTIONARY(&l_table); QS_FUN_DICTIONARY(&QP::QHsm::top); QS_FUN_DICTIONARY(&Table::initial); QS_FUN_DICTIONARY(&Table::active); QS_FUN_DICTIONARY(&Table::serving); QS_FUN_DICTIONARY(&Table::paused); QS_SIG_DICTIONARY(DONE_SIG, (void *)0); // global signals QS_SIG_DICTIONARY(EAT_SIG, (void *)0); QS_SIG_DICTIONARY(PAUSE_SIG, (void *)0); QS_SIG_DICTIONARY(SERVE_SIG, (void *)0); QS_SIG_DICTIONARY(TERMINATE_SIG, (void *)0); QS_SIG_DICTIONARY(HUNGRY_SIG, me); // signal just for Table me->subscribe(DONE_SIG); me->subscribe(PAUSE_SIG); me->subscribe(SERVE_SIG); me->subscribe(TERMINATE_SIG); for (uint8_t n = 0U; n < N_PHILO; ++n) { me->m_fork[n] = FREE; me->m_isHungry[n] = false; BSP::displayPhilStat(n, THINKING); } return Q_TRAN(&serving); }
//............................................................................ void BSP_init(void) { Q_ALLEGE(QS_INIT((void *)0)); QS_RESET(); QS_OBJ_DICTIONARY(&l_clock_tick); // must be called *after* QF_init() QS_USR_DICTIONARY(PHILO_STAT); }
/* HSM definition ----------------------------------------------------------*/ QState UI_top_initial(UI_top *me, QEvt const *e) { (void)e; /* avoid the compiler warning about unused parameter */ /* subscribe to events... */ QActive_subscribe((QActive *)me, QUIT_SIG); me->history = (QStateHandler)&UI_num_sd_handler; /* initialize history */ /* send object dictionaries for UI objects */ QS_OBJ_DICTIONARY(&l_ui); /* send function dictionaries for UI states... */ QS_FUN_DICTIONARY(&UI_top_handler); QS_FUN_DICTIONARY(&UI_top_final); QS_FUN_DICTIONARY(&UI_num_handler); QS_FUN_DICTIONARY(&UI_num_sd_handler); QS_FUN_DICTIONARY(&UI_num_lr_handler); QS_FUN_DICTIONARY(&UI_help_handler); /* send signal dictionaries for signals specific to UI... */ QS_SIG_DICTIONARY(C_SIG, me); QS_SIG_DICTIONARY(CE_SIG, me); QS_SIG_DICTIONARY(DIGIT_0_SIG, me); QS_SIG_DICTIONARY(DIGIT_1_9_SIG, me); QS_SIG_DICTIONARY(POINT_SIG, me); QS_SIG_DICTIONARY(NEG_SIG, me); QS_SIG_DICTIONARY(ENTER_SIG, me); QS_SIG_DICTIONARY(UP_SIG, me); QS_SIG_DICTIONARY(DOWN_SIG, me); QS_SIG_DICTIONARY(HELP_SIG, me); return Q_TRAN(&UI_num_handler); }