class SensorTracker(object): """This class heavily based on that from E. Barr (2020) """ def __init__(self, host, component, sensor_name): log.debug(("Building sensor tracker activity tracker " "on {} for sensor={} and component={}").format( host, sensor_name, component)) self._client = KATPortalClient( host, on_update_callback=self.event_handler, logger=logging.getLogger(LOG_FILE)) self._namespace = 'namespace_' + str(uuid.uuid4()) self._sensor_name = sensor_name self._component = component self._full_sensor_name = None self._state = None self._has_started = False @coroutine def start(self): if self._has_started: return log.debug("Starting sensor tracker") yield self._client.connect() log.debug("Connected") result = yield self._client.subscribe(self._namespace) self._full_sensor_name = yield self._client.sensor_subarray_lookup( component=self._component, sensor=self._sensor_name, return_katcp_name=False) log.debug("Tracking sensor: {}".format(self._full_sensor_name)) result = yield self._client.set_sampling_strategies( self._namespace, self._full_sensor_name, 'event') sensor_sample = yield self._client.sensor_value( self._full_sensor_name, include_value_ts=False) self._state = sensor_sample.value log.debug("Initial state: {}".format(self._state)) self._has_started = True @coroutine def stop(self): log.info("Unsubscribing and disconnecting") yield self._client.unsubscribe(self._namespace) yield self._client.disconnect() def event_handler(self, msg_dict): status = msg_dict['msg_data']['status'] if status == "nominal": log.debug("Sensor value update: {} -> {}".format( self._state, msg_dict['msg_data']['value'])) self._state = msg_dict['msg_data']['value'] log.info("{}:{}".format(self._full_sensor_name, self._state))
class SensorTracker(object): def __init__(self, host, component, sensor_name): log.debug(("Building sensor tracker activity tracker " "on {} for sensor={} and component={}").format( host, sensor_name, component)) self._client = KATPortalClient(host, on_update_callback=self.event_handler, logger=logging.getLogger('katcp')) self._namespace = 'namespace_' + str(uuid.uuid4()) self._sensor_name = sensor_name self._component = component self._full_sensor_name = None self._state = None self._has_started = False @coroutine def start(self): if self._has_started: return log.debug("Starting sensor tracker") yield self._client.connect() result = yield self._client.subscribe(self._namespace) self._full_sensor_name = yield self._client.sensor_subarray_lookup( component=self._component, sensor=self._sensor_name, return_katcp_name=False) log.debug("Tracking sensor: {}".format(self._full_sensor_name)) result = yield self._client.set_sampling_strategies( self._namespace, self._full_sensor_name, 'event') sensor_sample = yield self._client.sensor_value(self._full_sensor_name, include_value_ts=False) self._state = sensor_sample.value log.debug("Initial state: {}".format(self._state)) self._has_started = True @coroutine def stop(self): yield self._client.unsubscribe(self._namespace) yield self._client.disconnect() def event_handler(self, msg_dict): status = msg_dict['msg_data']['status'] if status == "nominal": log.debug("Sensor value update: {} -> {}".format( self._state, msg_dict['msg_data']['value'])) self._state = msg_dict['msg_data']['value'] @coroutine def wait_until(self, state, interrupt): log.debug("Waiting for state='{}'".format(state)) while True: if self._state == state: log.debug("Desired state reached") raise Return(self._state) else: try: log.debug("Waiting on interrupt in wait_until loop") yield interrupt.wait(timeout=datetime.timedelta(seconds=1)) log.debug("Moving to next loop iteration") except TimeoutError: continue else: log.debug("Wait was interrupted") raise Interrupt("Interrupt event was set")