Armadillo Base OSではVScodeでABOSDEエクステンションを使ってアプリケーションを開発します。
その中でC++は標準プロジェクトが無い為、C言語プロジェクトを使った方法を紹介します。
実施手順
ここではArmadillo-IoT A6EのDI1の論理を判定するアプリケーションをC++で作成します。
以下、製品マニュアルの通りにinitial_setupやネットワーク設定が完了した前提で進めます。
<本内容に含まれないもの> ※手順は同じ為、製品マニュアルを参照下さい。
・【必須】Armadilloとの接続設定
・【必須】initial_setup
・【任意】ネットワーク設定
・【任意】拡張ハードウェア設定
・【任意】ABOSDEのSSH設定(デバッグする際は必須)
1.プロジェクト作成
C New ProjectからC言語用プロジェクトを作成します。プロジェクト名や保存先は任意で構いません。
ここではA6Eを選択していますが、製品は適宜合わせてください。
2.コンテナ起動ファイルapp.confの変更
app.confを下記のように変更します。
A6EのDI1はgpiochip5 0の為、gpiochip5のアクセス権限を付けます。
set_image localhost/{{PROJECT}}:latest
add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app:ro
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data
add_armadillo_env
add_volumes /sys:/sys
add_devices /dev/gpiochip5
set_command c_launch
3.Dockerfileを編集
こちらはデフォルトから変更はしておりません。
コンテナイメージに手を加えたい場合は必要に応じて編集ください。
ARG ARCH
FROM docker.io/${ARCH}/debian:bullseye-slim
LABEL version="2.0.0"
COPY resources/etc/apt /etc/apt/
ARG PACKAGES
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y --no-install-recommends ${PACKAGES} \
&& apt-get clean
ARG PRODUCT
COPY resources [r]esources_${PRODUCT} resources_c /
RUN useradd -m -u 1000 atmark
RUN echo "/vol_app/lib" > /etc/ld.so.conf.d/atmark.conf
ENV LD_LIBRARY_PATH=/vol_app/lib
4.packages.txtを編集
packeges.txtにビルドおよび、アプリケーション実行環境に必要なパッケージをそれぞれ設定します。
g++やmakeなどはbuild-essentialに含まれている為、それ以外に必要なものを追記します。
ここでは以下のようにpackeges.txtにGPIOを操作する為のgpiodとlibgpiod-devを追加しています。
# --- always use ---
gpiod
# --- use only for build ---
[build]
build-essential
gpiod
libgpiod-dev
5.ソースファイルの書き換え/リネーム/削除
main.cをmain.cppにリネームし、各種ソースファイルを作成します。
不要なソースファイル、ヘッダーファイルは削除して問題ありません。
ここでは簡単な内容の為、main.cppとMakefileのみとします。
maion.cppは以下の様に書き換えます。
※あくまで参考例ですので適宜必要に応じて修正ください。
#include <gpiod.hpp>
#include <iostream>
#include <chrono>
#include <thread>
#include <fstream>
int main() {
const std::string chipname = "gpiochip5";
const unsigned int line_num = 0;
try {
gpiod::chip chip(chipname);
gpiod::line line = chip.get_line(line_num);
line.request({"gpio_read_cpp", gpiod::line_request::DIRECTION_INPUT, 0});
while (true) {
int val = line.get_value();
std::cout << "DI1:" << val << std::endl;
std::ofstream("/sys/class/leds/app/brightness") << (val == 1 ? 0 : 1);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
catch (const std::exception &e) {
std::cerr << "Error accessing GPIO: " << e.what() << std::endl;
return 1;
}
return 0;
}
6.Makefileを編集
Makefileを下記の様に書き換えます。
※あくまで参考例ですので適宜必要に応じて修正ください。
ビルドした実行ファイルは../build/mainとして保存します。(重要)
srcs := main.cpp
objdir := ../build
target := $(objdir)/main
objs := $(srcs:%.cpp=%.o)
deps := $(objs:.o=.d)
CXX := g++
CXXFLAGS += -Wall -Wextra -std=c++17 -MMD -MP
LDFLAGS += -lgpiodcxx
all: $(target)
$(target): $(objs)
$(CXX) $(TARGET_ARCH) $^ -o $@ $(LDFLAGS)
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $< -o $@
.PHONY: clean
clean:
$(RM) $(objs) $(deps) $(target)
-include $(deps)
7.ビルドを実行
書き換えたファイルをすべて保存(Ctrl+S)したら、ビルド実行~アップデートファイルを作成します。
デバッグ有り:Generate development swuを実行
デバッグ無し:Generate release swuを実行
ビルドの最後に Enter pass phrase for /home/atmark/mkswu/swupdate.key: と聞かれるため、
initial_setupで決めた署名用パスワードを入力してビルドとアップデートファイル作成が完了となります。
8.Armadilloに書き込み
Armadillo.localのアイコンから作成したSWUファイルをインストールします。
※ABOS WebやUSBメモリ等からでも構いません。
8.動作確認
SWUファイルをインストールするとArmadilloは自動で再起動し、インストールしたコンテナ(アプリ)が
自動起動します。
DI1が1(=オープン)の場合はLEDが消灯、DI1が0(=ショート)して1になった場合はLEDが点灯している事を
確認出来たら完了です。
デバッグ実行する場合
コンテナが動いている場合は一度ABOSDEからApp stop on Armadilloを実行し、コンテナを止めます。
その際、初回のみ下記パスワードを求められる為、Setup environment 実行時に決めたSSH接続のパスワードを
入力します。
次に、App run on Armadilloを実行すると標準出力したものはVScodeのターミナルにデバッグログが
流れるようになります。
《デバッグ時のポイント》
app/src以下の変更やapp.confの変更の場合は、App run on Armadilloを実行する事でビルド実行と
ファイルコピーを行う為、デバッグを早く行うことができます。(コンテナはビルドされない)
以上となります。