動作モードを変えたい
nRF5 SDK時代ではPreprocessor Definitionsという設定があり、ここに記述したものはDEFINEとしてプロジェクトに定義することができます。
この機能を使うことで、同じソースコードで複数のプロジェクトを作り、特定の機能や動作を変えて動かすことができたりしました。
例えば実機と評価ボードによるエミュレーターなどです。
ところがnRF Connect SDKではそのようなことができません。アプリケーションに対してビルドをいっぱい作ることはできますが、その中身を変えるというよりは使用するprj.confを変えることしかできません。
しかしprj.confを変えたところでこの中に独自の定義をすることはできないため、どれを選ぼうがたいして差がありません。強いて言うなら使わない(あるいは直接関係ない)であろうコンフィギュレーションを各prj.confでそれぞれ選んでおくと、ソースコード中で
if (IS_ENABLED(CONFIG_XXX)) {
...
} else if (IS_ENABLED(CONFIG_YYY)) {
...
}
みたいな記述は可能ですが、なんていうかこう・・・いかにもIT土方がやりそうなやり方でセンスのカケラもないですよね(笑)。
辛口ですんません・・・でもいいモノを作りたいならちゃんとしっかり勉強しよう!
独自の定義といえば
そうです、Kconfigを使います。ちなみにKconfigについては1年以上前に記事にしています。
が、実は当時さっぱり分かっていなかったんですよね・・・。というよりは、Segger Embedded Studio時代においてはKconfigで独自のdefineを定義してもGUIとして表示されないので分かりづらかったと表現するのが正しいのかも知れません。
Kconfigのメニューを増やす
NCS 2.0からはVSCode専用になったことでKconfigもGUI化しました。非常に分かりやすくなったと思います。
なんであんなにも使うのを渋っていたのか・・・(笑)
そして、なんと!Kconfigで記述した内容は実はここに追加することができるのです。最初に書いたようにビルドを使い分けたいのでラジオボタンを追加実装します。
source "Kconfig.zephyr"
choice
prompt "Choose one of the following options"
default SAMPLE_CHOICE_OPTION_A
help
Choose one.
config SAMPLE_CHOICE_OPTION_A
bool "Option A"
help
Enable option A.
config SAMPLE_CHOICE_OPTION_B
bool "Option B"
help
Enable option B.
config SAMPLE_CHOICE_OPTION_C
bool "Option C"
help
Enable option C.
endchoice
このKconfigを追加して再度コンパイルします。KconfigのGUIに追加するにはVSCodeを再起動する必要がありますので、再起動してKconfigを確認してみると・・・。
ちゃんと増えています。選択してprj.confを保存すると
当然prj.confに追加されます。なお、Kconfigの中で
default SAMPLE_CHOICE_OPTION_A
を指定しているため、Aを選んだ場合はprj.confには何も追加されません。
明示的に記述されないだけでSAMPLE_CHOICE_OPTION_Aはdefineとしてプロジェクトに追加されます。
ChatGPTが吐き出してくれる(笑)
余談ですが、このKconfigはChatGPTがほぼ吐き出してくれます。ChatGPT震えるぜ・・・と思いましたが、これだけだとコンパイルエラーを起こしてしまいます。
上記のソースとどこが違うかと言うと・・・そうですね1行目にある
source "Kconfig.zephyr"
がありません。これがないとコンパイルエラーを起こしてしまいます。
ここに辿り着くまでにかなり苦労しましたよ、ええ・・・。
まとめ
これで従来と同じ使い方がまた一つできるようになりました(笑)