This document describes the implementation of a DAQ model. It provides a number of tools to develop a data acquisition system.
To facilitate comunication between different objects, DAQ++ implements a very simple Observer model, in which some of the DAQ++ objects are defined as DAQpp::Observables and some as DAQpp::Observers. Observers subscribe to the messages defined in the Observables and are notified whenever a change occurs.
The basis of the system is the DAQpp::Module object. It represents a detector or DAQ unit. As such, it implements the basic DAQ commands to get ready, start or stop the DAQ, retreive the data, etc.
A set of Modules being run under the same conditions is controlled by a DAQpp::RunManager. It will mantain a list of those modules and distribute the DAQ commands to all of them. DAQ commands are distributed by means of DAQpp::RunCommand objects. Those are just Observable objects that will notify any DAQ command to the Observer classes, which are the DAQpp::Module registered.
The status of both the Module and the RunManager objects can be monitored by means of the DAQpp::RunState objects. RunState objects are both Obververs and Observables. They observe the status of the Module or RunManager to which they are associated and will notify any change on it to any subscribed Observer.
The structure of the model has a DAQpp::DAQmanager at the top. This object is a singleton that controls the whole acquisition. It provides the standard operations for a DAQ controler.
It will propagate the DAQ commands to all the active RunManagers, which in turn will do it to their associated Modules.
This object will maintain a list of existing and RunManager and Module objects.