Python Tools#

As of version 0.0.1 prerelease the only available python tool is the Client Line Interface.

ArvCLI#

Aravis CLI allows the user to control the frame processor through the use of the command line interface. It also provides the user with an example of how to send http requests to the odin server. It can be installed into the virtualenv from the aravis detector directory. The environment should again be setup as described in the Run Tutorial:

export PATH=$MAIN_DIR/prefix/bin:$PATH
source $MAIN_DIR/venv/bin/activate

Then arvcli can be installed with: pip install python/tools -e

The following options are available through the CLI:

$ arvcli --help
                                                                                               
 Usage: arvcli [OPTIONS] COMMAND [ARGS]...                                                     
                                                                                               
╭─ Options ───────────────────────────────────────────────────────────────────────────────────╮
│ --status              -s             Print current status values of all plugins             │
│ --config              -c             Print current config values of all plugins             │
│ --ip                  -i       TEXT  Specify an ip address for the server [default: None]   │
│ --port                -po      TEXT  Specify a port for the server [default: None]          │
│ --get                 -g       TEXT  Print a specific value. Paths must be of the form:     │
│                                      fp/{status/ config / aravis}/<target> or               │
│                                      aravis/{config/status}/<target>                        │
│                                      [default: None]                                        │
│ --put                 -p       TEXT  Change a specific value. Paths must be of the form:    │
│                                      fp/config/aravis/<target> or aravis/config/<target>    │
│                                      [default: None]                                        │
│ --version             -v             Display arvcli's current version and exit              │
│ --install-completion                 Install completion for the current shell.              │
│ --show-completion                    Show completion for the current shell, to copy it or   │
│                                      customize the installation.                            │
│ --help                               Show this message and exit.                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ──────────────────────────────────────────────────────────────────────────────────╮
│ connect   Connects the AravisDetector plugin to a camera.                                   │
│ hdf       Control the file writer plugin                                                    │
│ http      send custom HTTP requests                                                         │
│ stream    Control camera frame acquisition in continuous mode                               │
╰─────────────────────────────────────────────────────────────────────────────────────────────╯

Requesting system information#

The odin server pols the plugins for status and config values at a fixed frequency and stores the information locally. Arvcli can then directly request this information.

The commands --status and --config return the status and config values of all the plugins.

Status is: 
{
    'shared_memory': {'configured': False},
    'plugins': {'names': ['aravis', 'hdf', 'view']},
    'aravis': {
        'camera_id': '140519',
        'camera_connected': True,
        'payload': 20181312,
        'image_height': 3672,
        'image_width': 5496,
        'streaming': True,
        'input_buffers': 500,
        'output_buffers': 0,
        'frames_made': 439916,
        'completed_buff': 439907,
        'failed_buff': 0,
        'underrun_buff': 0,
        'timing': {'last_process': 0, 'max_process': 0, 'mean_process': 0}
    },
    'hdf': {
        'writing': False,
        'frames_max': 1000,
        'frames_written': 1000,
        'frames_processed': 1000,
        'file_path': 'odin_camera_driver/temp',
        'file_name': 'run_6s48m15h17d4m2024y_000000.h5',
        'acquisition_id': ' ',
        'processes': 1,
        'rank': 0,
        'timeout_active': False,
        'timing': {
            'last_create': 681,
            'max_create': 681,
            'mean_create': 530,
            'last_write': 26141,
            'max_write': 35680,
            'mean_write': 25260,
            'last_flush': 41,
            'max_flush': 66,
            'mean_flush': 40,
            'last_close': 64,
            'max_close': 246,
            'mean_close': 155,
            'last_process': 1,
            'max_process': 35801,
            'mean_process': 1
        }
    },
    'view': {'timing': {'last_process': 11, 'max_process': 43439, 'mean_process': 13}},
    'error': [
        'Frame invalid',
        'Frame destined for [data] but dataset has not been defined in the HDF plugin'
    ],
    'timestamp': '2024-04-18T16:30:11.005675',
    'connected': True
}

To get more specific values the user can call the --get command.

arvcli --get fp/config/aravis/frame_rate
frame_rate = 5

To change more specific values the user can call the --put command.

arvcli --put fp/config/aravis/frame_rate
Value = 10
Waiting for status... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:01
frame_rate = 10

In both cases the path given is parsed by the python code and an http request and json path are formulated.

Get requests#

Any paths starting with the “fp” value are truncated after the 3rd value. The first part is added as part of the http request and the later parts are used to parse the json file.

In the above case, the “fp/config/aravis/” is transformed into “http:/< ip_address >/api/0.1/fp/config/aravis/” and the value frame_rate is used as a json key. “sys” paths are split immediately after sys, and aravis paths are sent as http paths directly.

Put request#

All put requests are either of the form “aravis/config” or “fp/config/< plugin >/” with one more path key. The additional key is then used to create a json file sent to the server together with the input variable.

Valid path list#

The following is a list of example tree of paths that work with the aravis, live view and hdf plugin for the get function:

sys/
fp/ status  / aravis
            / view
            / hdf
    config  / aravis
            / view
            / hdf
aravis  / status
        / config

To each of this paths an additional value key can be added (eg. “frame_rate”) to target a specific value. To get an accurate list of possible simply call the path as follows:

arvcli --get fp/config/aravis
aravis = {'ip_address': '127.0.0.1', 'camera_id': '', 'camera_serial_number': '', 'camera_model': '',
        'exposure_time': 0.0, 'frame_rate': 0.0, 'frame_count': 1500, 'pixel_format': 'Mono8', 
        'acquisition_mode': 'Continuous', 'status_frequency_ms': 1000, 'empty_buffers': 50,
        'file_path': 'odin_camera_driver/temp', 'data_set_name': 'data', 'file_name': 'test'}

Commands#

Arvcli has subcommands (eg, --get, --put) that take one argument and commands. Commands are more complex and have their own subcommands.

To get a list of subcommands for a command simply use the --help tag after stating the command as follows:

arvcli connect --help
                                                                                        
 Usage: arvcli connect [OPTIONS]                                                        
                                                                                        
 Connects the AravisDetector plugin to a camera.                                                                    
                                                                                        
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --ip_address  -ip      TEXT  ip address of the GigE cam [default: None]              │
│ --list        -l             list all the cameras detected                           │
│ --help                       Show this message and exit.                             │
╰──────────────────────────────────────────────────────────────────────────────────────╯

Frame acquisition#

By “frame acquisition” we refer strictly to the capture of image buffers and their conversion to odin frame objects. These frames can then be saved by activating the hdf plugin (as explained in the following section).

The acquisition control is done through the stream command:

$ arvcli stream --help
                                                                                   
 Usage: arvcli stream [OPTIONS]                                                    
                                                                                   
 Control camera frame acquisition in continuous mode                               
                                                                                   
╭─ Options ───────────────────────────────────────────────────────────────────────╮
│ --start    -on                start acquiring frames in continuous mode         │
│ --stop     -off               stop acquiring frames in continuous mode          │
│ --capture  -c        INTEGER  Acquire a fixed number of frames in continuous    │
│                               mode                                              │
│                               [default: None]                                   │
│ --help                        Show this message and exit.                       │
╰─────────────────────────────────────────────────────────────────────────────────╯

HDF plugin (saving images)#

The HDF plugin can be controlled using the hdf command. The cli allows the user to either prepare the plugin for frame acquisition (arm) or prepare the plugin and start frame acquisition at the same time (start). Additionally, the path, name and number of saved frames can be specified using the following subcommands:

$ arvcli hdf --help
                                                                                   
 Usage: arvcli hdf [OPTIONS]                                                                                                                        
                                                                                   
╭─ Options ───────────────────────────────────────────────────────────────────────╮
│ --start  -s                start file writer                                    │
│ --stop   -s                stop the file writer                                 │
│ --write  -w                start file writer and start acquisition              │
│ --stopW  -sw               stop file writer and acquisition                     │
│ --file   -f       TEXT     saving file name [default: None]                     │
│ --path   -p       TEXT     path to the directory [default: None]                │
│ --num    -n       INTEGER  number of files to save [default: None]              │
│ --help                     Show this message and exit.                          │
╰─────────────────────────────────────────────────────────────────────────────────╯

The file name defaults to a string value of the form “run_<time stamp>” and the path and file number default to the values specified in the config file.

Settings and custom commands#

Arvcli uses a config.yml file to store the IP address and port of the odin-control server as well as default values. This file can be edited directly (and this is encouraged) but the user can also change the IP address and port using the --ip and -port commands.

Additionally, the http command can be used to send direct put/get requests to the odin server:

$ arvcli http --help
                                                                                        
 Usage: arvcli http [OPTIONS]                                                           
                                                                                        
 send custom HTTP requests                                                              
 Use this for trouble shooting and custom functions                                     
 Api requests are of the following form:                                                
 /api/0.1/aravis/config/start_acquisition /api/0.1/aravis/config/stop_acquisition       
 /api/0.1/aravis/config/exposure_time /api/0.1/fp/config/hdf/write                      
 /api/0.1/fp/config/hdf/file/path /api/0.1/fp/config/hdf/file/name                      
 /api/0.1/fp/config/hdf/master /api/0.1/view/image 
 Args:
      put (str): an HTTP request  of the form: /api/0.1/aravis/config/start_acquisition     
      get (str): an HTTP request  of the form:                                                                           
                                                                                        
╭─ Options ────────────────────────────────────────────────────────────────────────────╮
│ --put    -p      TEXT  send a command to the server [default: None]                  │
│ --value  -v      TEXT  value to send to server [default: None]                       │
│ --get    -g      TEXT  request information from the server [default: None]           │
│ --help                 Show this message and exit.                                   │
╰──────────────────────────────────────────────────────────────────────────────────────╯