@@ -108,7 +108,7 @@ def __init__(self, *args, parent=None, **kwargs) -> None:
108108 self .parent = parent
109109 self .sim_state = defaultdict (dict )
110110 self .registered_proxies = getattr (self .parent , "registered_proxies" , {})
111- self ._model = {}
111+ self ._model = None
112112 self ._model_params = None
113113 self ._params = {}
114114
@@ -329,6 +329,7 @@ def __init__(self, *args, parent=None, **kwargs) -> None:
329329 self ._model_lookup = self .init_lmfit_models ()
330330 super ().__init__ (* args , parent = parent , ** kwargs )
331331 self .bit_depth = self .parent .BIT_DEPTH
332+ self ._cb_registered = False
332333 self ._init_default ()
333334
334335 @SimulatedDataBase .params .setter
@@ -341,9 +342,22 @@ def _add_callback_to_motor(self) -> None:
341342 mot_name = self .params .get ("ref_motor" , "" )
342343 if not hasattr (self .parent , "device_manager" ):
343344 return
345+ if not hasattr (self .parent .device_manager , "devices" ):
346+ return
344347 if mot_name in self .parent .device_manager .devices :
345348 if hasattr (self .parent , "setup_readback_monitor" ):
346349 self .parent .setup_readback_monitor (mot_name )
350+ # pylint: disable=protected-access
351+ if (
352+ hasattr (self .parent , "_registered_callback" )
353+ and self .parent ._registered_callback is not None
354+ and self .parent ._registered_callback .motor == mot_name
355+ ):
356+ # If the callback was registered, keep track of it
357+ self ._cb_registered = True
358+ else :
359+ # If no callback was registered, this should also be reflected in self._cb_registered
360+ self ._cb_registered = False
347361
348362 def select_model (self , model : str ) -> None :
349363 """
@@ -396,6 +410,8 @@ def get_params_for_model_cls(self) -> dict:
396410 dict: {name: value} for the active simulation model.
397411 """
398412 rtr = {}
413+ if not isinstance (self ._model , Model ):
414+ return rtr
399415 params = self ._model .make_params ()
400416 for name , parameter in params .items ():
401417 if name in DEFAULT_PARAMS_LMFIT :
@@ -465,6 +481,10 @@ def _compute(self, *args, **kwargs) -> int:
465481 mot_name = self .params .get ("ref_motor" , "" )
466482 if self .parent .device_manager and mot_name in self .parent .device_manager .devices :
467483 motor_pos = self .parent .device_manager .devices [mot_name ].obj .read ()[mot_name ]["value" ]
484+ # It can happen that the SimMonitor was created before the motor was available in the device manager,
485+ # therefore we have to check if a callback is registered and update it if not.
486+ if not self ._cb_registered :
487+ self ._add_callback_to_motor ()
468488 else :
469489 motor_pos = 0
470490 method = self ._model
0 commit comments