dashboard/dash.py
#/bin/python#Author: Matias Menares @matiasmenares#Modulesfrom flask import Flask, render_templatefrom flask_socketio import SocketIO, emitfrom flask_cors import CORS, cross_originfrom flask_restful import Apifrom wifi import Cell, Schemefrom threading import Lockimport threadingimport os import random#Corefrom core.ecu import Ecufrom core.database import Databasefrom core.accelerometer import Accelerometerfrom core.gps import Gpsfrom core.analog import Analogfrom core.output import Output#APIfrom api.dashboard import Dashboardfrom api.system import Systemfrom api.measure import Measurefrom api.var_config import VarConfig from api.measure_group import MeasureGroupfrom api.settings.kinek_setting import KinekSettingfrom api.settings.screen_setting import ScreenSettingfrom api.settings.water_setting import WaterSettingfrom api.settings.alarm_type_setting import AlarmTypeSettingfrom api.settings.channels.input import InputChannelfrom api.settings.channels.obd import OBDChannelfrom api.settings.channels.consult import ConsultChannelfrom api.settings.channels.analog import AnalogChannelfrom api.settings.channels.output import OutputChannelfrom api.settings.condition_setting import ConditionSettingfrom api.settings.alarm_setting import AlarmSettingfrom api.settings.led_setting import LedSetting from urllib.request import urlopenimport serialimport randomimport socketioimport structimport timeimport argparse #Async async_mode = Noneif async_mode is None: try: import eventlet async_mode = 'eventlet' except ImportError: pass if async_mode is None: try: from gevent import monkey async_mode = 'gevent' except ImportError: pass if async_mode is None: async_mode = 'threading' print('async_mode is ' + async_mode) # monkey patching is necessary because this application uses a background# threadif async_mode == 'eventlet': import eventlet eventlet.monkey_patch()elif async_mode == 'gevent': from gevent import monkey monkey.patch_all() #Argumentsparser = argparse.ArgumentParser()parser.add_argument("-e", help="Enviroments")parser.add_argument("-d", help="ECU USB Devise")parser.add_argument("-g", help="GPS USB Devise")parser.add_argument("-a", help="Analog USB Devise")params = parser.parse_args()#WebServerapp = Flask(__name__)app.config['SECRET_KEY'] = random.getrandbits(128)app.config['CORS_HEADERS'] = 'Content-Type'socketio = SocketIO(app, cors_allowed_origins="*", async_mode=async_mode) #APIapi = Api(app)cors = CORS(app, resources={r"*": {"origins": "*"}})api.add_resource(System, '/system')api.add_resource(VarConfig, '/var_config')api.add_resource(Dashboard, '/dashboards') api.add_resource(KinekSetting, '/settings/kinek')api.add_resource(AlarmSetting, '/settings/alarms') api.add_resource(LedSetting, '/settings/leds') api.add_resource(ConditionSetting, '/settings/conditions')api.add_resource(AlarmTypeSetting, '/settings/alarm_types')api.add_resource(ScreenSetting, '/settings/screen') api.add_resource(WaterSetting, '/settings/water')api.add_resource(AnalogChannel, '/settings/channels/input/analog')api.add_resource(OBDChannel, '/settings/channels/input/obd')api.add_resource(ConsultChannel, '/settings/channels/input/consult')api.add_resource(InputChannel, '/settings/channels/input')api.add_resource(OutputChannel, '/settings/channels/output')api.add_resource(Measure, '/measures')api.add_resource(MeasureGroup, '/measure_groups')#Databased = Database()d.init()#Threadsthread = Nonethread_lock = Lock() @socketio.on('connect')def test_connect(): print("Websocket Connected") global thread with thread_lock: if thread is None: internet = threading.Thread(target=internet_on, daemon=True) internet.start() internet = socketio.start_background_task(internet_on) output = threading.Thread(target=set_output, daemon=True) output.start() output = socketio.start_background_task(set_output) accelerometer = socketio.start_background_task(set_accelerometer) gps = socketio.start_background_task(set_gps) def set_output(): out.start() def set_accelerometer(): acc.start() def set_gps(): gps.start() def internet_on(): while True: list = ['http://apptec.cl', 'https://google.com', 'https://facebook.com', 'https://reddit.com', 'https://twitter.com'] try: urlopen(random.choice(list), timeout=3) socketio.emit('InternetConnection', {'status': True}) time.sleep(3) except: socketio.emit('InternetConnection', {'status': False}) time.sleep(2)#Init 1def main(params): socketio.run(app, host= '0.0.0.0', debug=True) if __name__ == '__main__': acc = Accelerometer(socketio) gps = Gps(socketio, params.g, serial) out = Output(socketio, serial, params.a, params.d, params.e) try: main(params)except (KeyboardInterrupt, EOFError): log.info('Exiting.')