import asyncio import json 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 from ws.message import MessageDispatcher from utils.value import ChangedFloat from tasks import 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()