From 02a0911295c420e80b9bbe5c7a73badf8ffaf8b2 Mon Sep 17 00:00:00 2001
From: David Hammer <dhammer@mailbox.org>
Date: Fri, 20 Sep 2024 14:16:34 +0200
Subject: [PATCH] Use geometryState to indicate geometry state

---
 src/calng/DetectorAssembler.py | 41 +++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/src/calng/DetectorAssembler.py b/src/calng/DetectorAssembler.py
index 0141624c..53fb2b62 100644
--- a/src/calng/DetectorAssembler.py
+++ b/src/calng/DetectorAssembler.py
@@ -20,7 +20,6 @@ from karabo.bound import (
     ImageData,
     MetricPrefix,
     Schema,
-    State,
     Timestamp,
     Trainstamp,
     Unit,
@@ -150,6 +149,19 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
             .assignmentMandatory()
             .commit(),
 
+            STRING_ELEMENT(expected)
+            .key("geometryState")
+            .displayedName("Geometry state")
+            .description(
+                "The assembler needs a detector geometry to function. This is gotten "
+                "from a geometry device (see the geometryDevice parameter). If this "
+                "state is ERROR, no assembly will take place - check the geometry "
+                "device!"
+            )
+            .readOnly()
+            .initialValue("INIT")
+            .commit(),
+
             STRING_ELEMENT(expected)
             .key("sourceIndexPattern")
             .displayedName("Source index regex")
@@ -209,16 +221,16 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
         self._geometry = None
         def _on_geometry(geometry):
             if self._geometry is None:
-                # TODO: review with new warning system
-                if hasattr(self, "_state_before_geometry_missing_error"):
-                    self.set("status", "Received geometry!")
-                    self.updateState(self._state_before_geometry_missing_error)
-                    del self._state_before_geometry_missing_error
+                self.set("geometryState", "ACTIVE")
             self._geometry = geometry
             self.log.INFO("Received new geometry")
         geom_utils.subscribe_to_geometry_bound(
-            self, self.get("geometryDevice"), _on_geometry, warn_fun=self.log.WARN
+            self, self.get("geometryDevice"), _on_geometry
         )
+        print("done setting up thing", self._geometry)
+        if self._geometry is None:
+            # initial get failed
+            self.set("geometryState", "ERROR")
 
         self.assembled_output = self.signalSlotable.getOutputChannel("assembledOutput")
         self.start()
@@ -362,6 +374,7 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
         payload["data"] = scenes.detector_assembler_overview(
             device_id=self.getInstanceId(),
             schema=self.getFullSchema(),
+            geometry_device_id=self.get("geometryDevice"),
         )
         self.reply(
             Hash(
@@ -376,21 +389,9 @@ class DetectorAssembler(TrainMatcher.TrainMatcher):
 
     def on_matched_data(self, train_id, sources):
         ts_start = default_timer()
-        state = self.get("state")
 
         if self._geometry is None:
-            if not hasattr(self, "_state_before_geometry_missing_error"):
-                self.log.WARN("Have not received a geometry yet, will not send anything")
-                self.set(
-                    "status",
-                    "Missing geometry, cannot assemble; "
-                    f"check {self.get('geometryDevice')}"
-                )
-
-            if state is not State.ERROR:
-                self.updateState(State.ERROR)
-                # set or update
-                self._state_before_geometry_missing_error = state
+            # should have already set up warning
             return
 
         my_timestamp = Timestamp(Epochstamp(), Trainstamp(train_id))
-- 
GitLab