class EpicsServerState(ReadonlyAsyncRegisterBase): def __init__(self, name, channel, as_string=True): RegisterBase.__init__(self, name) self.channel=channel self.as_string=as_string self.val = "Unknown" self.cas = None self.state_change_listener=None def doInitialize(self): super(EpicsServerState, self).doInitialize() if self.as_string: self.cas = CAS(self.channel, self, 'string') else: self.cas = CAS(self.channel, self, 'byte') if self.state_change_listener is None: class StateChangeListener(ContextListener): def onContextStateChanged(_self, state, former): self.set(state) self.state_change_listener = StateChangeListener() get_context().addListener(self.state_change_listener) def getSize(self): if self.as_string: return 1 else: return 100 def doClose(self): if self.state_change_listener: get_context().removeListener(self.state_change_listener) if self.cas: self.cas.close() self.cas = None super(EpicsServerState, self).doClose() def set(self, value): if self.as_string: self.onReadout(str(value)) else: self.onReadout(string_to_list(str(value))) if "server_state_channel" in globals(): server_state_channel.close() server_state_channel = EpicsServerState("server_state_channel", "PSHELL_OP:STATE", False) server_state_channel.initialize()