質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2121閲覧

QFileSystemWatcherによるsysファイルの監視が上手くいかない

tuyudaku

総合スコア75

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/02 05:00

GPIOに繋がっているスイッチの入力を監視する為に
QFileSystemWatcherを使って/sys/class/gpio/gpioXX/value
の値の変更を検知させようとしています

スイッチを動かすことでvalueの値が変化しているのは確認済みです
また、echoを使って値を手動で設定することでQFileSystemWatcher
fileChangedシグナルをemitしているのも確認できました

ただ、スイッチによる値の変化ではなぜかfileChangedシグナルがemitされません
Monitoring Sys Files with QFileSystemWatcher
には/sys/class/gpio/gpioXX/edgeを変更する必要がある、というようなことが書いてあったので
試してみたのですが、結果は変わりませんでした
そもそも、手動で値を変更すればemitされることを考えればあまり関係なさそうでした

できればタイマーなどは使わず、スイッチの入力監視を行いたいため
この現象に心当たりがある方、他の方法を知っているかた
教えていただけませんでしょうか?

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

使用しているGPIOは割り込みに対応しているでしょうか?
レベルの変化でイベントを起こすためにはGPIOが割り込みに対応しており、ドライバもサポートしていることが必要になります。

サポートしていなければ"/sys/class/gpio/gpioXX/edge"へ書き込みを行ったとき、エラーになります。
この操作は成功しましたか?

2019-09-05時点でのまとめ

※コメント欄に貴重な情報が散在しているのでまとめておきます。新たな情報はありません。

■ハードウェアは目的の機能を満たすための能力を持っているか?
→持っている。

GPIOのレベル変化のイベントを受け取るためにはポートが割り込みをサポートしている必要がる。
以下の2点からサポートしていると判断した

  • "/sys/class/gpio/gpioXX/edge"への書き込みがエラーにならなかった。(Linux Kernelの実装によると割り込みをサポートしていない場合、書き込みに失敗する)
  • レベル変化をさせてみたところ、割り込み発生回数が変化した。実際に割り込みをハンドリングしている。(割り込み発生回数はcat /proc/interruptsで確認できる。

■ソフトウェアは目的の機能を満たすための能力を持っているか?
→持っていなかった。 Linux Kernelのバージョンを3.16.*以上にする必要がある。

QtのQFileSystemWatcherはLinuxのinotify機能を使ってファイルの内容変化などを検出する。
GPIOのレベル変化は/sys/class/gpio/gpioXX/valueの内容変化であり、使えそうな気がするが実際は通常のファイルとは異なるため、Kernelによる個別対応が必要となる。その対応が行われたのがLinux Kernel 3.16.*である。しかし、使用していたLinux Kernelは3.4.5であり、機能をサポートしていなかった。

投稿2019/09/02 11:55

編集2019/09/05 11:51
nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2019/09/02 12:30

>この操作は成功しましたか? はい、操作は成功しました、bothを書き込んで 値が変わっていることも確認できました
nomuken

2019/09/02 12:38

割り込みがハンドリングできているか確認しましょう。 割り込みが発生する操作の前と後で実行し、結果が変わるか見てみてください。 cat /proc/interrupts | grep gpiolib
tuyudaku

2019/09/02 12:55

>結果が変わるか見てみてください 結果がかわるのが確認できました
tuyudaku

2019/09/02 12:56

あれ?実際の値の変化は3つ目の部分でしょうか? 2つ目の部分はカウントアップしているのですが 3つ目の数字は値が変わっていません
nomuken

2019/09/02 13:16

数字が増えていっている列があれば大丈夫です。
tuyudaku

2019/09/02 13:29

であれば、ハンドリングはできているということなんですね... そうなると、Qtのライブラリ自体のバグかなにかでしょうか...
nomuken

2019/09/02 13:46

Linux kernelのバージョンとQtのバージョンを教えてもらえますか?
tuyudaku

2019/09/02 13:50

kernel:3.4.5 Qt:5.6.1 となってます
nomuken

2019/09/03 12:17 編集

おそらくLinux Kernel 3.4.5では非サポートです。 QFileSystemWatcherはlinuxのinotifyという機能をカプセル化したクラスだと思います。 GPIOのレベル変化のイベントがinotifyで通知されるようになったのはおそらくKernel 3.16からです。 QFileSystemWatcherではイベントを受けられないと思うのでシステムコールのpollやselectをカプセル化したクラスを探して利用するしかなさそうです。
nomuken

2019/09/02 23:10

>QFileSystemWatcherではイベントを受けられないと思うのでシステムコールのpollやselectをカプセル化したクラスを探して利用するしかなさそうです。 代替になるクラスは見当たらなかったのでKernelのバージョンアップやinotifyで通知するための修正のバックポートを検討ください。
tuyudaku

2019/09/05 08:29

自分でも色々調べてみました nomukenさんの言うとおり対応してなさそうですね... とりあえずタイマーによる監視で行きたいと思います 丁寧な回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問