2017-01-06 10 views
0

短編小説:Luaのコールバック関数にパラメータを渡すにはどうすればよいですか?Lua:コールバック関数のパラメータを追加する

長い物語:

私はNodeMCUファームウェアとESP8266に取り組んでいます。基本的には、ノードごとに複数のボタンがあるだけで、ダッシュボタンを作成するつもりです。私はGPIOピンの割り込みの可能性を持ってこれをやっています。

しかし、コールバック関数にパラメータを渡す方法は、十分に文書化されていないようです。私の場合は、割り込みがどのピンに来たのかを知りたい。これは私が思いついたものです。これは、ピンの値を除いて動作しています。これはトリガされたときに初期化値1にリセットされているようです。

-- Have an area to hold all pins to query (in testing only one) 

    buttonPins = { 5 } 
    direction="up" 

    armAllButtons() 

    function armAllButtons() 
    for i,v in ipairs(buttonPins) 
    do 
     armButton(v) 
    end 
    end 


    function armButton(buttonPin) 
    print("Arming pin "..buttonPin.." for button presses.") 

    gpio.mode(buttonPin,gpio.INT,gpio.FLOAT) 
    gpio.trig(buttonPin, direction, function (buttonPin) notifyButtonPressed(buttonPin) end) 

    print("Waiting for button press on "..buttonPin.."...") 
    end 

    function notifyButtonPressed(buttonPin) 
    print("Button at pin "..buttonPin.." pressed.") 

    --rearm the pins for interrupts 
    armButton(buttonPin) 
    end 

しかしnotifyButtonPressed()機能の中から、buttonPinの値が押されたときに、ではない5、私はそれがあることを期待すると常に1です。私はそれがおそらく数値変数の初期値だと考えています。あるとして

+0

'buttonPinPressed'はどのように1に設定されていますか? – hjpotter92

+0

申し訳ありませんが、投稿間違いでした。私はコードを変更しました。 varはbuttonPinPressedではなく、buttonPinです。しかし、まだ問題は残っている。 フォーマットにごめんね、あなたがいたときに並行して変更していました。 (関数 'へ – Jens

+1

変更'関数(buttonPin)notifyButtonPressed(buttonPin)end')notifyButtonPressed(buttonPinは)それをやったこと、あなたは正しい、 – hjpotter92

答えて

1

まず第一に、あなたのコードは...まったく実行されません。私はこのようスニペットを再配置した後、それは

input:6: attempt to call a nil value (global 'armAllButtons') 

がスローされます。

buttonPins = { 5 } 
    direction="up" 

    function armButton(buttonPin) 
    print("Arming pin "..buttonPin.." for button presses.") 

    gpio.mode(buttonPin,gpio.INT,gpio.FLOAT) 
    gpio.trig(buttonPin, direction, function (buttonPin) --notifyButtonPressed(buttonPin) end) 

    print("Waiting for button press on "..buttonPin.."...") 
    end 

    function notifyButtonPressed(buttonPin) 
    print("Button at pin "..buttonPin.." pressed.") 

    --rearm the pins for interrupts 
    armButton(buttonPin) 
    end 

    function armAllButtons() 
    for i,v in ipairs(buttonPins) 
    do 
     armButton(v) 
    end 
    end 

armAllButtons() 

それが出力されます。

あなたのコールバックが完全に機能するには、各ボタンに異なる関数を渡して、arg関数を参照してください...

buttonPins = { 5 } 
    direction="up" 

    function armButton(buttonPin) 
    print("Arming pin "..buttonPin.." for button presses.") 

    gpio.mode(buttonPin,gpio.INT,gpio.FLOAT) 
    gpio.trig(
     buttonPin, 
     direction, 
     function() 
     notifyButtonPressed(buttonPin) 
     end 
    ) -- this should create a function for each button, and each function shall pass a different argument to notifyButtonPressed 

    print("Waiting for button press on "..buttonPin.."...") 
    end 

    function notifyButtonPressed(buttonPin) 
    print("Button at pin "..buttonPin.." pressed.") 

    --rearm the pins for interrupts 
    armButton(buttonPin) 
    end 

    function armAllButtons() 
    for i,v in ipairs(buttonPins) 
    do 
     armButton(v) 
    end 
    end 

armAllButtons() 
関連する問題