ISTI develops and maintains integration software for seismic monitoring. This project added the ability to calibrate the hardware used. It consisted of three parts: overall coordination; a graphical interface (in Java); and a set of C programs to implement the hardware control and numerical analysis. I was responsible for the design and implementation of the C code.
Accept a calibration definition (a set of signals and target hardware).
Wait for the hardware to become available.
Trigger signals (communicating with the hardware).
Wait for signals to complete.
Retrieve data (communicating with existing integration software).
Process data to calculate response.
Repeat the above for further signals and hardware, as appropriate.
Consolidate results and compare with nominal values.
Integrate with the existing system.
Provide a simple interface for the GUI, command–line users, and other processes.
Automate the end–to–end process of calibration.
A client may maintain sensors at multiple locations. The software is installed once at each location and controls all local calibrations.
The required functionality is implemented through a number of small tasks (the “Unix approach”). The tasks can be used individually, with all parameters specified on the command line (useful for detailed analysis and system debugging).
In routine use the tasks coordinate through a database. Three commands (to start a new calibration, add signals, and schedule the work) are used to add new information to the database. A scheduler then takes control, invoking further tasks until the calibration is complete.
The scheduler itself is fairly limited; it can resolve conflicts and queue tasks, but has no detailed knowledge of the steps required. Instead, each task contains sufficient logic to evaluate its own performance and request further tasks. The result is a very flexible system composed of cooperating (but largely sequential) agents, sharing data through a common repository.
The database is used only for task co-ordination. A separate, file–system store of results is maintained. These can be accessed directly by an operator or the GUI.
The Unix tools / collaborating agents approach works really well. As does using ssh + command–line as a simple network API for the GUI. The result is a complex, powerful system that is still easy to pull apart, debug, modify and maintain.
We need to improve communication and cooperation with the client:
Access to hardware — critical for testing calibration — has been difficult. Working around issues that were not resolved promptly cost time and complicated code.
Some low–level parts of the implementation are “frozen” because their details were inappropriately exposed in design documents and the process for modification is either non–existent or simply too much work.