无法多次运行方法

时间:2017-01-10 21:23:09

标签: ruby wiringpi

我正在使用WiringPi宝石。这段代码按预期工作:

pinNumber = 7
io = WiringPi::GPIO.new do |gpio| 
    gpio.pin_mode(pinNumber, WiringPi::INPUT) 
end 

pin_state = io.digital_read(pinNumber) 
return pin_state

但是,当我将其包含在方法中以便我可以使用Sinatra进行调用时,我在尝试刷新时会收到以下错误:

  

wiringPiSetup *:每个程序运行只能调用一次。这是   一个致命的错误。请修改您的代码。

为什么必须只运行一次,最佳解决方案是什么?每次导航到根URL时,最终都需要检索pin_state

这是完整的代码:

require 'wiringpi'
require 'sinatra'

def getstate()
    pinNumber = 7
    io = WiringPi::GPIO.new do |gpio|
      gpio.pin_mode(pinNumber, WiringPi::INPUT)
    end     

    pin_state = io.digital_read(pinNumber)
    return pin_state
end 

get '/' do
    getstate()
end 

2 个答案:

答案 0 :(得分:2)

创建GPIO实例后,您可以重复调用以从中读取引脚。但是,您的代码正在为每次调用创建一个新实例。

require 'wiringpi'
require 'sinatra/base'

class MyApp < Sinatra::Base
  InputPin = 7

  IO = WiringPi::GPIO.new do |gpio|
    gpio.pin_mode(InputPin, WiringPi::INPUT)
  end     

  def get_state(pin_number = MyApp::InputPin)
    MyApp::IO.digital_read(pin_number)
  end 

  get '/' do
    get_state
  end
end

答案 1 :(得分:1)

pinNumber = 7

def io
    @io ||= begin
        WiringPi::GPIO.new do |gpio|
          gpio.pin_mode(pinNumber, WiringPi::INPUT)
        end
    end
end

def getstate()
    pin_state = io.digital_read(pinNumber)
    return pin_state
end 

get '/' do
    getstate() end

在应用程序启动时初始化API(在getState()方法之外)。您多次初始化API,因此错误。