From 3e21d0285cfc51dc140685bd36f98114382ac9a5 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 4 Oct 2020 15:49:28 +0100 Subject: [PATCH] Added basic flask server for node operation, still need LED driving... --- light_node/event_loop.py | 76 +++++++++++++++++++++++++++++++++++ light_node/main_led_server.py | 49 ---------------------- 2 files changed, 76 insertions(+), 49 deletions(-) create mode 100644 light_node/event_loop.py delete mode 100644 light_node/main_led_server.py diff --git a/light_node/event_loop.py b/light_node/event_loop.py new file mode 100644 index 0000000..ab65555 --- /dev/null +++ b/light_node/event_loop.py @@ -0,0 +1,76 @@ +from flask import Flask, abort, jsonify, make_response, request +from colorsys import hsv_to_rgb + + +class Led: + __IFACE_PIN = 18 + __COLOR_OFFSET = 0 + + def __init__(self, power, brightness, color_angle): + self.power = power + self.brightness = brightness + self.color_angle = color_angle + self.iface_pin = self.__IFACE_PIN + + def update(self): + rgb = self.angle_2_rgb() + r, g, b = rgb + print(f"Setting LED strip to RGB: {r}, {g}, {b}") + + def angle_2_rgb(self): + r, g, b = hsv_to_rgb((self.color_angle+self.__COLOR_OFFSET)/360, 1, self.brightness/255) + r *= 255 + g *= 255 + b *= 255 + return (r, g, b) + + def json_state(self): + state = {'power': self.power, + 'brightness': self.brightness, + 'color': self.color_angle} + return state + + +led = Led(False, 0, 0) +server = Flask('Light_Node') + + +def init_server(): + @server.errorhandler(404) + def not_found(error): + return make_response(jsonify({'error': 'Not found'}), 404) + + @server.errorhandler(400) + def bad_request(error='other'): + return make_response(jsonify({'error': 'Bad request'}), 400) + + @server.errorhandler(501) + def server_crash(error): + return make_response(jsonify({'error': 'Server crashed, check logs'}), 501) + + @server.route('/setState', methods=['POST', 'GET']) + def change_led_state(): + try: + print(request) + new_state = request.json + print(f"New state: {new_state}") + led.power = bool(new_state['power']) + led.brightness = int(new_state['brightness']) + led.color_angle = int(new_state['color']) + led.update() + return jsonify({"success": True}) + except: + return bad_request() + pass + + @server.route('/', methods=['GET']) + def main_tab(): + return jsonify(led.json_state()) + + +def start_server(): + server.run(debug=True) + + +init_server() +start_server() diff --git a/light_node/main_led_server.py b/light_node/main_led_server.py deleted file mode 100644 index d858c8e..0000000 --- a/light_node/main_led_server.py +++ /dev/null @@ -1,49 +0,0 @@ -from flask import Flask, abort, jsonify, make_response, request, send_from_directory - - -class Led: - __IFACE_PIN = 18 - def __init__(self, power, brightness, color_angle): - self.power = power - self.brightness = brightness - self.color_angle = color_angle - self.iface_pin = self.__IFACE_PIN - - def change_state(self, power, brightness, color_angle): - pass - - def angle_2_rgb(self, angle): - pass - - -class LightNode: - def __init__(self): - self.led = Led(False, 0, 0) - self.server = Flask('light_node') - - def init_server(self): - @self.server.errorhandler(404) - def not_found(self, error): - return make_response(jsonify({'error': 'Not found'}), 404) - - @self.server.errorhandler(400) - def bad_request(self, error): - # Happens when unexpected request sent to observer - return make_response(jsonify({'error': 'Bad request'}), 400) - - @self.server.errorhandler(501) - def server_crash(sef, error): - # This only happens when a sensor fails to initialise - return make_response(jsonify({'error': 'Server crashed, check logs'}), 501) - - @self.server.route('/setState', methhods=['POST']) - def change_led_state(self): - try: - new_state = request.json - self.led.power = bool(new_state['power']) - self.led.brightness = int(new_state['brightness']) - self.led.color = int(new_state['color']) - return jsonify({"success":True}) - except: - self.bad_request() - pass