Figure 2: Engine execution. After initialization, each engine proceeds into the main sequence loop, in which core engine processes are executed sequentially. Data are first received from the previous engine in the signal chain, and any parameter value changes received from the engine's GUI are updated locally. The system next performs any actions specific to the individual engine (e.g., calculation of a control signal or updating of a display), and sends the results of these actions to the next engine in the signal chain. Current values of any data items to be visualized are placed in a queue, and data is sent to the data saving manager. The engine then proceeds to the beginning of the main sequence loop to await the arrival of the next input. Parallel to the main sequence loop are any parallel processes designed to operate asynchronously. These processes will always include receiving parameter value updates from the GUI and sending visualization data to the GUI, and may include individual engine-specific operation such as decoder training or monitoring for events. Shaded blocks represent those areas to be modified by the developer during the creation of new engines, while white blocks represent sections of code providing core functionality.