Лучший способ запустить веб-сервер на пи ноль, который меняет шаблон светодиодной полосы на том же пи? - PullRequest
0 голосов
/ 18 мая 2018

Так что в основном я пытаюсь построить светодиодный проект с малиной пи ноль ш.Я получил скрипты led python, работающие внутри моего веб-проекта.Но я хотел бы иметь возможность изменять шаблоны на светодиодных лентах одним нажатием кнопки на веб-странице, которая генерируется пи.В настоящее время я использую колбу для запуска веб-сервера и отправки обновлений на него.Я также использую execnet для запуска методов паттерна из файла python 2, поскольку библиотека NeoPixel есть только в python 2, а не 3.

from flask import Flask, render_template, request
import execnet
CURRENT_PATTERN = "No Pattern Running"
app = Flask(__name__)
def callPython2(Version, Module, Function, Args):
    gw = execnet.makegateway("popen//python=python%s" % Version)
    channel = gw.remote_exec("""
        from %s import %s as the_function
        channel.send(the_function(*channel.receive()))
    """ % (Module, Function))
    channel.send(Args)

@app.route("/")
def index():
    CURRENT_PATTERN = 'BootUp'
    callPython2("2.7", "lakeboot", "startUp", "")
    templateData = {
        'title' : 'LED Pattern Status',
        'pattern' : CURRENT_PATTERN,
    }
    return render_templates("index.html', **templateData)

@app.route("/<patternName>/<action>")
def action(patternName, action):
    if action == 'stop':
        CURRENT_PATTERN = 'No Pattern Running"
        callPython2("2.7", "lakeboot", "turnOff", "")
    if patternName == 'TheaterChase':
        CURRENT_PATTERN = 'Theater Chase'
        callPython2("2.7", "lakeboot", "runTheater", "")
    #More Pattern calls like above
    templateData = {
        'title' : "LED Pattern Status',
        'pattern' : CURRENT_PATTERN,
    }
    return render_template('index.html', **templateData)`

Вот так выглядит мой файл webPage.py.Смена шаблона вызывает работу, но затем он выполняет только одну итерацию выбранного шаблона, но я бы хотел, чтобы он зациклился до тех пор, пока не будет сказано, чтобы остановиться или выбрать новый шаблон.

PS Извините, если формат плохой. Никогда не публиковался здесь раньше, а также работал с python только несколько месяцев.

РЕДАКТИРОВАТЬ: Вот index.html

<!DOCTYPE html>
   <head>
      <title>LED Status</title>
      <link rel="stylesheet" href='../static/style.css'/>
   </head>

   <body>
                <h2> Status </h2>
                <h3> Current Pattern ==>  {{ pattern  }}</h3>
                <br>
                <h2> Commands </h2>
                <h3>
                        Run Bootup ==>
                        <a href="/bootup/start" class="button">TURN ON</a>
                        <a href="/bootup/stop" class="button">TURN OFF</a>
                </h3>
                <h3>
                        Run Theater Chase ==>
                        <a href="/TheaterChase/start" class="button">TURN ON</a>
                        <a href="/TheaterChase/stop"class="button">TURN OFF</a>
                </h3>
                <h3>
                        Run Pattern Three ==>
                        <a href="/ledGrn/start" class="button">TURN ON</a>
                </h3>

   </body>
</html>

1 Ответ

0 голосов
/ 19 мая 2018

Один необычный, но не совсем сумасшедший подход - запускать Flask в потоке, причем основной поток управляет светодиодами.Сторона светодиодов и сторона Flask будут взаимодействовать через общую структуру данных, которую вы должны организовать, чтобы заблокировать, если вы делаете что-то более сложное, чем выполнение атомарного присваивания ему.

Основной поток:

  1. Создание держателя состояния общего ресурса
  2. Добавление его в конфигурацию Flask
  3. Запуск приложения Flask в потоке
  4. Выполните задачу на переднем плане (управляющие светодиодыв этом случае) периодически проверять держатель общего состояния на предмет новой установки / команды.
  5. Обработчики колб запрашивают / устанавливают через владельца общего состояния.

Для чего-либо, кроме одного состояниязначение, владелец состояния будет хотеть заблокировать доступ внутренне.

У меня есть рабочий пример, который управляет камерой здесь .

Ключевые части, отредактированные немного, являются

def webserver(control):
    app.config['CONTROL'] = control
    # It isn't safe to use the reloader in a thread
    app.run(host='0.0.0.0', debug=True, use_reloader=False)

control = Control()
ui_thread = threading.Thread(target=webserver, args=(control,))
ui_thread.start()

while control.running():
    # control the LEDs, periodically interrogating control

Со стороны колбы,

@app.route('/command', methods=['POST'])
def command():
    control = app.config['CONTROL']
    control.command(request.form.get('command'))
    return redirect('/')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...