Невозможно запустить метод несколько раз

Я использую драгоценный камень 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 *: Вы должны вызывать это только один раз за запуск программы. Это фатальная ошибка. Пожалуйста, исправьте ваш код.

Почему это должно выполняться только один раз, и какое решение лучше? в конечном счете pin_state должен быть получен каждый раз, когда я перехожу к корневому URL.

Вот полный код:

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 ответа

После создания вашего экземпляра 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
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 несколько раз, таким образом, ошибка.

Другие вопросы по тегам