ラズベリーパイの別のピンから取得した割り込みに応じて、ラズベリーパイのピンを切り替えるためのhaskellコードをいくつか作成しました。以前のトグル状態を知らずにピンの状態をトグルする方法がわかりません。プログラム自体はとてもシンプルです。
import Control.Concurrent
import Data.IORef
import HasberryPi
main = do wiringPiSetup
pinMode 0 output
pinMode 7 input
pullUpDnControl 7 pull_down
wiringPiISR 7 edge_both onoff
threadDelay (15*(10^6))
onoff s = do a <- readIORef s -- This is wrong
digitalWrite 0 (if b then pinhigh else pinlow) -- This is wrong
つまり、基本的にここで発生するのは、ピン7が割り込みとして登録されていることです。ピン7がハイからローまたはローからハイになるたびに割り込みがトリガーされます。また、割り込みがトリガーされるたびに、onoff
ピン0の状態を切り替える関数が呼び出されます。
main
機能は正しいです。そのonoff
機能が問題です。この関数の目的の動作は、onoff
ピンがローのときにピン0をハイにし、ハイのときにピンをローに切り替えることです。ただし、これを行うには、の前の呼び出しでピンの前の状態を保存する必要がありますonoff
。
州のモナドを試してみました。しかし、問題は、状態モナドが初期状態値に基づいて状態を渡すことです。しかし、その後の呼び出しonoff
では、初期状態値を変更することは不可能のようです。IORefについて考えましたが、違いはないようです。状態が実行していることを実行しているように見えますが、IO内でのみ実行されます。
状態をグローバル変数に格納する機能が非常に不足していることがはっきりとわかります。そして、同じ目標を達成するための他の慣用的な方法があることを知っているので、私はそれを行うことができないことを嬉しく思います。
正しい方向への助けは大歓迎です。
乾杯とよろしく。