hiro99ma blog

何か技術的なこと

ncs: アプリでのBLEの比重

2024/11/12

なんだかよくわからないタイトルになってしまった。

いま ncs の勉強をしていることもあり、サンプルアプリの作りが BLE 中心になっている。
しかし、普通にアプリを作るとそうではないはずだ。
BLE は通信路に過ぎず、その両端で行う事柄の方が大切だろう。
ネットを使うアプリだって、データをダウンロードなりアップロードなりする理由があるから行うのであって、 それ自体が目的と言うことはないはずだ(そういう用途もあるだろうが)。
まあ、私の場合は BLE で何かしたいというのが先にあるからあながち間違いではないのだが。

突然なにを言い出したのかというと、main() に全部書きすぎになってしまっているという反省をしているのだ。
複雑なことをしないと事足りるので、もうちょっと考えたプログラムも作ろうと思う。

第1弾で作ってみた。

SB1602B という I2C 接続の LCD に出力するだけの Peripheral アプリである。
(Central は作ってないな。。。 Android の復習がてら作るか。)
この LCD はバックライトが無いので暗いところだと見づらいが、実験にはちょうどよい。

CMakeLists.txt の分割

ソフトウェアの中に階層を作るならディレクトリに分けた方が扱いやすい。
それにデバイスドライバは他のアプリで使い回すこともあるだろうから、 ディレクトリごとコピーして持って行ける方が簡単だ。

CMake はまだ慣れていないが、こんな感じで使っている。
CFLAGS で制御するよりは Kconfig でやってしまいたいのでなるべくシンプルに。

vscode のビルドログにはコンパイルオプションなどは出力されないので細かいところは分からない。

Kconfig の分割

ディレクトリが分かれたので Kconfig も分けることにした。
プロジェクトでしか使わないのでまとめて 1 ファイルにした方がわかりやすい気もするのだが、 GUI の Kconfig エディタもあるし、探しやすければよかろうと思うことにした。
ほとんどログレベルの設定で、SB1602B についてはコントラストの設定があるという程度である。

image

ファイルの分け方は CMakeLists.txt と同じようにした。
一番上で全部やった方がわかりやすい気もするし、ちょっと悩ましい。

main()に何をさせるか

サンプルアプリでは、デバイスの初期化、BLEとサービスの初期設定、Advertising の開始までやっていることが多い。
Advertising を開始すれば、あとは接続して Characteristic へアクセスがあればそれぞれのコールバックで処理をする。

今回は初期化までを main() で行い、それ以降はアプリで行ってもらう形にした。
“GAP” は Advertising と接続の処理周りという意味である。

image

と、書きながら BLE Service の場所を変えた方がよい気がしてきた。
下の図の左側のイメージでやっていたのだが、よく考えると BLE の API はほぼ Zephyr と同じ位置だ。
ならば右側のイメージがよいのではないか。

image

BLE Service のコールバック処理はアプリだろうけど Service 自体はドライバと同じ位置のように思えてきたのだ。
GAP 関係の処理もそこにまとめて、アプリ側の BLE操作をまとめたディレクトリを作る。

image

ついでに BLE 接続/切断もコールバックで通知するように変更した。
BLE の状態はこれら(Core v5.1, Vol.6, Part B, “1.1 Link Layer states”)なので、Advertising しているかどうかと Connection かどうかは見た目でわかりたいかもしれない。
Advertising はスマホ相手だと切断もしばしばするのだし、ペアリングしていない状態だとかペアリングしていない状態での Advertising とかを目立たせれば良かろう。
Central が必ず必要な機器であれば Connection も特に知らせる必要はないだろう(デバッグ以外では)。

image

これで多少は BLE を重視しすぎないようなつくりになっただろうか。
ペアリングも追加して、もう少し実用的に見えるような構成にしたい。

< Top page