|
|
import logging |
|
|
import time |
|
|
from abc import ABC |
|
|
|
|
|
|
|
|
class AbstractPump: |
|
|
|
|
|
def __init__(self, com_port: str): |
|
|
self.com_port = com_port |
|
|
self.dictionary = {} |
|
|
self.logger = logging.getLogger("pump") |
|
|
|
|
|
def dose_liquid(self, amount_in_ml: float, rate_ml_per_minute: float = 1): |
|
|
"""dose liquid""" |
|
|
self.logger.info("dosing liquid") |
|
|
self.logger.info(f"pretending dosing {amount_in_ml} at {rate_ml_per_minute} ml/min") |
|
|
return 1 |
|
|
|
|
|
|
|
|
|
|
|
class AbstractBalance: |
|
|
|
|
|
def __init__(self, com_port: str): |
|
|
self.com_port = com_port |
|
|
self._value = None |
|
|
self.logger = logging.getLogger("balance") |
|
|
|
|
|
@property |
|
|
def setter_value(self): |
|
|
return self._value |
|
|
|
|
|
@setter_value.setter |
|
|
def setter_value(self, value): |
|
|
self._value = value |
|
|
|
|
|
def weigh_sample(self): |
|
|
time.sleep(1) |
|
|
self.logger.info(f"Weighing sample using {self.com_port}") |
|
|
return 1 |
|
|
|
|
|
def dose_solid(self, amount_in_mg: float): |
|
|
"""this function is used to dose solid""" |
|
|
time.sleep(1) |
|
|
self.logger.info(f"Dosing {amount_in_mg} mg using {self.com_port}") |
|
|
return 1 |
|
|
|
|
|
def _helper(self): |
|
|
"""helper function will not be extracted and displayed over function panel""" |
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AbstractSDL(ABC): |
|
|
def __init__(self, pump: AbstractPump, balance: AbstractBalance): |
|
|
self.pump = pump |
|
|
self.balance = balance |
|
|
self.logger = logging.getLogger(f"logger_name") |
|
|
|
|
|
def analyze(self): |
|
|
self.logger.info("analyze") |
|
|
time.sleep(1) |
|
|
return 1 |
|
|
|
|
|
|
|
|
def dose_solid(self, |
|
|
amount_in_mg: float = 5, |
|
|
solid_name: str = "Acetaminophen" |
|
|
): |
|
|
"""dose current chemical""" |
|
|
print("dosing solid") |
|
|
self.balance.dose_solid(amount_in_mg=amount_in_mg) |
|
|
self.balance.weigh_sample() |
|
|
time.sleep(1) |
|
|
self.logger.info(f"dosing solid {amount_in_mg} mg of {solid_name}") |
|
|
return 1 |
|
|
|
|
|
def dose_solvent(self, |
|
|
solvent_name: str = "Methanol", |
|
|
amount_in_ml: float = 5, |
|
|
rate_ml_per_minute: float = 1 |
|
|
): |
|
|
print("dosing liquid") |
|
|
self.logger.info(f"dosing {amount_in_ml} ml of {solvent_name} solvent at {rate_ml_per_minute} ml/min") |
|
|
time.sleep(1) |
|
|
return 1 |
|
|
|
|
|
|
|
|
def equilibrate(self, |
|
|
temp: float, |
|
|
duration: float |
|
|
): |
|
|
print("equilibrate") |
|
|
self.logger.info(f"equilibrate at {temp} for {duration}") |
|
|
time.sleep(1) |
|
|
|
|
|
def simulate_error(self): |
|
|
raise ValueError("some error") |
|
|
|
|
|
def _send_command(self): |
|
|
"""helper function""" |
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
balance = AbstractBalance("Fake com port 1") |
|
|
pump = AbstractPump("Fake com port 2") |
|
|
sdl = AbstractSDL(pump, balance) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
import ivoryos |
|
|
ivoryos.run(__name__) |