MWSDK(TWELITE SDK)
MONO WIRELESS INC.
MWSDK
MWSDK
  • TWELITE SDK (MWSDK) マニュアル
  • はじめに
    • TWELITE SDK 利用規定
    • サポート、対応
    • モノワイヤレスソフトウェア使用許諾書
    • TWELITE SDKの構成
  • 最新版の取得
    • TWELITE SDK 改版履歴
  • TWELITE SDKの使用法
    • TWELITE SDKのインストール
    • VSCode での利用
    • フォルダ構成
    • コマンドラインでのビルド方法
    • ビルド定義について
      • Makefile について
      • Version.mk について
      • binファイル命名則
    • ファームウェア書換
      • ファームウェア書換用配線
      • tweterm.py
  • TWELIET NET API 解説
    • 用語
    • TWELITE NET ライブラリ構造
    • TWENET 動作フロー
      • 始動フロー
      • メインループフロー
      • 無線関連フロー
      • ハードウェアフロー
      • ユーザ定義イベント処理関数フロー
    • ソースコードの構造
    • モジュール
    • 無線パケット
      • パケットの最大長
      • アドレスの指定
      • アプリケーションID
    • ネットワークについて
      • 単純ネット
        • 送信
        • 受信
      • 中継ネット
        • 親機の実装
        • 中継器の実装
        • 子機の実装 (MININODES)
        • NBビーコン方式の接続
        • 中継ネットのアドレス
        • 上位アドレスを固定した静的中継
  • TWELITE NET API リファレンス
    • コールバック関数
      • cbAppColdStart()
      • cbAppWarmStart()
      • cbToCoNet_vMain()
      • cbToCoNet_vRxEvent()
      • cbToCoNet_vTxEvent()
      • cbToCoNet_vNwkEvent()
      • cbToCoNet_vHwEvent()
      • cbToCoNet_u8HwInt()
    • TWELITE NET関数
      • ToCoNet_vMacStart()
      • ToCoNet_bMacTxReq()
      • ToCoNet_u32GetSerial()
      • ToCoNet_u32GetRand()
      • ToCoNet_vSleep()
      • ToCoNet_vDebugInit()
      • ToCoNet_vDebugLevel()
      • ToCoNet_u32GetVersion()
      • ToCoNet_bRegisterAesKey()
      • ToCoNet_vRfConfig()
      • ToCoNet_vChConfig()
      • ToCoNet_Tx_vProcessEventQueue()
      • ToCoNet_u16RcCalib()
    • 中継ネット API
      • functions
        • ToCoNet_Nwk_bInit()
        • ToCoNet_Nwk_bStart()
        • ToCoNet_Nwk_bPause()
        • ToCoNet_Nwk_bResume()
        • ToCoNet_Nwk_bTx()
      • Structure
        • tsTxDataApp (中継ネット)
        • tsRxDataApp (中継ネット)
        • tsToCoNet_Nwk_Context
      • LayerTree ネット
        • ToCoNet_NwkLyTr_psConfig()
        • ToCoNet_NwkLyTr_psConfig_MiniNodes()
        • tsToCoNet_NwkLyTr_Context
    • 型 typedef, よく使うマクロ
    • 構造体
      • sToCoNet_AppContext
      • tsRxDataApp
      • tsTxDataApp
    • TWELITE NET マクロ
      • ToCoNet_REG_MOD_ALL()
      • utils.h
    • ユーザ定義イベント処理関数
      • ステート(状態)
      • イベント
      • ToCoNet_Event API
        • ToCoNet_Event_Register_State_Machine()
        • ToCoNet_Event_Process()
        • ToCoNet_Event_SetState()
        • ToCoNet_Event_vKeepStateOnRamHoldSleep()
        • ToCoNet_Event_u32TickFrNewState()
    • モジュール ライブラリ
      • ENERGY SCAN
      • NB SCAN
    • PRSEV ライブラリ
    • グローバル変数
      • uint32 u32TickCount_ms
      • sToCoNet_AppContext (静的変数)
    • PANIC
  • HW API リファレンス
    • ペリフェラル
      • ADC
        • adc.c
      • DIO
      • TickTimer
      • UART
        • SERIAL ライブラリ
          • SERIAL_vInit()
          • SERIAL_vInitEx()
          • SERIAL_bRxQueueEmpty()
          • SERIAL_i16RxChar()
          • SERIAL_vFlush()
          • tsSerialPortSetup
          • tsUartOpt
        • fprintf ライブラリ
          • vfPrintf()
          • vPutChar()
          • tsFILE
      • Timer
        • Timerライブラリ
          • vTimerConfig()
          • vTimerStart()
          • vTimerStop()
          • vTimerDisable()
          • tsTimerContext
      • WakeTimer
      • I2C
      • SPI
    • Flash, EEPROM
      • EEPROM
      • Flash
  • Utils リファレンス、他
    • ByteQueue
    • u8CCITT8()
    • SPRINTFライブラリ
    • BTMライブラリ(連照式 DIO 入力 )
GitBook提供
このページ内
  • モジュール定義, include
  • cbAppColdStart()
  • cbAppWarmStart()
  • cbToCoNet_vNwkEvent()
  • cbToCoNet_vRxEvent()
  • vProcessEvCore()
  1. TWELIET NET API 解説
  2. ネットワークについて
  3. 中継ネット

子機の実装 (MININODES)

子機の基本的な実装を見ます。

本ページでは LAYERTREE_MININODES モジュールによる、送信専用子機について紹介します。

モジュール定義, include

#define ToCoNet_USE_MOD_NWK_LAYERTREE_MININODES

// includes
#include "ToCoNet.h"
#include "ToCoNet_mod_prototype.h"

cbAppColdStart()

アプリケーションIDやチャネルは、ここで決めておきます。また初期化処理等は vProcessEvCore() 関数に記述します。

void cbAppColdStart(bool_t bAfterAhiInit) {
	if (!bAfterAhiInit) { // before AHI init, very first of code.
		// Register modules
		ToCoNet_REG_MOD_ALL();
	} else {
		// TWELITE NET configuration
		/// Application ID
		sToCoNet_AppContext.u32AppId = 0x12345678;
		sToCoNet_AppContext.u8Channel = 18;
		
		/// 受信回路は OFF
		sToCoNet_AppContext.bRxOnIdle = FALSE;
		
		/// CCA は最小限にする
		sToCoNet_AppContext.u8CCA_Level = 1;
		sToCoNet_AppContext.u8CCA_Retry = 0;

		/// 起動時の MAC 初期化を後回しにする。
		///   送信直前で初期化し、不要な場合は初期化しない。
		sToCoNet_AppContext.u8MacInitPending = TRUE;

		// Register user PRSEV.
		ToCoNet_Event_Register_State_Machine(vProcessEvCore);
	}
}

cbAppWarmStart()

単純ネットと同様にハードウェアの初期化等を実施するが、中継ネット特有の処理は vProcessEvCore() にて実施する。

cbToCoNet_vNwkEvent()

LayerTree MININODES は、上位ノードの決定といった手続きは省略されるため、 E_EVENT_TOCONET_NWK_START E_EVENT_TOCONET_NWK_DISCONNECT イベントについては処理する必要がありません。

cbToCoNet_vRxEvent()

void cbToCoNet_vRxEvent(tsRxDataApp *pRx) {
	uint8 *p = pRx->auData;

	// パケットの表示
	if (pRx->u8Cmd == TOCONET_PACKET_CMD_APP_DATA) {
		// 基本情報
		uint8 u8lqi_1st = pRx->u8Lqi; // LQI
		uint32 u32addr_1st = pRx->u32SrcAddr; // 送信元

		// データの解釈
		uint8 u8b = G_OCTET();
		...
	}
}

vProcessEvCore()

static tsToCoNet_NwkLyTr_Config sNwkLayerTreeConfig;
static tsToCoNet_Nwk_Context* pContextNwk;

static void vProcessEvCore(tsEvent *pEv, teEvent eEvent, uint32 u32evarg) {
	switch (pEv->eState) {
	case E_STATE_IDLE:
		if (eEvent == E_EVENT_START_UP) {
			if (u32evarg & EVARG_START_UP_WAKEUP_RAMHOLD_MASK) {
				// RESUME
				ToCoNet_Nwk_bResume(pContextNwk);
			} else {
				// 始動時の処理
				memset(&sNwkLayerTreeConfig, 0, sizeof(sNwkLayerTreeConfig));
				sNwkLayerTreeConfig.u8Role = 
						TOCONET_NWK_ROLE_ENDDEVICE;
				// ネットワークの初期化
				pContextNwk = 
					ToCoNet_NwkLyTr_psConfig_MiniNodes(&sNwkLayerTreeConfig);
	
				if (sAppData.pContextNwk) {
					ToCoNet_Nwk_bInit(pContextNwk);
					ToCoNet_Nwk_bStart(pContextNwk);
				}
			}
		}
		// RUNNING状態へ遷移
		ToCoNet_Event_SetState(pEv, E_STATE_RUNNING);
	break;
	
	case E_STATE_RUNNING:
		if (E_EVENT_NEW_STATE) {
			// センサーデータの取得など
		} else {
			// 
			tsTxDataApp sTx;
			memset(&sTx, 0, sizeof(sTx)); // 必ず0クリアしてから使う!
			uint8 *q =  sTx.auData;
		
			sTx.u32SrcAddr = ToCoNet_u32GetSerial();
		
			if (IS_APPCONF_OPT_TO_ROUTER()) {
				// ルータがアプリ中で一度受信して、ルータから親機に再配送
				sTx.u32DstAddr = TOCONET_NWK_ADDR_NEIGHBOUR_ABOVE;
			} else {
				// ルータがアプリ中では受信せず、単純に中継する
				sTx.u32DstAddr = TOCONET_NWK_ADDR_PARENT;
			}
		
			// ペイロードの準備
			S_OCTET('T');
			S_OCTET(sAppData.sFlash.sData.u8id);
			S_BE_WORD(sAppData.u16frame_count);		

			//	センサ固有のデータ
			memcpy(q,pu8Data,u8Len);
			q += u8Len;
		
			sTx.u8Cmd = 0; // 0..7 の値を取る。パケットの種別を分けたい時に使用する
			sTx.u8Len = q - sTx.auData; // パケットのサイズ
			sTx.u8CbId = sAppData.u16frame_count & 0xFF; // TxEvent で通知される番号、送信先には通知されない
			sTx.u8Seq = sAppData.u16frame_count & 0xFF; // シーケンス番号(送信先に通知される)
			sTx.u8Retry = sAppData.u8Retry;

			if (ToCoNet_Nwk_bTx(pNwk, &sTx)) {
				ToCoNet_Event_SetState(pEv, E_STATE_APP_WAIT_TX);
			} else {
				// ...失敗した(スリープ処理)
				ToCoNet_Event_SetState(pEv, E_STATE_SLEEP);
			}
		}
		break;
		
	case E_STATE_APP_WAIT_TX:
		if (...) { // Wait Tx Completion
			ToCoNet_Event_SetState(pEv, E_STATE_SLEEP);
		}
		break;
	
	case E_STATE_APP_SLEEP:
		if (eEvent == E_EVENT_NEW_STATE) {
			// 中継ネットのポーズ処理を行う
			ToCoNet_Nwk_bPause(sAppData.pContextNwk);

			// 周期スリープに入る
			//  - 初回は5秒あけて、次回以降はスリープ復帰を基点に5秒
			vSleep(5000, TRUE, FALSE);
		}
		break;

	default:
		break;
	}
}
前へ中継器の実装次へNBビーコン方式の接続

最終更新 2 年前

受信方法は単純ネットと大きく変わりません。には違いがあります。

中継パケットは コールバックでは処理されません。中継器に直接届いたパケット(送信専用の子機からパケットなど)を処理します。

システム始動時 に、 構造体の設定、 関数の実行、 関数によるネットワークの初期化、 関数によるネットワークの開始を行います。

スリープ前には、スリープからの起床時には を実行します。

tsRxDataApp 構造体
cbToCoNet_vRxEvent()
E_EVENT_START_UP
tsToCoNet_NwkLyTr_Config
ToCoNet_NwkLyTr_psConfig_MiniNodes()
ToCoNet_Nwk_bInit()
ToCoNet_Nwk_bStart()
ToCoNet_Nwk_bPause()
ToCoNet_Nwk_bResumte()