50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
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() |