Skip to content
Snippets Groups Projects
Commit 3dcad0a5 authored by David Hammer's avatar David Hammer
Browse files

Make SimpleAssembler ask for geometry on init

parent 4683ca2f
No related branches found
No related tags found
1 merge request!12Snapshot: field test deployed version as of end of run 202201
import functools import functools
import pickle import pickle
import re import re
import threading
import time
import numpy as np import numpy as np
from karabo.bound import ( from karabo.bound import (
...@@ -127,6 +129,7 @@ class SimpleAssembler(TrainMatcher.TrainMatcher): ...@@ -127,6 +129,7 @@ class SimpleAssembler(TrainMatcher.TrainMatcher):
self.KARABO_ON_DATA("geometryInput", self.receive_geometry) self.KARABO_ON_DATA("geometryInput", self.receive_geometry)
self.KARABO_SLOT(self.requestScene) self.KARABO_SLOT(self.requestScene)
self.ask_for_geometry()
self.start() self.start()
def requestScene(self, params): def requestScene(self, params):
...@@ -156,8 +159,38 @@ class SimpleAssembler(TrainMatcher.TrainMatcher): ...@@ -156,8 +159,38 @@ class SimpleAssembler(TrainMatcher.TrainMatcher):
def receive_geometry(self, data, metadata): def receive_geometry(self, data, metadata):
self.log.INFO("Received a new geometry") self.log.INFO("Received a new geometry")
self.geometry = pickle.loads(data.get("pickledGeometry")) self.geometry = pickle.loads(data.get("pickledGeometry"))
# TODO: allow multiple memory cells (extra geom notion of extra dimensions)
self.input_buffer = np.zeros(self.geometry.expected_data_shape) self.input_buffer = np.zeros(self.geometry.expected_data_shape)
def ask_for_geometry(self):
def runner():
self.log.INFO("Will ask around for a geometry")
max_tries = 10
for i in range(max_tries):
time.sleep(np.random.random() * 10)
if self.geometry is None:
missing_connections = set(
self.get("geometryInput.missingConnections")
)
# note: connectedOutputChannels not necessarily connected...
geometry_device_list = [
channel
for channel in self.get("geometryInput.connectedOutputChannels")
if channel not in missing_connections
]
if not geometry_device_list:
self.log.INFO("No geometry device connected")
continue
geometry_device = geometry_device_list[0].split(":")[0]
self.log.INFO(f"Asking {geometry_device} for a geometry")
self.signalSlotable.call(geometry_device, "pleaseSendYourGeometry")
time.sleep(1)
if self.geometry is not None:
return
self.log.INFO(f"Failed to get geometry in {max_tries} tries, need help")
threading.Thread(target=runner, daemon=True).start()
def _send(self, train_id, sources): def _send(self, train_id, sources):
# TODO: adapt to appropriate hook for new TrainMatcher (no _send) # TODO: adapt to appropriate hook for new TrainMatcher (no _send)
if self.geometry is None: if self.geometry is None:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment