/* @(/1/8/23/1/7/5/5) ......................................................*/ static QState QGprs_connected(QGprs * const me, QEvt const * const e) { QState status_; switch (e->sig) { /* @(/1/8/23/1/7/5/5) */ case Q_ENTRY_SIG: { me->m_NetState = NET_STATE_CONNECTED; GPRS_SetNetState(NET_STATE_CONNECTED); QTimeEvt_postEvery(&me->m_LEDTimer, &me->super, TIMEOUT_LED_CONNECTED); QTimeEvt_postEvery(&me->m_PingTimer, &me->super, TIMEOUT_PING); //QTimeEvt_postEvery(&me->m_QueryTimer, &me->super, TIMEOUT_DATAQUERY); /* //首次连接网络,发送PING包 TaskEvt *pe = Q_NEW(TaskEvt, NEW_TASKSENDREQ_SIG); pe->cmd = EVS15_CMD_LOGIN; //命令字=登录 pe->sequence = GeneratePacketSequenceNumber(); QACTIVE_POST(me, (QEvt*)pe, (void*)0); */ status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/5/5) */ case Q_EXIT_SIG: { QTimeEvt_disarm(&me->m_LEDTimer); QTimeEvt_disarm(&me->m_PingTimer); //QTimeEvt_disarm(&me->m_QueryTimer); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/5/5/0) */ case Q_INIT_SIG: { status_ = Q_TRAN(&QGprs_Idle); break; } /* @(/1/8/23/1/7/5/5/1) */ case AT_ERROR_SIG: { status_ = Q_TRAN(&QGprs_connecting); break; } /* @(/1/8/23/1/7/5/5/2) */ case GPRS_SERVER_CONNECTED_SIG: { //连接状态 = 连接上服务器 me->m_NetState = NET_STATE_SERVERCONNECTED; GPRS_SetNetState(NET_STATE_SERVERCONNECTED); //清除“网络不可达”故障 //ClearErrType(NET_CLASS, NET_FAULT_UNREACHABLE); status_ = Q_HANDLED(); break; } default: { status_ = Q_SUPER(&QGprs_powerNormalMode); break; } } return status_; }
/*${AOs::CLI::SM::main::idle} ..............................................*/ static QState CLI_idle(CLI * const me, QEvt const * const e) { QState status_; switch (e->sig) { /* ${AOs::CLI::SM::main::idle} */ case Q_ENTRY_SIG: { QTimeEvt_postEvery( &me->rollEvt, (QActive *)me, ROLL_TIME ); Console_printStr("\r\r\n\nPress any key to continue..."); status_ = Q_HANDLED(); break; } /* ${AOs::CLI::SM::main::idle} */ case Q_EXIT_SIG: { QTimeEvt_disarm(&me->rollEvt); status_ = Q_HANDLED(); break; } /* ${AOs::CLI::SM::main::idle::ROLL} */ case ROLL_SIG: { Console_printRoll(); status_ = Q_HANDLED(); break; } default: { status_ = Q_SUPER(&CLI_main); break; } } return status_; }
/* @(/1/0/1/0) */ static QState Blinky_initial(Blinky * const me, QEvt const * const e) { QTimeEvt_postEvery( &me->timeEvt, (QActive *)me, BSP_TICKS_PER_SEC/2); return Q_TRAN(&Blinky_off); }
/*..........................................................................*/ QState Tunnel_game_over(Tunnel *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { QTimeEvt_postEvery(&me->blinkTimeEvt, (QActive *)me, BSP_TICKS_PER_SEC/2); /* 1/2 sec */ QTimeEvt_postIn(&me->screenTimeEvt, (QActive *)me, BSP_TICKS_PER_SEC*5); /* 5 sec timeout */ me->blink_ctr = 0; BSP_drawNString((GAME_SCREEN_WIDTH - 6*9)/2, 0, "Game Over"); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->blinkTimeEvt); QTimeEvt_disarm(&me->screenTimeEvt); BSP_updateScore(0); /* update the score on the display */ return Q_HANDLED(); } case BLINK_TIMEOUT_SIG: { me->blink_ctr ^= 1; /* toggle the blink couner */ BSP_drawNString((GAME_SCREEN_WIDTH - 6*9)/2, 0, ((me->blink_ctr == 0) ? "Game Over" : " ")); return Q_HANDLED(); } case SCREEN_TIMEOUT_SIG: { return Q_TRAN(&Tunnel_demo); } } return Q_SUPER(&Tunnel_active); }
static QState LPJ_initial(LPJ * const me, QEvent const * const e) { QTimeEvt_postEvery( &me->timeEvent, (QActive *)me, BSP_TICKS_PER_SEC/2); me->dimm = 50; return Q_TRAN(&LPJ_Off); }
/* @(/1/8/23/1/7/5) ........................................................*/ static QState QGprs_powerNormalMode(QGprs * const me, QEvt const * const e) { QState status_; switch (e->sig) { /* @(/1/8/23/1/7/5) */ case Q_ENTRY_SIG: { //复位AT执行序列 me->m_ATStep = 0; //启动LED闪烁定时器 QTimeEvt_postEvery(&me->m_LEDTimer, &me->super, TIMEOUT_LED_CONNECTING); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/5) */ case Q_EXIT_SIG: { QTimeEvt_disarm(&me->m_Timer); QTimeEvt_disarm(&me->m_LEDTimer); //关闭状态灯 GPRS_LED_OFF(); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/5/0) */ case Q_INIT_SIG: { status_ = Q_TRAN(&QGprs_disconnected); break; } /* @(/1/8/23/1/7/5/1) */ case ACC_OFF_SIG: { me->m_ACCState = POWEROFF; status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/5/2) */ case GPRS_LED_TIMEOUT_SIG: { //static QEvt const query_Evt = {AT_DATAQUERY_SIG, 0, 0}; //QACTIVE_POST(me, (QEvt*)&query_Evt, NULL); //QACTIVE_POST(me, (QEvt*)Q_NEW(QEvt, AT_DATAQUERY_SIG), (void*)0); //LED指示灯闪烁 GPRS_FLASH_LED(); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/5/3) */ case GPRS_PING_TIMEOUT_SIG: { status_ = Q_HANDLED(); break; } default: { status_ = Q_SUPER(&QGprs_polling); break; } } return status_; }
/*..........................................................................*/ QState Tunnel_demo(Tunnel *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { me->last_mine_x = 0; /* last mine at right edge of the tunnel */ me->last_mine_y = 0; /* set the tunnel properties... */ me->wall_thickness_top = 0; me->wall_thickness_bottom = 0; me->minimal_gap = GAME_SCREEN_HEIGHT - 3; /* erase the tunnel walls */ memset(l_walls, (uint8_t)0, (GAME_SCREEN_WIDTH * GAME_SCREEN_HEIGHT/8)); QTimeEvt_postEvery(&me->blinkTimeEvt, (QActive *)me, BSP_TICKS_PER_SEC/2); /* every 1/2 sec */ QTimeEvt_postIn(&me->screenTimeEvt, (QActive *)me, BSP_TICKS_PER_SEC*20); /* 20s timeout */ me->blink_ctr = 0; /* init the blink counter */ return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->blinkTimeEvt); QTimeEvt_disarm(&me->screenTimeEvt); return Q_HANDLED(); } case BLINK_TIMEOUT_SIG: { me->blink_ctr ^= 1; /* toggle the blink cunter */ return Q_HANDLED(); } case SCREEN_TIMEOUT_SIG: { return Q_TRAN(&Tunnel_screen_saver); } case TIME_TICK_SIG: { Tunnel_advance(me); if (me->blink_ctr != 0) { /* add the text bitmap into the frame buffer */ Tunnel_addImageAt(me, PRESS_BUTTON_BMP, (GAME_SCREEN_WIDTH - 55)/2, (GAME_SCREEN_HEIGHT - 8)/2); } BSP_drawBitmap(l_frame, GAME_SCREEN_WIDTH, GAME_SCREEN_HEIGHT); return Q_HANDLED(); } case PLAYER_TRIGGER_SIG: { return Q_TRAN(&Tunnel_playing); } } return Q_SUPER(&Tunnel_active); }
/* @(/1/8/23/1/7) ..........................................................*/ static QState QGprs_polling(QGprs * const me, QEvt const * const e) { QState status_; switch (e->sig) { /* @(/1/8/23/1/7) */ case Q_ENTRY_SIG: { QTimeEvt_postEvery(&me->m_retrieveTimer, &me->super, TIMEOUT_RETRIEVE); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7) */ case Q_EXIT_SIG: { QTimeEvt_disarm(&me->m_retrieveTimer); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/0) */ case Q_INIT_SIG: { status_ = Q_TRAN(&QGprs_initialing); break; } /* @(/1/8/23/1/7/1) */ case GPRS_RETRIEVE_TIMEOUT_SIG: { //接收串口提取 GPRS_doRetrieveFrame(0, 0); status_ = Q_HANDLED(); break; } /* @(/1/8/23/1/7/2) */ case AT_DATAREADY_SIG: { //延迟消息到达提取 me->m_deferedDataReady ++; #if 0 ATMsgEvt* pe = (ATMsgEvt*)e; //接收串口提取 GPRS_doRetrieveFrame(pe->begin, pe->end); #endif //接收串口提取 //GPRS_doRetrieveFrame(0, 0); status_ = Q_HANDLED(); break; } default: { status_ = Q_SUPER(&QGprs_serving); break; } } return status_; }
/*..........................................................................*/ QState LwIPMgr_connecting(LwIPMgr *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { QTimeEvt_postEvery(&me->te_LWIP_SLOW_TICK, (QActive *)me, BSP_TICKS_PER_SEC / 10U); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->te_LWIP_SLOW_TICK); return Q_HANDLED(); } case LWIP_SLOW_TICK_SIG: { if (eth_driver_connect()) { return Q_TRAN(&LwIPMgr_running); } return Q_HANDLED(); } } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState AlarmClock_timekeeping(AlarmClock *me, QEvent const *e) { switch (e->sig) { case Q_ENTRY_SIG: { /* periodic timeout every second */ QTimeEvt_postEvery(&me->timeEvt, (QActive *)me, BSP_TICKS_PER_SEC); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->timeEvt); return Q_HANDLED(); } case Q_INIT_SIG: { return Q_TRAN(&AlarmClock_mode24hr); } case CLOCK_12H_SIG: { return Q_TRAN(&AlarmClock_mode12hr); } case CLOCK_24H_SIG: { return Q_TRAN(&AlarmClock_mode24hr); } case ALARM_SIG: { printf("Wake up!!!\n"); return Q_HANDLED(); } case ALARM_SET_SIG: case ALARM_ON_SIG: case ALARM_OFF_SIG: { /* synchronously dispatch to the orthogonal component */ Alarm_dispatch(&me->alarm, e); return Q_HANDLED(); } case TERMINATE_SIG: { return Q_TRAN(&AlarmClock_final); } } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState LwIPMgr_running(LwIPMgr *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { #if (LWIP_DHCP != 0) dhcp_start(me->netif); /* start DHCP if configured */ /* NOTE: If LWIP_AUTOIP is configured in lwipopts.h and * LWIP_DHCP_AUTOIP_COOP is set as well, the DHCP process will * start AutoIP after DHCP fails for 59 seconds. */ #elif (LWIP_AUTOIP != 0) autoip_start(me->netif); /* start AutoIP if configured */ #endif QTimeEvt_postEvery(&me->te_LWIP_SLOW_TICK, (QActive *)me, (LWIP_SLOW_TICK_MS * BSP_TICKS_PER_SEC) / 1000U); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->te_LWIP_SLOW_TICK); return Q_HANDLED(); } case SEND_UDP_SIG: { if (me->upcb->remote_port != 0U) { struct pbuf *p = pbuf_new((u8_t *)((TextEvt const *)e)->text, strlen(((TextEvt const *)e)->text) + 1U); if (p != (struct pbuf *)0) { udp_send(me->upcb, p); pbuf_free(p); /* don't leak the pbuf! */ } } return Q_HANDLED(); } case LWIP_RX_READY_SIG: { eth_driver_read(); return Q_HANDLED(); } case LWIP_TX_READY_SIG: { eth_driver_write(); return Q_HANDLED(); } case LWIP_SLOW_TICK_SIG: { /* has IP address changed? */ if (me->ip_addr != me->netif->ip_addr.addr) { me->ip_addr = me->netif->ip_addr.addr; /* save the IP addr. */ BSP_displyIP(ntohl(me->ip_addr)); } #if LWIP_TCP me->tcp_tmr += LWIP_SLOW_TICK_MS; if (me->tcp_tmr >= TCP_TMR_INTERVAL) { me->tcp_tmr = 0; tcp_tmr(); } #endif #if LWIP_ARP me->arp_tmr += LWIP_SLOW_TICK_MS; if (me->arp_tmr >= ARP_TMR_INTERVAL) { me->arp_tmr = 0; etharp_tmr(); } #endif #if LWIP_DHCP me->dhcp_fine_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_fine_tmr >= DHCP_FINE_TIMER_MSECS) { me->dhcp_fine_tmr = 0; dhcp_fine_tmr(); } me->dhcp_coarse_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_coarse_tmr >= DHCP_COARSE_TIMER_MSECS) { me->dhcp_coarse_tmr = 0; dhcp_coarse_tmr(); } #endif #if LWIP_AUTOIP me->auto_ip_tmr += LWIP_SLOW_TICK_MS; if (me->auto_ip_tmr >= AUTOIP_TMR_INTERVAL) { me->auto_ip_tmr = 0; autoip_tmr(); } #endif return Q_HANDLED(); } case LWIP_RX_OVERRUN_SIG: { LINK_STATS_INC(link.err); return Q_HANDLED(); } } return Q_SUPER(&QHsm_top); }
/* @(/1/7/6/1) .............................................................*/ static QState QCAN_Normal_Mode(QCAN * const me, QEvt const * const e) { QState status_; switch (e->sig) { /* @(/1/7/6/1) */ case Q_ENTRY_SIG: { CAN1_PWR_ON();//模块开电 CAN_RECIEVE_ENABLE();//使能接收 me->m_bRecvFrame = 0; me->m_canfreeTicks = 0; me->m_ledFlashCnt = 0; /* 使能秒定时器 */ QTimeEvt_postEvery(&me->m_tickTimer, &me->super, (BSP_TICKS_PER_SEC)); status_ = Q_HANDLED(); break; } /* @(/1/7/6/1) */ case Q_EXIT_SIG: { QTimeEvt_disarm(&me->m_tickTimer); status_ = Q_HANDLED(); break; } /* @(/1/7/6/1/0) */ case Q_INIT_SIG: { status_ = Q_TRAN(&QCAN_non_conflicting); break; } /* @(/1/7/6/1/1) */ case PER_SECOND_SIG: { if(1 == me->m_bRecvFrame) { if(me->m_ledFlashCnt++ % 3 == 0) //控制等闪烁,3s { CAN_FLASH_LED(); } me->m_bRecvFrame = 0; me->m_canfreeTicks = 0; } else { me->m_canfreeTicks ++; // if(me->m_canfreeTicks > TIMEOUT_CAN_FREE_SECONDS) // { //请求CAN模块休眠 // static const QEvent sleep_Evt = {CAN_RXIDLE_TIMEOUT_SIG, 0}; // QACTIVE_POST(AO_Can, (QEvt*)&sleep_Evt, (void*)0); CAN_LED_OFF(); // } } status_ = Q_HANDLED(); break; } /* @(/1/7/6/1/2) */ case CAN_NEWRECVMSG_SIG: { DATANODE *pNode = CAN_TakeRxMsg(); MP_FreeNode(pNode); status_ = Q_HANDLED(); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; }
/* @(/1/9/3/2) .............................................................*/ static QState QACCDetector_busy(QACCDetector * const me, QEvt const * const e) { QState status_; switch (e->sig) { /* @(/1/9/3/2) */ case Q_ENTRY_SIG: { me->m_detectTimes = 0; //保持1S QTimeEvt_postEvery(&me->m_Timer, &me->super, TIMEOUT_DETECTING); status_ = Q_HANDLED(); break; } /* @(/1/9/3/2) */ case Q_EXIT_SIG: { QTimeEvt_disarm(&me->m_Timer); status_ = Q_HANDLED(); break; } /* @(/1/9/3/2/0) */ case Q_TIMEOUT_SIG: { u8 curState = (u8)GET_ACC_STATE(); me->m_detectTimes++; /* @(/1/9/3/2/0/0) */ if (curState != me->m_state) { //状态发生变化,重新开始检测 status_ = Q_TRAN(&QACCDetector_busy); } /* @(/1/9/3/2/0/1) */ else { me->m_state = curState; /* @(/1/9/3/2/0/1/0) */ if (me->m_detectTimes >= DETECTING_KEPT_AMOUNT) { static const QEvent acc_on_Evt = {ACC_ON_SIG, 0}; static const QEvent acc_off_Evt = {ACC_OFF_SIG, 0}; TaskEvt *pe; if(me->m_state == 0) { TRACE_(QS_USER, NULL, "[ACC] state = ACC ON"); SetACCState(ACC_ON); //广播ACC开电消息 QF_publish(&acc_on_Evt, me); } else { TRACE_(QS_USER, NULL, "[ACC] state = ACC OFF"); SetACCState(ACC_OFF); //广播ACC关电消息 QF_publish(&acc_off_Evt, me); } /* //上报服务器车辆状态 //1. 00为停车,FE为充电启动;FF为钥匙启动; pe = Q_NEW(TaskEvt, NEW_TASKSENDREQ_SIG); pe->cmd = EVS15_CMD_START_STOP_RPT; //命令字 pe->sequence = GeneratePacketSequenceNumber(); pe->ret = (me->m_state == 0) ? STATE_ACCON : STATE_STOP; QACTIVE_POST(AO_Gprs, (QEvt*)pe, (void*)0); */ status_ = Q_TRAN(&QACCDetector_idle); } /* @(/1/9/3/2/0/1/1) */ else { status_ = Q_HANDLED(); } } break; } /* @(/1/9/3/2/1) */ case ACC_ONCHANGE_SIG: { //检测过程中收到ACC变化,重新检测 me->m_state = (u8)GET_ACC_STATE(); status_ = Q_TRAN(&QACCDetector_busy); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; }
/* @(/2/2/3/0) */ QState AccelerometerListener_initial(AccelerometerListener *me, QEvent const *e) { QTimeEvt_postEvery(&me->timeEvt,(QActive*)me, 1); return Q_TRAN(&AccelerometerListener_state1); }
/*..........................................................................*/ QState LwIPMgr_running(LwIPMgr *me, QEvent const *e) { switch (e->sig) { case Q_ENTRY_SIG: { QTimeEvt_postEvery(&me->te_LWIP_SLOW_TICK, (QActive *)me, (LWIP_SLOW_TICK_MS * BSP_TICKS_PER_SEC) / 1000); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->te_LWIP_SLOW_TICK); return Q_HANDLED(); } case SEND_UDP_SIG: { if (me->upcb->remote_port != (uint16_t)0) { struct pbuf *p = pbuf_new((u8_t *)((TextEvt const *)e)->text, strlen(((TextEvt const *)e)->text) + 1); if (p != (struct pbuf *)0) { udp_send(me->upcb, p); printf("Sent: %s\n", ((TextEvt const *)e)->text); pbuf_free(p); /* don't leak the pbuf! */ } } return Q_HANDLED(); } case LWIP_RX_READY_SIG: { eth_driver_read(); return Q_HANDLED(); } case LWIP_TX_READY_SIG: { eth_driver_write(); return Q_HANDLED(); } case LWIP_SLOW_TICK_SIG: { /* has IP address changed? */ if (me->ip_addr != me->netif->ip_addr.addr) { TextEvt *te; uint32_t ip_net; /* IP address in the network byte order */ me->ip_addr = me->netif->ip_addr.addr; /* save the IP addr. */ ip_net = ntohl(me->ip_addr); /* publish the text event to display the new IP address */ te = Q_NEW(TextEvt, DISPLAY_IPADDR_SIG); snprintf(te->text, Q_DIM(te->text), "%d.%d.%d.%d", ((ip_net) >> 24) & 0xFF, ((ip_net) >> 16) & 0xFF, ((ip_net) >> 8) & 0xFF, ip_net & 0xFF); QF_PUBLISH((QEvent *)te, me); } #if LWIP_TCP me->tcp_tmr += LWIP_SLOW_TICK_MS; if (me->tcp_tmr >= TCP_TMR_INTERVAL) { me->tcp_tmr = 0; tcp_tmr(); } #endif #if LWIP_ARP me->arp_tmr += LWIP_SLOW_TICK_MS; if (me->arp_tmr >= ARP_TMR_INTERVAL) { me->arp_tmr = 0; etharp_tmr(); } #endif #if LWIP_DHCP me->dhcp_fine_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_fine_tmr >= DHCP_FINE_TIMER_MSECS) { me->dhcp_fine_tmr = 0; dhcp_fine_tmr(); } me->dhcp_coarse_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_coarse_tmr >= DHCP_COARSE_TIMER_MSECS) { me->dhcp_coarse_tmr = 0; dhcp_coarse_tmr(); } #endif #if LWIP_AUTOIP me->auto_ip_tmr += LWIP_SLOW_TICK_MS; if (me->auto_ip_tmr >= AUTOIP_TMR_INTERVAL) { me->auto_ip_tmr = 0; autoip_tmr(); } #endif return Q_HANDLED(); } case LWIP_RX_OVERRUN_SIG: { LINK_STATS_INC(link.err); return Q_HANDLED(); } }