from flask import Flask, request, jsonify, Response
import threading
import json
import low_level
from config import DISPLAY_MAX_X, DISPLAY_MAX_Y
app = Flask(__name__)
# Shared state — written by Flask thread, read by main loop
state = {
'brightness': 100,
'program_top_text_enabled': True,
'program_bottom_text_enabled': True,
'program_vehicles_enabled': True,
'force_vehicles': False,
}
_lock = threading.Lock()
INDEX_HTML = """
LED Panel Control
LED Panel Control
"""
@app.route('/')
def index():
return Response(INDEX_HTML, mimetype='text/html')
@app.route('/display', methods=['GET'])
def handle_display():
pixels = []
for y in range(DISPLAY_MAX_Y + 1):
row = []
for x in range(DISPLAY_MAX_X + 1):
row.append(low_level.get_pixel_color(x, y))
pixels.append(row)
return Response(json.dumps(pixels), mimetype='application/json')
@app.route('/brightness', methods=['POST'])
def handle_brightness():
value = request.form.get('value')
if value is not None:
with _lock:
state['brightness'] = max(0, min(100, int(value)))
return 'OK'
@app.route('/toggle-program', methods=['POST'])
def handle_toggle():
program = request.form.get('program')
enabled_str = request.form.get('enabled')
if not program or enabled_str is None:
return 'Missing program or enabled parameter', 400
enabled = enabled_str.lower() == 'true'
key_map = {
'top_text': 'program_top_text_enabled',
'bottom_text': 'program_bottom_text_enabled',
'vehicles': 'program_vehicles_enabled',
}
if program not in key_map:
return 'Unknown program', 400
with _lock:
state[key_map[program]] = enabled
return 'OK'
@app.route('/force-vehicles', methods=['POST'])
def handle_force_vehicles():
with _lock:
state['force_vehicles'] = True
return 'OK'
@app.route('/program-status', methods=['GET'])
def handle_status():
with _lock:
s = dict(state)
return jsonify({
'top_text': s['program_top_text_enabled'],
'bottom_text': s['program_bottom_text_enabled'],
'vehicles': s['program_vehicles_enabled'],
'brightness': s['brightness'],
})
def start_server(host='0.0.0.0', port=80):
t = threading.Thread(target=lambda: app.run(host=host, port=port, use_reloader=False), daemon=True)
t.start()