Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion ulc_mm_package/QtGUI/oracle.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ def _init_sigslots(self):

self.scopeop.reload_pause.connect(self.reload_pause_handler)
self.scopeop.lid_open_pause.connect(self.lid_open_pause_handler)
self.scopeop.pressure_leak_pause.connect(self.pressure_leak_pause_handler)

self.scopeop.create_timers.connect(self.acquisition.create_timers)
self.scopeop.start_timers.connect(self.acquisition.start_timers)
Expand Down Expand Up @@ -373,6 +374,17 @@ def lid_open_pause_handler(self):
self.scopeop.to_pause()
self.unpause()

def pressure_leak_pause_handler(self):
if self.scopeop.state not in NO_PAUSE_STATES:
self.scopeop.to_pause()
self.display_message(
QMessageBox.Icon.Information,
"Pressure leak detected - pausing...",
'Please open the lid and reseat the CAP module, a pressure leak has been detected. Press "OK" to resume.',
buttons=Buttons.OK,
)
self.unpause()

def general_pause_handler(
self,
icon=QMessageBox.Icon.Information,
Expand Down Expand Up @@ -409,7 +421,6 @@ def general_pause_handler(
buttons=Buttons.OK,
image=IMAGE_RELOAD_PATH,
)
self.close_lid_display_message()
self.unpause()

def unpause(self):
Expand Down
11 changes: 11 additions & 0 deletions ulc_mm_package/QtGUI/scope_op.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class ScopeOp(QObject, NamedMachine):

reload_pause = pyqtSignal(str, str)
lid_open_pause = pyqtSignal()
pressure_leak_pause = pyqtSignal()

create_timers = pyqtSignal()
start_timers = pyqtSignal()
Expand Down Expand Up @@ -412,6 +413,9 @@ def _check_pressure_seal(self, *args):
self.logger.info(
f"Pressure check ✅. Ambient absolute pressure: {self.ambient_pressure:.2f} mBar. Gauge pressure = {pdiff:.2f} mBar."
)
self.pressure_monitoring_routine = (
self.routines.pressure_monitoring_routine(self.ambient_pressure)
)
if self.state == "pressure_check":
self.next_state()
except PressureSensorBusy as e:
Expand Down Expand Up @@ -987,13 +991,20 @@ def run_experiment(self, img, timestamp) -> None:
self.img_metadata["motor_pos"] = self.mscope.motor.getCurrentPosition()
try:
pressure, status = self.mscope.pneumatic_module.getPressure()
self.pressure_monitoring_routine.send(pressure)
(
self.img_metadata["pressure_hpa"],
self.img_metadata["pressure_status_flag"],
) = (pressure, status)
except PressureSensorStaleValue as e:
## TODO???
self.logger.info(f"Stale pressure sensor value - {e}")
except PressureLeak:
self.logger.warning(
f"Pressure leak detected. Current pressure: {pressure:.2f}mBar (gauge: {pressure - self.ambient_pressure:.2f}mBar)."
)
self.pressure_leak_pause.emit()
return

self.img_metadata["led_pwm_val"] = self.mscope.led.pwm_duty_cycle
self.img_metadata[
Expand Down
1 change: 1 addition & 0 deletions ulc_mm_package/hardware/hardware_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
MPRLS_PWR = 22

MIN_PRESSURE_DIFF = 330 # In units of hPa
PRESSURE_EWMA_ALPHA = 0.1
# ================ Fan constants ================ #
FAN_GPIO = 5
CAM_FAN_1 = 23
Expand Down
36 changes: 36 additions & 0 deletions ulc_mm_package/hardware/scope_routines.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
from ulc_mm_package.hardware.motorcontroller import Direction, MotorControllerError
from ulc_mm_package.hardware.hardware_constants import (
MIN_PRESSURE_DIFF,
PRESSURE_EWMA_ALPHA,
FOCUS_EWMA_ALPHA,
)
from ulc_mm_package.image_processing.classic_focus import OOF, ClassicImageFocus
Expand Down Expand Up @@ -434,6 +435,41 @@ def checkPressureDifference(
)
return pressure_diff

@init_generator
def pressure_monitoring_routine(
self, ambient_pressure: float
) -> Generator[None, float, None]:
"""
Monitor the pressure and raise an exception if it drops below the minimum required pressure difference.

Parameters
----------
mscope: MalariaScope

Exceptions
----------
PressureLeak:
Raised if the pressure difference is less than the minimum required (as set in `hardware_constants.py` via MIN_PRESSURE_DIFF).
"""

pressure_ewma_filter = EWMAFiltering(PRESSURE_EWMA_ALPHA)
pressure_ewma_filter.set_init_val(ambient_pressure)
period_num = pressure_ewma_filter.get_adjustment_period_ewma()
counter = 0

while True:
counter += 1
curr_pressure = yield
filtered_pressure = pressure_ewma_filter.update_and_get_val(curr_pressure)
gauge_pressure = ambient_pressure - filtered_pressure

if counter > period_num:
if gauge_pressure < MIN_PRESSURE_DIFF:
raise PressureLeak(
f"Pressure leak detected. Could only generate {gauge_pressure:.3f}mBar of pressure difference (ambient is at: {ambient_pressure:.2f}mBar)."
)
counter = 0

@init_generator
def find_cells_routine(
self,
Expand Down