- refactored
- integrated stirrer
This commit is contained in:
@@ -6,8 +6,8 @@ from ws.server.ws_server_multi_user import WsServerMultiUser
|
|||||||
from components.sensor import TempSensorFactory
|
from components.sensor import TempSensorFactory
|
||||||
from components.pid import TempController
|
from components.pid import TempController
|
||||||
from components.plant import Pot
|
from components.plant import Pot
|
||||||
from components.actor import HeaterFactory
|
from components.actor import HeaterFactory, StirrerFactory
|
||||||
from tasks import TaskManager, TempSensorTask, HeaterTask, PotTask, TcTask
|
from tasks import TaskManager, TempSensorTask, HeaterTask, PotTask, TcTask, StirrerTask
|
||||||
|
|
||||||
DT_CTRL = 0.1
|
DT_CTRL = 0.1
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ if __name__ == '__main__':
|
|||||||
taskmgr.add(PotTask(pot, DT_CTRL, dispatcher.msgio_get("Pot")))
|
taskmgr.add(PotTask(pot, DT_CTRL, dispatcher.msgio_get("Pot")))
|
||||||
|
|
||||||
# Heater
|
# Heater
|
||||||
heater = HeaterFactory.create(config['Controller']['heater_name'])
|
heater = HeaterFactory.create(config['Controller']['heater_name'], config['Heater'])
|
||||||
heater.set_on_changed("power_eff", ChangedFloat(pot.set_power, prec=0).set)
|
heater.set_on_changed("power_eff", ChangedFloat(pot.set_power, prec=0).set)
|
||||||
heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater"))
|
heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater"))
|
||||||
taskmgr.add(heater_task)
|
taskmgr.add(heater_task)
|
||||||
@@ -45,6 +45,11 @@ if __name__ == '__main__':
|
|||||||
taskmgr.add(tc_task)
|
taskmgr.add(tc_task)
|
||||||
sensor.set_on_changed("temp", ChangedFloat(tc.set_theta_ist, prec=2).set)
|
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)
|
||||||
|
|
||||||
# Message dispatcher
|
# Message dispatcher
|
||||||
h_dispatcher = taskmgr.start()
|
h_dispatcher = taskmgr.start()
|
||||||
h_server = server.listen("0.0.0.0", 8765)
|
h_server = server.listen("0.0.0.0", 8765)
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
from components.actor.heaterFactory import HeaterFactory
|
from components.actor.heaterFactory import HeaterFactory
|
||||||
|
from components.actor.stirrerFactory import StirrerFactory
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
class HeaterFactory:
|
class HeaterFactory:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create(name):
|
def create(name, params):
|
||||||
if "sim" in name:
|
if "sim" in name:
|
||||||
from components.actor.heater_sim import HeaterSim
|
from components.actor.heater_sim import HeaterSim
|
||||||
return HeaterSim()
|
return HeaterSim()
|
||||||
elif "Hendi" in name:
|
elif "Hendi" in name:
|
||||||
from components.actor.heater_hendi import HeaterHendi
|
from components.actor.heater_hendi import HeaterHendi
|
||||||
return HeaterHendi('/dev/ttyUSB0', 115200)
|
return HeaterHendi(params)
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ from hendiCtrl import HendiCtrl
|
|||||||
|
|
||||||
|
|
||||||
class HeaterHendi(AHeater):
|
class HeaterHendi(AHeater):
|
||||||
def __init__(self, port, baudrate):
|
def __init__(self, params):
|
||||||
AHeater.__init__(self)
|
AHeater.__init__(self)
|
||||||
self.power_set = self.get_power_min()
|
self.power_set = self.get_power_min()
|
||||||
self.is_active = False
|
self.is_active = False
|
||||||
self.power_eff = 0
|
self.power_eff = 0
|
||||||
self.hendi = HendiCtrl(port, baudrate)
|
self.hendi = HendiCtrl(params['port'], params['baudrate'])
|
||||||
|
|
||||||
def get_power_min(self):
|
def get_power_min(self):
|
||||||
caps = self.hendi.getCapabilties()
|
caps = self.hendi.getCapabilties()
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
class StirrerFactory:
|
class StirrerFactory:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create(name, dt):
|
def create(name, params):
|
||||||
if "sim" in name:
|
if "sim" in name:
|
||||||
from components.actor.stirrersim import StirrerSim
|
from components.actor.stirrersim import StirrerSim
|
||||||
return StirrerSim(dt)
|
return StirrerSim(params)
|
||||||
elif "1376" in name:
|
elif "1376" in name:
|
||||||
from components.actor.stirrerpololu1376 import StirrerPololu1376
|
from components.actor.stirrerpololu1376 import StirrerPololu1376
|
||||||
return StirrerPololu1376(dt, '/dev/ttyUSB0', 115200)
|
return StirrerPololu1376(params)
|
||||||
@@ -8,7 +8,7 @@ class StirrerPololu1376(AStirrer):
|
|||||||
return "Pololu1376"
|
return "Pololu1376"
|
||||||
|
|
||||||
def __init__(self, dt, port, baudrate):
|
def __init__(self, dt, port, baudrate):
|
||||||
super(StirrerPololu1376, self).__init__(dt)
|
AStirrer.__init__(self, dt)
|
||||||
self.isMasterOn = 0
|
self.isMasterOn = 0
|
||||||
|
|
||||||
self.ser_speed = baudrate
|
self.ser_speed = baudrate
|
||||||
|
|||||||
@@ -3,11 +3,8 @@ import time
|
|||||||
|
|
||||||
|
|
||||||
class StirrerSim(AStirrer):
|
class StirrerSim(AStirrer):
|
||||||
def name(self):
|
def __init__(self, params):
|
||||||
return "FakeStirrer"
|
AStirrer.__init__(self, params['dt'])
|
||||||
|
|
||||||
def __init__(self, dt):
|
|
||||||
super(StirrerSim, self).__init__(dt)
|
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
self.activate(False)
|
self.activate(False)
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
import abc
|
import abc
|
||||||
|
from utils.value import AttributeChange
|
||||||
|
|
||||||
|
|
||||||
class AStirrer:
|
class AStirrer(AttributeChange):
|
||||||
@abc.abstractmethod
|
|
||||||
def name(self):
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def __init__(self, dt):
|
def __init__(self, dt):
|
||||||
|
AttributeChange.__init__(self)
|
||||||
self.dt = dt
|
self.dt = dt
|
||||||
self.speed = 0
|
self.speed = 0
|
||||||
self.cycleTime = 1
|
self.cycleTime = 1
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from tasks.task import *
|
from tasks.task import *
|
||||||
from tasks.tempsensor import *
|
from tasks.tempsensor import *
|
||||||
from tasks.heater import *
|
from tasks.heater import *
|
||||||
|
from tasks.stirrer import *
|
||||||
from tasks.pot import *
|
from tasks.pot import *
|
||||||
from tasks.tempctrl import *
|
from tasks.tempctrl import *
|
||||||
|
|||||||
+1
-1
@@ -1,8 +1,8 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from tasks import ATask
|
from tasks import ATask
|
||||||
from components.plant import APlant
|
|
||||||
from ws.message import MsgIo
|
from ws.message import MsgIo
|
||||||
from utils.value import ChangedInteger, ChangedFloat
|
from utils.value import ChangedInteger, ChangedFloat
|
||||||
|
from components.plant import APlant
|
||||||
|
|
||||||
|
|
||||||
class PotTask(ATask):
|
class PotTask(ATask):
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import asyncio
|
||||||
|
from tasks import ATask
|
||||||
|
from ws.message import MsgIo
|
||||||
|
from components import AStirrer
|
||||||
|
|
||||||
|
|
||||||
|
class StirrerTask(ATask):
|
||||||
|
def __init__(self, stirrer_device: AStirrer, interval, msg_handler: MsgIo):
|
||||||
|
ATask.__init__(self, interval)
|
||||||
|
self.msg_handler = msg_handler
|
||||||
|
msg_handler.set_recv_handler(self.recv)
|
||||||
|
self.device = stirrer_device
|
||||||
|
|
||||||
|
def on_speed_changed(self, value):
|
||||||
|
asyncio.create_task(self.send({'Speed': value}))
|
||||||
|
|
||||||
|
def on_dutycycle_changed(self, value):
|
||||||
|
asyncio.create_task(self.send({'DutyCycle': value}))
|
||||||
|
|
||||||
|
def on_cycletime_changed(self, value):
|
||||||
|
asyncio.create_task(self.send({'CycleTime': value}))
|
||||||
|
|
||||||
|
async def recv(self, data):
|
||||||
|
print(data)
|
||||||
|
|
||||||
|
async def send(self, data):
|
||||||
|
await self.msg_handler.send(data)
|
||||||
|
|
||||||
|
async def on_process(self):
|
||||||
|
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
||||||
|
self.device.set_on_changed("speed", self.on_speed_changed)
|
||||||
|
self.device.set_on_changed("dutyCycle", self.on_dutycycle_changed)
|
||||||
|
self.device.set_on_changed("cycleTime", self.on_cycletime_changed)
|
||||||
|
while True:
|
||||||
|
self.device.process()
|
||||||
|
await asyncio.sleep(self.interval)
|
||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from tasks import ATask
|
from tasks import ATask
|
||||||
from components.pid import TempController
|
|
||||||
from utils.value import ChangedFloat
|
|
||||||
from ws.message import MsgIo
|
from ws.message import MsgIo
|
||||||
|
from utils.value import ChangedFloat
|
||||||
|
from components.pid import TempController
|
||||||
|
|
||||||
|
|
||||||
class TcTask(ATask):
|
class TcTask(ATask):
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from tasks import ATask
|
from tasks import ATask
|
||||||
from components import ATemperatureSensor
|
|
||||||
from utils.value import ChangedFloat
|
|
||||||
from ws.message import MsgIo
|
from ws.message import MsgIo
|
||||||
|
from utils.value import ChangedFloat
|
||||||
|
from components import ATemperatureSensor
|
||||||
|
|
||||||
|
|
||||||
class TempSensorTask(ATask):
|
class TempSensorTask(ATask):
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
class Value:
|
class Value:
|
||||||
def __init__(self, initial=None):
|
def __init__(self, initial=None):
|
||||||
self.value = initial
|
self.value = initial
|
||||||
|
|||||||
Reference in New Issue
Block a user