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