Control API

The control API is the high level API of Lima build on top of the Processing and Acquisition APIs. It’s responsibility is to prepare the camera and processing pipeline, and control the acquisition with commands like start, stop, trigger…

The Control API has the following roles:

  • Prepare the camera for acquisition according to user settings

  • Prepare a processing pipeline according to actual hardware acquisition settings and user settings

  • Start / Stop acquisition

  • Orchestrate the components of the distributed system (acquisition, processing)


   sequenceDiagram
       Client->>Client: Instantiate params
       Client->>Control: Prepare
       Control-->>Client: Prepared!
       Client->>Control: Start
       loop Every frames
           Control-->>Client: Trigger ready
           Client->>Control: Trigger  
           Control-->>Client: New frame ready
       end

   graph TD
       B["Control API"]
       B-->C["Processing API"]
       B-->D["Acquisition API"];

A major shift from Lima1 is the ability to run a new acquisition while the previous is still processing. Current and previous processing can be retrieved by their acquisition id.

Synopsis

template <typename Camera>
class control
{  
  // Defines the supported image types (a vector of types)
  typedef ... images_t;

  // Defines the type of the initialization parameters
  typedef ... init_params_t;

  // Define the type of the acquisition parameters
  typedef ... acq_params_t;

  // An identifier of the acquisition
  typedef ... acq_uid_t;

  // Defines the type of the processing
  typedef ... processing_t;

  // Constructor forwards the init params to the camera
  void control(const init_params_t& params);

  // Prepare the camera for acquisition
  // Returns the id for the prepared acquisition
  acq_uid_t prepare(const acq_params_t& params);

  // Start the acquisition
  void start();

  // Software trigger if the camera supports it
  void soft_trigger();

  // Stop the acquisition
  void stop();

  // Abort the acquisition
  void abort();

  // Reset the detector
  void reset();

  // Returns the current acquisition parameters
  acq_params_t acq_params() const;

  // Returns the processing for the given acquisition
  processing_t& const processing(acq_uid_t) const;

  // Returns static detector informations
  det_info_t det_info() const;

  // Register for a specific event, the condition_variable will be
  // notified when the event occurs.  
  void register_event(event_t, condition_variable);
};

Usage

TODO.

mpi::environment env(argc, argv, mpi::threading::level::multiple);
mpi::communicator world;

using control_t = lima::control<camera_t>;

control_t::init_params_t init_params;
control_t::acq_params_t acq_params;

// Fill both init_params anb acq_params with relevant params

// Create the control
control_t ct(world, init_params);

// Prepare the acquisition
ct.prepare_acq(acq_params);

auto state_change_rcv = ct.register_state_change();

// Old school with state polling
using transition_table_t = typename control_t::transition_table_t;
if (ct.is_state(transition_table_t::prepared))
{
	// Tell the camera to start acquisition
	ct.start_acq();

	// Wait for the end of the acquisition
	while (ct.is_state(transition_table_t::running))
		// Blocking wait for the notification of state change
		state_change_rcv.get();
}