我寫了一些haskell代碼來切換樹莓派上的一個引腳,這取決於我從樹莓派上另一個引腳獲得的中斷。我只是不知道如何在不知道以前的切換狀態的情況下切換引腳的狀態。程序本身非常簡單。如何模擬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
。
我試過了狀態monad。但問題在於狀態monad基於初始狀態值傳遞狀態。但在隨後調用onoff
似乎不可能改變初始狀態值。我想到了IORef,似乎沒有什麼不同。它看起來像是在做什麼狀態......但只在IO內部。
我可以清楚地看到,我非常想念在全局變量中存儲狀態的能力。我很高興我無法做到這一點,因爲我知道還有其他一些實現相同目標的慣用方式。
任何幫助正確的方向非常感謝。
乾杯和問候。
引腳0在程序開始時爲高電平還是低電平?你怎麼知道的?如果你可以回答,那麼你可以使用狀態。如果沒有辦法知道,我想你應該在啓動時自己設置高或低,並相應地初始化狀態。 – 2013-03-12 09:08:20
程序開始時引腳0將爲低電平 – Jay 2013-03-12 09:18:53