中継器の実装
中継機の基本的な実装を見ます。
中継器は、ネットワークの要求に応えて中継する機能を提供しますが、中継以外にもセンサー情報の送信といった処理も可能です。原則として常時給電で動作させます。

モジュール定義, include

1
#define ToCoNet_USE_MOD_NWK_LAYERTREE
2
#define ToCoNet_USE_MOD_NBSCAN
3
#define ToCoNet_USE_MOD_NBSCAN_SLAVE
4
#define ToCoNet_USE_MOD_NWK_MESSAGE_POOL
5
#define ToCoNet_USE_MOD_DUPCHK
6
7
// includes
8
#include "ToCoNet.h"
9
#include "ToCoNet_mod_prototype.h"
Copied!

cbAppColdStart()

アプリケーションIDやチャネルは、ここで決めておきます。また初期化処理等は vProcessEvCore() 関数に記述します。
1
void cbAppColdStart(bool_t bAfterAhiInit) {
2
if (!bAfterAhiInit) { // before AHI init, very first of code.
3
// Register modules
4
ToCoNet_REG_MOD_ALL();
5
} else {
6
// TWELITE NET configuration
7
sToCoNet_AppContext.u32AppId = 0x12345678;
8
sToCoNet_AppContext.u8Channel = 18;
9
sToCoNet_AppContext.bRxOnIdle = TRUE;
10
11
// Register user PRSEV.
12
ToCoNet_Event_Register_State_Machine(vProcessEvCore);
13
}
14
}
Copied!

cbToCoNet_vNwkEvent()

中継機では E_EVENT_TOCONET_NWK_START E_EVENT_TOCONET_NWK_DISCONNECT メッセージを処理します。
1
void cbToCoNet_vNwkEvent(teEvent eEvent, uint32 u32arg) {
2
switch (eEvent) {
3
case E_EVENT_TOCONET_NWK_START:
4
A_PRINTF( LB"[E_EVENT_TOCONET_NWK_START]");
5
break;
6
7
case E_EVENT_TOCONET_NWK_DISCONNECT:
8
A_PRINTF( LB"[E_EVENT_TOCONET_NWK_DISCONNECT]");
9
break;
10
}
11
}
Copied!

cbToCoNet_vRxEvent()

受信方法は単純ネットと大きく変わりません。tsRxDataApp 構造体には違いがあります。
中継パケットは cbToCoNet_vRxEvent() コールバックでは処理されません。中継器に直接届いたパケット(送信専用の子機からパケットなど)を処理します。
1
void cbToCoNet_vRxEvent(tsRxDataApp *pRx) {
2
uint8 *p = pRx->auData;
3
4
// パケットの表示
5
if (pRx->u8Cmd == TOCONET_PACKET_CMD_APP_DATA) {
6
// 基本情報
7
uint8 u8lqi_1st = pRx->u8Lqi; // LQI
8
uint32 u32addr_1st = pRx->u32SrcAddr; // 送信元
9
10
// データの解釈
11
uint8 u8b = G_OCTET();
12
...
13
}
14
}
Copied!

vProcessEvCore()

システム始動時 E_EVENT_START_UP に、tsToCoNet_NwkLyTr_Config 構造体の設定、ToCoNet_NwkLyTr_psConfig() 関数の実行、 ToCoNet_Nwk_bInit() 関数によるネットワークの初期化、ToCoNet_Nwk_bStart() 関数によるネットワークの開始を行います。
設定では中継器の指定(TOCONET_NWK_ROLE_ROUTER)、レイヤー 数、NBビーコンの指定(TOCONET_MOD_LAYERTREE_STARTOPT_NB_BEACON)が必須です。
ネットワーク開始後に、E_EVENT_TOCONET_NWK_START イベントを受け取ります。また、上位ノードをロストした場合 E_EVENT_TOCONET_NWK_DISCONNECT を受け取ります。
1
static tsToCoNet_NwkLyTr_Config sNwkLayerTreeConfig;
2
static tsToCoNet_Nwk_Context* pContextNwk;
3
4
static void vProcessEvCore(tsEvent *pEv, teEvent eEvent, uint32 u32evarg) {
5
switch (pEv->eState) {
6
case E_STATE_IDLE:
7
if (eEvent == E_EVENT_START_UP) {
8
memset(&sNwkLayerTreeConfig, 0, sizeof(sNwkLayerTreeConfig));
9
10
// layer 数の決定
11
sNwkLayerTreeConfig.u8Layer = 4;
12
13
// NBビーコン方式のネットワークを使用する
14
sNwkLayerTreeConfig.u8StartOpt =
15
TOCONET_MOD_LAYERTREE_STARTOPT_NB_BEACON;
16
17
// 中継器として始動
18
sNwkLayerTreeConfig.u8Role = TOCONET_NWK_ROLE_ROUTER;
19
pContextNwk = ToCoNet_NwkLyTr_psConfig(&sNwkLayerTreeConfig);
20
if (pContextNwk) {
21
ToCoNet_Nwk_bInit(pContextNwk);
22
ToCoNet_Nwk_bStart(pContextNwk);
23
} else {
24
// fatal error
25
}
26
}
27
break;
28
29
default:
30
break;
31
}
32
}
33
Copied!