/* @(/2/1/4/0) */ static QState Ship_initial(Ship * const me, QEvt const * const e) { (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 Q_TRAN(&Ship_active); }
//............................................................................ QState Table::initial(Table *me, QEvt const *) { QS_OBJ_DICTIONARY(&l_table); QS_FUN_DICTIONARY(&QHsm::top); QS_FUN_DICTIONARY(&Table::initial); QS_FUN_DICTIONARY(&Table::serving); QS_SIG_DICTIONARY(DONE_SIG, 0); // global signals QS_SIG_DICTIONARY(EAT_SIG, 0); QS_SIG_DICTIONARY(PAUSE_SIG, 0); QS_SIG_DICTIONARY(HUNGRY_SIG, me); // signal just for Table GUI_Init(); // initialize the embedded GUI me->subscribe(DONE_SIG); me->subscribe(PAUSE_SIG); return Q_TRAN(&Table::ready); }
/*............................................................................ QSpy needs a dictionary of all static objects. Dictionary uses preprocessor macro to generate a name, so I can't just invoke each instance's dictionary publish method even if it exists. */ void declareQSDictionary() { uint8_t i; /* dictionary available in in this file: -------------------------------*/ QS_OBJ_DICTIONARY(l_smlPoolSto); QS_OBJ_DICTIONARY(&l_cloop[0]);/* All active objects in this app: */ QS_FUN_DICTIONARY(&QHsm_top); /* An HSM always has the top pseudo state */ /* global signals: */ QS_SIG_DICTIONARY(START, 0); QS_SIG_DICTIONARY(STOP, 0); /* dictionary available in other files: --------------------------------*/ CLoop_declareStaticQSDictionary(); /* The static dictionary */ for(i = 0; i < N_CLOOP; ++i) { /* Per instance dictionary */ CLoop_declareInstanceQSDictionary(&l_cloop[i]); } }
/* HSM definition ----------------------------------------------------------*/ QState NumEntry_initial(NumEntry *me, QEvt const *e) { (void)e; /* avoid the compiler warning about unused parameter */ /* send functions dictionaries for NumEntry states... */ QS_FUN_DICTIONARY(&NumEntry_top); QS_FUN_DICTIONARY(&NumEntry_negative); QS_FUN_DICTIONARY(&NumEntry_zero); QS_FUN_DICTIONARY(&NumEntry_integer); QS_FUN_DICTIONARY(&NumEntry_fraction); /* send signal dictionaries for signals specific to NumEntry... */ QS_SIG_DICTIONARY(C_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); return Q_TRAN(&NumEntry_zero); }
/*..........................................................................*/ QState LwIPMgr_initial(LwIPMgr *me, QEvt 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 */ macaddr[0] = MAC_ADDR0; macaddr[1] = MAC_ADDR1; macaddr[2] = MAC_ADDR2; macaddr[3] = MAC_ADDR3; macaddr[4] = MAC_ADDR4; macaddr[5] = MAC_ADDR5; /* initialize the Ethernet Driver */ me->netif = eth_driver_init((QActive *)me, macaddr); me->ip_addr = 0x00000000U; /* 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, 777U); /* 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_connecting); }
//............................................................................ int main(void) { BSP_init(); // 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, static_cast<void *>(0)); QS_SIG_DICTIONARY(PLAYER_TRIGGER_SIG, static_cast<void *>(0)); QS_SIG_DICTIONARY(PLAYER_QUIT_SIG, static_cast<void *>(0)); QS_SIG_DICTIONARY(GAME_OVER_SIG, static_cast<void *>(0)); // start the active objects... AO_Missile->start(1U, // priority l_missileQueueSto, Q_DIM(l_missileQueueSto),// evt queue static_cast<void *>(0), 0U); // no per-thread stack AO_Ship ->start(2U, // priority l_shipQueueSto, Q_DIM(l_shipQueueSto), // evt queue static_cast<void *>(0), 0U); // no per-thread stack AO_Tunnel ->start(3U, // priority l_tunnelQueueSto, Q_DIM(l_tunnelQueueSto), // evt queue static_cast<void *>(0), 0U); // no per-thread stack return QF::run(); // run the QF application }
//${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); }
//${AOs::Table::SM} .......................................................... QP::QState Table::initial(Table * const me, QP::QEvt const * const e) { static struct { QP::QMState const *target; QP::QActionHandler act[2]; } const tatbl_ = { // transition-action table &serving_s, { Q_ACTION_CAST(&serving_e), // entry Q_ACTION_CAST(0) // zero terminator } }; // ${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, me); // signal just for Table me->subscribe(DONE_SIG); me->subscribe(PAUSE_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 QM_TRAN_INIT(&tatbl_); }
/*${AOs::Philo::SM} ........................................................*/ static QState Philo_initial(Philo * const me, QEvt const * const e) { static struct { QMState const *target; QActionHandler act[2]; } const tatbl_ = { /* transition-action table */ &Philo_thinking_s, /* target state */ { Q_ACTION_CAST(&Philo_thinking_e), /* entry */ Q_ACTION_CAST(0) /* zero terminator */ } }; /* ${AOs::Philo::SM::initial} */ static uint8_t registered = (uint8_t)0; /* starts off with 0, per C-standard */ (void)e; /* suppress the compiler warning about unused parameter */ if (registered == (uint8_t)0) { registered = (uint8_t)1; 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); } 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 QM_TRAN_INIT(&tatbl_); }
//............................................................................ QState Table::initial(Table *me, QEvt const *) { QS_OBJ_DICTIONARY(&l_table); QS_FUN_DICTIONARY(&QHsm::top); QS_FUN_DICTIONARY(&Table::initial); QS_FUN_DICTIONARY(&Table::serving); QS_SIG_DICTIONARY(HUNGRY_SIG, me); // signal for Table me->subscribe(DONE_SIG); me->subscribe(TERMINATE_SIG); return Q_TRAN(&Table::serving); }
//${Comp::Philo::SM} ......................................................... Q_STATE_DEF(Philo, initial) { //${Comp::Philo::SM::initial} 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_FUN_DICTIONARY(&initial); QS_FUN_DICTIONARY(&thinking); QS_FUN_DICTIONARY(&hungry); QS_FUN_DICTIONARY(&eating); } QS_SIG_DICTIONARY(HUNGRY_SIG, this); // signal for each Philo return tran(&thinking); }
/*${AOs::Missile::SM} ......................................................*/ static QState Missile_initial(Missile * const me, QEvt const * const e) { static QMTranActTable const tatbl_ = { /* transition-action table */ &Missile_armed_s, { Q_ACTION_CAST(0) /* zero terminator */ } }; /* ${AOs::Missile::SM::initial} */ (void)e; QActive_subscribe((QActive *)me, TIME_TICK_SIG); QS_OBJ_DICTIONARY(&l_missile); /* object dictionary for Missile object */ QS_FUN_DICTIONARY(&Missile_initial); /* dictionaries for Missile HSM */ QS_FUN_DICTIONARY(&Missile_armed); QS_FUN_DICTIONARY(&Missile_flying); QS_FUN_DICTIONARY(&Missile_exploding); QS_SIG_DICTIONARY(MISSILE_FIRE_SIG, &l_missile); /* local signals */ QS_SIG_DICTIONARY(HIT_WALL_SIG, &l_missile); QS_SIG_DICTIONARY(DESTROYED_MINE_SIG, &l_missile); return QM_TRAN_INIT(&tatbl_); }
/*${AOs::Mine2::SM} ........................................................*/ static QState Mine2_initial(Mine2 * const me, QEvt const * const e) { static QMTranActTable const tatbl_ = { /* transition-action table */ &Mine2_unused_s, { Q_ACTION_CAST(0) /* zero terminator */ } }; /* ${AOs::Mine2::SM::initial} */ 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_TRAN_INIT(&tatbl_); }
/*..........................................................................*/ static QHsm *Entry_ctor(raid5_entry_t *rentry) { Entry *me; Entry *entry; /* allocate the memory */ me = entry = entry_alloc(); Q_ASSERT(me != NULL); QS_OBJ_DICTIONARY(entry); /* QS_OBJ_DICTIONARY(entry->x); */ QS_SIG_DICTIONARY(DIR_REQUEST_SIG, me); QS_SIG_DICTIONARY(DIR_UPDATE_SIG, me); QS_SIG_DICTIONARY(DIR_INSERT_SIG, me); /* adding free list */ list_add_tail(&me->entry, &rentry->free); /* call QHsm */ QHsm_ctor(&me->super, (QStateHandler)&Entry_initial); return &me->super; }
/*..........................................................................*/ QState Tunnel_initial(Tunnel *me, QEvt const *e) { uint8_t n; (void)e; /* avoid the "unreferenced parameter" warning */ for (n = 0; n < GAME_MINES_MAX; ++n) { QHsm_init(me->mine1_pool[n], (QEvt *)0);/*initial tran. for Mine1 */ QHsm_init(me->mine2_pool[n], (QEvt *)0);/*initial tran. for Mine2 */ } randomSeed(1234); /* seed the pseudo-random generator */ QActive_subscribe((QActive *)me, TIME_TICK_SIG); QActive_subscribe((QActive *)me, PLAYER_TRIGGER_SIG); QActive_subscribe((QActive *)me, PLAYER_QUIT_SIG); QS_OBJ_DICTIONARY(&l_tunnel); /* object dictionary for Tunnel object */ QS_OBJ_DICTIONARY(&l_tunnel.blinkTimeEvt); QS_OBJ_DICTIONARY(&l_tunnel.screenTimeEvt); QS_FUN_DICTIONARY(&Tunnel_initial); /* fun. dictionaries for Tunnel HSM */ QS_FUN_DICTIONARY(&Tunnel_final); QS_FUN_DICTIONARY(&Tunnel_active); QS_FUN_DICTIONARY(&Tunnel_playing); QS_FUN_DICTIONARY(&Tunnel_demo); QS_FUN_DICTIONARY(&Tunnel_game_over); QS_FUN_DICTIONARY(&Tunnel_screen_saver); QS_FUN_DICTIONARY(&Tunnel_screen_saver_hide); QS_FUN_DICTIONARY(&Tunnel_screen_saver_show); QS_SIG_DICTIONARY(BLINK_TIMEOUT_SIG, &l_tunnel); /* local signals */ QS_SIG_DICTIONARY(SCREEN_TIMEOUT_SIG, &l_tunnel); QS_SIG_DICTIONARY(SHIP_IMG_SIG, &l_tunnel); QS_SIG_DICTIONARY(MISSILE_IMG_SIG, &l_tunnel); QS_SIG_DICTIONARY(MINE_IMG_SIG, &l_tunnel); QS_SIG_DICTIONARY(MINE_DISABLED_SIG, &l_tunnel); QS_SIG_DICTIONARY(EXPLOSION_SIG, &l_tunnel); QS_SIG_DICTIONARY(SCORE_SIG, &l_tunnel); return Q_TRAN(&Tunnel_demo); }
//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$define${HSMs::QHsmTst} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${HSMs::QHsmTst} ........................................................... //${HSMs::QHsmTst::SM} ....................................................... Q_STATE_DEF(QHsmTst, initial) { //${HSMs::QHsmTst::SM::initial} (void)e; // avoid compiler warning m_foo = 0U; BSP_display("top-INIT;"); QS_SIG_DICTIONARY(A_SIG, this); QS_SIG_DICTIONARY(B_SIG, this); QS_SIG_DICTIONARY(C_SIG, this); QS_SIG_DICTIONARY(D_SIG, this); QS_SIG_DICTIONARY(E_SIG, this); QS_SIG_DICTIONARY(F_SIG, this); QS_SIG_DICTIONARY(G_SIG, this); QS_SIG_DICTIONARY(H_SIG, this); QS_SIG_DICTIONARY(I_SIG, this); QS_SIG_DICTIONARY(TERMINATE_SIG, this); QS_SIG_DICTIONARY(IGNORE_SIG, this); QS_FUN_DICTIONARY(&s); QS_FUN_DICTIONARY(&s1); QS_FUN_DICTIONARY(&s11); QS_FUN_DICTIONARY(&s2); QS_FUN_DICTIONARY(&s21); QS_FUN_DICTIONARY(&s211); return tran(&s2); }
/* @(/1/8/23/0) */ static QState QGprs_initial(QGprs * const me, QEvt const * const e) { /* 状态消息 */ QS_FUN_DICTIONARY(&QGprs_initialing); QS_FUN_DICTIONARY(&QGprs_initialing_stepinto); QS_FUN_DICTIONARY(&QGprs_polling); QS_FUN_DICTIONARY(&QGprs_startup); QS_FUN_DICTIONARY(&QGprs_power_on); QS_FUN_DICTIONARY(&QGprs_start_delay); QS_FUN_DICTIONARY(&QGprs_start_finished); QS_FUN_DICTIONARY(&QGprs_reseting); QS_FUN_DICTIONARY(&QGprs_initialing); QS_FUN_DICTIONARY(&QGprs_registering); QS_FUN_DICTIONARY(&QGprs_powerNormalMode); QS_FUN_DICTIONARY(&QGprs_connected); QS_FUN_DICTIONARY(&QGprs_TcpSending); QS_FUN_DICTIONARY(&QGprs_WaitFillData); QS_FUN_DICTIONARY(&QGprs_WaitRet); QS_FUN_DICTIONARY(&QGprs_Idle); QS_FUN_DICTIONARY(&QGprs_PhoneCalling); QS_FUN_DICTIONARY(&QGprs_SMSHandling); QS_FUN_DICTIONARY(&QGprs_connecting); QS_FUN_DICTIONARY(&QGprs_powerSaveMode); QS_FUN_DICTIONARY(&QGprs_sleepRequest); QS_FUN_DICTIONARY(&QGprs_sleep); QS_FUN_DICTIONARY(&QGprs_registering); QS_SIG_DICTIONARY(AT_OK_SIG, me); QS_SIG_DICTIONARY(AT_REGGED_SIG, me); QS_SIG_DICTIONARY(AT_PINREADY_SIG, me); QS_SIG_DICTIONARY(AT_NETREGGED_SIG, me); QS_SIG_DICTIONARY(AT_NETDISREG_SIG, me); QS_SIG_DICTIONARY(AT_CSQ_SIG, me); QS_SIG_DICTIONARY(AT_CONNECTED_SIG, me); QS_SIG_DICTIONARY(AT_DISCONNECTED_SIG, me); //QS_SIG_DICTIONARY(AT_DATAREADY_SIG, me); QS_SIG_DICTIONARY(AT_SENDREADY_SIG, me); QS_SIG_DICTIONARY(AT_SENDFILLDATA_SIG, me); QS_SIG_DICTIONARY(AT_ERROR_SIG, me); QS_SIG_DICTIONARY(AT_CMSERROR_SIG, me); QS_SIG_DICTIONARY(AT_CMEERROR_SIG, me); QS_SIG_DICTIONARY(AT_SENDERROR_SIG, me); QS_SIG_DICTIONARY(AT_FILLDATATIP_SIG, me); QS_SIG_DICTIONARY(AT_SENDOK_SIG, me); QS_SIG_DICTIONARY(GPRS_COMMINGMSG_SIG, me); /* AO内部消息 */ QS_SIG_DICTIONARY(Q_TIMEOUT_SIG, me); QS_SIG_DICTIONARY(GPRS_SENDREQ_SIG, me); //QS_SIG_DICTIONARY(GPRS_LED_TIMEOUT_SIG, me); //QS_SIG_DICTIONARY(GPRS_RETRIEVE_TIMEOUT_SIG, me); QS_SIG_DICTIONARY(NEW_TASKSENDREQ_SIG, me); QS_SIG_DICTIONARY(GPRS_SLEEPREQ_TIMEOUT_SIG, me); QS_SIG_DICTIONARY(GPRS_PHONECALL_HANDLED_SIG, me); QS_SIG_DICTIONARY(GPRS_SMS_HANDLED_SIG, me); QS_SIG_DICTIONARY(GPRS_COMMINGCALL_SIG, me); QS_SIG_DICTIONARY(GPRS_COMMINGSMS_SIG, me); QActive_subscribe((QActive *)me, ACC_ON_SIG); QActive_subscribe((QActive *)me, ACC_OFF_SIG); QActive_subscribe(&me->super, WAKEUP_REQ_SIG); QActive_subscribe(&me->super, SLEEP_REQ_SIG); //模块内部初始化 GPRS_Init(); me->m_ACCState = POWEROFF; me->m_NetState = NET_STATE_UNKOWN; GPRS_SetNetState(NET_STATE_UNKOWN); //网络指示灯关闭 GPRS_LED_OFF(); return Q_TRAN(&QGprs_serving); }