- redefine activate method
- for task introduced open() conext method
This commit is contained in:
@@ -7,7 +7,6 @@ class HeaterHendi(AHeater):
|
|||||||
AHeater.__init__(self)
|
AHeater.__init__(self)
|
||||||
self.hendi = HendiCtrl(params['port'], params['speed'])
|
self.hendi = HendiCtrl(params['port'], params['speed'])
|
||||||
self.power_set = self.get_power_min()
|
self.power_set = self.get_power_min()
|
||||||
self.is_active = False
|
|
||||||
self.power_eff = 0
|
self.power_eff = 0
|
||||||
|
|
||||||
def get_power_min(self):
|
def get_power_min(self):
|
||||||
@@ -19,21 +18,21 @@ class HeaterHendi(AHeater):
|
|||||||
return caps['pwr_watts_max']
|
return caps['pwr_watts_max']
|
||||||
|
|
||||||
def activate(self, enable):
|
def activate(self, enable):
|
||||||
self.is_active = enable
|
|
||||||
if not self.hendi.isRemoteEnable():
|
|
||||||
self.hendi.remoteEnable(1)
|
|
||||||
|
|
||||||
if enable:
|
if enable:
|
||||||
self.hendi.setSwitch(1)
|
self.hendi.remoteEnable(1)
|
||||||
else:
|
else:
|
||||||
self.hendi.setSwitch(0)
|
self.hendi.remoteEnable(0)
|
||||||
|
|
||||||
def is_activated(self):
|
def is_activated(self):
|
||||||
s = self.hendi.getSwitch()
|
s = self.hendi.isRemoteEnable()
|
||||||
return '1' in s
|
return '1' in s
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
power = self.power_set if self.is_active else 0
|
power = self.power_set
|
||||||
|
if power == 0:
|
||||||
|
self.hendi.setSwitch(0)
|
||||||
|
else:
|
||||||
|
self.hendi.setSwitch(1)
|
||||||
self.hendi.setPowerWatts(power)
|
self.hendi.setPowerWatts(power)
|
||||||
self.power_eff = self.hendi.getPowerWatts()
|
self.power_eff = self.hendi.getPowerWatts()
|
||||||
|
|
||||||
@@ -41,5 +40,4 @@ class HeaterHendi(AHeater):
|
|||||||
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
|
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
|
||||||
|
|
||||||
def get_power(self):
|
def get_power(self):
|
||||||
result = self.hendi.getPowerWatts()
|
return self.power_eff
|
||||||
return result
|
|
||||||
|
|||||||
@@ -47,15 +47,13 @@ class StirrerPololu1376(AStirrer):
|
|||||||
return self.speed
|
return self.speed
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def on_activate(self, enable):
|
def activate(self, enable):
|
||||||
|
print("activate {}".format(enable))
|
||||||
if enable:
|
if enable:
|
||||||
self.ser_send("go")
|
self.ser_send("go")
|
||||||
self.set_speed(self.speed)
|
|
||||||
else:
|
else:
|
||||||
self.ser_send("X")
|
self.ser_send("X")
|
||||||
|
|
||||||
print("on_activate {}".format(enable))
|
|
||||||
|
|
||||||
def on_set_speed(self, speed):
|
def on_set_speed(self, speed):
|
||||||
self.ser_send("F" + str(int(speed)) + "%")
|
self.ser_send("F" + str(int(speed)) + "%")
|
||||||
print("Set speed to {} %".format(speed))
|
print("Set speed to {} %".format(speed))
|
||||||
|
|||||||
@@ -6,11 +6,8 @@ class StirrerSim(AStirrer):
|
|||||||
def __init__(self, params):
|
def __init__(self, params):
|
||||||
AStirrer.__init__(self, params['dt'])
|
AStirrer.__init__(self, params['dt'])
|
||||||
|
|
||||||
def __del__(self):
|
def activate(self, enable):
|
||||||
self.activate(False)
|
print("activate {}".format(enable))
|
||||||
|
|
||||||
def on_activate(self, enable):
|
|
||||||
print("on_activate {}".format(enable))
|
|
||||||
|
|
||||||
def get_speed(self):
|
def get_speed(self):
|
||||||
if self.isOn and self.is_activated():
|
if self.isOn and self.is_activated():
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import abc
|
import abc
|
||||||
from utils.value import AttributeChange
|
from utils.value import AttributeChange
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
|
||||||
class AHeater(AttributeChange):
|
class AHeater(AttributeChange):
|
||||||
@@ -14,6 +15,16 @@ class AHeater(AttributeChange):
|
|||||||
def get_power_max(self):
|
def get_power_max(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def open(self):
|
||||||
|
try:
|
||||||
|
self.activate(True)
|
||||||
|
yield None
|
||||||
|
finally:
|
||||||
|
self.activate(False)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def activate(self, enable):
|
def activate(self, enable):
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -1,15 +1,30 @@
|
|||||||
import abc
|
import abc
|
||||||
from utils.value import AttributeChange
|
from utils.value import AttributeChange
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
|
||||||
class APlant(AttributeChange):
|
class APlant(AttributeChange):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
AttributeChange.__init__(self)
|
AttributeChange.__init__(self)
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def open(self):
|
||||||
|
try:
|
||||||
|
self.activate(True)
|
||||||
|
yield None
|
||||||
|
finally:
|
||||||
|
self.activate(False)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def activate(self, enable):
|
def activate(self, enable):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def is_activated(self):
|
||||||
|
return None
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def process(self):
|
def process(self):
|
||||||
pass
|
pass
|
||||||
|
|||||||
+14
-7
@@ -1,5 +1,6 @@
|
|||||||
import abc
|
import abc
|
||||||
from utils.value import AttributeChange
|
from utils.value import AttributeChange
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
|
||||||
class AStirrer(AttributeChange):
|
class AStirrer(AttributeChange):
|
||||||
@@ -11,7 +12,6 @@ class AStirrer(AttributeChange):
|
|||||||
self.dutyCycle = 1
|
self.dutyCycle = 1
|
||||||
self.cycleCounter = 0
|
self.cycleCounter = 0
|
||||||
self.isOn = 1
|
self.isOn = 1
|
||||||
self.is_active = False
|
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
isOn = self.isOn
|
isOn = self.isOn
|
||||||
@@ -51,14 +51,21 @@ class AStirrer(AttributeChange):
|
|||||||
def on_set_speed(self, speed):
|
def on_set_speed(self, speed):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def open(self):
|
||||||
|
try:
|
||||||
|
self.activate(True)
|
||||||
|
yield None
|
||||||
|
finally:
|
||||||
|
self.activate(False)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def on_activate(self, enable):
|
def activate(self, enable):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def activate(self, enable):
|
@abc.abstractmethod
|
||||||
self.is_active = enable
|
|
||||||
self.on_activate(enable)
|
|
||||||
|
|
||||||
def is_activated(self):
|
def is_activated(self):
|
||||||
return self.is_active
|
pass
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ class Pot(APlant):
|
|||||||
leak = 1/self.M * self.L * (self.theta_amb - self.temp)/self.theta_amb
|
leak = 1/self.M * self.L * (self.theta_amb - self.temp)/self.theta_amb
|
||||||
self.temp += (self.power_actual / (self.M * self.C) + leak) * self.dt
|
self.temp += (self.power_actual / (self.M * self.C) + leak) * self.dt
|
||||||
|
|
||||||
|
def is_activated(self):
|
||||||
|
return True
|
||||||
|
|
||||||
def set_power(self, power):
|
def set_power(self, power):
|
||||||
self.power_set = power
|
self.power_set = power
|
||||||
|
|
||||||
|
|||||||
+25
-28
@@ -6,10 +6,10 @@ from utils.value import ChangedInteger
|
|||||||
|
|
||||||
|
|
||||||
class HeaterTask(ATask):
|
class HeaterTask(ATask):
|
||||||
def __init__(self, heater_device: AHeater, interval, msg_handler: MsgIo):
|
def __init__(self, device: AHeater, interval, msg_handler: MsgIo):
|
||||||
ATask.__init__(self, interval)
|
ATask.__init__(self, interval)
|
||||||
|
|
||||||
self.heater = heater_device
|
self.device = device
|
||||||
self.interval = interval
|
self.interval = interval
|
||||||
self.msg_handler = msg_handler
|
self.msg_handler = msg_handler
|
||||||
msg_handler.set_recv_handler(self.recv)
|
msg_handler.set_recv_handler(self.recv)
|
||||||
@@ -17,7 +17,7 @@ class HeaterTask(ATask):
|
|||||||
self.pulse_counter = 0
|
self.pulse_counter = 0
|
||||||
|
|
||||||
def actor(self, y):
|
def actor(self, y):
|
||||||
self.power_soll = max(0, 250 + self.heater.get_power_max() * y)
|
self.power_soll = max(0, 250 + self.device.get_power_max() * y)
|
||||||
|
|
||||||
def on_changed_active(self, is_activated):
|
def on_changed_active(self, is_activated):
|
||||||
asyncio.create_task(self.send({'Activate': int(is_activated)}))
|
asyncio.create_task(self.send({'Activate': int(is_activated)}))
|
||||||
@@ -29,45 +29,42 @@ class HeaterTask(ATask):
|
|||||||
for pair in data.items():
|
for pair in data.items():
|
||||||
if 'Power' in pair[0]:
|
if 'Power' in pair[0]:
|
||||||
self.power_soll = pair[1]
|
self.power_soll = pair[1]
|
||||||
if 'Activate' in pair[0]:
|
|
||||||
self.heater.activate(pair[1] == 1)
|
|
||||||
|
|
||||||
async def send(self, data):
|
async def send(self, data):
|
||||||
await self.msg_handler.send(data)
|
await self.msg_handler.send(data)
|
||||||
|
|
||||||
async def on_process(self):
|
async def on_process(self):
|
||||||
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
||||||
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.heater.get_power_max()}}})
|
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}})
|
||||||
|
|
||||||
self.heater.set_on_changed('is_active', ChangedInteger(self.on_changed_active).set)
|
self.device.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
|
||||||
self.heater.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
|
|
||||||
self.heater.activate(False)
|
|
||||||
|
|
||||||
pulse_period_s = 1
|
pulse_period_s = 1
|
||||||
pulse_period_count = pulse_period_s/self.interval
|
pulse_period_count = pulse_period_s/self.interval
|
||||||
|
|
||||||
while True:
|
with self.device.open():
|
||||||
if self.power_soll < self.heater.get_power_min():
|
while True:
|
||||||
self.heater.set_power(self.heater.get_power_min())
|
if self.power_soll < self.device.get_power_min():
|
||||||
self.heater.activate(False)
|
self.device.set_power(self.device.get_power_min())
|
||||||
else:
|
self.device.activate(False)
|
||||||
self.heater.set_power(self.power_soll)
|
else:
|
||||||
self.heater.activate(True)
|
self.device.set_power(self.power_soll)
|
||||||
|
self.device.activate(True)
|
||||||
|
|
||||||
on_count = pulse_period_count
|
on_count = pulse_period_count
|
||||||
if self.heater.get_power_min() > 0:
|
if self.device.get_power_min() > 0:
|
||||||
on_count = pulse_period_count*min(1, self.power_soll/self.heater.get_power_min())
|
on_count = pulse_period_count*min(1, self.power_soll / self.device.get_power_min())
|
||||||
|
|
||||||
self.pulse_counter += 1
|
self.pulse_counter += 1
|
||||||
if self.pulse_counter >= pulse_period_count:
|
if self.pulse_counter >= pulse_period_count:
|
||||||
self.pulse_counter = 0
|
self.pulse_counter = 0
|
||||||
|
|
||||||
if self.pulse_counter < on_count:
|
if self.pulse_counter < on_count:
|
||||||
self.heater.activate(True)
|
self.device.activate(True)
|
||||||
else:
|
else:
|
||||||
self.heater.activate(False)
|
self.device.activate(False)
|
||||||
|
|
||||||
self.heater.process()
|
self.device.process()
|
||||||
await asyncio.sleep(self.interval)
|
await asyncio.sleep(self.interval)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-7
@@ -21,9 +21,6 @@ class StirrerTask(ATask):
|
|||||||
def on_cycletime_changed(self, value):
|
def on_cycletime_changed(self, value):
|
||||||
asyncio.create_task(self.send({'CycleTime': value}))
|
asyncio.create_task(self.send({'CycleTime': value}))
|
||||||
|
|
||||||
def on_changed_active(self, is_activated):
|
|
||||||
asyncio.create_task(self.send({'Activate': int(is_activated)}))
|
|
||||||
|
|
||||||
async def recv(self, data):
|
async def recv(self, data):
|
||||||
for pair in data.items():
|
for pair in data.items():
|
||||||
if 'Speed' in pair[0]:
|
if 'Speed' in pair[0]:
|
||||||
@@ -39,12 +36,12 @@ class StirrerTask(ATask):
|
|||||||
self.device.set_on_changed("speed", self.on_speed_changed)
|
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("dutyCycle", self.on_dutycycle_changed)
|
||||||
self.device.set_on_changed("cycleTime", self.on_cycletime_changed)
|
self.device.set_on_changed("cycleTime", self.on_cycletime_changed)
|
||||||
self.device.set_on_changed('is_active', ChangedInteger(self.on_changed_active).set)
|
|
||||||
|
|
||||||
self.device.set_speed(50.0)
|
self.device.set_speed(50.0)
|
||||||
self.device.set_cycle_time(10.0)
|
self.device.set_cycle_time(10.0)
|
||||||
self.device.set_duty_cycle(1.0)
|
self.device.set_duty_cycle(1.0)
|
||||||
|
|
||||||
while True:
|
with self.device.open():
|
||||||
self.device.process()
|
while True:
|
||||||
await asyncio.sleep(self.interval)
|
self.device.process()
|
||||||
|
await asyncio.sleep(self.interval)
|
||||||
|
|||||||
Reference in New Issue
Block a user