以下の例では、E_STATE_IDLE で特定の条件が成立した時に、送信処理を行います(E_STATE_APP_TX_REQUESTへ遷移)。送信が成功した場合 cond_if_tx_complete が 1 または 0xff に設定しますが、この値が 100ms 経過するまでに設定されなければタイムアウトとします。
uint8 cond_if_tx_complete;
void cbToCoNet_vTxEvent(uint8 u8CbId, uint8 bStatus) {
if(bStatus & 0x01) {
cond_if_tx_complete = 0x1; // TX success
} else {
cond_if_tx_complete = 0xFF; // TX FAIL
}
}
void vProcessEvCore(
tsEvent *pEv,
teEvent eEvent,
uint32 u32evarg) {
static bool_t cond;
switch (pEv->eState) {
case E_STATE_IDLE:
...
if(...) {
// 無線送信する
ToCoNet_Event_SetState(pEv, E_STATE_APP_TX_REQUEST);
}
break;
case E_STATE_APP_TX_REQUEST:
if (eEvent == E_EVENT_NEW_STATE) {
// 送信処理
tsTxDataApp sTx;
...
cond_if_tx_complete = FALSE; // 完了フラグ
if (!ToCoNet_bMacTxReq(&sTx)) {
// 送信失敗
ToCoNet_Event_SetState(pEv, E_STATE_APP_ERROR);
}
}
// 送信完了条件の確認
if (cond_if_tx_complete == 0x1) {
// Tx success!
ToCoNet_Event_SetState(pEv, E_STATE_IDLE);
} else if (cond_if_tx_complete == 0xFF) {
// Tx fails
ToCoNet_Event_SetState(pEv, E_STATE_APP_ERROR);
}
// Tx Timeout
if (ToCoNet_Event_u32TickFrNewState(pEv) > 100) {
ToCoNet_Event_SetState(pEv, E_STATE_APP_ERROR);
}
break;
case E_STATE_APP_ERROR:
... // エラー処理
break;
}