mirror of
https://github.com/KevinMidboe/patlite-tower-lights-controller.git
synced 2025-10-29 17:50:29 +00:00
also let server serve www directory for frontend
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
frontend/nodes_modules
|
frontend/.env
|
||||||
|
frontend/node_modules/
|
||||||
frontend/dist
|
frontend/dist
|
||||||
|
|
||||||
server/lights.db
|
server/lights.db
|
||||||
|
|||||||
@@ -3,15 +3,19 @@ import argparse
|
|||||||
import RPi.GPIO as GPIO
|
import RPi.GPIO as GPIO
|
||||||
from light import Tower
|
from light import Tower
|
||||||
import database
|
import database
|
||||||
from flask import Flask, jsonify, request
|
from flask import Flask, jsonify, request, send_from_directory
|
||||||
|
import os
|
||||||
|
|
||||||
# Pins configuration (order: green, orange, red)
|
# Pins configuration (order: green, orange, red)
|
||||||
GPIO_PINS = [{'name': 'green', 'pin': 22},
|
GPIO_PINS = [{'name': 'green', 'pin': 22},
|
||||||
{'name': 'orange', 'pin': 17},
|
{'name': 'orange', 'pin': 17},
|
||||||
{'name': 'red', 'pin': 27}]
|
{'name': 'red', 'pin': 27}]
|
||||||
|
|
||||||
# Create a Flask app
|
# Path to static files directory
|
||||||
app = Flask(__name__)
|
STATIC_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'www')
|
||||||
|
|
||||||
|
# Create a Flask app and set static_folder
|
||||||
|
app = Flask(__name__, static_folder=STATIC_DIR, static_url_path='')
|
||||||
|
|
||||||
# Initialize the database
|
# Initialize the database
|
||||||
database.ensure_database()
|
database.ensure_database()
|
||||||
@@ -32,39 +36,40 @@ def add_cors_headers(response):
|
|||||||
def set_state():
|
def set_state():
|
||||||
data = request.data.decode('utf-8')
|
data = request.data.decode('utf-8')
|
||||||
state = [int(n.strip()) for n in data.split(',') if n.strip().isdigit()]
|
state = [int(n.strip()) for n in data.split(',') if n.strip().isdigit()]
|
||||||
"""Endpoint to get the current state of all lights."""
|
|
||||||
tower.green.on() if state[0] else tower.green.off()
|
tower.green.on() if state[0] else tower.green.off()
|
||||||
tower.orange.on() if state[1] else tower.orange.off()
|
tower.orange.on() if state[1] else tower.orange.off()
|
||||||
tower.red.on() if state[2] else tower.red.off()
|
tower.red.on() if state[2] else tower.red.off()
|
||||||
|
|
||||||
return jsonify(state)
|
return jsonify(state)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/state', methods=['GET'])
|
@app.route('/api/state', methods=['GET'])
|
||||||
def get_state():
|
def get_state():
|
||||||
"""Endpoint to get the current state of all lights."""
|
|
||||||
state = database.get_all_states()
|
state = database.get_all_states()
|
||||||
return jsonify(state)
|
return jsonify(state)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/toggle/<color>', methods=['POST'])
|
@app.route('/api/toggle/<color>', methods=['POST'])
|
||||||
def toggle_light(color):
|
def toggle_light(color):
|
||||||
"""Endpoint to toggle the state of a specified light."""
|
|
||||||
if color not in ['green', 'orange', 'red']:
|
if color not in ['green', 'orange', 'red']:
|
||||||
return jsonify({'error': 'Invalid color'}), 404
|
return jsonify({'error': 'Invalid color'}), 404
|
||||||
|
|
||||||
# Get the light object based on the color
|
|
||||||
light = getattr(tower, color)
|
light = getattr(tower, color)
|
||||||
|
|
||||||
# Toggle light state (on/off)
|
|
||||||
new_state = GPIO.LOW if light.state == GPIO.HIGH else GPIO.HIGH
|
new_state = GPIO.LOW if light.state == GPIO.HIGH else GPIO.HIGH
|
||||||
light._set(new_state) # Update the light state in the system
|
light._set(new_state)
|
||||||
|
|
||||||
return jsonify({color: new_state})
|
return jsonify({color: new_state})
|
||||||
|
|
||||||
|
|
||||||
|
# Serve static files from www/
|
||||||
|
@app.route('/')
|
||||||
|
def serve_index():
|
||||||
|
return send_from_directory(STATIC_DIR, 'index.html')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/<path:path>')
|
||||||
|
def serve_static(path):
|
||||||
|
return send_from_directory(STATIC_DIR, path)
|
||||||
|
|
||||||
|
|
||||||
def run(tower):
|
def run(tower):
|
||||||
"""Run the tower with manual light control."""
|
|
||||||
try:
|
try:
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
while True:
|
while True:
|
||||||
@@ -72,7 +77,6 @@ def run(tower):
|
|||||||
tower.green.on()
|
tower.green.on()
|
||||||
tower.red.off()
|
tower.red.off()
|
||||||
tower.orange.off()
|
tower.orange.off()
|
||||||
|
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print("\nInterrupted by user. Cleaning up...")
|
print("\nInterrupted by user. Cleaning up...")
|
||||||
@@ -98,3 +102,4 @@ def main():
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user