First test app thing.
This commit is contained in:
commit
a9a4709a07
20
frontend.js
Normal file
20
frontend.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
function updateLights(state) {
|
||||||
|
document.getElementById("red").classList.toggle("red", state === "red");
|
||||||
|
document.getElementById("green").classList.toggle("green", state === "green");
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchStatus() {
|
||||||
|
fetch("/status")
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => updateLights(data.state))
|
||||||
|
.catch(console.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleLight() {
|
||||||
|
fetch("/toggle", { method: "POST" })
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => updateLights(data.state))
|
||||||
|
.catch(console.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
setInterval(fetchStatus, 1000);
|
33
main.py
Normal file
33
main.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
from flask import Flask, render_template, jsonify
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
current_state = "red"
|
||||||
|
lock = threading.Lock()
|
||||||
|
|
||||||
|
def reset_to_red():
|
||||||
|
global current_state
|
||||||
|
time.sleep(10)
|
||||||
|
with lock:
|
||||||
|
current_state = "red"
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def index():
|
||||||
|
return render_template("site_template.j2", state=current_state)
|
||||||
|
|
||||||
|
@app.route("/status")
|
||||||
|
def status():
|
||||||
|
return jsonify({"state": current_state})
|
||||||
|
|
||||||
|
@app.route("/toggle", methods=["POST"])
|
||||||
|
def toggle():
|
||||||
|
global current_state
|
||||||
|
with lock:
|
||||||
|
if current_state != "green":
|
||||||
|
current_state = "green"
|
||||||
|
threading.Thread(target=reset_to_red, daemon=True).start()
|
||||||
|
return jsonify({"state": current_state})
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="0.0.0.0", port=8000)
|
27
site_template.j2
Normal file
27
site_template.j2
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Traffic Light</title>
|
||||||
|
<style>
|
||||||
|
body { text-align: center; font-family: Arial, sans-serif; }
|
||||||
|
.light-container { display: inline-block; margin-top: 50px; }
|
||||||
|
.light { width: 80px; height: 80px; margin: 10px; border-radius: 50%; background: gray; }
|
||||||
|
.red { background: red; }
|
||||||
|
.yellow { background: yellow; }
|
||||||
|
.green { background: green; }
|
||||||
|
</style>
|
||||||
|
<script src="frontend.js" defer></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Traffic Light</h1>
|
||||||
|
<div class="light-container">
|
||||||
|
<div id="red" class="light {% if state == 'red' %}red{% endif %}"></div>
|
||||||
|
<div id="yellow" class="light"></div>
|
||||||
|
<div id="green" class="light {% if state == 'green' %}green{% endif %}"></div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<button onclick="toggleLight()">Toggle Green</button>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user