その4-3.シャットダウンボタン制御プログラムをC++に置き換える

前置き

ごめんなさい、題名の通りですがLuaJITは諦めました。
いえ、別にLuaでpigpio操作する方法がない訳ではないのですが、結局Cでラッパーを作ってLuaで呼び出す、というわりと面倒な事をしなければならないという結論に達しまして、なら最初から全部C++で書けばいいじゃないって次第です。
というわけで、先日のPythonソースをC++へと置き換えます。

とりあえずソースをどん!

 C++ソース化しました。一応学生時代に慣れ親しんだC++ですが、組み込みで扱うのは初だった為少し手間取りました。今回いろんなサイトさんから少しずつ参考にさせて頂いて、正直挙げきれないので紹介は割愛させていただきます。

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <pigpio.h>

int main(int argc, char *argv[]) {
	if (gpioInitialise() < 0) return 1;

	gpioSetMode(14, PI_INPUT);
	gpioSetPullUpDown(14, PI_PUD_DOWN);

	int sdcnt = 0;
	while(1) {
		if (gpioRead(14) == 1) {
			sdcnt++;
			std::cout << sdcnt << std::endl;
			if (sdcnt == 50) {
				system("shutdown -h now");
			}
		} else {
			sdcnt = 0;
		}
		usleep(100000);
	}

	gpioTerminate();
	return 0;
}

やってる事は前回のPythonソースと変わらないので説明は省きます。
なお組み込み初心者としてハマった事。標準出力はprintf関数だと処理完了後に一気に出る仕様らしく、iostreamライブラリのstd::coutを利用しています。

そしてコンパイル

PythonLuaスクリプト言語なので実行された段階でコンパイルされますが、c++コンパイルして実行ファイルを作成しなければなりません。というわけで以下を入力してコンパイル
この時、-lpigpioでコンパイル時の参照にpigpioライブラリを追加する事を忘れずに。

g++ -o switchtest switchtest.cpp -lpigpio

これで実行ファイルswitchtestが作成されるので、早速実行します。

./switchtest

これで正常に動く…はずが、pigpio実行権限がうんたらかんたら怒られました。どうやらpigpioのC用ライブラリは独自にデーモンの実行権限を持つらしく、既にpigpiodが起動しているとダメらしく…
なので起動済みのpigpioデーモンを終了してから実行します。実行には管理者権限が必要になるのでsudoをつけるのを忘れずに。

sudo killall pigpiod
sudo ./switchtest

f:id:nekhbet:20200130004421p:plain

ようやく動きました。
とりあえずボタン関連の動作はこの辺りで一度ストップして、明日からは空連ファンのPWM制御を行っていきます。