/** * 始動時の処理 * * @param E_STATE_IDLE * @param pEv * @param eEvent * @param u32evarg */ PRSEV_HANDLER_DEF(E_STATE_IDLE, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { if (eEvent == E_EVENT_START_UP) { // 起動メッセージ vSerInitMessage(); // 暗号化鍵の登録 if (IS_APPCONF_OPT_SECURE()) { bool_t bRes = bRegAesKey(sAppData.sFlash.sData.u32EncKey); V_PRINTF(LB "*** Register AES key (%d) ***", bRes); } if (u32evarg & EVARG_START_UP_WAKEUP_RAMHOLD_MASK) { // Warm start message V_PRINTF(LB "*** Warm starting woke by %s. ***", sAppData.bWakeupByButton ? "DIO" : "WakeTimer"); ToCoNet_Nwk_bResume(sAppData.pContextNwk); ToCoNet_Event_SetState(pEv, E_STATE_RUNNING); // RTS を設定 vPortSetLo(PORT_RTS0); } else { // 開始する // start up message V_PRINTF(LB "*** Cold starting(UART)"); V_PRINTF(LB "* start end device[%d]", u32TickCount_ms & 0xFFFF); sAppData.sNwkLayerTreeConfig.u8Role = TOCONET_NWK_ROLE_ENDDEVICE; // ネットワークの初期化 sAppData.pContextNwk = ToCoNet_NwkLyTr_psConfig_MiniNodes(&sAppData.sNwkLayerTreeConfig); if (sAppData.pContextNwk) { // とりあえず初期化だけしておく ToCoNet_Nwk_bInit(sAppData.pContextNwk); ToCoNet_Nwk_bStart(sAppData.pContextNwk); } // 直ぐにスリープ ToCoNet_Event_SetState(pEv, E_STATE_APP_SLEEP); // RTS を設定 vPortSetHi(PORT_RTS0); // 再送フラグ bRetry = ((sAppData.sFlash.sData.u8wait % 10) != 0); u16RetryDur = sAppData.sFlash.sData.u8wait * 10; } // ポート出力する vPortAsOutput(PORT_RTS0); // RC クロックのキャリブレーションを行う ToCoNet_u16RcCalib(sAppData.sFlash.sData.u16RcClock); } }
/* * ADC 計測をしてデータ送信するアプリケーション制御 */ PRSEV_HANDLER_DEF(E_STATE_IDLE, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { static bool_t bFirst = TRUE; if (eEvent == E_EVENT_START_UP) { if (u32evarg & EVARG_START_UP_WAKEUP_RAMHOLD_MASK) { // Warm start message V_PRINTF(LB "*** Warm starting woke by %s. ***", sAppData.bWakeupByButton ? "DIO" : "WakeTimer"); } else { // 開始する // start up message vSerInitMessage(); V_PRINTF(LB "*** Cold starting"); V_PRINTF(LB "* start end device[%d]", u32TickCount_ms & 0xFFFF); // BME280 の初期化 } // RC クロックのキャリブレーションを行う ToCoNet_u16RcCalib(sAppData.sFlash.sData.u16RcClock); // センサーがらみの変数の初期化 u8sns_cmplt = 0; vBME280_Init( &sObjBME280, &sSnsObj ); if( bFirst ){ V_PRINTF(LB "*** BME280 Setting..."); bFirst = FALSE; bBME280_Setting(); } vSnsObj_Process(&sSnsObj, E_ORDER_KICK); if (bSnsObj_isComplete(&sSnsObj)) { // 即座に完了した時はセンサーが接続されていない、通信エラー等 u8sns_cmplt |= E_SNS_BME280_CMP; V_PRINTF(LB "*** BME280 comm err?"); ToCoNet_Event_SetState(pEv, E_STATE_APP_SLEEP); // スリープ状態へ遷移 return; } // ADC の取得 vADC_WaitInit(); vSnsObj_Process(&sAppData.sADC, E_ORDER_KICK); // RUNNING 状態 ToCoNet_Event_SetState(pEv, E_STATE_RUNNING); } else { V_PRINTF(LB "*** unexpected state."); ToCoNet_Event_SetState(pEv, E_STATE_APP_SLEEP); // スリープ状態へ遷移 } }
/** * 設定処理用の状態マシン(未使用) */ static void vProcessEvCoreConfig(tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { switch (pEv->eState) { case E_STATE_IDLE: if (eEvent == E_EVENT_START_UP) { Interactive_vSetMode(TRUE, 0); vSerInitMessage(); vfPrintf(&sSerStream, LB LB "*** Entering Config Mode ***"); ToCoNet_Event_SetState(pEv, E_STATE_RUNNING); } break; case E_STATE_RUNNING: break; default: break; } }
/* * 最初に遷移してくる状態 */ PRSEV_HANDLER_DEF(E_STATE_IDLE, tsEvent *pEv, teEvent eEvent, uint32 u32evarg) { // この状態から始まったときモジュールIDなどを表示する if (eEvent == E_EVENT_START_UP) { // 起床メッセージ vSerInitMessage(); // 暗号化鍵の登録 if (IS_APPCONF_OPT_SECURE()) { bool_t bRes = bRegAesKey(sAppData.sFlash.sData.u32EncKey); V_PRINTF(LB "*** Register AES key (%d) ***", bRes); } // 初回起動(リセット)かスリープからの復帰かで表示するメッセージを変える if (u32evarg & EVARG_START_UP_WAKEUP_RAMHOLD_MASK) { // Warm start message V_PRINTF(LB "*** Warm starting woke by %s. ***", sAppData.bWakeupByButton ? "DIO" : "WakeTimer"); // RESUME ToCoNet_Nwk_bResume(sAppData.pContextNwk); // RUNNING状態へ遷移 ToCoNet_Event_SetState(pEv, E_STATE_RUNNING); } else { // 開始する // start up message V_PRINTF(LB "*** Cold starting"); V_PRINTF(LB "* start end device[%d]", u32TickCount_ms & 0xFFFF); sAppData.sNwkLayerTreeConfig.u8Role = TOCONET_NWK_ROLE_ENDDEVICE; // ネットワークの初期化 sAppData.pContextNwk = ToCoNet_NwkLyTr_psConfig_MiniNodes(&sAppData.sNwkLayerTreeConfig); if (sAppData.pContextNwk) { ToCoNet_Nwk_bInit(sAppData.pContextNwk); ToCoNet_Nwk_bStart(sAppData.pContextNwk); } // 最初にパケットを送りたくないのでチャタリング対策状態へ遷移後、割り込みがあるまでスリープ ToCoNet_Event_SetState(pEv, E_STATE_APP_CHAT_SLEEP); } } }