from nscldaq.statemanager import Utilities
ipPort = Utilities.getPort(host, service, user)
zmqSocket = Utilities.connectRequestPort( zmqContext, host='localhost', service='StateRequest', user=None)
zmqSocket = Utilities.subscribe( zmqContext, wantTransitions, wantState, host='localhost', service='StatePublish', user=None)
gotSomething = Utilities.checkRequest(zmqSocket, pollTimeout, maxPolls, callback, cbArg)
eventLoop = Utilities.zmqEventLoop()
eventLoop.register(ioItem, events, handler)
eventLoop.unregister(ioItem)
eventLoop.poll(timeout)
eventLoop.pollForever(timeout, idler=None)
The Utilities package provides several convenience functions and an event loop class for the state manager. These can be considered mostly low level functions, and the event loop too is a pretty low level item.
The state manager and its clients use the zeromq communications software. This means that some parameters are actually zeromq objects. Where appropriate, this is pointed out.
Looks up a service using the NSCL DAQ port manager.
host is the host on which the
service is believed to be advertised.
service is the name of the service
the server is advertising. user is the
username qualifying the service.
In order to support multiple acquisition runs in a single computer, services can be run by a specific user. The user that runs the service is part of the information provided about services by the port manager query subsystem.
The function returns the port on which the server is
listening for connections for that service. If there is
no match or if the port manager on host
cannot be contacted, the function will raise a
RuntimeError
Connects to the request port of the state manager.
zmqContext is the zeromq context
object that must have been created by the caller as part
of the initialization of zeromq.
host, which defaults to the localhost
indicates which system the state manager is running in.
service which defaults to
StateRequest, the service normally
used by the state manager, is the service name on which the
state manager is allowing state transition request
connections.
user, which defaults to None,
indicating the running user should be used, is the username
that is running the state manager.
On successful completion a zmq::socket
object is returned. Note that zmq::socket
is not interchangeable with the sockets produced by
the python socket constructor.
zmqEventLoop
zmqEventLoop (ZeroMQ Event loop) provides the ability to run
an event loop based on a zmq.poller object. The event
loop is built to allow clients to register interest in either zmq.socket
events or events on any Python object that has a fileno method.
When events of interest occur, callbacks associated with those events are invoked.
The event loop can be entered for some designated time period or it can be
entered "forever" with a user callback determining if/when the loop exits.
zmqEventLoop()
Constructs and returns an instance of a zmqEventLoop.
No parameters are required or accepted.
register(
ioItem,
events,
handler)
Registers a callback. ioItem is either a
zmq.socket or any Python object with a
fileno method that returns a file descriptor.
events is a set of flags bitwised OR'd together
to specify the events of interest. The legal flags are
zmq.POLLIN or zmq.POLLOUT.
handler is a callable that will be invoked when
the ioItem has an event of interest.
handler is invoked with the following parameters
in order: The event loop object that invoked the handler, the
ioItem that has the desired event and
a mask of events that were fired by the
object.
Note that if an I/O item already has a callback register it is silently replaced by the new one.
unregister(ioItem)
Unregisters any callback registered for the ioItem.
If the ioItem is not registered, the underlying
zmq.Poller object will raise a
KeyError exception.
poll(timeout)
Runs the event loop until the next events are declared or for
timeout microseconds, whichever is first.
Any event that occured will be dispatched prior to return. This
method provides for a main program loop that follows the model:
pollForever(timeout, idler=None)
Repeatedly invokes the poll method.
In this case, the timeout specifies the
maximum time the poll call can block
in milliseconds (not microseconds).
After each call to
poll the idler
callable, if supplied is called with the event loop object
as a parameter. The idler method is assumed
to return a boolean True if the event loop
should make another pass or False fi
pollForever should return.
The poll method will always be called
at least once.