import asyncio import json from utils import ChangedFloat from ws.message import MessageDispatcher from ws.server.ws_server_multi_user import WsServerMultiUser from components.sensor import TempSensorFactory from components.pid import TempController from components.plant import Pot from components.actor import HeaterFactory from tasks import TaskManager, TempSensorTask, HeaterTask, PotTask, TcTask DT_CTRL = 0.1 if __name__ == '__main__': config = json.load(open("config.json")) dispatcher = MessageDispatcher() server = WsServerMultiUser(listener=dispatcher) taskmgr = TaskManager() DT_CTRL = 1.0/config['Controller']['sim_warp_factor'] # Sensor sensor = TempSensorFactory.create(config['Controller']['sensor_name']) taskmgr.add(TempSensorTask(sensor, DT_CTRL, dispatcher.msgio_get("Sensor"))) # Plant pot_params = config['Plant'] if "sim" in config['Controller']['plant_name']: pot = Pot(pot_params, 20) if "sim" in config['Controller']['sensor_name']: pot.set_on_changed("temp", ChangedFloat(sensor.set_fake_temp, prec=3).set) taskmgr.add(PotTask(pot, DT_CTRL, dispatcher.msgio_get("Pot"))) # Heater heater = HeaterFactory.create(config['Controller']['heater_name']) heater.set_on_changed("power_eff", ChangedFloat(pot.set_power, prec=0).set) heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater")) taskmgr.add(heater_task) # Temperature Controller tc_params = config['TempCtrl'] tc = TempController(tc_params) tc.set_on_changed("y", heater_task.actor) tc_task = TcTask(tc, DT_CTRL, dispatcher.msgio_get("TempCtrl")) taskmgr.add(tc_task) sensor.set_on_changed("temp", ChangedFloat(tc.set_theta_ist, prec=2).set) # Message dispatcher h_dispatcher = taskmgr.start() h_server = server.listen("0.0.0.0", 8765) asyncio.gather(h_dispatcher, h_server) server.run_forever()