2023-11-09 19:07:34 +00:00
|
|
|
#! /usr/bin/env python3
|
|
|
|
|
|
|
|
from flask import Flask, request, send_from_directory, Response
|
|
|
|
import random
|
|
|
|
import os
|
|
|
|
|
|
|
|
app = Flask(__name__)
|
|
|
|
PORT_FROM_ENV = os.environ.get('PORT')
|
|
|
|
if PORT_FROM_ENV:
|
|
|
|
PORT = PORT_FROM_ENV
|
|
|
|
else:
|
|
|
|
PORT = "3000"
|
|
|
|
|
|
|
|
static_file_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/', methods=['GET'])
|
|
|
|
def serve_index():
|
2024-02-26 23:25:12 +00:00
|
|
|
return send_from_directory(static_file_dir, 'index.html')
|
2023-11-09 19:07:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
@app.route('/<path:path>', methods=['GET'])
|
|
|
|
def serve_file_in_dir(path):
|
2024-02-26 23:25:12 +00:00
|
|
|
if not os.path.isfile(os.path.join(static_file_dir, path)):
|
|
|
|
path = os.path.join(path, 'index.html')
|
|
|
|
print("Serving local file : {}".format(path))
|
|
|
|
return send_from_directory(static_file_dir, path)
|
|
|
|
|
2023-11-09 19:07:34 +00:00
|
|
|
|
|
|
|
# Generate a random 12-bit integer (0 to 4095)
|
2024-02-26 23:25:12 +00:00
|
|
|
def random_12_bit_int():
|
2024-03-11 08:18:21 +00:00
|
|
|
return random.randint(0, 0b111111111111)
|
2024-02-26 23:25:12 +00:00
|
|
|
|
2023-11-09 19:07:34 +00:00
|
|
|
|
|
|
|
# Convert a binary stream to 24 integers
|
|
|
|
def binary_stream_to_ints(binary_data):
|
|
|
|
integers = []
|
|
|
|
# Every 32-bit integer is represented by 2 bytes
|
2024-02-26 23:25:12 +00:00
|
|
|
for i in range(0, len(binary_data), 2):
|
2024-04-04 16:58:37 +00:00
|
|
|
integers.append(int.from_bytes(binary_data[i:i + 2], byteorder='big') & 0b111111111111) # Extract 32-bit value
|
2023-11-09 19:07:34 +00:00
|
|
|
return integers
|
|
|
|
|
2024-02-26 23:25:12 +00:00
|
|
|
|
2023-11-09 19:07:34 +00:00
|
|
|
@app.route('/api/schedule/<int:plug_id>', methods=['GET'])
|
2024-02-26 23:25:12 +00:00
|
|
|
|
2023-11-09 19:07:34 +00:00
|
|
|
def get_schedule(plug_id):
|
|
|
|
# Generate 24 random 32-bit integers
|
2024-02-26 23:25:12 +00:00
|
|
|
schedule = [random_12_bit_int() for _ in range(24)]
|
|
|
|
|
|
|
|
# Convert 24 integers to a binary stream
|
|
|
|
def ints_to_binary_stream(integers):
|
|
|
|
for integer in integers:
|
|
|
|
# Ensure integer is in 12-bit range
|
|
|
|
integer &= 0b111111111111
|
|
|
|
# Convert to bytes and append
|
2024-04-04 16:58:37 +00:00
|
|
|
yield integer.to_bytes(2, byteorder='big') # 2 bytes per integer
|
2024-02-26 23:25:12 +00:00
|
|
|
|
|
|
|
# Return as a binary stream
|
|
|
|
return Response(ints_to_binary_stream(schedule), status=200, content_type='application/octet-stream')
|
|
|
|
|
2023-11-09 19:07:34 +00:00
|
|
|
|
|
|
|
@app.route('/api/schedule/<int:plug_id>', methods=['POST'])
|
|
|
|
def update_schedule(plug_id):
|
|
|
|
# Get binary data from the request
|
|
|
|
binary_data = request.data
|
|
|
|
# Convert binary stream to integers
|
|
|
|
new_schedule = binary_stream_to_ints(binary_data)
|
|
|
|
print(f"Received new schedule for plug {plug_id}: {new_schedule}")
|
|
|
|
# Respond with a success message in binary format
|
2024-02-26 23:25:12 +00:00
|
|
|
return Response(b'Update successful', status=200, content_type='text/plain')
|
2023-11-09 19:07:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
app.run(
|
|
|
|
host="0.0.0.0",
|
|
|
|
port=PORT,
|
|
|
|
use_debugger=True
|
|
|
|
)
|