#!/usr/bin/python3 from flask import request, send_from_directory from flask_api import FlaskAPI import RPi.GPIO as GPIO import shutil import os #local imports from xml_reader import Xml_reader from interface_handler import Interface_handler # setup xml_reader and interface_handler dir = os.path.dirname(os.path.abspath(__file__)) xml_reader = Xml_reader(str(dir + '/XML/config.xml'), str(dir + '/XML/config.xsd')) interface_handler = Interface_handler(xml_reader) app = FlaskAPI(__name__) @app.route('/', methods=["GET"]) def api_root(): """method for the root of the API Returns: html: a welcom message """ return "

Success. You have reached the root of the APED API.

" @app.route('/XML/', methods=["GET","POST"]) def xml_transfer(): """method for transfering the config.xml files to and from the raspberry Returns: the config.xml or the occured errors """ try: #return the current config.xml if request.method == "GET": return send_from_directory(str(dir + '/XML'), 'config.xml') # set a new config.xml if request.method == "POST": if not os.path.exists('/tmp/aped_device'): os.mkdir("/tmp/aped_device") tmp_file = open("/tmp/aped_device/config.xml","w") data = request.get_data(as_text=True) tmp_file.write(data) tmp_file.close() #check config.xml against the XSD file if xml_reader.validate('/tmp/aped_device/config.xml', str(dir + '/XML/config.xsd')): shutil.move(str(dir + '/XML/config.xml'), str(dir + '/XML/config_old.xml')) shutil.move('/tmp/aped_device/config.xml', str(dir + '/XML/config.xml')) xml_reader.set_root(str(dir + '/XML/config.xml')) interface_handler.init_gpio() interface_handler.init_buffer() else: SyntaxError('the config.xml has invalid content') return {'error': ''} except Exception as e: return {'error' : str(e)} @app.route('/device/', methods=["GET"]) def api_general_device_info(): """method to read all the available device names Returns: JSON: the available device names """ return {"device_names": str(xml_reader.get_device_names())} @app.route('/device//', defaults={'buffering': None}, methods=["GET", "POST"]) @app.route('/device///', methods=["GET", "POST"]) def api_devices(device_name: str, buffering: str): """the method for reading and writing to and from the connected devices Args: device_name (str): the name of the relevant device buffering (str): whether or not the buffer of the device is requested Returns: the relevant information about the device in JSON format """ try: if request.method == "POST": response = interface_handler.write(device_name, request.data.get("output")) if buffering == 'buffer': return {'buffer': interface_handler.read_buffer(device_name)} else: return {'state': interface_handler.read(device_name)} except Exception as e: return {'error': str(e)} if __name__ == "__main__": app.run(port=8080,host="0.0.0.0")