/**************************************************************************** * * NAME: cbvMcRxHandler * * DESCRIPTION: * * RETURNS: * ****************************************************************************/ PUBLIC void cbToCoNet_vRxEvent(tsRxDataApp *pRx) { int i; // print coming payload V_PRINTF( "\n\r[PKT Ad:%04x,Ln:%03d,Seq:%03d,Lq:%03d,Tms:%05d \"", pRx->u32SrcAddr, pRx->u8Len, // Actual payload byte: the network layer uses additional 4 bytes. pRx->u8Seq, pRx->u8Lqi, pRx->u32Tick & 0xFFFF); for (i = 0; i < pRx->u8Len; i++) { if (i < 32) { V_PUTCHAR((pRx->auData[i] >= 0x20 && pRx->auData[i] <= 0x7f) ? pRx->auData[i] : '.'); } else { V_PRINTF( ".."); break; } } V_PRINTF( "\"]"); // 直接受信したパケットを上位へ転送する if (pRx->auData[0] == 'T') { tsTxDataApp sTx; memset(&sTx, 0, sizeof(sTx)); sTx.u32DstAddr = TOCONET_NWK_ADDR_PARENT; sTx.u32SrcAddr = ToCoNet_u32GetSerial(); // Transmit using Long address sTx.u8Cmd = 0; // data packet. sTx.u8Seq = pRx->u8Seq; sTx.u8CbId = pRx->u8Seq; sTx.u16DelayMax = 300; // 送信開始の遅延を大きめに設定する memcpy(sTx.auData, pRx->auData, pRx->u8Len); sTx.auData[0] = 'R'; sTx.u8Len = pRx->u8Len; #ifdef USE_AES sTx.bSecurePacket = TRUE; #endif SPRINTF_vRewind(); vfPrintf(SPRINTF_Stream, ":%03d", pRx->u8Lqi); memcpy(sTx.auData + sTx.u8Len, SPRINTF_pu8GetBuff(), SPRINTF_u16Length()); sTx.u8Len += SPRINTF_u16Length(); ToCoNet_Nwk_bTx(sAppData.pContextNwk, &sTx); } }
/**************************************************************************** * * NAME: vHandleSerialInput * * DESCRIPTION: * * PARAMETERS: Name RW Usage * * RETURNS: * * NOTES: ****************************************************************************/ PRIVATE void vHandleSerialInput() { // handle UART command while (!SERIAL_bRxQueueEmpty(sSerPort.u8SerialPort)) { int16 i16Char; i16Char = SERIAL_i16RxChar(sSerPort.u8SerialPort); // process if (i16Char >=0 && i16Char <= 0xFF) { uint8 u8res = u8ParseSerCmd(&sSerCmd, (uint8)i16Char); if (u8res == E_SERCMD_VERBOSE) { vfPrintf(&sSerStream, "\n\rVERBOSE MODE = %s", bSerCmd_VerboseMode ? "ON" : "OFF"); continue; } if (!bSerCmd_VerboseMode) continue; switch (i16Char) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sAppData.sFlash.sData.u8Layer = i16Char - '0'; if (bFlash_Write(&sAppData.sFlash, FLASH_SECTOR_NUMBER - 1, 0)) { V_PRINTF( LB "Flash Saved (Router Layer #%d)... RESETTING", sAppData.sFlash.sData.u8Layer); vWait(100000); vAHI_SwReset(); } else { V_PRINTF( LB "Failed to save flash..."); } break; case 'i': // info _C { tsToCoNet_NwkLyTr_Context *pc = (tsToCoNet_NwkLyTr_Context *)(sAppData.pContextNwk); V_PRINTF( LB "Info: la=%d ty=%d ro=%02x st=%02x", pc->sInfo.u8Layer, pc->sInfo.u8NwkTypeId, pc->sInfo.u8Role, pc->sInfo.u8State); V_PRINTF( LB "Parent: %08x", pc->u32AddrHigherLayer); V_PRINTF( LB "LostParent: %d", pc->u8Ct_LostParent); V_PRINTF( LB "SecRescan: %d, SecRelocate: %d", pc->u8Ct_Second_To_Rescan, pc->u8Ct_Second_To_Relocate); } break; case '>': sToCoNet_AppContext.u8Channel++; if (sToCoNet_AppContext.u8Channel > 25) sToCoNet_AppContext.u8Channel = 0; ToCoNet_vRfConfig(); V_PRINTF( LB"channel set to %d.", sToCoNet_AppContext.u8Channel); break; case '<': sToCoNet_AppContext.u8Channel--; if (sToCoNet_AppContext.u8Channel < 11) sToCoNet_AppContext.u8Channel = 25; ToCoNet_vRfConfig(); V_PRINTF( LB"channel set to %d.", sToCoNet_AppContext.u8Channel); break; case 't': SPRINTF_vRewind(); vfPrintf(SPRINTF_Stream, "TEST FROM ROUTER(#%08X)", ToCoNet_u32GetSerial()); bTransmitToParent(sAppData.pContextNwk, SPRINTF_pu8GetBuff(), SPRINTF_u16Length()); break; case 'd': case 'D': _C { static uint8 u8DgbLvl; u8DgbLvl++; if(u8DgbLvl > 10) u8DgbLvl = 0; ToCoNet_vDebugLevel(u8DgbLvl); V_PRINTF( LB"set NwkCode debug level to %d.", u8DgbLvl); } break; default: break; } } }
/**************************************************************************** * * NAME: cbToCoNet_vNwkEvent * * DESCRIPTION: * * PARAMETERS: Name RW Usage * * RETURNS: * * NOTES: ****************************************************************************/ void cbToCoNet_vNwkEvent(teEvent eEvent, uint32 u32arg) { switch(eEvent) { /* * ネットワークが開始された */ case E_EVENT_TOCONET_NWK_START: V_PRINTF(LB"[E_EVENT_TOCONET_NWK_START:%d,Ch:%d]", u32TickCount_ms & 0xFFFF, sToCoNet_AppContext.u8Channel); vDispInfo(&sSerStream, (void*)sAppData.pContextNwk); // pass this event to the event machine ToCoNet_Event_Process(E_EVENT_TOCONET_NWK_START, u32arg, vProcessEvCore); break; /* * ネットワークが切断された */ case E_EVENT_TOCONET_NWK_DISCONNECT: V_PRINTF(LB"[E_EVENT_TOCONET_NWK_DISCONNECT]"); // pass this event to the event machine ToCoNet_Event_Process(E_EVENT_TOCONET_NWK_DISCONNECT, u32arg, vProcessEvCore); break; /* * メッセージプールを受信 */ case E_EVENT_TOCONET_NWK_MESSAGE_POOL: if (u32arg) { tsToCoNet_MsgPl_Entity *pInfo = (void*)u32arg; int i; //static uint8 u8seq = 0; uint8 u8buff[TOCONET_MOD_MESSAGE_POOL_MAX_MESSAGE+1]; memcpy(u8buff, pInfo->au8Message, pInfo->u8MessageLen); // u8Message にデータ u8MessageLen にデータ長 u8buff[pInfo->u8MessageLen] = 0; // UART にメッセージ出力 if (pInfo->bGotData) { // empty なら FALSE になる V_PRINTF(LB"---MSGPOOL sl=%d ln=%d msg=", pInfo->u8Slot, pInfo->u8MessageLen ); SPRINTF_vRewind(); for (i = 0; i < pInfo->u8MessageLen; i++) { vfPrintf(SPRINTF_Stream, "%02X", u8buff[i]); } V_PRINTF("%s", SPRINTF_pu8GetBuff()); #ifdef USE_LCD V_PRINTF_LCD("%02x:%s\r\n", u8seq++, SPRINTF_pu8GetBuff()); vLcdRefresh(); #endif V_PRINTF("---"); } else { V_PRINTF(LB"---MSGPOOL sl=%d EMPTY ---", pInfo->u8Slot ); #ifdef USE_LCD V_PRINTF_LCD("%02x: EMPTY\r\n", u8seq++); vLcdRefresh(); #endif } ToCoNet_Event_Process(E_EVENT_APP_GET_IC_INFO, pInfo->bGotData, vProcessEvCore); // vProcessEvCore にイベント送信 } break; default: break; } }