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
4 changes: 2 additions & 2 deletions .github/workflows/code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,12 @@ jobs:
fail-fast: false
matrix:
os: ["ubuntu-latest"] # can add windows-latest, macos-latest
python: ["3.9", "3.10", "3.11"]
python: ["3.10", "3.11"]
install: ["-e .[dev]"]
# Make one version be non-editable to test both paths of version code
include:
- os: "ubuntu-latest"
python: "3.8"
python: "3.9"
install: ".[dev]"

runs-on: ${{ matrix.os }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
from PIL import Image


class Snapshot(Device):
class MJPG(Device):
filename: Signal = Component(Signal)
directory: Signal = Component(Signal)
url: EpicsSignal = Component(EpicsSignal, "JPG_URL_RBV", string=True)
x_size_pv: EpicsSignalRO = Component(EpicsSignalRO, "ArraySize1_RBV")
y_size_pv: EpicsSignalRO = Component(EpicsSignalRO, "ArraySize2_RBV")
x_size: EpicsSignalRO = Component(EpicsSignalRO, "ArraySize1_RBV")
y_size: EpicsSignalRO = Component(EpicsSignalRO, "ArraySize2_RBV")
input_rbpv: EpicsSignalRO = Component(EpicsSignalRO, "NDArrayPort_RBV")
input_pv: EpicsSignal = Component(EpicsSignal, "NDArrayPort")
input_plugin: EpicsSignal = Component(EpicsSignal, "NDArrayPort")
KICKOFF_TIMEOUT: float = 10.0

def trigger(self):
Expand Down
34 changes: 34 additions & 0 deletions src/dodal/devices/areadetector/plugins/MXSC.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from ophyd import Component, Device, EpicsSignal


class MXSC(Device):
"""
Device for edge detection plugin.
"""

input_plugin: EpicsSignal = Component(EpicsSignal, "NDArrayPort")
enable_callbacks: EpicsSignal = Component(EpicsSignal, "EnableCallbacks")
min_callback_time: EpicsSignal = Component(EpicsSignal, "MinCallbackTime")
blocking_callbacks: EpicsSignal = Component(EpicsSignal, "BlockingCallbacks")
read_file: EpicsSignal = Component(EpicsSignal, "ReadFile")
filename: EpicsSignal = Component(EpicsSignal, "Filename", string=True)
preprocess_operation: EpicsSignal = Component(EpicsSignal, "Preprocess")
preprocess_ksize: EpicsSignal = Component(EpicsSignal, "PpParam1")
canny_upper_threshold: EpicsSignal = Component(EpicsSignal, "CannyUpper")
canny_lower_threshold: EpicsSignal = Component(EpicsSignal, "CannyLower")
close_ksize: EpicsSignal = Component(EpicsSignal, "CloseKsize")
sample_detection_scan_direction: EpicsSignal = Component(
EpicsSignal, "ScanDirection"
)
sample_detection_min_tip_height: EpicsSignal = Component(
EpicsSignal, "MinTipHeight"
)
tip_x: EpicsSignal = Component(EpicsSignal, "TipX")
tip_y: EpicsSignal = Component(EpicsSignal, "TipY")
top: EpicsSignal = Component(EpicsSignal, "Top")
bottom: EpicsSignal = Component(EpicsSignal, "Bottom")
output_array: EpicsSignal = Component(EpicsSignal, "OutputArray")
draw_tip: EpicsSignal = Component(EpicsSignal, "DrawTip")
draw_edges: EpicsSignal = Component(EpicsSignal, "DrawEdges")
waveform_size_x: EpicsSignal = Component(EpicsSignal, "ArraySize1_RBV")
waveform_size_y: EpicsSignal = Component(EpicsSignal, "ArraySize2_RBV")
2 changes: 1 addition & 1 deletion src/dodal/devices/detector_motion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from ophyd import Device, EpicsMotor, EpicsSignal, EpicsSignalRO


class Det(Device):
class DetectorMotion(Device):
"""Physical motion and interlocks for detector travel"""

upstream_x: EpicsMotor = Cpt(EpicsMotor, "-MO-DET-01:UPSTREAMX")
Expand Down
24 changes: 12 additions & 12 deletions src/dodal/devices/oav/grid_overlay.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from ophyd import Component, Signal
from PIL import Image, ImageDraw

from dodal.devices.oav.snapshot import Snapshot
from dodal.devices.areadetector.plugins.MJPG import MJPG


class Orientation(Enum):
Expand Down Expand Up @@ -120,19 +120,19 @@ def add_grid_overlay_to_image(
)


class SnapshotWithGrid(Snapshot):
top_left_x_signal: Signal = Component(Signal)
top_left_y_signal: Signal = Component(Signal)
box_width_signal: Signal = Component(Signal)
num_boxes_x_signal: Signal = Component(Signal)
num_boxes_y_signal: Signal = Component(Signal)
class SnapshotWithGrid(MJPG):
top_left_x: Signal = Component(Signal)
top_left_y: Signal = Component(Signal)
box_width: Signal = Component(Signal)
num_boxes_x: Signal = Component(Signal)
num_boxes_y: Signal = Component(Signal)

def post_processing(self, image: Image.Image):
top_left_x = self.top_left_x_signal.get()
top_left_y = self.top_left_y_signal.get()
box_width = self.box_width_signal.get()
num_boxes_x = self.num_boxes_x_signal.get()
num_boxes_y = self.num_boxes_y_signal.get()
top_left_x = self.top_left_x.get()
top_left_y = self.top_left_y.get()
box_width = self.box_width.get()
num_boxes_x = self.num_boxes_x.get()
num_boxes_y = self.num_boxes_y.get()
filename_str = self.filename.get()
directory_str = self.directory.get()
add_grid_border_overlay_to_image(
Expand Down
63 changes: 1 addition & 62 deletions src/dodal/devices/oav/oav_detector.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from enum import IntEnum

from ophyd import ADComponent as ADC
from ophyd import (
AreaDetector,
Expand All @@ -13,24 +11,10 @@
ROIPlugin,
)

from dodal.devices.areadetector.plugins.MXSC import MXSC
from dodal.devices.oav.grid_overlay import SnapshotWithGrid


class ColorMode(IntEnum):
"""
Enum to store the various color modes of the camera. We use RGB1.
"""

MONO = 0
BAYER = 1
RGB1 = 2
RGB2 = 3
RGB3 = 4
YUV444 = 5
YUV422 = 6
YUV421 = 7


class ZoomController(Device):
"""
Device to control the zoom level, this is unfortunately on a different prefix
Expand Down Expand Up @@ -62,51 +46,6 @@ def allowed_zoom_levels(self):
]


class EdgeOutputArrayImageType(IntEnum):
"""
Enum to store the types of image to tweak the output array. We use Original.
"""

ORIGINAL = 0
GREYSCALE = 1
PREPROCESSED = 2
CANNY_EDGES = 3
CLOSED_EDGES = 4


class MXSC(Device):
"""
Device for edge detection plugin.
"""

input_plugin_pv: EpicsSignal = Component(EpicsSignal, "NDArrayPort")
enable_callbacks_pv: EpicsSignal = Component(EpicsSignal, "EnableCallbacks")
min_callback_time_pv: EpicsSignal = Component(EpicsSignal, "MinCallbackTime")
blocking_callbacks_pv: EpicsSignal = Component(EpicsSignal, "BlockingCallbacks")
read_file: EpicsSignal = Component(EpicsSignal, "ReadFile")
py_filename: EpicsSignal = Component(EpicsSignal, "Filename", string=True)
preprocess_operation: EpicsSignal = Component(EpicsSignal, "Preprocess")
preprocess_ksize: EpicsSignal = Component(EpicsSignal, "PpParam1")
canny_upper_threshold: EpicsSignal = Component(EpicsSignal, "CannyUpper")
canny_lower_threshold: EpicsSignal = Component(EpicsSignal, "CannyLower")
close_ksize: EpicsSignal = Component(EpicsSignal, "CloseKsize")
sample_detection_scan_direction: EpicsSignal = Component(
EpicsSignal, "ScanDirection"
)
sample_detection_min_tip_height: EpicsSignal = Component(
EpicsSignal, "MinTipHeight"
)
tip_x: EpicsSignal = Component(EpicsSignal, "TipX")
tip_y: EpicsSignal = Component(EpicsSignal, "TipY")
top: EpicsSignal = Component(EpicsSignal, "Top")
bottom: EpicsSignal = Component(EpicsSignal, "Bottom")
output_array: EpicsSignal = Component(EpicsSignal, "OutputArray")
draw_tip: EpicsSignal = Component(EpicsSignal, "DrawTip")
draw_edges: EpicsSignal = Component(EpicsSignal, "DrawEdges")
waveform_size_x: EpicsSignal = Component(EpicsSignal, "ArraySize1_RBV")
waveform_size_y: EpicsSignal = Component(EpicsSignal, "ArraySize2_RBV")


class OAV(AreaDetector):
cam: CamBase = ADC(CamBase, "-DI-OAV-01:CAM:")
roi: ADC = ADC(ROIPlugin, "-DI-OAV-01:ROI:")
Expand Down
Loading