5. ユーザコードの実装方法
5.2 app_main 関数
app_main関数では、初期化処理、メインループの実装を行います。また、タイマ、ボード設定、コマン
ドラインなど使用する場合、 app_main関数で初期化処理を行います。
【注】 QE for BLEを使用する場合、app_main関数のソースコードは自動的に生成されます。
app_main関数の例をコード5-1に示します。
/* CommandLine parameters */
static const st_ble_cli_cmd_t * const gsp_cmds[] = {
&g_abs_cmd, &g_vs_cmd, &g_sys_cmd, &g_ble_cmd };
void app_main(void) {
/* Initialize BLE */
R_BLE_Open();
#if (BLE_CFG_MCU_PSM_OPE)
/* MCU Power supply modes change: ALLPWON -> EXFPWON */
/* Note: EXFPWON needs to execute a program on RAM area. */
R_LPM_PowerSupplyModeExfpwonSet();
#endif /* (BLE_CFG_MCU_PSM_OPE) */
/* Configure the board */
R_BLE_BOARD_Init();
/* Initialize the Low Power Control function */
R_BLE_LPC_Init();
/* Initialize timer for ABS & LED blink */
R_BLE_TIMER_Init();
/* Configure CommandLine */
R_BLE_CLI_Init();
R_BLE_CLI_RegisterCmds(gsp_cmds, ARRAY_SIZE(gsp_cmds));
R_BLE_CMD_SetResetCb(ble_init);
/* Initialize BLE host stack and profiles */
ble_init();
/* main loop */
while (1) {
/* Process Command Line */
R_BLE_CLI_Process();
/* Process Event */
R_BLE_Execute();
/* Enter the Lower Power Mode */
R_BLE_LPC_EnterLowPowerMode();
} }
コード5-1 app_main関数の例
BLEプロトコルスタックの初期化(R_BLE_Open)
【注】必ずapp_main関数の最初でコールしてください。
【注】必ず電源供給モードALLPWONでコールしてください。
ボードの初期化(R_BLE_BOARD_Init)
MCU低消費電力機能の初期化(R_BLE_LPC_Init)
アプリケーション用のtimerの初期化(R_BLE_TIMER_Init)
コマンドラインの初期化(R_BLE_CLI_Init)
ホストスタック、プロファイルの初期化(ble_init)
メインループ(R_BLE_Executeを呼び出す、
R_BLE_LPC_EnterLowPowerModeでMCU低消費電力状態への移行) MCUの電源供給モード変更(R_LPM_PowerSupplyModeExfpwonSet)
ble_init関数では、ホストスタック、プロファイルの初期化処理を行います。コールバック関数の登録や GATTデータベースの登録などを行います。
【注】QE for BLEを使用する場合、ble_init関数のソースコードは自動的に生成されます。
ble_init関数の例をコード5-2に示します。
static ble_status_t ble_init(void) {
ble_status_t status;
g_conn_hdl = BLE_GAP_INVALID_CONN_HDL;
gs_timer_hdl = BLE_TIMER_INVALID_HDL;
/* Initialize host stack */
status = R_BLE_ABS_Init(&gs_abs_init_param);
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
/* Initialize GATT Database */
status = R_BLE_GATTS_SetDbInst(&g_gatt_db_table);
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
/* Initialize GATT Server */
status = R_BLE_SERVS_Init();
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
/* Initialize GATT client */
status = R_BLE_SERVC_Init();
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
/* Initialize GATT Discovery Library */
status = R_BLE_DISC_Init();
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
/* Initialize LED and Switch Service */
status = R_BLE_LSC_Init(lss_cb);
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
/* Create timer for LED blink */
status = R_BLE_TIMER_Create(&gs_timer_hdl, 1, BLE_TIMER_PERIODIC, timer_cb);
if (BLE_SUCCESS != status) {
return BLE_ERR_INVALID_OPERATION;
}
return status;
}
コード5-2 ble_init関数の例
ホストスタックの初期化(R_BLE_ABS_Init)
【注】抽象APIを使わない場合、以下を使用します。
R_BLE_GAP_Init R_BLE_VS_Init R_BLE_GATTS_Init R_BLE_GATTC_Init
GATTデータベースの登録(R_BLE_GATTS_SetDbInst)
【注】QE for BLEでGATTロールをサーバ/クライアント のどちらにしてもコード生成されます。
GATTサーバ機能の初期化(R_BLE_SERVS_Init)
【注】QE for BLEでGATTロールをサーバ/クライアントのどちらにしてもコード 生成されます。
ソフトウェアタイマ生成(R_BLE_TIMER_Create) GATTクライアント機能の初期化(R_BLE_SERVC_Init)
【注】QE for BLEでGATTロールをサーバ/クライアントのどちらにしてもコード 生成されます。
Service Discovery機能の初期化(R_BLE_DISC_Init)
【注】QE for BLEでGAPロールをセントラルにするとコード生成されま す。
サービスの初期化
(R_BLE_[サービス名]S_InitまたはR_BLE_[サービス名]C_Init)
【注】QE for BLEでGATTロールをサーバにするとR_BLE_[サービス 名]S_Initがコード生成されます。
【注】QE for BLEでGATTロールをクライアントにすると R_BLE_[サービス名]C_Init)がコード生成されます。
5.2.1.1
コールバック関数の登録アプリケーションにコールバック関数を登録することで、各種イベントの受信タイミングで処理を行うこ とが可能です。各機能ブロックのコールバック登録APIを表5.2に示します。
表5.2 コールバック登録API
機能ブロック コールバック登録API コメント
GAP R_BLE_ABS_Init or
R_BLE_GAP_Init
登録されたコールバック関数は Advertising、スキャン、Connection 確立など、R_BLE_GAP_XXXの結果 を受信時に呼び出されます。
GATTサーバ (プロファイル共通)
R_BLE_ABS_Init or
R_BLE_GATTS_RegisterCb
登録されたコールバック関数は GATTクライアントからアクセス時 に呼び出されます。
GATTクライアント (プロファイル共通)
R_BLE_ABS_Init or
R_BLE_GATTC_RegisterCb
登録されたコールバック関数は GATTサーバからのアクセス時に呼 び出されます。
Service Discovery
(プロファイル共通) R_BLE_DISC_Start()
登録されたコールバック関数は Service Discoveryが完了したときに 呼び出されます。
Vendor Specific R_BLE_ABS_Init or R_BLE_VS_Init
登録されたコールバック関数は
R_BLE_VS_XXXの結果を受信時に
呼び出されます。
L2CAP R_BLE_L2CAP_RegisterCfPsm()
登録されたコールバック関数は L2CAP Credit-Based Flow Controlの リクエストの応答が返った時、
L2CAP Credit-Based Flow Controlの 受信時など、R_BLE_L2CAP_XXXの 結果を受信時に呼び出されます。
【注】QE for BLEでコード生成され ません。
LED and Switch制御 R_BLE_BOARD_RegisterSwitchCb()
登録されたコールバック関数は BoardのSwitchが押下された場合な ど、R_BLE_BOARD_XXXの結果を 受信時に呼び出されます。
【注】QE for BLEでコード生成され ません。
ソフトウェアタイマ R_BLE_TIMER_Create()
登録されたコールバック関数は指定 した時間が経過した場合など、
R_BLE_TIMER_XXXの結果を受信時
に呼び出されます。
【注】QE for BLEでコード生成され ません。
サーバ側
プロファイルAPI
R_BLE_XXXS_Init() (XXXはServiceの名前)
登録されたコールバック関数はクラ イアントからアクセスされた場合に 呼び出されます。
クライアント側 プロファイルAPI
R_BLE_XXXC_Init() (XXXはServiceの名前)
登録されたコールバック関数はサー バからアクセスされた場合に呼び出 されます。
【注】 R_BLE_ABS_InitはGAP、GATTサーバ、GATTクライアント、VSのコールバック関数をまとめて登録で
きます。
GATTサーバとして動作させるGATT サービスアプリケーションを作成する場合、QE for BLEが以下の ファイルにサービスのデータベースをコード生成します。
⚫ gatt_db.c
⚫ gatt_db.h
このGATTデータベースはR_BLE_GATTS_SetDbInstによってアプリケーションに登録されます。
5.2.2
メインループとスケジューラ(R_BLE_Execute)BLEプロトコルスタックはアプリケーションから呼ばれるAPIを処理するためにスケジューラを使用し ます。スケジューラを動作させるためにメインループ内にてR_BLE_Executeをコールしてください。発生 したイベントは登録したコールバック関数に通知されます。
スケジューラはR_BLE_Executeにより、BLEプロトコルスタックの各レイヤのタスク宛に送信された メッセージキューに従ってタスクを処理します。図5.2にBLEプロトコルスタックの基本シーケンス チャートを示します。
図5.2 BLEプロトコルスタックの基本シーケンスチャート
R_BLE API Scheduler Host Stack Link Layer(LL) BLE H/W
Application
Call R_BLE API
return R_BLE API
Send Message to Host Stack
Call R_BLE_Execute()
return R_BLE_Execute()
Execute Task
return Send Message to LL
Execute Task
return
Access BLE H/W Send Message to Host Stack
BLE Interrupt Execute Task
return return callback R_BLE event callback
return
Send Message to LL Call R_BLE_Execute()
return R_BLE_Execute()
Execute Task
return
Access BLE H/W Send Message to Host Stack
Execute Task
return callback
return R_BLE event callback
return Function Call
Send Message return
BLE Interrupt Access BLE H/W
Software Hardware
Source Code Library
BLE Protcol Stack