60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
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, StirrerFactory
|
|
from tasks import TaskManager, TempSensorTask, HeaterTask, PotTask, TcTask, StirrerTask, TracerTask
|
|
|
|
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']
|
|
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'], config['Heater'])
|
|
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)
|
|
|
|
# Stirrer
|
|
stirrer = StirrerFactory.create(config['Controller']['stirrer_name'], config['Stirrer'])
|
|
stirrer_task = StirrerTask(stirrer, DT_CTRL, dispatcher.msgio_get("Stirrer"))
|
|
taskmgr.add(stirrer_task)
|
|
|
|
# Tracer
|
|
taskmgr.add(TracerTask(sensor, tc, DT_CTRL, dispatcher.msgio_get("Tracer")))
|
|
|
|
# Message dispatcher
|
|
h_dispatcher = taskmgr.start()
|
|
h_server = server.listen("0.0.0.0", 8765)
|
|
asyncio.gather(h_dispatcher, h_server)
|
|
server.run_forever()
|