diff --git a/.github/workflows/_build_sdist_.yml b/.github/workflows/_build_sdist_.yml
new file mode 100644
index 0000000..7b69e3a
--- /dev/null
+++ b/.github/workflows/_build_sdist_.yml
@@ -0,0 +1,32 @@
+name: Build sdist
+
+on:
+ workflow_call:
+ workflow_dispatch: # Manual trigger
+
+jobs:
+ _build-sdist_:
+ name: Build sdist
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.13'
+
+ - name: Install dependencies
+ run: python -m pip install --upgrade pip build setuptools
+
+ - name: Set PVCAM_SDK_PATH on Linux
+ run: echo "PVCAM_SDK_PATH=${GITHUB_WORKSPACE}/pvcam-sdk/linux" >> $GITHUB_ENV
+
+ - name: Build package
+ run: python -m build --sdist
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: pyvcam_sdist
+ path: dist/
+ if-no-files-found: error
diff --git a/.github/workflows/_build_wheels_.yml b/.github/workflows/_build_wheels_.yml
new file mode 100644
index 0000000..e743d3e
--- /dev/null
+++ b/.github/workflows/_build_wheels_.yml
@@ -0,0 +1,71 @@
+name: Build wheels
+
+on:
+ workflow_call:
+ workflow_dispatch: # Manual trigger
+
+jobs:
+ _build-wheels_:
+ name: Build wheel (${{ matrix.os }} Python ${{ matrix.python }})
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ fail-fast: false
+ matrix:
+ # Don't use '*-latest' to ensure the oldest Python version is not
+ # dropped on upgrade.
+ # Use 'ubuntu-22.04' because 24.04 is not available for 'act' yet.
+ # The 'ubuntu-*-arm' runners are not free for open source yet.
+ os:
+ - 'ubuntu-22.04'
+ #- 'ubuntu-22.04-arm'
+ - 'windows-2022'
+ python:
+ - '3.9'
+ - '3.10'
+ - '3.11'
+ - '3.12'
+ - '3.13'
+ exclude:
+ # The 'ubuntu-*-arm' and 'windows*' runners are not supported by 'act'
+ #- os: ${{ github.event.act && 'ubuntu-22.04-arm' }}
+ - os: ${{ github.event.act && 'windows-2022' }}
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python }}
+
+ - name: Install dependencies
+ run: python -m pip install --upgrade pip build setuptools
+
+ - if: runner.os == 'Windows'
+ name: Set PVCAM_SDK_PATH on Windows
+ shell: bash
+ run: echo "PVCAM_SDK_PATH=${GITHUB_WORKSPACE}/pvcam-sdk/windows" >> $GITHUB_ENV
+ - if: runner.os == 'Linux'
+ name: Set PVCAM_SDK_PATH on Linux
+ run: echo "PVCAM_SDK_PATH=${GITHUB_WORKSPACE}/pvcam-sdk/linux" >> $GITHUB_ENV
+
+ - if: runner.os == 'Linux'
+ name: Create PVCAM library symlinks on Linux
+ shell: bash
+ run: |
+ for d in i686 x86_64 aarch64; do
+ cd "$PVCAM_SDK_PATH/library/$d"
+ f=$(echo libpvcam.so.*.*)
+ chmod +x "$f"
+ ln -sf "$f" "${f%.*}"
+ ln -sf "$f" "${f%%.so.*}.so"
+ done
+
+ - name: Build package
+ run: python -m build --wheel
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: pyvcam_wheel_${{ matrix.os }}_py${{ matrix.python }}
+ path: dist/
+ if-no-files-found: error
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..a667f18
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,48 @@
+name: Build all
+
+on:
+ push:
+ branches:
+ - master
+ paths:
+ - '!docs/**'
+ - '!README.md'
+ pull_request:
+ branches:
+ - master
+ paths:
+ - '!docs/**'
+ - '!README.md'
+ workflow_dispatch: # Manual trigger
+
+jobs:
+ build-sdist:
+ uses: './.github/workflows/_build_sdist_.yml'
+
+ build-wheels:
+ uses: './.github/workflows/_build_wheels_.yml'
+
+ build:
+ needs:
+ - build-sdist
+ - build-wheels
+
+ name: Build all
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/download-artifact@v4
+ with:
+ pattern: pyvcam_*
+ path: dist/
+ merge-multiple: true
+
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.13'
+
+ - name: Install dependencies
+ run: python -m pip install --upgrade pip twine packaging
+
+ - name: Check package
+ run: python -m twine check --strict dist/*
diff --git a/.github/workflows/deploy_pypi.yml b/.github/workflows/deploy_pypi.yml
new file mode 100644
index 0000000..b1e08c1
--- /dev/null
+++ b/.github/workflows/deploy_pypi.yml
@@ -0,0 +1,44 @@
+name: PyPI Release
+
+on:
+ release:
+ types:
+ - released
+ workflow_dispatch: # Manual trigger
+
+jobs:
+ _build-sdist:
+ if: github.repository == 'Photometrics/PyVCAM' && !github.event.act # Skip job during local testing
+ uses: './.github/workflows/_build_sdist_.yml'
+
+ _build-wheels:
+ if: github.repository == 'Photometrics/PyVCAM' && !github.event.act # Skip job during local testing
+ uses: './.github/workflows/_build_wheels_.yml'
+
+ deploy-pypi:
+ if: github.repository == 'Photometrics/PyVCAM' && !github.event.act # Skip job during local testing
+ needs:
+ - _build-sdist
+ - _build-wheels
+
+ name: Upload to PyPI
+ runs-on: ubuntu-latest
+
+ environment:
+ name: pypi
+ url: https://pypi.org/p/PyVCAM
+
+ permissions:
+ id-token: write # Mandatory for trusted publishing
+
+ steps:
+ - uses: actions/download-artifact@v4
+ with:
+ pattern: pyvcam_*
+ path: dist/
+ merge-multiple: true
+
+ - name: Print out packages
+ run: ls -la dist
+
+ - uses: pypa/gh-action-pypi-publish@release/v1
diff --git a/.github/workflows/deploy_testpypi.yml b/.github/workflows/deploy_testpypi.yml
new file mode 100644
index 0000000..2dd2b77
--- /dev/null
+++ b/.github/workflows/deploy_testpypi.yml
@@ -0,0 +1,52 @@
+name: TestPyPI Release
+
+on:
+ push:
+ tags:
+ - 'v*'
+ release:
+ types:
+ - prereleased
+ - released
+ workflow_dispatch: # Manual trigger
+
+jobs:
+ _build-sdist:
+ if: github.repository == 'Photometrics/PyVCAM'
+ uses: './.github/workflows/_build_sdist_.yml'
+
+ _build-wheels:
+ if: github.repository == 'Photometrics/PyVCAM'
+ uses: './.github/workflows/_build_wheels_.yml'
+
+ deploy-testpypi:
+ if: github.repository == 'Photometrics/PyVCAM'
+ needs:
+ - _build-sdist
+ - _build-wheels
+
+ name: Upload to TestPyPI
+ runs-on: ubuntu-latest
+
+ environment:
+ name: testpypi
+ url: https://test.pypi.org/p/PyVCAM
+
+ steps:
+ - uses: actions/download-artifact@v4
+ with:
+ pattern: pyvcam_*
+ path: dist/
+ merge-multiple: true
+
+ - name: Print out downloaded artifacts
+ run: ls -la dist
+
+ - uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ repository-url: https://test.pypi.org/legacy/
+ skip-existing: true
+ # Using token instead of trusted publishing to allow
+ # 'act' to publish to TestPyPI when testing actions locally.
+ user: __token__
+ password: ${{ secrets.TESTPYPI_API_TOKEN }}
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index c341e43..554244a 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -2,8 +2,6 @@ name: Tests
on:
push:
- branches:
- - master
pull_request:
branches:
- master
@@ -11,24 +9,23 @@ on:
jobs:
check:
- name: Check code quality - ${{ matrix.os }} - ${{ matrix.python-version }}
-
+ name: Check code quality (${{ matrix.os }} Python ${{ matrix.python }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
- os: [ubuntu-latest]
- python-version: ['3.12']
+ os:
+ - 'ubuntu-latest'
+ python:
+ - '3.13'
steps:
- - name: Checkout sources
- uses: actions/checkout@v4
+ - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v5
+ - uses: actions/setup-python@v5
with:
- python-version: ${{ matrix.python-version }}
+ python-version: ${{ matrix.python }}
- name: Update pip
run: python -m pip install --upgrade pip
@@ -37,9 +34,8 @@ jobs:
# Rather installing dependencies manually
#- name: Install the package with dependencies
# run: python -m pip install '.[gui,dev]'
- # Rather installing dependencies manually
- name: Install the package dependencies
- run: python -m pip install setuptools numpy opencv-python matplotlib
+ run: python -m pip install --upgrade setuptools numpy opencv-python matplotlib
- name: Validate pyproject.toml
run: |
diff --git a/README.md b/README.md
index fd6f356..6228df3 100644
--- a/README.md
+++ b/README.md
@@ -1,30 +1,70 @@
-# PyVCAM Wrapper
+# PyVCAM
-PyVCAM Wrapper is a Python3.X wrapper for the PVCAM SDK.
+[](https://github.com/Photometrics/PyVCAM/releases "GitHub stable release")
+[](https://github.com/Photometrics/PyVCAM/releases "GitHub latest release")
+
+[](https://pypi.org/project/PyVCAM/ "PyPI release")
+[](https://test.pypi.org/project/PyVCAM/ "TestPyPI release")
+[](https://python.org "Python versions")
+[](https://github.com/Photometrics/PyVCAM/actions/workflows/tests.yml "Tests status")
+[](http://isitmaintained.com/project/Photometrics/PyVCAM "Average time to resolve an issue")
+[](http://isitmaintained.com/project/Photometrics/PyVCAM "Percentage of issues still open")
+---
-## Getting Started
-Follow the instructions below to get PyVCAM up and running on your machine for
-development and testing.
+PyVCAM is a Python 3.x wrapper for the PVCAM library.
+
+## Installation
+The wrapper can be installed using the following command in an environment with
+`python` and `pip`:
+```
+pip install PyVCAM
+```
+It requires the latest PVCAM to be installed - can be downloaded
+[here](https://www.teledynevisionsolutions.com/products/pvcam-sdk-amp-driver/).
+
+The binary packages are available for 64-bit Windows and Linux on Intel platform only.
+For 32-bit or Arm Linux platform it must be complied from the source code.
+Please follow the instructions for development below.
+
+## Examples
+The installed package contains just the wrapper. If you want to get an image from
+the camera right away before writing your own application, PyVCAM repository contains
+multiple examples, like `seq_mode.py` or `live_mode.py`.
+
+Get a local copy of the GitHub repository by downloading the zip archive or cloning it
+e.g. from git command prompt:
+```
+git clone https://github.com/Photometrics/PyVCAM.git PyVCAM
+```
+Then switch to the folder with examples and run one:
+```
+cd PyVCAM/examples
+python seq_mode.py
+```
+Some examples show the image from camera in a UI window and require `opencv-python`
+or `matplotlib` packages to be installed.
+
+## Development
+For troubleshooting or active contribution you may want to install PyVCAM from GitHub.
### Prerequisites
-* An understanding of PVCAM is very helpful for understanding PyVCAM.
+* Cloned repository from GitHub as described in Examples chapter above.
* A C/C++ compiler is needed to build native source code.
- For Windows, the compilers from Visual Studio 2019 and 2022 were used for testing.
-* The newest version of Python 3 which can be downloaded
- [here](https://www.python.org/downloads/).
-* The latest PVCAM and PVCAM SDK which can be downloaded
+ On Windows, Visual Studio 2022 was used for testing.
+* The latest PVCAM and PVCAM SDK - both can be downloaded
[here](https://www.teledynevisionsolutions.com/products/pvcam-sdk-amp-driver/).
-* PyVCAM was developed and tested using Microsoft Windows 10/64-bit and Windows 11.
- Linux is also supported, but testing has been minimal.
### Installation
-When you are ready to install the wrapper use your command prompt to navigate into the directory
-that contains `pyproject.toml` file and run ```python -m pip install .``` (don't forget the dot
-at the end)
+Use your command prompt to navigate into the directory that contains `pyproject.toml`
+file and run:
+```
+pip install .
+```
-### How to use the wrapper
+## How to use the wrapper
+An understanding of PVCAM API is very helpful for understanding PyVCAM.
-#### Create Camera Example
+### Create Camera Example
This will create a camera object using the first camera that is found that can then be used
to interact with the camera.
```
@@ -36,7 +76,7 @@ cam = next(Camera.detect_camera()) # Use generator to find first camera
cam.open() # Open the camera
```
-#### Single Image Example
+### Single Image Example
This captures a single image with a 20 ms exposure time and prints the values of the first 5 pixels.
```
# A camera object named cam has already been created
@@ -44,7 +84,7 @@ frame = cam.get_frame(exp_time=20)
print("First five pixels of frame: {}, {}, {}, {}, {}".format(*frame[:5]))
```
-#### Changing Settings Example
+### Changing Settings Example
This is an example of how to change some of the settings on the cameras.
```
cam.clear_mode = "Never"
@@ -59,7 +99,7 @@ cam.clear_mode = const.CLEAR_NEVER
cam.exp_mode = const.EXT_TRIG_TRIG_FIRST
```
-#### Changing Speed Table Settings Example
+### Changing Speed Table Settings Example
When changing speed table, set new value to all three properties in this exact order:
`readout_port` → `speed` → `gain`, otherwise some legacy cameras could
end up in invalid state.
@@ -70,4 +110,4 @@ cam.gain = 1
```
More information on how to use this wrapper and how it works can be found in
-[docs/PyVCAM Wrapper.md](https://github.com/Photometrics/PyVCAM/blob/master/docs/PyVCAM%20Wrapper.md).
+[docs/PyVCAM.md](https://github.com/Photometrics/PyVCAM/blob/master/docs/PyVCAM.md).
diff --git a/docs/CheetSheet.txt b/docs/CheetSheet.txt
index db110d1..054ad1c 100644
--- a/docs/CheetSheet.txt
+++ b/docs/CheetSheet.txt
@@ -1,5 +1,8 @@
[[Installation]]
-pip install .
+From PyPI:
+ pip install PyVCAM
+From GitHub clone:
+ pip install .
[[Uninstallation]]
pip uninstall PyVCAM
diff --git a/docs/PyVCAM Wrapper.md b/docs/PyVCAM.md
similarity index 99%
rename from docs/PyVCAM Wrapper.md
rename to docs/PyVCAM.md
index 58263c3..f2cd908 100644
--- a/docs/PyVCAM Wrapper.md
+++ b/docs/PyVCAM.md
@@ -1,529 +1,529 @@
-# PyVCAM Wrapper
-
-
-* [PyVCAM Wrapper](#pyvcam-wrapper)
- * [Installing the Package](#installing-the-package)
- * [Creating a Wheel Package](#creating-a-wheel-package)
- * [Uninstalling the Package](#uninstalling-the-package)
- * [`src` Folder](#src-folder)
- * [`pyvcam` Folder](#pyvcam-folder)
- * [`camera.py`](#camerapy)
- * [Create Camera Example](#create-camera-example)
- * [Methods of `Camera` class](#methods-of-camera-class)
- * [Camera Selection](#camera-selection)
- * [Basic Frame Acquisition](#basic-frame-acquisition)
- * [Advanced Frame Acquisition](#advanced-frame-acquisition)
- * [Acquisition Configuration](#acquisition-configuration)
- * [Acquisition Trigger](#acquisition-trigger)
- * [Parameters](#parameters)
- * [Properties](#properties)
- * [Using Properties](#using-properties)
- * [List of Properties](#list-of-properties)
- * [`constants.py`](#constantspy)
- * [`pvcmodule.cpp`](#pvcmodulecpp)
- * [General Structure of a `pvc` Module Functions](#general-structure-of-a-pvc-module-functions)
- * [Retrieving Data](#retrieving-data)
- * [Arguments of `PyArg_ParseTuple`](#arguments-of-pyarg_parsetuple)
- * [`PyArg_ParseTuple` Example](#pyarg_parsetuple-example)
- * [Processing Acquired Data](#processing-acquired-data)
- * [Return Data to a Python Script](#return-data-to-a-python-script)
- * [Cast to Python Type](#cast-to-python-type)
- * [Functions of `pvc` Module](#functions-of-pvc-module)
- * [The Method Table](#the-method-table)
- * [The Module Definition](#the-module-definition)
- * [Module Creation](#module-creation)
- * [Creating Extension Module](#creating-extension-module)
- * [`constants_generator.py`](#constants_generatorpy)
- * [Requirements](#requirements)
- * [Running the Script](#running-the-script)
- * [`tests` Folder](#tests-folder)
- * [`change_settings_test.py` (needs `camera_settings.py`)](#change_settings_testpy-needs-camera_settingspy)
- * [`check_frame_status.py`](#check_frame_statuspy)
- * [`live_mode.py`](#live_modepy)
- * [`multi_camera.py`](#multi_camerapy)
- * [`multi_rois.py`](#multi_roispy)
- * [`newest_frame.py`](#newest_framepy)
- * [`seq_mode.py`](#seq_modepy)
- * [`single_image_polling.py`](#single_image_pollingpy)
- * [`single_image_polling_show.py`](#single_image_polling_showpy)
- * [`stream_to_disk.py`](#stream_to_diskpy)
- * [`sw_trigger.py`](#sw_triggerpy)
- * [`test_camera.py`](#test_camerapy)
-
-
-***
-
-## Installing the Package
-When you are ready to install the package, navigate to the directory that contains `pyproject.toml`
-file and run `python -m pip install .`.
-
-## Creating a Wheel Package
-To create a PyVCAM Wheel package, navigate to the directory that contains `pyproject.toml` file
-and run `python -m build`.
-
-## Uninstalling the Package
-When you are ready to uninstall the package, run from anywhere `python -m pip uninstall PyVCAM`.
-
-***
-
-## `src` Folder
-Where the source code of the `pyvcam` module is located. In addition to the code for the module,
-any additional scripts that are used to help write the module are included as well. The most notable
-helper script that is not included in the module is `constants_generator.py`, which generates the
-`constants.py` module by parsing the PVCAM header file `pvcam.h`.
-
-## `pyvcam` Folder
-The directory that contains the source code to the `pyvcam` module. These are the files installed
-when users install the module.
-
-### `camera.py`
-The `camera.py` module contains the `Camera` python class which is used to abstract the need to
-manually maintain, alter, and remember camera settings through PVCAM.
-
-#### Create Camera Example
-This will create a camera object using the first camera found, that can then be used to interact
-with the camera.
-
-```
-from pyvcam import pvc
-from pyvcam.camera import Camera
-
-pvc.init_pvcam() # Initialize PVCAM
-cam = next(Camera.detect_camera()) # Use generator to find the first camera
-cam.open() # Open the camera
-```
-
-#### Methods of `Camera` class
-
-##### Camera Selection
-| Method | Description |
-|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `__init__` | (Magic Method) The `Camera`'s constructor. Note that this method should not be used in the construction of a `Camera`. Instead, use the `detect_camera` class method to generate `Camera` classes of the currently available cameras connected to the system. |
-| `__repr__` | (Magic Method) Returns the name of the camera. |
-| `get_available_camera_names` | Return a list of camera names connected to the system. Use this method in conjunction with `select_camera`. Refer to `multi_camera.py` for a usage example. |
-| `detect_camera` | (Class method) Generator that yields a `Camera` object for a camera connected to the system. For an example of how to call `detect_camera`, refer to the code samples for creating a camera. |
-| `select_camera` | (Class method) Generator that yields a `Camera` object for the camera that matches the provided name. Use this method in conjunction with `get_available_camera_names`. Refer to `multi_camera.py` for a usage example. |
-| `open` | Opens the camera. Will set `__handle` to the correct value and `__is_open` to `True` if a successful call to PVCAM's open camera function is made. A `RuntimeError` will be raised if the call to PVCAM fails. For more information about how Python interacts with the PVCAM library, refer to the `pvcmodule.cpp` section of these notes. |
-| `close` | Closes the camera. Will set `__handle` to the default value for a closed camera (`-1`) and will set `__is_open` to `False` if a successful call to PVCAM's close camera function is made. A `RuntimeError` will be raised if the call to PVCAM fails. For more information about how Python interacts with the PVCAM library, refer to the `pvcmodule.cpp` section of these notes. |
-
-##### Basic Frame Acquisition
-| Method | Description |
-|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `get_frame` | Calls the `pvc` module's `get_frame` function with current camera settings to get a 2D numpy array of pixel data from a single snap image. This method can either be called with or without a given exposure time. If given, the method will use the given parameter. Otherwise, if left out, will use the internal `exp_time` attribute.
**Parameters:**
- Optional: `exp_time` (int): The exposure time to use.
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
-| `get_sequence` | Calls the `pvc` module's `get_frame` function with cameras current settings in rapid-succession to get a 3D numpy array of pixel data from a single snap image. Multiple ROIs are not supported.
**Getting a sequence example:**
`# Given that the camera is already opened as openCam`
`stack = openCam.get_sequence(8) # Getting a sequence of 8 frames`
`firstFrame = stack[0] # Accessing 2D frames from 3D stack`
`lastFrame = stack[7]`
**Parameters:**
- `num_frames` (int): The number of frames to be captured in the sequence.
- Optional: `exp_time` (int): The exposure time to use.
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
-| `get_vtm_sequence` | Modified `get_sequence` to be used for Variable Timed Mode. Before calling it, set the camera's exposure mode to `'Variable Timed'`. The timings will always start at the first given and keep looping around until it is captured the number of frames given. Multiple ROIs are not supported.
**Parameters:**
- `time_list` (list of int): The timings to be used by the camera in Variable Timed Mode.
- `exp_res` (int): The exposure time resolution. Supported are milliseconds (`0`), and for selected cameras also microseconds (`1`) and seconds (`2`). Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) `PARAM_EXP_RES` and `PARAM_EXP_RES_INDEX`.
- `num_frames` (int): The number of frames to be captured in the sequence.
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `interval` (int): Time to between each sequence frame (in milliseconds).
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
-
-##### Advanced Frame Acquisition
-| Method | Description |
-|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `start_live` | Calls `pvc.start_live` to setup a live mode acquisition. This must be called before `poll_frame`.
**Parameters:**
- Optional: `exp_time` (int): The exposure time for the acquisition. If not provided, the `exp_time` attribute is used.
- Optional: `buffer_frame_count` (int): The number of frames in the circular frame buffer. The default is 16 frames.
- Optional: `stream_to_disk_path` (str): The file path for data written directly to disk by PVCAM. The default is `None` which disables this feature.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
-| `start_seq` | Calls `pvc.start_seq` to setup a sequence mode acquisition. This must be called before `poll_frame`.
**Parameters:**
- Optional: `exp_time` (int): The exposure time for the acquisition. If not provided, the `exp_time` attribute is used.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
-| `check_frame_status` | Calls `pvc.check_frame_status` to report status of camera. This method can be called regardless of an acquisition being in progress.
**Parameters:**
|
-| `poll_frame` | Returns a single frame as a dictionary with optional metadata if available. This method must be called after either `start_live` or `start_seq` and before either `abort` or `finish`. Pixel data can be accessed via the `'pixel_data'` key. Available metadata can be accessed via the `'meta_data'` key.
If multiple ROIs are set, pixel data will be a list of region pixel data of length number of ROIs. Metadata will also contain information for ech ROI.
Use `cam.set_param(constants.PARAM_METADATA_ENABLED, True)` or `cam.metadata_enabled = True` to enable the metadata.
**Parameters:**
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `oldestFrame` (bool): If `True`, the returned frame will the oldest frame and will be popped off the queue. If `False`, the returned frame will be the newest frame and will not be removed from the queue. Default is `True`.
- Optional: `copyData` (bool): Returned numpy frames will contain a copy of image data. Without this copy, the numpy frame image data will point directly to the underlying frame buffer used by PVCAM. Disabling this copy will improve performance and decrease memory usage, but care must be taken. In live and sequence mode, frame memory is unallocated when calling abort or finish. In live mode, a circular frame buffer is used so frames are continuously overwritten. Default is `True`.
|
-| `reset_frame_counter` | Resets `frame_count` returned by `poll_frame` to zero.
**Parameters:**
|
-| `abort` | Calls `pvc.abort` to return the camera to its normal state prior to completing acquisition.
**Parameters:**
|
-| `finish` | Calls either `pvc.stop_live` or `pvc.finish_seq` to return the camera to its normal state after acquiring images.
**Parameters:**
|
-
-##### Acquisition Configuration
-| Method | Description |
-|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `reset_rois` | Restores region of interest to default which is full frame with binning disabled.
**Parameters:**
|
-| `set_roi` | Appends a new ROI to the camera's list of regions of interest. If the default ROI is currently set, this method will over-write that ROI. Each camera has a pre-defined maximum number of ROIs, which is typically 15. New ROIs can not exceed the boundaries of the sensor and can not overlap with existing ROIs.
**Parameters:**
- `s1`(int): Serial (X) coordinate of the ROI top-left corner.
- `p1`(int): Parallel (Y) coordinate of the ROI top-left corner.
- `width`(int): Num pixels in serial direction.
- `height`(int): Num pixels in parallel direction.
|
-| `shape` | Returns the reshape factor to be used when acquiring a ROI. This is equivalent to an acquired images shape.
**Parameters:**
|
-
-##### Acquisition Trigger
-| Method | Description |
-|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `sw_trigger` | This method will issue a software trigger command to the camera. This command is only valid if the camera has been set use a software trigger. Refer to `sw_trigger.py` for an example. |
-
-##### Parameters
-| Method | Description |
-|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `get_param` | Gets the current value of a specified attribute of given parameter. Usually not called directly since the properties (see below) will handle most cases of getting camera attributes. However, not all cases may be covered by the properties and a direct call may need to be made to PVCAM's `pl_get_param` function.
**Parameters**:
- `param_id` (int): The PVCAM defined value that corresponds to a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and `constants.py` section for list of available parameter ID values.
- `param_attr` (int): The PVCAM defined value that corresponds to an attribute of a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and `constants.py` section for list of available attribute ID values.
|
-| `set_param` | Sets a specified camera parameter to a new value. Usually not called directly since the properties (see below) will handle most cases of setting camera attributes. However, not all cases may be covered by the properties and a direct call may need to be made to PVCAM's `pl_set_param` function.
**Parameters:**
- `param_id` (int): The PVCAM defined value that corresponds to a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and `constants.py` section for list of available parameter ID values.
- `value` (various): The value to set the camera setting to. Make sure that its type closely matches the attribute's type so it can be properly set. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) for all possible attributes and their types.
|
-| `check_param` | Checks if a camera parameter is available. This method is useful for checking certain features are available (such as post-processing, expose out mode). Returns `True` if available, `False` if not.
**Parameters:**
- `param_id` (int): The PVCAM defined value that corresponds to a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and constants.py section for list of available parameter ID values.
|
-| `get_post_processing_param` | Gets the current value of a specified post-processing parameter.
**Parameters**:
- `feature_name` (str): A string name for the post-processing feature using this parameter. Feature names can be determined from the `post_processing_table` attribute.
- `param_name` (str): A string name for the post-processing parameter. Parameter names can be determined from the `post_processing_table` attribute.
|
-| `set_post_processing_param` | Sets the value of a specified post-processing parameter.
**Parameters**:
- `feature_name` (str): A string name for the post-processing feature using this parameter. Feature names can be determined from the `post_processing_table` attribute.
- `param_name` (str): A string name for the post-processing parameter. Parameter names can be determined from the `post_processing_table` attribute.
- `value` (int): The value to be assigned to the post-processing parameter. Value must fall within the range provided by the `post_processing_table` attribute.
|
-| `reset_pp` | If post-processing is available on the camera, the function will call `pvc.reset_pp` to reset all post-processing features back to their default state.
**Parameters:**
|
-| `read_enum` | Returns all settings names paired with their values of a specified setting.
**Parameters:**
- `param_id` (int): The parameter ID.
|
-
-#### Properties
-All properties are accessed via getters and setters. This means that it will appear that we are
-accessing instance variables from a camera, but in reality, these properties are making specially
-formatted calls to the `Camera` methods `get_param` and `set_param`. These getters and setters make
-use of the property decorator that is built into Python. The reasoning behind the usage of the
-property decorator is that attributes will change dynamically during a `Camera`'s lifetime and in
-order to abstract PVCAM as far away from the end user as possible, the property decorator allows for
-users to intuitively view and change camera settings.
-
-The downside to this approach is that when a new parameter is required, an associated getter/setter
-needs to be written and tested. Another downside to this implementation is that attribute lookup
-time is not instant; instead, a call must be made to the `pvc` module wrapper which will then call
-PVCAM, which will then return a result to the wrapper, which will finally return the result to the
-user. The time it takes is currently considered
-insignificant, but if this were to become an issue, the code could be refactored such that all
-attributes also have instance variables which are changed only when `set_param` or their associated
-setter is called on them.
-
-##### Using Properties
-```
-# Assume 'cam' is an already constructed 'Camera' instance
-current_gain = cam.gain # To call getter, simply read the property value
-cam.gain = current_gain # To call setter, simply assign new value to the property
-```
-
-##### List of Properties
-| Property | Description |
-|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `adc_offset` | (read-only) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the camera's current ADC offset value. Only CCD camera's have ADCs (analog-to-digital converters). |
-| `binning` | (read-write) Returns or changes the current serial and parallel binning values in a tuple.
The setter can be either a tuple for the binning (x, y) or a single value and will set a square binning with the given number, for example `cam.binning = x` makes `cam.__binning = (x, x)`.
Binning cannot be changed directly on the camera; but is used for setting up acquisitions and returning correctly shaped images returned from `get_frame`. The setter has built in checking to see that the given binning it able to be used later. Binning settings for individual ROIs is not supported. |
-| `binnings` | (read-only) Returns a list of supported combinations of serial and parallel binning factors if limited by the camera. If the camera supports arbitrary binning `None` is retuned. |
-| `bit_depth` | (read-only) Returns the native bit depth of pixel data for images collected with this camera.
Bit depth cannot be changed directly; instead, users must select a desired speed that has the desired bit depth. Note that a camera may have additional speed table entries for different readout ports. See [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual for a visual representation of a speed table and to see which settings are controlled by which speed is currently selected. |
-| `bit_depth_host` | (read-only) Returns the bit depth of pixel data outputted to the host. This parameter differs from the `bit_depth` in a way that it reports the bit depth of the output frame - a frame that is delivered to the host. Since PVCAM supports various host side post processing features, the host bit depth may differ from the native camera bit depth, depending on what host-side post processing features are active.
As a general rule, the application should always rely on the host-specific parameters when identifying the output data format. The native parameters should be used only for informational purposes, e.g. to show the camera native format in the GUI. |
-| `cam_fw` | (read-only) Returns the cameras current firmware version as a string. |
-| `centroids_mode` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current centroids mode, `'Locate'`, `'Track'` or `'Blob'`. |
-| `centroids_modes` | (read-only) Returns a dictionary containing centroid modes supported by the camera. |
-| `chip_name` | (read-only) Returns the camera sensor's name as a string. |
-| `clear_mode` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current clear mode of the camera. Note that clear modes have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the clear mode of a camera, either the integer value or the name of the clear mode can be specified. Refer to `constants.py` for the names of the clear modes. |
-| `clear_modes` | (read-only) Returns a dictionary containing clear modes supported by the camera. |
-| `clear_time` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the last acquisition's clearing time as reported by the camera in microseconds. |
-| `driver_version` | (read-only) Returns a formatted string containing the major, minor, and build version. When `get_param` is called on the device driver version, it returns a highly formatted 16 bit integer. The first 8 bits correspond to the major version, bits 9-12 are the minor version, and the last nibble is the build number. |
-| `exp_mode` | (read-write): Returns or changes the current exposure mode of the camera. Note that exposure modes have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the exposure mode of a camera, either the integer value or the name of the expose out mode can be specified. Refer to `constants.py` for the names of the exposure modes. |
-| `exp_modes` | (read-only) Returns a dictionary containing exposure modes supported by the camera. |
-| `exp_out_mode` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns or changes the current expose out mode of the camera. Note that expose out modes have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the expose out mode of a camera, either the integer value or the name of the expose out mode can be specified. Refer to `constants.py` for the names of the expose out modes. |
-| `exp_out_modes` | (read-only) Returns a dictionary containing exposure out modes supported by the camera. |
-| `exp_res` | (Getter and setter) Returns/changes the current exposure resolution of a camera. Note that exposure resolutions have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the exposure resolution of a camera, either the integer value or the name of the resolution can be specified. Refer to `constants.py` for the names of the exposure resolutions. |
-| `exp_res_index` | (read-only): Returns the current exposure resolution index. |
-| `exp_resolutions` | (read-only) Returns a dictionary containing exposure resolutions supported by the camera. |
-| `exp_time` | (read-write): Returns or changes the exposure time the camera will use if not given an exposure time. It is recommended to modify this value to modify your acquisitions for better abstraction. |
-| `fan_speed` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current fan speed setpoint of the camera. Note that fan speeds have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the fan speed of a camera, either the integer value or the name of the fan speed can be specified. Refer to `constants.py` for the names of the fan speeds. |
-| `fan_speeds` | (read-only) Returns a dictionary containing fan speeds supported by the camera. |
-| `gain` | (read-write) Returns or changes the current gain index for a camera. A `ValueError` will be raised if an invalid gain index is supplied to the setter. After changing `readout_port` it is strongly recommended to re-apply the settings of `speed` and `gain` exactly in that order. |
-| `gain_name` | (read-only) Returns the name of currently selected gain via `gain` under selected port and speed. It is either hard-coded generic string or provided by the camera. |
-| `handle` | (read-only) Returns the value currently stored inside the Camera's `__handle` instance variable. |
-| `is_open` | (read-only) Returns the value currently stored inside the Camera's `__is_open` instance variable. |
-| `last_exp_time` | (read-only) Returns the last exposure time the camera used for the last successful non-variable timed mode acquisition in what ever time resolution it was captured at. |
-| `metadata_enabled` | (read-write): Returns or changes the embedded frame metadata availability. |
-| `name` | (read-only) Returns the value currently stored inside the Camera's `__name` instance variable. |
-| `pix_time` | (read-only) Returns the camera's pixel time, which is the inverse of the speed of the camera. Pixel time cannot be changed directly; instead users must select a desired speed that has the desired pixel time. Note that a camera may have additional speed table entries for different readout ports. See [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual for a visual representation of a speed table and to see which settings are controlled by which speed table entry is currently selected. |
-| `port_speed_gain_table` | (read-only) Returns a dictionary containing the port, speed and gain table, which gives information such as bit depth and pixel time for each readout port, speed and gain. |
-| `post_processing_table` | (read-only) Returns a dictionary containing post-processing features and parameters as well as the minimum and maximum value for each parameter. |
-| `post_trigger_delay` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the last acquisition's post-trigger delay as reported by the camera in microseconds. |
-| `pre_trigger_delay` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the last acquisition's pre-trigger delay as reported by the camera in microseconds |
-| `prog_scan_mode` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current programmable scan mode, Auto, Line Delay or Scan Width. |
-| `prog_scan_modes` | (read-only) Returns a dictionary containing programmable scan modes supported by the camera. |
-| `prog_scan_dir` | (read-write) **Warning: Camera specific setting. Not all camera's support this attribute. If an unsupported camera attempts to access its readout_port, an AttributeError will be raised.**
Returns/changes the current programmable scan direction, `'Auto'`, `'Line Delay'` or `'Scan Width'`. |
-| `prog_scan_dirs` | (read-only) Returns a dictionary containing programmable scan directions supported by the camera. |
-| `prog_scan_dir_reset` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes scan direction reset state of camera. The parameter is used with alternate scan directions (down-up) to reset the direction with every acquisition. |
-| `prog_scan_line_delay` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the scan line delay. The parameter access mode depends on the `prog_scan_mode` selection. |
-| `prog_scan_width` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the scan width. The parameter access mode depends on the `prog_scan_mode` selection. |
-| `readout_port` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Some cameras may have many readout ports, which are output nodes from which a pixel stream can be read from. After changing `readout_port` it is strongly recommended to re-apply the settings of `speed` and `gain` exactly in that order. For more information about readout ports, refer to the [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual. |
-| `readout_ports` | (read-only) Returns a dictionary containing readout ports supported by the camera. |
-| `readout_time` | (read-only): Returns the last acquisition's readout time as reported by the camera in microseconds. |
-| `scan_line_time` | (Getter) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the scan line time of camera in nano seconds. |
-| `sensor_size` | (read-only) Returns the sensor size of the current camera in a tuple in the form (serial sensor size, parallel sensor size) |
-| `serial_no` | (read-only) Returns the camera's serial number as a string. |
-| `speed` | (read-write) Returns or changes the current numerical index of the speed table of a camera. After changing `readout_port` it is strongly recommended to re-apply the settings of `speed` and `gain` exactly in that order. See the [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual for a detailed explanation about PVCAM speed tables. |
-| `speed_name` | (read-only) Returns the name of currently selected speed via `speed` under selected port. It is either hard-coded generic string or provided by the camera. |
-| `temp` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the current temperature of a camera in Celsius. |
-| `temp_setpoint` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the camera's temperature setpoint. The temperature setpoint is the temperature that a camera will attempt to keep its temperature (in Celsius) at. |
-| `trigger_table` | (read-only) Returns a dictionary containing a table consisting of information of the last acquisition such as exposure time, readout time, clear time, pre-trigger delay, and post-trigger delay. If any of the parameters are unavailable, the dictionary item will be set to `'N/A'`. |
-| `vtm_exp_time` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns or changes the variable timed exposure time the camera uses for the `'Variable Timed'` exposure mode. |
-
-### `constants.py`
-The `constants.py` is a large data file that contains various camera settings and internal PVCAM
-structures used to map meaningful variable names to predefined integer values that camera firmware
-interprets as settings.
-
-This file is not (and should never be) constructed by hand. Instead, use the most recent version
-of `pvcam.h` and run `constants_generator.py` to (re)build this file. A more detailed explanation
-can be found under the `constants_generator.py` section, but the basic concept is that `pvcam.h` is
-parsed line by line, finding all predefined constants, enums, and structs to grant Python users
-access to the necessary data to perform basic PVCAM functions that have multiple settings.
-
-There are four main sections to this file that are found following a formatted comment like this
-`# # # # # #`:
-
-1. Defines
- 1. Much of the necessary data from `pvcam.h` is saved as C preprocessor macros which are easy to
- strip from the file and construct a Python variable whose name is the macros name and the
- value is what the macro expands to.
- 2. Macros can be thought of as Python variables in this case, as none (of the necessary macros)
- in `pvcam.h` expand to more than a literal.
-2. Enums
- 1. Enums (also known as enumerated types) are data types that contain named members used to
- identify certain integer values. Typically, if no values are specified, the first member will
- be assigned the value 0, and the successor will be 1+ the value of their predecessor. However,
- you can specify specific numbers for all members.
- 2. Vanilla Python has no enum type (it must be imported; see documentation here), and even still
- Python's enum class behaves somewhat differently in terms of accessing members. Instead, we
- will insert a comment above all enumerated types and have their members just be simple Python
- variables whose values where the integer assigned to them in the `pvcam.h` file.
-3. Structs
- 1. Structs are preserved as Python classes. No testing/implementation has been done with these,
- so results may be unexpected if implemented.
-4. Added By Hand
- 1. These are quality of life/readability dictionaries that map named settings of various camera
- modes to their `pvcam.h` integer value. These allow for fast look-up and intuitive setting
- changes for end users.
-
-### `pvcmodule.cpp`
-The `pvcmodule.cpp` is a set of C++ functions that make use of and extend the Python C-API known as
-a Python Extension Module. The need for a Python extension module is two-fold: first to allow
-communication between the static PVCAM library and Python scripts, and second for fast acquisition
-and conversion from native C types (namely C arrays of pixel data) to Python data types.
-The extension module needs to be compiled, so it will be necessary to have a C/C++ compiler to
-successfully install this application. The module will be compiled into a shared-object library,
-which can then be imported from Python; read more here.
-
-#### General Structure of a `pvc` Module Functions
-The registered functions of a `pvc` module usually follow a three-step process:
-1. Retrieve data from Python script
-2. Process acquired data
-3. Return data to Python script
-
-#### Retrieving Data
-Functions receive data dynamically through use of parameters, and the `pvc` module's functions are
-no different. However, the Python API states that all data is of type `PyObject`, which the C/C++
-programming language offer no builtin support for. In addition to, each Python-facing function must
-only have two arguments: `PyObject* self` (a pointer to the instance of whichever Python object
-called this C function) and `PyObject* args` (a Python tuple object that contains all the arguments
-passed into the C function call).
-
-However, we can make use of the `PyArg_ParseTuple` (see example here) function from the Python API
-to easily coerce the Python objects from the args tuple to their respective C type. In order for
-the conversion to occur, we must specify which type we want to coerce each Python argument to using
-a formatted string (see second argument for `PyArg_ParseTuple`). Each character in the formatted
-string are known as "format units" and are interpreted in the same order that the variables for
-the coerced C data are provided. Find below a small list of C data types and their corresponding
-format units. Use Python documentation for complete list.
-
-| C Type | Character Representation |
-|------------------------|--------------------------|
-| `long` | `l` |
-| `int` | `i` |
-| `double` | `d` |
-| `float` | `f` |
-| string (`const char*`) | `s` |
-| `PyObject` | `O` |
-
-#### Arguments of `PyArg_ParseTuple`
-1. `args` (`PyObject*`) - A Python tuple object that contains the arguments from the Python function
- call. For example, if a function call from Python is made: `my_c_func(1, "test")`, the `args`
- tuple would contain two `PyObject` pointers: one to the Python integer 1 and another to the
- Python Unicode-String `"test"`.
-2. `format` (`const char*`) - A String containing the format units for all the arguments found in
- the args in the same order in which they appear in the tuple. Going off of the example from the
- previous argument, the desired formatted string would be `"is"`: `'i'` for the integer 1, and
- `'s'` for the string `"test"`.
-
-In addition to these two arguments, addresses to the variables in which the coerced C data should be
-stored must also be passed as arguments to the `PyArg_ParseTuple` call. (See example for more details).
-
-#### `PyArg_ParseTuple` Example
-```
-static PyObject* example(PyObject* self, PyObject* args)
-{
- int myNum;
- char* myString;
- PyArg_ParseTuple(args, "is", &myNum, &myString);
- printf("myNum: %d\n", myNum); // Prints "myNum: 1"
- printf("myString: %s\n", myString); // Prints "myString: test"
- Py_RETURN_NONE;
-}
-```
-
-#### Processing Acquired Data
-Using the data supplied by the Python function call, we can now perform normal camera operations
-using PVCAM library function calls. The most common form of processing acquired data is to read the
-camera handle from the arguments provided, then performing a camera operation (changing/reading
-settings, getting images, etc.) using the acquired handle to identify which camera to perform the
-action on.
-
-Generally speaking, this part of the function should be very similar to writing normal C/C++ modules
-that use the PVCAM library. If there is any confusion about how to write C/C++ code to make calls to
-PVCAM, refer to the PvcamCodeSamples found in the Examples directory of the PVCAM SDK.
-
-Sometimes, processing data from a Python function call may entail answering a query. If this is the
-case, we need to specify what to return, and how to convert it into a corresponding Python type.
-
-#### Return Data to a Python Script
-Similar to how issues arose when passing data from the Python function call to the C/C++ module,
-there is no simple casting solution to convert C/C++ data types to Python data types when returning
-from a function.
-
-Thankfully, there are some functions that were included in the Python header file included at the
-top of each module to allow us to cast data to an equivalent Python type.
-
-#### Cast to Python Type
-```
-{
- ...
- const char* myString = "ika";
- return PyUnicode_FromString(myString); // Returns a Python string back to the calling function
-}
-```
-
-There is one small catch, however. All Python functions must return an object; there is no such
-thing as a `void` function. This means that we must always return something in our C/C++ modules as
-well (which we can tell by looking at the signature).
-If you wish to return `None`, simply use the `Py_RETURN_NONE` macro (see the `PyArg_ParseTuple`
-example for a visual representation).
-
-#### Functions of `pvc` Module
-**Note:** All functions will always have the `PyObject* self` and `PyObject* args` parameters.
-When parameters are listed, they are the Python parameters that are passed into the module.
-
-| Function Name | Description |
-|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `pvc_abort` | Given a camera handle, aborts any ongoing acquisition and de-registers the frame handler callback function.
**Parameters:**- Python int (camera handle).
|
-| `pvc_check_frame_status` | Given a camera handle, returns the current frame status as a string. Possible return values:- `'READOUT_NOT_ACTIVE'`
- `'EXPOSURE_IN_PROGRESS'`
- `'READOUT_IN_PROGRESS'`
- `'READOUT_COMPLETE'`/`'FRAME_AVAILABLE'`
- `'READOUT_FAILED'`
**Parameters:**- Python int (camera handle).
|
-| `pvc_check_param` | Given a camera handle and parameter ID, returns `True` if the parameter is available on the camera.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
|
-| `pvc_close_camera` | Given a camera handle, closes the camera. Returns `True` upon success. `ValueError` is raised if invalid parameter is supplied. `RuntimeError` raised otherwise.
**Parameters:**- Python int (camera handle).
|
-| `pvc_finish_seq` | Given a camera handle, finalizes sequence acquisition and cleans up resources. If a sequence is in progress, acquisition will be aborted.
**Parameters:**- Python int (camera handle).
|
-| `pvc_get_cam_fw_version` | Given a camera handle, returns camera firmware version as a string.
**Parameters:**- Python int (camera handle).
|
-| `pvc_get_cam_name` | Given a Python integer corresponding to a camera handle, returns the name of the camera with the associate handle.
**Parameters:**- Python int (camera handle).
|
-| `pvc_get_cam_total` | Returns the total number of cameras currently attached to the system as a Python integer. |
-| `pvc_get_frame` | Given a camera and a region, returns a Python numpy array of the pixel values of the data. Numpy array returned on success. `ValueError` raised if invalid parameters are supplied. `MemoryError` raised if unable to allocate memory for the camera frame. `RuntimeError` raised otherwise.
**Parameters:**- Python int (camera handle).
- Python list (Region of Interest objects)
- Python int (Numpy data type enumeration value)
- Python int (Frame timeout in milliseconds. Negative values will wait forever)
- Python bool (Flag selecting oldest or newest frame)
|
-| `pvc_get_param` | Given a camera handle, a parameter ID, and the attribute of the parameter in question (AVAIL, CURRENT, etc.) returns the value of the parameter at the current attribute.
**Note: This setting will only return a Python int or a Python string. Currently no other types are supported, but it is possible to extend the function as needed.**
`ValueError` is raised if invalid parameters are supplied. `AttributeError` is raised if camera does not support the specified parameter. `RuntimeError` is raised otherwise.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
- Python int (parameter attribute).
|
-| `pvc_get_pvcam_version` | Returns a Python Unicode String of the current PVCAM version. |
-| `pvc_init_pvcam` | Initializes the PVCAM library. Raises `RuntimeError` on failure. |
-| `pvc_open_camera` | Given a Python string corresponding to a camera name, opens the camera. Returns `True` upon success. `ValueError` is raised if invalid parameter is supplied. `RuntimeError` raised otherwise.
**Parameters:**- Python string (camera name).
|
-| `pvc_read_enum` | Function that when given a camera handle and a enumerated parameter will return a list mapping all valid setting names to their values for the camera. `ValueError` is raised if invalid parameters are supplied. `AttributeError` is raised if an invalid setting for the camera is supplied. `RuntimeError` is raised upon failure. A Python list of dictionaries is returned upon success.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
|
-| `pvc_reset_frame_counter` | Given a camera handle, resets `frame_count` returned by `pvc_poll_frame` to zero.
**Parameters:**- Python int (camera handle).
|
-| `pvc_reset_pp` | Given a camera handle, resets all camera post-processing parameters back to their default state.
**Parameters:**- Python int (camera handle).
|
-| `pvc_set_exp_modes` | Given a camera, exposure mode, and an expose out mode, change the camera's exposure mode to be the bitwise OR of the exposure mode and expose out mode parameters. `ValueError` is raised if invalid parameters are supplied including invalid modes for either exposure mode or expose out mode. `RuntimeError` is raised upon failure.
**Parameters:**- Python int (camera handle).
- Python int (exposure mode).
- Python int (expose out mode).
|
-| `pvc_set_param` | Given a camera handle, a parameter ID, and a new value for the parameter, set the camera's parameter to the new value. `ValueError` is raised if invalid parameters are supplied. `AttributeError` is raised when attempting to set a parameter not supported by a camera. `RuntimeError` is raised upon failure.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
- Generic Python value (any type) (new value for parameter).
|
-| `pvc_start_live` | Given a camera handle, region of interest, binning factors, exposure time and exposure mode, sets up a live mode acquisition.
**Parameters:**- Python int (camera handle).
- Python list (Region of Interest objects)
- Python int (exposure time).
- Python int (exposure mode).
- Python int (buffer frame count).
- Python str (stream to disk path).
- Python bool (reset frame counter)
|
-| `pvc_start_seq` | Given a camera handle, region of interest, binning factors, exposure time and exposure mode, sets up a sequence mode acquisition.
**Parameters:**- Python int (camera handle).
- Python list (Region of Interest objects)
- Python int (exposure time).
- Python int (exposure mode).
- Python int (total frames).
- Python bool (reset frame counter)
|
-| `pvc_sw_trigger` | Given a camera handle, performs a software trigger. Prior to using this function, the camera must be set to use either the `EXT_TRIG_SOFTWARE_FIRST` or `EXT_TRIG_SOFTWARE_EDGE` exposure mode.
**Parameters:**- Python int (camera handle).
|
-| `pvc_uninit_pvcam` | Uninitializes the PVCAM library. Raises `RuntimeError` on failure. |
-
-#### The Method Table
-All functions that need to be exposed to Python programs need to be included in the method table.
-The method table is partially responsible for allowing Python programs to call functions from an
-extension module. It does this by creating a list of `PyMethodDef` structs with a sentinel struct
-at the end of the list. The list of method definitions are then passed to the `PyModuleDef` struct,
-which contains the necessary information to construct the module.
-
-The method table is a list of `PyMethodDef` structs, which have the following four fields:
-
-| Field Name | C Type | Description |
-|------------|---------------|-------------------------------------------------------------------------|
-| `ml_name` | `const char*` | Name of the method (when called from Python) |
-| `ml_meth` | `PyCFunction` | Pointer to the C implementation of the function in the module. |
-| `ml_flags` | `int` | Flag bits indicating how the call to the function should be constructed |
-| `ml_doc` | `const char*` | Points to the contents of the docstring for the method. |
-
-#### The Module Definition
-The `PyModuleDef` structure contains all the information required to create the top-level module object.
-
-| Field Name | C Type | Description |
-|-------------|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `m_base` | `PyModuleDef_Base` | Always initialize this member to `PyModuleDef_HEAD_INIT` |
-| `m_name` | `const char*` | Name for the new module (must match the name in the Module Init function). |
-| `m_doc` | `const char*` | Docstring for the module. |
-| `m_size` | `Py_ssize_t` | Specifies the additional amount of memory a module requires for its "state".
Only needed if running in sub-interpreters; otherwise set to -1, signifying that the module does not support sub-interpreters because it has global state. |
-| `m_methods` | `PyMethodDef*` | Pointer to the method table. Can be `NULL` if no functions are present. |
-
-After creating the module definition structure, it can then be passed into the module creation function.
-
-#### Module Creation
-The module initialization function will create and return the module object directly.
-
-To initialize a module, write the `PyInit_{modulename}` function, which calls and returns the value
-of `PyModule_Create`. See example below:
-
-#### Creating Extension Module
-```
-PyMODINIT_FUNC
-PyInit_pvc(void)
-{
- return PyModule_Create(&pvcModule);
-}
-```
-
-### `constants_generator.py`
-The purpose of the `constants_generator.py` file is to easily construct a new `constants.py` data
-file should the file become tainted or a new version of PVCAM is released.
-
-The script targets three main parts of the header file: the predefined macros, the enums,
-and the structs.
-
-#### Requirements
-The constants generator targets the installation location of the PVCAM SDK on your machine, meaning
-that the script will fail to run if you do not have the SDK installed.
-
-#### Running the Script
-In order to run the script, ensure that you are running it from `/PyVCAM/pyvcam/src/`, or else it
-will fail to find the correct directory to write the generated `constants.py` file to.
-
-The script can be run using the following command when you are in the correct directory:
-`python constants_generator.py`
-
-***
-
-## `tests` Folder
-The `tests` directory contains unit tests to ensure the quality of the code of the module and to
-also include some basic examples on how to perform basic operations on a camera.
-
-### `change_settings_test.py` (needs `camera_settings.py`)
-The `change_settings_test.py` is used to show one way of keeping camera settings in one file and
-importing them to update a camera's settings in another file.
-
-This allows the user to quickly change the settings they wish to test on a camera without having to
-dig through a large testing script and manually changing the settings within it.
-
-**Note:** `camera_settings.py` needs to be included in the same directory in order to run this test.
-
-### `check_frame_status.py`
-The `check_frame_status.py` is used to demonstrate how to query frame status for both live and
-sequence acquisition modes.
-
-### `live_mode.py`
-The `live_mode.py` is used to demonstrate how to perform live frame acquisition using the advanced
-frame acquisition features of PyVCAM.
-
-### `multi_camera.py`
-The `multi_camera.py` is used to demonstrate how control acquire from multiple cameras simultaneously.
-
-### `multi_rois.py`
-The `multi_rois.py` is used to demonstrate how control acquire multiple regions of interest.
-
-### `newest_frame.py`
-The `newest_frame.py` is used to demonstrate how to acquire both the newest frame using the optional
-parameter to `poll_frame`.
-
-### `seq_mode.py`
-The `seq_mode.py` is used to demonstrate how to perform sequence frame acquisition using the
-advanced frame acquisition features of PyVCAM.
-
-### `single_image_polling.py`
-The `single_image_polling.py` is used to demonstrate how to collect single frames from a camera,
-starting from the detection and opening of an available camera to calling the `get_frame` function.
-
-Note that this test does not display the frame; only saves it locally to a variable and prints a few
-pixel points from it.
-If you want an example of how to quickly display a frame, see `single_image_polling_show.py`.
-
-### `single_image_polling_show.py`
-The `single_image_polling_show.py` is used to demonstrate how to collect a single frame from
-a camera and use matplotlib's pyplot subpackage in order to display the captured frame.
-
-**Note:** The test reverses the camera's sensor size when reshaping the array. This is because the
-camera sensor size tuple is row x column, and the shape of a numpy array is specified by column x row.
-
-### `stream_to_disk.py`
-The `stream_to_disk.py` is used to demonstrate how to stream frames directly to disk from
-a PVCAM C++ callback.
-
-### `sw_trigger.py`
-The `sw_trigger.py` is used to demonstrate how to perform a software trigger using two Python
-threads, one to configure acquisition and one to perform the trigger.
-
-### `test_camera.py`
-The `test_camera.py` contains the unit tests for this module.
-It tests the getting and setting properties and edge cases of all available settings.
-There are unit tests running the acquisition yet.
-
-All unit tests can be run from the command line using the command `python -m unittest discover`.
+# PyVCAM Wrapper
+
+
+* [PyVCAM Wrapper](#pyvcam-wrapper)
+ * [Installing the Package](#installing-the-package)
+ * [Creating a Wheel Package](#creating-a-wheel-package)
+ * [Uninstalling the Package](#uninstalling-the-package)
+ * [`src` Folder](#src-folder)
+ * [`pyvcam` Folder](#pyvcam-folder)
+ * [`camera.py`](#camerapy)
+ * [Create Camera Example](#create-camera-example)
+ * [Methods of `Camera` class](#methods-of-camera-class)
+ * [Camera Selection](#camera-selection)
+ * [Basic Frame Acquisition](#basic-frame-acquisition)
+ * [Advanced Frame Acquisition](#advanced-frame-acquisition)
+ * [Acquisition Configuration](#acquisition-configuration)
+ * [Acquisition Trigger](#acquisition-trigger)
+ * [Parameters](#parameters)
+ * [Properties](#properties)
+ * [Using Properties](#using-properties)
+ * [List of Properties](#list-of-properties)
+ * [`constants.py`](#constantspy)
+ * [`pvcmodule.cpp`](#pvcmodulecpp)
+ * [General Structure of a `pvc` Module Functions](#general-structure-of-a-pvc-module-functions)
+ * [Retrieving Data](#retrieving-data)
+ * [Arguments of `PyArg_ParseTuple`](#arguments-of-pyarg_parsetuple)
+ * [`PyArg_ParseTuple` Example](#pyarg_parsetuple-example)
+ * [Processing Acquired Data](#processing-acquired-data)
+ * [Return Data to a Python Script](#return-data-to-a-python-script)
+ * [Cast to Python Type](#cast-to-python-type)
+ * [Functions of `pvc` Module](#functions-of-pvc-module)
+ * [The Method Table](#the-method-table)
+ * [The Module Definition](#the-module-definition)
+ * [Module Creation](#module-creation)
+ * [Creating Extension Module](#creating-extension-module)
+ * [`constants_generator.py`](#constants_generatorpy)
+ * [Requirements](#requirements)
+ * [Running the Script](#running-the-script)
+ * [`tests` Folder](#tests-folder)
+ * [`change_settings_test.py` (needs `camera_settings.py`)](#change_settings_testpy-needs-camera_settingspy)
+ * [`check_frame_status.py`](#check_frame_statuspy)
+ * [`live_mode.py`](#live_modepy)
+ * [`multi_camera.py`](#multi_camerapy)
+ * [`multi_rois.py`](#multi_roispy)
+ * [`newest_frame.py`](#newest_framepy)
+ * [`seq_mode.py`](#seq_modepy)
+ * [`single_image_polling.py`](#single_image_pollingpy)
+ * [`single_image_polling_show.py`](#single_image_polling_showpy)
+ * [`stream_to_disk.py`](#stream_to_diskpy)
+ * [`sw_trigger.py`](#sw_triggerpy)
+ * [`test_camera.py`](#test_camerapy)
+
+
+***
+
+## Installing the Package
+When you are ready to install the package, navigate to the directory that contains `pyproject.toml`
+file and run `python -m pip install .`.
+
+## Creating a Wheel Package
+To create a PyVCAM Wheel package, navigate to the directory that contains `pyproject.toml` file
+and run `python -m build`.
+
+## Uninstalling the Package
+When you are ready to uninstall the package, run from anywhere `python -m pip uninstall PyVCAM`.
+
+***
+
+## `src` Folder
+Where the source code of the `pyvcam` module is located. In addition to the code for the module,
+any additional scripts that are used to help write the module are included as well. The most notable
+helper script that is not included in the module is `constants_generator.py`, which generates the
+`constants.py` module by parsing the PVCAM header file `pvcam.h`.
+
+## `pyvcam` Folder
+The directory that contains the source code to the `pyvcam` module. These are the files installed
+when users install the module.
+
+### `camera.py`
+The `camera.py` module contains the `Camera` python class which is used to abstract the need to
+manually maintain, alter, and remember camera settings through PVCAM.
+
+#### Create Camera Example
+This will create a camera object using the first camera found, that can then be used to interact
+with the camera.
+
+```
+from pyvcam import pvc
+from pyvcam.camera import Camera
+
+pvc.init_pvcam() # Initialize PVCAM
+cam = next(Camera.detect_camera()) # Use generator to find the first camera
+cam.open() # Open the camera
+```
+
+#### Methods of `Camera` class
+
+##### Camera Selection
+| Method | Description |
+|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `__init__` | (Magic Method) The `Camera`'s constructor. Note that this method should not be used in the construction of a `Camera`. Instead, use the `detect_camera` class method to generate `Camera` classes of the currently available cameras connected to the system. |
+| `__repr__` | (Magic Method) Returns the name of the camera. |
+| `get_available_camera_names` | Return a list of camera names connected to the system. Use this method in conjunction with `select_camera`. Refer to `multi_camera.py` for a usage example. |
+| `detect_camera` | (Class method) Generator that yields a `Camera` object for a camera connected to the system. For an example of how to call `detect_camera`, refer to the code samples for creating a camera. |
+| `select_camera` | (Class method) Generator that yields a `Camera` object for the camera that matches the provided name. Use this method in conjunction with `get_available_camera_names`. Refer to `multi_camera.py` for a usage example. |
+| `open` | Opens the camera. Will set `__handle` to the correct value and `__is_open` to `True` if a successful call to PVCAM's open camera function is made. A `RuntimeError` will be raised if the call to PVCAM fails. For more information about how Python interacts with the PVCAM library, refer to the `pvcmodule.cpp` section of these notes. |
+| `close` | Closes the camera. Will set `__handle` to the default value for a closed camera (`-1`) and will set `__is_open` to `False` if a successful call to PVCAM's close camera function is made. A `RuntimeError` will be raised if the call to PVCAM fails. For more information about how Python interacts with the PVCAM library, refer to the `pvcmodule.cpp` section of these notes. |
+
+##### Basic Frame Acquisition
+| Method | Description |
+|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `get_frame` | Calls the `pvc` module's `get_frame` function with current camera settings to get a 2D numpy array of pixel data from a single snap image. This method can either be called with or without a given exposure time. If given, the method will use the given parameter. Otherwise, if left out, will use the internal `exp_time` attribute.
**Parameters:**
- Optional: `exp_time` (int): The exposure time to use.
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
+| `get_sequence` | Calls the `pvc` module's `get_frame` function with cameras current settings in rapid-succession to get a 3D numpy array of pixel data from a single snap image. Multiple ROIs are not supported.
**Getting a sequence example:**
`# Given that the camera is already opened as openCam`
`stack = openCam.get_sequence(8) # Getting a sequence of 8 frames`
`firstFrame = stack[0] # Accessing 2D frames from 3D stack`
`lastFrame = stack[7]`
**Parameters:**
- `num_frames` (int): The number of frames to be captured in the sequence.
- Optional: `exp_time` (int): The exposure time to use.
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
+| `get_vtm_sequence` | Modified `get_sequence` to be used for Variable Timed Mode. Before calling it, set the camera's exposure mode to `'Variable Timed'`. The timings will always start at the first given and keep looping around until it is captured the number of frames given. Multiple ROIs are not supported.
**Parameters:**
- `time_list` (list of int): The timings to be used by the camera in Variable Timed Mode.
- `exp_res` (int): The exposure time resolution. Supported are milliseconds (`0`), and for selected cameras also microseconds (`1`) and seconds (`2`). Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) `PARAM_EXP_RES` and `PARAM_EXP_RES_INDEX`.
- `num_frames` (int): The number of frames to be captured in the sequence.
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `interval` (int): Time to between each sequence frame (in milliseconds).
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
+
+##### Advanced Frame Acquisition
+| Method | Description |
+|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `start_live` | Calls `pvc.start_live` to setup a live mode acquisition. This must be called before `poll_frame`.
**Parameters:**
- Optional: `exp_time` (int): The exposure time for the acquisition. If not provided, the `exp_time` attribute is used.
- Optional: `buffer_frame_count` (int): The number of frames in the circular frame buffer. The default is 16 frames.
- Optional: `stream_to_disk_path` (str): The file path for data written directly to disk by PVCAM. The default is `None` which disables this feature.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
+| `start_seq` | Calls `pvc.start_seq` to setup a sequence mode acquisition. This must be called before `poll_frame`.
**Parameters:**
- Optional: `exp_time` (int): The exposure time for the acquisition. If not provided, the `exp_time` attribute is used.
- Optional: `reset_frame_counter` (bool): Resets `frame_count` returned by `poll_frame`.
|
+| `check_frame_status` | Calls `pvc.check_frame_status` to report status of camera. This method can be called regardless of an acquisition being in progress.
**Parameters:**
|
+| `poll_frame` | Returns a single frame as a dictionary with optional metadata if available. This method must be called after either `start_live` or `start_seq` and before either `abort` or `finish`. Pixel data can be accessed via the `'pixel_data'` key. Available metadata can be accessed via the `'meta_data'` key.
If multiple ROIs are set, pixel data will be a list of region pixel data of length number of ROIs. Metadata will also contain information for ech ROI.
Use `cam.set_param(constants.PARAM_METADATA_ENABLED, True)` or `cam.metadata_enabled = True` to enable the metadata.
**Parameters:**
- Optional: `timeout_ms` (int): Duration to wait for new frames. Default is `WAIT_FOREVER`.
- Optional: `oldestFrame` (bool): If `True`, the returned frame will the oldest frame and will be popped off the queue. If `False`, the returned frame will be the newest frame and will not be removed from the queue. Default is `True`.
- Optional: `copyData` (bool): Returned numpy frames will contain a copy of image data. Without this copy, the numpy frame image data will point directly to the underlying frame buffer used by PVCAM. Disabling this copy will improve performance and decrease memory usage, but care must be taken. In live and sequence mode, frame memory is unallocated when calling abort or finish. In live mode, a circular frame buffer is used so frames are continuously overwritten. Default is `True`.
|
+| `reset_frame_counter` | Resets `frame_count` returned by `poll_frame` to zero.
**Parameters:**
|
+| `abort` | Calls `pvc.abort` to return the camera to its normal state prior to completing acquisition.
**Parameters:**
|
+| `finish` | Calls either `pvc.stop_live` or `pvc.finish_seq` to return the camera to its normal state after acquiring images.
**Parameters:**
|
+
+##### Acquisition Configuration
+| Method | Description |
+|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `reset_rois` | Restores region of interest to default which is full frame with binning disabled.
**Parameters:**
|
+| `set_roi` | Appends a new ROI to the camera's list of regions of interest. If the default ROI is currently set, this method will over-write that ROI. Each camera has a pre-defined maximum number of ROIs, which is typically 15. New ROIs can not exceed the boundaries of the sensor and can not overlap with existing ROIs.
**Parameters:**
- `s1`(int): Serial (X) coordinate of the ROI top-left corner.
- `p1`(int): Parallel (Y) coordinate of the ROI top-left corner.
- `width`(int): Num pixels in serial direction.
- `height`(int): Num pixels in parallel direction.
|
+| `shape` | Returns the reshape factor to be used when acquiring a ROI. This is equivalent to an acquired images shape.
**Parameters:**
|
+
+##### Acquisition Trigger
+| Method | Description |
+|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `sw_trigger` | This method will issue a software trigger command to the camera. This command is only valid if the camera has been set use a software trigger. Refer to `sw_trigger.py` for an example. |
+
+##### Parameters
+| Method | Description |
+|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `get_param` | Gets the current value of a specified attribute of given parameter. Usually not called directly since the properties (see below) will handle most cases of getting camera attributes. However, not all cases may be covered by the properties and a direct call may need to be made to PVCAM's `pl_get_param` function.
**Parameters**:
- `param_id` (int): The PVCAM defined value that corresponds to a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and `constants.py` section for list of available parameter ID values.
- `param_attr` (int): The PVCAM defined value that corresponds to an attribute of a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and `constants.py` section for list of available attribute ID values.
|
+| `set_param` | Sets a specified camera parameter to a new value. Usually not called directly since the properties (see below) will handle most cases of setting camera attributes. However, not all cases may be covered by the properties and a direct call may need to be made to PVCAM's `pl_set_param` function.
**Parameters:**
- `param_id` (int): The PVCAM defined value that corresponds to a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and `constants.py` section for list of available parameter ID values.
- `value` (various): The value to set the camera setting to. Make sure that its type closely matches the attribute's type so it can be properly set. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) for all possible attributes and their types.
|
+| `check_param` | Checks if a camera parameter is available. This method is useful for checking certain features are available (such as post-processing, expose out mode). Returns `True` if available, `False` if not.
**Parameters:**
- `param_id` (int): The PVCAM defined value that corresponds to a parameter. Refer to the [PVCAM User Manual](https://docs.teledynevisionsolutions.com/index.xhtml) and constants.py section for list of available parameter ID values.
|
+| `get_post_processing_param` | Gets the current value of a specified post-processing parameter.
**Parameters**:
- `feature_name` (str): A string name for the post-processing feature using this parameter. Feature names can be determined from the `post_processing_table` attribute.
- `param_name` (str): A string name for the post-processing parameter. Parameter names can be determined from the `post_processing_table` attribute.
|
+| `set_post_processing_param` | Sets the value of a specified post-processing parameter.
**Parameters**:
- `feature_name` (str): A string name for the post-processing feature using this parameter. Feature names can be determined from the `post_processing_table` attribute.
- `param_name` (str): A string name for the post-processing parameter. Parameter names can be determined from the `post_processing_table` attribute.
- `value` (int): The value to be assigned to the post-processing parameter. Value must fall within the range provided by the `post_processing_table` attribute.
|
+| `reset_pp` | If post-processing is available on the camera, the function will call `pvc.reset_pp` to reset all post-processing features back to their default state.
**Parameters:**
|
+| `read_enum` | Returns all settings names paired with their values of a specified setting.
**Parameters:**
- `param_id` (int): The parameter ID.
|
+
+#### Properties
+All properties are accessed via getters and setters. This means that it will appear that we are
+accessing instance variables from a camera, but in reality, these properties are making specially
+formatted calls to the `Camera` methods `get_param` and `set_param`. These getters and setters make
+use of the property decorator that is built into Python. The reasoning behind the usage of the
+property decorator is that attributes will change dynamically during a `Camera`'s lifetime and in
+order to abstract PVCAM as far away from the end user as possible, the property decorator allows for
+users to intuitively view and change camera settings.
+
+The downside to this approach is that when a new parameter is required, an associated getter/setter
+needs to be written and tested. Another downside to this implementation is that attribute lookup
+time is not instant; instead, a call must be made to the `pvc` module wrapper which will then call
+PVCAM, which will then return a result to the wrapper, which will finally return the result to the
+user. The time it takes is currently considered
+insignificant, but if this were to become an issue, the code could be refactored such that all
+attributes also have instance variables which are changed only when `set_param` or their associated
+setter is called on them.
+
+##### Using Properties
+```
+# Assume 'cam' is an already constructed 'Camera' instance
+current_gain = cam.gain # To call getter, simply read the property value
+cam.gain = current_gain # To call setter, simply assign new value to the property
+```
+
+##### List of Properties
+| Property | Description |
+|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `adc_offset` | (read-only) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the camera's current ADC offset value. Only CCD camera's have ADCs (analog-to-digital converters). |
+| `binning` | (read-write) Returns or changes the current serial and parallel binning values in a tuple.
The setter can be either a tuple for the binning (x, y) or a single value and will set a square binning with the given number, for example `cam.binning = x` makes `cam.__binning = (x, x)`.
Binning cannot be changed directly on the camera; but is used for setting up acquisitions and returning correctly shaped images returned from `get_frame`. The setter has built in checking to see that the given binning it able to be used later. Binning settings for individual ROIs is not supported. |
+| `binnings` | (read-only) Returns a list of supported combinations of serial and parallel binning factors if limited by the camera. If the camera supports arbitrary binning `None` is retuned. |
+| `bit_depth` | (read-only) Returns the native bit depth of pixel data for images collected with this camera.
Bit depth cannot be changed directly; instead, users must select a desired speed that has the desired bit depth. Note that a camera may have additional speed table entries for different readout ports. See [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual for a visual representation of a speed table and to see which settings are controlled by which speed is currently selected. |
+| `bit_depth_host` | (read-only) Returns the bit depth of pixel data outputted to the host. This parameter differs from the `bit_depth` in a way that it reports the bit depth of the output frame - a frame that is delivered to the host. Since PVCAM supports various host side post processing features, the host bit depth may differ from the native camera bit depth, depending on what host-side post processing features are active.
As a general rule, the application should always rely on the host-specific parameters when identifying the output data format. The native parameters should be used only for informational purposes, e.g. to show the camera native format in the GUI. |
+| `cam_fw` | (read-only) Returns the cameras current firmware version as a string. |
+| `centroids_mode` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current centroids mode, `'Locate'`, `'Track'` or `'Blob'`. |
+| `centroids_modes` | (read-only) Returns a dictionary containing centroid modes supported by the camera. |
+| `chip_name` | (read-only) Returns the camera sensor's name as a string. |
+| `clear_mode` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current clear mode of the camera. Note that clear modes have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the clear mode of a camera, either the integer value or the name of the clear mode can be specified. Refer to `constants.py` for the names of the clear modes. |
+| `clear_modes` | (read-only) Returns a dictionary containing clear modes supported by the camera. |
+| `clear_time` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the last acquisition's clearing time as reported by the camera in microseconds. |
+| `driver_version` | (read-only) Returns a formatted string containing the major, minor, and build version. When `get_param` is called on the device driver version, it returns a highly formatted 16 bit integer. The first 8 bits correspond to the major version, bits 9-12 are the minor version, and the last nibble is the build number. |
+| `exp_mode` | (read-write): Returns or changes the current exposure mode of the camera. Note that exposure modes have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the exposure mode of a camera, either the integer value or the name of the expose out mode can be specified. Refer to `constants.py` for the names of the exposure modes. |
+| `exp_modes` | (read-only) Returns a dictionary containing exposure modes supported by the camera. |
+| `exp_out_mode` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns or changes the current expose out mode of the camera. Note that expose out modes have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the expose out mode of a camera, either the integer value or the name of the expose out mode can be specified. Refer to `constants.py` for the names of the expose out modes. |
+| `exp_out_modes` | (read-only) Returns a dictionary containing exposure out modes supported by the camera. |
+| `exp_res` | (Getter and setter) Returns/changes the current exposure resolution of a camera. Note that exposure resolutions have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the exposure resolution of a camera, either the integer value or the name of the resolution can be specified. Refer to `constants.py` for the names of the exposure resolutions. |
+| `exp_res_index` | (read-only): Returns the current exposure resolution index. |
+| `exp_resolutions` | (read-only) Returns a dictionary containing exposure resolutions supported by the camera. |
+| `exp_time` | (read-write): Returns or changes the exposure time the camera will use if not given an exposure time. It is recommended to modify this value to modify your acquisitions for better abstraction. |
+| `fan_speed` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current fan speed setpoint of the camera. Note that fan speeds have names, but PVCAM interprets them as integer values. When called as a getter, the integer value will be returned to the user. However, when changing the fan speed of a camera, either the integer value or the name of the fan speed can be specified. Refer to `constants.py` for the names of the fan speeds. |
+| `fan_speeds` | (read-only) Returns a dictionary containing fan speeds supported by the camera. |
+| `gain` | (read-write) Returns or changes the current gain index for a camera. A `ValueError` will be raised if an invalid gain index is supplied to the setter. After changing `readout_port` it is strongly recommended to re-apply the settings of `speed` and `gain` exactly in that order. |
+| `gain_name` | (read-only) Returns the name of currently selected gain via `gain` under selected port and speed. It is either hard-coded generic string or provided by the camera. |
+| `handle` | (read-only) Returns the value currently stored inside the Camera's `__handle` instance variable. |
+| `is_open` | (read-only) Returns the value currently stored inside the Camera's `__is_open` instance variable. |
+| `last_exp_time` | (read-only) Returns the last exposure time the camera used for the last successful non-variable timed mode acquisition in what ever time resolution it was captured at. |
+| `metadata_enabled` | (read-write): Returns or changes the embedded frame metadata availability. |
+| `name` | (read-only) Returns the value currently stored inside the Camera's `__name` instance variable. |
+| `pix_time` | (read-only) Returns the camera's pixel time, which is the inverse of the speed of the camera. Pixel time cannot be changed directly; instead users must select a desired speed that has the desired pixel time. Note that a camera may have additional speed table entries for different readout ports. See [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual for a visual representation of a speed table and to see which settings are controlled by which speed table entry is currently selected. |
+| `port_speed_gain_table` | (read-only) Returns a dictionary containing the port, speed and gain table, which gives information such as bit depth and pixel time for each readout port, speed and gain. |
+| `post_processing_table` | (read-only) Returns a dictionary containing post-processing features and parameters as well as the minimum and maximum value for each parameter. |
+| `post_trigger_delay` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the last acquisition's post-trigger delay as reported by the camera in microseconds. |
+| `pre_trigger_delay` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the last acquisition's pre-trigger delay as reported by the camera in microseconds |
+| `prog_scan_mode` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the current programmable scan mode, Auto, Line Delay or Scan Width. |
+| `prog_scan_modes` | (read-only) Returns a dictionary containing programmable scan modes supported by the camera. |
+| `prog_scan_dir` | (read-write) **Warning: Camera specific setting. Not all camera's support this attribute. If an unsupported camera attempts to access its readout_port, an AttributeError will be raised.**
Returns/changes the current programmable scan direction, `'Auto'`, `'Line Delay'` or `'Scan Width'`. |
+| `prog_scan_dirs` | (read-only) Returns a dictionary containing programmable scan directions supported by the camera. |
+| `prog_scan_dir_reset` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes scan direction reset state of camera. The parameter is used with alternate scan directions (down-up) to reset the direction with every acquisition. |
+| `prog_scan_line_delay` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the scan line delay. The parameter access mode depends on the `prog_scan_mode` selection. |
+| `prog_scan_width` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the scan width. The parameter access mode depends on the `prog_scan_mode` selection. |
+| `readout_port` | (read-write) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Some cameras may have many readout ports, which are output nodes from which a pixel stream can be read from. After changing `readout_port` it is strongly recommended to re-apply the settings of `speed` and `gain` exactly in that order. For more information about readout ports, refer to the [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual. |
+| `readout_ports` | (read-only) Returns a dictionary containing readout ports supported by the camera. |
+| `readout_time` | (read-only): Returns the last acquisition's readout time as reported by the camera in microseconds. |
+| `scan_line_time` | (Getter) **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the scan line time of camera in nano seconds. |
+| `sensor_size` | (read-only) Returns the sensor size of the current camera in a tuple in the form (serial sensor size, parallel sensor size) |
+| `serial_no` | (read-only) Returns the camera's serial number as a string. |
+| `speed` | (read-write) Returns or changes the current numerical index of the speed table of a camera. After changing `readout_port` it is strongly recommended to re-apply the settings of `speed` and `gain` exactly in that order. See the [Port and Speed Choices](https://docs.teledynevisionsolutions.com/_speed_table.xhtml) section inside the PVCAM User Manual for a detailed explanation about PVCAM speed tables. |
+| `speed_name` | (read-only) Returns the name of currently selected speed via `speed` under selected port. It is either hard-coded generic string or provided by the camera. |
+| `temp` | (read-only): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns the current temperature of a camera in Celsius. |
+| `temp_setpoint` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns/changes the camera's temperature setpoint. The temperature setpoint is the temperature that a camera will attempt to keep its temperature (in Celsius) at. |
+| `trigger_table` | (read-only) Returns a dictionary containing a table consisting of information of the last acquisition such as exposure time, readout time, clear time, pre-trigger delay, and post-trigger delay. If any of the parameters are unavailable, the dictionary item will be set to `'N/A'`. |
+| `vtm_exp_time` | (read-write): **Warning: Camera specific setting. Not all cameras support this attribute. If an unsupported camera attempts to access it, an `AttributeError` will be raised.**
Returns or changes the variable timed exposure time the camera uses for the `'Variable Timed'` exposure mode. |
+
+### `constants.py`
+The `constants.py` is a large data file that contains various camera settings and internal PVCAM
+structures used to map meaningful variable names to predefined integer values that camera firmware
+interprets as settings.
+
+This file is not (and should never be) constructed by hand. Instead, use the most recent version
+of `pvcam.h` and run `constants_generator.py` to (re)build this file. A more detailed explanation
+can be found under the `constants_generator.py` section, but the basic concept is that `pvcam.h` is
+parsed line by line, finding all predefined constants, enums, and structs to grant Python users
+access to the necessary data to perform basic PVCAM functions that have multiple settings.
+
+There are four main sections to this file that are found following a formatted comment like this
+`# # # # # #`:
+
+1. Defines
+ 1. Much of the necessary data from `pvcam.h` is saved as C preprocessor macros which are easy to
+ strip from the file and construct a Python variable whose name is the macros name and the
+ value is what the macro expands to.
+ 2. Macros can be thought of as Python variables in this case, as none (of the necessary macros)
+ in `pvcam.h` expand to more than a literal.
+2. Enums
+ 1. Enums (also known as enumerated types) are data types that contain named members used to
+ identify certain integer values. Typically, if no values are specified, the first member will
+ be assigned the value 0, and the successor will be 1+ the value of their predecessor. However,
+ you can specify specific numbers for all members.
+ 2. Vanilla Python has no enum type (it must be imported; see documentation here), and even still
+ Python's enum class behaves somewhat differently in terms of accessing members. Instead, we
+ will insert a comment above all enumerated types and have their members just be simple Python
+ variables whose values where the integer assigned to them in the `pvcam.h` file.
+3. Structs
+ 1. Structs are preserved as Python classes. No testing/implementation has been done with these,
+ so results may be unexpected if implemented.
+4. Added By Hand
+ 1. These are quality of life/readability dictionaries that map named settings of various camera
+ modes to their `pvcam.h` integer value. These allow for fast look-up and intuitive setting
+ changes for end users.
+
+### `pvcmodule.cpp`
+The `pvcmodule.cpp` is a set of C++ functions that make use of and extend the Python C-API known as
+a Python Extension Module. The need for a Python extension module is two-fold: first to allow
+communication between the static PVCAM library and Python scripts, and second for fast acquisition
+and conversion from native C types (namely C arrays of pixel data) to Python data types.
+The extension module needs to be compiled, so it will be necessary to have a C/C++ compiler to
+successfully install this application. The module will be compiled into a shared-object library,
+which can then be imported from Python; read more here.
+
+#### General Structure of a `pvc` Module Functions
+The registered functions of a `pvc` module usually follow a three-step process:
+1. Retrieve data from Python script
+2. Process acquired data
+3. Return data to Python script
+
+#### Retrieving Data
+Functions receive data dynamically through use of parameters, and the `pvc` module's functions are
+no different. However, the Python API states that all data is of type `PyObject`, which the C/C++
+programming language offer no builtin support for. In addition to, each Python-facing function must
+only have two arguments: `PyObject* self` (a pointer to the instance of whichever Python object
+called this C function) and `PyObject* args` (a Python tuple object that contains all the arguments
+passed into the C function call).
+
+However, we can make use of the `PyArg_ParseTuple` (see example here) function from the Python API
+to easily coerce the Python objects from the args tuple to their respective C type. In order for
+the conversion to occur, we must specify which type we want to coerce each Python argument to using
+a formatted string (see second argument for `PyArg_ParseTuple`). Each character in the formatted
+string are known as "format units" and are interpreted in the same order that the variables for
+the coerced C data are provided. Find below a small list of C data types and their corresponding
+format units. Use Python documentation for complete list.
+
+| C Type | Character Representation |
+|------------------------|--------------------------|
+| `long` | `l` |
+| `int` | `i` |
+| `double` | `d` |
+| `float` | `f` |
+| string (`const char*`) | `s` |
+| `PyObject` | `O` |
+
+#### Arguments of `PyArg_ParseTuple`
+1. `args` (`PyObject*`) - A Python tuple object that contains the arguments from the Python function
+ call. For example, if a function call from Python is made: `my_c_func(1, "test")`, the `args`
+ tuple would contain two `PyObject` pointers: one to the Python integer 1 and another to the
+ Python Unicode-String `"test"`.
+2. `format` (`const char*`) - A String containing the format units for all the arguments found in
+ the args in the same order in which they appear in the tuple. Going off of the example from the
+ previous argument, the desired formatted string would be `"is"`: `'i'` for the integer 1, and
+ `'s'` for the string `"test"`.
+
+In addition to these two arguments, addresses to the variables in which the coerced C data should be
+stored must also be passed as arguments to the `PyArg_ParseTuple` call. (See example for more details).
+
+#### `PyArg_ParseTuple` Example
+```
+static PyObject* example(PyObject* self, PyObject* args)
+{
+ int myNum;
+ char* myString;
+ PyArg_ParseTuple(args, "is", &myNum, &myString);
+ printf("myNum: %d\n", myNum); // Prints "myNum: 1"
+ printf("myString: %s\n", myString); // Prints "myString: test"
+ Py_RETURN_NONE;
+}
+```
+
+#### Processing Acquired Data
+Using the data supplied by the Python function call, we can now perform normal camera operations
+using PVCAM library function calls. The most common form of processing acquired data is to read the
+camera handle from the arguments provided, then performing a camera operation (changing/reading
+settings, getting images, etc.) using the acquired handle to identify which camera to perform the
+action on.
+
+Generally speaking, this part of the function should be very similar to writing normal C/C++ modules
+that use the PVCAM library. If there is any confusion about how to write C/C++ code to make calls to
+PVCAM, refer to the PvcamCodeSamples found in the Examples directory of the PVCAM SDK.
+
+Sometimes, processing data from a Python function call may entail answering a query. If this is the
+case, we need to specify what to return, and how to convert it into a corresponding Python type.
+
+#### Return Data to a Python Script
+Similar to how issues arose when passing data from the Python function call to the C/C++ module,
+there is no simple casting solution to convert C/C++ data types to Python data types when returning
+from a function.
+
+Thankfully, there are some functions that were included in the Python header file included at the
+top of each module to allow us to cast data to an equivalent Python type.
+
+#### Cast to Python Type
+```
+{
+ ...
+ const char* myString = "ika";
+ return PyUnicode_FromString(myString); // Returns a Python string back to the calling function
+}
+```
+
+There is one small catch, however. All Python functions must return an object; there is no such
+thing as a `void` function. This means that we must always return something in our C/C++ modules as
+well (which we can tell by looking at the signature).
+If you wish to return `None`, simply use the `Py_RETURN_NONE` macro (see the `PyArg_ParseTuple`
+example for a visual representation).
+
+#### Functions of `pvc` Module
+**Note:** All functions will always have the `PyObject* self` and `PyObject* args` parameters.
+When parameters are listed, they are the Python parameters that are passed into the module.
+
+| Function Name | Description |
+|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `pvc_abort` | Given a camera handle, aborts any ongoing acquisition and de-registers the frame handler callback function.
**Parameters:**- Python int (camera handle).
|
+| `pvc_check_frame_status` | Given a camera handle, returns the current frame status as a string. Possible return values:- `'READOUT_NOT_ACTIVE'`
- `'EXPOSURE_IN_PROGRESS'`
- `'READOUT_IN_PROGRESS'`
- `'READOUT_COMPLETE'`/`'FRAME_AVAILABLE'`
- `'READOUT_FAILED'`
**Parameters:**- Python int (camera handle).
|
+| `pvc_check_param` | Given a camera handle and parameter ID, returns `True` if the parameter is available on the camera.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
|
+| `pvc_close_camera` | Given a camera handle, closes the camera. Returns `True` upon success. `ValueError` is raised if invalid parameter is supplied. `RuntimeError` raised otherwise.
**Parameters:**- Python int (camera handle).
|
+| `pvc_finish_seq` | Given a camera handle, finalizes sequence acquisition and cleans up resources. If a sequence is in progress, acquisition will be aborted.
**Parameters:**- Python int (camera handle).
|
+| `pvc_get_cam_fw_version` | Given a camera handle, returns camera firmware version as a string.
**Parameters:**- Python int (camera handle).
|
+| `pvc_get_cam_name` | Given a Python integer corresponding to a camera handle, returns the name of the camera with the associate handle.
**Parameters:**- Python int (camera handle).
|
+| `pvc_get_cam_total` | Returns the total number of cameras currently attached to the system as a Python integer. |
+| `pvc_get_frame` | Given a camera and a region, returns a Python numpy array of the pixel values of the data. Numpy array returned on success. `ValueError` raised if invalid parameters are supplied. `MemoryError` raised if unable to allocate memory for the camera frame. `RuntimeError` raised otherwise.
**Parameters:**- Python int (camera handle).
- Python list (Region of Interest objects)
- Python int (Numpy data type enumeration value)
- Python int (Frame timeout in milliseconds. Negative values will wait forever)
- Python bool (Flag selecting oldest or newest frame)
|
+| `pvc_get_param` | Given a camera handle, a parameter ID, and the attribute of the parameter in question (AVAIL, CURRENT, etc.) returns the value of the parameter at the current attribute.
**Note: This setting will only return a Python int or a Python string. Currently no other types are supported, but it is possible to extend the function as needed.**
`ValueError` is raised if invalid parameters are supplied. `AttributeError` is raised if camera does not support the specified parameter. `RuntimeError` is raised otherwise.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
- Python int (parameter attribute).
|
+| `pvc_get_pvcam_version` | Returns a Python Unicode String of the current PVCAM version. |
+| `pvc_init_pvcam` | Initializes the PVCAM library. Raises `RuntimeError` on failure. |
+| `pvc_open_camera` | Given a Python string corresponding to a camera name, opens the camera. Returns `True` upon success. `ValueError` is raised if invalid parameter is supplied. `RuntimeError` raised otherwise.
**Parameters:**- Python string (camera name).
|
+| `pvc_read_enum` | Function that when given a camera handle and a enumerated parameter will return a list mapping all valid setting names to their values for the camera. `ValueError` is raised if invalid parameters are supplied. `AttributeError` is raised if an invalid setting for the camera is supplied. `RuntimeError` is raised upon failure. A Python list of dictionaries is returned upon success.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
|
+| `pvc_reset_frame_counter` | Given a camera handle, resets `frame_count` returned by `pvc_poll_frame` to zero.
**Parameters:**- Python int (camera handle).
|
+| `pvc_reset_pp` | Given a camera handle, resets all camera post-processing parameters back to their default state.
**Parameters:**- Python int (camera handle).
|
+| `pvc_set_exp_modes` | Given a camera, exposure mode, and an expose out mode, change the camera's exposure mode to be the bitwise OR of the exposure mode and expose out mode parameters. `ValueError` is raised if invalid parameters are supplied including invalid modes for either exposure mode or expose out mode. `RuntimeError` is raised upon failure.
**Parameters:**- Python int (camera handle).
- Python int (exposure mode).
- Python int (expose out mode).
|
+| `pvc_set_param` | Given a camera handle, a parameter ID, and a new value for the parameter, set the camera's parameter to the new value. `ValueError` is raised if invalid parameters are supplied. `AttributeError` is raised when attempting to set a parameter not supported by a camera. `RuntimeError` is raised upon failure.
**Parameters:**- Python int (camera handle).
- Python int (parameter ID).
- Generic Python value (any type) (new value for parameter).
|
+| `pvc_start_live` | Given a camera handle, region of interest, binning factors, exposure time and exposure mode, sets up a live mode acquisition.
**Parameters:**- Python int (camera handle).
- Python list (Region of Interest objects)
- Python int (exposure time).
- Python int (exposure mode).
- Python int (buffer frame count).
- Python str (stream to disk path).
- Python bool (reset frame counter)
|
+| `pvc_start_seq` | Given a camera handle, region of interest, binning factors, exposure time and exposure mode, sets up a sequence mode acquisition.
**Parameters:**- Python int (camera handle).
- Python list (Region of Interest objects)
- Python int (exposure time).
- Python int (exposure mode).
- Python int (total frames).
- Python bool (reset frame counter)
|
+| `pvc_sw_trigger` | Given a camera handle, performs a software trigger. Prior to using this function, the camera must be set to use either the `EXT_TRIG_SOFTWARE_FIRST` or `EXT_TRIG_SOFTWARE_EDGE` exposure mode.
**Parameters:**- Python int (camera handle).
|
+| `pvc_uninit_pvcam` | Uninitializes the PVCAM library. Raises `RuntimeError` on failure. |
+
+#### The Method Table
+All functions that need to be exposed to Python programs need to be included in the method table.
+The method table is partially responsible for allowing Python programs to call functions from an
+extension module. It does this by creating a list of `PyMethodDef` structs with a sentinel struct
+at the end of the list. The list of method definitions are then passed to the `PyModuleDef` struct,
+which contains the necessary information to construct the module.
+
+The method table is a list of `PyMethodDef` structs, which have the following four fields:
+
+| Field Name | C Type | Description |
+|------------|---------------|-------------------------------------------------------------------------|
+| `ml_name` | `const char*` | Name of the method (when called from Python) |
+| `ml_meth` | `PyCFunction` | Pointer to the C implementation of the function in the module. |
+| `ml_flags` | `int` | Flag bits indicating how the call to the function should be constructed |
+| `ml_doc` | `const char*` | Points to the contents of the docstring for the method. |
+
+#### The Module Definition
+The `PyModuleDef` structure contains all the information required to create the top-level module object.
+
+| Field Name | C Type | Description |
+|-------------|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `m_base` | `PyModuleDef_Base` | Always initialize this member to `PyModuleDef_HEAD_INIT` |
+| `m_name` | `const char*` | Name for the new module (must match the name in the Module Init function). |
+| `m_doc` | `const char*` | Docstring for the module. |
+| `m_size` | `Py_ssize_t` | Specifies the additional amount of memory a module requires for its "state".
Only needed if running in sub-interpreters; otherwise set to -1, signifying that the module does not support sub-interpreters because it has global state. |
+| `m_methods` | `PyMethodDef*` | Pointer to the method table. Can be `NULL` if no functions are present. |
+
+After creating the module definition structure, it can then be passed into the module creation function.
+
+#### Module Creation
+The module initialization function will create and return the module object directly.
+
+To initialize a module, write the `PyInit_{modulename}` function, which calls and returns the value
+of `PyModule_Create`. See example below:
+
+#### Creating Extension Module
+```
+PyMODINIT_FUNC
+PyInit_pvc(void)
+{
+ return PyModule_Create(&pvcModule);
+}
+```
+
+### `constants_generator.py`
+The purpose of the `constants_generator.py` file is to easily construct a new `constants.py` data
+file should the file become tainted or a new version of PVCAM is released.
+
+The script targets three main parts of the header file: the predefined macros, the enums,
+and the structs.
+
+#### Requirements
+The constants generator targets the installation location of the PVCAM SDK on your machine, meaning
+that the script will fail to run if you do not have the SDK installed.
+
+#### Running the Script
+In order to run the script, ensure that you are running it from `/PyVCAM/pyvcam/src/`, or else it
+will fail to find the correct directory to write the generated `constants.py` file to.
+
+The script can be run using the following command when you are in the correct directory:
+`python constants_generator.py`
+
+***
+
+## `tests` Folder
+The `tests` directory contains unit tests to ensure the quality of the code of the module and to
+also include some basic examples on how to perform basic operations on a camera.
+
+### `change_settings_test.py` (needs `camera_settings.py`)
+The `change_settings_test.py` is used to show one way of keeping camera settings in one file and
+importing them to update a camera's settings in another file.
+
+This allows the user to quickly change the settings they wish to test on a camera without having to
+dig through a large testing script and manually changing the settings within it.
+
+**Note:** `camera_settings.py` needs to be included in the same directory in order to run this test.
+
+### `check_frame_status.py`
+The `check_frame_status.py` is used to demonstrate how to query frame status for both live and
+sequence acquisition modes.
+
+### `live_mode.py`
+The `live_mode.py` is used to demonstrate how to perform live frame acquisition using the advanced
+frame acquisition features of PyVCAM.
+
+### `multi_camera.py`
+The `multi_camera.py` is used to demonstrate how control acquire from multiple cameras simultaneously.
+
+### `multi_rois.py`
+The `multi_rois.py` is used to demonstrate how control acquire multiple regions of interest.
+
+### `newest_frame.py`
+The `newest_frame.py` is used to demonstrate how to acquire both the newest frame using the optional
+parameter to `poll_frame`.
+
+### `seq_mode.py`
+The `seq_mode.py` is used to demonstrate how to perform sequence frame acquisition using the
+advanced frame acquisition features of PyVCAM.
+
+### `single_image_polling.py`
+The `single_image_polling.py` is used to demonstrate how to collect single frames from a camera,
+starting from the detection and opening of an available camera to calling the `get_frame` function.
+
+Note that this test does not display the frame; only saves it locally to a variable and prints a few
+pixel points from it.
+If you want an example of how to quickly display a frame, see `single_image_polling_show.py`.
+
+### `single_image_polling_show.py`
+The `single_image_polling_show.py` is used to demonstrate how to collect a single frame from
+a camera and use matplotlib's pyplot subpackage in order to display the captured frame.
+
+**Note:** The test reverses the camera's sensor size when reshaping the array. This is because the
+camera sensor size tuple is row x column, and the shape of a numpy array is specified by column x row.
+
+### `stream_to_disk.py`
+The `stream_to_disk.py` is used to demonstrate how to stream frames directly to disk from
+a PVCAM C++ callback.
+
+### `sw_trigger.py`
+The `sw_trigger.py` is used to demonstrate how to perform a software trigger using two Python
+threads, one to configure acquisition and one to perform the trigger.
+
+### `test_camera.py`
+The `test_camera.py` contains the unit tests for this module.
+It tests the getting and setting properties and edge cases of all available settings.
+There are unit tests running the acquisition yet.
+
+All unit tests can be run from the command line using the command `python -m unittest discover`.
diff --git a/pvcam-sdk/linux/include/master.h b/pvcam-sdk/linux/include/master.h
new file mode 100644
index 0000000..f6ba5d1
--- /dev/null
+++ b/pvcam-sdk/linux/include/master.h
@@ -0,0 +1,120 @@
+/******************************************************************************/
+/* Copyright (C) Teledyne Photometrics. All rights reserved. */
+/******************************************************************************/
+
+#ifndef _MASTER_H
+#define _MASTER_H
+
+/*
+This allows us to insert the proper compiler flags, in pvcam.h for example,
+to cope properly with C++ definitions.
+*/
+#if defined(__cplusplus)
+ /* BORLAND C++ and GCC */
+ #define PV_C_PLUS_PLUS
+#elif defined(__cplusplus__)
+ /* MICROSOFT C++ */
+ #define PV_C_PLUS_PLUS
+#endif
+
+/******************************************************************************/
+/* Platform-specific defined like calling conventions, etc. */
+/******************************************************************************/
+
+#if defined(_WIN32) || defined(_WIN64)
+ #define PV_DECL __stdcall
+ #define DEPRECATED __declspec(deprecated)
+#elif defined(__linux__)
+ #define PV_DECL
+ #define DEPRECATED __attribute__((deprecated))
+#elif defined(__APPLE__)
+ #define PV_DECL
+ #define DEPRECATED __attribute__((deprecated))
+#endif
+
+/******************************************************************************/
+/* PVCAM types */
+/******************************************************************************/
+
+/** General error codes usually returned from functions as rs_bool value. */
+enum
+{
+ PV_FAIL = 0,
+ PV_OK
+};
+
+typedef unsigned short rs_bool;
+typedef signed char int8;
+typedef unsigned char uns8;
+typedef short int16;
+typedef unsigned short uns16;
+typedef int int32;
+typedef unsigned int uns32;
+typedef float flt32;
+typedef double flt64;
+
+#if defined(_MSC_VER)
+ typedef unsigned __int64 ulong64;
+ typedef signed __int64 long64;
+#else
+ typedef unsigned long long ulong64;
+ typedef signed long long long64;
+#endif
+
+/**
+@defgroup grp_pm_deprecated Deprecated symbols
+*/
+
+/**
+@defgroup grp_pm_deprecated_typedefs Deprecated types
+@ingroup grp_pm_deprecated
+These types are included for compatibility reasons.
+@{
+*/
+
+#define PV_PTR_DECL *
+
+typedef void* void_ptr;
+typedef void** void_ptr_ptr;
+
+typedef rs_bool* rs_bool_ptr;
+typedef char* char_ptr;
+typedef int8* int8_ptr;
+typedef uns8* uns8_ptr;
+typedef int16* int16_ptr;
+typedef uns16* uns16_ptr;
+typedef int32* int32_ptr;
+typedef uns32* uns32_ptr;
+typedef flt32* flt32_ptr;
+typedef flt64* flt64_ptr;
+typedef ulong64* ulong64_ptr;
+typedef long64* long64_ptr;
+
+typedef const rs_bool* rs_bool_const_ptr;
+typedef const char* char_const_ptr;
+typedef const int8* int8_const_ptr;
+typedef const uns8* uns8_const_ptr;
+typedef const int16* int16_const_ptr;
+typedef const uns16* uns16_const_ptr;
+typedef const int32* int32_const_ptr;
+typedef const uns32* uns32_const_ptr;
+typedef const flt32* flt32_const_ptr;
+typedef const flt64* flt64_const_ptr;
+typedef const ulong64* ulong64_const_ptr;
+typedef const long64* long64_const_ptr;
+
+/** @} */ /* grp_pm_deprecated_typedefs */
+
+/******************************************************************************/
+/* PVCAM constants */
+/******************************************************************************/
+
+#ifndef FALSE
+ #define FALSE PV_FAIL /* FALSE == 0 */
+#endif
+
+#ifndef TRUE
+ #define TRUE PV_OK /* TRUE == 1 */
+#endif
+
+#endif /* _MASTER_H */
diff --git a/pvcam-sdk/linux/include/pvcam.h b/pvcam-sdk/linux/include/pvcam.h
new file mode 100644
index 0000000..3b612ad
--- /dev/null
+++ b/pvcam-sdk/linux/include/pvcam.h
@@ -0,0 +1,4831 @@
+/******************************************************************************/
+/* Copyright (C) Teledyne Photometrics. All rights reserved. */
+/******************************************************************************/
+
+#ifndef _PVCAM_H
+#define _PVCAM_H
+
+/******************************************************************************/
+/* Constants */
+/******************************************************************************/
+
+/** Maximum number of cameras on this system. */
+#define MAX_CAM 16
+
+/******************************************************************************/
+/* Name/ID sizes */
+/******************************************************************************/
+
+/** Maximum length of a camera name including space for null terminator. */
+/** @see #pl_cam_get_name for details. */
+#define CAM_NAME_LEN 32
+/** @warning Deprecated. Use #MAX_PP_NAME_LEN instead. */
+/** @ingroup grp_pm_deprecated */
+#define PARAM_NAME_LEN 32
+/** Maximum length of an error message including space for null terminator. */
+/** @see #pl_error_message for details. */
+#define ERROR_MSG_LEN 255
+/** Maximum length of a sensor chip name including space for null terminator. */
+/** @see #PARAM_CHIP_NAME for details. */
+#define CCD_NAME_LEN 17
+/** Maximum length of a camera serial number string including space for null
+ terminator. */
+/** @see #PARAM_HEAD_SER_NUM_ALPHA for details. */
+#define MAX_ALPHA_SER_NUM_LEN 32
+/** Maximum length of a post-processing parameter/feature name including space
+ for null terminator. */
+/** @see #PARAM_PP_FEAT_NAME and #PARAM_PP_PARAM_NAME for details. */
+#define MAX_PP_NAME_LEN 32
+/** Maximum length of a system name including space for null terminator. */
+/** @see #PARAM_SYSTEM_NAME for details. */
+#define MAX_SYSTEM_NAME_LEN 32
+/** Maximum length of a vendor name including space for null terminator */
+/** @see #PARAM_VENDOR_NAME for details. */
+#define MAX_VENDOR_NAME_LEN 32
+/** Maximum length of a product name including space for null terminator. */
+/** @see #PARAM_PRODUCT_NAME for details. */
+#define MAX_PRODUCT_NAME_LEN 32
+/** Maximum length of a camera part number including space for null terminator. */
+/** @see #PARAM_CAMERA_PART_NUMBER for details. */
+#define MAX_CAM_PART_NUM_LEN 32
+/** Maximum length of a gain name including space for null terminator. */
+/** @see #PARAM_GAIN_NAME for details. */
+#define MAX_GAIN_NAME_LEN 32
+/** Maximum length of a speed name including space for null terminator. */
+/** @see #PARAM_SPDTAB_NAME for details. */
+#define MAX_SPDTAB_NAME_LEN 32
+/** Maximum length of a gain name including space for null terminator. */
+/** @see #PARAM_CAM_SYSTEMS_INFO for details. */
+#define MAX_CAM_SYSTEMS_INFO_LEN 1024
+
+/******************************************************************************/
+/* Data types */
+/******************************************************************************/
+
+/**
+GUID for #FRAME_INFO structure.
+*/
+typedef struct _TAG_PVCAM_FRAME_INFO_GUID
+{
+ uns32 f1;
+ uns16 f2;
+ uns16 f3;
+ uns8 f4[8];
+}
+PVCAM_FRAME_INFO_GUID;
+
+/**
+Structure used to uniquely identify frames in the camera.
+
+Please note that this information is generated by the low-level device driver.
+While the information is accurate for slower acquisitions and most legacy CCD cameras,
+these timestamps are still obtained from the operating systems. For that reason, the
+timestamps may not always represent the time of actual, in-camera acquisition.
+This is especially true for fast sCMOS cameras that implement an internal frame buffer.
+Such cameras often report both the BOF and EOF timestamps as identical numbers with the
+readout time reported as 0.
+For accurate hardware timestamps please see @ref EmbeddedFrameMetadata feature.
+*/
+typedef struct _TAG_FRAME_INFO
+{
+ PVCAM_FRAME_INFO_GUID FrameInfoGUID;
+ int16 hCam; /**< Handle of the camera that sent this structure. */
+ int32 FrameNr; /**< Frame number, 1-based. */
+ long64 TimeStamp; /**< Frame EOF (end-of-frame) timestamp. */
+ int32 ReadoutTime; /**< Frame readout time. */
+ long64 TimeStampBOF; /**< Frame BOF (beginning-of-frame timestamp. */
+}
+FRAME_INFO;
+
+/**
+The modes under which the camera can be opened.
+Used with the function #pl_cam_open.
+Treated as @c #int16 type.
+*/
+typedef enum PL_OPEN_MODES
+{
+ /** Default camera open mode. The camera is opened exclusively
+ for the calling process. */
+ OPEN_EXCLUSIVE
+}
+PL_OPEN_MODES;
+
+/**
+Used with the #PARAM_COOLING_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_COOL_MODES
+{
+ /**
+ This is a thermo-electrically (TE)-cooled camera with air or liquid assisted
+ cooling.
+ */
+ NORMAL_COOL,
+ /**
+ The camera is cryogenically cooled.
+ */
+ CRYO_COOL,
+ /**
+ The camera has no cooling or the cooling is optional and should be provided
+ by the end user.
+ */
+ NO_COOL
+}
+PL_COOL_MODES;
+
+/**
+Used with the #PARAM_MPP_CAPABLE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_MPP_MODES
+{
+ MPP_UNKNOWN,
+ MPP_ALWAYS_OFF,
+ MPP_ALWAYS_ON,
+ MPP_SELECTABLE
+}
+PL_MPP_MODES;
+
+/**
+Used with the #PARAM_SHTR_STATUS parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SHTR_MODES
+{
+ SHTR_FAULT,
+ SHTR_OPENING,
+ SHTR_OPEN,
+ SHTR_CLOSING,
+ SHTR_CLOSED,
+ SHTR_UNKNOWN
+}
+PL_SHTR_MODES;
+
+/**
+Used with the #PARAM_PMODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_PMODES
+{
+ PMODE_NORMAL,
+ PMODE_FT,
+ PMODE_MPP,
+ PMODE_FT_MPP,
+ PMODE_ALT_NORMAL,
+ PMODE_ALT_FT,
+ PMODE_ALT_MPP,
+ PMODE_ALT_FT_MPP
+}
+PL_PMODES;
+
+/**
+Used with the #PARAM_COLOR_MODE parameter ID.
+Treated as @c #int32 type (but should not exceed a value of 255 due to
+#md_frame_header.colorMask)
+*/
+typedef enum PL_COLOR_MODES
+{
+ COLOR_NONE = 0, /**< Monochrome camera, no color mask. */
+ COLOR_RESERVED = 1, /**< Reserved, do not use. */
+ COLOR_RGGB = 2, /**< Color camera with RGGB color mask. */
+ COLOR_GRBG, /**< Color camera with GRBG color mask. */
+ COLOR_GBRG, /**< Color camera with GBRG color mask. */
+ COLOR_BGGR /**< Color camera with BGGR color mask. */
+}
+PL_COLOR_MODES;
+
+/**
+Image format specifies the buffer format in which the pixels are
+transferred. The format should be used together with #PARAM_BIT_DEPTH
+because it specifies only the format of the pixel container, not the
+actual bit depth of the pixel it contains.
+Used with the #PARAM_IMAGE_FORMAT and #PARAM_IMAGE_FORMAT_HOST parameter IDs.
+Treated as @c #int32 type (but should not exceed a value of 255 due to
+#md_frame_header.imageFormat field).
+*/
+typedef enum PL_IMAGE_FORMATS
+{
+ PL_IMAGE_FORMAT_MONO16 = 0, /**< 16bit mono, 2 bytes per pixel. */
+ PL_IMAGE_FORMAT_BAYER16, /**< 16bit bayer masked image, 2 bytes per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_MONO8, /**< 8bit mono, 1 byte per pixel. */
+ PL_IMAGE_FORMAT_BAYER8, /**< 8bit bayer masked image, 1 byte per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_MONO24, /**< 24bit mono, 3 bytes per pixel. */
+ PL_IMAGE_FORMAT_BAYER24, /**< 24bit bayer masked image, 3 bytes per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_RGB24, /**< 8bit RGB, 1 byte per sample, 3 bytes per pixel. */
+ PL_IMAGE_FORMAT_RGB48, /**< 16bit RGB, 2 bytes per sample, 6 bytes per pixel. */
+ PL_IMAGE_FORMAT_RGB72, /**< 24bit RGB, 3 bytes per sample, 9 bytes per pixel. */
+ PL_IMAGE_FORMAT_MONO32, /**< 32bit mono, 4 bytes per pixel. */
+ PL_IMAGE_FORMAT_BAYER32, /**< 32bit bayer masked image, 4 bytes per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_RGB96 /**< 32bit RGB, 4 bytes per sample, 12 bytes per pixel. */
+}
+PL_IMAGE_FORMATS;
+
+/**
+Image compression used to reduce the size of the pixel data. Once the
+image is decompressed, the pixels can be accessed according to #PL_IMAGE_FORMATS type.
+Used with the #PARAM_IMAGE_COMPRESSION parameter ID.
+Treated as @c #int32 type (but should not exceed a value of 255 due to
+#md_frame_header.imageCompression field).
+*/
+typedef enum PL_IMAGE_COMPRESSIONS
+{
+ PL_IMAGE_COMPRESSION_NONE = 0, /**< No compression, the pixels can be accessed according to #PL_IMAGE_FORMATS */
+ /* Bit-packing compression modes */
+ PL_IMAGE_COMPRESSION_RESERVED8 = 8,
+ PL_IMAGE_COMPRESSION_BITPACK9, /**< 9-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK10, /**< 10-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK11, /**< 11-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK12, /**< 12-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK13, /**< 13-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK14, /**< 14-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK15, /**< 15-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_RESERVED16 = 16,
+ PL_IMAGE_COMPRESSION_BITPACK17, /**< 17-bit packing in 24bit format */
+ PL_IMAGE_COMPRESSION_BITPACK18, /**< 18-bit packing in 24bit format */
+ PL_IMAGE_COMPRESSION_RESERVED24 = 24,
+ PL_IMAGE_COMPRESSION_RESERVED32 = 32,
+ /* Other compression modes below */
+}
+PL_IMAGE_COMPRESSIONS;
+
+/**
+Frame rotation modes. Used with the #PARAM_HOST_FRAME_ROTATE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_ROTATE_MODES
+{
+ PL_FRAME_ROTATE_MODE_NONE = 0, /**< No rotation */
+ PL_FRAME_ROTATE_MODE_90CW, /**< 90 degrees clockwise */
+ PL_FRAME_ROTATE_MODE_180CW, /**< 180 degrees clockwise */
+ PL_FRAME_ROTATE_MODE_270CW /**< 270 degrees clockwise */
+}
+PL_FRAME_ROTATE_MODES;
+
+/**
+Frame flip modes. Used with the #PARAM_HOST_FRAME_FLIP parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_FLIP_MODES
+{
+ PL_FRAME_FLIP_MODE_NONE = 0, /**< No flip */
+ PL_FRAME_FLIP_MODE_X, /**< Horizontal flip, mirroring along x-axis */
+ PL_FRAME_FLIP_MODE_Y, /**< Vertical flip, mirroring along y-axis */
+ PL_FRAME_FLIP_MODE_XY /**< Horizontal and vertical flip */
+}
+PL_FRAME_FLIP_MODES;
+
+/**
+Frame summing formats. Used with the #PARAM_HOST_FRAME_SUMMING_FORMAT parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_SUMMING_FORMATS
+{
+ PL_FRAME_SUMMING_FORMAT_16_BIT = 0,
+ PL_FRAME_SUMMING_FORMAT_24_BIT,
+ PL_FRAME_SUMMING_FORMAT_32_BIT
+}
+PL_FRAME_SUMMING_FORMATS;
+
+/**
+Used with the function #pl_get_param.
+Treated as @c #int16 type.
+*/
+typedef enum PL_PARAM_ATTRIBUTES
+{
+ /**
+ Current value.
+ For the enumerated type the value returned here is the value
+ assigned to current enum item, not the item index.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_CURRENT,
+ /**
+ Number of possible values for enumerated and array data types.
+ If the data type returned by #ATTR_TYPE is #TYPE_CHAR_PTR (and not an
+ enumerated type), then the #ATTR_COUNT is the number of characters in the
+ string including a space for NULL terminator. If 0 or 1 is returned,
+ #ATTR_COUNT is a scalar (single element) of the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64, #TYPE_FLT64 and #TYPE_BOOLEAN.
+ The data type for this attribute is #TYPE_UNS32.
+ */
+ ATTR_COUNT,
+ /**
+ Data type of parameter.
+ Data types used by #pl_get_param with attribute type (#ATTR_TYPE) are:
+
+ | Value | Type |
+ |----------------------------|--------------------|
+ | TYPE_BOOLEAN | rs_bool |
+ | TYPE_INT8 | int8 |
+ | TYPE_UNS8 | uns8 |
+ | TYPE_INT16 | int16 |
+ | TYPE_UNS16 | uns16 |
+ | TYPE_INT32 | int32 |
+ | TYPE_UNS32 | uns32 |
+ | TYPE_INT64 | long64 |
+ | TYPE_UNS64 | ulong64 |
+ | TYPE_FLT32 | flt32 |
+ | TYPE_FLT64 | flt64 |
+ | TYPE_ENUM | int32 |
+ | TYPE_CHAR_PTR | char* |
+ | TYPE_VOID_PTR | void* |
+ | TYPE_VOID_PTR_PTR | void** |
+ | TYPE_SMART_STREAM_TYPE | smart_stream_type |
+ | TYPE_SMART_STREAM_TYPE_PTR | smart_stream_type* |
+ | TYPE_RGN_TYPE | rgn_type |
+ | TYPE_RGN_TYPE_PTR | rgn_type* |
+ | TYPE_RGN_LIST_TYPE | reserved |
+ | TYPE_RGN_LIST_TYPE_PTR | reserved |
+
+ The data type for this attribute is #TYPE_UNS16.
+ */
+ ATTR_TYPE,
+ /**
+ Minimum value. The value is only valid for the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64, #TYPE_FLT64 and #TYPE_BOOLEAN.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_MIN,
+ /**
+ Maximum value. The value is only valid for the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64, #TYPE_FLT64 and #TYPE_BOOLEAN.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_MAX,
+ /**
+ Default value. This value should be equal to the current value loaded
+ by camera on power up. For the enumerated type, the value returned here
+ is the value assigned to the current enum item, not the item index.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_DEFAULT,
+ /**
+ Step size for values (zero if non-linear or without increment).
+ The value is only valid for the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64 and #TYPE_FLT64. The value for this attribute
+ is never negative. If the value is non-zero, valid values can be easily
+ calculated. The first valid value is the value reported for the attribute #ATTR_MIN,
+ the second value is the minimum value plus increment (#ATTR_INCREMENT),
+ and so on up to the maximum value (#ATTR_MAX).
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_INCREMENT,
+ /**
+ Reports if the parameter with ID param_id can be written to and/or read from or
+ in case it cannot be written to and/or read, it tells whether a feature exists.
+ If the param_id can be either written to or read from, the next step is to determine
+ its data type.
+ The access types are enumerated:
+ #ACC_EXIST_CHECK_ONLY #ACC_READ_ONLY
+ #ACC_WRITE_ONLY #ACC_READ_WRITE
+ The data type for this attribute is #TYPE_UNS16.
+ */
+ ATTR_ACCESS,
+ /**
+ Feature available with attached hardware and software.
+ The data type for this attribute is #TYPE_BOOLEAN.
+ */
+ ATTR_AVAIL,
+ /**
+ Reports if the parameter can be accessed during active acquisition.
+ The data type for this attribute is #TYPE_BOOLEAN.
+ */
+ ATTR_LIVE
+}
+PL_PARAM_ATTRIBUTES;
+
+/**
+Used with the function #pl_get_param and #ATTR_ACCESS.
+Treated as @c #uns16 type.
+*/
+typedef enum PL_PARAM_ACCESS
+{
+ /** Parameter is read only, #pl_set_param for such parameter will fail. */
+ ACC_READ_ONLY = 1,
+ /** Parameter can be read and written. */
+ ACC_READ_WRITE,
+ /** Only parameter availability can be checked. */
+ ACC_EXIST_CHECK_ONLY,
+ /** Parameter can only be written. */
+ ACC_WRITE_ONLY
+}
+PL_PARAM_ACCESS;
+
+/**
+Used with the #PARAM_IO_TYPE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_IO_TYPE
+{
+ IO_TYPE_TTL, /**< The bit pattern written to this address.*/
+ IO_TYPE_DAC /**< The value of the desired analog output written to the DAC on this address.*/
+}
+PL_IO_TYPE;
+
+/**
+Used with the #PARAM_IO_DIRECTION parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_IO_DIRECTION
+{
+ IO_DIR_INPUT, /**< The port configured as input. */
+ IO_DIR_OUTPUT, /**< The port configured as output. */
+ IO_DIR_INPUT_OUTPUT /**< The port configured as bi-directional. */
+}
+PL_IO_DIRECTION;
+
+
+/**
+Used with the #PARAM_READOUT_PORT parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_READOUT_PORTS
+{
+ READOUT_PORT_0 = 0,
+ READOUT_PORT_1,
+ READOUT_PORT_2,
+ READOUT_PORT_3
+}
+PL_READOUT_PORTS;
+
+/**
+Used with the #PARAM_CLEAR_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_CLEAR_MODES
+{
+ /**
+ Don't ever clear the sensor. Useful for performing a readout after an
+ exposure has been aborted.
+ */
+ CLEAR_NEVER,
+ /**
+ Clear the sensor automatically. Modern cameras control the sensor clearing
+ as needed. Some cameras will report only this clearing mode. For backward
+ compatibility with existing applications, the 'auto' clearing mode is reported
+ under the same value as the 'clear never' mode.
+ */
+ CLEAR_AUTO = CLEAR_NEVER,
+ /**
+ Before each exposure, clears the sensor the number of times specified by the
+ @c clear_cycles variable. This mode can be used in a sequence. It is most
+ useful when there is a considerable amount of time between exposures.
+ */
+ CLEAR_PRE_EXPOSURE,
+ /**
+ Before each sequence, clears the sensor the number of times specified by the
+ @c clear_cycles variable. If no sequence is set up, this mode behaves as if
+ the sequence had one exposure. The result is the same as when using
+ #CLEAR_PRE_EXPOSURE.
+ */
+ CLEAR_PRE_SEQUENCE,
+ /**
+ Clears continuously after the sequence ends. The camera continues clearing
+ until a new exposure is set up or started, the abort command is sent, the
+ speed entry number is changed, or the camera is reset.
+ */
+ CLEAR_POST_SEQUENCE,
+ /**
+ Clears @c clear_cycles times before each sequence and clears continuously
+ after the sequence ends. The camera continues clearing until a new exposure
+ is set up or started, the abort command is sent, the speed entry number is
+ changed, or the camera is reset.
+ */
+ CLEAR_PRE_POST_SEQUENCE,
+ /**
+ Clears @c clear_cycles times before each exposure and clears continuously
+ after the sequence ends. The camera continues clearing until a new exposure
+ is set up or started, the abort command is sent, the speed entry number is
+ changed, or the camera is reset.
+ */
+ CLEAR_PRE_EXPOSURE_POST_SEQ,
+ /**
+ Leverages the global-reset feature on supported sensors.
+ */
+ CLEAR_GLOBAL_RESET,
+
+ /* Should be the last and never used value. */
+ MAX_CLEAR_MODE
+}
+PL_CLEAR_MODES;
+
+/**
+Used with the #PARAM_SHTR_OPEN_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SHTR_OPEN_MODES
+{
+ /**
+ The shutter closes before the exposure and stays closed during the exposure.
+ */
+ OPEN_NEVER,
+ /**
+ Opens the shutter with each exposure. Normal mode.
+ */
+ OPEN_PRE_EXPOSURE,
+ /**
+ Opens the shutter at the start of each sequence. Useful for frame transfer
+ and external strobe devices.
+ */
+ OPEN_PRE_SEQUENCE,
+ /**
+ If using a triggered mode, this function causes the shutter to open before
+ the external trigger is armed. If using a non-triggered mode, this function
+ operates identically to #OPEN_PRE_EXPOSURE.
+ */
+ OPEN_PRE_TRIGGER,
+ /**
+ Sends no signals to open or close the shutter. Useful for frame transfer
+ when you want to open the shutter and leave it open (see #pl_exp_abort).
+ */
+ OPEN_NO_CHANGE
+}
+PL_SHTR_OPEN_MODES;
+
+/**
+Used with the #PARAM_EXPOSURE_MODE parameter ID.
+Treated as @c #int32 type.
+
+Used with the functions #pl_exp_setup_cont and #pl_exp_setup_seq.
+Treated as @c #int16 type.
+*/
+typedef enum PL_EXPOSURE_MODES
+{
+ /**
+ Causes the exposure to use the internal timer to control
+ the exposure duration.
+ */
+ TIMED_MODE,
+ /**
+ Accepts the external trigger as exposure start signal.
+ The exposure duration is still controlled by the internal timer.
+ */
+ STROBED_MODE,
+ /**
+ Accepts the external trigger as exposure start and duration control
+ signal.
+ */
+ BULB_MODE,
+ /**
+ Accepts the external trigger as acquisition sequence start signal.
+ Each exposure in the sequence then uses the internal timer to control the
+ exposure duration. The software will look for one trigger only and then
+ proceed with the sequence.
+ */
+ TRIGGER_FIRST_MODE,
+ /** @warning Deprecated. Not supported by any modern camera. */
+ FLASH_MODE,
+ /**
+ The duration of the exposure can be controlled by software dynamically
+ without requiring the acquisition to be reconfigured with #pl_exp_setup_seq.
+ Use #pl_set_param with #PARAM_EXP_TIME to set new exposure time before calling
+ #pl_exp_start_seq.
+ */
+ VARIABLE_TIMED_MODE,
+ /** @warning Deprecated. Not supported by any modern camera. */
+ INT_STROBE_MODE,
+ MAX_EXPOSE_MODE = 7,
+
+ /*
+ Extended EXPOSURE modes used with #PARAM_EXPOSURE_MODE when
+ camera dynamically reports its capabilities.
+ The "7" in each of these calculations comes from the previous
+ definition of #MAX_EXPOSE_MODE when this file was defined.
+ */
+
+ /**
+ Internal camera trigger, camera controls the start and the duration
+ of the exposure. This mode is similar to the legacy #TIMED_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_INTERNAL = (7 + 0) << 8,
+ /**
+ Trigger controls the start of first exposure. Subsequent exposures are
+ controlled by the camera internal timer. This mode is similar to the legacy
+ #TRIGGER_FIRST_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_TRIG_FIRST = (7 + 1) << 8,
+ /**
+ Trigger controls the start of each exposure. This mode is similar to
+ the legacy #STROBED_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_EDGE_RISING = (7 + 2) << 8,
+ /**
+ Trigger controls the start and duration of each exposure. This mode is similar to
+ the legacy #BULB_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_LEVEL = (7 + 3) << 8,
+ /**
+ Exposure is triggered with software trigger using the #pl_exp_trigger call.
+ Similarly to #EXT_TRIG_TRIG_FIRST, the trigger starts the first exposure only.
+ Subsequent exposures are controlled by the camera internal timer.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_SOFTWARE_FIRST = (7 + 4) << 8,
+ /**
+ Exposure is triggered with software trigger using the #pl_exp_trigger call.
+ Similarly to #EXT_TRIG_EDGE_RISING, each call to #pl_exp_trigger triggers one exposure.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_SOFTWARE_EDGE = (7 + 5) << 8,
+ /**
+ Trigger controls the start and duration of each exposure. This mode allows
+ overlapping exposure and readout.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_LEVEL_OVERLAP = (7 + 6) << 8,
+ /**
+ A special case of a level trigger where the first trigger pulse starts
+ the exposure and the next trigger pulse starts the readout of that exposure.
+ For N frames specified in the software, there must be N+1 trigger pulses in the
+ series with individual exposure times being equal to the time interval between
+ the trigger pulses.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_LEVEL_PULSED = (7 + 7) << 8
+}
+PL_EXPOSURE_MODES;
+
+/**
+Used with #pl_exp_trigger function.
+Treated as @c #uns32 type.
+*/
+typedef enum PL_SW_TRIG_STATUSES
+{
+ /**
+ The camera has accepted the trigger signal and started exposing.
+ */
+ PL_SW_TRIG_STATUS_TRIGGERED = 0,
+ /**
+ The camera was unable to accept the trigger due to an ongoing exposure.
+ */
+ PL_SW_TRIG_STATUS_IGNORED
+}
+PL_SW_TRIG_STATUSES;
+
+/**
+Used with the #PARAM_EXPOSE_OUT_MODE parameter ID.
+Build the values for the Expose Out modes that are "ORed" with the trigger
+modes when setting up the script.
+Treated as @c #int32 type.
+*/
+typedef enum PL_EXPOSE_OUT_MODES
+{
+ /**
+ Expose Out high when first row is exposed (from first row begin to first row end)
+ */
+ EXPOSE_OUT_FIRST_ROW = 0,
+ /**
+ Expose Out high when all rows are exposed simultaneously (from last row begin to first row end).
+ The duration of the signal equals the exposure value entered which means the actual exposure
+ time is longer - use this mode with triggered light source only.
+ */
+ EXPOSE_OUT_ALL_ROWS,
+ /**
+ Expose Out high when any row is exposed (from first row begin to last row end)
+ */
+ EXPOSE_OUT_ANY_ROW,
+ /**
+ Similar to ALL_ROWS. Actual exposure duration matches the value entered, but the Expose Out is
+ only high while all rows are exposing simultaneously.
+ If the exposure time entered is shorter than the readout time, the Expose Out signal will
+ remain at low level.
+ */
+ EXPOSE_OUT_ROLLING_SHUTTER,
+ /**
+ Expose Out signal pulses for every line readout as configured via the #PARAM_SCAN_MODE
+ and related parameters. If #PARAM_SCAN_MODE is not available or enabled, the Expose Out
+ behaves as #EXPOSE_OUT_ANY_ROW.
+ */
+ EXPOSE_OUT_LINE_TRIGGER,
+ /**
+ Similar to EXPOSE_OUT_ROLLING_SHUTTER but using sensor's global shutter mode.
+ */
+ EXPOSE_OUT_GLOBAL_SHUTTER,
+
+ /* Should be the last and never used value. */
+ MAX_EXPOSE_OUT_MODE
+}
+PL_EXPOSE_OUT_MODES;
+
+/**
+Used with the #PARAM_FAN_SPEED_SETPOINT parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FAN_SPEEDS
+{
+ FAN_SPEED_HIGH, /**< Full fan speed, the default value for most cameras. */
+ FAN_SPEED_MEDIUM, /**< Medium fan speed. */
+ FAN_SPEED_LOW, /**< Low fan speed. */
+ FAN_SPEED_OFF /**< Fan is turned off. */
+}
+PL_FAN_SPEEDS;
+
+/**
+Used with the #PARAM_TRIGTAB_SIGNAL parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_TRIGTAB_SIGNALS
+{
+ PL_TRIGTAB_SIGNAL_EXPOSE_OUT /**< Control the expose out hardware signal multiplexing */
+}
+PL_TRIGTAB_SIGNALS;
+
+/**
+Used with the #PARAM_FRAME_DELIVERY_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_DELIVERY_MODES
+{
+ /**
+ Camera will sample and deliver the frames as fast as possible while considering
+ the interface bandwidth. This mode may result in uneven frame intervals, but
+ possibly higher frame rates.
+ */
+ PL_FRAME_DELIVERY_MODE_MAX_FPS = 0,
+ /**
+ Camera will sample and deliver the frames in constant intervals. In this mode the
+ camera samples the sensor in constant time intervals but if the interface is busy and
+ all frame buffers are full, the frame will be skipped and the sensor will be sampled
+ in the next interval (unlike the MAX_FPS mode where the sensor would be sampled immediately
+ once the buffer/interface is unclogged). This results in even frame intervals, but
+ there might be gaps in between the frame deliveries and thus reduced frame rate.
+ */
+ PL_FRAME_DELIVERY_MODE_CONSTANT_INTERVALS
+}
+PL_FRAME_DELIVERY_MODES;
+
+/**
+Used with the #PARAM_CAM_INTERFACE_TYPE parameter ID.
+
+32-bit enum where:
+- Upper 24 bits are interface classes, flags, 1bit = one class, 24 possible classes.
+- Lower 8 bits are interface revisions with 254 possible revisions per each interface class.
+
+Usage:
+@code{.cpp}
+ if (attrCurrent & PL_CAM_IFC_TYPE_USB)
+ // The camera is running on USB, any USB
+ if (attrCurrent & PL_CAM_IFC_TYPE_USB && type >= PL_CAM_IFC_TYPE_USB_3_0)
+ // The camera is running on USB, the camera is running on at least USB 3.0
+ if (attrCurrent == PL_CAM_IFC_TYPE_USB_3_1)
+ // The camera is running exactly on USB 3.1
+@endcode
+
+Treated as @c #int32 type.
+*/
+typedef enum PL_CAM_INTERFACE_TYPES
+{
+ PL_CAM_IFC_TYPE_UNKNOWN = 0, /**< Unrecognized type. */
+
+ PL_CAM_IFC_TYPE_1394 = 0x100, /**< A generic 1394 in case we cannot identify the sub type. */
+ PL_CAM_IFC_TYPE_1394_A, /**< FireWire 400. */
+ PL_CAM_IFC_TYPE_1394_B, /**< FireWire 800. */
+
+ PL_CAM_IFC_TYPE_USB = 0x200, /**< A generic USB in case we cannot identify the sub type. */
+ PL_CAM_IFC_TYPE_USB_1_1, /**< FullSpeed (12 Mbit/s). */
+ PL_CAM_IFC_TYPE_USB_2_0, /**< HighSpeed (480 Mbit/s). */
+ PL_CAM_IFC_TYPE_USB_3_0, /**< SuperSpeed (5 Gbit/s). */
+ PL_CAM_IFC_TYPE_USB_3_1, /**< SuperSpeed+ (10 Gbit/s). */
+
+ PL_CAM_IFC_TYPE_PCI = 0x400, /**< A generic PCI interface. */
+ PL_CAM_IFC_TYPE_PCI_LVDS, /**< LVDS PCI interface. */
+
+ PL_CAM_IFC_TYPE_PCIE = 0x800, /**< A generic PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_LVDS, /**< LVDS PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_X1, /**< Single channel PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_X4, /**< 4 channel PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_X8, /**< 8 channel PCIe interface. */
+
+ PL_CAM_IFC_TYPE_VIRTUAL = 0x1000, /**< Base for all Virtual camera interfaces. */
+
+ PL_CAM_IFC_TYPE_ETHERNET = 0x2000 /**< Base for all Ethernet-based cameras. */
+}
+PL_CAM_INTERFACE_TYPES;
+
+/**
+Used with the #PARAM_CAM_INTERFACE_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_CAM_INTERFACE_MODES
+{
+ PL_CAM_IFC_MODE_UNSUPPORTED = 0, /**< Interface is not supported. */
+ PL_CAM_IFC_MODE_CONTROL_ONLY, /**< Control commands only. */
+ PL_CAM_IFC_MODE_IMAGING /**< Full imaging. */
+}
+PL_CAM_INTERFACE_MODES;
+
+/**
+Used with the #PARAM_CENTROIDS_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_CENTROIDS_MODES
+{
+ PL_CENTROIDS_MODE_LOCATE = 0, /**< Locate mode (PrimeLocate) */
+ PL_CENTROIDS_MODE_TRACK, /**< Particle Tracking mode */
+ PL_CENTROIDS_MODE_BLOB /**< Blob Detection mode */
+}
+PL_CENTROIDS_MODES;
+
+
+/**
+Used with the #PARAM_SCAN_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SCAN_MODES
+{
+ /** Normal camera imaging and the default mode of operation, the FPGA
+ reads each row in succession without inserting additional delays between rows */
+ PL_SCAN_MODE_AUTO = 0,
+ /** This mode allows the user to configure the #PARAM_SCAN_LINE_DELAY.
+ The #PARAM_SCAN_WIDTH will become read-only and its value will be
+ auto-calculated and reported by the camera */
+ PL_SCAN_MODE_PROGRAMMABLE_LINE_DELAY,
+ /** This mode allows the user to configure the #PARAM_SCAN_WIDTH.
+ The #PARAM_SCAN_LINE_DELAY will become read-only and its value will be
+ auto-calculated and reported by the camera */
+ PL_SCAN_MODE_PROGRAMMABLE_SCAN_WIDTH
+}
+PL_SCAN_MODES;
+
+
+/**
+Used with the #PARAM_SCAN_DIRECTION parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SCAN_DIRECTIONS
+{
+ /** Default mode. The camera starts reading from top to bottom */
+ PL_SCAN_DIRECTION_DOWN = 0,
+ /** Camera starts reading from bottom to top */
+ PL_SCAN_DIRECTION_UP,
+ /** Camera initially starts reading from top to bottom
+ and then switches automatically to read out from bottom to top.
+ The direction alternates between frames down-up-down-up and so on.
+ */
+ PL_SCAN_DIRECTION_DOWN_UP
+}
+PL_SCAN_DIRECTIONS;
+
+/**
+Used with the #PARAM_PP_FEAT_ID parameter ID.
+Treated as @c #uns16 type.
+*/
+typedef enum PP_FEATURE_IDS
+{
+ PP_FEATURE_RING_FUNCTION,
+ PP_FEATURE_BIAS,
+ PP_FEATURE_BERT, /**< Background Event Reduction Technology */
+ PP_FEATURE_QUANT_VIEW,
+ PP_FEATURE_BLACK_LOCK,
+ PP_FEATURE_TOP_LOCK,
+ PP_FEATURE_VARI_BIT,
+ PP_FEATURE_RESERVED, /**< Should not be used at any time moving forward. */
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH,
+ PP_FEATURE_DESPECKLE_DARK_LOW,
+ PP_FEATURE_DEFECTIVE_PIXEL_CORRECTION,
+ PP_FEATURE_DYNAMIC_DARK_FRAME_CORRECTION,
+ PP_FEATURE_HIGH_DYNAMIC_RANGE,
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW,
+ PP_FEATURE_DENOISING, /**< PrimeEnhance feature*/
+ PP_FEATURE_DESPECKLE_DARK_HIGH,
+ PP_FEATURE_ENHANCED_DYNAMIC_RANGE,
+ PP_FEATURE_FRAME_SUMMING,
+ PP_FEATURE_LARGE_CLUSTER_CORRECTION,
+ PP_FEATURE_FRAME_AVERAGING,
+ PP_FEATURE_MAX
+}
+PP_FEATURE_IDS;
+
+/**
+Used with the #PARAM_PP_PARAM_ID parameter ID.
+*/
+#define PP_MAX_PARAMETERS_PER_FEATURE 10
+
+/**
+Used with the #PARAM_PP_PARAM_ID parameter ID.
+Treated as @c #uns16 type.
+*/
+typedef enum PP_PARAMETER_IDS
+{
+ PP_PARAMETER_RF_FUNCTION = (PP_FEATURE_RING_FUNCTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BIAS_ENABLED = (PP_FEATURE_BIAS * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BIAS_LEVEL,
+ PP_FEATURE_BERT_ENABLED = (PP_FEATURE_BERT * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BERT_THRESHOLD,
+ PP_FEATURE_QUANT_VIEW_ENABLED = (PP_FEATURE_QUANT_VIEW * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_QUANT_VIEW_E,
+ PP_FEATURE_BLACK_LOCK_ENABLED = (PP_FEATURE_BLACK_LOCK * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BLACK_LOCK_BLACK_CLIP,
+ PP_FEATURE_TOP_LOCK_ENABLED = (PP_FEATURE_TOP_LOCK * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_TOP_LOCK_WHITE_CLIP,
+ PP_FEATURE_VARI_BIT_ENABLED = (PP_FEATURE_VARI_BIT * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_VARI_BIT_BIT_DEPTH,
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH_ENABLED = (PP_FEATURE_DESPECKLE_BRIGHT_HIGH * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH_THRESHOLD,
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH_MIN_ADU_AFFECTED,
+ PP_FEATURE_DESPECKLE_DARK_LOW_ENABLED = (PP_FEATURE_DESPECKLE_DARK_LOW * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_DARK_LOW_THRESHOLD,
+ PP_FEATURE_DESPECKLE_DARK_LOW_MAX_ADU_AFFECTED,
+ PP_FEATURE_DEFECTIVE_PIXEL_CORRECTION_ENABLED = (PP_FEATURE_DEFECTIVE_PIXEL_CORRECTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DYNAMIC_DARK_FRAME_CORRECTION_ENABLED = (PP_FEATURE_DYNAMIC_DARK_FRAME_CORRECTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_HIGH_DYNAMIC_RANGE_ENABLED = (PP_FEATURE_HIGH_DYNAMIC_RANGE * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW_ENABLED = (PP_FEATURE_DESPECKLE_BRIGHT_LOW * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW_THRESHOLD,
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW_MAX_ADU_AFFECTED,
+ PP_FEATURE_DENOISING_ENABLED = (PP_FEATURE_DENOISING * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DENOISING_NO_OF_ITERATIONS,
+ PP_FEATURE_DENOISING_GAIN,
+ PP_FEATURE_DENOISING_OFFSET,
+ PP_FEATURE_DENOISING_LAMBDA,
+ PP_FEATURE_DESPECKLE_DARK_HIGH_ENABLED = (PP_FEATURE_DESPECKLE_DARK_HIGH * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_DARK_HIGH_THRESHOLD,
+ PP_FEATURE_DESPECKLE_DARK_HIGH_MIN_ADU_AFFECTED,
+ PP_FEATURE_ENHANCED_DYNAMIC_RANGE_ENABLED = (PP_FEATURE_ENHANCED_DYNAMIC_RANGE * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_SUMMING_ENABLED = (PP_FEATURE_FRAME_SUMMING * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_SUMMING_COUNT,
+ PP_FEATURE_FRAME_SUMMING_32_BIT_MODE,
+ PP_FEATURE_LARGE_CLUSTER_CORRECTION_ENABLED = (PP_FEATURE_LARGE_CLUSTER_CORRECTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_AVERAGING_ENABLED = (PP_FEATURE_FRAME_AVERAGING * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_AVERAGING_COUNT_FACTOR,
+ PP_PARAMETER_ID_MAX
+}
+PP_PARAMETER_IDS;
+
+/**
+Used with the #PARAM_SMART_STREAM_EXP_PARAMS and #PARAM_SMART_STREAM_DLY_PARAMS
+parameter IDs and #pl_create_smart_stream_struct and
+#pl_release_smart_stream_struct functions.
+*/
+typedef struct smart_stream_type
+{
+ uns16 entries; /**< The number of entries in the array. */
+ uns32* params; /**< The actual S.M.A.R.T. stream parameters. */
+}
+smart_stream_type;
+
+/**
+Used with the #PARAM_SMART_STREAM_MODE parameter ID.
+Treated as @c #uns16 type.
+*/
+typedef enum PL_SMT_MODES
+{
+ SMTMODE_ARBITRARY_ALL = 0, /**< Smart streaming values can be arbitrary. */
+ SMTMODE_MAX
+}
+PL_SMT_MODES;
+
+/**
+Used with the functions #pl_exp_check_status, #pl_exp_check_cont_status and
+#pl_exp_check_cont_status_ex.
+Treated as @c #int16 type.
+*/
+typedef enum PL_IMAGE_STATUSES
+{
+ /** The system is @b idle, no data is expected. If any data arrives, it will be discarded. */
+ READOUT_NOT_ACTIVE,
+ /**
+ The data collection routines are @b active. They are waiting for data to arrive,
+ but none has arrived yet.
+ */
+ EXPOSURE_IN_PROGRESS,
+ /** The data collection routines are @b active. The data has started to arrive. */
+ READOUT_IN_PROGRESS,
+ /** Frame has been read out and is available in acquisition buffer. */
+ READOUT_COMPLETE,
+ /** New camera status indicating at least one frame is available. */
+ FRAME_AVAILABLE = READOUT_COMPLETE,
+ /** Something went wrong. The function returns a #PV_FAIL and #pl_error_code is set. */
+ READOUT_FAILED,
+ /** @warning Deprecated. Not used by PVCAM. */
+ ACQUISITION_IN_PROGRESS,
+
+ /* Should be the last and never used value. */
+ MAX_CAMERA_STATUS
+}
+PL_IMAGE_STATUSES;
+
+/**
+Used with the #pl_exp_abort function. The CCS (Camera Control Subsystem) modes
+are applicable with CCD cameras only. With latest sCMOS cameras use the
+#CCS_HALT mode.
+
+Treated as @c #int16 type.
+*/
+typedef enum PL_CCS_ABORT_MODES
+{
+ /**
+ Do not alter the current state of the CCS. Use only if instructed
+ by the camera vendor.
+ */
+ CCS_NO_CHANGE = 0,
+ /**
+ Halt all CCS activity and put the CCS into the idle state.
+ Recommended with sCMOS cameras and with most acquisitions with CCD
+ sensors when using pre-sequence clearing.
+ */
+ CCS_HALT,
+ /**
+ Close the shutter, then halt all CCS activity and put the CCS
+ into the idle state.
+ */
+ CCS_HALT_CLOSE_SHTR,
+ /**
+ Put the CCS into the continuous clearing state. Recommended for
+ CCD sensors where continuous clearing is required.
+ */
+ CCS_CLEAR,
+ /**
+ Close the shutter, then put the CCS into the continuous clearing state.
+ */
+ CCS_CLEAR_CLOSE_SHTR,
+ /**
+ Open the shutter, then halt all CCS activity and put the CCS into
+ the idle state.
+ */
+ CCS_OPEN_SHTR,
+ /**
+ Open the shutter, then put the CCS into the continuous clearing state.
+ */
+ CCS_CLEAR_OPEN_SHTR
+}
+PL_CCS_ABORT_MODES;
+
+/**
+Used with the #PARAM_BOF_EOF_ENABLE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_IRQ_MODES
+{
+ NO_FRAME_IRQS = 0, /**< Both counters are disabled. */
+ BEGIN_FRAME_IRQS, /**< Counts BOF events. */
+ END_FRAME_IRQS, /**< Counts EOF events. */
+ BEGIN_END_FRAME_IRQS /**< Provides a sum of BOF and EOF event. */
+}
+PL_IRQ_MODES;
+
+/**
+Used with the function #pl_exp_setup_cont.
+Treated as @c #int16 type.
+*/
+typedef enum PL_CIRC_MODES
+{
+ /**
+ Used internally by PVCAM for sequence acquisitions only.
+ @internal
+ */
+ CIRC_NONE = 0,
+ /**
+ In this circular buffer mode the oldest frame in buffer is automatically
+ replaced with new frame. No error is indicated by any function when this
+ occurs.
+ */
+ CIRC_OVERWRITE,
+ /**
+ In non-overwrite mode the oldest frame in circular buffer is also replaced
+ with new frame as in #CIRC_OVERWRITE mode (e.g. via DMA write from camera),
+ but PVCAM recognizes it and returns a buffer overrun error in the next
+ call of #pl_exp_get_oldest_frame or #pl_exp_get_latest_frame_ex.
+ */
+ CIRC_NO_OVERWRITE
+}
+PL_CIRC_MODES;
+
+/**
+Used with the #PARAM_EXP_RES parameter ID.
+The resolution defines units in which the exposure time is passed to #pl_exp_setup_seq
+and #pl_exp_setup_cont calls and for the Variable Timed Mode (#PARAM_EXP_TIME).
+Treated as @c #int32 type.
+*/
+typedef enum PL_EXP_RES_MODES
+{
+ EXP_RES_ONE_MILLISEC = 0, /**< Exposure value is defined in milli-seconds. */
+ EXP_RES_ONE_MICROSEC, /**< Exposure value is defined in micro-seconds. */
+ EXP_RES_ONE_SEC /**< Exposure value is defined in seconds. */
+}
+PL_EXP_RES_MODES;
+
+/**
+Used with the function #pl_io_script_control.
+Treated as @c #uns32 type.
+*/
+typedef enum PL_SRC_MODES
+{
+ SCR_PRE_OPEN_SHTR = 0,
+ SCR_POST_OPEN_SHTR,
+ SCR_PRE_FLASH,
+ SCR_POST_FLASH,
+ SCR_PRE_INTEGRATE,
+ SCR_POST_INTEGRATE,
+ SCR_PRE_READOUT,
+ SCR_POST_READOUT,
+ SCR_PRE_CLOSE_SHTR,
+ SCR_POST_CLOSE_SHTR
+}
+PL_SRC_MODES;
+
+/**
+Used with the functions pl_cam_register_callback* and #pl_cam_deregister_callback.
+
+Please note that callbacks are generated based on actual frame data transfer.
+This means that the BOF and EOF callbacks may not always correspond to actual
+readout of given frame from the camera sensor. This is especially true for fast
+cameras where frames are buffered on the camera side and BOF/EOF callbacks are
+generated when the frame is actually received on the device driver side.
+It is recommended to use the camera hardware signals for accurate frame
+synchronization.
+
+Treated as @c #int32 type.
+*/
+typedef enum PL_CALLBACK_EVENT
+{
+ /**
+ Beginning of frame callback. Occurs when the frame transfer begins.
+ */
+ PL_CALLBACK_BOF = 0,
+ /**
+ End of frame callback. Occurs when the frame is fully transferred
+ and ready in the frame buffer.
+ */
+ PL_CALLBACK_EOF,
+ /**
+ List of connected cameras has changed. This feature is currently not
+ supported. The list of cameras is refreshed only during #pl_pvcam_init.
+ */
+ PL_CALLBACK_CHECK_CAMS,
+ /**
+ A camera has been removed from the system.
+ */
+ PL_CALLBACK_CAM_REMOVED,
+ /**
+ A camera previously removed is available again. This feature is not
+ currently supported.
+ */
+ PL_CALLBACK_CAM_RESUMED,
+ PL_CALLBACK_MAX
+}
+PL_CALLBACK_EVENT;
+
+/**
+Defines the acquisition region.
+Used in #pl_exp_setup_seq and #pl_exp_setup_cont.
+In most cases, the s1, s2 coordinates correspond to x1, x2 coordinates.
+The sensor region width is then calculated as s2 - s1 + 1. The resulting
+image width would be (s2 - s1 + 1) / sbin.
+Similarly, the p1, p2 coordinates correspond to y1, y2 coordinates.
+The sensor region height is then calculated as (p2 - p1 + 1). The resulting
+image height would be (p2 - p1 + 1) / pbin.
+*/
+typedef struct rgn_type
+{
+ uns16 s1; /**< First pixel in the serial register. */
+ uns16 s2; /**< Last pixel in the serial register. */
+ uns16 sbin; /**< Serial binning for this region. */
+ uns16 p1; /**< First row in the parallel register. */
+ uns16 p2; /**< Last row in the parallel register. */
+ uns16 pbin; /**< Parallel binning for this region. */
+}
+rgn_type;
+
+typedef struct io_struct
+{
+ uns16 io_port; /**< I/O port address. */
+ uns32 io_type; /**< I/O port type (TTL, DAC, etc.) */
+ flt64 state; /**< Desired output state for the port. */
+ struct io_struct* next; /**< Linked list pointer.*/
+}
+io_entry;
+
+typedef struct io_list
+{
+ io_entry pre_open;
+ io_entry post_open;
+ io_entry pre_flash;
+ io_entry post_flash;
+ io_entry pre_integrate;
+ io_entry post_integrate;
+ io_entry pre_readout;
+ io_entry post_readout;
+ io_entry pre_close;
+ io_entry post_close;
+}
+io_list;
+
+/**
+Used in #pv_script_set_hook.
+@remarks This structure is deprecated.
+*/
+typedef struct active_camera_type
+{
+ uns16 shutter_close_delay; /**< Number of milliseconds for the shutter to close. */
+ uns16 shutter_open_delay; /**< Number of milliseconds for the shutter to open. */
+ uns16 rows; /**< Parallel size of the sensor active area. */
+ uns16 cols; /**< Serial size of the sensor active area. */
+ uns16 prescan; /**< Serial pixels before the active area. */
+ uns16 postscan; /**< Serial pixels after the active area. */
+ uns16 premask; /**< Parallel rows before the active area. */
+ uns16 postmask; /**< Parallel rows after the active area. */
+ uns16 preflash; /**< Number of milliseconds to flash the diode ring. */
+ uns16 clear_count; /**< Number of times to clear the sensor before exposure. */
+ uns16 preamp_delay; /**< Number of milliseconds for the preamp to settle. */
+ rs_bool mpp_selectable; /**< Indicates MPP mode can be selected. */
+ rs_bool frame_selectable; /**< Indicates frame transfer can be selected. */
+ int16 do_clear; /**< Clear: Never, Each Exposure, Each Sequence. */
+ int16 open_shutter; /**< Open: Never, Each Exposure, Each Sequence. */
+ rs_bool mpp_mode; /**< Enable or disable MPP mode. */
+ rs_bool frame_transfer; /**< Enable or disable frame transfer operation. */
+ rs_bool alt_mode; /**< Enable or disable Alternate Parallel mode. */
+ uns32 exp_res; /**< Exposure resolution. */
+ io_list* io_hdr; /**< Pointer to a list of I/O script control commands. */
+}
+active_camera_type;
+
+/******************************************************************************/
+/* Start of Frame Metadata Types */
+/******************************************************************************/
+
+/******************************************************************************/
+/* Data headers and camera shared types */
+
+/**
+Used in #md_frame_header structure.
+Treated as @c #uns8 type.
+*/
+typedef enum PL_MD_FRAME_FLAGS
+{
+ /** Check this bit before using the timestampBOR and timestampEOR. */
+ PL_MD_FRAME_FLAG_ROI_TS_SUPPORTED = 0x01,
+ PL_MD_FRAME_FLAG_UNUSED_2 = 0x02,
+ PL_MD_FRAME_FLAG_UNUSED_3 = 0x04,
+ PL_MD_FRAME_FLAG_UNUSED_4 = 0x10,
+ PL_MD_FRAME_FLAG_UNUSED_5 = 0x20,
+ PL_MD_FRAME_FLAG_UNUSED_6 = 0x40,
+ PL_MD_FRAME_FLAG_UNUSED_7 = 0x80
+}
+PL_MD_FRAME_FLAGS;
+
+/**
+Used in #md_frame_roi_header structure.
+Treated as @c #uns8 type.
+*/
+typedef enum PL_MD_ROI_FLAGS
+{
+ /**
+ This flag is used by #pl_md_frame_decode to discard invalid ROIs.
+ Any ROI with this flag will not be included in the #md_frame ROI array.
+ */
+ PL_MD_ROI_FLAG_INVALID = 0x01,
+ /**
+ This flag is used to report an ROI that contains no pixel data. Such
+ ROI is used to only mark a location within the frame.
+ */
+ PL_MD_ROI_FLAG_HEADER_ONLY = 0x02,
+ PL_MD_ROI_FLAG_UNUSED_3 = 0x04,
+ PL_MD_ROI_FLAG_UNUSED_4 = 0x10,
+ PL_MD_ROI_FLAG_UNUSED_5 = 0x20,
+ PL_MD_ROI_FLAG_UNUSED_6 = 0x40,
+ PL_MD_ROI_FLAG_UNUSED_7 = 0x80
+}
+PL_MD_ROI_FLAGS;
+
+/**
+The signature is located in the first 4 bytes of the frame header. The signature
+is checked before any metadata-related operations are executed on the buffer.
+*/
+#define PL_MD_FRAME_SIGNATURE 5328208
+
+/*
+The structures are shared between platforms, thus we must ensure that no
+compiler will apply different struct alignment.
+*/
+#pragma pack(push)
+#pragma pack(1)
+
+/**
+This is a frame header that is located before each frame. The size of this
+structure must remain constant. The structure is generated by the camera
+and should be 16-byte aligned.
+*/
+typedef struct md_frame_header
+{ /* TOTAL: 48 bytes */
+ uns32 signature; /**< 4B - Equal to #PL_MD_FRAME_SIGNATURE. */
+ uns8 version; /**< 1B - Must be 1 in the first release. */
+
+ uns32 frameNr; /**< 4B - 1-based, reset with each acquisition. */
+ uns16 roiCount; /**< 2B - Number of ROIs in the frame, at least 1. */
+
+ /** The final timestamp = timestampBOF * timestampResNs (in nanoseconds). */
+ uns32 timestampBOF; /**< 4B - Depends on resolution. */
+ uns32 timestampEOF; /**< 4B - Depends on resolution. */
+ uns32 timestampResNs; /**< 4B - 1=1ns, 1000=1us, 5000000=5ms, ... */
+
+ /** The final exposure time = exposureTime * exposureTimeResNs (nanoseconds). */
+ uns32 exposureTime; /**< 4B - Depends on resolution. */
+ uns32 exposureTimeResNs;/**< 4B - 1=1ns, 1000=1us, 5000000=5ms, ... */
+
+ /** ROI timestamp resolution is stored here, no need to transfer with each ROI. */
+ uns32 roiTimestampResNs;/**< 4B - ROI timestamps resolution. */
+
+ uns8 bitDepth; /**< 1B - Must be 10, 13, 14, 16, etc. */
+ uns8 colorMask; /**< 1B - Corresponds to #PL_COLOR_MODES. */
+ uns8 flags; /**< 1B - Frame flags, see #PL_MD_FRAME_FLAGS. */
+ uns16 extendedMdSize; /**< 2B - Must be 0 or actual ext md data size. */
+
+ /** Version 2 header additions. The following entries are available only
+ when the md_frame_header.version is reported as 2 or higher. */
+ uns8 imageFormat; /**< 1B - Image data format, see #PL_IMAGE_FORMATS */
+ uns8 imageCompression; /**< 1B - Image pixel data compression, see #PL_IMAGE_COMPRESSIONS */
+
+ uns8 _reserved[6];
+}
+md_frame_header;
+
+/**
+Version 3 of the frame header with improved timestamp and exposure time accuracy.
+When the md_frame_header.version is reported as 3, users are expected to use reinterpret_cast
+to cast the md_frame.header pointer to md_frame_header_v3 type.
+*/
+typedef struct md_frame_header_v3
+{ /* TOTAL: 48 bytes */
+ uns32 signature; /**< 4B - Equal to #PL_MD_FRAME_SIGNATURE. */
+ uns8 version; /**< 1B - Header version. */
+
+ uns32 frameNr; /**< 4B - 1-based, reset with each acquisition. */
+ uns16 roiCount; /**< 2B - Number of ROIs in the frame, at least 1. */
+
+ ulong64 timestampBOF; /**< 8B - Beginning of frame timestamp, in picoseconds. */
+ ulong64 timestampEOF; /**< 8B - End of frame timestamp, in picoseconds. */
+ ulong64 exposureTime; /**< 8B - Exposure time, in picoseconds. */
+
+ uns8 bitDepth; /**< 1B - Must be 10, 13, 14, 16, etc. */
+ uns8 colorMask; /**< 1B - Corresponds to #PL_COLOR_MODES. */
+ uns8 flags; /**< 1B - Frame flags, see #PL_MD_FRAME_FLAGS. */
+ uns16 extendedMdSize; /**< 2B - Must be 0 or actual ext md data size. */
+ uns8 imageFormat; /**< 1B - Image data format, see #PL_IMAGE_FORMATS */
+ uns8 imageCompression; /**< 1B - Image pixel data compression, see #PL_IMAGE_COMPRESSIONS */
+
+ uns8 _reserved[6];
+}
+md_frame_header_v3;
+
+/**
+This is a ROI header that is located before every ROI data. The size of this
+structure must remain constant. The structure is generated by the camera
+and should be 16-byte aligned.
+*/
+typedef struct md_frame_roi_header
+{ /* TOTAL: 32 bytes */
+ uns16 roiNr; /**< 2B - 1-based, reset with each frame. */
+
+ /** ROI timestamps. Currently unused. */
+ uns32 timestampBOR; /**< 4B - Beginning of ROI readout timestamp. */
+ uns32 timestampEOR; /**< 4B - End of ROI readout timestamp. */
+
+ rgn_type roi; /**< 12B - ROI coordinates and binning. */
+
+ uns8 flags; /**< 1B - ROI flags, see #PL_MD_ROI_FLAGS. */
+ uns16 extendedMdSize; /**< 2B - Must be 0 or actual ext metadata size in bytes. */
+
+ /** Version 2 header additions */
+ uns32 roiDataSize; /**< 4B - ROI image data size in bytes. */
+
+ uns8 _reserved[3];
+}
+md_frame_roi_header;
+
+#pragma pack(pop)
+
+/******************************************************************************/
+/* Extended metadata related structures */
+
+/**
+Maximum number of extended metadata tags supported.
+*/
+#define PL_MD_EXT_TAGS_MAX_SUPPORTED 255
+
+/**
+Available extended metadata tags.
+Used in #md_ext_item_info structure.
+Used directly as an enum type without casting to any integral type.
+*/
+typedef enum PL_MD_EXT_TAGS
+{
+ PL_MD_EXT_TAG_PARTICLE_ID = 0, /**< Particle ID */
+ PL_MD_EXT_TAG_PARTICLE_M0, /**< Particle M0 vector */
+ PL_MD_EXT_TAG_PARTICLE_M2, /**< Particle M2 vector */
+ PL_MD_EXT_TAG_MAX
+}
+PL_MD_EXT_TAGS;
+
+/**
+This structure describes the extended metadata TAG. This information is
+retrieved from an internal table. User needs this to correctly read and
+display the extended metadata value.
+*/
+typedef struct md_ext_item_info
+{
+ PL_MD_EXT_TAGS tag; /**< Tag ID */
+ uns16 type; /**< Tag type, corresponds to #ATTR_TYPE */
+ uns16 size; /**< Tag value size */
+ const char* name; /**< Tag friendly name */
+}
+md_ext_item_info;
+
+/**
+An extended metadata item together with its value. The user will retrieve a
+collection of these items.
+*/
+typedef struct md_ext_item
+{
+ const md_ext_item_info* tagInfo; /**< Tag information */
+ void* value; /**< Tag value */
+}
+md_ext_item;
+
+/**
+A collection of decoded extended metadata.
+*/
+typedef struct md_ext_item_collection
+{
+ md_ext_item list[PL_MD_EXT_TAGS_MAX_SUPPORTED]; /**< List of extended metadata tags */
+ md_ext_item* map[PL_MD_EXT_TAGS_MAX_SUPPORTED]; /**< Map of extended metadata tags */
+ uns16 count; /**< Number of valid tags in the arrays above */
+}
+md_ext_item_collection;
+
+/**
+This is a helper structure that is used to decode the md_frame_roi_header. Since
+the header cannot contain any pointers, PVCAM will calculate all information
+using offsets from frame & ROI headers.
+
+The structure must be created using the #pl_md_create_frame_struct function.
+Please note the structure keeps only pointers to data residing in the image
+buffer. Once the buffer is deleted, the contents of the structure become invalid.
+*/
+typedef struct md_frame_roi
+{
+ md_frame_roi_header* header; /**< Points directly to the header within the buffer. */
+ void* data; /**< Points to the ROI image data. */
+ uns32 dataSize; /**< Size of the ROI image data in bytes. */
+ void* extMdData; /**< Points directly to ext. metadata data within the buffer. */
+ uns16 extMdDataSize; /**< Size of the extended metadata buffer. */
+}
+md_frame_roi;
+
+/**
+This is a helper structure that is used to decode the md_frame_header. Since
+the header cannot contain any pointers, we need to calculate all information
+using offsets only.
+
+Please note the structure keeps only pointers to data residing in the image
+buffer. Once the buffer is deleted, the contents of the structure become invalid.
+*/
+typedef struct md_frame
+{
+ md_frame_header* header; /**< Points directly to the header within the buffer. */
+ void* extMdData; /**< Points directly to ext. metadata within the buffer. */
+ uns16 extMdDataSize;/**< Size of the ext. metadata buffer in bytes. */
+ rgn_type impliedRoi; /**< Implied ROI calculated during decoding. */
+
+ md_frame_roi* roiArray; /**< An array of ROI descriptors. */
+ uns16 roiCapacity; /**< Number of ROIs the structure can hold. */
+ uns16 roiCount; /**< Number of ROIs found during decoding. */
+}
+md_frame;
+
+/******************************************************************************/
+/*End of Frame Metadata Types */
+/******************************************************************************/
+
+/******************************************************************************/
+/**
+@addtogroup grp_pm_deprecated_typedefs
+@{
+*/
+
+typedef PVCAM_FRAME_INFO_GUID* PPVCAM_FRAME_INFO_GUID;
+typedef FRAME_INFO* PFRAME_INFO;
+typedef smart_stream_type* smart_stream_type_ptr;
+typedef rgn_type* rgn_ptr;
+typedef const rgn_type* rgn_const_ptr;
+typedef io_entry* io_entry_ptr;
+typedef io_list* io_list_ptr;
+typedef io_list** io_list_ptr_ptr;
+typedef active_camera_type* active_camera_ptr;
+
+/** @} */ /* grp_pm_deprecated_typedefs */
+
+/******************************************************************************/
+/**
+The following macros can be used to extract a single byte from multi-byte integers,
+or to combine multiple bytes into a larger integer value.
+
+@{
+*/
+
+/** Extracts the most significant byte from a two-uns8 integer input. */
+#define MS16_BYTE(two_byte_value)((uns8)(((uns16)(two_byte_value) >> 8) & 0xFF))
+/** Extracts the least significant byte from a two-uns8 integer input. */
+#define LS16_BYTE(two_byte_value)((uns8)(((uns16)(two_byte_value) >> 0) & 0xFF))
+
+/** Extracts the most significant byte from a four-uns8 integer input. */
+#define MS32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 24) & 0xFF))
+/** Extracts the middle-high significant byte from a four-uns8 integer input. */
+#define MH32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 16) & 0xFF))
+/** Extracts the middle-low significant byte from a four-uns8 integer input. */
+#define ML32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 8) & 0xFF))
+/** Extracts the least significant byte from a four-uns8 integer input. */
+#define LS32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 0) & 0xFF))
+
+/** Produces a 16-bit unsigned integer value from 2 input bytes. */
+#define VAL_UNS16(ms_byte,ls_byte)(\
+ ((uns16)((uns8)(ms_byte)) << 8) |\
+ ((uns16)((uns8)(ls_byte)) << 0))
+
+/** Produces a 32-bit unsigned integer value from 4 input bytes. */
+#define VAL_UNS32(ms_byte,mh_byte,ml_byte,ls_byte)(\
+ ((uns32)((uns8)(ms_byte)) << 24) |\
+ ((uns32)((uns8)(mh_byte)) << 16) |\
+ ((uns32)((uns8)(ml_byte)) << 8) |\
+ ((uns32)((uns8)(ls_byte)) << 0))
+
+/** Produces a 64-bit signed integer value from 8 input bytes. */
+#define VAL_INT64(b0,b1,b2,b3,b4,b5,b6,b7)(\
+ ((long64)((uns8)(b0)) << 56) |\
+ ((long64)((uns8)(b1)) << 48) |\
+ ((long64)((uns8)(b2)) << 40) |\
+ ((long64)((uns8)(b3)) << 32) |\
+ ((long64)((uns8)(b4)) << 24) |\
+ ((long64)((uns8)(b5)) << 16) |\
+ ((long64)((uns8)(b6)) << 8) |\
+ ((long64)((uns8)(b7)) << 0))
+
+/** @} */
+
+/******************************************************************************/
+/* Content which is needed to communicate with the PVCAM DLLs */
+
+typedef int16 pm_script_hook(int16 hcam,
+ uns16 exp_total,
+ uns16 rgn_total,
+ const rgn_type* rgn_array,
+ int16 mode,
+ uns32 exposure_time,
+ uns32* pixels,
+ active_camera_type* active_camera);
+
+/**
+Data type used by #pl_get_param with #ATTR_TYPE.
+@{
+*/
+#define TYPE_INT16 1
+#define TYPE_INT32 2
+#define TYPE_FLT64 4
+#define TYPE_UNS8 5
+#define TYPE_UNS16 6
+#define TYPE_UNS32 7
+#define TYPE_UNS64 8
+#define TYPE_ENUM 9
+#define TYPE_BOOLEAN 11
+#define TYPE_INT8 12
+#define TYPE_CHAR_PTR 13
+#define TYPE_VOID_PTR 14
+#define TYPE_VOID_PTR_PTR 15
+#define TYPE_INT64 16
+#define TYPE_SMART_STREAM_TYPE 17
+#define TYPE_SMART_STREAM_TYPE_PTR 18
+#define TYPE_FLT32 19
+#define TYPE_RGN_TYPE 20
+#define TYPE_RGN_TYPE_PTR 21
+#define TYPE_RGN_LIST_TYPE 22
+#define TYPE_RGN_LIST_TYPE_PTR 23
+/** @} */
+
+/*
+Defines for classes.
+*/
+#define CLASS0 0 /* Camera Communications */
+#define CLASS2 2 /* Configuration/Setup */
+#define CLASS3 3 /* Data Acquisition */
+
+/******************************************************************************/
+/* Start of parameter ID definitions. */
+/* Format: TTCCxxxx, where TT = Data type, CC = Class, xxxx = ID number */
+/* Please note that some data types encoded in the parameter IDs do not */
+/* correspond to the actual parameter data type. Please always check the */
+/* ATTR_TYPE before using the parameter. */
+/******************************************************************************/
+
+/**
+@defgroup grp_pm_parameters Parameters
+*/
+
+/**
+@addtogroup grp_pm_parameters
+@{
+*/
+
+/* CAMERA COMMUNICATION PARAMETERS */
+
+/**
+@brief Returns the length of an information message for each device driver.
+
+Some devices have no message. In other words, they return a value of 0 for bytes.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_DD_INFO_LENGTH ((CLASS0<<16) + (TYPE_INT16<<24) + 1)
+/**
+@brief Returns a version number for the device driver used to access the camera.
+
+The version number is for information only. Application does not need to check
+the version or make decisions based on its value. Every PVCAM release is bundled
+with a specific set of device driver versions. PVCAM binaries and device driver
+binaries are usually tightly coupled and cannot be interchanged.
+
+The version is a formatted hexadecimal number of the style:
+
+| High byte | Low | byte |
+|:-------------:|--------------:|:----------------|
+| | High nibble | Low nibble |
+| Major version | Minor version | Trivial version |
+
+For example, the number 0xB1C0 indicates major release 177, minor release 12,
+and trivial change 0.
+
+Open the camera before calling this parameter. Note that different cameras in
+the same system may use different drivers. Thus, each camera can have its own
+driver and its own driver version.
+
+Data type: @c #uns16
+*/
+#define PARAM_DD_VERSION ((CLASS0<<16) + (TYPE_UNS16<<24) + 2)
+/**
+@brief Reads/sets the maximum number of command retransmission attempts that are
+ allowed.
+
+When a command or status transmission is garbled, the system signals for a
+re-transmission. After a certain number of failed transmissions (an initial
+attempt + max_retries), the system abandons the attempt and concludes that the
+communication link has failed. The camera will not close, but the command or
+status read returns with an error. The maximum number of retries is initially
+set by the device driver, and is matched to the communication link, hardware
+platform, and operating system. It may also be reset by the user.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+
+@remarks This parameter is deprecated.
+*/
+#define PARAM_DD_RETRIES ((CLASS0<<16) + (TYPE_UNS16<<24) + 3)
+/**
+@brief Reads/sets the maximum time the driver waits for acknowledgment.
+
+I.e., the slowest allowable response speed from the camera. This is a crucial
+factor used in the device driver for communication control. If the driver sends
+a command to the camera and does not receive acknowledgment within the timeout
+period, the driver times out and returns an error. Unless reset by the user,
+this timeout is a default setting that is contained in the device driver and is
+matched to the communication link, hardware platform, and operating system.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+
+@remarks This parameter is deprecated.
+*/
+#define PARAM_DD_TIMEOUT ((CLASS0<<16) + (TYPE_UNS16<<24) + 4)
+/**
+@brief Returns an information message for each device.
+
+Some devices have no message. The user is responsible for allocating enough
+memory to hold the message string. Required number of bytes can be obtained via
+parameter #PARAM_DD_INFO_LENGTH.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_DD_INFO ((CLASS0<<16) + (TYPE_CHAR_PTR<<24) + 5)
+
+/**
+@brief Returns a list of camera communication interfaces.
+
+For example it can be USB 3.0, PCIe, etc. Use the #ATTR_CURRENT to retrieve the
+currently selected interface. Use the #pl_get_enum_param function to retrieve
+all camera supported interfaces.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_CAM_INTERFACE_TYPES
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_INTERFACE_TYPE ((CLASS0<<16) + (TYPE_ENUM<<24) + 10)
+/**
+@brief Returns a list of camera communication interface modes.
+
+This for example returns whether the interface is fully capable of imaging or if it
+has limitations. Use the #ATTR_CURRENT to retrieve the mode of the currently
+selected interface. Use the #pl_get_enum_param function to retrieve the list of
+modes for all the camera supported interfaces.
+
+The number of items reported by this parameter corresponds to the number of
+items reported by the #PARAM_CAM_INTERFACE_TYPE. Using the #pl_get_enum_param
+call one can build a table of camera interfaces and their modes, simply iterate
+through both parameters and build the table, for example:
+
+| Enum index | Type id | Type string | Mode id | Mode string |
+|:----------:|:-------:|:-----------:|:-------:|:-----------:|
+| 0 | 514 | "USB 2.0" | 1 | "Control" |
+| 1 | 515 | "USB 3.0" | 2 | "Imaging" |
+| 2 | 2051 | "PCIe x4" | 2 | "Imaging" |
+
+Data type: @c enum (@c #int32)
+
+@see #PL_CAM_INTERFACE_MODES
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_INTERFACE_MODE ((CLASS0<<16) + (TYPE_ENUM<<24) + 11)
+
+/* CONFIGURATION AND SETUP PARAMETERS */
+
+/**
+@brief Bias offset voltage.
+
+The units do not correspond to the output pixel values in any simple fashion
+(the conversion rate should be linear, but may differ from system to system), but
+a lower offset voltage will yield a lower value for all output pixels. Pixels
+brought below zero by this method will be clipped at zero. Pixels raised above
+saturation will be clipped at saturation. Before you can change the offset
+level, you must read the current offset level. The default offset level will
+also vary from system to system and may change with each speed and gain setting.
+
+Data type: @c #int16
+
+@warning THIS VALUE IS SET AT THE FACTORY AND SHOULD NOT BE CHANGED!
+If you would like to change this value, please contact customer service before
+doing so.
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_ADC_OFFSET ((CLASS2<<16) + (TYPE_INT16<<24) + 195)
+/**
+@brief The name of the sensor.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #CCD_NAME_LEN elements long.
+
+Data type: @c char*
+*/
+#define PARAM_CHIP_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 129)
+/**
+@brief The name of the system.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #MAX_SYSTEM_NAME_LEN elements long. It is meant to
+replace #PARAM_CHIP_NAME behavior on some cameras which were
+reporting their friendly product name with this parameter, and in turn help
+future cameras go back to reporting the name of the sensor with
+#PARAM_CHIP_NAME.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SYSTEM_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 130)
+/**
+@brief The name of the vendor.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #MAX_VENDOR_NAME_LEN elements long. This is meant to
+differentiate between "QImaging" and "Photometrics" products moving forward.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_VENDOR_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 131)
+/**
+@brief The name of the product.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #MAX_PRODUCT_NAME_LEN elements long. This is meant to
+report camera name such as "Prime 95B" or "Retiga R6". OEMs should also consider
+using this for branding their cameras.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PRODUCT_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 132)
+/**
+@brief The part number of the camera.
+
+The part number is a null-terminated text string. The user must pass in a
+character array that is at least #MAX_CAM_PART_NUM_LEN elements long.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAMERA_PART_NUMBER ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 133)
+
+/**
+@brief This is the type of cooling used by the current camera.
+
+See #PL_COOL_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+*/
+#define PARAM_COOLING_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 214)
+/**
+@brief The number of milliseconds required for the sensor output preamp to
+stabilize, after it is turned on.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PREAMP_DELAY ((CLASS2<<16) + (TYPE_UNS16<<24) + 502)
+/**
+@brief The color mode of the sensor.
+
+This enum parameter provides a list of all possible color masks defined in
+#PL_COLOR_MODES type. The real mask applied on sensor is reported as current
+value (#ATTR_CURRENT). Take into account that for mono cameras this parameter is
+usually not available (for #ATTR_AVAIL it returns @c FALSE) instead of reporting
+#COLOR_NONE value.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_COLOR_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 504)
+/**
+@brief Indicates whether this sensor runs in MPP mode.
+
+See #PL_MPP_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_MPP_CAPABLE ((CLASS2<<16) + (TYPE_ENUM<<24) + 224)
+/**
+@brief The exposure time limit in milliseconds above which the preamp is turned
+off during exposure.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PREAMP_OFF_CONTROL ((CLASS2<<16) + (TYPE_UNS32<<24) + 507)
+
+/* Sensor dimensions and physical characteristics */
+
+/**
+@brief The number of masked lines at the near end of the parallel register.
+
+It is next to the serial register. 0 means no mask (no normal mask). If the
+pre-mask is equal to par_size, this probably indicates a frame transfer device
+with an ordinary mask. Accordingly, the sensor should probably be run in frame
+transfer mode.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PREMASK ((CLASS2<<16) + (TYPE_UNS16<<24) + 53)
+/**
+@brief The number of pixels discarded from the serial register before the first
+real data pixel.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PRESCAN ((CLASS2<<16) + (TYPE_UNS16<<24) + 55)
+/**
+@brief The number of masked lines at the far end of the parallel register.
+
+It's away from the serial register. This is the number of additional parallel
+shifts that need to be done after readout to clear the parallel register.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_POSTMASK ((CLASS2<<16) + (TYPE_UNS16<<24) + 54)
+/**
+@brief The number of pixels to discard from the serial register after the last
+real data pixel.
+
+These must be read or discarded to clear the serial register.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_POSTSCAN ((CLASS2<<16) + (TYPE_UNS16<<24) + 56)
+/**
+@brief This is the center-to-center distance between pixels in the parallel
+direction.
+
+It is measured in nanometers. This is identical to #PARAM_PIX_PAR_SIZE if there
+are no inter-pixel dead areas.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_PAR_DIST ((CLASS2<<16) + (TYPE_UNS16<<24) + 500)
+/**
+@brief This is the size of the active area of a pixel, in the parallel direction.
+
+Reported in nanometers.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_PAR_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 63)
+/**
+@brief This is the center-to-center distance between pixels in the serial
+direction.
+
+Reported in nanometers. This is identical to #PARAM_PIX_SER_SIZE, if there
+are no dead areas.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_SER_DIST ((CLASS2<<16) + (TYPE_UNS16<<24) + 501)
+/**
+@brief This is the size of the active area of a pixel in the serial direction.
+
+Reported in nanometers.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_SER_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 62)
+/**
+@brief Checks to see if the summing well exists.
+
+When a @c TRUE is returned for #ATTR_AVAIL, the summing well exists.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SUMMING_WELL ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 505)
+/**
+@brief Gets the sensor full-well capacity, measured in electrons.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FWELL_CAPACITY ((CLASS2<<16) + (TYPE_UNS32<<24) + 506)
+/**
+@brief The parallel size of the sensor chip, in active rows.
+
+In most cases this parameter reports the height of the sensor imaging area or
+the number of rows in sCMOS type sensor.
+
+The full size of the parallel register is actually (par_size + premask + postmask).
+
+Data type: @c #uns16
+*/
+#define PARAM_PAR_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 57)
+/**
+@brief The serial size of the sensor chip, in active columns.
+
+In most cases this parameter reports the width of the sensor imaging area or
+the number of columns in sCMOS type sensor.
+
+Data type: @c #uns16
+*/
+#define PARAM_SER_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 58)
+/**
+@brief Returns @c TRUE for #ATTR_AVAIL if the camera has accumulation capability.
+
+Accumulation functionality is provided with the FF plug-in.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_ACCUM_CAPABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 538)
+/**
+@brief Reports if the camera supports firmware download.
+
+This parameter is for Teledyne Photometrics internal use only. It is largely unused
+because we simply do it on all cameras now, thus it can become deprecated in
+future.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FLASH_DWNLD_CAPABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 539)
+
+/* General parameters */
+
+/**
+@brief Time it will take to read out the image from the sensor with the current
+camera settings, in microseconds.
+
+Settings have to be applied with #pl_exp_setup_seq or #pl_exp_setup_cont before
+the camera will calculate the readout time for the new settings.
+
+@warning: as with all other parameters please do not access this parameter
+while the camera is imaging.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_UNS32.
+*/
+#define PARAM_READOUT_TIME ((CLASS2<<16) + (TYPE_FLT64<<24) + 179)
+/**
+@brief This parameter reports the time needed to clear the sensor.
+
+The time is reported in nanoseconds. This delay is incurred once prior to the
+acquisition when pre-sequence clearing mode is chosen by the application. The
+delay is incurred prior to every frame when the imaging application chooses
+pre-exposure clearing mode.
+
+The value is valid only after #pl_exp_setup_seq or #pl_exp_setup_cont call.
+
+Data type: @c #long64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_CLEARING_TIME ((CLASS2<<16) + (TYPE_INT64<<24) + 180)
+/**
+@brief Post-trigger delay, in nanoseconds.
+
+In addition to the #PARAM_CLEARING_TIME, there might be a delay between an
+internal or external trigger and the transition event (low to high) for the
+Expose Out signal. This happens, for example, in global All Rows Expose Out mode
+in which case the value is equal to the readout time.
+
+The value is valid only after #pl_exp_setup_seq or #pl_exp_setup_cont call.
+
+Data type: @c #long64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_POST_TRIGGER_DELAY ((CLASS2<<16) + (TYPE_INT64<<24) + 181)
+/**
+@brief Pre-trigger delay, in nanoseconds.
+
+For pre-exposure clearing mode and the first frame in pre-sequence clearing mode,
+the frame cycle time is the sum of #PARAM_EXPOSURE_TIME, #PARAM_PRE_TRIGGER_DELAY,
+#PARAM_POST_TRIGGER_DELAY and #PARAM_CLEARING_TIME.
+
+For second and subsequent frames in pre-sequence clearing mode (most typical
+scenario) the frame cycle time is the sum of #PARAM_EXPOSURE_TIME,
+#PARAM_PRE_TRIGGER_DELAY and #PARAM_POST_TRIGGER_DELAY.
+
+Frame cycle time is defined as the interval between start of exposure for one
+frame and start of exposure for the next frame when the camera is in internal
+triggered (timed) mode and set up for continuous (circular buffer) acquisition.
+
+The value is valid only after #pl_exp_setup_seq or #pl_exp_setup_cont call.
+
+Data type: @c #long64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PRE_TRIGGER_DELAY ((CLASS2<<16) + (TYPE_INT64<<24) + 182)
+
+/* CAMERA PARAMETERS */
+
+/**
+@brief Number of clear cycles.
+
+This is the number of times the sensor must be cleared to completely remove
+charge from the parallel register. The value is ignored in case the clearing
+mode is set to #CLEAR_NEVER or #CLEAR_AUTO via #PARAM_CLEAR_MODE parameter.
+
+Data type: @c #uns16
+*/
+#define PARAM_CLEAR_CYCLES ((CLASS2<<16) + (TYPE_UNS16<<24) + 97)
+/**
+@brief Defines when clearing takes place.
+
+All the possible clearing modes are defined in #PL_CLEAR_MODES enum. But keep in
+mind that some cameras might not support all the modes. Use #pl_get_enum_param
+function to enumerate all the supported modes.
+
+Data type: @c enum (@c #int32)
+
+@see @ref ClearModes
+@note The availability is camera-dependent.
+*/
+#define PARAM_CLEAR_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 523)
+/**
+@brief Reports frame transfer capability.
+
+Returns @c TRUE for #ATTR_AVAIL if this camera can run in frame transfer mode
+(set through #PARAM_PMODE).
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FRAME_CAPABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 509)
+/**
+@brief Parallel clocking method.
+
+See #PL_PMODES enum for all possible values.
+The @c "_FT" in mode name indicates frame transfer mode, @c "_FT_MPP" indicates
+both frame transfer and MPP mode. @c "_ALT" indicates that custom parameters may
+be loaded.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PMODE ((CLASS2<<16) + (TYPE_ENUM <<24) + 524)
+
+/* Temperature parameters for the sensor. */
+
+/**
+@brief Returns the current measured temperature of the sensor in hundredths of
+degrees Celsius.
+
+For example, a temperature of minus 35°C would be read as -3500.
+
+@warning: Unless the #ATTR_LIVE attribute for this parameter is reported as #TRUE,
+this parameter must not be accessed while the camera is imaging.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_TEMP ((CLASS2<<16) + (TYPE_INT16<<24) + 525)
+/**
+@brief Sets the desired sensor temperature in hundredths of degrees Celsius.
+
+E.g. -35°C is represented as -3500. The hardware attempts to heat or cool the
+sensor to this temperature. The min/max allowable temperatures are given by
+#ATTR_MIN and #ATTR_MAX. Settings outside this range are ignored. Note that this
+function only sets the desired temperature. Even if the desired temperature is
+within a legal range, it still may be impossible to achieve. If the ambient
+temperature is too high, it is difficult to get sufficient cooling on an air-cooled
+camera.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_TEMP_SETPOINT ((CLASS2<<16) + (TYPE_INT16<<24) + 526)
+
+/* Parameters used for firmware version retrieval. */
+
+/**
+@brief Returns the firmware version of the camera, as a hexadecimal number.
+
+The form is @c MMmm, where @c MM is the major version and @c mm is the minor
+version. For example, 0x0814 corresponds to version 8.20.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_FW_VERSION ((CLASS2<<16) + (TYPE_UNS16<<24) + 532)
+/**
+@brief Returns the alphanumeric serial number for the camera head.
+
+The serial number for Teledyne Photometrics-branded cameras has a maximum length of
+#MAX_ALPHA_SER_NUM_LEN.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_HEAD_SER_NUM_ALPHA ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 533)
+/**
+@brief Returns the version number of the PCI firmware.
+
+This number is a single 16-bit unsigned value.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PCI_FW_VERSION ((CLASS2<<16) + (TYPE_UNS16<<24) + 534)
+
+/**
+@brief Sets and gets the desired fan speed.
+
+Note that the camera can automatically adjust the fan speed to higher level due to
+sensor overheating or completely shut down power to the sensor board to protect
+camera from damage. The default fan speed is supposed to be changed only
+temporarily during experiments to reduce sound noise or vibrations.
+
+Data type: @c enum (@c #int32)
+
+@warning Use this parameter with caution.
+@note The availability is camera-dependent.
+*/
+#define PARAM_FAN_SPEED_SETPOINT ((CLASS2<<16) + (TYPE_ENUM<<24) + 710)
+/**
+@brief Returns description of all camera nodes.
+
+The text is a multi-line and null-terminated string. The user must pass in a
+character array that is at least #MAX_CAM_SYSTEMS_INFO_LEN elements long or
+dynamically allocated array to size returned for #ATTR_COUNT attribute.
+
+The format is the same as can be seen in output of @c VersionInformation tool.
+
+Data type: @c char*
+
+@warning Extra caution should be taken while accessing this parameter. It is
+known to hang some cameras when used together with other parameters e.g. while
+scanning camera capabilities after opening (especially with Retiga R1/R3/R6 cameras).
+To work around this limitation ensure there is no communication with camera one
+second before and one second after this parameter is used!
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_SYSTEMS_INFO ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 536)
+
+/**
+@brief The exposure/triggering mode.
+
+This parameter cannot be set, but its value can be retrieved. The mode is set as
+a value combined with Expose Out mode via #pl_exp_setup_seq or
+#pl_exp_setup_cont function.
+See #PL_EXPOSURE_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref ExposureModes, @ref secTriggerModes, @ref secExtTriggerModes
+*/
+#define PARAM_EXPOSURE_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 535)
+/**
+@brief The Expose Out mode.
+
+This parameter cannot be set, but its value can be retrieved. The mode is set as
+a value combined with extended exposure mode via #pl_exp_setup_seq or
+#pl_exp_setup_cont function.
+See #PL_EXPOSE_OUT_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref secExpOutModes, @ref secExtTriggerModes
+@note The availability is camera-dependent.
+*/
+#define PARAM_EXPOSE_OUT_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 560)
+
+/* SPEED TABLE PARAMETERS */
+
+/**
+@brief *Native* pixel sample range in number of bits for the currently configured acquisition.
+
+The image bit depth may depend on currently selected #PARAM_READOUT_PORT, #PARAM_SPDTAB_INDEX,
+#PARAM_GAIN_INDEX and other acquisition parameters. Please, make sure to check this parameter
+before starting the acquisition, ideally after calling #pl_exp_setup_seq or #pl_exp_setup_cont.
+
+Most Teledyne Photometrics cameras transfer pixels in 16-bit words (#uns16 type). However, some
+cameras are capable of transferring 8-bit data (#uns8 type). Make sure to also check the
+#PARAM_IMAGE_FORMAT parameter to discover the current camera pixel format.
+
+This parameter indicates the number of valid bits within the transferred word or byte.
+
+Data type: @c #int16
+
+@see @ref SpeedTable
+*/
+#define PARAM_BIT_DEPTH ((CLASS2<<16) + (TYPE_INT16<<24) + 511)
+
+/**
+@brief Pixel sample range of the image outputted to the *host*.
+
+This parameter differs from the *native* #PARAM_BIT_DEPTH in a way that it reports the bit depth
+of the *output* frame - a frame that is delivered to the *host*. Since PVCAM supports various *host*
+side post processing features, the *host* bit depth may differ from the *native* camera bit depth,
+depending on what *host*-side post processing features are active.
+
+For example, the camera *native* bit depth may be reported as 12-bit for current port/speed/gain
+selection. However, when #PARAM_HOST_FRAME_SUMMING_ENABLED is enabled, the *host* frame bit depth may
+be reported as 16 or 32-bit.
+
+As a general rule, the application should always rely on the '_HOST'-specific parameters when
+identifying the output data format. The *native* parameters should be used only for informational
+purposes, e.g. to show the camera native format in the GUI.
+
+Data type: @c #int16
+
+@see @ref SpeedTable, #PARAM_HOST_FRAME_SUMMING_ENABLED, #PARAM_HOST_FRAME_SUMMING_FORMAT.
+*/
+#define PARAM_BIT_DEPTH_HOST ((CLASS2<<16) + (TYPE_INT16<<24) + 551)
+/**
+@brief *Native* image format of the camera pixel stream.
+
+This parameter is used to retrieve the list of camera-supported image formats. The
+image format may depend on current camera configuration. It is advised to check
+the image format before starting the acquisition. Some cameras allow the native
+format to be selected. Use the #ATTR_ACCESS to check the write permissions.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_FORMATS enum for all possible values.
+*/
+#define PARAM_IMAGE_FORMAT ((CLASS2<<16) + (TYPE_ENUM<<24) + 248)
+
+/**
+@brief Image format of the pixel stream that is outputted to the *host*.
+
+This parameter differs from the *native* #PARAM_IMAGE_FORMAT in a way that it reports the format
+of the *output* frame - a frame that is delivered to the *host*. Since PVCAM supports various *host*
+side post processing features, the *host* image format may differ from the *native* camera bit depth,
+depending on what *host*-side post processing features are active.
+
+For example, the camera *native* image format may be reported as 16-bit MONO for the current
+port/speed/gain selection. However, when #PARAM_HOST_FRAME_SUMMING_ENABLED is enabled, the *host* image
+format may need to be upgraded to a wider, 32-bit MONO format.
+
+As a general rule, the application should always rely on the '_HOST'-specific parameters when
+identifying the output data format. The *native* parameters should be used only for informational
+purposes, e.g. to show the camera native format in the GUI.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_FORMATS enum for all possible values and related #PARAM_HOST_FRAME_SUMMING_ENABLED,
+ #PARAM_HOST_FRAME_SUMMING_FORMAT parameters.
+*/
+#define PARAM_IMAGE_FORMAT_HOST ((CLASS2<<16) + (TYPE_ENUM<<24) + 552)
+/**
+@brief *Native* image compression of the camera pixel stream.
+
+This parameter is used to retrieve the list of camera-supported image compression modes.
+The compression mode may depend on currently selected port and speed combination.
+It is advised to check the compression mode before starting the acquisition. Some
+cameras allow the native compression to be selected. Use the #ATTR_ACCESS to check
+the write permissions.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_COMPRESSIONS enum for all possible values.
+*/
+#define PARAM_IMAGE_COMPRESSION ((CLASS2<<16) + (TYPE_ENUM<<24) + 249)
+
+/**
+@brief Image compression of the pixel stream outputted to the host.
+
+This parameter differs from the *native* #PARAM_IMAGE_COMPRESSION in a way that it reports the
+compression of the *output* frame - a frame that is delivered to the *host*. For some camera
+models, various compression methods may be used to increase the interface bandwidth.
+
+In general, applications do not have to support any of the compression-related parameters because
+decompression is automatically and seamlessly done by PVCAM. However, in specific cases the
+automatic decompression may be disabled.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_COMPRESSIONS enum for all possible values and related
+ #PARAM_HOST_FRAME_DECOMPRESSION_ENABLED.
+*/
+#define PARAM_IMAGE_COMPRESSION_HOST ((CLASS2<<16) + (TYPE_ENUM<<24) + 253)
+/**
+@brief Scan mode of the camera.
+
+This parameter is used to retrieve and control the camera-supported scan modes.
+Please note that the #PARAM_SCAN_LINE_DELAY and #PARAM_SCAN_WIDTH access mode
+depends on the scan mode selection.
+
+If the mode is set to #PL_SCAN_MODE_PROGRAMMABLE_SCAN_WIDTH, then the
+#PARAM_SCAN_WIDTH can be controlled and the #PARAM_SCAN_LINE_DELAY becomes read-only.
+If the mode is set to #PL_SCAN_MODE_PROGRAMMABLE_LINE_DELAY, then the
+#PARAM_SCAN_LINE_DELAY can be controlled and the #PARAM_SCAN_WIDTH becomes read-only.
+In both cases the #PARAM_SCAN_LINE_TIME reports the total time it takes to read
+one sensor line (row), including any delay added with the parameters above.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_SCAN_MODES enum for all possible values.
+*/
+#define PARAM_SCAN_MODE ((CLASS3<<16) + (TYPE_ENUM<<24) + 250)
+/**
+@brief Scan direction of the camera.
+
+This parameter is used to retrieve the list of camera-supported scan directions.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_SCAN_DIRECTIONS enum for all possible values.
+*/
+#define PARAM_SCAN_DIRECTION ((CLASS3<<16) + (TYPE_ENUM<<24) + 251)
+/**
+@brief Scan direction reset state.
+
+This parameter is used to retrieve scan direction reset state of camera.
+The parameter is used with alternate scan directions (down-up) to reset the
+direction with every acquisition.
+
+Data type: @c boolean (@c #rs_bool)
+*/
+#define PARAM_SCAN_DIRECTION_RESET ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 252)
+/**
+@brief Scan line delay value of the camera.
+
+This parameter is used to retrieve or set the scan line delay. The parameter
+access mode depends on the #PARAM_SCAN_MODE selection.
+
+Data type: @c uns16 (@c #uns16)
+*/
+#define PARAM_SCAN_LINE_DELAY ((CLASS3<<16) + (TYPE_UNS16<<24) + 253)
+/**
+@brief Scan line time of the camera.
+
+This parameter is used to retrieve scan line time of camera. The time is reported
+in nanoseconds.
+
+Please note the parameter value should be retrieved after the call to
+#pl_exp_setup_seq or #pl_exp_setup_cont because the camera needs to know the
+actual acquisition configuration in order to calculate the value.
+
+Data type: @c long64 (@c #long64)
+*/
+#define PARAM_SCAN_LINE_TIME ((CLASS3<<16) + (TYPE_INT64<<24) + 254)
+/**
+@brief Scan width in number of lines.
+
+This parameter is used to retrieve scan width of camera.
+
+Data type: @c uns16 (@c #uns16)
+*/
+#define PARAM_SCAN_WIDTH ((CLASS3<<16) + (TYPE_UNS16<<24) + 255)
+/**
+@brief Virtual frame rotation mode.
+
+This parameter controls PVCAM-internal frame rotation module. When enabled,
+PVCAM will automatically rotate incoming frames based on the parameter setting.
+Please note that the frame rotation setting affects other parameters:
+#PARAM_SER_SIZE, #PARAM_PAR_SIZE, #PARAM_BINNING_SER, #PARAM_BINNING_PAR and
+#PARAM_COLOR_MODE. For example, if a 90-degree rotation is requested, the affected
+parameters will return appropriately swapped or rotated values. Application should
+re-read the affected parameters after every change in #PARAM_HOST_FRAME_ROTATE.
+
+If #PARAM_METADATA_ENABLED is enabled, the frame-embedded metadata is also adjusted
+automatically if needed. This applies to the metadata-reported ROI and color mask.
+
+Legacy applications can set a system environment variable "PVCAM_FRAME_ROTATE_MODE" to
+one of the following values: 90, 180, 270 or 0. If set, sensors of all PVCAM cameras in the
+system will become virtually rotated and all sensor-related parameters will be
+reported appropriately rotated as well.
+
+A multi-threaded block-rotate algorithm is used for image rotation. The delay introduced
+by the algorithm depends on CPU performance. An Intel Xeon W-2123 processor can rotate
+a 2048x2048 16-bit image in approximately 1.5ms.
+
+This parameter can be used together with #PARAM_HOST_FRAME_FLIP. When both parameters
+are enabled, PVCAM uses an algorithm that processes the rotation/flipping combination
+using only one pass, keeping the performance withing 1-2ms on the same CPU.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_FRAME_ROTATE_MODES enum for all possible values.
+*/
+#define PARAM_HOST_FRAME_ROTATE ((CLASS2<<16) + (TYPE_ENUM<<24) + 256)
+/** @warning Deprecated. Use the #PARAM_HOST_FRAME_ROTATE */
+/** @ingroup grp_pm_deprecated */
+#define PARAM_FRAME_ROTATE (PARAM_HOST_FRAME_ROTATE)
+/**
+@brief Virtual frame flipping mode.
+
+This parameter controls PVCAM-internal frame flipping module. When enabled,
+PVCAM will automatically flip incoming frames based on the parameter setting.
+Please note that the frame flip setting affects the sensor reported color mask
+(#PARAM_COLOR_MODE). For example, if flip-X is requested, the sensor mask is
+also reported as flipped: an RGGB sensor mask would be reported as GRBG mask.
+
+If #PARAM_METADATA_ENABLED is enabled, the frame-embedded metadata is also adjusted
+automatically if needed. This applies to the metadata-reported color mask value.
+
+Legacy applications can set a system environment variable "PVCAM_FRAME_FLIP_MODE" to
+one of the following values: X, Y, XY or NONE. If set, sensors of all PVCAM cameras
+in the system will become virtually flipped and all sensor-related parameters will be
+reported appropriately flipped as well.
+
+A multi-threaded algorithm is used for image flipping. The delay introduced
+by the algorithm depends on CPU performance. An Intel Xeon W-2123 processor can flip
+a 2048x2048 16-bit image in approximately 1ms.
+
+This parameter can be used together with #PARAM_HOST_FRAME_ROTATE. When both parameters
+are enabled, PVCAM uses an algorithm that processes the rotation/flipping combination
+using only one pass, keeping the performance withing 1-2ms on the same CPU.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_FRAME_FLIP_MODES enum for all possible values.
+*/
+#define PARAM_HOST_FRAME_FLIP ((CLASS2<<16) + (TYPE_ENUM<<24) + 257)
+/** @warning Deprecated. Use the #PARAM_HOST_FRAME_FLIP */
+/** @ingroup grp_pm_deprecated */
+#define PARAM_FRAME_FLIP (PARAM_HOST_FRAME_FLIP)
+/**
+@brief This parameter is used to enable or disable the host frame summing feature.
+
+Use the #PARAM_HOST_FRAME_SUMMING_COUNT to set the number of frames to sum and the
+#PARAM_HOST_FRAME_SUMMING_FORMAT to discover and set the desired frame output
+format. After setting up the acquisition with #pl_exp_setup_seq or #pl_exp_setup_cont,
+check the #PARAM_BIT_DEPTH_HOST and #PARAM_IMAGE_FORMAT_HOST to discover the
+correct output frame format. This format may differ from the native #PARAM_BIT_DEPTH
+and #PARAM_IMAGE_FORMAT.
+
+By enabling this feature, PVCAM will start summing incoming frames and provide
+an output frame for every N-th frame (defined by #PARAM_HOST_FRAME_SUMMING_COUNT).
+Please note that when sequences are used (#pl_exp_setup_seq), the number of frames in
+sequence may be limited. When M-frames are requested in #pl_exp_setup_seq function and
+N-frames are configured for summing, PVCAM has to internally acquire a total of MxN
+frames to deliver correct amount of frames to the host. The camera hardware signals
+will also correspond to the MxN count because the frame summing is done on the host
+side without any knowledge of the camera.
+
+Data type: @c #rs_bool
+
+@see #PARAM_BIT_DEPTH_HOST, #PARAM_IMAGE_FORMAT_HOST
+*/
+#define PARAM_HOST_FRAME_SUMMING_ENABLED ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 258)
+/**
+@brief This parameter is used to set the number of frames to sum.
+
+@see #PARAM_HOST_FRAME_SUMMING_ENABLED for details.
+
+Data type: @c #uns32
+*/
+#define PARAM_HOST_FRAME_SUMMING_COUNT ((CLASS2<<16) + (TYPE_UNS32<<24) + 259)
+/**
+@brief This parameter is used to set the desired output format for the summed frame.
+
+When host frame summing feature is enabled, this parameter can be used to set the
+desired output frame format. Depending on the average image intensity and dynamic
+range requirements, the output format can be widened as needed.
+For example, when summing 12-bit images, the output format may be set to 16-bit width,
+allowing to sum up to 16 saturated images into one. When wider dynamic range is required,
+the output format can be switched to 32-bit mode, allowing to sum up to 1M 12-bit frames
+without reaching the 32-bit saturation level.
+
+Data type: @c enum (@c #int32)
+
+@see #PARAM_HOST_FRAME_SUMMING_ENABLED and #PL_FRAME_SUMMING_FORMATS for details.
+*/
+#define PARAM_HOST_FRAME_SUMMING_FORMAT ((CLASS2<<16) + (TYPE_ENUM<<24) + 260)
+/**
+@brief This parameter is used to enable or disable the automated frame decompression
+feature.
+
+In general, applications do not have to support any of the compression-related parameters because
+decompression is automatically and seamlessly done by PVCAM. However, in specific cases the
+automatic decompression may be disabled. In such case, the application is expected to provide
+the frame decompression.
+
+Please note that when this parameter is disabled for cameras that require frame
+decompression, other *host* post processing parameters such as #PARAM_HOST_FRAME_ROTATE,
+#PARAM_HOST_FRAME_FLIP, #PARAM_HOST_FRAME_SUMMING_ENABLED and similar cannot be enabled because
+they require uncompressed pixels to work properly. The #pl_exp_setup_seq and #pl_exp_setup_cont
+functions will fail.
+
+@see #PARAM_IMAGE_COMPRESSION, #PARAM_IMAGE_COMPRESSION_HOST
+
+Data type: @c #rs_bool
+*/
+#define PARAM_HOST_FRAME_DECOMPRESSION_ENABLED ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 261)
+/**
+@brief Gain setting for the current speed choice.
+
+The valid range for a gain setting is reported via #ATTR_MIN and #ATTR_MAX,
+where the min. gain is usually 1 and the max. gain may be as high as 16. Values
+outside this range will be ignored. Note that gain setting may not be linear!
+Values 1-16 may not correspond to 1x-16x, and there are gaps between the
+values. However, when the camera is initialized and every time a new speed is
+selected, the system will always reset to run at a gain of 1x.
+
+After setting the parameter, the #PARAM_GAIN_NAME can be used to retrieve user-
+friendly description of the selected gain (if supported by camera).
+
+Data type: @c #int16
+
+@see @ref SpeedTable
+*/
+#define PARAM_GAIN_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 512)
+/**
+@brief Selects the sensor readout speed from a table of available choices.
+
+Entries are 0-based and the range of possible values is 0 to @c max_entries,
+where @c max_entries can be determined using #ATTR_MAX attribute. This setting
+relates to other speed table values, including #PARAM_BIT_DEPTH,
+#PARAM_PIX_TIME, #PARAM_READOUT_PORT, #PARAM_GAIN_INDEX and #PARAM_GAIN_NAME.
+After setting #PARAM_SPDTAB_INDEX, the gain setting is always reset to a value
+corresponding to 1x gain. To use a different gain setting, call #pl_set_param
+with #PARAM_GAIN_INDEX after setting the speed table index.
+
+After setting the parameter the #PARAM_SPDTAB_NAME can be used to retrieve user
+friendly description of the selected speed (if supported by camera).
+
+Data type: @c #int16
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_SPDTAB_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 513)
+/**
+@brief Name of the currently selected Gain (via #PARAM_GAIN_INDEX).
+
+Use #ATTR_AVAIL to check for the availability. The gain name has a maximum
+length of #MAX_GAIN_NAME_LEN and can be retrieved with the #ATTR_CURRENT
+attribute.
+
+Data type: @c char*
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_GAIN_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 514)
+/**
+@brief Name of the currently selected Speed (via #PARAM_SPDTAB_INDEX).
+
+Use #ATTR_AVAIL to check for the availability. The speed name has a maximum
+length of #MAX_SPDTAB_NAME_LEN and can be retrieved with the #ATTR_CURRENT
+attribute.
+
+Data type: @c char*
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_SPDTAB_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 515)
+/**
+@brief Sensor readout port being used by the currently selected speed.
+
+Different readout ports (used for alternate speeds) flip the image in serial,
+parallel, or both.
+
+Data type: @c enum (@c #int32)
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_READOUT_PORT ((CLASS2<<16) + (TYPE_ENUM<<24) + 247)
+/**
+@brief This is the actual speed for the currently selected speed choice.
+
+It returns the time for each pixel conversion, in nanoseconds. This value may
+change as other speed choices are selected.
+
+Data type: @c #uns16
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_PIX_TIME ((CLASS2<<16) + (TYPE_UNS16<<24) + 516)
+
+/* SHUTTER PARAMETERS */
+
+/**
+@brief The shutter close delay.
+
+This is the number of milliseconds required for the shutter to close. Since physical
+shutters are no longer shipped or used with modern Teledyne Photometrics cameras, this
+signal can be used for controlling other devices such as light sources.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_CLOSE_DELAY ((CLASS2<<16) + (TYPE_UNS16<<24) + 519)
+/**
+@brief The shutter open delay.
+
+This is the number of milliseconds required for the shutter to open. Since physical
+shutters are no longer shipped or used with modern Teledyne Photometrics cameras, this
+signal can be used for controlling other devices such as light sources.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_OPEN_DELAY ((CLASS2<<16) + (TYPE_UNS16<<24) + 520)
+/**
+@brief The shutter opening condition.
+
+See #PL_SHTR_OPEN_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref ExposureLoops
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_OPEN_MODE ((CLASS2<<16) + (TYPE_ENUM <<24) + 521)
+/**
+@brief The state of the camera shutter.
+
+This is a legacy parameter not used with modern Teledyne Photometrics cameras.
+If the shutter is run too fast, it will overheat and trigger #SHTR_FAULT. The
+shutter electronics will disconnect until the temperature returns to a suitable
+range. Note that although the electronics have reset the voltages to open or
+close the shutter, there is a lag time for the physical mechanism to respond.
+See also #PARAM_SHTR_OPEN_DELAY and #PARAM_SHTR_CLOSE_DELAY.
+See #PL_SHTR_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_STATUS ((CLASS2<<16) + (TYPE_ENUM <<24) + 522)
+
+/* I/O PARAMETERS */
+
+/**
+@brief Sets and gets the currently active I/O address.
+
+The number of available I/O addresses can be obtained using the #ATTR_COUNT.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_ADDR ((CLASS2<<16) + (TYPE_UNS16<<24) + 527)
+/**
+@brief Gets the type of I/O available at the current address.
+
+See #PL_IO_TYPE enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_TYPE ((CLASS2<<16) + (TYPE_ENUM<<24) + 528)
+/**
+@brief Gets the direction of the signal at the current address.
+
+See #PL_IO_DIRECTION enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_DIRECTION ((CLASS2<<16) + (TYPE_ENUM<<24) + 529)
+/**
+@brief Sets and gets the state of the currently active I/O signal.
+
+The new or return value when setting or getting the value respectively has
+different meanings depending on the I/O type:
+- #IO_TYPE_TTL - A bit pattern, indicating the current state (0 or 1) of each of
+ the control lines (bit 0 indicates line 0 state, etc.).
+- #IO_TYPE_DAC - The value of the desired analog output (only applies to
+ #pl_set_param).
+
+The minimum and maximum range for the signal can be obtained using the #ATTR_MIN
+and #ATTR_MAX attributes, respectively.
+
+When outputting signals, the state is the desired output. For example, when
+setting the output of a 12-bit DAC with a range of 0-5V to half-scale, the state
+should be 2.5 (volts), not 1024 (bits).
+
+Data type: @c #flt64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_STATE ((CLASS2<<16) + (TYPE_FLT64<<24) + 530)
+/**
+@brief Gets the bit depth for the signal at the current address.
+
+The bit depth has different meanings, depending on the I/O Type:
+- #IO_TYPE_TTL - The number of bits read or written at this address.
+- #IO_TYPE_DAC - The number of bits written to the DAC.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_BITDEPTH ((CLASS2<<16) + (TYPE_UNS16<<24) + 531)
+
+/* GAIN MULTIPLIER PARAMETERS */
+
+/**
+@brief Gain multiplication factor for cameras with multiplication gain
+functionality.
+
+The valid range is reported via #ATTR_MIN and #ATTR_MAX.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_GAIN_MULT_FACTOR ((CLASS2<<16) + (TYPE_UNS16<<24) + 537)
+/**
+@brief Gain multiplier on/off indicator for cameras with the multiplication gain
+functionality.
+
+This parameter is read-only and its value is always @c TRUE if it is available on the
+camera.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_GAIN_MULT_ENABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 541)
+
+/* POST PROCESSING PARAMETERS */
+
+/**
+@brief This returns the name of the currently selected post-processing feature.
+
+The name is a null-terminated text string. User is responsible for buffer
+allocation with at least #MAX_PP_NAME_LEN bytes.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_FEAT_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 542)
+/**
+@brief This selects the current post-processing feature from a table of
+available choices.
+
+The entries are 0-based and the range of possible values is 0 to @c max_entries.
+@c max_entries can be determined with the #ATTR_MAX attribute. This setting
+relates to other post-processing table values, including #PARAM_PP_FEAT_NAME,
+#PARAM_PP_FEAT_ID and #PARAM_PP_PARAM_INDEX.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 543)
+/**
+@brief Gets the actual e/ADU for the current gain setting.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_ACTUAL_GAIN ((CLASS2<<16) + (TYPE_UNS16<<24) + 544)
+/**
+@brief This selects the current post-processing parameter from a table of
+available choices.
+
+The entries are 0-based and the range of possible values is 0 to @c max_entries.
+@c max_entries can be determined with the #ATTR_MAX attribute. This setting
+relates to other post-processing table values, including #PARAM_PP_PARAM_NAME,
+#PARAM_PP_PARAM_ID and #PARAM_PP_PARAM.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_PARAM_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 545)
+/**
+@brief Gets the name of the currently selected post-processing parameter for the
+currently selected post-processing feature.
+
+The name is a null-terminated text string. User is responsible for buffer
+allocation with at least #MAX_PP_NAME_LEN bytes.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_PARAM_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 546)
+/**
+@brief This gets or sets the post-processing parameter for the currently selected
+post-processing parameter at the index.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_PARAM ((CLASS2<<16) + (TYPE_UNS32<<24) + 547)
+/**
+@brief Gets the read noise for the current speed.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_READ_NOISE ((CLASS2<<16) + (TYPE_UNS16<<24) + 548)
+/**
+@brief This returns the ID of the currently-selected post-processing feature.
+
+This maps a specific post-processing module across cameras to help applications
+filter for camera features they need to expose and those that they don't. It
+helps to identify similarities between camera post-processing features.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_UNS32.
+*/
+#define PARAM_PP_FEAT_ID ((CLASS2<<16) + (TYPE_UNS16<<24) + 549)
+/**
+@brief This returns the ID of the currently selected post-processing parameter.
+
+This maps a specific post-processing parameter across cameras to help
+applications filter for camera features they need to expose and those that they
+don't. It helps to identify similarities between camera post-processing features.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_UNS32.
+*/
+#define PARAM_PP_PARAM_ID ((CLASS2<<16) + (TYPE_UNS16<<24) + 550)
+
+/* S.M.A.R.T. STREAMING PARAMETERS */
+
+/**
+@brief This parameter allows the user to retrieve or set the state of the
+S.M.A.R.T. streaming mode.
+
+When a @c TRUE is returned by the camera, S.M.A.R.T. streaming is enabled.
+
+Data type: @c #rs_bool
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+*/
+#define PARAM_SMART_STREAM_MODE_ENABLED ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 700)
+/**
+@brief This parameter allows the user to select between available S.M.A.R.T.
+streaming modes.
+
+See #PL_SMT_MODES enum for all possible values.
+Currently the only available mode is #SMTMODE_ARBITRARY_ALL.
+
+Data type: @c #uns16
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+*/
+#define PARAM_SMART_STREAM_MODE ((CLASS2<<16) + (TYPE_UNS16<<24) + 701)
+/**
+@brief This parameter allows to set or read the current exposure parameters for
+S.M.A.R.T. streaming.
+
+Data type: @c #smart_stream_type*
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_SMART_STREAM_TYPE_PTR.
+*/
+#define PARAM_SMART_STREAM_EXP_PARAMS ((CLASS2<<16) + (TYPE_VOID_PTR<<24) + 702)
+/**
+@brief This parameter allows to set or read the current delays between exposures
+in S.M.A.R.T. streaming.
+
+Data type: @c #smart_stream_type*
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+@note This parameter is currently not supported and #ATTR_AVAIL always returns
+@c FALSE.
+@note The parameter type is incorrectly defined. The actual type is TYPE_SMART_STREAM_TYPE_PTR.
+*/
+#define PARAM_SMART_STREAM_DLY_PARAMS ((CLASS2<<16) + (TYPE_VOID_PTR<<24) + 703)
+
+/* ACQUISITION PARAMETERS */
+
+/**
+@brief Used to examine and change the exposure time in VTM only.
+
+VTM is active if exposure mode is set to #VARIABLE_TIMED_MODE. This value is
+limited to 16-bit. For higher exposure times separate single frame acquisitions,
+or SMART streaming (if available), have to be used.
+
+Data type: @c #uns16
+*/
+#define PARAM_EXP_TIME ((CLASS3<<16) + (TYPE_UNS16<<24) + 1)
+/**
+@brief Gets the exposure resolution for the current resolution index.
+
+This parameter does exactly the same as #PARAM_EXP_RES_INDEX, but additionally
+provides human-readable string for each exposure resolution.
+
+For some older cameras this parameter might not be available (#ATTR_AVAIL
+returns @c FALSE). In this case camera uses #EXP_RES_ONE_MILLISEC resolution.
+
+Data type: @c enum (@c #int32)
+*/
+#define PARAM_EXP_RES ((CLASS3<<16) + (TYPE_ENUM<<24) + 2)
+/**
+@brief Gets and sets the index into the exposure resolution table.
+
+The table contains the resolutions supported by the camera. The value at this
+index is an enumerated type, representing different resolutions. The number of
+supported resolutions can be obtained using the #ATTR_COUNT attribute.
+See #PL_EXP_RES_MODES enum for all possible values.
+
+Data type: @c #uns16
+*/
+#define PARAM_EXP_RES_INDEX ((CLASS3<<16) + (TYPE_UNS16<<24) + 4)
+/**
+@brief Used to examine current exposure time and range of valid values.
+
+The minimum and maximum value could be limited by camera hardware. Use #ATTR_MIN
+and #ATTR_MAX to retrieve it. This parameter is always available, but for older
+cameras not reporting their limits, the min. value is set to 0 and max. value is
+set to max. 32-bit range for backward compatibility. This means the range is not
+known, which does not rule out exposure limits. In such case limits may be specified
+e.g. in camera manual. Please note the reported value unit depends on
+currently selected exposure resolution (#PARAM_EXP_RES).
+
+Data type: @c #ulong64
+*/
+#define PARAM_EXPOSURE_TIME ((CLASS3<<16) + (TYPE_UNS64<<24) + 8)
+
+/* PARAMETERS FOR BEGIN and END of FRAME Interrupts */
+
+/**
+@brief Enables and configures the BOF/EOF interrupts.
+
+See #PL_IRQ_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+@warning This parameter is deprecated and should not be accessed. Modern cameras
+use callback acquisition where BOF/EOF is controlled by the hardware.
+@ingroup grp_pm_deprecated
+*/
+#define PARAM_BOF_EOF_ENABLE ((CLASS3<<16) + (TYPE_ENUM<<24) + 5)
+/**
+@brief Returns the Begin-Of-Frame and/or End-Of-Frame count.
+
+BOF/EOF counting is enabled and configured with #PARAM_BOF_EOF_ENABLE.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@warning This parameter is deprecated and should not be accessed. Modern cameras
+use callback acquisition where BOF/EOF is controlled by the hardware.
+@ingroup grp_pm_deprecated
+*/
+#define PARAM_BOF_EOF_COUNT ((CLASS3<<16) + (TYPE_UNS32<<24) + 6)
+/**
+@brief Clears the BOF/EOF count when a #pl_set_param is performed.
+
+This is a write-only parameter.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+@warning This parameter is deprecated and should not be accessed. Modern cameras
+use callback acquisition where BOF/EOF is controlled by the hardware.
+@ingroup grp_pm_deprecated
+*/
+#define PARAM_BOF_EOF_CLR ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 7)
+
+/**
+@brief Tests to see if the hardware/software can perform circular buffer.
+
+When a @c TRUE is returned for #ATTR_AVAIL attribute, the circular buffer
+function can be used.
+
+Data type: @c #rs_bool
+*/
+#define PARAM_CIRC_BUFFER ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 299)
+/**
+@brief Retrieves the min, max, current and recommended (default) buffer size in
+bytes.
+
+Applies to currently configured acquisition. This parameter becomes
+available only after calling the #pl_exp_setup_seq or #pl_exp_setup_cont.
+For sequence acquisition, the attribute always reports the full sequence size in
+bytes. For circular buffer acquisition, use the #ATTR_DEFAULT to retrieve the
+recommended buffer size.
+
+Data type: @c #ulong64
+*/
+#define PARAM_FRAME_BUFFER_SIZE ((CLASS3<<16) + (TYPE_UNS64<<24) + 300)
+
+/* Binning reported by camera */
+
+/**
+@brief Used to obtain serial part of serial x parallel binning factors
+permutations.
+
+It has to be always used in pair with #PARAM_BINNING_PAR parameter.
+
+Data type: @c enum (@c #int32)
+
+@see @ref BinningDiscovery
+@note The availability is camera-dependent.
+*/
+#define PARAM_BINNING_SER ((CLASS3<<16) + (TYPE_ENUM<<24) + 165)
+/**
+@brief Used to obtain parallel part of serial x parallel binning factors
+permutations.
+
+It has to be always used in pair with #PARAM_BINNING_SER parameter.
+
+Data type: @c enum (@c #int32)
+
+@see @ref BinningDiscovery
+@note The availability is camera-dependent.
+*/
+#define PARAM_BINNING_PAR ((CLASS3<<16) + (TYPE_ENUM<<24) + 166)
+
+/* Parameters related to multiple ROIs and Centroids */
+
+/**
+@brief Parameter used to enable or disable the embedded frame metadata feature.
+
+Once enabled, the acquired frames will contain additional information describing
+the frame.
+
+Data type: @c #rs_bool
+
+@see @ref EmbeddedFrameMetadata
+@note The availability is camera-dependent.
+*/
+#define PARAM_METADATA_ENABLED ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 168)
+/**
+@brief Resets the camera-generated metadata timestamp.
+
+In normal operation, the timestamp is reset upon camera power up. Use this parameter
+to reset the timestamp when needed. This is a write-only paremeter, use #pl_set_param
+with @c TRUE value to reset the timestamp.
+
+Data type: @c #rs_bool
+
+@see @ref EmbeddedFrameMetadata
+@note The availability is camera-dependent.
+*/
+#define PARAM_METADATA_RESET_TIMESTAMP ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 176)
+/**
+@brief The number of currently configured ROIs.
+
+The #ATTR_CURRENT returns the currently configured number of ROIs set via
+#pl_exp_setup_seq or #pl_exp_setup_cont functions. The #ATTR_MAX can be used to
+retrieve the maximum number of ROIs the camera supports.
+
+Data type: @c #uns16
+*/
+#define PARAM_ROI_COUNT ((CLASS3<<16) + (TYPE_UNS16 <<24) + 169)
+/**
+@brief Gets or sets the current ROI.
+
+This parameter returns the current ROI that was configured through the
+#pl_exp_setup_seq or #pl_exp_setup_cont functions. If multiple ROIs were
+configured, this parameter returns the first one.
+If the camera supports live ROI feature, the parameter is used to send the live
+ROI to the camera.
+
+Data type: @c #rgn_type
+*/
+#define PARAM_ROI ((CLASS3<<16) + (TYPE_RGN_TYPE<<24) + 1)
+/**
+@brief This parameter is used to enable or disable the Centroids/Object detection
+feature.
+
+Use the #PARAM_CENTROIDS_MODE to retrieve a list of camera supported
+object detection modes.
+
+Data type: @c #rs_bool
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_ENABLED ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 170)
+/**
+@brief This parameter is used to set the Centroid radius.
+
+This read-write parameter is used to obtain the range of Centroids radii the
+camera supports. Use the #ATTR_MIN and #ATTR_MAX to retrieve the range.
+
+The radius defines the distance from the center pixel. For example, if the camera
+reports the radius range between 1 and 5, it means that the resulting ROIs can be
+configured to the following sizes: 1=3x3, 2=5x5, 3=7x7, 4=9x9, 5=11x11.
+
+The parameter interpretation also depends on the selected Centroid/Object detection
+mode. In some modes, the radius is used to set the size of the 'object' to be detected.
+
+Use #pl_set_param to set the desired Centroids radius. Once set, make sure to
+reconfigure the acquisition with #pl_exp_setup_seq or #pl_exp_setup_cont
+functions.
+
+Data type: @c #uns16
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_RADIUS ((CLASS3<<16) + (TYPE_UNS16 <<24) + 171)
+/**
+@brief This parameter is used to control the number of Centroids.
+
+This read-write parameter is used to obtain the maximum supported number of
+Centroids and set the desired number of Centroids to the camera.
+
+The camera usually supports a limited number of Centroids/objects to be detected.
+Use this parameter to limit the number of objects to be detected. For example, in
+particle tracking mode, the parameter will limit number of particles to be tracked
+- if the camera finds more particles than the current limit, the remaining particles
+will be ignored.
+
+Data type: @c #uns16
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_COUNT ((CLASS3<<16) + (TYPE_UNS16 <<24) + 172)
+/**
+@brief This parameter is used to retrieve and control the camera Centroid/Object
+detection modes.
+
+In case the camera supports centroids, but reports this parameter as not
+available, only the #PL_CENTROIDS_MODE_LOCATE feature is supported.
+See #PL_CENTROIDS_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_MODE ((CLASS3<<16) + (TYPE_ENUM <<24) + 173)
+/**
+@brief Supported Centroids background frame processing count.
+
+This allows the camera to report supported selections for number of frames for
+dynamic background removal. The processing is optimized only for the selected set
+of frames. Thus there is no related enumeration type with supported values for this
+parameter.
+
+Data type: @c enum (@c #int32)
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_BG_COUNT ((CLASS3<<16) + (TYPE_ENUM <<24) + 174)
+/**
+@brief Used to configure threshold multiplier for specific object detection modes.
+
+For 'particle tracking' mode, the value is a fixed-point real number in Q8.4 format.
+E.g. the value 1234 (0x4D2) means 77.2 (0x4D hex = 77 dec).
+
+Data type: @c #uns32
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_THRESHOLD ((CLASS3<<16) + (TYPE_UNS32 <<24) + 175)
+
+/* Parameters related to triggering table */
+
+/**
+@brief Used to select the output signal to be configured.
+
+The configuration of number of active outputs is done via
+#PARAM_LAST_MUXED_SIGNAL parameter.
+See #PL_TRIGTAB_SIGNALS enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref TriggeringTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_TRIGTAB_SIGNAL ((CLASS3<<16) + (TYPE_ENUM<<24) + 180)
+/**
+@brief Used to set the number of active output signals.
+
+The set number of signals is used by multiplexer for the signal selected
+by #PARAM_TRIGTAB_SIGNAL parameter.
+
+Data type: @c #uns8
+
+@see @ref TriggeringTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_LAST_MUXED_SIGNAL ((CLASS3<<16) + (TYPE_UNS8<<24) + 181)
+/**
+@brief Deals with frame delivery modes.
+
+This parameter allows to switch among various frame delivery modes.
+If not available, camera runs in #PL_FRAME_DELIVERY_MODE_MAX_FPS mode.
+See #PL_FRAME_DELIVERY_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FRAME_DELIVERY_MODE ((CLASS3<<16) + (TYPE_ENUM <<24) + 400)
+
+/** @} */ /* grp_pm_parameters */
+
+/******************************************************************************/
+/* End of parameter ID definitions. */
+/******************************************************************************/
+
+/******************************************************************************/
+/* Start of function prototypes. */
+/******************************************************************************/
+
+#ifndef PV_EMBEDDED
+
+/**
+@defgroup grp_pm_deprecated_functions Deprecated functions
+@ingroup grp_pm_deprecated
+These functions are included for compatibility reasons.
+*/
+
+/**
+@defgroup grp_callbacks Callbacks
+
+Use these callback function signatures with corresponding callback registering
+functions to register for various camera notifications.
+
+C++ code example:
+(Proper error handling and other camera initialization omitted for clarity)
+@code{.cpp}
+void MyCamera::initialize()
+{
+ // Register for the End-Of-Frame notifications, passing 'this' as a context
+ // in order to properly forward the notification to this class.
+ pl_cam_register_callback_ex3(m_hCam, PL_CALLBACK_EOF, (void*)pvcamCallbackEofEx3, this);
+}
+void MyCamera::handleEofCallback(const FRAME_INFO* pFrameInfo)
+{
+ uns16* pFrameData = NULL;
+ pl_exp_get_latest_frame(m_hCam, (void**)&pFrameData);
+ // The displayFrame() should not do any lengthy processing, we need to
+ // release the callback routine as quickly as possible.
+ displayFrame(pFrameData, pFrameInfo);
+}
+
+// Using the PL_CALLBACK_SIG_EX3 function signature. This function is declared
+// as static in the header file.
+void PV_DECL MyCamera::pvcamCallbackEofEx3(const FRAME_INFO* pFrameInfo, void* pContext)
+{
+ MyCamera* pCamera = static_cast(pContext);
+ pCamera->handleEofCallback(pFrameInfo);
+}
+@endcode
+
+@{
+*/
+
+/**
+A callback function signature for the #pl_cam_register_callback function.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_LEGACY)(void);
+
+/**
+A callback function signature for the #pl_cam_register_callback_ex function.
+
+@param[in] pContext A pointer to the user defined context that was previously
+ passed into the #pl_cam_register_callback_ex function.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_EX)(void* pContext);
+
+/**
+A callback function signature for the #pl_cam_register_callback_ex2 function.
+
+@param[in] pFrameInfo A pointer to a FRAME_INFO structure uniquely identifying
+ the incoming frame.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_EX2)(const FRAME_INFO* pFrameInfo);
+
+/**
+A callback function signature for the #pl_cam_register_callback_ex3 function.
+
+@param[in] pFrameInfo A pointer to a FRAME_INFO structure uniquely identifying
+ the incoming frame.
+@param[in] pContext A pointer to the user defined context that was previously
+ passed into the #pl_cam_register_callback_ex3 function.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_EX3)(const FRAME_INFO* pFrameInfo, void* pContext);
+
+/** @} */ /* grp_callbacks */
+
+#ifdef PV_C_PLUS_PLUS
+extern "C"
+{
+#endif
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Camera Communications Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@defgroup grp_pm_functions Functions
+*/
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Returns the PVCAM version number.
+
+The version is a highly formatted hexadecimal number of the style:
+
+| High byte | Low | byte |
+|:------------:|--------------:|:---------------|
+| | High nibble | Low nibble |
+| Major version| Minor version | Trivial version|
+
+For example, the number 0x11F1 indicates major release 17, minor release 15, and
+trivial change 1. A major release is defined as anything that alters the interface,
+calling sequence, parameter list, or interpretation of any function in the library.
+This includes new functions and alterations to existing functions, but it does not
+include alterations to the optional libraries, which sit on top of PVCAM
+(each optional library includes its own, independent version number). A new major release
+often requires a change in the PVCAM library, but wherever possible, major releases
+are backwards compatible with earlier releases. A minor release should be completely
+transparent to higher-level software (PVCAM) but may include internal enhancements.
+The trivial version is reserved for use by the software staff to keep track of extremely
+minor variations. The last digit is used for build numbers and should be ignored. Minor
+and trivial releases should require no change in the calling software.
+
+@param[out] pvcam_version Version number of PVCAM installer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see #PARAM_DD_VERSION
+*/
+rs_bool PV_DECL pl_pvcam_get_ver(uns16* pvcam_version);
+
+/**
+@brief Opens and initializes the library.
+
+The PVCAM library requires significant system resources: memory, hardware access, etc.
+#pl_pvcam_init prepares these resources for use, as well as allocating whatever static
+memory the library needs. Until #pl_pvcam_init is called, every PVCAM function
+(except for the error reporting functions) will fail and return an error message
+that corresponds to "library has not been initialized".
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@note If this call fails, #pl_error_code contains the code that lists the reason for failure.
+
+@see pl_pvcam_uninit, pl_cam_open, pl_error_code
+*/
+rs_bool PV_DECL pl_pvcam_init(void);
+
+/**
+@brief Closes the library, closes all devices, frees memory.
+
+This function releases all system resources that #pl_pvcam_init acquired.
+It also searches for all cameras that the user has opened. If it finds any,
+it will close them before exiting.
+It will also unlock and free memory, and clean up after itself as much as possible.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_pvcam_init, pl_cam_close, pl_error_code
+
+@warning If hardware is involved in acquiring data, the system may not be
+able to disconnect immediately.
+*/
+rs_bool PV_DECL pl_pvcam_uninit(void);
+
+/** @} */ /* grp_pm_functions */
+
+/**
+@addtogroup grp_pm_deprecated_functions
+@{
+*/
+DEPRECATED rs_bool PV_DECL pl_cam_check(int16 hcam);
+/** @} */ /* grp_pm_deprecated_functions */
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Frees the current camera, prepares it for power-down.
+
+This function has two effects. First, it removes the listed camera from
+the reserved list, allowing other users to open and use the hardware.
+Second, it performs all cleanup, close-down, and shutdown preparations needed
+by the hardware. A camera can only be closed if it was previously opened.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_open, pl_pvcam_init, pl_pvcam_uninit
+
+@note #pl_pvcam_uninit automatically calls the #pl_cam_close on all cameras opened by
+the current user.
+*/
+rs_bool PV_DECL pl_cam_close(int16 hcam);
+
+/**
+@brief Returns the name of a camera.
+
+This function allows users to learn the string identifier associated with every
+camera on the current system. This is a companion to the #pl_cam_get_total function.
+cam_num input can run from 0 to (@c totl_cams-1), inclusive. The user must pass in
+a string that is at least #CAM_NAME_LEN characters long, #pl_cam_get_name then fills
+that string with an appropriate null-terminated string. @c camera_name can be passed
+directly into the #pl_cam_open function. It has no other use, aside from providing
+a brief description of the camera.
+
+@param[in] cam_num Camera number Range: 0 through (@c totl_cams-1).
+@param[out] camera_name PVCAM-assigned camera name.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_get_total, pl_cam_open, pl_cam_close
+
+@note This call reports the names of all cameras on the system, even if all the cameras
+are not available. If the hardware is turned off, or if another user has a camera open,
+the camera name is reported, but the camera will not be available. #pl_cam_get_name returns
+a name and #pl_cam_open gives information on availability of that camera.
+To build a complete list of every camera on the system, it is necessary to cycle through
+all the entries as shown below:
+@code{.cpp}
+int total_cameras;
+char name[CAM_NAME_LEN];
+...
+pl_cam_get_total(&total_cameras);
+for (i = 0; i < total_cameras; i++) {
+ pl_cam_get_name(i, name);
+ printf("Camera %d is called '%s'\n", i, name);
+}
+@endcode
+*/
+rs_bool PV_DECL pl_cam_get_name(int16 cam_num, char* camera_name);
+
+/**
+@brief Returns the number of cameras attached to the system.
+
+This function reports the number of cameras on the system.
+All the listed cameras may not be available on multi-tasking systems, some cameras
+may already be in use by other users. A companion function #pl_cam_get_name can
+be used to get the string identifier associated with each camera.
+
+@param[out] totl_cams Total number of cameras in the system.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_get_name, pl_cam_open, pl_cam_close
+
+@note This function actually searches for all device drivers on the system, without
+checking hardware. The list of cameras is obtained during #pl_pvcam_init. Thus, if a new camera
+(new device driver) is added after the library was opened, the system won't know that the new
+camera is there. The system will also not notice if a camera is removed. (Obviously, this is
+only important on multi-tasking systems). A cycle of @c uninit / @c init regenerates the list of available
+cameras, updating the system for any additions or deletions.
+*/
+rs_bool PV_DECL pl_cam_get_total(int16* totl_cams);
+
+/**
+@brief Reserves and initializes the camera hardware.
+
+The string @a camera_name should be identical to one of the valid camera names returned by #pl_cam_get_name.
+If the name is valid, #pl_cam_open completes a short set of checks and diagnostics as it attempts
+to establish communication with the camera electronics unit. If successful, the camera is opened
+and a valid camera handle is passed back in hcam. Otherwise, #pl_cam_open returns with a failure.
+An explanation is shown in #pl_error_code.
+
+The @a o_mode setting controls the mode under which the camera is opened.
+Currently, the only possible choice is #OPEN_EXCLUSIVE. On multi-user systems, opening a camera
+under the exclusive mode reserves it for the current user, locking out all other users on the
+system. If #pl_cam_open is successful, the user has exclusive access to that camera until the camera
+is closed or #pl_pvcam_uninit is called.
+
+@param[in] camera_name PVCAM-assigned camera name.
+@param[out] hcam Camera handle returned from #pl_cam_open.
+@param[in] o_mode Mode to open the camera in (must be #OPEN_EXCLUSIVE).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_get_name, pl_cam_get_total, pl_cam_close, pl_pvcam_init, pl_pvcam_uninit
+
+@warning Despite the above paragraph, a successful #pl_cam_open does not mean that the camera
+is in working order. It does mean that you can communicate with the device driver associated
+with the camera. After a successful #pl_cam_open, call #pl_error_message, which reports any error
+conditions.
+*/
+rs_bool PV_DECL pl_cam_open(char* camera_name, int16* hcam, int16 o_mode);
+
+/** @} */ /* grp_pm_functions */
+
+/**
+@addtogroup grp_pm_deprecated_functions
+@{
+*/
+DEPRECATED rs_bool PV_DECL pl_cam_register_callback(int16 hcam, int32 callback_event,
+ void* callback);
+DEPRECATED rs_bool PV_DECL pl_cam_register_callback_ex(int16 hcam, int32 callback_event,
+ void* callback, void* context);
+DEPRECATED rs_bool PV_DECL pl_cam_register_callback_ex2(int16 hcam, int32 callback_event,
+ void* callback);
+/** @} */ /* grp_pm_deprecated_functions */
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Installs a handler function that will be called when an event occurs in a camera
+providing information about frame via #FRAME_INFO type and with user context information.
+
+This function combines functionality provided by #pl_cam_register_callback_ex
+and #pl_cam_register_callback_ex2.
+
+Use this API call to install a function that will be called when the specified event
+occurs providing additional frame information. Input parameter of the callback function
+must be of #FRAME_INFO* type in order to receive information about the frame
+(timestamp with precision of 0.1ms, frame counter number, ID (handle) of the camera that
+produced the frame). Also, pointer to a context that will be echoed back when the callback
+is invoked can be passed to PVCAM in this function.
+
+#### Example of Callback function:
+
+@code{.cpp}
+void EOFCallbackHandler(FRAME_INFO* pFrameInfo, void* pContext)
+{
+ const int32 frameNr = pFrameInfo->FrameNr;
+ const long64 frameTime = pFrameInfo->TimeStamp;
+ const int16 camID = pFrameInfo->hCam;
+ // Display or process frame info etc.
+ if (*(int16*)pContext == hCamera1)
+ EOFCountCamera1++;
+ else if (*(int16*)pContext == hCamera2)
+ EOFCountCamera2++;
+}
+@endcode
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] callback_event Callback event to register for (see #PL_CALLBACK_EVENT).
+@param[out] callback Callback function pointer.
+@param[out] context Pointer to custom user context.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_deregister_callback
+
+@warning #pl_exp_finish_seq must be called if acquiring in sequential mode
+(using #pl_exp_setup_seq and #pl_exp_start_seq) with callback notification after all frames are
+read out and before new exposure is started by calling #pl_exp_start_seq.
+Not all callbacks will be available for all camera systems/interfaces.
+
+@note Only #PL_CALLBACK_BOF and #PL_CALLBACK_EOF are fully supported by all camera types.
+Do not use other callback types in generic-purpose software.
+*/
+rs_bool PV_DECL pl_cam_register_callback_ex3(int16 hcam, int32 callback_event,
+ void* callback, void* context);
+
+/**
+@brief Uninstalls a handler function for camera system event.
+
+Use this API call to uninstall a function for the specified camera system event.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] callback_event Callback event to register for (see #PL_CALLBACK_EVENT).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_register_callback, pl_cam_register_callback_ex, pl_cam_register_callback_ex2,
+pl_cam_register_callback_ex3.
+
+@note Only #PL_CALLBACK_BOF and #PL_CALLBACK_EOF are fully supported by all camera types.
+Do not use other callback types in generic-purpose software.
+See callback descriptions section under #pl_cam_register_callback_ex3 for details.
+*/
+rs_bool PV_DECL pl_cam_deregister_callback(int16 hcam, int32 callback_event);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Error Reporting Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@brief Returns the most recent error condition.
+
+As every PVCAM function begins, it resets the error code to 0.
+If an error occurs later in the function, the error code is set to a corresponding
+value.
+
+For details about correct handling see @ref ApiErrors section.
+
+@return The current error code. Note that a call to #pl_error_code does not
+reset the error code.
+
+@see pl_error_message
+
+@note #pl_error_code works even before #pl_pvcam_init is called.
+This allows a message to be returned if #pl_pvcam_init fails.
+
+@warning The PVCAM library does not intercept signals. Errors that interrupt
+the normal process (divide by zero, etc.) may cause the software to crash,
+and #pl_error_code may or may not contain useful information.
+*/
+int16 PV_DECL pl_error_code(void);
+
+/**
+@brief Returns a string explaining input error code.
+
+This function fills in the character string msg with a message that corresponds
+to the value in @a err_code. The msg string is allocated by the user, and should be
+at least #ERROR_MSG_LEN elements long.
+
+For details about correct handling see @ref ApiErrors section.
+
+@param[in] err_code Unique ID of the error: returned from #pl_error_code.
+@param[out] msg Text description of err_code.
+
+@return Returns #PV_OK if a message corresponding to the input code is found and
+#PV_FAIL if the code does not have a corresponding message
+(@a msg will be filled with the string "Unknown error").
+Even if a #PV_FAIL is returned, the value of #pl_error_code is not altered.
+
+@see pl_error_code
+
+@note #pl_error_message works even before #pl_pvcam_init is called.
+This allows a message to be printed if #pl_pvcam_init fails.
+All error messages are standalone sentences without ending period having error
+code name appended in parenthesis.
+*/
+rs_bool PV_DECL pl_error_message(int16 err_code, char* msg);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Configuration/Setup Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@brief Returns the requested attribute for a PVCAM parameter.
+
+This function returns the requested attribute for a PVCAM parameter.
+
+@a param_id is an enumerated type that indicates the parameter in question.
+@a param_value points to the value of the requested attribute for the parameter.
+It is a @c void* because it can be of different data types. The user is responsible
+for passing in the correct data type (see attribute descriptions that follow).
+@a param_attribute is used to retrieve characteristics of the parameter.
+See #PL_PARAM_ATTRIBUTES for possible values for @a param_attribute.
+
+Reading of values for attributes #ATTR_AVAIL, #ATTR_ACCESS and #ATTR_TYPE should
+always succeed and return correct value. Values of other attributes can be read
+only if #ATTR_ACCESS reports either #ACC_READ_ONLY or #ACC_READ_WRITE.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] param_attribute Attribute of the parameter to get (ATTR_...).
+@param[out] param_value Value to get or set.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_set_param, pl_get_enum_param
+
+@note The data type of @a param_value is documented in pvcam.h for each param_id.
+*/
+rs_bool PV_DECL pl_get_param(int16 hcam, uns32 param_id,
+ int16 param_attribute, void* param_value);
+
+/**
+@brief Sets the current value for a PVCAM parameter.
+
+This function sets the current value for a PVCAM parameter.
+
+@a param_id is an enumerated type that indicates the parameter in question.
+@a param_value points to the new value of the parameter. For the enumerated type,
+this value is the value assigned to current enum item, not the item index.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] param_value Value to get or set.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_get_param, pl_get_enum_param
+
+@note The data type of @a param_value is documented in pvcam.h for each @a param_id.
+It can be retrieved using the #pl_get_param function and #ATTR_TYPE attribute.
+The user should call the #pl_get_param function with the attribute #ATTR_ACCESS
+to verify that the parameter ID is writable (settable) before calling the #pl_set_param
+function.
+*/
+rs_bool PV_DECL pl_set_param(int16 hcam, uns32 param_id, void* param_value);
+
+/**
+@brief Returns the enumerated value of the parameter param_id at index.
+
+This function will return the enumerated value of the parameter param_id at index.
+It also returns a string associated with the enumerated type (desc).
+@b length indicates the maximum length allowed for the returned description.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] index Index of enumeration Range: 0 through N-1 ... where N
+ is retrieved with get_param(...,#ATTR_COUNT,...).
+@param[out] value Numerical value of enumeration.
+@param[out] desc Text description of enumeration.
+@param[in] length Length of text description of enumeration.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_get_param, pl_set_param, pl_enum_str_length
+
+@note The user should call the #pl_get_param function with the attribute #ATTR_TYPE,
+to verify that the parameter ID is an enumerated data type before calling the #pl_get_enum_param.
+The user should also call the #pl_get_param function with the attribute #ATTR_COUNT to
+determine how many valid enumerated values the parameter ID has.
+Example: Suppose there is a parameter for camera readout speed. This parameter can be set to 1MHz,
+5MHz or 10MHz with the appropriate values 1, 5 and 10. If the readout speed is currently set to 5MHz,
+a call to #pl_get_param with #ATTR_CURRENT returns a value of 5.
+A call to #pl_get_enum_param for the readout speed parameter at index 1 (the second item)
+returns the enumerated type 5MHz with the value equal to 5 and the desc would contain "5MHz".
+*/
+rs_bool PV_DECL pl_get_enum_param(int16 hcam, uns32 param_id, uns32 index,
+ int32* value, char* desc, uns32 length);
+
+/**
+@brief Returns the length of the descriptive string for the parameter @a param_id at index.
+
+This function will return the length (length) of the descriptive string for the parameter
+@a param_id at index. The length includes the terminating null ('\0') character.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] index Index of enumeration Range: 0 through N-1, where N
+ is retrieved with get_param(..., ATTR_COUNT, ...).
+@param[out] length Length of text description of enumeration.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_get_enum_param
+
+@note This function can be used to determine the amount of memory to allocate for
+the descriptive string when calling the #pl_get_enum_param function. Using the example
+in #pl_get_enum_param, the length returned would be 5 (4 printable characters plus 1 null character).
+*/
+rs_bool PV_DECL pl_enum_str_length(int16 hcam, uns32 param_id, uns32 index,
+ uns32* length);
+
+/**
+@brief This function will reset all post-processing modules to their default values.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@warning Fails if post-processing modules are not available in the current camera or
+if @a hcam is not the handle of an open camera.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see PARAM_PP_FEAT_NAME, PARAM_PP_PARAM_INDEX, PARAM_PP_PARAM_NAME, PARAM_PP_PARAM,
+PARAM_PP_FEAT_ID, PARAM_PP_PARAM_ID
+*/
+rs_bool PV_DECL pl_pp_reset(int16 hcam);
+
+/**
+@brief Creates and allocates variable of smart_stream_type type with the number of
+entries passed in via the entries parameter and returns pointer to it.
+
+This function will create a variable of smart_stream_type type and return a pointer
+to access it. The entries parameter passed by the user determines how many entries
+the structure will contain.
+
+@param[out] array Created struct to be returned.
+@param[in] entries Number of entries to be in smart stream struct.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_release_smart_stream_struct
+*/
+rs_bool PV_DECL pl_create_smart_stream_struct(smart_stream_type** array,
+ uns16 entries);
+
+/**
+@brief Frees the space previously allocated by the #pl_create_smart_stream_struct function.
+
+This function will deallocate a smart_stream_type variable created by
+#pl_create_smart_stream_struct.
+
+@param[in] array Struct to be released.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_create_smart_stream_struct
+*/
+rs_bool PV_DECL pl_release_smart_stream_struct(smart_stream_type** array);
+
+/**
+@brief Creates and allocates variable of #FRAME_INFO type and returns pointer to it.
+
+This function will create a variable of #FRAME_INFO type and
+return a pointer to access it. The GUID field of the #FRAME_INFO structure is assigned
+by this function. Other fields are updated by PVCAM at the time of frame reception.
+
+@param[out] new_frame Frame info struct to be returned.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_release_frame_info_struct, pl_exp_get_latest_frame_ex, pl_exp_get_oldest_frame_ex,
+pl_exp_check_cont_status_ex, pl_cam_register_callback_ex2, pl_cam_register_callback_ex3
+*/
+rs_bool PV_DECL pl_create_frame_info_struct(FRAME_INFO** new_frame);
+
+/**
+@brief Deletes variable of #FRAME_INFO type.
+
+This function will deallocate #FRAME_INFO variable created by #pl_create_frame_info_struct.
+
+@param[in] frame_to_delete Frame info struct to be released.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_create_frame_info_struct, pl_exp_get_latest_frame_ex, pl_exp_get_oldest_frame_ex,
+pl_exp_check_cont_status_ex, pl_cam_register_callback_ex2, pl_cam_register_callback_ex3
+*/
+rs_bool PV_DECL pl_release_frame_info_struct(FRAME_INFO* frame_to_delete);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Data Acquisition Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@brief Prepares the camera to perform a readout.
+
+This function uses the array of regions, exposure mode, and exposure
+time passed in and transmits them to the camera.
+@a exp_total specifies the number of images to take.
+The pointer @a rgn_array points to @a rgn_total region definitions, @a exp_mode specifies
+the bitwise OR combination of exposure mode and expose out mode (see chapter Extended
+Exposure Modes), @a exposure_time specifies the exposure time in the currently
+selected exposure time resolution (see #PARAM_EXP_RES and #PARAM_EXP_RES_INDEX).
+The pointer @a exp_bytes points to a variable that will be filled with number of bytes
+in the pixel stream. The settings are then uploaded to the camera. If there is any
+problem (overlapping regions or a frame-transfer setting for a camera that lacks that
+capability), this function aborts and returns with a failure. #pl_error_code indicates
+the definition problem. The @a exp_bytes pointer is filled with the number of bytes of
+memory needed to buffer the full sequence. (It is the developer's responsibility to
+allocate a memory buffer for the pixel stream.)
+When this function returns, the camera is ready to begin the exposure. #pl_exp_start_seq
+initiates exposure and readout.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] exp_total Total number of exposures to take.
+@param[in] rgn_total Total number of regions defined for each image.
+@param[in] rgn_array Array of regions (must be rgn_total in size).
+ See rgn_type for details.
+@param[in] exp_mode Mode for capture (an OR-ed combination of #PL_EXPOSURE_MODES
+ and #PL_EXPOSE_OUT_MODES, if applicable).
+@param[in] exposure_time Time to expose in selected exposure resolution.
+ Default is milliseconds (see #PARAM_EXP_RES).
+@param[out] exp_bytes Value returned from PVCAM specifying the required
+ number of bytes to allocate for the capture.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_abort, pl_exp_check_status, pl_exp_start_seq, pl_exp_finish_seq
+
+@note This function uploads new settings to the camera. After receiving the settings, the camera
+merely waits in an idle state. The #pl_exp_abort command may be used to place the camera
+into some other state, such as continuous clearing, but this will not alter or affect
+the uploaded settings. Essentially, the camera is still holding the exposure sequence
+and waiting to start, while it clears the sensor charge.
+Also, please note that PVCAM internally checks whether configuration needs to be sent to the camera.
+If there is no difference in the camera configuration from the previous "setup" and other acquisition
+parameters have not changed in the meantime, the PVCAM will not resend the configuration. This may
+lead to shorter execution times of this function and faster start of the subsequent acquisition.
+*/
+rs_bool PV_DECL pl_exp_setup_seq(int16 hcam, uns16 exp_total, uns16 rgn_total,
+ const rgn_type* rgn_array, int16 exp_mode,
+ uns32 exposure_time, uns32* exp_bytes);
+
+/**
+@brief Begins exposing, returns immediately.
+
+This is a companion function to #pl_exp_setup_seq. #pl_exp_setup_seq
+must be called first to define the exposure and program this information into the camera.
+After that, #pl_exp_start_seq may be called one or more times. Each time it is called,
+it starts one sequence and returns immediately (a sequence may be one or more exposures).
+Progress can be monitored through #pl_exp_check_status. The next sequence may be started
+as soon as the readout has finished or an abort has been performed (#pl_exp_abort).
+
+The @a hcam parameter defines which camera is used.
+The user must allocate an appropriately sized memory buffer for data collection, pointed to
+by @a pixel_stream. This buffer must be at least @c exp_bytes bytes, where @c exp_bytes
+is the value returned from #pl_exp_setup_seq.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] pixel_stream Buffer to hold image(s).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_check_status, pl_exp_setup_seq, pl_exp_finish_seq
+*/
+rs_bool PV_DECL pl_exp_start_seq(int16 hcam, void* pixel_stream);
+
+/**
+@brief Sets circular buffer mode.
+
+This function sets the mode of operation for the circular buffer.
+This function uses the array of regions, exposure mode, exposure time passed in,
+and circular buffer mode and transmits them to the camera.
+The pointer @a rgn_array points to @a rgn_total region definitions.
+@a exp_mode specifies the bitwise OR combination of the exposure mode and expose out mode.
+@a exposure_time specifies the exposure time in the currently selected exposure time resolution
+(see #PARAM_EXP_RES and #PARAM_EXP_RES_INDEX). The pointer @a exp_bytes points to a variable that
+will be filled with number of bytes in the pixel stream.
+@a buffer_mode can be set to either #CIRC_OVERWRITE or #CIRC_NO_OVERWRITE. This function must be called
+before calling #pl_exp_start_cont.
+
+The settings are then downloaded to the camera. If there is any problem (overlapping regions
+or a frame-transfer setting for a camera that lacks that capability), this function aborts and
+returns with a failure. #pl_error_code indicates the definition problem.
+The @a exp_bytes pointer is filled with the number of bytes of memory needed to buffer the full
+sequence. (It is the developer's responsibility to allocate a memory buffer for the pixel stream.)
+When this function returns, the camera is ready to begin the exposure. #pl_exp_start_cont initiates
+exposure and readout.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] rgn_total Total number of regions defined for each image.
+@param[in] rgn_array Array of regions (must be rgn_total in size).
+ See rgn_type for details.
+@param[in] exp_mode Mode for capture (an OR-ed combination of #PL_EXPOSURE_MODES
+ and #PL_EXPOSE_OUT_MODES, if applicable).
+@param[in] exposure_time Time to expose in selected exposure resolution units.
+ Default is milliseconds (see #PARAM_EXP_RES).
+@param[out] exp_bytes Value returned from PVCAM specifying the required
+ number of bytes to allocate for the capture.
+@param[in] buffer_mode Circular buffer mode (#CIRC_OVERWRITE, #CIRC_NO_OVERWRITE).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see if the system can
+perform circular buffer operations. The circular buffer is passed to #pl_exp_start_cont.
+The buffer is allocated by your application.
+*/
+rs_bool PV_DECL pl_exp_setup_cont(int16 hcam, uns16 rgn_total,
+ const rgn_type* rgn_array, int16 exp_mode,
+ uns32 exposure_time, uns32* exp_bytes,
+ int16 buffer_mode);
+
+/**
+@brief Begins continuous readout into circular buffer.
+
+This function will initiate a continuous readout from the camera into a circular buffer.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] pixel_stream Buffer to hold image(s).
+@param[in] size Size of continuous capture pixel_stream
+ (must be a multiple of @c byte_cnt).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame,
+pl_exp_get_latest_frame, pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note If @a pixel_stream points to a buffer that is not an integer-multiple of the frame size
+for the exposure, this function will return #PV_FAIL and set an appropriate error
+code in #pl_error_code. For example, a buffer size of 1000 bytes with a frame size of 250 bytes is OK,
+but a buffer size of 900 bytes would cause a failure.
+Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to check to see if the system can
+perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_start_cont(int16 hcam, void* pixel_stream, uns32 size);
+
+/**
+@brief Sends a software trigger to the device.
+
+In order to use the software trigger, following preconditions must be met:
+ - Acquisition has been configured via a call to #pl_exp_setup_seq or #pl_exp_setup_cont
+ using one of the software triggering modes (@see PL_EXPOSURE_MODES).
+ - Acquisition has been started via #pl_exp_start_seq or #pl_exp_start_cont.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in,out] flags Input/output flags, see remarks.
+@param[in] value Reserved for future use. This value should be set to 0.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@remarks In current implementation the input flags should be set to 0. On output,
+the flags will contain one of the values defined in #PL_SW_TRIG_STATUSES enumeration.
+
+@see pl_exp_setup_seq, pl_exp_start_seq, pl_exp_setup_cont, pl_exp_start_cont,
+pl_exp_check_cont_status, pl_exp_get_oldest_frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_abort
+*/
+rs_bool PV_DECL pl_exp_trigger(int16 hcam, uns32* flags, uns32 value);
+
+/**
+@addtogroup grp_pm_deprecated_functions
+@{
+*/
+
+/**
+@brief Checks the status of sequence acquisition.
+
+This is only useful when data collection has been set up and started, as with a call
+to the functions #pl_exp_setup_seq and #pl_exp_start_seq. In general, these
+functions start an exposure and then immediately return, allowing the progress to be monitored.
+The @a status gives a quick evaluation of progress.
+The argument @a status returns one of the values listed here: #PL_IMAGE_STATUSES.
+
+More detailed information is returned in @a bytes_arrived. This reports on exactly
+how many bytes of data have arrived so far.
+This level of feedback is unimportant to many users.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] status Status of the current capture (#EXPOSURE_IN_PROGRESS, ...).
+@param[out] bytes_arrived Number of bytes that have arrived. For continuous
+ mode, this is the number of bytes that have arrived
+ this time through the buffer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_seq, pl_exp_start_seq
+
+@warning This is a legacy function used for polling the acquisition status.
+The 'polling' acquisition technique has been obsoleted. Modern cameras are designed
+to work best with the callback acquisition. See #pl_cam_register_callback_ex3.
+*/
+DEPRECATED rs_bool PV_DECL pl_exp_check_status(int16 hcam, int16* status, uns32* bytes_arrived);
+
+/**
+@brief Checks the continuous readout status from the camera into the circular buffer.
+
+This function will return the status of continuous readout from the camera
+into the circular buffer.
+@a status is a pointer to one of the values listed here: #PL_IMAGE_STATUSES.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] status Status of the current capture (#EXPOSURE_IN_PROGRESS,...).
+@param[out] bytes_arrived Number of bytes that have arrived. For continuous
+ mode, this is the number of bytes that have arrived
+ this time through the buffer.
+@param[out] buffer_cnt Number of times through the buffer (continuous mode).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_get_oldest frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note This function only returns meaningful results if a continuous readout from the camera
+has been initiated by a call to #pl_exp_start_cont.
+Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see if the system can
+perform circular buffer operations.
+
+@warning This is a legacy function used for polling the acquisition status.
+The 'polling' acquisition technique has been obsoleted. Modern cameras are designed
+to work best with the callback acquisition. See #pl_cam_register_callback_ex3.
+*/
+DEPRECATED rs_bool PV_DECL pl_exp_check_cont_status(int16 hcam, int16* status,
+ uns32* bytes_arrived, uns32* buffer_cnt);
+
+/**
+@brief Checks the continuous readout status from the camera into the circular buffer.
+
+This function will return the status of continuous readout from the camera
+into the circular buffer.
+@a status is a pointer to one of the values listed here: #PL_IMAGE_STATUSES.
+
+Values in the variable pointed to by frame_info will be updated with frame counters,
+timestamps (with precision of 0.1ms) and readout time information assigned by device driver
+at the moment of frame reception.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] status Status of the current capture (#EXPOSURE_IN_PROGRESS,...).
+@param[out] byte_cnt Size of buffer to hold images (in bytes).
+@param[out] buffer_cnt Number of times through the buffer (continuous mode).
+@param[out] frame_info Frame info struct pointer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_get_oldest_frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont, pl_create_frame_info_struct,
+pl_exp_get_latest_frame_ex, pl_exp_get_oldest_frame_ex
+
+@note This function only returns meaningful results if a continuous readout from the camera has
+been initiated by a call to #pl_exp_start_cont. Use the parameter ID #PARAM_CIRC_BUFFER
+with #pl_get_param to see if the system can perform circular buffer operations.
+Variable pointed to by frame_info must be created with #pl_create_frame_info_struct.
+
+@warning This is a legacy function used for polling the acquisition status.
+The 'polling' acquisition technique has been obsoleted. Modern cameras are designed
+to work best with the callback acquisition. See #pl_cam_register_callback_ex3.
+*/
+DEPRECATED rs_bool PV_DECL pl_exp_check_cont_status_ex(int16 hcam, int16* status,
+ uns32* byte_cnt, uns32* buffer_cnt,
+ FRAME_INFO* frame_info);
+
+/** @} */ /* grp_pm_deprecated_functions */
+
+/**
+@brief This function returns a pointer to the most recently acquired frame in the circular buffer.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the most recent frame.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_stop_cont
+
+@note If the camera in use is not able to return the latest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the latest frame in
+#CIRC_NO_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to
+see if the system can perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_get_latest_frame(int16 hcam, void** frame);
+
+/**
+@brief Returns pointer to the most recent frame in circular buffer.
+
+Additionally, this function updates values of timestamps (with precision of 0.1ms),
+frame counter numbers and readout time in variable of #FRAME_INFO type.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the most recent frame.
+@param[out] frame_info Frame info struct pointer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_stop_cont,
+pl_exp_get_oldest_frame_ex, pl_exp_check_cont_status_ex, pl_cam_register_callback_ex2,
+pl_create_frame_info_struct, pl_release_frame_info_struct
+
+@note If the camera in use is not able to return the latest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the latest frame
+in #CIRC_NO_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see
+if the system can perform circular buffer operations.
+Variable pointed to by frame_info must be created with #pl_create_frame_info_struct.
+*/
+rs_bool PV_DECL pl_exp_get_latest_frame_ex(int16 hcam, void** frame,
+ FRAME_INFO* frame_info);
+
+/**
+@brief This function returns pointer to the oldest unretrieved frame in the circular buffer.
+
+After calling this function, #pl_exp_unlock_oldest_frame has to be called to notify PVCAM that
+the oldest frame can be overwritten with new data.\n
+This function should be used with acquisitions running in #CIRC_NO_OVERWRITE mode.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the oldest unretrieved frame.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont, pl_exp_get_oldest_frame_ex
+
+@note If the camera in use is not able to return the oldest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the oldest frame
+in #CIRC_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param
+to see if the system can perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_get_oldest_frame(int16 hcam, void** frame);
+
+/**
+@brief This function returns pointer to the oldest unretrieved frame in the circular buffer.
+
+After calling this function, #pl_exp_unlock_oldest_frame has to be called to notify PVCAM that
+the oldest frame can be overwritten with new data.\n
+This function should be used in acquisitions running in #CIRC_NO_OVERWRITE mode.
+
+Additionally, this function updates the values in the variable pointed to by @a frame_info
+with the data collected at the time of frame reception by the device driver (e.g. frame counter value).
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the oldest unretrieved frame.
+@param[out] frame_info Frame info struct pointer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont, pl_exp_check_cont_status_ex,
+pl_cam_register_callback_ex2, pl_create_frame_info_struct, pl_release_frame_info_struct
+
+@note If the camera in use is not able to return the oldest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the oldest frame in
+#CIRC_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with pl_get_param to see
+if the system can perform circular buffer operations.
+Variable pointed to by frame_info must be created with #pl_create_frame_info_struct.
+*/
+rs_bool PV_DECL pl_exp_get_oldest_frame_ex(int16 hcam, void** frame,
+ FRAME_INFO* frame_info);
+
+/**
+@brief Makes oldest frame in circular buffer overwritable.
+
+This function allows PVCAM to overwrite the oldest frame in the circular buffer.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note Failure to call this function after using the frame will cause the continuous acquisition
+progress to halt eventually, because the frame cannot be overwritten when it is locked.
+Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to check to see if the system can perform
+circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_unlock_oldest_frame(int16 hcam);
+
+/**
+@brief Stops continuous readout acquisition. Identical to #pl_exp_abort.
+
+This function halts a continuous readout acquisition into the circular buffer.
+@a cam_state defines the new state of the Camera Control Subsystem,
+as described in the documentation for the #pl_exp_abort function. To simplify the code, #pl_exp_abort
+may be used instead of #pl_exp_stop_cont to stop both continuous and sequential acquisitions.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] cam_state State to set the camera in (#CCS_NO_CHANGE,...).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame,
+pl_exp_get_latest_frame, pl_exp_unlock_oldest_frame
+
+@note Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see if the system
+can perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_stop_cont(int16 hcam, int16 cam_state);
+
+/**
+@brief Stops collecting data, cleans up device driver, halts camera.
+
+#pl_exp_abort performs two functions: it stops the host device driver, and it may halt the camera
+(@a hcam specifies which camera and which device driver are being used.) Halting the camera halts
+@a readout, @c clearing, and all other camera activity. On the host side, data collection is controlled
+by a device driver. If data collection is currently enabled (the image data @b active state), this
+function stops collection, returns the low-level communication hardware and software to an image
+data @b idle state, and disables collection. In the @b idle state, any data that arrives is ignored and
+discarded. The @b idle state is the normal system default. On the camera side, the Camera Control
+Subsystem (CCS) may be in the process of collecting data, or it may be in one of several idle states.
+This function always stops the data collection software. In addition, it has the option of forcing
+the CCS into a new state by setting the @a cam_state variable to one of the following constants,
+which are camera-dependent: #PL_CCS_ABORT_MODES.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] cam_state State to set the camera in (#CCS_NO_CHANGE,...).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@note This may also be called outside of an exposure. It can explicitly open the shutter,
+close the shutter, or stop the CCS. In the @b idle state, the system takes the least possible
+amount of action when image data arrives. On some systems, this involves placing the hardware
+in reset state, so it is inactive. On SCSI systems, the driver does not initiate any data transfers,
+although a buffer on the camera end may be filling up. If the CCS is halted and the shutter
+is closed (#CCS_HALT_CLOSE_SHTR), the current image remains on the sensor (although dark charge
+continues to accumulate). If @c clear_cycles is zero or the clear mode is #CLEAR_NEVER, the image
+may be read off by performing a bias readout. In frame transfer mode, you may not want to close
+the shutter when halting the CCS. Some frame transfer systems do not include a shutter, in which
+case an attempt to open or close the shutter is ignored, but does not cause an error.
+*/
+rs_bool PV_DECL pl_exp_abort(int16 hcam, int16 cam_state);
+
+/**
+@brief Finishes and cleans up after #pl_exp_start_seq.
+
+This cleans up after an exposure started through #pl_exp_start_seq has finished readout.
+If the exposure has not finished readout, this function returns with an error.
+Argument @a hbuf is not used at the moment.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] pixel_stream Buffer to hold image(s).
+@param[in] hbuf Standard image buffer. Not used at this time.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_abort, pl_exp_check_status, pl_exp_setup_seq, pl_exp_start_seq
+
+@note This function must also be called if acquiring in sequential mode
+(using #pl_exp_setup_seq and #pl_exp_start_seq) with callback notification
+after a frame is read out and before new exposure is started by calling #pl_exp_start_seq.
+*/
+rs_bool PV_DECL pl_exp_finish_seq(int16 hcam, void* pixel_stream, int16 hbuf);
+
+/**
+@brief Defines control of an I/O line from within a camera script.
+
+This function allows the application program to define control of the available I/O lines
+from within a script. This allows for more precise control of external devices. For example,
+the application could request that a linear stage be indexed immediately after integration,
+instead of waiting until after the data is read out, the shutter is closed, etc.
+
+@a state has different meanings depending on the I/O type which are described here: #PL_IO_TYPE.
+@a location can be set to the values described here: #PL_SRC_MODES.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] addr Specifies which I/O address to control.
+@param[in] state Specifies the value to write to the register.
+@param[in] location Specifies when to control the I/O (#SCR_PRE_FLASH,...).
+ Values are listed under #PL_IO_TYPE.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_io_clear_script_control
+*/
+rs_bool PV_DECL pl_io_script_control(int16 hcam, uns16 addr, flt64 state,
+ uns32 location);
+
+/**
+@brief Clears the current setup for control of the available I/O lines within a camera script.
+
+This function allows the application program to clear the current setup for control
+of the available I/O lines within the script. This allows the user to enter
+a new setup for these lines.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_io_script_control
+*/
+rs_bool PV_DECL pl_io_clear_script_control(int16 hcam);
+
+/** @} */ /* grp_pm_functions */
+
+/*****************************************************************************/
+/**
+@addtogroup grp_pm_deprecated_functions
+Most of the functions are obsolete and their corresponding PARAM_
+parameters should be used with #pl_get_param, #pl_set_param,
+#pl_get_enum_param and #pl_enum_str_length.
+@{
+*/
+
+DEPRECATED rs_bool PV_DECL pl_exp_init_seq(void);
+DEPRECATED rs_bool PV_DECL pl_exp_uninit_seq(void);
+/** Use #PARAM_DD_INFO instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_info(int16 hcam, int16 bytes, char* text);
+/** Use #PARAM_DD_INFO_LENGTH instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_info_length(int16 hcam, int16* bytes);
+/** Use #PARAM_DD_VERSION instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_ver(int16 hcam, uns16* version);
+/** Use #PARAM_DD_RETRIES instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_retries(int16 hcam, uns16* max_retries);
+/** Use #PARAM_DD_RETRIES instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_set_retries(int16 hcam, uns16 max_retries);
+/** Use #PARAM_DD_TIMEOUT instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_timeout(int16 hcam, uns16* m_sec);
+/** Use #PARAM_DD_TIMEOUT instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_set_timeout(int16 hcam, uns16 m_sec);
+/** Use #PARAM_ADC_OFFSET instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_adc_offset(int16 hcam, int16* offset);
+/** Use #PARAM_ADC_OFFSET instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_adc_offset(int16 hcam, int16 offset);
+/** Use #PARAM_CHIP_NAME instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_chip_name(int16 hcam, char* chip_name);
+/** Use #PARAM_CLEAR_CYCLES instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_clear_cycles(int16 hcam, uns16* clear_cycles);
+/** Use #PARAM_CLEAR_CYCLES instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_clear_cycles(int16 hcam, uns16 clear_cycles);
+/** Use #PARAM_CLEAR_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_clear_mode(int16 hcam, int16* clear_mode);
+/** Use #PARAM_CLEAR_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_clear_mode(int16 hcam, int16 clear_mode);
+/** Use #PARAM_COLOR_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_color_mode(int16 hcam, uns16* color_mode);
+/** Use #PARAM_COOLING_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_cooling_mode(int16 hcam, int16* cooling);
+/** Use #PARAM_FRAME_CAPABLE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_frame_capable(int16 hcam, rs_bool* frame_capable);
+/** Use #PARAM_FWELL_CAPACITY instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_fwell_capacity(int16 hcam, uns32* fwell_capacity);
+/** Use #PARAM_MPP_CAPABLE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_mpp_capable(int16 hcam, int16* mpp_capable);
+/** Use #PARAM_PREAMP_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_preamp_dly(int16 hcam, uns16* preamp_dly);
+/** Use #PARAM_PREAMP_OFF_CONTROL instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_preamp_off_control(int16 hcam,
+ uns32* preamp_off_control);
+/** Use #PARAM_PREAMP_OFF_CONTROL instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_preamp_off_control(int16 hcam,
+ uns32 preamp_off_control);
+/** Use deprecated PARAM_PREFLASH instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_preflash(int16 hcam, uns16* pre_flash);
+/** Use #PARAM_PMODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pmode(int16 hcam, int16* pmode);
+/** Use #PARAM_PMODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_pmode(int16 hcam, int16 pmode);
+/** Use #PARAM_PREMASK instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_premask(int16 hcam, uns16* pre_mask);
+/** Use #PARAM_PRESCAN instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_prescan(int16 hcam, uns16* pre_scan);
+/** Use #PARAM_POSTMASK instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_postmask(int16 hcam, uns16* post_mask);
+/** Use #PARAM_POSTSCAN instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_postscan(int16 hcam, uns16* post_scan);
+/** Use #PARAM_PAR_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_par_size(int16 hcam, uns16* par_size);
+/** Use #PARAM_SER_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_ser_size(int16 hcam, uns16* ser_size);
+/** Use deprecated PARAM_SERIAL_NUM instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_serial_num(int16 hcam, uns16* serial_num);
+/** Use deprecated PARAM_CCS_STATUS instead. */
+DEPRECATED rs_bool PV_DECL pl_ccs_get_status(int16 hcam, int16* ccs_status);
+/** Use #PARAM_SUMMING_WELL instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_summing_well(int16 hcam, rs_bool* s_well_exists);
+/** Use #PARAM_TEMP instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_tmp(int16 hcam, int16* cur_tmp);
+/** Use #PARAM_TEMP instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_tmp_range(int16 hcam, int16* tmp_hi_val,
+ int16* tmp_lo_val);
+/** Use #PARAM_TEMP_SETPOINT instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_tmp_setpoint(int16 hcam, int16* tmp_setpoint);
+/** Use #PARAM_TEMP_SETPOINT instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_tmp_setpoint(int16 hcam, int16 tmp_setpoint);
+DEPRECATED rs_bool PV_DECL pl_ccd_set_readout_port(int16 , int16 );
+/** Use #PARAM_PIX_PAR_DIST instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_par_dist(int16 hcam, uns16* pix_par_dist);
+/** Use #PARAM_PIX_PAR_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_par_size(int16 hcam, uns16* pix_par_size);
+/** Use #PARAM_PIX_SER_DIST instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_ser_dist(int16 hcam, uns16* pix_ser_dist);
+/** Use #PARAM_PIX_SER_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_ser_size(int16 hcam, uns16* pix_ser_size);
+/** Use #PARAM_BIT_DEPTH instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_bits(int16 hcam, int16* spdtab_bits);
+/** Use #PARAM_GAIN_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_gain(int16 hcam, int16* spdtab_gain);
+/** Use #PARAM_GAIN_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_set_gain(int16 hcam, int16 spdtab_gain);
+/** Use #PARAM_GAIN_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_max_gain(int16 hcam, int16* spdtab_max_gain);
+/** Use #PARAM_SPDTAB_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_num(int16 hcam, int16* spdtab_num);
+/** Use #PARAM_SPDTAB_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_set_num(int16 hcam, int16 spdtab_num);
+/** Use #PARAM_SPDTAB_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_entries(int16 hcam, int16* spdtab_entries);
+/** Use #PARAM_READOUT_PORT instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_port(int16 hcam, int16* spdtab_port);
+/** Use #PARAM_READOUT_PORT instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_port_total(int16 hcam, int16* total_ports);
+/** Use #PARAM_PIX_TIME instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_time(int16 hcam, uns16* spdtab_time);
+/** Use #PARAM_SHTR_CLOSE_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_close_dly(int16 hcam, uns16* shtr_close_dly);
+/** Use #PARAM_SHTR_CLOSE_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_set_close_dly(int16 hcam, uns16 shtr_close_dly);
+/** Use #PARAM_SHTR_OPEN_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_open_dly(int16 hcam, uns16* shtr_open_dly);
+/** Use #PARAM_SHTR_OPEN_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_set_open_dly(int16 hcam, uns16 shtr_open_dly);
+/** Use #PARAM_SHTR_OPEN_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_open_mode(int16 hcam, int16* shtr_open_mode);
+/** Use #PARAM_SHTR_OPEN_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_set_open_mode(int16 hcam, int16 shtr_open_mode);
+/** Use #PARAM_SHTR_STATUS instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_status(int16 hcam, int16* shtr_status);
+/** Use #PARAM_EXP_TIME instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_get_time_seq(int16 hcam, uns16* exp_time);
+/** Use #PARAM_EXP_TIME instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_set_time_seq(int16 hcam, uns16 exp_time);
+/** Use #pl_exp_check_status or #pl_exp_check_cont_status instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_check_progress(int16 hcam, int16* status, uns32* bytes_arrived);
+
+/** Use #pl_exp_setup_cont instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_set_cont_mode(int16 hcam, int16 mode);
+DEPRECATED rs_bool PV_DECL pl_subsys_do_diag(int16 hcam, uns8 addr, uns16* err_code);
+DEPRECATED rs_bool PV_DECL pl_subsys_get_id(int16 hcam, uns8 addr, uns16* part_num, uns8* revision);
+DEPRECATED rs_bool PV_DECL pl_subsys_get_name(int16 hcam, uns8 addr, char* subsys_name);
+DEPRECATED rs_bool PV_DECL pl_exp_get_driver_buffer(int16 hcam,
+ void** pixel_stream,
+ uns32* byte_cnt);
+DEPRECATED rs_bool PV_DECL pl_buf_init(void);
+DEPRECATED rs_bool PV_DECL pl_buf_uninit(void);
+DEPRECATED rs_bool PV_DECL pl_buf_alloc(int16* hbuf, int16 exp_total,
+ int16 bit_depth, int16 rgn_total,
+ const rgn_type* rgn_array);
+DEPRECATED rs_bool PV_DECL pl_buf_get_exp_date(int16 hbuf, int16 exp_num, int16* year,
+ uns8* month, uns8* day, uns8* hour,
+ uns8* min, uns8* sec, uns16* msec);
+DEPRECATED rs_bool PV_DECL pl_buf_set_exp_date(int16 hbuf, int16 exp_num, int16 year,
+ uns8 month, uns8 day, uns8 hour,
+ uns8 min, uns8 sec, uns16 msec);
+DEPRECATED rs_bool PV_DECL pl_buf_get_exp_time(int16 hbuf, int16 exp_num, uns32* exp_msec);
+DEPRECATED rs_bool PV_DECL pl_buf_get_exp_total(int16 hbuf, int16* total_exps);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_bin(int16 himg, int16* ibin, int16* jbin);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_handle(int16 hbuf, int16 exp_num,
+ int16 img_num, int16* himg);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_ofs(int16 himg, int16* s_ofs, int16* p_ofs);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_ptr(int16 himg, void** img_addr);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_size(int16 himg, int16* x_size, int16* y_size);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_total(int16 hbuf, int16* totl_imgs);
+DEPRECATED rs_bool PV_DECL pl_buf_get_size(int16 hbuf, int32* buf_size);
+DEPRECATED rs_bool PV_DECL pl_buf_free(int16 hbuf);
+DEPRECATED rs_bool PV_DECL pl_buf_get_bits(int16 hbuf, int16* bit_depth);
+DEPRECATED rs_bool PV_DECL pl_exp_unravel(int16 hcam, uns16 exposure,
+ void* pixel_stream, uns16 rgn_total,
+ const rgn_type* rgn_array,
+ uns16** array_list);
+DEPRECATED rs_bool PV_DECL pl_exp_wait_start_xfer(int16 hcam, uns32 tlimit);
+DEPRECATED rs_bool PV_DECL pl_exp_wait_end_xfer(int16 hcam, uns32 tlimit);
+
+DEPRECATED rs_bool PV_DECL pv_cam_get_ccs_mem(int16 hcam, uns16* size);
+DEPRECATED rs_bool PV_DECL pv_cam_send_debug(int16 hcam, char* debug_str,
+ uns16 reply_len, char* reply_str);
+DEPRECATED rs_bool PV_DECL pv_cam_write_read(int16 hcam, uns8 c_class, uns16 write_bytes,
+ uns8* write_array, uns8* read_array);
+DEPRECATED rs_bool PV_DECL pv_dd_active(int16 hcam, void* pixel_stream);
+DEPRECATED rs_bool PV_DECL pv_exp_get_bytes(int16 hcam, uns32* exp_bytes);
+DEPRECATED rs_bool PV_DECL pv_exp_get_script(int16 hcam, rs_bool* script_valid);
+DEPRECATED rs_bool PV_DECL pv_exp_get_status(int16 hcam, int16* status,
+ uns32* byte_cnt, uns32* frame_cnt);
+DEPRECATED rs_bool PV_DECL pv_exp_set_bytes(int16 hcam, uns32 frame_count,
+ uns32 seq_bytes, void* pixel_stream);
+DEPRECATED rs_bool PV_DECL pv_exp_set_script(int16 hcam, rs_bool script_valid);
+DEPRECATED rs_bool PV_DECL pv_set_error_code(int16 omode,int16 err_code);
+DEPRECATED rs_bool PV_DECL pv_cam_do_reads(int16 hcam);
+DEPRECATED rs_bool PV_DECL pv_free(void* block, int16 heap);
+DEPRECATED void* PV_DECL pv_malloc(uns32 size, int16 heap);
+DEPRECATED void* PV_DECL pv_realloc(void* block, uns32 size, int16 heap);
+DEPRECATED rs_bool PV_DECL pv_script_set_hook(pm_script_hook* pfn);
+DEPRECATED rs_bool PV_DECL pv_ccd_get_accum_capable(int16 hcam, rs_bool* accum_capable);
+DEPRECATED rs_bool PV_DECL pv_exp_get_frames(int16 hcam, uns32* exp_frames);
+DEPRECATED rs_bool PV_DECL pv_exp_set_frames(int16 hcam, uns32 exp_frames);
+DEPRECATED rs_bool PV_DECL pv_exp_set_no_readout_timeout(int16 hcam);
+DEPRECATED rs_bool PV_DECL pv_exp_reset_no_readout_timeout(int16 hcam);
+DEPRECATED rs_bool PV_DECL pm_cam_write_read(int16 hcam, uns8 c_class, uns16 write_bytes,
+ uns8* write_array, uns8* read_array);
+
+DEPRECATED rs_bool PV_DECL pl_ddi_get_ver(uns16* version);
+DEPRECATED rs_bool PV_DECL pl_cam_get_diags(int16 hcam);
+
+/** @} */ /* grp_pm_deprecated_functions */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Frame metadata functions */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Decodes a metadata-enabled frame buffer into provided frame descriptor structure.
+
+This function processes the input frame buffer and calculates pointers to frame metadata headers,
+ROI headers and ROI image data and stores them to previously allocated @a pDstFrame structure.
+This function does not copy any pixel data. Since the @a pDstFrame stores only pointers
+to the @a pSrcBuf memory, the @a pSrcBuf must be valid for as long as the @a pDstFrame is
+accessed.
+
+@param[out] pDstFrame A pre-allocated helper structure that will be filled with
+ information from the given raw buffer. Create this structure with
+ #pl_md_create_frame_struct or #pl_md_create_frame_struct_cont functions.
+@param[in] pSrcBuf A pointer to a frame data as retrieved from PVCAM. See functions
+ #pl_exp_get_latest_frame and #pl_exp_get_latest_frame_ex.
+@param[in] srcBufSize The size of the raw frame data. Size of a frame is obtained
+ from #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_frame_decode(md_frame* pDstFrame, void* pSrcBuf, uns32 srcBufSize);
+
+/**
+@brief Optional function that recomposes a multi-ROI frame into a displayable image buffer.
+
+Every ROI will be copied into its appropriate location in the provided buffer.
+Please note that the function will subtract the Implied ROI position from each ROI
+position which essentially moves the entire Implied ROI to a [0, 0] position.
+Use the Offset arguments to shift all ROIs back to desired positions if needed.
+If you use the Implied ROI position for offset arguments, the frame will be recomposed
+as it appears on the full frame.
+
+The caller is responsible for black-filling the input buffer. Usually, this function
+is called during live/preview mode where the destination buffer is re-used. If the
+ROIs do move during acquisition, it is essential to black-fill the destination buffer
+before calling this function. This is not needed if the ROIs do not move.
+If the ROIs move during live mode, it is also recommended to use the offset arguments
+and recompose the ROI to a full frame - with moving ROIs the implied ROI may change
+with each frame and this may cause undesired ROI "twitching" in the displayable image.
+
+@param[out] pDstBuf An output buffer; the buffer must be at least the size of the implied
+ ROI that is calculated during the frame decoding process. The buffer
+ must be of the same type as is the input frame - e.g. if the input
+ frame format is 8-bit, the destination buffer should be 8-bit as well.
+ If offset is set, the buffer dimensions must be large enough to allow
+ the entire implied ROI to be positioned in the buffer.
+@param[in] offX Offset in the destination buffer, in pixels. If 0, the Implied
+ ROI will be shifted to position 0 in the target buffer.
+ Use (ImpliedRoi.s1 / ImplierRoi.sbin) as offset value to
+ disable the shift and keep the ROIs in their absolute positions.
+@param[in] offY Offset in the destination buffer, in pixels. If 0, the Implied
+ ROI will be shifted to position 0 in the target buffer.
+ Use (ImpliedRoi.p1 / ImplierRoi.pbin) as offset value to
+ disable the shift and keep the ROIs in their absolute positions.
+@param[in] dstWidth Width, in pixels of the destination image buffer. The buffer
+ must be large enough to hold the entire Implied ROI, including
+ the offsets (if used).
+@param[in] dstHeight Height, in pixels of the destination image buffer.
+@param[in] pSrcFrame A helper structure, previously decoded using the frame
+ decoding function #pl_md_frame_decode.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_frame_recompose(void* pDstBuf, uns16 offX, uns16 offY,
+ uns16 dstWidth, uns16 dstHeight,
+ md_frame* pSrcFrame);
+
+/**
+@brief This method creates an empty md_frame structure for known number of ROIs.
+
+Use this method to prepare and pre-allocate one structure before starting
+continuous acquisition. Once callback arrives, fill the structure with
+#pl_md_frame_decode and display the metadata.
+Release the structure when not needed.
+
+@param[out] pFrame A pointer to frame helper structure address where the structure
+ will be allocated.
+@param[in] roiCount Number of ROIs the structure should be prepared for.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_create_frame_struct_cont(md_frame** pFrame, uns16 roiCount);
+
+/**
+@brief This method creates an empty md_frame structure from an existing buffer.
+
+Use this method when loading buffers from disk or when performance is not
+critical. Do not forget to release the structure when not needed.
+For continuous acquisition where the number or ROIs is known, it is recommended
+to use the other provided method to avoid frequent memory allocation.
+
+@param[out] pFrame A pointer address where the newly created structure will be stored.
+@param[in] pSrcBuf A raw frame data pointer as returned from the camera.
+@param[in] srcBufSize Size of the raw frame data buffer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_create_frame_struct(md_frame** pFrame, void* pSrcBuf,
+ uns32 srcBufSize);
+
+/**
+@brief Releases the md_frame struct.
+
+@param[in] pFrame A pointer to the previously allocated structure.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_release_frame_struct(md_frame* pFrame);
+
+/**
+@brief Reads all the extended metadata from the given ext. metadata buffer.
+
+@param[out] pOutput A pre-allocated structure that will be filled with metadata
+@param[in] pExtMdPtr A pointer to the ext. MD buffer, this can be obtained from
+ the md_frame and md_frame_roi structures.
+@param[in] extMdSize Size of the ext. MD buffer, also retrievable from the helper
+ structures.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_read_extended(md_ext_item_collection* pOutput, void* pExtMdPtr,
+ uns32 extMdSize);
+
+/** @} */ /* grp_pm_functions */
+
+#ifdef PV_C_PLUS_PLUS
+};
+#endif
+
+#endif /* PV_EMBEDDED */
+
+/******************************************************************************/
+/* End of function prototypes. */
+/******************************************************************************/
+
+#endif /* _PVCAM_H */
diff --git a/pvcam-sdk/linux/library/aarch64/libpvcam.so b/pvcam-sdk/linux/library/aarch64/libpvcam.so
new file mode 120000
index 0000000..b0f9c55
--- /dev/null
+++ b/pvcam-sdk/linux/library/aarch64/libpvcam.so
@@ -0,0 +1 @@
+libpvcam.so.2.6
\ No newline at end of file
diff --git a/pvcam-sdk/linux/library/aarch64/libpvcam.so.2 b/pvcam-sdk/linux/library/aarch64/libpvcam.so.2
new file mode 120000
index 0000000..b0f9c55
--- /dev/null
+++ b/pvcam-sdk/linux/library/aarch64/libpvcam.so.2
@@ -0,0 +1 @@
+libpvcam.so.2.6
\ No newline at end of file
diff --git a/pvcam-sdk/linux/library/aarch64/libpvcam.so.2.6 b/pvcam-sdk/linux/library/aarch64/libpvcam.so.2.6
new file mode 100755
index 0000000..30750b4
Binary files /dev/null and b/pvcam-sdk/linux/library/aarch64/libpvcam.so.2.6 differ
diff --git a/pvcam-sdk/linux/library/i686/libpvcam.so b/pvcam-sdk/linux/library/i686/libpvcam.so
new file mode 120000
index 0000000..b0f9c55
--- /dev/null
+++ b/pvcam-sdk/linux/library/i686/libpvcam.so
@@ -0,0 +1 @@
+libpvcam.so.2.6
\ No newline at end of file
diff --git a/pvcam-sdk/linux/library/i686/libpvcam.so.2 b/pvcam-sdk/linux/library/i686/libpvcam.so.2
new file mode 120000
index 0000000..b0f9c55
--- /dev/null
+++ b/pvcam-sdk/linux/library/i686/libpvcam.so.2
@@ -0,0 +1 @@
+libpvcam.so.2.6
\ No newline at end of file
diff --git a/pvcam-sdk/linux/library/i686/libpvcam.so.2.6 b/pvcam-sdk/linux/library/i686/libpvcam.so.2.6
new file mode 100755
index 0000000..2e1a4ce
Binary files /dev/null and b/pvcam-sdk/linux/library/i686/libpvcam.so.2.6 differ
diff --git a/pvcam-sdk/linux/library/x86_64/libpvcam.so b/pvcam-sdk/linux/library/x86_64/libpvcam.so
new file mode 120000
index 0000000..b0f9c55
--- /dev/null
+++ b/pvcam-sdk/linux/library/x86_64/libpvcam.so
@@ -0,0 +1 @@
+libpvcam.so.2.6
\ No newline at end of file
diff --git a/pvcam-sdk/linux/library/x86_64/libpvcam.so.2 b/pvcam-sdk/linux/library/x86_64/libpvcam.so.2
new file mode 120000
index 0000000..b0f9c55
--- /dev/null
+++ b/pvcam-sdk/linux/library/x86_64/libpvcam.so.2
@@ -0,0 +1 @@
+libpvcam.so.2.6
\ No newline at end of file
diff --git a/pvcam-sdk/linux/library/x86_64/libpvcam.so.2.6 b/pvcam-sdk/linux/library/x86_64/libpvcam.so.2.6
new file mode 100755
index 0000000..4084bb7
Binary files /dev/null and b/pvcam-sdk/linux/library/x86_64/libpvcam.so.2.6 differ
diff --git a/pvcam-sdk/linux/version.txt b/pvcam-sdk/linux/version.txt
new file mode 100644
index 0000000..35b7550
--- /dev/null
+++ b/pvcam-sdk/linux/version.txt
@@ -0,0 +1,4 @@
+Installer files:
+----------------
+pvcam_3.10.2.5.run
+pvcam-sdk_3.10.2.5-1.run
diff --git a/pvcam-sdk/windows/Inc/master.h b/pvcam-sdk/windows/Inc/master.h
new file mode 100644
index 0000000..b907b89
--- /dev/null
+++ b/pvcam-sdk/windows/Inc/master.h
@@ -0,0 +1,120 @@
+/******************************************************************************/
+/* Copyright (C) Teledyne Photometrics. All rights reserved. */
+/******************************************************************************/
+
+#ifndef _MASTER_H
+#define _MASTER_H
+
+/*
+This allows us to insert the proper compiler flags, in pvcam.h for example,
+to cope properly with C++ definitions.
+*/
+#if defined(__cplusplus)
+ /* BORLAND C++ and GCC */
+ #define PV_C_PLUS_PLUS
+#elif defined(__cplusplus__)
+ /* MICROSOFT C++ */
+ #define PV_C_PLUS_PLUS
+#endif
+
+/******************************************************************************/
+/* Platform-specific defined like calling conventions, etc. */
+/******************************************************************************/
+
+#if defined(_WIN32) || defined(_WIN64)
+ #define PV_DECL __stdcall
+ #define DEPRECATED __declspec(deprecated)
+#elif defined(__linux__)
+ #define PV_DECL
+ #define DEPRECATED __attribute__((deprecated))
+#elif defined(__APPLE__)
+ #define PV_DECL
+ #define DEPRECATED __attribute__((deprecated))
+#endif
+
+/******************************************************************************/
+/* PVCAM types */
+/******************************************************************************/
+
+/** General error codes usually returned from functions as rs_bool value. */
+enum
+{
+ PV_FAIL = 0,
+ PV_OK
+};
+
+typedef unsigned short rs_bool;
+typedef signed char int8;
+typedef unsigned char uns8;
+typedef short int16;
+typedef unsigned short uns16;
+typedef int int32;
+typedef unsigned int uns32;
+typedef float flt32;
+typedef double flt64;
+
+#if defined(_MSC_VER)
+ typedef unsigned __int64 ulong64;
+ typedef signed __int64 long64;
+#else
+ typedef unsigned long long ulong64;
+ typedef signed long long long64;
+#endif
+
+/**
+@defgroup grp_pm_deprecated Deprecated symbols
+*/
+
+/**
+@defgroup grp_pm_deprecated_typedefs Deprecated types
+@ingroup grp_pm_deprecated
+These types are included for compatibility reasons.
+@{
+*/
+
+#define PV_PTR_DECL *
+
+typedef void* void_ptr;
+typedef void** void_ptr_ptr;
+
+typedef rs_bool* rs_bool_ptr;
+typedef char* char_ptr;
+typedef int8* int8_ptr;
+typedef uns8* uns8_ptr;
+typedef int16* int16_ptr;
+typedef uns16* uns16_ptr;
+typedef int32* int32_ptr;
+typedef uns32* uns32_ptr;
+typedef flt32* flt32_ptr;
+typedef flt64* flt64_ptr;
+typedef ulong64* ulong64_ptr;
+typedef long64* long64_ptr;
+
+typedef const rs_bool* rs_bool_const_ptr;
+typedef const char* char_const_ptr;
+typedef const int8* int8_const_ptr;
+typedef const uns8* uns8_const_ptr;
+typedef const int16* int16_const_ptr;
+typedef const uns16* uns16_const_ptr;
+typedef const int32* int32_const_ptr;
+typedef const uns32* uns32_const_ptr;
+typedef const flt32* flt32_const_ptr;
+typedef const flt64* flt64_const_ptr;
+typedef const ulong64* ulong64_const_ptr;
+typedef const long64* long64_const_ptr;
+
+/** @} */ /* grp_pm_deprecated_typedefs */
+
+/******************************************************************************/
+/* PVCAM constants */
+/******************************************************************************/
+
+#ifndef FALSE
+ #define FALSE PV_FAIL /* FALSE == 0 */
+#endif
+
+#ifndef TRUE
+ #define TRUE PV_OK /* TRUE == 1 */
+#endif
+
+#endif /* _MASTER_H */
diff --git a/pvcam-sdk/windows/Inc/pvcam.h b/pvcam-sdk/windows/Inc/pvcam.h
new file mode 100644
index 0000000..e42ccdc
--- /dev/null
+++ b/pvcam-sdk/windows/Inc/pvcam.h
@@ -0,0 +1,4796 @@
+/******************************************************************************/
+/* Copyright (C) Teledyne Photometrics. All rights reserved. */
+/******************************************************************************/
+
+#ifndef _PVCAM_H
+#define _PVCAM_H
+
+/******************************************************************************/
+/* Constants */
+/******************************************************************************/
+
+/** Maximum number of cameras on this system. */
+#define MAX_CAM 16
+
+/******************************************************************************/
+/* Name/ID sizes */
+/******************************************************************************/
+
+/** Maximum length of a camera name including space for null terminator. */
+/** @see #pl_cam_get_name for details. */
+#define CAM_NAME_LEN 32
+/** @deprecated Use #MAX_PP_NAME_LEN instead. */
+#define PARAM_NAME_LEN 32
+/** Maximum length of an error message including space for null terminator. */
+/** @see #pl_error_message for details. */
+#define ERROR_MSG_LEN 255
+/** Maximum length of a sensor chip name including space for null terminator. */
+/** @see #PARAM_CHIP_NAME for details. */
+#define CCD_NAME_LEN 17
+/** Maximum length of a camera serial number string including space for null
+ terminator. */
+/** @see #PARAM_HEAD_SER_NUM_ALPHA for details. */
+#define MAX_ALPHA_SER_NUM_LEN 32
+/** Maximum length of a post-processing parameter/feature name including space
+ for null terminator. */
+/** @see #PARAM_PP_FEAT_NAME and #PARAM_PP_PARAM_NAME for details. */
+#define MAX_PP_NAME_LEN 32
+/** Maximum length of a system name including space for null terminator. */
+/** @see #PARAM_SYSTEM_NAME for details. */
+#define MAX_SYSTEM_NAME_LEN 32
+/** Maximum length of a vendor name including space for null terminator */
+/** @see #PARAM_VENDOR_NAME for details. */
+#define MAX_VENDOR_NAME_LEN 32
+/** Maximum length of a product name including space for null terminator. */
+/** @see #PARAM_PRODUCT_NAME for details. */
+#define MAX_PRODUCT_NAME_LEN 32
+/** Maximum length of a camera part number including space for null terminator. */
+/** @see #PARAM_CAMERA_PART_NUMBER for details. */
+#define MAX_CAM_PART_NUM_LEN 32
+/** Maximum length of a gain name including space for null terminator. */
+/** @see #PARAM_GAIN_NAME for details. */
+#define MAX_GAIN_NAME_LEN 32
+/** Maximum length of a speed name including space for null terminator. */
+/** @see #PARAM_SPDTAB_NAME for details. */
+#define MAX_SPDTAB_NAME_LEN 32
+/** Maximum length of a gain name including space for null terminator. */
+/** @see #PARAM_CAM_SYSTEMS_INFO for details. */
+#define MAX_CAM_SYSTEMS_INFO_LEN 1024
+
+/******************************************************************************/
+/* Data types */
+/******************************************************************************/
+
+/**
+GUID for #FRAME_INFO structure.
+*/
+typedef struct _TAG_PVCAM_FRAME_INFO_GUID
+{
+ uns32 f1;
+ uns16 f2;
+ uns16 f3;
+ uns8 f4[8];
+}
+PVCAM_FRAME_INFO_GUID;
+
+/**
+Structure used to uniquely identify frames in the camera.
+
+Please note that this information is generated by the low-level device driver.
+While the information is accurate for slower acquisitions and most legacy CCD cameras,
+these timestamps are still obtained from the operating systems. For that reason, the
+timestamps may not always represent the time of actual, in-camera acquisition.
+This is especially true for fast sCMOS cameras that implement an internal frame buffer.
+Such cameras often report both the BOF and EOF timestamps as identical numbers with the
+readout time reported as 0.
+For accurate hardware timestamps please see @ref EmbeddedFrameMetadata feature.
+*/
+typedef struct _TAG_FRAME_INFO
+{
+ PVCAM_FRAME_INFO_GUID FrameInfoGUID;
+ int16 hCam; /**< Handle of the camera that sent this structure. */
+ int32 FrameNr; /**< Frame number, 1-based. */
+ long64 TimeStamp; /**< Frame EOF (end-of-frame) timestamp. */
+ int32 ReadoutTime; /**< Frame readout time. */
+ long64 TimeStampBOF; /**< Frame BOF (beginning-of-frame timestamp. */
+}
+FRAME_INFO;
+
+/**
+The modes under which the camera can be opened.
+Used with the function #pl_cam_open.
+Treated as @c #int16 type.
+*/
+typedef enum PL_OPEN_MODES
+{
+ /** Default camera open mode. The camera is opened exclusively
+ for the calling process. */
+ OPEN_EXCLUSIVE
+}
+PL_OPEN_MODES;
+
+/**
+Used with the #PARAM_COOLING_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_COOL_MODES
+{
+ /**
+ This is a thermo-electrically (TE)-cooled camera with air or liquid assisted
+ cooling.
+ */
+ NORMAL_COOL,
+ /**
+ The camera is cryogenically cooled.
+ */
+ CRYO_COOL,
+ /**
+ The camera has no cooling or the cooling is optional and should be provided
+ by the end user.
+ */
+ NO_COOL
+}
+PL_COOL_MODES;
+
+/**
+Used with the #PARAM_MPP_CAPABLE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_MPP_MODES
+{
+ MPP_UNKNOWN,
+ MPP_ALWAYS_OFF,
+ MPP_ALWAYS_ON,
+ MPP_SELECTABLE
+}
+PL_MPP_MODES;
+
+/**
+Used with the #PARAM_SHTR_STATUS parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SHTR_MODES
+{
+ SHTR_FAULT,
+ SHTR_OPENING,
+ SHTR_OPEN,
+ SHTR_CLOSING,
+ SHTR_CLOSED,
+ SHTR_UNKNOWN
+}
+PL_SHTR_MODES;
+
+/**
+Used with the #PARAM_PMODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_PMODES
+{
+ PMODE_NORMAL,
+ PMODE_FT,
+ PMODE_MPP,
+ PMODE_FT_MPP,
+ PMODE_ALT_NORMAL,
+ PMODE_ALT_FT,
+ PMODE_ALT_MPP,
+ PMODE_ALT_FT_MPP
+}
+PL_PMODES;
+
+/**
+Used with the #PARAM_COLOR_MODE parameter ID.
+Treated as @c #int32 type (but should not exceed a value of 255 due to
+#md_frame_header.colorMask)
+*/
+typedef enum PL_COLOR_MODES
+{
+ COLOR_NONE = 0, /**< Monochrome camera, no color mask. */
+ COLOR_RESERVED = 1, /**< Reserved, do not use. */
+ COLOR_RGGB = 2, /**< Color camera with RGGB color mask. */
+ COLOR_GRBG, /**< Color camera with GRBG color mask. */
+ COLOR_GBRG, /**< Color camera with GBRG color mask. */
+ COLOR_BGGR /**< Color camera with BGGR color mask. */
+}
+PL_COLOR_MODES;
+
+/**
+Image format specifies the buffer format in which the pixels are
+transferred. The format should be used together with #PARAM_BIT_DEPTH
+because it specifies only the format of the pixel container, not the
+actual bit depth of the pixel it contains.
+Used with the #PARAM_IMAGE_FORMAT parameter ID.
+Treated as @c #int32 type (but should not exceed a value of 255 due to
+#md_frame_header.imageFormat field).
+*/
+typedef enum PL_IMAGE_FORMATS
+{
+ PL_IMAGE_FORMAT_MONO16 = 0, /**< 16bit mono, 2 bytes per pixel. */
+ PL_IMAGE_FORMAT_BAYER16, /**< 16bit bayer masked image, 2 bytes per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_MONO8, /**< 8bit mono, 1 byte per pixel. */
+ PL_IMAGE_FORMAT_BAYER8, /**< 8bit bayer masked image, 1 byte per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_MONO24, /**< 24bit mono, 3 bytes per pixel. */
+ PL_IMAGE_FORMAT_BAYER24, /**< 24bit bayer masked image, 3 bytes per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_RGB24, /**< 8bit RGB, 1 byte per sample, 3 bytes per pixel. */
+ PL_IMAGE_FORMAT_RGB48, /**< 16bit RGB, 2 bytes per sample, 6 bytes per pixel. */
+ PL_IMAGE_FORMAT_RGB72, /**< 24bit RGB, 3 bytes per sample, 9 bytes per pixel. */
+ PL_IMAGE_FORMAT_MONO32, /**< 32bit mono, 4 bytes per pixel. */
+ PL_IMAGE_FORMAT_BAYER32, /**< 32bit bayer masked image, 4 bytes per pixel. See also #PL_COLOR_MODES. */
+ PL_IMAGE_FORMAT_RGB96 /**< 32bit RGB, 4 bytes per sample, 12 bytes per pixel. */
+}
+PL_IMAGE_FORMATS;
+
+/**
+Image compression used to reduce the size of the pixel data. Once the
+image is decompressed, the pixels can be accessed according to #PL_IMAGE_FORMATS type.
+Used with the #PARAM_IMAGE_COMPRESSION parameter ID.
+Treated as @c #int32 type (but should not exceed a value of 255 due to
+#md_frame_header.imageCompression field).
+*/
+typedef enum PL_IMAGE_COMPRESSIONS
+{
+ PL_IMAGE_COMPRESSION_NONE = 0, /**< No compression, the pixels can be accessed according to #PL_IMAGE_FORMATS */
+ /* Bit-packing compression modes */
+ PL_IMAGE_COMPRESSION_RESERVED8 = 8,
+ PL_IMAGE_COMPRESSION_BITPACK9, /**< 9-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK10, /**< 10-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK11, /**< 11-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK12, /**< 12-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK13, /**< 13-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK14, /**< 14-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_BITPACK15, /**< 15-bit packing in 16bit format */
+ PL_IMAGE_COMPRESSION_RESERVED16 = 16,
+ PL_IMAGE_COMPRESSION_BITPACK17, /**< 17-bit packing in 24bit format */
+ PL_IMAGE_COMPRESSION_BITPACK18, /**< 18-bit packing in 24bit format */
+ PL_IMAGE_COMPRESSION_RESERVED24 = 24,
+ PL_IMAGE_COMPRESSION_RESERVED32 = 32,
+ /* Other compression modes below */
+}
+PL_IMAGE_COMPRESSIONS;
+
+/**
+Frame rotation modes. Used with the #PARAM_FRAME_ROTATE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_ROTATE_MODES
+{
+ PL_FRAME_ROTATE_MODE_NONE = 0, /**< No rotation */
+ PL_FRAME_ROTATE_MODE_90CW, /**< 90 degrees clockwise */
+ PL_FRAME_ROTATE_MODE_180CW, /**< 180 degrees clockwise */
+ PL_FRAME_ROTATE_MODE_270CW /**< 270 degrees clockwise */
+}
+PL_FRAME_ROTATE_MODES;
+
+/**
+Frame flip modes. Used with the #PARAM_FRAME_FLIP parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_FLIP_MODES
+{
+ PL_FRAME_FLIP_MODE_NONE = 0, /**< No flip */
+ PL_FRAME_FLIP_MODE_X, /**< Horizontal flip, mirroring along x-axis */
+ PL_FRAME_FLIP_MODE_Y, /**< Vertical flip, mirroring along y-axis */
+ PL_FRAME_FLIP_MODE_XY /**< Horizontal and vertical flip */
+}
+PL_FRAME_FLIP_MODES;
+
+/**
+Frame summing formats. Used with the #PARAM_HOST_FRAME_SUMMING_FORMAT parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_SUMMING_FORMATS
+{
+ PL_FRAME_SUMMING_FORMAT_16_BIT = 0,
+ PL_FRAME_SUMMING_FORMAT_24_BIT,
+ PL_FRAME_SUMMING_FORMAT_32_BIT
+}
+PL_FRAME_SUMMING_FORMATS;
+
+/**
+Used with the function #pl_get_param.
+Treated as @c #int16 type.
+*/
+typedef enum PL_PARAM_ATTRIBUTES
+{
+ /**
+ Current value.
+ For the enumerated type the value returned here is the value
+ assigned to current enum item, not the item index.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_CURRENT,
+ /**
+ Number of possible values for enumerated and array data types.
+ If the data type returned by #ATTR_TYPE is #TYPE_CHAR_PTR (and not an
+ enumerated type), then the #ATTR_COUNT is the number of characters in the
+ string including a space for NULL terminator. If 0 or 1 is returned,
+ #ATTR_COUNT is a scalar (single element) of the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64, #TYPE_FLT64 and #TYPE_BOOLEAN.
+ The data type for this attribute is #TYPE_UNS32.
+ */
+ ATTR_COUNT,
+ /**
+ Data type of parameter.
+ Data types used by #pl_get_param with attribute type (#ATTR_TYPE) are:
+
+ | Value | Type |
+ |----------------------------|--------------------|
+ | TYPE_BOOLEAN | rs_bool |
+ | TYPE_INT8 | int8 |
+ | TYPE_UNS8 | uns8 |
+ | TYPE_INT16 | int16 |
+ | TYPE_UNS16 | uns16 |
+ | TYPE_INT32 | int32 |
+ | TYPE_UNS32 | uns32 |
+ | TYPE_INT64 | long64 |
+ | TYPE_UNS64 | ulong64 |
+ | TYPE_FLT32 | flt32 |
+ | TYPE_FLT64 | flt64 |
+ | TYPE_ENUM | int32 |
+ | TYPE_CHAR_PTR | char* |
+ | TYPE_VOID_PTR | void* |
+ | TYPE_VOID_PTR_PTR | void** |
+ | TYPE_SMART_STREAM_TYPE | smart_stream_type |
+ | TYPE_SMART_STREAM_TYPE_PTR | smart_stream_type* |
+
+ The data type for this attribute is #TYPE_UNS16.
+ */
+ ATTR_TYPE,
+ /**
+ Minimum value. The value is only valid for the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64, #TYPE_FLT64 and #TYPE_BOOLEAN.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_MIN,
+ /**
+ Maximum value. The value is only valid for the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64, #TYPE_FLT64 and #TYPE_BOOLEAN.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_MAX,
+ /**
+ Default value. This value should be equal to the current value loaded
+ by camera on power up. For the enumerated type, the value returned here
+ is the value assigned to the current enum item, not the item index.
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_DEFAULT,
+ /**
+ Step size for values (zero if non-linear or without increment).
+ The value is only valid for the following data types:
+ #TYPE_INT8, #TYPE_UNS8, #TYPE_INT16, #TYPE_UNS16, #TYPE_INT32, #TYPE_UNS32,
+ #TYPE_INT64, #TYPE_UNS64 and #TYPE_FLT64. The value for this attribute
+ is never negative. If the value is non-zero, valid values can be easily
+ calculated. The first valid value is the value reported for the attribute #ATTR_MIN,
+ the second value is the minimum value plus increment (#ATTR_INCREMENT),
+ and so on up to the maximum value (#ATTR_MAX).
+ The data type for this attribute is defined by #ATTR_TYPE.
+ */
+ ATTR_INCREMENT,
+ /**
+ Reports if the parameter with ID param_id can be written to and/or read from or
+ in case it cannot be written to and/or read, it tells whether a feature exists.
+ If the param_id can be either written to or read from, the next step is to determine
+ its data type.
+ The access types are enumerated:
+ #ACC_EXIST_CHECK_ONLY #ACC_READ_ONLY
+ #ACC_WRITE_ONLY #ACC_READ_WRITE
+ The data type for this attribute is #TYPE_UNS16.
+ */
+ ATTR_ACCESS,
+ /**
+ Feature available with attached hardware and software.
+ The data type for this attribute is #TYPE_BOOLEAN.
+ */
+ ATTR_AVAIL,
+ /**
+ Reports if the parameter can be accessed during active acquisition.
+ The data type for this attribute is #TYPE_BOOLEAN.
+ */
+ ATTR_LIVE
+}
+PL_PARAM_ATTRIBUTES;
+
+/**
+Used with the function #pl_get_param and #ATTR_ACCESS.
+Treated as @c #uns16 type.
+*/
+typedef enum PL_PARAM_ACCESS
+{
+ /** Parameter is read only, #pl_set_param for such parameter will fail. */
+ ACC_READ_ONLY = 1,
+ /** Parameter can be read and written. */
+ ACC_READ_WRITE,
+ /** Only parameter availability can be checked. */
+ ACC_EXIST_CHECK_ONLY,
+ /** Parameter can only be written. */
+ ACC_WRITE_ONLY
+}
+PL_PARAM_ACCESS;
+
+/**
+Used with the #PARAM_IO_TYPE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_IO_TYPE
+{
+ IO_TYPE_TTL, /**< The bit pattern written to this address.*/
+ IO_TYPE_DAC /**< The value of the desired analog output written to the DAC on this address.*/
+}
+PL_IO_TYPE;
+
+/**
+Used with the #PARAM_IO_DIRECTION parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_IO_DIRECTION
+{
+ IO_DIR_INPUT, /**< The port configured as input. */
+ IO_DIR_OUTPUT, /**< The port configured as output. */
+ IO_DIR_INPUT_OUTPUT /**< The port configured as bi-directional. */
+}
+PL_IO_DIRECTION;
+
+/**
+Used with the #PARAM_READOUT_PORT parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_READOUT_PORTS
+{
+ READOUT_PORT_0 = 0,
+ READOUT_PORT_1,
+ READOUT_PORT_2,
+ READOUT_PORT_3
+}
+PL_READOUT_PORTS;
+
+/**
+Used with the #PARAM_CLEAR_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_CLEAR_MODES
+{
+ /**
+ Don't ever clear the sensor. Useful for performing a readout after an
+ exposure has been aborted.
+ */
+ CLEAR_NEVER,
+ /**
+ Clear the sensor automatically. Modern cameras control the sensor clearing
+ as needed. Some cameras will report only this clearing mode. For backward
+ compatibility with existing applications, the 'auto' clearing mode is reported
+ under the same value as the 'clear never' mode.
+ */
+ CLEAR_AUTO = CLEAR_NEVER,
+ /**
+ Before each exposure, clears the sensor the number of times specified by the
+ @c clear_cycles variable. This mode can be used in a sequence. It is most
+ useful when there is a considerable amount of time between exposures.
+ */
+ CLEAR_PRE_EXPOSURE,
+ /**
+ Before each sequence, clears the sensor the number of times specified by the
+ @c clear_cycles variable. If no sequence is set up, this mode behaves as if
+ the sequence had one exposure. The result is the same as when using
+ #CLEAR_PRE_EXPOSURE.
+ */
+ CLEAR_PRE_SEQUENCE,
+ /**
+ Clears continuously after the sequence ends. The camera continues clearing
+ until a new exposure is set up or started, the abort command is sent, the
+ speed entry number is changed, or the camera is reset.
+ */
+ CLEAR_POST_SEQUENCE,
+ /**
+ Clears @c clear_cycles times before each sequence and clears continuously
+ after the sequence ends. The camera continues clearing until a new exposure
+ is set up or started, the abort command is sent, the speed entry number is
+ changed, or the camera is reset.
+ */
+ CLEAR_PRE_POST_SEQUENCE,
+ /**
+ Clears @c clear_cycles times before each exposure and clears continuously
+ after the sequence ends. The camera continues clearing until a new exposure
+ is set up or started, the abort command is sent, the speed entry number is
+ changed, or the camera is reset.
+ */
+ CLEAR_PRE_EXPOSURE_POST_SEQ,
+
+ /* Should be the last and never used value. */
+ MAX_CLEAR_MODE
+}
+PL_CLEAR_MODES;
+
+/**
+Used with the #PARAM_SHTR_OPEN_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SHTR_OPEN_MODES
+{
+ /**
+ The shutter closes before the exposure and stays closed during the exposure.
+ */
+ OPEN_NEVER,
+ /**
+ Opens the shutter with each exposure. Normal mode.
+ */
+ OPEN_PRE_EXPOSURE,
+ /**
+ Opens the shutter at the start of each sequence. Useful for frame transfer
+ and external strobe devices.
+ */
+ OPEN_PRE_SEQUENCE,
+ /**
+ If using a triggered mode, this function causes the shutter to open before
+ the external trigger is armed. If using a non-triggered mode, this function
+ operates identically to #OPEN_PRE_EXPOSURE.
+ */
+ OPEN_PRE_TRIGGER,
+ /**
+ Sends no signals to open or close the shutter. Useful for frame transfer
+ when you want to open the shutter and leave it open (see #pl_exp_abort).
+ */
+ OPEN_NO_CHANGE
+}
+PL_SHTR_OPEN_MODES;
+
+/**
+Used with the #PARAM_EXPOSURE_MODE parameter ID.
+Treated as @c #int32 type.
+
+Used with the functions #pl_exp_setup_cont and #pl_exp_setup_seq.
+Treated as @c #int16 type.
+*/
+typedef enum PL_EXPOSURE_MODES
+{
+ /**
+ Causes the exposure to use the internal timer to control
+ the exposure duration.
+ */
+ TIMED_MODE,
+ /**
+ Accepts the external trigger as exposure start signal.
+ The exposure duration is still controlled by the internal timer.
+ */
+ STROBED_MODE,
+ /**
+ Accepts the external trigger as exposure start and duration control
+ signal.
+ */
+ BULB_MODE,
+ /**
+ Accepts the external trigger as acquisition sequence start signal.
+ Each exposure in the sequence then uses the internal timer to control the
+ exposure duration. The software will look for one trigger only and then
+ proceed with the sequence.
+ */
+ TRIGGER_FIRST_MODE,
+ /** @deprecated Not supported by any modern camera. */
+ FLASH_MODE,
+ /**
+ The duration of the exposure can be controlled by software dynamically
+ without requiring the acquisition to be reconfigured with #pl_exp_setup_seq.
+ Use #pl_set_param with #PARAM_EXP_TIME to set new exposure time before calling
+ #pl_exp_start_seq.
+ */
+ VARIABLE_TIMED_MODE,
+ /** @deprecated Not supported by any modern camera. */
+ INT_STROBE_MODE,
+ MAX_EXPOSE_MODE = 7,
+
+ /*
+ Extended EXPOSURE modes used with #PARAM_EXPOSURE_MODE when
+ camera dynamically reports its capabilities.
+ The "7" in each of these calculations comes from the previous
+ definition of #MAX_EXPOSE_MODE when this file was defined.
+ */
+
+ /**
+ Internal camera trigger, camera controls the start and the duration
+ of the exposure. This mode is similar to the legacy #TIMED_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_INTERNAL = (7 + 0) << 8,
+ /**
+ Trigger controls the start of first exposure. Subsequent exposures are
+ controlled by the camera internal timer. This mode is similar to the legacy
+ #TRIGGER_FIRST_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_TRIG_FIRST = (7 + 1) << 8,
+ /**
+ Trigger controls the start of each exposure. This mode is similar to
+ the legacy #STROBED_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_EDGE_RISING = (7 + 2) << 8,
+ /**
+ Trigger controls the start and duration of each exposure. This mode is similar to
+ the legacy #BULB_MODE.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_LEVEL = (7 + 3) << 8,
+ /**
+ Exposure is triggered with software trigger using the #pl_exp_trigger call.
+ Similarly to #EXT_TRIG_TRIG_FIRST, the trigger starts the first exposure only.
+ Subsequent exposures are controlled by the camera internal timer.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_SOFTWARE_FIRST = (7 + 4) << 8,
+ /**
+ Exposure is triggered with software trigger using the #pl_exp_trigger call.
+ Similarly to #EXT_TRIG_EDGE_RISING, each call to #pl_exp_trigger triggers one exposure.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_SOFTWARE_EDGE = (7 + 5) << 8,
+ /**
+ Trigger controls the start and duration of each exposure. This mode allows
+ overlapping exposure and readout.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_LEVEL_OVERLAP = (7 + 6) << 8,
+ /**
+ A special case of a level trigger where the first trigger pulse starts
+ the exposure and the next trigger pulse starts the readout of that exposure.
+ For N frames specified in the software, there must be N+1 trigger pulses in the
+ series with individual exposure times being equal to the time interval between
+ the trigger pulses.
+ This value allows the exposure mode to be "ORed" with #PL_EXPOSE_OUT_MODES
+ for #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+ */
+ EXT_TRIG_LEVEL_PULSED = (7 + 7) << 8
+}
+PL_EXPOSURE_MODES;
+
+/**
+Used with #pl_exp_trigger function.
+Treated as @c #uns32 type.
+*/
+typedef enum PL_SW_TRIG_STATUSES
+{
+ /**
+ The camera has accepted the trigger signal and started exposing.
+ */
+ PL_SW_TRIG_STATUS_TRIGGERED = 0,
+ /**
+ The camera was unable to accept the trigger due to an ongoing exposure.
+ */
+ PL_SW_TRIG_STATUS_IGNORED
+}
+PL_SW_TRIG_STATUSES;
+
+/**
+Used with the #PARAM_EXPOSE_OUT_MODE parameter ID.
+Build the values for the Expose Out modes that are "ORed" with the trigger
+modes when setting up the script.
+Treated as @c #int32 type.
+*/
+typedef enum PL_EXPOSE_OUT_MODES
+{
+ /**
+ Expose Out high when first row is exposed (from first row begin to first row end)
+ */
+ EXPOSE_OUT_FIRST_ROW = 0,
+ /**
+ Expose Out high when all rows are exposed simultaneously (from last row begin to first row end).
+ The duration of the signal equals the exposure value entered which means the actual exposure
+ time is longer - use this mode with triggered light source only.
+ */
+ EXPOSE_OUT_ALL_ROWS,
+ /**
+ Expose Out high when any row is exposed (from first row begin to last row end)
+ */
+ EXPOSE_OUT_ANY_ROW,
+ /**
+ Similar to ALL_ROWS. Actual exposure duration matches the value entered, but the Expose Out is
+ only high while all rows are exposing simultaneously.
+ If the exposure time entered is shorter than the readout time, the Expose Out signal will
+ remain at low level.
+ */
+ EXPOSE_OUT_ROLLING_SHUTTER,
+ /**
+ Expose Out signal pulses for every line readout as configured via the #PARAM_SCAN_MODE
+ and related parameters. If #PARAM_SCAN_MODE is not available or enabled, the Expose Out
+ behaves as #EXPOSE_OUT_ANY_ROW.
+ */
+ EXPOSE_OUT_LINE_TRIGGER,
+ /**
+ Similar to EXPOSE_OUT_ROLLING_SHUTTER but using sensor's global shutter mode.
+ */
+ EXPOSE_OUT_GLOBAL_SHUTTER,
+
+ /* Should be the last and never used value. */
+ MAX_EXPOSE_OUT_MODE
+}
+PL_EXPOSE_OUT_MODES;
+
+/**
+Used with the #PARAM_FAN_SPEED_SETPOINT parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FAN_SPEEDS
+{
+ FAN_SPEED_HIGH, /**< Full fan speed, the default value for most cameras. */
+ FAN_SPEED_MEDIUM, /**< Medium fan speed. */
+ FAN_SPEED_LOW, /**< Low fan speed. */
+ FAN_SPEED_OFF /**< Fan is turned off. */
+}
+PL_FAN_SPEEDS;
+
+/**
+Used with the #PARAM_TRIGTAB_SIGNAL parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_TRIGTAB_SIGNALS
+{
+ PL_TRIGTAB_SIGNAL_EXPOSE_OUT /**< Control the expose out hardware signal multiplexing */
+}
+PL_TRIGTAB_SIGNALS;
+
+/**
+Used with the #PARAM_FRAME_DELIVERY_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_FRAME_DELIVERY_MODES
+{
+ /**
+ Camera will sample and deliver the frames as fast as possible while considering
+ the interface bandwidth. This mode may result in uneven frame intervals, but
+ possibly higher frame rates.
+ */
+ PL_FRAME_DELIVERY_MODE_MAX_FPS = 0,
+ /**
+ Camera will sample and deliver the frames in constant intervals. In this mode the
+ camera samples the sensor in constant time intervals but if the interface is busy and
+ all frame buffers are full, the frame will be skipped and the sensor will be sampled
+ in the next interval (unlike the MAX_FPS mode where the sensor would be sampled immediately
+ once the buffer/interface is unclogged). This results in even frame intervals, but
+ there might be gaps in between the frame deliveries and thus reduced frame rate.
+ */
+ PL_FRAME_DELIVERY_MODE_CONSTANT_INTERVALS
+}
+PL_FRAME_DELIVERY_MODES;
+
+/**
+Used with the #PARAM_CAM_INTERFACE_TYPE parameter ID.
+
+32-bit enum where:
+- Upper 24 bits are interface classes, flags, 1bit = one class, 24 possible classes.
+- Lower 8 bits are interface revisions with 254 possible revisions per each interface class.
+
+Usage:
+@code{.cpp}
+ if (attrCurrent & PL_CAM_IFC_TYPE_USB)
+ // The camera is running on USB, any USB
+ if (attrCurrent & PL_CAM_IFC_TYPE_USB && type >= PL_CAM_IFC_TYPE_USB_3_0)
+ // The camera is running on USB, the camera is running on at least USB 3.0
+ if (attrCurrent == PL_CAM_IFC_TYPE_USB_3_1)
+ // The camera is running exactly on USB 3.1
+@endcode
+
+Treated as @c #int32 type.
+*/
+typedef enum PL_CAM_INTERFACE_TYPES
+{
+ PL_CAM_IFC_TYPE_UNKNOWN = 0, /**< Unrecognized type. */
+
+ PL_CAM_IFC_TYPE_1394 = 0x100, /**< A generic 1394 in case we cannot identify the sub type. */
+ PL_CAM_IFC_TYPE_1394_A, /**< FireWire 400. */
+ PL_CAM_IFC_TYPE_1394_B, /**< FireWire 800. */
+
+ PL_CAM_IFC_TYPE_USB = 0x200, /**< A generic USB in case we cannot identify the sub type. */
+ PL_CAM_IFC_TYPE_USB_1_1, /**< FullSpeed (12 Mbit/s). */
+ PL_CAM_IFC_TYPE_USB_2_0, /**< HighSpeed (480 Mbit/s). */
+ PL_CAM_IFC_TYPE_USB_3_0, /**< SuperSpeed (5 Gbit/s). */
+ PL_CAM_IFC_TYPE_USB_3_1, /**< SuperSpeed+ (10 Gbit/s). */
+
+ PL_CAM_IFC_TYPE_PCI = 0x400, /**< A generic PCI interface. */
+ PL_CAM_IFC_TYPE_PCI_LVDS, /**< LVDS PCI interface. */
+
+ PL_CAM_IFC_TYPE_PCIE = 0x800, /**< A generic PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_LVDS, /**< LVDS PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_X1, /**< Single channel PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_X4, /**< 4 channel PCIe interface. */
+ PL_CAM_IFC_TYPE_PCIE_X8, /**< 8 channel PCIe interface. */
+
+ PL_CAM_IFC_TYPE_VIRTUAL = 0x1000, /**< Base for all Virtual camera interfaces. */
+
+ PL_CAM_IFC_TYPE_ETHERNET = 0x2000 /**< Base for all Ethernet-based cameras. */
+}
+PL_CAM_INTERFACE_TYPES;
+
+/**
+Used with the #PARAM_CAM_INTERFACE_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_CAM_INTERFACE_MODES
+{
+ PL_CAM_IFC_MODE_UNSUPPORTED = 0, /**< Interface is not supported. */
+ PL_CAM_IFC_MODE_CONTROL_ONLY, /**< Control commands only. */
+ PL_CAM_IFC_MODE_IMAGING /**< Full imaging. */
+}
+PL_CAM_INTERFACE_MODES;
+
+/**
+Used with the #PARAM_CENTROIDS_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_CENTROIDS_MODES
+{
+ PL_CENTROIDS_MODE_LOCATE = 0, /**< Locate mode (PrimeLocate) */
+ PL_CENTROIDS_MODE_TRACK, /**< Particle Tracking mode */
+ PL_CENTROIDS_MODE_BLOB /**< Blob Detection mode */
+}
+PL_CENTROIDS_MODES;
+
+
+/**
+Used with the #PARAM_SCAN_MODE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SCAN_MODES
+{
+ /** Normal camera imaging and the default mode of operation, the FPGA
+ reads each row in succession without inserting additional delays between rows */
+ PL_SCAN_MODE_AUTO = 0,
+ /** This mode allows the user to configure the #PARAM_SCAN_LINE_DELAY.
+ The #PARAM_SCAN_WIDTH will become read-only and its value will be
+ auto-calculated and reported by the camera */
+ PL_SCAN_MODE_PROGRAMMABLE_LINE_DELAY,
+ /** This mode allows the user to configure the #PARAM_SCAN_WIDTH.
+ The #PARAM_SCAN_LINE_DELAY will become read-only and its value will be
+ auto-calculated and reported by the camera */
+ PL_SCAN_MODE_PROGRAMMABLE_SCAN_WIDTH
+}
+PL_SCAN_MODES;
+
+
+/**
+Used with the #PARAM_SCAN_DIRECTION parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_SCAN_DIRECTIONS
+{
+ /** Default mode. The camera starts reading from top to bottom */
+ PL_SCAN_DIRECTION_DOWN = 0,
+ /** Camera starts reading from bottom to top */
+ PL_SCAN_DIRECTION_UP,
+ /** Camera initially starts reading from top to bottom
+ and then switches automatically to read out from bottom to top.
+ The direction alternates between frames down-up-down-up and so on.
+ */
+ PL_SCAN_DIRECTION_DOWN_UP
+}
+PL_SCAN_DIRECTIONS;
+
+/**
+Used with the #PARAM_PP_FEAT_ID parameter ID.
+Treated as @c #uns16 type.
+*/
+typedef enum PP_FEATURE_IDS
+{
+ PP_FEATURE_RING_FUNCTION,
+ PP_FEATURE_BIAS,
+ PP_FEATURE_BERT, /**< Background Event Reduction Technology */
+ PP_FEATURE_QUANT_VIEW,
+ PP_FEATURE_BLACK_LOCK,
+ PP_FEATURE_TOP_LOCK,
+ PP_FEATURE_VARI_BIT,
+ PP_FEATURE_RESERVED, /**< Should not be used at any time moving forward. */
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH,
+ PP_FEATURE_DESPECKLE_DARK_LOW,
+ PP_FEATURE_DEFECTIVE_PIXEL_CORRECTION,
+ PP_FEATURE_DYNAMIC_DARK_FRAME_CORRECTION,
+ PP_FEATURE_HIGH_DYNAMIC_RANGE,
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW,
+ PP_FEATURE_DENOISING, /**< PrimeEnhance feature*/
+ PP_FEATURE_DESPECKLE_DARK_HIGH,
+ PP_FEATURE_ENHANCED_DYNAMIC_RANGE,
+ PP_FEATURE_FRAME_SUMMING,
+ PP_FEATURE_LARGE_CLUSTER_CORRECTION,
+ PP_FEATURE_FRAME_AVERAGING,
+ PP_FEATURE_MAX
+}
+PP_FEATURE_IDS;
+
+/**
+Used with the #PARAM_PP_PARAM_ID parameter ID.
+*/
+#define PP_MAX_PARAMETERS_PER_FEATURE 10
+
+/**
+Used with the #PARAM_PP_PARAM_ID parameter ID.
+Treated as @c #uns16 type.
+*/
+typedef enum PP_PARAMETER_IDS
+{
+ PP_PARAMETER_RF_FUNCTION = (PP_FEATURE_RING_FUNCTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BIAS_ENABLED = (PP_FEATURE_BIAS * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BIAS_LEVEL,
+ PP_FEATURE_BERT_ENABLED = (PP_FEATURE_BERT * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BERT_THRESHOLD,
+ PP_FEATURE_QUANT_VIEW_ENABLED = (PP_FEATURE_QUANT_VIEW * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_QUANT_VIEW_E,
+ PP_FEATURE_BLACK_LOCK_ENABLED = (PP_FEATURE_BLACK_LOCK * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_BLACK_LOCK_BLACK_CLIP,
+ PP_FEATURE_TOP_LOCK_ENABLED = (PP_FEATURE_TOP_LOCK * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_TOP_LOCK_WHITE_CLIP,
+ PP_FEATURE_VARI_BIT_ENABLED = (PP_FEATURE_VARI_BIT * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_VARI_BIT_BIT_DEPTH,
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH_ENABLED = (PP_FEATURE_DESPECKLE_BRIGHT_HIGH * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH_THRESHOLD,
+ PP_FEATURE_DESPECKLE_BRIGHT_HIGH_MIN_ADU_AFFECTED,
+ PP_FEATURE_DESPECKLE_DARK_LOW_ENABLED = (PP_FEATURE_DESPECKLE_DARK_LOW * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_DARK_LOW_THRESHOLD,
+ PP_FEATURE_DESPECKLE_DARK_LOW_MAX_ADU_AFFECTED,
+ PP_FEATURE_DEFECTIVE_PIXEL_CORRECTION_ENABLED = (PP_FEATURE_DEFECTIVE_PIXEL_CORRECTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DYNAMIC_DARK_FRAME_CORRECTION_ENABLED = (PP_FEATURE_DYNAMIC_DARK_FRAME_CORRECTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_HIGH_DYNAMIC_RANGE_ENABLED = (PP_FEATURE_HIGH_DYNAMIC_RANGE * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW_ENABLED = (PP_FEATURE_DESPECKLE_BRIGHT_LOW * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW_THRESHOLD,
+ PP_FEATURE_DESPECKLE_BRIGHT_LOW_MAX_ADU_AFFECTED,
+ PP_FEATURE_DENOISING_ENABLED = (PP_FEATURE_DENOISING * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DENOISING_NO_OF_ITERATIONS,
+ PP_FEATURE_DENOISING_GAIN,
+ PP_FEATURE_DENOISING_OFFSET,
+ PP_FEATURE_DENOISING_LAMBDA,
+ PP_FEATURE_DESPECKLE_DARK_HIGH_ENABLED = (PP_FEATURE_DESPECKLE_DARK_HIGH * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_DESPECKLE_DARK_HIGH_THRESHOLD,
+ PP_FEATURE_DESPECKLE_DARK_HIGH_MIN_ADU_AFFECTED,
+ PP_FEATURE_ENHANCED_DYNAMIC_RANGE_ENABLED = (PP_FEATURE_ENHANCED_DYNAMIC_RANGE * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_SUMMING_ENABLED = (PP_FEATURE_FRAME_SUMMING * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_SUMMING_COUNT,
+ PP_FEATURE_FRAME_SUMMING_32_BIT_MODE,
+ PP_FEATURE_LARGE_CLUSTER_CORRECTION_ENABLED = (PP_FEATURE_LARGE_CLUSTER_CORRECTION * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_AVERAGING_ENABLED = (PP_FEATURE_FRAME_AVERAGING * PP_MAX_PARAMETERS_PER_FEATURE),
+ PP_FEATURE_FRAME_AVERAGING_COUNT_FACTOR,
+ PP_PARAMETER_ID_MAX
+}
+PP_PARAMETER_IDS;
+
+/**
+Used with the #PARAM_SMART_STREAM_EXP_PARAMS and #PARAM_SMART_STREAM_DLY_PARAMS
+parameter IDs and #pl_create_smart_stream_struct and
+#pl_release_smart_stream_struct functions.
+*/
+typedef struct smart_stream_type
+{
+ uns16 entries; /**< The number of entries in the array. */
+ uns32* params; /**< The actual S.M.A.R.T. stream parameters. */
+}
+smart_stream_type;
+
+/**
+Used with the #PARAM_SMART_STREAM_MODE parameter ID.
+Treated as @c #uns16 type.
+*/
+typedef enum PL_SMT_MODES
+{
+ SMTMODE_ARBITRARY_ALL = 0, /**< Smart streaming values can be arbitrary. */
+ SMTMODE_MAX
+}
+PL_SMT_MODES;
+
+/**
+Used with the functions #pl_exp_check_status, #pl_exp_check_cont_status and
+#pl_exp_check_cont_status_ex.
+Treated as @c #int16 type.
+*/
+typedef enum PL_IMAGE_STATUSES
+{
+ /** The system is @b idle, no data is expected. If any data arrives, it will be discarded. */
+ READOUT_NOT_ACTIVE,
+ /**
+ The data collection routines are @b active. They are waiting for data to arrive,
+ but none has arrived yet.
+ */
+ EXPOSURE_IN_PROGRESS,
+ /** The data collection routines are @b active. The data has started to arrive. */
+ READOUT_IN_PROGRESS,
+ /** Frame has been read out and is available in acquisition buffer. */
+ READOUT_COMPLETE,
+ /** New camera status indicating at least one frame is available. */
+ FRAME_AVAILABLE = READOUT_COMPLETE,
+ /** Something went wrong. The function returns a #PV_FAIL and #pl_error_code is set. */
+ READOUT_FAILED,
+
+ ACQUISITION_IN_PROGRESS, /**< @deprecated Not used by PVCAM. */
+
+ /* Should be the last and never used value. */
+ MAX_CAMERA_STATUS
+}
+PL_IMAGE_STATUSES;
+
+/**
+Used with the #pl_exp_abort function. The CCS (Camera Control Subsystem) modes
+are applicable with CCD cameras only. With latest sCMOS cameras use the
+#CCS_HALT mode.
+
+Treated as @c #int16 type.
+*/
+typedef enum PL_CCS_ABORT_MODES
+{
+ /**
+ Do not alter the current state of the CCS. Use only if instructed
+ by the camera vendor.
+ */
+ CCS_NO_CHANGE = 0,
+ /**
+ Halt all CCS activity and put the CCS into the idle state.
+ Recommended with sCMOS cameras and with most acquisitions with CCD
+ sensors when using pre-sequence clearing.
+ */
+ CCS_HALT,
+ /**
+ Close the shutter, then halt all CCS activity and put the CCS
+ into the idle state.
+ */
+ CCS_HALT_CLOSE_SHTR,
+ /**
+ Put the CCS into the continuous clearing state. Recommended for
+ CCD sensors where continuous clearing is required.
+ */
+ CCS_CLEAR,
+ /**
+ Close the shutter, then put the CCS into the continuous clearing state.
+ */
+ CCS_CLEAR_CLOSE_SHTR,
+ /**
+ Open the shutter, then halt all CCS activity and put the CCS into
+ the idle state.
+ */
+ CCS_OPEN_SHTR,
+ /**
+ Open the shutter, then put the CCS into the continuous clearing state.
+ */
+ CCS_CLEAR_OPEN_SHTR
+}
+PL_CCS_ABORT_MODES;
+
+/**
+Used with the #PARAM_BOF_EOF_ENABLE parameter ID.
+Treated as @c #int32 type.
+*/
+typedef enum PL_IRQ_MODES
+{
+ NO_FRAME_IRQS = 0, /**< Both counters are disabled. */
+ BEGIN_FRAME_IRQS, /**< Counts BOF events. */
+ END_FRAME_IRQS, /**< Counts EOF events. */
+ BEGIN_END_FRAME_IRQS /**< Provides a sum of BOF and EOF event. */
+}
+PL_IRQ_MODES;
+
+/**
+Used with the function #pl_exp_setup_cont.
+Treated as @c #int16 type.
+*/
+typedef enum PL_CIRC_MODES
+{
+ /**
+ Used internally by PVCAM for sequence acquisitions only.
+ @internal
+ */
+ CIRC_NONE = 0,
+ /**
+ In this circular buffer mode the oldest frame in buffer is automatically
+ replaced with new frame. No error is indicated by any function when this
+ occurs.
+ */
+ CIRC_OVERWRITE,
+ /**
+ In non-overwrite mode the oldest frame in circular buffer is also replaced
+ with new frame as in #CIRC_OVERWRITE mode (e.g. via DMA write from camera),
+ but PVCAM recognizes it and returns a buffer overrun error in the next
+ call of #pl_exp_get_oldest_frame or #pl_exp_get_latest_frame_ex.
+ */
+ CIRC_NO_OVERWRITE
+}
+PL_CIRC_MODES;
+
+/**
+Used with the #PARAM_EXP_RES parameter ID.
+The resolution defines units in which the exposure time is passed to #pl_exp_setup_seq
+and #pl_exp_setup_cont calls and for the Variable Timed Mode (#PARAM_EXP_TIME).
+Treated as @c #int32 type.
+*/
+typedef enum PL_EXP_RES_MODES
+{
+ EXP_RES_ONE_MILLISEC = 0, /**< Exposure value is defined in milli-seconds. */
+ EXP_RES_ONE_MICROSEC, /**< Exposure value is defined in micro-seconds. */
+ EXP_RES_ONE_SEC /**< Exposure value is defined in seconds. */
+}
+PL_EXP_RES_MODES;
+
+/**
+Used with the function #pl_io_script_control.
+Treated as @c #uns32 type.
+*/
+typedef enum PL_SRC_MODES
+{
+ SCR_PRE_OPEN_SHTR = 0,
+ SCR_POST_OPEN_SHTR,
+ SCR_PRE_FLASH,
+ SCR_POST_FLASH,
+ SCR_PRE_INTEGRATE,
+ SCR_POST_INTEGRATE,
+ SCR_PRE_READOUT,
+ SCR_POST_READOUT,
+ SCR_PRE_CLOSE_SHTR,
+ SCR_POST_CLOSE_SHTR
+}
+PL_SRC_MODES;
+
+/**
+Used with the functions pl_cam_register_callback* and #pl_cam_deregister_callback.
+
+Please note that callbacks are generated based on actual frame data transfer.
+This means that the BOF and EOF callbacks may not always correspond to actual
+readout of given frame from the camera sensor. This is especially true for fast
+cameras where frames are buffered on the camera side and BOF/EOF callbacks are
+generated when the frame is actually received on the device driver side.
+It is recommended to use the camera hardware signals for accurate frame
+synchronization.
+
+Treated as @c #int32 type.
+*/
+typedef enum PL_CALLBACK_EVENT
+{
+ /**
+ Beginning of frame callback. Occurs when the frame transfer begins.
+ */
+ PL_CALLBACK_BOF = 0,
+ /**
+ End of frame callback. Occurs when the frame is fully transferred
+ and ready in the frame buffer.
+ */
+ PL_CALLBACK_EOF,
+ /**
+ List of connected cameras has changed. This feature is currently not
+ supported. The list of cameras is refreshed only during #pl_pvcam_init.
+ */
+ PL_CALLBACK_CHECK_CAMS,
+ /**
+ A camera has been removed from the system.
+ */
+ PL_CALLBACK_CAM_REMOVED,
+ /**
+ A camera previously removed is available again. This feature is not
+ currently supported.
+ */
+ PL_CALLBACK_CAM_RESUMED,
+ PL_CALLBACK_MAX
+}
+PL_CALLBACK_EVENT;
+
+/**
+Defines the acquisition region.
+Used in #pl_exp_setup_seq and #pl_exp_setup_cont.
+In most cases, the s1, s2 coordinates correspond to x1, x2 coordinates.
+The sensor region width is then calculated as s2 - s1 + 1. The resulting
+image width would be (s2 - s1 + 1) / sbin.
+Similarly, the p1, p2 coordinates correspond to y1, y2 coordinates.
+The sensor region height is then calculated as (p2 - p1 + 1). The resulting
+image height would be (p2 - p1 + 1) / pbin.
+*/
+typedef struct rgn_type
+{
+ uns16 s1; /**< First pixel in the serial register. */
+ uns16 s2; /**< Last pixel in the serial register. */
+ uns16 sbin; /**< Serial binning for this region. */
+ uns16 p1; /**< First row in the parallel register. */
+ uns16 p2; /**< Last row in the parallel register. */
+ uns16 pbin; /**< Parallel binning for this region. */
+}
+rgn_type;
+
+typedef struct io_struct
+{
+ uns16 io_port; /**< I/O port address. */
+ uns32 io_type; /**< I/O port type (TTL, DAC, etc.) */
+ flt64 state; /**< Desired output state for the port. */
+ struct io_struct* next; /**< Linked list pointer.*/
+}
+io_entry;
+
+typedef struct io_list
+{
+ io_entry pre_open;
+ io_entry post_open;
+ io_entry pre_flash;
+ io_entry post_flash;
+ io_entry pre_integrate;
+ io_entry post_integrate;
+ io_entry pre_readout;
+ io_entry post_readout;
+ io_entry pre_close;
+ io_entry post_close;
+}
+io_list;
+
+/**
+Used in #pv_script_set_hook.
+@remarks This structure is deprecated.
+*/
+typedef struct active_camera_type
+{
+ uns16 shutter_close_delay; /**< Number of milliseconds for the shutter to close. */
+ uns16 shutter_open_delay; /**< Number of milliseconds for the shutter to open. */
+ uns16 rows; /**< Parallel size of the sensor active area. */
+ uns16 cols; /**< Serial size of the sensor active area. */
+ uns16 prescan; /**< Serial pixels before the active area. */
+ uns16 postscan; /**< Serial pixels after the active area. */
+ uns16 premask; /**< Parallel rows before the active area. */
+ uns16 postmask; /**< Parallel rows after the active area. */
+ uns16 preflash; /**< Number of milliseconds to flash the diode ring. */
+ uns16 clear_count; /**< Number of times to clear the sensor before exposure. */
+ uns16 preamp_delay; /**< Number of milliseconds for the preamp to settle. */
+ rs_bool mpp_selectable; /**< Indicates MPP mode can be selected. */
+ rs_bool frame_selectable; /**< Indicates frame transfer can be selected. */
+ int16 do_clear; /**< Clear: Never, Each Exposure, Each Sequence. */
+ int16 open_shutter; /**< Open: Never, Each Exposure, Each Sequence. */
+ rs_bool mpp_mode; /**< Enable or disable MPP mode. */
+ rs_bool frame_transfer; /**< Enable or disable frame transfer operation. */
+ rs_bool alt_mode; /**< Enable or disable Alternate Parallel mode. */
+ uns32 exp_res; /**< Exposure resolution. */
+ io_list* io_hdr; /**< Pointer to a list of I/O script control commands. */
+}
+active_camera_type;
+
+/******************************************************************************/
+/* Start of Frame Metadata Types */
+/******************************************************************************/
+
+/******************************************************************************/
+/* Data headers and camera shared types */
+
+/**
+Used in #md_frame_header structure.
+Treated as @c #uns8 type.
+*/
+typedef enum PL_MD_FRAME_FLAGS
+{
+ /** Check this bit before using the timestampBOR and timestampEOR. */
+ PL_MD_FRAME_FLAG_ROI_TS_SUPPORTED = 0x01,
+ PL_MD_FRAME_FLAG_UNUSED_2 = 0x02,
+ PL_MD_FRAME_FLAG_UNUSED_3 = 0x04,
+ PL_MD_FRAME_FLAG_UNUSED_4 = 0x10,
+ PL_MD_FRAME_FLAG_UNUSED_5 = 0x20,
+ PL_MD_FRAME_FLAG_UNUSED_6 = 0x40,
+ PL_MD_FRAME_FLAG_UNUSED_7 = 0x80
+}
+PL_MD_FRAME_FLAGS;
+
+/**
+Used in #md_frame_roi_header structure.
+Treated as @c #uns8 type.
+*/
+typedef enum PL_MD_ROI_FLAGS
+{
+ /**
+ This flag is used by #pl_md_frame_decode to discard invalid ROIs.
+ Any ROI with this flag will not be included in the #md_frame ROI array.
+ */
+ PL_MD_ROI_FLAG_INVALID = 0x01,
+ /**
+ This flag is used to report an ROI that contains no pixel data. Such
+ ROI is used to only mark a location within the frame.
+ */
+ PL_MD_ROI_FLAG_HEADER_ONLY = 0x02,
+ PL_MD_ROI_FLAG_UNUSED_3 = 0x04,
+ PL_MD_ROI_FLAG_UNUSED_4 = 0x10,
+ PL_MD_ROI_FLAG_UNUSED_5 = 0x20,
+ PL_MD_ROI_FLAG_UNUSED_6 = 0x40,
+ PL_MD_ROI_FLAG_UNUSED_7 = 0x80
+}
+PL_MD_ROI_FLAGS;
+
+/**
+The signature is located in the first 4 bytes of the frame header. The signature
+is checked before any metadata-related operations are executed on the buffer.
+*/
+#define PL_MD_FRAME_SIGNATURE 5328208
+
+/*
+The structures are shared between platforms, thus we must ensure that no
+compiler will apply different struct alignment.
+*/
+#pragma pack(push)
+#pragma pack(1)
+
+/**
+This is a frame header that is located before each frame. The size of this
+structure must remain constant. The structure is generated by the camera
+and should be 16-byte aligned.
+*/
+typedef struct md_frame_header
+{ /* TOTAL: 48 bytes */
+ uns32 signature; /**< 4B - Equal to #PL_MD_FRAME_SIGNATURE. */
+ uns8 version; /**< 1B - Must be 1 in the first release. */
+
+ uns32 frameNr; /**< 4B - 1-based, reset with each acquisition. */
+ uns16 roiCount; /**< 2B - Number of ROIs in the frame, at least 1. */
+
+ /** The final timestamp = timestampBOF * timestampResNs (in nanoseconds). */
+ uns32 timestampBOF; /**< 4B - Depends on resolution. */
+ uns32 timestampEOF; /**< 4B - Depends on resolution. */
+ uns32 timestampResNs; /**< 4B - 1=1ns, 1000=1us, 5000000=5ms, ... */
+
+ /** The final exposure time = exposureTime * exposureTimeResNs (nanoseconds). */
+ uns32 exposureTime; /**< 4B - Depends on resolution. */
+ uns32 exposureTimeResNs;/**< 4B - 1=1ns, 1000=1us, 5000000=5ms, ... */
+
+ /** ROI timestamp resolution is stored here, no need to transfer with each ROI. */
+ uns32 roiTimestampResNs;/**< 4B - ROI timestamps resolution. */
+
+ uns8 bitDepth; /**< 1B - Must be 10, 13, 14, 16, etc. */
+ uns8 colorMask; /**< 1B - Corresponds to #PL_COLOR_MODES. */
+ uns8 flags; /**< 1B - Frame flags, see #PL_MD_FRAME_FLAGS. */
+ uns16 extendedMdSize; /**< 2B - Must be 0 or actual ext md data size. */
+
+ /** Version 2 header additions. The following entries are available only
+ when the md_frame_header.version is reported as 2 or higher. */
+ uns8 imageFormat; /**< 1B - Image data format, see #PL_IMAGE_FORMATS */
+ uns8 imageCompression; /**< 1B - Image pixel data compression, see #PL_IMAGE_COMPRESSIONS */
+
+ uns8 _reserved[6];
+}
+md_frame_header;
+
+/**
+Version 3 of the frame header with improved timestamp and exposure time accuracy.
+When the md_frame_header.version is reported as 3, users are expected to use reinterpret_cast
+to cast the md_frame.header pointer to md_frame_header_v3 type.
+*/
+typedef struct md_frame_header_v3
+{ /* TOTAL: 48 bytes */
+ uns32 signature; /**< 4B - Equal to #PL_MD_FRAME_SIGNATURE. */
+ uns8 version; /**< 1B - Header version. */
+
+ uns32 frameNr; /**< 4B - 1-based, reset with each acquisition. */
+ uns16 roiCount; /**< 2B - Number of ROIs in the frame, at least 1. */
+
+ ulong64 timestampBOF; /**< 8B - Beginning of frame timestamp, in picoseconds. */
+ ulong64 timestampEOF; /**< 8B - End of frame timestamp, in picoseconds. */
+ ulong64 exposureTime; /**< 8B - Exposure time, in picoseconds. */
+
+ uns8 bitDepth; /**< 1B - Must be 10, 13, 14, 16, etc. */
+ uns8 colorMask; /**< 1B - Corresponds to #PL_COLOR_MODES. */
+ uns8 flags; /**< 1B - Frame flags, see #PL_MD_FRAME_FLAGS. */
+ uns16 extendedMdSize; /**< 2B - Must be 0 or actual ext md data size. */
+ uns8 imageFormat; /**< 1B - Image data format, see #PL_IMAGE_FORMATS */
+ uns8 imageCompression; /**< 1B - Image pixel data compression, see #PL_IMAGE_COMPRESSIONS */
+
+ uns8 _reserved[6];
+}
+md_frame_header_v3;
+
+/**
+This is a ROI header that is located before every ROI data. The size of this
+structure must remain constant. The structure is generated by the camera
+and should be 16-byte aligned.
+*/
+typedef struct md_frame_roi_header
+{ /* TOTAL: 32 bytes */
+ uns16 roiNr; /**< 2B - 1-based, reset with each frame. */
+
+ /** ROI timestamps. Currently unused. */
+ uns32 timestampBOR; /**< 4B - Beginning of ROI readout timestamp. */
+ uns32 timestampEOR; /**< 4B - End of ROI readout timestamp. */
+
+ rgn_type roi; /**< 12B - ROI coordinates and binning. */
+
+ uns8 flags; /**< 1B - ROI flags, see #PL_MD_ROI_FLAGS. */
+ uns16 extendedMdSize; /**< 2B - Must be 0 or actual ext metadata size in bytes. */
+
+ /** Version 2 header additions */
+ uns32 roiDataSize; /**< 4B - ROI image data size in bytes. */
+
+ uns8 _reserved[3];
+}
+md_frame_roi_header;
+
+#pragma pack(pop)
+
+/******************************************************************************/
+/* Extended metadata related structures */
+
+/**
+Maximum number of extended metadata tags supported.
+*/
+#define PL_MD_EXT_TAGS_MAX_SUPPORTED 255
+
+/**
+Available extended metadata tags.
+Used in #md_ext_item_info structure.
+Used directly as an enum type without casting to any integral type.
+*/
+typedef enum PL_MD_EXT_TAGS
+{
+ PL_MD_EXT_TAG_PARTICLE_ID = 0, /**< Particle ID */
+ PL_MD_EXT_TAG_PARTICLE_M0, /**< Particle M0 vector */
+ PL_MD_EXT_TAG_PARTICLE_M2, /**< Particle M2 vector */
+ PL_MD_EXT_TAG_MAX
+}
+PL_MD_EXT_TAGS;
+
+/**
+This structure describes the extended metadata TAG. This information is
+retrieved from an internal table. User needs this to correctly read and
+display the extended metadata value.
+*/
+typedef struct md_ext_item_info
+{
+ PL_MD_EXT_TAGS tag; /**< Tag ID */
+ uns16 type; /**< Tag type, corresponds to #ATTR_TYPE */
+ uns16 size; /**< Tag value size */
+ const char* name; /**< Tag friendly name */
+}
+md_ext_item_info;
+
+/**
+An extended metadata item together with its value. The user will retrieve a
+collection of these items.
+*/
+typedef struct md_ext_item
+{
+ const md_ext_item_info* tagInfo; /**< Tag information */
+ void* value; /**< Tag value */
+}
+md_ext_item;
+
+/**
+A collection of decoded extended metadata.
+*/
+typedef struct md_ext_item_collection
+{
+ md_ext_item list[PL_MD_EXT_TAGS_MAX_SUPPORTED]; /**< List of extended metadata tags */
+ md_ext_item* map[PL_MD_EXT_TAGS_MAX_SUPPORTED]; /**< Map of extended metadata tags */
+ uns16 count; /**< Number of valid tags in the arrays above */
+}
+md_ext_item_collection;
+
+/**
+This is a helper structure that is used to decode the md_frame_roi_header. Since
+the header cannot contain any pointers, PVCAM will calculate all information
+using offsets from frame & ROI headers.
+
+The structure must be created using the #pl_md_create_frame_struct function.
+Please note the structure keeps only pointers to data residing in the image
+buffer. Once the buffer is deleted, the contents of the structure become invalid.
+*/
+typedef struct md_frame_roi
+{
+ md_frame_roi_header* header; /**< Points directly to the header within the buffer. */
+ void* data; /**< Points to the ROI image data. */
+ uns32 dataSize; /**< Size of the ROI image data in bytes. */
+ void* extMdData; /**< Points directly to ext. metadata data within the buffer. */
+ uns16 extMdDataSize; /**< Size of the extended metadata buffer. */
+}
+md_frame_roi;
+
+/**
+This is a helper structure that is used to decode the md_frame_header. Since
+the header cannot contain any pointers, we need to calculate all information
+using offsets only.
+
+Please note the structure keeps only pointers to data residing in the image
+buffer. Once the buffer is deleted, the contents of the structure become invalid.
+*/
+typedef struct md_frame
+{
+ md_frame_header* header; /**< Points directly to the header within the buffer. */
+ void* extMdData; /**< Points directly to ext. metadata within the buffer. */
+ uns16 extMdDataSize;/**< Size of the ext. metadata buffer in bytes. */
+ rgn_type impliedRoi; /**< Implied ROI calculated during decoding. */
+
+ md_frame_roi* roiArray; /**< An array of ROI descriptors. */
+ uns16 roiCapacity; /**< Number of ROIs the structure can hold. */
+ uns16 roiCount; /**< Number of ROIs found during decoding. */
+}
+md_frame;
+
+/******************************************************************************/
+/*End of Frame Metadata Types */
+/******************************************************************************/
+
+/******************************************************************************/
+/**
+@addtogroup grp_pm_deprecated_typedefs
+@{
+*/
+
+typedef PVCAM_FRAME_INFO_GUID* PPVCAM_FRAME_INFO_GUID;
+typedef FRAME_INFO* PFRAME_INFO;
+typedef smart_stream_type* smart_stream_type_ptr;
+typedef rgn_type* rgn_ptr;
+typedef const rgn_type* rgn_const_ptr;
+typedef io_entry* io_entry_ptr;
+typedef io_list* io_list_ptr;
+typedef io_list** io_list_ptr_ptr;
+typedef active_camera_type* active_camera_ptr;
+
+/** @} */ /* grp_pm_deprecated_typedefs */
+
+/******************************************************************************/
+/**
+The following macros can be used to extract a single byte from multi-byte integers,
+or to combine multiple bytes into a larger integer value.
+
+@{
+*/
+
+/** Extracts the most significant byte from a two-uns8 integer input. */
+#define MS16_BYTE(two_byte_value)((uns8)(((uns16)(two_byte_value) >> 8) & 0xFF))
+/** Extracts the least significant byte from a two-uns8 integer input. */
+#define LS16_BYTE(two_byte_value)((uns8)(((uns16)(two_byte_value) >> 0) & 0xFF))
+
+/** Extracts the most significant byte from a four-uns8 integer input. */
+#define MS32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 24) & 0xFF))
+/** Extracts the middle-high significant byte from a four-uns8 integer input. */
+#define MH32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 16) & 0xFF))
+/** Extracts the middle-low significant byte from a four-uns8 integer input. */
+#define ML32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 8) & 0xFF))
+/** Extracts the least significant byte from a four-uns8 integer input. */
+#define LS32_BYTE(four_byte_value)((uns8)(((uns32)(four_byte_value) >> 0) & 0xFF))
+
+/** Produces a 16-bit unsigned integer value from 2 input bytes. */
+#define VAL_UNS16(ms_byte,ls_byte)(\
+ ((uns16)((uns8)(ms_byte)) << 8) |\
+ ((uns16)((uns8)(ls_byte)) << 0))
+
+/** Produces a 32-bit unsigned integer value from 4 input bytes. */
+#define VAL_UNS32(ms_byte,mh_byte,ml_byte,ls_byte)(\
+ ((uns32)((uns8)(ms_byte)) << 24) |\
+ ((uns32)((uns8)(mh_byte)) << 16) |\
+ ((uns32)((uns8)(ml_byte)) << 8) |\
+ ((uns32)((uns8)(ls_byte)) << 0))
+
+/** Produces a 64-bit signed integer value from 8 input bytes. */
+#define VAL_INT64(b0,b1,b2,b3,b4,b5,b6,b7)(\
+ ((long64)((uns8)(b0)) << 56) |\
+ ((long64)((uns8)(b1)) << 48) |\
+ ((long64)((uns8)(b2)) << 40) |\
+ ((long64)((uns8)(b3)) << 32) |\
+ ((long64)((uns8)(b4)) << 24) |\
+ ((long64)((uns8)(b5)) << 16) |\
+ ((long64)((uns8)(b6)) << 8) |\
+ ((long64)((uns8)(b7)) << 0))
+
+/** @} */
+
+/******************************************************************************/
+/* Content which is needed to communicate with the PVCAM DLLs */
+
+typedef int16 pm_script_hook(int16 hcam,
+ uns16 exp_total,
+ uns16 rgn_total,
+ const rgn_type* rgn_array,
+ int16 mode,
+ uns32 exposure_time,
+ uns32* pixels,
+ active_camera_type* active_camera);
+
+/**
+Data type used by #pl_get_param with #ATTR_TYPE.
+@{
+*/
+#define TYPE_INT16 1
+#define TYPE_INT32 2
+#define TYPE_FLT64 4
+#define TYPE_UNS8 5
+#define TYPE_UNS16 6
+#define TYPE_UNS32 7
+#define TYPE_UNS64 8
+#define TYPE_ENUM 9
+#define TYPE_BOOLEAN 11
+#define TYPE_INT8 12
+#define TYPE_CHAR_PTR 13
+#define TYPE_VOID_PTR 14
+#define TYPE_VOID_PTR_PTR 15
+#define TYPE_INT64 16
+#define TYPE_SMART_STREAM_TYPE 17
+#define TYPE_SMART_STREAM_TYPE_PTR 18
+#define TYPE_FLT32 19
+#define TYPE_RGN_TYPE 20
+#define TYPE_RGN_TYPE_PTR 21
+#define TYPE_RGN_LIST_TYPE 22
+#define TYPE_RGN_LIST_TYPE_PTR 23
+/** @} */
+
+/*
+Defines for classes.
+*/
+#define CLASS0 0 /* Camera Communications */
+#define CLASS2 2 /* Configuration/Setup */
+#define CLASS3 3 /* Data Acquisition */
+
+/******************************************************************************/
+/* Start of parameter ID definitions. */
+/* Format: TTCCxxxx, where TT = Data type, CC = Class, xxxx = ID number */
+/* Please note that some data types encoded in the parameter IDs do not */
+/* correspond to the actual parameter data type. Please always check the */
+/* ATTR_TYPE before using the parameter. */
+/******************************************************************************/
+
+/**
+@defgroup grp_pm_parameters Parameters
+*/
+
+/**
+@addtogroup grp_pm_parameters
+@{
+*/
+
+/* CAMERA COMMUNICATION PARAMETERS */
+
+/**
+@brief Returns the length of an information message for each device driver.
+
+Some devices have no message. In other words, they return a value of 0 for bytes.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_DD_INFO_LENGTH ((CLASS0<<16) + (TYPE_INT16<<24) + 1)
+/**
+@brief Returns a version number for the device driver used to access the camera.
+
+The version number is for information only. Application does not need to check
+the version or make decisions based on its value. Every PVCAM release is bundled
+with a specific set of device driver versions. PVCAM binaries and device driver
+binaries are usually tightly coupled and cannot be interchanged.
+
+The version is a formatted hexadecimal number of the style:
+
+| High byte | Low | byte |
+|:-------------:|--------------:|:----------------|
+| | High nibble | Low nibble |
+| Major version | Minor version | Trivial version |
+
+For example, the number 0xB1C0 indicates major release 177, minor release 12,
+and trivial change 0.
+
+Open the camera before calling this parameter. Note that different cameras in
+the same system may use different drivers. Thus, each camera can have its own
+driver and its own driver version.
+
+Data type: @c #uns16
+*/
+#define PARAM_DD_VERSION ((CLASS0<<16) + (TYPE_UNS16<<24) + 2)
+/**
+@brief Reads/sets the maximum number of command retransmission attempts that are
+ allowed.
+
+When a command or status transmission is garbled, the system signals for a
+re-transmission. After a certain number of failed transmissions (an initial
+attempt + max_retries), the system abandons the attempt and concludes that the
+communication link has failed. The camera will not close, but the command or
+status read returns with an error. The maximum number of retries is initially
+set by the device driver, and is matched to the communication link, hardware
+platform, and operating system. It may also be reset by the user.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+
+@remarks This parameter is deprecated.
+*/
+#define PARAM_DD_RETRIES ((CLASS0<<16) + (TYPE_UNS16<<24) + 3)
+/**
+@brief Reads/sets the maximum time the driver waits for acknowledgment.
+
+I.e., the slowest allowable response speed from the camera. This is a crucial
+factor used in the device driver for communication control. If the driver sends
+a command to the camera and does not receive acknowledgment within the timeout
+period, the driver times out and returns an error. Unless reset by the user,
+this timeout is a default setting that is contained in the device driver and is
+matched to the communication link, hardware platform, and operating system.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+
+@remarks This parameter is deprecated.
+*/
+#define PARAM_DD_TIMEOUT ((CLASS0<<16) + (TYPE_UNS16<<24) + 4)
+/**
+@brief Returns an information message for each device.
+
+Some devices have no message. The user is responsible for allocating enough
+memory to hold the message string. Required number of bytes can be obtained via
+parameter #PARAM_DD_INFO_LENGTH.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_DD_INFO ((CLASS0<<16) + (TYPE_CHAR_PTR<<24) + 5)
+
+/**
+@brief Returns a list of camera communication interfaces.
+
+For example it can be USB 3.0, PCIe, etc. Use the #ATTR_CURRENT to retrieve the
+currently selected interface. Use the #pl_get_enum_param function to retrieve
+all camera supported interfaces.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_CAM_INTERFACE_TYPES
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_INTERFACE_TYPE ((CLASS0<<16) + (TYPE_ENUM<<24) + 10)
+/**
+@brief Returns a list of camera communication interface modes.
+
+This for example returns whether the interface is fully capable of imaging or if it
+has limitations. Use the #ATTR_CURRENT to retrieve the mode of the currently
+selected interface. Use the #pl_get_enum_param function to retrieve the list of
+modes for all the camera supported interfaces.
+
+The number of items reported by this parameter corresponds to the number of
+items reported by the #PARAM_CAM_INTERFACE_TYPE. Using the #pl_get_enum_param
+call one can build a table of camera interfaces and their modes, simply iterate
+through both parameters and build the table, for example:
+
+| Enum index | Type id | Type string | Mode id | Mode string |
+|:----------:|:-------:|:-----------:|:-------:|:-----------:|
+| 0 | 514 | "USB 2.0" | 1 | "Control" |
+| 1 | 515 | "USB 3.0" | 2 | "Imaging" |
+| 2 | 2051 | "PCIe x4" | 2 | "Imaging" |
+
+Data type: @c enum (@c #int32)
+
+@see #PL_CAM_INTERFACE_MODES
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_INTERFACE_MODE ((CLASS0<<16) + (TYPE_ENUM<<24) + 11)
+
+/* CONFIGURATION AND SETUP PARAMETERS */
+
+/**
+@brief Bias offset voltage.
+
+The units do not correspond to the output pixel values in any simple fashion
+(the conversion rate should be linear, but may differ from system to system), but
+a lower offset voltage will yield a lower value for all output pixels. Pixels
+brought below zero by this method will be clipped at zero. Pixels raised above
+saturation will be clipped at saturation. Before you can change the offset
+level, you must read the current offset level. The default offset level will
+also vary from system to system and may change with each speed and gain setting.
+
+Data type: @c #int16
+
+@warning THIS VALUE IS SET AT THE FACTORY AND SHOULD NOT BE CHANGED!
+If you would like to change this value, please contact customer service before
+doing so.
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_ADC_OFFSET ((CLASS2<<16) + (TYPE_INT16<<24) + 195)
+/**
+@brief The name of the sensor.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #CCD_NAME_LEN elements long.
+
+Data type: @c char*
+*/
+#define PARAM_CHIP_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 129)
+/**
+@brief The name of the system.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #MAX_SYSTEM_NAME_LEN elements long. It is meant to
+replace #PARAM_CHIP_NAME behavior on some cameras which were
+reporting their friendly product name with this parameter, and in turn help
+future cameras go back to reporting the name of the sensor with
+#PARAM_CHIP_NAME.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SYSTEM_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 130)
+/**
+@brief The name of the vendor.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #MAX_VENDOR_NAME_LEN elements long. This is meant to
+differentiate between "QImaging" and "Photometrics" products moving forward.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_VENDOR_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 131)
+/**
+@brief The name of the product.
+
+The name is a null-terminated text string. The user must pass in a character
+array that is at least #MAX_PRODUCT_NAME_LEN elements long. This is meant to
+report camera name such as "Prime 95B" or "Retiga R6". OEMs should also consider
+using this for branding their cameras.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PRODUCT_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 132)
+/**
+@brief The part number of the camera.
+
+The part number is a null-terminated text string. The user must pass in a
+character array that is at least #MAX_CAM_PART_NUM_LEN elements long.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAMERA_PART_NUMBER ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 133)
+
+/**
+@brief This is the type of cooling used by the current camera.
+
+See #PL_COOL_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+*/
+#define PARAM_COOLING_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 214)
+/**
+@brief The number of milliseconds required for the sensor output preamp to
+stabilize, after it is turned on.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PREAMP_DELAY ((CLASS2<<16) + (TYPE_UNS16<<24) + 502)
+/**
+@brief The color mode of the sensor.
+
+This enum parameter provides a list of all possible color masks defined in
+#PL_COLOR_MODES type. The real mask applied on sensor is reported as current
+value (#ATTR_CURRENT). Take into account that for mono cameras this parameter is
+usually not available (for #ATTR_AVAIL it returns @c FALSE) instead of reporting
+#COLOR_NONE value.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_COLOR_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 504)
+/**
+@brief Indicates whether this sensor runs in MPP mode.
+
+See #PL_MPP_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_MPP_CAPABLE ((CLASS2<<16) + (TYPE_ENUM<<24) + 224)
+/**
+@brief The exposure time limit in milliseconds above which the preamp is turned
+off during exposure.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PREAMP_OFF_CONTROL ((CLASS2<<16) + (TYPE_UNS32<<24) + 507)
+
+/* Sensor dimensions and physical characteristics */
+
+/**
+@brief The number of masked lines at the near end of the parallel register.
+
+It is next to the serial register. 0 means no mask (no normal mask). If the
+pre-mask is equal to par_size, this probably indicates a frame transfer device
+with an ordinary mask. Accordingly, the sensor should probably be run in frame
+transfer mode.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PREMASK ((CLASS2<<16) + (TYPE_UNS16<<24) + 53)
+/**
+@brief The number of pixels discarded from the serial register before the first
+real data pixel.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PRESCAN ((CLASS2<<16) + (TYPE_UNS16<<24) + 55)
+/**
+@brief The number of masked lines at the far end of the parallel register.
+
+It's away from the serial register. This is the number of additional parallel
+shifts that need to be done after readout to clear the parallel register.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_POSTMASK ((CLASS2<<16) + (TYPE_UNS16<<24) + 54)
+/**
+@brief The number of pixels to discard from the serial register after the last
+real data pixel.
+
+These must be read or discarded to clear the serial register.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_POSTSCAN ((CLASS2<<16) + (TYPE_UNS16<<24) + 56)
+/**
+@brief This is the center-to-center distance between pixels in the parallel
+direction.
+
+It is measured in nanometers. This is identical to #PARAM_PIX_PAR_SIZE if there
+are no inter-pixel dead areas.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_PAR_DIST ((CLASS2<<16) + (TYPE_UNS16<<24) + 500)
+/**
+@brief This is the size of the active area of a pixel, in the parallel direction.
+
+Reported in nanometers.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_PAR_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 63)
+/**
+@brief This is the center-to-center distance between pixels in the serial
+direction.
+
+Reported in nanometers. This is identical to #PARAM_PIX_SER_SIZE, if there
+are no dead areas.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_SER_DIST ((CLASS2<<16) + (TYPE_UNS16<<24) + 501)
+/**
+@brief This is the size of the active area of a pixel in the serial direction.
+
+Reported in nanometers.
+
+Data type: @c #uns16
+*/
+#define PARAM_PIX_SER_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 62)
+/**
+@brief Checks to see if the summing well exists.
+
+When a @c TRUE is returned for #ATTR_AVAIL, the summing well exists.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SUMMING_WELL ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 505)
+/**
+@brief Gets the sensor full-well capacity, measured in electrons.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FWELL_CAPACITY ((CLASS2<<16) + (TYPE_UNS32<<24) + 506)
+/**
+@brief The parallel size of the sensor chip, in active rows.
+
+In most cases this parameter reports the height of the sensor imaging area or
+the number of rows in sCMOS type sensor.
+
+The full size of the parallel register is actually (par_size + premask + postmask).
+
+Data type: @c #uns16
+*/
+#define PARAM_PAR_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 57)
+/**
+@brief The serial size of the sensor chip, in active columns.
+
+In most cases this parameter reports the width of the sensor imaging area or
+the number of columns in sCMOS type sensor.
+
+Data type: @c #uns16
+*/
+#define PARAM_SER_SIZE ((CLASS2<<16) + (TYPE_UNS16<<24) + 58)
+/**
+@brief Returns @c TRUE for #ATTR_AVAIL if the camera has accumulation capability.
+
+Accumulation functionality is provided with the FF plug-in.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_ACCUM_CAPABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 538)
+/**
+@brief Reports if the camera supports firmware download.
+
+This parameter is for Teledyne Photometrics internal use only. It is largely unused
+because we simply do it on all cameras now, thus it can become deprecated in
+future.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FLASH_DWNLD_CAPABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 539)
+
+/* General parameters */
+
+/**
+@brief Time it will take to read out the image from the sensor with the current
+camera settings, in microseconds.
+
+Settings have to be applied with #pl_exp_setup_seq or #pl_exp_setup_cont before
+the camera will calculate the readout time for the new settings.
+
+@warning: as with all other parameters please do not access this parameter
+while the camera is imaging.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_UNS32.
+*/
+#define PARAM_READOUT_TIME ((CLASS2<<16) + (TYPE_FLT64<<24) + 179)
+/**
+@brief This parameter reports the time needed to clear the sensor.
+
+The time is reported in nanoseconds. This delay is incurred once prior to the
+acquisition when pre-sequence clearing mode is chosen by the application. The
+delay is incurred prior to every frame when the imaging application chooses
+pre-exposure clearing mode.
+
+The value is valid only after #pl_exp_setup_seq or #pl_exp_setup_cont call.
+
+Data type: @c #long64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_CLEARING_TIME ((CLASS2<<16) + (TYPE_INT64<<24) + 180)
+/**
+@brief Post-trigger delay, in nanoseconds.
+
+In addition to the #PARAM_CLEARING_TIME, there might be a delay between an
+internal or external trigger and the transition event (low to high) for the
+Expose Out signal. This happens, for example, in global All Rows Expose Out mode
+in which case the value is equal to the readout time.
+
+The value is valid only after #pl_exp_setup_seq or #pl_exp_setup_cont call.
+
+Data type: @c #long64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_POST_TRIGGER_DELAY ((CLASS2<<16) + (TYPE_INT64<<24) + 181)
+/**
+@brief Pre-trigger delay, in nanoseconds.
+
+For pre-exposure clearing mode and the first frame in pre-sequence clearing mode,
+the frame cycle time is the sum of #PARAM_EXPOSURE_TIME, #PARAM_PRE_TRIGGER_DELAY,
+#PARAM_POST_TRIGGER_DELAY and #PARAM_CLEARING_TIME.
+
+For second and subsequent frames in pre-sequence clearing mode (most typical
+scenario) the frame cycle time is the sum of #PARAM_EXPOSURE_TIME,
+#PARAM_PRE_TRIGGER_DELAY and #PARAM_POST_TRIGGER_DELAY.
+
+Frame cycle time is defined as the interval between start of exposure for one
+frame and start of exposure for the next frame when the camera is in internal
+triggered (timed) mode and set up for continuous (circular buffer) acquisition.
+
+The value is valid only after #pl_exp_setup_seq or #pl_exp_setup_cont call.
+
+Data type: @c #long64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PRE_TRIGGER_DELAY ((CLASS2<<16) + (TYPE_INT64<<24) + 182)
+
+/* CAMERA PARAMETERS */
+
+/**
+@brief Number of clear cycles.
+
+This is the number of times the sensor must be cleared to completely remove
+charge from the parallel register. The value is ignored in case the clearing
+mode is set to #CLEAR_NEVER or #CLEAR_AUTO via #PARAM_CLEAR_MODE parameter.
+
+Data type: @c #uns16
+*/
+#define PARAM_CLEAR_CYCLES ((CLASS2<<16) + (TYPE_UNS16<<24) + 97)
+/**
+@brief Defines when clearing takes place.
+
+All the possible clearing modes are defined in #PL_CLEAR_MODES enum. But keep in
+mind that some cameras might not support all the modes. Use #pl_get_enum_param
+function to enumerate all the supported modes.
+
+Data type: @c enum (@c #int32)
+
+@see @ref ClearModes
+@note The availability is camera-dependent.
+*/
+#define PARAM_CLEAR_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 523)
+/**
+@brief Reports frame transfer capability.
+
+Returns @c TRUE for #ATTR_AVAIL if this camera can run in frame transfer mode
+(set through #PARAM_PMODE).
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FRAME_CAPABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 509)
+/**
+@brief Parallel clocking method.
+
+See #PL_PMODES enum for all possible values.
+The @c "_FT" in mode name indicates frame transfer mode, @c "_FT_MPP" indicates
+both frame transfer and MPP mode. @c "_ALT" indicates that custom parameters may
+be loaded.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PMODE ((CLASS2<<16) + (TYPE_ENUM <<24) + 524)
+
+/* Temperature parameters for the sensor. */
+
+/**
+@brief Returns the current measured temperature of the sensor in hundredths of
+degrees Celsius.
+
+For example, a temperature of minus 35°C would be read as -3500.
+
+@warning: as with all other parameters, this parameter must not be accessed
+while the camera is imaging.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_TEMP ((CLASS2<<16) + (TYPE_INT16<<24) + 525)
+/**
+@brief Sets the desired sensor temperature in hundredths of degrees Celsius.
+
+E.g. -35°C is represented as -3500. The hardware attempts to heat or cool the
+sensor to this temperature. The min/max allowable temperatures are given by
+#ATTR_MIN and #ATTR_MAX. Settings outside this range are ignored. Note that this
+function only sets the desired temperature. Even if the desired temperature is
+within a legal range, it still may be impossible to achieve. If the ambient
+temperature is too high, it is difficult to get sufficient cooling on an air-cooled
+camera.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_TEMP_SETPOINT ((CLASS2<<16) + (TYPE_INT16<<24) + 526)
+
+/* Parameters used for firmware version retrieval. */
+
+/**
+@brief Returns the firmware version of the camera, as a hexadecimal number.
+
+The form is @c MMmm, where @c MM is the major version and @c mm is the minor
+version. For example, 0x0814 corresponds to version 8.20.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_FW_VERSION ((CLASS2<<16) + (TYPE_UNS16<<24) + 532)
+/**
+@brief Returns the alphanumeric serial number for the camera head.
+
+The serial number for Teledyne Photometrics-branded cameras has a maximum length of
+#MAX_ALPHA_SER_NUM_LEN.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_HEAD_SER_NUM_ALPHA ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 533)
+/**
+@brief Returns the version number of the PCI firmware.
+
+This number is a single 16-bit unsigned value.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PCI_FW_VERSION ((CLASS2<<16) + (TYPE_UNS16<<24) + 534)
+
+/**
+@brief Sets and gets the desired fan speed.
+
+Note that the camera can automatically adjust the fan speed to higher level due to
+sensor overheating or completely shut down power to the sensor board to protect
+camera from damage. The default fan speed is supposed to be changed only
+temporarily during experiments to reduce sound noise or vibrations.
+
+Data type: @c enum (@c #int32)
+
+@warning Use this parameter with caution.
+@note The availability is camera-dependent.
+*/
+#define PARAM_FAN_SPEED_SETPOINT ((CLASS2<<16) + (TYPE_ENUM<<24) + 710)
+/**
+@brief Returns description of all camera nodes.
+
+The text is a multi-line and null-terminated string. The user must pass in a
+character array that is at least #MAX_CAM_SYSTEMS_INFO_LEN elements long or
+dynamically allocated array to size returned for #ATTR_COUNT attribute.
+
+The format is the same as can be seen in output of @c VersionInformation tool.
+
+Data type: @c char*
+
+@warning Extra caution should be taken while accessing this parameter. It is
+known to hang some cameras when used together with other parameters e.g. while
+scanning camera capabilities after opening (especially with Retiga R1/R3/R6 cameras).
+To work around this limitation ensure there is no communication with camera one
+second before and one second after this parameter is used!
+@note The availability is camera-dependent.
+*/
+#define PARAM_CAM_SYSTEMS_INFO ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 536)
+
+/**
+@brief The exposure/triggering mode.
+
+This parameter cannot be set, but its value can be retrieved. The mode is set as
+a value combined with Expose Out mode via #pl_exp_setup_seq or
+#pl_exp_setup_cont function.
+See #PL_EXPOSURE_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref ExposureModes, @ref secTriggerModes, @ref secExtTriggerModes
+*/
+#define PARAM_EXPOSURE_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 535)
+/**
+@brief The Expose Out mode.
+
+This parameter cannot be set, but its value can be retrieved. The mode is set as
+a value combined with extended exposure mode via #pl_exp_setup_seq or
+#pl_exp_setup_cont function.
+See #PL_EXPOSE_OUT_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref secExpOutModes, @ref secExtTriggerModes
+@note The availability is camera-dependent.
+*/
+#define PARAM_EXPOSE_OUT_MODE ((CLASS2<<16) + (TYPE_ENUM<<24) + 560)
+
+/* SPEED TABLE PARAMETERS */
+
+/**
+@brief *Native* pixel sample range in number of bits for the currently configured acquisition.
+
+The image bit depth may depend on currently selected #PARAM_READOUT_PORT, #PARAM_SPDTAB_INDEX,
+#PARAM_GAIN_INDEX and other acquisition parameters. Please, make sure to check this parameter
+before starting the acquisition, ideally after calling #pl_exp_setup_seq or #pl_exp_setup_cont.
+
+Most Teledyne Photometrics cameras transfer pixels in 16-bit words (#uns16 type). However, some
+cameras are capable of transferring 8-bit data (#uns8 type). Make sure to also check the
+#PARAM_IMAGE_FORMAT parameter to discover the current camera pixel format.
+
+This parameter indicates the number of valid bits within the transferred word or byte.
+
+Data type: @c #int16
+
+@see @ref SpeedTable
+*/
+#define PARAM_BIT_DEPTH ((CLASS2<<16) + (TYPE_INT16<<24) + 511)
+
+/**
+@brief Pixel sample range of the image outputted to the *host*.
+
+This parameter differs from the *native* #PARAM_BIT_DEPTH in a way that it reports the bit depth
+of the *output* frame - a frame that is delivered to the *host*. Since PVCAM supports various *host*
+side post processing features, the *host* bit depth may differ from the *native* camera bit depth,
+depending on what *host*-side post processing features are active.
+
+For example, the camera *native* bit depth may be reported as 12-bit for current port/speed/gain
+selection. However, when #PARAM_HOST_FRAME_SUMMING_ENABLED is enabled, the *host* frame bit depth may
+be reported as 16 or 32-bit.
+
+As a general rule, the application should always rely on the '_HOST'-specific parameters when
+identifying the output data format. The *native* parameters should be used only for informational
+purposes, e.g. to show the camera native format in the GUI.
+
+Data type: @c #int16
+
+@see @ref SpeedTable, #PARAM_HOST_FRAME_SUMMING_ENABLED, #PARAM_HOST_FRAME_SUMMING_FORMAT.
+*/
+#define PARAM_BIT_DEPTH_HOST ((CLASS2<<16) + (TYPE_INT16<<24) + 551)
+/**
+@brief *Native* image format of the camera pixel stream.
+
+This parameter is used to retrieve the list of camera-supported image formats. The
+image format may depend on current camera configuration. It is advised to check
+the image format before starting the acquisition. Some cameras allow the native
+format to be selected. Use the #ATTR_ACCESS to check the write permissions.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_FORMATS enum for all possible values.
+*/
+#define PARAM_IMAGE_FORMAT ((CLASS2<<16) + (TYPE_ENUM<<24) + 248)
+
+/**
+@brief Image format of the pixel stream that is outputted to the *host*.
+
+This parameter differs from the *native* #PARAM_IMAGE_FORMAT in a way that it reports the format
+of the *output* frame - a frame that is delivered to the *host*. Since PVCAM supports various *host*
+side post processing features, the *host* image format may differ from the *native* camera bit depth,
+depending on what *host*-side post processing features are active.
+
+For example, the camera *native* image format may be reported as 16-bit MONO for the current
+port/speed/gain selection. However, when #PARAM_HOST_FRAME_SUMMING_ENABLED is enabled, the *host* image
+format may need to be upgraded to a wider, 32-bit MONO format.
+
+As a general rule, the application should always rely on the '_HOST'-specific parameters when
+identifying the output data format. The *native* parameters should be used only for informational
+purposes, e.g. to show the camera native format in the GUI.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_FORMATS enum for all possible values and related #PARAM_HOST_FRAME_SUMMING_ENABLED,
+ #PARAM_HOST_FRAME_SUMMING_FORMAT parameters.
+*/
+#define PARAM_IMAGE_FORMAT_HOST ((CLASS2<<16) + (TYPE_ENUM<<24) + 552)
+/**
+@brief *Native* image compression of the camera pixel stream.
+
+This parameter is used to retrieve the list of camera-supported image compression modes.
+The compression mode may depend on currently selected port and speed combination.
+It is advised to check the compression mode before starting the acquisition. Some
+cameras allow the native compression to be selected. Use the #ATTR_ACCESS to check
+the write permissions.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_COMPRESSIONS enum for all possible values.
+*/
+#define PARAM_IMAGE_COMPRESSION ((CLASS2<<16) + (TYPE_ENUM<<24) + 249)
+
+/**
+@brief Image compression of the pixel stream outputted to the host.
+
+This parameter differs from the *native* #PARAM_IMAGE_COMPRESSION in a way that it reports the
+compression of the *output* frame - a frame that is delivered to the *host*. For some camera
+models, various compression methods may be used to increase the interface bandwidth.
+
+In general, applications do not have to support any of the compression-related parameters because
+decompression is automatically and seamlessly done by PVCAM. However, in specific cases the
+automatic decompression may be disabled.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_IMAGE_COMPRESSIONS enum for all possible values and related
+ #PARAM_HOST_FRAME_DECOMPRESSION_ENABLED.
+*/
+#define PARAM_IMAGE_COMPRESSION_HOST ((CLASS2<<16) + (TYPE_ENUM<<24) + 253)
+/**
+@brief Scan mode of the camera.
+
+This parameter is used to retrieve and control the camera-supported scan modes.
+Please note that the #PARAM_SCAN_LINE_DELAY and #PARAM_SCAN_WIDTH access mode
+depends on the scan mode selection.
+
+If the mode is set to #PL_SCAN_MODE_PROGRAMMABLE_SCAN_WIDTH, then the
+#PARAM_SCAN_WIDTH can be controlled and the #PARAM_SCAN_LINE_DELAY becomes read-only.
+If the mode is set to #PL_SCAN_MODE_PROGRAMMABLE_LINE_DELAY, then the
+#PARAM_SCAN_LINE_DELAY can be controlled and the #PARAM_SCAN_WIDTH becomes read-only.
+In both cases the #PARAM_SCAN_LINE_TIME reports the total time it takes to read
+one sensor line (row), including any delay added with the parameters above.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_SCAN_MODES enum for all possible values.
+*/
+#define PARAM_SCAN_MODE ((CLASS3<<16) + (TYPE_ENUM<<24) + 250)
+/**
+@brief Scan direction of the camera.
+
+This parameter is used to retrieve the list of camera-supported scan directions.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_SCAN_DIRECTIONS enum for all possible values.
+*/
+#define PARAM_SCAN_DIRECTION ((CLASS3<<16) + (TYPE_ENUM<<24) + 251)
+/**
+@brief Scan direction reset state.
+
+This parameter is used to retrieve scan direction reset state of camera.
+The parameter is used with alternate scan directions (down-up) to reset the
+direction with every acquisition.
+
+Data type: @c boolean (@c #rs_bool)
+*/
+#define PARAM_SCAN_DIRECTION_RESET ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 252)
+/**
+@brief Scan line delay value of the camera.
+
+This parameter is used to retrieve or set the scan line delay. The parameter
+access mode depends on the #PARAM_SCAN_MODE selection.
+
+Data type: @c uns16 (@c #uns16)
+*/
+#define PARAM_SCAN_LINE_DELAY ((CLASS3<<16) + (TYPE_UNS16<<24) + 253)
+/**
+@brief Scan line time of the camera.
+
+This parameter is used to retrieve scan line time of camera. The time is reported
+in nanoseconds.
+
+Please note the parameter value should be retrieved after the call to
+#pl_exp_setup_seq or #pl_exp_setup_cont because the camera needs to know the
+actual acquisition configuration in order to calculate the value.
+
+Data type: @c long64 (@c #long64)
+*/
+#define PARAM_SCAN_LINE_TIME ((CLASS3<<16) + (TYPE_INT64<<24) + 254)
+/**
+@brief Scan width in number of lines.
+
+This parameter is used to retrieve scan width of camera.
+
+Data type: @c uns16 (@c #uns16)
+*/
+#define PARAM_SCAN_WIDTH ((CLASS3<<16) + (TYPE_UNS16<<24) + 255)
+/**
+@brief Virtual frame rotation mode.
+
+This parameter controls PVCAM-internal frame rotation module. When enabled,
+PVCAM will automatically rotate incoming frames based on the parameter setting.
+Please note that the frame rotation setting affects other parameters:
+#PARAM_SER_SIZE, #PARAM_PAR_SIZE, #PARAM_BINNING_SER, #PARAM_BINNING_PAR and
+#PARAM_COLOR_MODE. For example, if a 90-degree rotation is requested, the affected
+parameters will return appropriately swapped or rotated values. Application should
+re-read the affected parameters after every change in #PARAM_FRAME_ROTATE.
+
+If #PARAM_METADATA_ENABLED is enabled, the frame-embedded metadata is also adjusted
+automatically if needed. This applies to the metadata-reported ROI and color mask.
+
+Legacy applications can set a system environment variable "PVCAM_FRAME_ROTATE_MODE" to
+one of the following values: 90, 180, 270 or 0. If set, sensors of all PVCAM cameras in the
+system will become virtually rotated and all sensor-related parameters will be
+reported appropriately rotated as well.
+
+A multi-threaded block-rotate algorithm is used for image rotation. The delay introduced
+by the algorithm depends on CPU performance. An Intel Xeon W-2123 processor can rotate
+a 2048x2048 16-bit image in approximately 1.5ms.
+
+This parameter can be used together with #PARAM_FRAME_FLIP. When both parameters
+are enabled, PVCAM uses an algorithm that processes the rotation/flipping combination
+using only one pass, keeping the performance withing 1-2ms on the same CPU.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_FRAME_ROTATE_MODES enum for all possible values.
+*/
+#define PARAM_HOST_FRAME_ROTATE ((CLASS2<<16) + (TYPE_ENUM<<24) + 256)
+/** @deprecated. Use the #PARAM_HOST_FRAME_ROTATE */
+#define PARAM_FRAME_ROTATE (PARAM_HOST_FRAME_ROTATE)
+/**
+@brief Virtual frame flipping mode.
+
+This parameter controls PVCAM-internal frame flipping module. When enabled,
+PVCAM will automatically flip incoming frames based on the parameter setting.
+Please note that the frame flip setting affects the sensor reported color mask
+(#PARAM_COLOR_MODE). For example, if flip-X is requested, the sensor mask is
+also reported as flipped: an RGGB sensor mask would be reported as GRBG mask.
+
+If #PARAM_METADATA_ENABLED is enabled, the frame-embedded metadata is also adjusted
+automatically if needed. This applies to the metadata-reported color mask value.
+
+Legacy applications can set a system environment variable "PVCAM_FRAME_FLIP_MODE" to
+one of the following values: X, Y, XY or NONE. If set, sensors of all PVCAM cameras
+in the system will become virtually flipped and all sensor-related parameters will be
+reported appropriately flipped as well.
+
+A multi-threaded algorithm is used for image flipping. The delay introduced
+by the algorithm depends on CPU performance. An Intel Xeon W-2123 processor can flip
+a 2048x2048 16-bit image in approximately 1ms.
+
+This parameter can be used together with #PARAM_FRAME_ROTATE. When both parameters
+are enabled, PVCAM uses an algorithm that processes the rotation/flipping combination
+using only one pass, keeping the performance withing 1-2ms on the same CPU.
+
+Data type: @c enum (@c #int32)
+
+@see #PL_FRAME_FLIP_MODES enum for all possible values.
+*/
+#define PARAM_HOST_FRAME_FLIP ((CLASS2<<16) + (TYPE_ENUM<<24) + 257)
+/** @deprecated. Use the #PARAM_HOST_FRAME_FLIP */
+#define PARAM_FRAME_FLIP (PARAM_HOST_FRAME_FLIP)
+/**
+@brief This parameter is used to enable or disable the host frame summing feature.
+
+Use the #PARAM_HOST_FRAME_SUMMING_COUNT to set the number of frames to sum and the
+#PARAM_HOST_FRAME_SUMMING_FORMAT to discover and set the desired frame output
+format. After setting up the acquisition with #pl_exp_setup_seq or #pl_exp_setup_cont,
+check the #PARAM_BIT_DEPTH_HOST and #PARAM_IMAGE_FORMAT_HOST to discover the
+correct output frame format. This format may differ from the native #PARAM_BIT_DEPTH
+and #PARAM_IMAGE_FORMAT.
+
+By enabling this feature, PVCAM will start summing incoming frames and provide
+an output frame for every N-th frame (defined by #PARAM_HOST_FRAME_SUMMING_COUNT).
+Please note that when sequences are used (#pl_exp_setup_seq), the number of frames in
+sequence may be limited. When M-frames are requested in #pl_exp_setup_seq function and
+N-frames are configured for summing, PVCAM has to internally acquire a total of MxN
+frames to deliver correct amount of frames to the host. The camera hardware signals
+will also correspond to the MxN count because the frame summing is done on the host
+side without any knowledge of the camera.
+
+Data type: @c #rs_bool
+
+@see #PARAM_BIT_DEPTH_HOST, #PARAM_IMAGE_FORMAT_HOST
+*/
+#define PARAM_HOST_FRAME_SUMMING_ENABLED ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 258)
+/**
+@brief This parameter is used to set the number of frames to sum.
+
+@see #PARAM_HOST_FRAME_SUMMING_ENABLED for details.
+
+Data type: @c #uns32
+*/
+#define PARAM_HOST_FRAME_SUMMING_COUNT ((CLASS2<<16) + (TYPE_UNS32<<24) + 259)
+/**
+@brief This parameter is used to set the desired output format for the summed frame.
+
+When host frame summing feature is enabled, this parameter can be used to set the
+desired output frame format. Depending on the average image intensity and dynamic
+range requirements, the output format can be widened as needed.
+For example, when summing 12-bit images, the output format may be set to 16-bit width,
+allowing to sum up to 16 saturated images into one. When wider dynamic range is required,
+the output format can be switched to 32-bit mode, allowing to sum up to 1M 12-bit frames
+without reaching the 32-bit saturation level.
+
+Data type: @c enum (@c #int32)
+
+@see #PARAM_HOST_FRAME_SUMMING_ENABLED and #PL_FRAME_SUMMING_FORMATS for details.
+*/
+#define PARAM_HOST_FRAME_SUMMING_FORMAT ((CLASS2<<16) + (TYPE_ENUM<<24) + 260)
+/**
+@brief This parameter is used to enable or disable the automated frame decompression
+feature.
+
+In general, applications do not have to support any of the compression-related parameters because
+decompression is automatically and seamlessly done by PVCAM. However, in specific cases the
+automatic decompression may be disabled. In such case, the application is expected to provide
+the frame decompression.
+
+Please note that when this parameter is disabled for cameras that require frame
+decompression, other *host* post processing parameters such as #PARAM_HOST_FRAME_ROTATE,
+#PARAM_HOST_FRAME_FLIP, #PARAM_HOST_FRAME_SUMMING_ENABLED and similar cannot be enabled because
+they require uncompressed pixels to work properly. The #pl_exp_setup_seq and #pl_exp_setup_cont
+functions will fail.
+
+@see #PARAM_IMAGE_COMPRESSION, #PARAM_IMAGE_COMPRESSION_HOST
+
+Data type: @c #rs_bool
+*/
+#define PARAM_HOST_FRAME_DECOMPRESSION_ENABLED ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 261)
+/**
+@brief Gain setting for the current speed choice.
+
+The valid range for a gain setting is reported via #ATTR_MIN and #ATTR_MAX,
+where the min. gain is usually 1 and the max. gain may be as high as 16. Values
+outside this range will be ignored. Note that gain setting may not be linear!
+Values 1-16 may not correspond to 1x-16x, and there are gaps between the
+values. However, when the camera is initialized and every time a new speed is
+selected, the system will always reset to run at a gain of 1x.
+
+After setting the parameter, the #PARAM_GAIN_NAME can be used to retrieve user-
+friendly description of the selected gain (if supported by camera).
+
+Data type: @c #int16
+
+@see @ref SpeedTable
+*/
+#define PARAM_GAIN_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 512)
+/**
+@brief Selects the sensor readout speed from a table of available choices.
+
+Entries are 0-based and the range of possible values is 0 to @c max_entries,
+where @c max_entries can be determined using #ATTR_MAX attribute. This setting
+relates to other speed table values, including #PARAM_BIT_DEPTH,
+#PARAM_PIX_TIME, #PARAM_READOUT_PORT, #PARAM_GAIN_INDEX and #PARAM_GAIN_NAME.
+After setting #PARAM_SPDTAB_INDEX, the gain setting is always reset to a value
+corresponding to 1x gain. To use a different gain setting, call #pl_set_param
+with #PARAM_GAIN_INDEX after setting the speed table index.
+
+After setting the parameter the #PARAM_SPDTAB_NAME can be used to retrieve user
+friendly description of the selected speed (if supported by camera).
+
+Data type: @c #int16
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_SPDTAB_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 513)
+/**
+@brief Name of the currently selected Gain (via #PARAM_GAIN_INDEX).
+
+Use #ATTR_AVAIL to check for the availability. The gain name has a maximum
+length of #MAX_GAIN_NAME_LEN and can be retrieved with the #ATTR_CURRENT
+attribute.
+
+Data type: @c char*
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_GAIN_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 514)
+/**
+@brief Name of the currently selected Speed (via #PARAM_SPDTAB_INDEX).
+
+Use #ATTR_AVAIL to check for the availability. The speed name has a maximum
+length of #MAX_SPDTAB_NAME_LEN and can be retrieved with the #ATTR_CURRENT
+attribute.
+
+Data type: @c char*
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_SPDTAB_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 515)
+/**
+@brief Sensor readout port being used by the currently selected speed.
+
+Different readout ports (used for alternate speeds) flip the image in serial,
+parallel, or both.
+
+Data type: @c enum (@c #int32)
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_READOUT_PORT ((CLASS2<<16) + (TYPE_ENUM<<24) + 247)
+/**
+@brief This is the actual speed for the currently selected speed choice.
+
+It returns the time for each pixel conversion, in nanoseconds. This value may
+change as other speed choices are selected.
+
+Data type: @c #uns16
+
+@see @ref SpeedTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_PIX_TIME ((CLASS2<<16) + (TYPE_UNS16<<24) + 516)
+
+/* SHUTTER PARAMETERS */
+
+/**
+@brief The shutter close delay.
+
+This is the number of milliseconds required for the shutter to close. Since physical
+shutters are no longer shipped or used with modern Teledyne Photometrics cameras, this
+signal can be used for controlling other devices such as light sources.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_CLOSE_DELAY ((CLASS2<<16) + (TYPE_UNS16<<24) + 519)
+/**
+@brief The shutter open delay.
+
+This is the number of milliseconds required for the shutter to open. Since physical
+shutters are no longer shipped or used with modern Teledyne Photometrics cameras, this
+signal can be used for controlling other devices such as light sources.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_OPEN_DELAY ((CLASS2<<16) + (TYPE_UNS16<<24) + 520)
+/**
+@brief The shutter opening condition.
+
+See #PL_SHTR_OPEN_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref ExposureLoops
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_OPEN_MODE ((CLASS2<<16) + (TYPE_ENUM <<24) + 521)
+/**
+@brief The state of the camera shutter.
+
+This is a legacy parameter not used with modern Teledyne Photometrics cameras.
+If the shutter is run too fast, it will overheat and trigger #SHTR_FAULT. The
+shutter electronics will disconnect until the temperature returns to a suitable
+range. Note that although the electronics have reset the voltages to open or
+close the shutter, there is a lag time for the physical mechanism to respond.
+See also #PARAM_SHTR_OPEN_DELAY and #PARAM_SHTR_CLOSE_DELAY.
+See #PL_SHTR_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_SHTR_STATUS ((CLASS2<<16) + (TYPE_ENUM <<24) + 522)
+
+/* I/O PARAMETERS */
+
+/**
+@brief Sets and gets the currently active I/O address.
+
+The number of available I/O addresses can be obtained using the #ATTR_COUNT.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_ADDR ((CLASS2<<16) + (TYPE_UNS16<<24) + 527)
+/**
+@brief Gets the type of I/O available at the current address.
+
+See #PL_IO_TYPE enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_TYPE ((CLASS2<<16) + (TYPE_ENUM<<24) + 528)
+/**
+@brief Gets the direction of the signal at the current address.
+
+See #PL_IO_DIRECTION enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_DIRECTION ((CLASS2<<16) + (TYPE_ENUM<<24) + 529)
+/**
+@brief Sets and gets the state of the currently active I/O signal.
+
+The new or return value when setting or getting the value respectively has
+different meanings depending on the I/O type:
+- #IO_TYPE_TTL - A bit pattern, indicating the current state (0 or 1) of each of
+ the control lines (bit 0 indicates line 0 state, etc.).
+- #IO_TYPE_DAC - The value of the desired analog output (only applies to
+ #pl_set_param).
+
+The minimum and maximum range for the signal can be obtained using the #ATTR_MIN
+and #ATTR_MAX attributes, respectively.
+
+When outputting signals, the state is the desired output. For example, when
+setting the output of a 12-bit DAC with a range of 0-5V to half-scale, the state
+should be 2.5 (volts), not 1024 (bits).
+
+Data type: @c #flt64
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_STATE ((CLASS2<<16) + (TYPE_FLT64<<24) + 530)
+/**
+@brief Gets the bit depth for the signal at the current address.
+
+The bit depth has different meanings, depending on the I/O Type:
+- #IO_TYPE_TTL - The number of bits read or written at this address.
+- #IO_TYPE_DAC - The number of bits written to the DAC.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_IO_BITDEPTH ((CLASS2<<16) + (TYPE_UNS16<<24) + 531)
+
+/* GAIN MULTIPLIER PARAMETERS */
+
+/**
+@brief Gain multiplication factor for cameras with multiplication gain
+functionality.
+
+The valid range is reported via #ATTR_MIN and #ATTR_MAX.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_GAIN_MULT_FACTOR ((CLASS2<<16) + (TYPE_UNS16<<24) + 537)
+/**
+@brief Gain multiplier on/off indicator for cameras with the multiplication gain
+functionality.
+
+This parameter is read-only and its value is always @c TRUE if it is available on the
+camera.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_GAIN_MULT_ENABLE ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 541)
+
+/* POST PROCESSING PARAMETERS */
+
+/**
+@brief This returns the name of the currently selected post-processing feature.
+
+The name is a null-terminated text string. User is responsible for buffer
+allocation with at least #MAX_PP_NAME_LEN bytes.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_FEAT_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 542)
+/**
+@brief This selects the current post-processing feature from a table of
+available choices.
+
+The entries are 0-based and the range of possible values is 0 to @c max_entries.
+@c max_entries can be determined with the #ATTR_MAX attribute. This setting
+relates to other post-processing table values, including #PARAM_PP_FEAT_NAME,
+#PARAM_PP_FEAT_ID and #PARAM_PP_PARAM_INDEX.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 543)
+/**
+@brief Gets the actual e/ADU for the current gain setting.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_ACTUAL_GAIN ((CLASS2<<16) + (TYPE_UNS16<<24) + 544)
+/**
+@brief This selects the current post-processing parameter from a table of
+available choices.
+
+The entries are 0-based and the range of possible values is 0 to @c max_entries.
+@c max_entries can be determined with the #ATTR_MAX attribute. This setting
+relates to other post-processing table values, including #PARAM_PP_PARAM_NAME,
+#PARAM_PP_PARAM_ID and #PARAM_PP_PARAM.
+
+Data type: @c #int16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_PARAM_INDEX ((CLASS2<<16) + (TYPE_INT16<<24) + 545)
+/**
+@brief Gets the name of the currently selected post-processing parameter for the
+currently selected post-processing feature.
+
+The name is a null-terminated text string. User is responsible for buffer
+allocation with at least #MAX_PP_NAME_LEN bytes.
+
+Data type: @c char*
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_PARAM_NAME ((CLASS2<<16) + (TYPE_CHAR_PTR<<24) + 546)
+/**
+@brief This gets or sets the post-processing parameter for the currently selected
+post-processing parameter at the index.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_PP_PARAM ((CLASS2<<16) + (TYPE_UNS32<<24) + 547)
+/**
+@brief Gets the read noise for the current speed.
+
+Data type: @c #uns16
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_READ_NOISE ((CLASS2<<16) + (TYPE_UNS16<<24) + 548)
+/**
+@brief This returns the ID of the currently-selected post-processing feature.
+
+This maps a specific post-processing module across cameras to help applications
+filter for camera features they need to expose and those that they don't. It
+helps to identify similarities between camera post-processing features.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_UNS32.
+*/
+#define PARAM_PP_FEAT_ID ((CLASS2<<16) + (TYPE_UNS16<<24) + 549)
+/**
+@brief This returns the ID of the currently selected post-processing parameter.
+
+This maps a specific post-processing parameter across cameras to help
+applications filter for camera features they need to expose and those that they
+don't. It helps to identify similarities between camera post-processing features.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_UNS32.
+*/
+#define PARAM_PP_PARAM_ID ((CLASS2<<16) + (TYPE_UNS16<<24) + 550)
+
+/* S.M.A.R.T. STREAMING PARAMETERS */
+
+/**
+@brief This parameter allows the user to retrieve or set the state of the
+S.M.A.R.T. streaming mode.
+
+When a @c TRUE is returned by the camera, S.M.A.R.T. streaming is enabled.
+
+Data type: @c #rs_bool
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+*/
+#define PARAM_SMART_STREAM_MODE_ENABLED ((CLASS2<<16) + (TYPE_BOOLEAN<<24) + 700)
+/**
+@brief This parameter allows the user to select between available S.M.A.R.T.
+streaming modes.
+
+See #PL_SMT_MODES enum for all possible values.
+Currently the only available mode is #SMTMODE_ARBITRARY_ALL.
+
+Data type: @c #uns16
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+*/
+#define PARAM_SMART_STREAM_MODE ((CLASS2<<16) + (TYPE_UNS16<<24) + 701)
+/**
+@brief This parameter allows to set or read the current exposure parameters for
+S.M.A.R.T. streaming.
+
+Data type: @c #smart_stream_type*
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+@note The parameter type is incorrectly defined. The actual type is TYPE_SMART_STREAM_TYPE_PTR.
+*/
+#define PARAM_SMART_STREAM_EXP_PARAMS ((CLASS2<<16) + (TYPE_VOID_PTR<<24) + 702)
+/**
+@brief This parameter allows to set or read the current delays between exposures
+in S.M.A.R.T. streaming.
+
+Data type: @c #smart_stream_type*
+
+@see @ref SmartStreaming
+@note The availability is camera-dependent.
+@note This parameter is currently not supported and #ATTR_AVAIL always returns
+@c FALSE.
+@note The parameter type is incorrectly defined. The actual type is TYPE_SMART_STREAM_TYPE_PTR.
+*/
+#define PARAM_SMART_STREAM_DLY_PARAMS ((CLASS2<<16) + (TYPE_VOID_PTR<<24) + 703)
+
+/* ACQUISITION PARAMETERS */
+
+/**
+@brief Used to examine and change the exposure time in VTM only.
+
+VTM is active if exposure mode is set to #VARIABLE_TIMED_MODE. This value is
+limited to 16-bit. For higher exposure times separate single frame acquisitions,
+or SMART streaming (if available), have to be used.
+
+Data type: @c #uns16
+*/
+#define PARAM_EXP_TIME ((CLASS3<<16) + (TYPE_UNS16<<24) + 1)
+/**
+@brief Gets the exposure resolution for the current resolution index.
+
+This parameter does exactly the same as #PARAM_EXP_RES_INDEX, but additionally
+provides human-readable string for each exposure resolution.
+
+For some older cameras this parameter might not be available (#ATTR_AVAIL
+returns @c FALSE). In this case camera uses #EXP_RES_ONE_MILLISEC resolution.
+
+Data type: @c enum (@c #int32)
+*/
+#define PARAM_EXP_RES ((CLASS3<<16) + (TYPE_ENUM<<24) + 2)
+/**
+@brief Gets and sets the index into the exposure resolution table.
+
+The table contains the resolutions supported by the camera. The value at this
+index is an enumerated type, representing different resolutions. The number of
+supported resolutions can be obtained using the #ATTR_COUNT attribute.
+See #PL_EXP_RES_MODES enum for all possible values.
+
+Data type: @c #uns16
+*/
+#define PARAM_EXP_RES_INDEX ((CLASS3<<16) + (TYPE_UNS16<<24) + 4)
+/**
+@brief Used to examine current exposure time and range of valid values.
+
+The minimum and maximum value could be limited by camera hardware. Use #ATTR_MIN
+and #ATTR_MAX to retrieve it. This parameter is always available, but for older
+cameras not reporting their limits, the min. value is set to 0 and max. value is
+set to max. 32-bit range for backward compatibility. This means the range is not
+known, which does not rule out exposure limits. In such case limits may be specified
+e.g. in camera manual. Please note the reported value unit depends on
+currently selected exposure resolution (#PARAM_EXP_RES).
+
+Data type: @c #ulong64
+*/
+#define PARAM_EXPOSURE_TIME ((CLASS3<<16) + (TYPE_UNS64<<24) + 8)
+
+/* PARAMETERS FOR BEGIN and END of FRAME Interrupts */
+
+/**
+@brief Enables and configures the BOF/EOF interrupts.
+
+See #PL_IRQ_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_BOF_EOF_ENABLE ((CLASS3<<16) + (TYPE_ENUM<<24) + 5)
+/**
+@brief Returns the Begin-Of-Frame and/or End-Of-Frame count.
+
+BOF/EOF counting is enabled and configured with #PARAM_BOF_EOF_ENABLE.
+
+Data type: @c #uns32
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_BOF_EOF_COUNT ((CLASS3<<16) + (TYPE_UNS32<<24) + 6)
+/**
+@brief Clears the BOF/EOF count when a #pl_set_param is performed.
+
+This is a write-only parameter.
+
+Data type: @c #rs_bool
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_BOF_EOF_CLR ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 7)
+
+/**
+@brief Tests to see if the hardware/software can perform circular buffer.
+
+When a @c TRUE is returned for #ATTR_AVAIL attribute, the circular buffer
+function can be used.
+
+Data type: @c #rs_bool
+*/
+#define PARAM_CIRC_BUFFER ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 299)
+/**
+@brief Retrieves the min, max, current and recommended (default) buffer size in
+bytes.
+
+Applies to currently configured acquisition. This parameter becomes
+available only after calling the #pl_exp_setup_seq or #pl_exp_setup_cont.
+For sequence acquisition, the attribute always reports the full sequence size in
+bytes. For circular buffer acquisition, use the #ATTR_DEFAULT to retrieve the
+recommended buffer size.
+
+Data type: @c #ulong64
+*/
+#define PARAM_FRAME_BUFFER_SIZE ((CLASS3<<16) + (TYPE_UNS64<<24) + 300)
+
+/* Binning reported by camera */
+
+/**
+@brief Used to obtain serial part of serial x parallel binning factors
+permutations.
+
+It has to be always used in pair with #PARAM_BINNING_PAR parameter.
+
+Data type: @c enum (@c #int32)
+
+@see @ref BinningDiscovery
+@note The availability is camera-dependent.
+*/
+#define PARAM_BINNING_SER ((CLASS3<<16) + (TYPE_ENUM<<24) + 165)
+/**
+@brief Used to obtain parallel part of serial x parallel binning factors
+permutations.
+
+It has to be always used in pair with #PARAM_BINNING_SER parameter.
+
+Data type: @c enum (@c #int32)
+
+@see @ref BinningDiscovery
+@note The availability is camera-dependent.
+*/
+#define PARAM_BINNING_PAR ((CLASS3<<16) + (TYPE_ENUM<<24) + 166)
+
+/* Parameters related to multiple ROIs and Centroids */
+
+/**
+@brief Parameter used to enable or disable the embedded frame metadata feature.
+
+Once enabled, the acquired frames will contain additional information describing
+the frame.
+
+Data type: @c #rs_bool
+
+@see @ref EmbeddedFrameMetadata
+@note The availability is camera-dependent.
+*/
+#define PARAM_METADATA_ENABLED ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 168)
+/**
+@brief Resets the camera-generated metadata timestamp.
+
+In normal operation, the timestamp is reset upon camera power up. Use this parameter
+to reset the timestamp when needed. This is a write-only paremeter, use #pl_set_param
+with @c TRUE value to reset the timestamp.
+
+Data type: @c #rs_bool
+
+@see @ref EmbeddedFrameMetadata
+@note The availability is camera-dependent.
+*/
+#define PARAM_METADATA_RESET_TIMESTAMP ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 176)
+/**
+@brief The number of currently configured ROIs.
+
+The #ATTR_CURRENT returns the currently configured number of ROIs set via
+#pl_exp_setup_seq or #pl_exp_setup_cont functions. The #ATTR_MAX can be used to
+retrieve the maximum number of ROIs the camera supports.
+
+Data type: @c #uns16
+*/
+#define PARAM_ROI_COUNT ((CLASS3<<16) + (TYPE_UNS16 <<24) + 169)
+/**
+@brief Gets or sets the current ROI.
+
+This parameter returns the current ROI that was configured through the
+#pl_exp_setup_seq or #pl_exp_setup_cont functions. If multiple ROIs were
+configured, this parameter returns the first one.
+If the camera supports live ROI feature, the parameter is used to send the live
+ROI to the camera.
+
+Data type: @c #rgn_type
+*/
+#define PARAM_ROI ((CLASS3<<16) + (TYPE_RGN_TYPE<<24) + 1)
+
+/**
+@brief This parameter is used to enable or disable the Centroids/Object detection
+feature.
+
+Use the #PARAM_CENTROIDS_MODE to retrieve a list of camera supported
+object detection modes.
+
+Data type: @c #rs_bool
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_ENABLED ((CLASS3<<16) + (TYPE_BOOLEAN<<24) + 170)
+/**
+@brief This parameter is used to set the Centroid radius.
+
+This read-write parameter is used to obtain the range of Centroids radii the
+camera supports. Use the #ATTR_MIN and #ATTR_MAX to retrieve the range.
+
+The radius defines the distance from the center pixel. For example, if the camera
+reports the radius range between 1 and 5, it means that the resulting ROIs can be
+configured to the following sizes: 1=3x3, 2=5x5, 3=7x7, 4=9x9, 5=11x11.
+
+The parameter interpretation also depends on the selected Centroid/Object detection
+mode. In some modes, the radius is used to set the size of the 'object' to be detected.
+
+Use #pl_set_param to set the desired Centroids radius. Once set, make sure to
+reconfigure the acquisition with #pl_exp_setup_seq or #pl_exp_setup_cont
+functions.
+
+Data type: @c #uns16
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_RADIUS ((CLASS3<<16) + (TYPE_UNS16 <<24) + 171)
+/**
+@brief This parameter is used to control the number of Centroids.
+
+This read-write parameter is used to obtain the maximum supported number of
+Centroids and set the desired number of Centroids to the camera.
+
+The camera usually supports a limited number of Centroids/objects to be detected.
+Use this parameter to limit the number of objects to be detected. For example, in
+particle tracking mode, the parameter will limit number of particles to be tracked
+- if the camera finds more particles than the current limit, the remaining particles
+will be ignored.
+
+Data type: @c #uns16
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_COUNT ((CLASS3<<16) + (TYPE_UNS16 <<24) + 172)
+/**
+@brief This parameter is used to retrieve and control the camera Centroid/Object
+detection modes.
+
+In case the camera supports centroids, but reports this parameter as not
+available, only the #PL_CENTROIDS_MODE_LOCATE feature is supported.
+See #PL_CENTROIDS_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_MODE ((CLASS3<<16) + (TYPE_ENUM <<24) + 173)
+/**
+@brief Supported Centroids background frame processing count.
+
+This allows the camera to report supported selections for number of frames for
+dynamic background removal. The processing is optimized only for the selected set
+of frames. Thus there is no related enumeration type with supported values for this
+parameter.
+
+Data type: @c enum (@c #int32)
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_BG_COUNT ((CLASS3<<16) + (TYPE_ENUM <<24) + 174)
+/**
+@brief Used to configure threshold multiplier for specific object detection modes.
+
+For 'particle tracking' mode, the value is a fixed-point real number in Q8.4 format.
+E.g. the value 1234 (0x4D2) means 77.2 (0x4D hex = 77 dec).
+
+Data type: @c #uns32
+
+@see @ref Centroids
+@note The availability is camera-dependent.
+*/
+#define PARAM_CENTROIDS_THRESHOLD ((CLASS3<<16) + (TYPE_UNS32 <<24) + 175)
+
+/* Parameters related to triggering table */
+
+/**
+@brief Used to select the output signal to be configured.
+
+The configuration of number of active outputs is done via
+#PARAM_LAST_MUXED_SIGNAL parameter.
+See #PL_TRIGTAB_SIGNALS enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@see @ref TriggeringTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_TRIGTAB_SIGNAL ((CLASS3<<16) + (TYPE_ENUM<<24) + 180)
+/**
+@brief Used to set the number of active output signals.
+
+The set number of signals is used by multiplexer for the signal selected
+by #PARAM_TRIGTAB_SIGNAL parameter.
+
+Data type: @c #uns8
+
+@see @ref TriggeringTable
+@note The availability is camera-dependent.
+*/
+#define PARAM_LAST_MUXED_SIGNAL ((CLASS3<<16) + (TYPE_UNS8<<24) + 181)
+/**
+@brief Deals with frame delivery modes.
+
+This parameter allows to switch among various frame delivery modes.
+If not available, camera runs in #PL_FRAME_DELIVERY_MODE_MAX_FPS mode.
+See #PL_FRAME_DELIVERY_MODES enum for all possible values.
+
+Data type: @c enum (@c #int32)
+
+@note The availability is camera-dependent.
+*/
+#define PARAM_FRAME_DELIVERY_MODE ((CLASS3<<16) + (TYPE_ENUM <<24) + 400)
+
+/** @} */ /* grp_pm_parameters */
+
+/******************************************************************************/
+/* End of parameter ID definitions. */
+/******************************************************************************/
+
+/******************************************************************************/
+/* Start of function prototypes. */
+/******************************************************************************/
+
+#ifndef PV_EMBEDDED
+
+/**
+@defgroup grp_pm_deprecated_functions Deprecated functions
+@ingroup grp_pm_deprecated
+These functions are included for compatibility reasons.
+*/
+
+/**
+@defgroup grp_callbacks Callbacks
+
+Use these callback function signatures with corresponding callback registering
+functions to register for various camera notifications.
+
+C++ code example:
+(Proper error handling and other camera initialization omitted for clarity)
+@code{.cpp}
+void MyCamera::initialize()
+{
+ // Register for the End-Of-Frame notifications, passing 'this' as a context
+ // in order to properly forward the notification to this class.
+ pl_cam_register_callback_ex3(m_hCam, PL_CALLBACK_EOF, (void*)pvcamCallbackEofEx3, this);
+}
+void MyCamera::handleEofCallback(const FRAME_INFO* pFrameInfo)
+{
+ uns16* pFrameData = NULL;
+ pl_exp_get_latest_frame(m_hCam, (void**)&pFrameData);
+ // The displayFrame() should not do any lengthy processing, we need to
+ // release the callback routine as quickly as possible.
+ displayFrame(pFrameData, pFrameInfo);
+}
+
+// Using the PL_CALLBACK_SIG_EX3 function signature. This function is declared
+// as static in the header file.
+void PV_DECL MyCamera::pvcamCallbackEofEx3(const FRAME_INFO* pFrameInfo, void* pContext)
+{
+ MyCamera* pCamera = static_cast(pContext);
+ pCamera->handleEofCallback(pFrameInfo);
+}
+@endcode
+
+@{
+*/
+
+/**
+A callback function signature for the #pl_cam_register_callback function.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_LEGACY)(void);
+
+/**
+A callback function signature for the #pl_cam_register_callback_ex function.
+
+@param[in] pContext A pointer to the user defined context that was previously
+ passed into the #pl_cam_register_callback_ex function.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_EX)(void* pContext);
+
+/**
+A callback function signature for the #pl_cam_register_callback_ex2 function.
+
+@param[in] pFrameInfo A pointer to a FRAME_INFO structure uniquely identifying
+ the incoming frame.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_EX2)(const FRAME_INFO* pFrameInfo);
+
+/**
+A callback function signature for the #pl_cam_register_callback_ex3 function.
+
+@param[in] pFrameInfo A pointer to a FRAME_INFO structure uniquely identifying
+ the incoming frame.
+@param[in] pContext A pointer to the user defined context that was previously
+ passed into the #pl_cam_register_callback_ex3 function.
+*/
+typedef void (PV_DECL *PL_CALLBACK_SIG_EX3)(const FRAME_INFO* pFrameInfo, void* pContext);
+
+/** @} */ /* grp_callbacks */
+
+#ifdef PV_C_PLUS_PLUS
+extern "C"
+{
+#endif
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Camera Communications Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@defgroup grp_pm_functions Functions
+*/
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Returns the PVCAM version number.
+
+The version is a highly formatted hexadecimal number of the style:
+
+| High byte | Low | byte |
+|:------------:|--------------:|:---------------|
+| | High nibble | Low nibble |
+| Major version| Minor version | Trivial version|
+
+For example, the number 0x11F1 indicates major release 17, minor release 15, and
+trivial change 1. A major release is defined as anything that alters the interface,
+calling sequence, parameter list, or interpretation of any function in the library.
+This includes new functions and alterations to existing functions, but it does not
+include alterations to the optional libraries, which sit on top of PVCAM
+(each optional library includes its own, independent version number). A new major release
+often requires a change in the PVCAM library, but wherever possible, major releases
+are backwards compatible with earlier releases. A minor release should be completely
+transparent to higher-level software (PVCAM) but may include internal enhancements.
+The trivial version is reserved for use by the software staff to keep track of extremely
+minor variations. The last digit is used for build numbers and should be ignored. Minor
+and trivial releases should require no change in the calling software.
+
+@param[out] pvcam_version Version number of PVCAM installer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see #PARAM_DD_VERSION
+*/
+rs_bool PV_DECL pl_pvcam_get_ver(uns16* pvcam_version);
+
+/**
+@brief Opens and initializes the library.
+
+The PVCAM library requires significant system resources: memory, hardware access, etc.
+#pl_pvcam_init prepares these resources for use, as well as allocating whatever static
+memory the library needs. Until #pl_pvcam_init is called, every PVCAM function
+(except for the error reporting functions) will fail and return an error message
+that corresponds to "library has not been initialized".
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@note If this call fails, #pl_error_code contains the code that lists the reason for failure.
+
+@see pl_pvcam_uninit, pl_cam_open, pl_error_code
+*/
+rs_bool PV_DECL pl_pvcam_init(void);
+
+/**
+@brief Closes the library, closes all devices, frees memory.
+
+This function releases all system resources that #pl_pvcam_init acquired.
+It also searches for all cameras that the user has opened. If it finds any,
+it will close them before exiting.
+It will also unlock and free memory, and clean up after itself as much as possible.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_pvcam_init, pl_cam_close, pl_error_code
+
+@warning If hardware is involved in acquiring data, the system may not be
+able to disconnect immediately.
+*/
+rs_bool PV_DECL pl_pvcam_uninit(void);
+
+/** @} */ /* grp_pm_functions */
+
+/**
+@addtogroup grp_pm_deprecated_functions
+@{
+*/
+DEPRECATED rs_bool PV_DECL pl_cam_check(int16 hcam);
+/** @} */ /* grp_pm_deprecated_functions */
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Frees the current camera, prepares it for power-down.
+
+This function has two effects. First, it removes the listed camera from
+the reserved list, allowing other users to open and use the hardware.
+Second, it performs all cleanup, close-down, and shutdown preparations needed
+by the hardware. A camera can only be closed if it was previously opened.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_open, pl_pvcam_init, pl_pvcam_uninit
+
+@note #pl_pvcam_uninit automatically calls the #pl_cam_close on all cameras opened by
+the current user.
+*/
+rs_bool PV_DECL pl_cam_close(int16 hcam);
+
+/**
+@brief Returns the name of a camera.
+
+This function allows users to learn the string identifier associated with every
+camera on the current system. This is a companion to the #pl_cam_get_total function.
+cam_num input can run from 0 to (@c totl_cams-1), inclusive. The user must pass in
+a string that is at least #CAM_NAME_LEN characters long, #pl_cam_get_name then fills
+that string with an appropriate null-terminated string. @c camera_name can be passed
+directly into the #pl_cam_open function. It has no other use, aside from providing
+a brief description of the camera.
+
+@param[in] cam_num Camera number Range: 0 through (@c totl_cams-1).
+@param[out] camera_name Text name assigned to a camera (with RSConfig).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_get_total, pl_cam_open, pl_cam_close
+
+@note This call reports the names of all cameras on the system, even if all the cameras
+are not available. If the hardware is turned off, or if another user has a camera open,
+the camera name is reported, but the camera will not be available. #pl_cam_get_name returns
+a name and #pl_cam_open gives information on availability of that camera.
+To build a complete list of every camera on the system, it is necessary to cycle through
+all the entries as shown below:
+@code{.cpp}
+int total_cameras;
+char name[CAM_NAME_LEN];
+...
+pl_cam_get_total(&total_cameras);
+for (i = 0; i < total_cameras; i++) {
+ pl_cam_get_name(i, name);
+ printf("Camera %d is called '%s'\n", i, name);
+}
+@endcode
+*/
+rs_bool PV_DECL pl_cam_get_name(int16 cam_num, char* camera_name);
+
+/**
+@brief Returns the number of cameras attached to the system.
+
+This function reports the number of cameras on the system.
+All the listed cameras may not be available on multi-tasking systems, some cameras
+may already be in use by other users. A companion function #pl_cam_get_name can
+be used to get the string identifier associated with each camera.
+
+@param[out] totl_cams Total number of cameras in the system.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_get_name, pl_cam_open, pl_cam_close
+
+@note This function actually searches for all device drivers on the system, without
+checking hardware. The list of cameras is obtained during #pl_pvcam_init. Thus, if a new camera
+(new device driver) is added after the library was opened, the system won't know that the new
+camera is there. The system will also not notice if a camera is removed. (Obviously, this is
+only important on multi-tasking systems). A cycle of @c uninit / @c init regenerates the list of available
+cameras, updating the system for any additions or deletions.
+*/
+rs_bool PV_DECL pl_cam_get_total(int16* totl_cams);
+
+/**
+@brief Reserves and initializes the camera hardware.
+
+The string @a camera_name should be identical to one of the valid camera names returned by #pl_cam_get_name.
+If the name is valid, #pl_cam_open completes a short set of checks and diagnostics as it attempts
+to establish communication with the camera electronics unit. If successful, the camera is opened
+and a valid camera handle is passed back in hcam. Otherwise, #pl_cam_open returns with a failure.
+An explanation is shown in #pl_error_code.
+
+The @a o_mode setting controls the mode under which the camera is opened.
+Currently, the only possible choice is #OPEN_EXCLUSIVE. On multi-user systems, opening a camera
+under the exclusive mode reserves it for the current user, locking out all other users on the
+system. If #pl_cam_open is successful, the user has exclusive access to that camera until the camera
+is closed or #pl_pvcam_uninit is called.
+
+@param[in] camera_name Text name assigned to a camera (via legacy RSConfig tool if available).
+@param[out] hcam Camera handle returned from #pl_cam_open.
+@param[in] o_mode Mode to open the camera in (must be #OPEN_EXCLUSIVE).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_get_name, pl_cam_get_total, pl_cam_close, pl_pvcam_init, pl_pvcam_uninit
+
+@warning Despite the above paragraph, a successful #pl_cam_open does not mean that the camera
+is in working order. It does mean that you can communicate with the device driver associated
+with the camera. After a successful #pl_cam_open, call #pl_error_message, which reports any error
+conditions.
+*/
+rs_bool PV_DECL pl_cam_open(char* camera_name, int16* hcam, int16 o_mode);
+
+/** @} */ /* grp_pm_functions */
+
+/**
+@addtogroup grp_pm_deprecated_functions
+@{
+*/
+DEPRECATED rs_bool PV_DECL pl_cam_register_callback(int16 hcam, int32 callback_event,
+ void* callback);
+DEPRECATED rs_bool PV_DECL pl_cam_register_callback_ex(int16 hcam, int32 callback_event,
+ void* callback, void* context);
+DEPRECATED rs_bool PV_DECL pl_cam_register_callback_ex2(int16 hcam, int32 callback_event,
+ void* callback);
+/** @} */ /* grp_pm_deprecated_functions */
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Installs a handler function that will be called when an event occurs in a camera
+providing information about frame via #FRAME_INFO type and with user context information.
+
+This function combines functionality provided by #pl_cam_register_callback_ex
+and #pl_cam_register_callback_ex2.
+
+Use this API call to install a function that will be called when the specified event
+occurs providing additional frame information. Input parameter of the callback function
+must be of #FRAME_INFO* type in order to receive information about the frame
+(timestamp with precision of 0.1ms, frame counter number, ID (handle) of the camera that
+produced the frame). Also, pointer to a context that will be echoed back when the callback
+is invoked can be passed to PVCAM in this function.
+
+#### Example of Callback function:
+
+@code{.cpp}
+void EOFCallbackHandler(FRAME_INFO* pFrameInfo, void* pContext)
+{
+ const int32 frameNr = pFrameInfo->FrameNr;
+ const long64 frameTime = pFrameInfo->TimeStamp;
+ const int16 camID = pFrameInfo->hCam;
+ // Display or process frame info etc.
+ if (*(int16*)pContext == hCamera1)
+ EOFCountCamera1++;
+ else if (*(int16*)pContext == hCamera2)
+ EOFCountCamera2++;
+}
+@endcode
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] callback_event Callback event to register for (see #PL_CALLBACK_EVENT).
+@param[out] callback Callback function pointer.
+@param[out] context Pointer to custom user context.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_deregister_callback
+
+@warning #pl_exp_finish_seq must be called if acquiring in sequential mode
+(using #pl_exp_setup_seq and #pl_exp_start_seq) with callback notification after all frames are
+read out and before new exposure is started by calling #pl_exp_start_seq.
+Not all callbacks will be available for all camera systems/interfaces.
+
+@note Only #PL_CALLBACK_BOF and #PL_CALLBACK_EOF are fully supported by all camera types.
+Do not use other callback types in generic-purpose software.
+*/
+rs_bool PV_DECL pl_cam_register_callback_ex3(int16 hcam, int32 callback_event,
+ void* callback, void* context);
+
+/**
+@brief Uninstalls a handler function for camera system event.
+
+Use this API call to uninstall a function for the specified camera system event.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] callback_event Callback event to register for (see #PL_CALLBACK_EVENT).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_cam_register_callback, pl_cam_register_callback_ex, pl_cam_register_callback_ex2,
+pl_cam_register_callback_ex3.
+
+@note Only #PL_CALLBACK_BOF and #PL_CALLBACK_EOF are fully supported by all camera types.
+Do not use other callback types in generic-purpose software.
+See callback descriptions section under #pl_cam_register_callback_ex3 for details.
+*/
+rs_bool PV_DECL pl_cam_deregister_callback(int16 hcam, int32 callback_event);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Error Reporting Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@brief Returns the most recent error condition.
+
+As every PVCAM function begins, it resets the error code to 0.
+If an error occurs later in the function, the error code is set to a corresponding
+value.
+
+For details about correct handling see @ref ApiErrors section.
+
+@return The current error code. Note that a call to #pl_error_code does not
+reset the error code.
+
+@see pl_error_message
+
+@note #pl_error_code works even before #pl_pvcam_init is called.
+This allows a message to be returned if #pl_pvcam_init fails.
+
+@warning The PVCAM library does not intercept signals. Errors that interrupt
+the normal process (divide by zero, etc.) may cause the software to crash,
+and #pl_error_code may or may not contain useful information.
+*/
+int16 PV_DECL pl_error_code(void);
+
+/**
+@brief Returns a string explaining input error code.
+
+This function fills in the character string msg with a message that corresponds
+to the value in @a err_code. The msg string is allocated by the user, and should be
+at least #ERROR_MSG_LEN elements long.
+
+For details about correct handling see @ref ApiErrors section.
+
+@param[in] err_code Unique ID of the error: returned from #pl_error_code.
+@param[out] msg Text description of err_code.
+
+@return Returns #PV_OK if a message corresponding to the input code is found and
+#PV_FAIL if the code does not have a corresponding message
+(@a msg will be filled with the string "Unknown error").
+Even if a #PV_FAIL is returned, the value of #pl_error_code is not altered.
+
+@see pl_error_code
+
+@note #pl_error_message works even before #pl_pvcam_init is called.
+This allows a message to be printed if #pl_pvcam_init fails.
+All error messages are standalone sentences without ending period having error
+code name appended in parenthesis.
+*/
+rs_bool PV_DECL pl_error_message(int16 err_code, char* msg);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Configuration/Setup Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@brief Returns the requested attribute for a PVCAM parameter.
+
+This function returns the requested attribute for a PVCAM parameter.
+
+@a param_id is an enumerated type that indicates the parameter in question.
+@a param_value points to the value of the requested attribute for the parameter.
+It is a @c void* because it can be of different data types. The user is responsible
+for passing in the correct data type (see attribute descriptions that follow).
+@a param_attribute is used to retrieve characteristics of the parameter.
+See #PL_PARAM_ATTRIBUTES for possible values for @a param_attribute.
+
+Reading of values for attributes #ATTR_AVAIL, #ATTR_ACCESS and #ATTR_TYPE should
+always succeed and return correct value. Values of other attributes can be read
+only if #ATTR_ACCESS reports either #ACC_READ_ONLY or #ACC_READ_WRITE.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] param_attribute Attribute of the parameter to get (ATTR_...).
+@param[out] param_value Value to get or set.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_set_param, pl_get_enum_param
+
+@note The data type of @a param_value is documented in pvcam.h for each param_id.
+*/
+rs_bool PV_DECL pl_get_param(int16 hcam, uns32 param_id,
+ int16 param_attribute, void* param_value);
+
+/**
+@brief Sets the current value for a PVCAM parameter.
+
+This function sets the current value for a PVCAM parameter.
+
+@a param_id is an enumerated type that indicates the parameter in question.
+@a param_value points to the new value of the parameter. For the enumerated type,
+this value is the value assigned to current enum item, not the item index.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] param_value Value to get or set.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_get_param, pl_get_enum_param
+
+@note The data type of @a param_value is documented in pvcam.h for each @a param_id.
+It can be retrieved using the #pl_get_param function and #ATTR_TYPE attribute.
+The user should call the #pl_get_param function with the attribute #ATTR_ACCESS
+to verify that the parameter ID is writable (settable) before calling the #pl_set_param
+function.
+*/
+rs_bool PV_DECL pl_set_param(int16 hcam, uns32 param_id, void* param_value);
+
+/**
+@brief Returns the enumerated value of the parameter param_id at index.
+
+This function will return the enumerated value of the parameter param_id at index.
+It also returns a string associated with the enumerated type (desc).
+@b length indicates the maximum length allowed for the returned description.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] index Index of enumeration Range: 0 through N-1 ... where N
+ is retrieved with get_param(...,#ATTR_COUNT,...).
+@param[out] value Numerical value of enumeration.
+@param[out] desc Text description of enumeration.
+@param[in] length Length of text description of enumeration.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_get_param, pl_set_param, pl_enum_str_length
+
+@note The user should call the #pl_get_param function with the attribute #ATTR_TYPE,
+to verify that the parameter ID is an enumerated data type before calling the #pl_get_enum_param.
+The user should also call the #pl_get_param function with the attribute #ATTR_COUNT to
+determine how many valid enumerated values the parameter ID has.
+Example: Suppose there is a parameter for camera readout speed. This parameter can be set to 1MHz,
+5MHz or 10MHz with the appropriate values 1, 5 and 10. If the readout speed is currently set to 5MHz,
+a call to #pl_get_param with #ATTR_CURRENT returns a value of 5.
+A call to #pl_get_enum_param for the readout speed parameter at index 1 (the second item)
+returns the enumerated type 5MHz with the value equal to 5 and the desc would contain "5MHz".
+*/
+rs_bool PV_DECL pl_get_enum_param(int16 hcam, uns32 param_id, uns32 index,
+ int32* value, char* desc, uns32 length);
+
+/**
+@brief Returns the length of the descriptive string for the parameter @a param_id at index.
+
+This function will return the length (length) of the descriptive string for the parameter
+@a param_id at index. The length includes the terminating null ('\0') character.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] param_id ID of the parameter to get or set (PARAM_...).
+@param[in] index Index of enumeration Range: 0 through N-1, where N
+ is retrieved with get_param(..., ATTR_COUNT, ...).
+@param[out] length Length of text description of enumeration.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_get_enum_param
+
+@note This function can be used to determine the amount of memory to allocate for
+the descriptive string when calling the #pl_get_enum_param function. Using the example
+in #pl_get_enum_param, the length returned would be 5 (4 printable characters plus 1 null character).
+*/
+rs_bool PV_DECL pl_enum_str_length(int16 hcam, uns32 param_id, uns32 index,
+ uns32* length);
+
+/**
+@brief This function will reset all post-processing modules to their default values.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@warning Fails if post-processing modules are not available in the current camera or
+if @a hcam is not the handle of an open camera.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see PARAM_PP_FEAT_NAME, PARAM_PP_PARAM_INDEX, PARAM_PP_PARAM_NAME, PARAM_PP_PARAM,
+PARAM_PP_FEAT_ID, PARAM_PP_PARAM_ID
+*/
+rs_bool PV_DECL pl_pp_reset(int16 hcam);
+
+/**
+@brief Creates and allocates variable of smart_stream_type type with the number of
+entries passed in via the entries parameter and returns pointer to it.
+
+This function will create a variable of smart_stream_type type and return a pointer
+to access it. The entries parameter passed by the user determines how many entries
+the structure will contain.
+
+@param[out] array Created struct to be returned.
+@param[in] entries Number of entries to be in smart stream struct.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_release_smart_stream_struct
+*/
+rs_bool PV_DECL pl_create_smart_stream_struct(smart_stream_type** array,
+ uns16 entries);
+
+/**
+@brief Frees the space previously allocated by the #pl_create_smart_stream_struct function.
+
+This function will deallocate a smart_stream_type variable created by
+#pl_create_smart_stream_struct.
+
+@param[in] array Struct to be released.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_create_smart_stream_struct
+*/
+rs_bool PV_DECL pl_release_smart_stream_struct(smart_stream_type** array);
+
+/**
+@brief Creates and allocates variable of #FRAME_INFO type and returns pointer to it.
+
+This function will create a variable of #FRAME_INFO type and
+return a pointer to access it. The GUID field of the #FRAME_INFO structure is assigned
+by this function. Other fields are updated by PVCAM at the time of frame reception.
+
+@param[out] new_frame Frame info struct to be returned.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_release_frame_info_struct, pl_exp_get_latest_frame_ex, pl_exp_get_oldest_frame_ex,
+pl_exp_check_cont_status_ex, pl_cam_register_callback_ex2, pl_cam_register_callback_ex3
+*/
+rs_bool PV_DECL pl_create_frame_info_struct(FRAME_INFO** new_frame);
+
+/**
+@brief Deletes variable of #FRAME_INFO type.
+
+This function will deallocate #FRAME_INFO variable created by #pl_create_frame_info_struct.
+
+@param[in] frame_to_delete Frame info struct to be released.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_create_frame_info_struct, pl_exp_get_latest_frame_ex, pl_exp_get_oldest_frame_ex,
+pl_exp_check_cont_status_ex, pl_cam_register_callback_ex2, pl_cam_register_callback_ex3
+*/
+rs_bool PV_DECL pl_release_frame_info_struct(FRAME_INFO* frame_to_delete);
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Data Acquisition Function Prototypes */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@brief Prepares the camera to perform a readout.
+
+This function uses the array of regions, exposure mode, and exposure
+time passed in and transmits them to the camera.
+@a exp_total specifies the number of images to take.
+The pointer @a rgn_array points to @a rgn_total region definitions, @a exp_mode specifies
+the bitwise OR combination of exposure mode and expose out mode (see chapter Extended
+Exposure Modes), @a exposure_time specifies the exposure time in the currently
+selected exposure time resolution (see #PARAM_EXP_RES and #PARAM_EXP_RES_INDEX).
+The pointer @a exp_bytes points to a variable that will be filled with number of bytes
+in the pixel stream. The settings are then uploaded to the camera. If there is any
+problem (overlapping regions or a frame-transfer setting for a camera that lacks that
+capability), this function aborts and returns with a failure. #pl_error_code indicates
+the definition problem. The @a exp_bytes pointer is filled with the number of bytes of
+memory needed to buffer the full sequence. (It is the developer's responsibility to
+allocate a memory buffer for the pixel stream.)
+When this function returns, the camera is ready to begin the exposure. #pl_exp_start_seq
+initiates exposure and readout.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] exp_total Total number of exposures to take.
+@param[in] rgn_total Total number of regions defined for each image.
+@param[in] rgn_array Array of regions (must be rgn_total in size).
+ See rgn_type for details.
+@param[in] exp_mode Mode for capture (an OR-ed combination of #PL_EXPOSURE_MODES
+ and #PL_EXPOSE_OUT_MODES, if applicable).
+@param[in] exposure_time Time to expose in selected exposure resolution.
+ Default is milliseconds (see #PARAM_EXP_RES).
+@param[out] exp_bytes Value returned from PVCAM specifying the required
+ number of bytes to allocate for the capture.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_abort, pl_exp_check_status, pl_exp_start_seq, pl_exp_finish_seq
+
+@note This function uploads new settings to the camera. After receiving the settings, the camera
+merely waits in an idle state. The #pl_exp_abort command may be used to place the camera
+into some other state, such as continuous clearing, but this will not alter or affect
+the uploaded settings. Essentially, the camera is still holding the exposure sequence
+and waiting to start, while it clears the sensor charge.
+Also, please note that PVCAM internally checks whether configuration needs to be sent to the camera.
+If there is no difference in the camera configuration from the previous "setup" and other acquisition
+parameters have not changed in the meantime, the PVCAM will not resend the configuration. This may
+lead to shorter execution times of this function and faster start of the subsequent acquisition.
+*/
+rs_bool PV_DECL pl_exp_setup_seq(int16 hcam, uns16 exp_total, uns16 rgn_total,
+ const rgn_type* rgn_array, int16 exp_mode,
+ uns32 exposure_time, uns32* exp_bytes);
+
+/**
+@brief Begins exposing, returns immediately.
+
+This is a companion function to #pl_exp_setup_seq. #pl_exp_setup_seq
+must be called first to define the exposure and program this information into the camera.
+After that, #pl_exp_start_seq may be called one or more times. Each time it is called,
+it starts one sequence and returns immediately (a sequence may be one or more exposures).
+Progress can be monitored through #pl_exp_check_status. The next sequence may be started
+as soon as the readout has finished or an abort has been performed (#pl_exp_abort).
+
+The @a hcam parameter defines which camera is used.
+The user must allocate an appropriately sized memory buffer for data collection, pointed to
+by @a pixel_stream. This buffer must be at least @c exp_bytes bytes, where @c exp_bytes
+is the value returned from #pl_exp_setup_seq.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] pixel_stream Buffer to hold image(s).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_check_status, pl_exp_setup_seq, pl_exp_finish_seq
+*/
+rs_bool PV_DECL pl_exp_start_seq(int16 hcam, void* pixel_stream);
+
+/**
+@brief Sets circular buffer mode.
+
+This function sets the mode of operation for the circular buffer.
+This function uses the array of regions, exposure mode, exposure time passed in,
+and circular buffer mode and transmits them to the camera.
+The pointer @a rgn_array points to @a rgn_total region definitions.
+@a exp_mode specifies the bitwise OR combination of the exposure mode and expose out mode.
+@a exposure_time specifies the exposure time in the currently selected exposure time resolution
+(see #PARAM_EXP_RES and #PARAM_EXP_RES_INDEX). The pointer @a exp_bytes points to a variable that
+will be filled with number of bytes in the pixel stream.
+@a buffer_mode can be set to either #CIRC_OVERWRITE or #CIRC_NO_OVERWRITE. This function must be called
+before calling #pl_exp_start_cont.
+
+The settings are then downloaded to the camera. If there is any problem (overlapping regions
+or a frame-transfer setting for a camera that lacks that capability), this function aborts and
+returns with a failure. #pl_error_code indicates the definition problem.
+The @a exp_bytes pointer is filled with the number of bytes of memory needed to buffer the full
+sequence. (It is the developer's responsibility to allocate a memory buffer for the pixel stream.)
+When this function returns, the camera is ready to begin the exposure. #pl_exp_start_cont initiates
+exposure and readout.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] rgn_total Total number of regions defined for each image.
+@param[in] rgn_array Array of regions (must be rgn_total in size).
+ See rgn_type for details.
+@param[in] exp_mode Mode for capture (an OR-ed combination of #PL_EXPOSURE_MODES
+ and #PL_EXPOSE_OUT_MODES, if applicable).
+@param[in] exposure_time Time to expose in selected exposure resolution units.
+ Default is milliseconds (see #PARAM_EXP_RES).
+@param[out] exp_bytes Value returned from PVCAM specifying the required
+ number of bytes to allocate for the capture.
+@param[in] buffer_mode Circular buffer mode (#CIRC_OVERWRITE, #CIRC_NO_OVERWRITE).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see if the system can
+perform circular buffer operations. The circular buffer is passed to #pl_exp_start_cont.
+The buffer is allocated by your application.
+*/
+rs_bool PV_DECL pl_exp_setup_cont(int16 hcam, uns16 rgn_total,
+ const rgn_type* rgn_array, int16 exp_mode,
+ uns32 exposure_time, uns32* exp_bytes,
+ int16 buffer_mode);
+
+/**
+@brief Begins continuous readout into circular buffer.
+
+This function will initiate a continuous readout from the camera into a circular buffer.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] pixel_stream Buffer to hold image(s).
+@param[in] size Size of continuous capture pixel_stream
+ (must be a multiple of @c byte_cnt).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame,
+pl_exp_get_latest_frame, pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note If @a pixel_stream points to a buffer that is not an integer-multiple of the frame size
+for the exposure, this function will return #PV_FAIL and set an appropriate error
+code in #pl_error_code. For example, a buffer size of 1000 bytes with a frame size of 250 bytes is OK,
+but a buffer size of 900 bytes would cause a failure.
+Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to check to see if the system can
+perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_start_cont(int16 hcam, void* pixel_stream, uns32 size);
+
+/**
+@brief Sends a software trigger to the device.
+
+In order to use the software trigger, following preconditions must be met:
+ - Acquisition has been configured via a call to #pl_exp_setup_seq or #pl_exp_setup_cont
+ using one of the software triggering modes (@see PL_EXPOSURE_MODES).
+ - Acquisition has been started via #pl_exp_start_seq or #pl_exp_start_cont.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in,out] flags Input/output flags, see remarks.
+@param[in] value Reserved for future use. This value should be set to 0.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@remarks In current implementation the input flags should be set to 0. On output,
+the flags will contain one of the values defined in #PL_SW_TRIG_STATUSES enumeration.
+
+@see pl_exp_setup_seq, pl_exp_start_seq, pl_exp_setup_cont, pl_exp_start_cont,
+pl_exp_check_cont_status, pl_exp_get_oldest_frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_abort
+*/
+rs_bool PV_DECL pl_exp_trigger(int16 hcam, uns32* flags, uns32 value);
+
+/**
+@brief Checks the status of sequence acquisition.
+
+This is only useful when data collection has been set up and started, as with a call
+to the functions #pl_exp_setup_seq and #pl_exp_start_seq. In general, these
+functions start an exposure and then immediately return, allowing the progress to be monitored.
+The @a status gives a quick evaluation of progress.
+The argument @a status returns one of the values listed here: #PL_IMAGE_STATUSES.
+
+More detailed information is returned in @a bytes_arrived. This reports on exactly
+how many bytes of data have arrived so far.
+This level of feedback is unimportant to many users.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] status Status of the current capture (#EXPOSURE_IN_PROGRESS, ...).
+@param[out] bytes_arrived Number of bytes that have arrived. For continuous
+ mode, this is the number of bytes that have arrived
+ this time through the buffer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_seq, pl_exp_start_seq
+*/
+rs_bool PV_DECL pl_exp_check_status(int16 hcam, int16* status, uns32* bytes_arrived);
+
+/**
+@brief Checks the continuous readout status from the camera into the circular buffer.
+
+This function will return the status of continuous readout from the camera
+into the circular buffer.
+@a status is a pointer to one of the values listed here: #PL_IMAGE_STATUSES.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] status Status of the current capture (#EXPOSURE_IN_PROGRESS,...).
+@param[out] bytes_arrived Number of bytes that have arrived. For continuous
+ mode, this is the number of bytes that have arrived
+ this time through the buffer.
+@param[out] buffer_cnt Number of times through the buffer (continuous mode).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_get_oldest frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note This function only returns meaningful results if a continuous readout from the camera
+has been initiated by a call to #pl_exp_start_cont.
+Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see if the system can
+perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_check_cont_status(int16 hcam, int16* status,
+ uns32* bytes_arrived, uns32* buffer_cnt);
+
+/**
+@brief Checks the continuous readout status from the camera into the circular buffer.
+
+This function will return the status of continuous readout from the camera
+into the circular buffer.
+@a status is a pointer to one of the values listed here: #PL_IMAGE_STATUSES.
+
+Values in the variable pointed to by frame_info will be updated with frame counters,
+timestamps (with precision of 0.1ms) and readout time information assigned by device driver
+at the moment of frame reception.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] status Status of the current capture (#EXPOSURE_IN_PROGRESS,...).
+@param[out] byte_cnt Size of buffer to hold images (in bytes).
+@param[out] buffer_cnt Number of times through the buffer (continuous mode).
+@param[out] frame_info Frame info struct pointer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_get_oldest_frame, pl_exp_get_latest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont, pl_create_frame_info_struct,
+pl_exp_get_latest_frame_ex, pl_exp_get_oldest_frame_ex
+
+@note This function only returns meaningful results if a continuous readout from the camera has
+been initiated by a call to #pl_exp_start_cont. Use the parameter ID #PARAM_CIRC_BUFFER
+with #pl_get_param to see if the system can perform circular buffer operations.
+Variable pointed to by frame_info must be created with #pl_create_frame_info_struct.
+*/
+rs_bool PV_DECL pl_exp_check_cont_status_ex(int16 hcam, int16* status,
+ uns32* byte_cnt, uns32* buffer_cnt,
+ FRAME_INFO* frame_info);
+
+/**
+@brief This function returns a pointer to the most recently acquired frame in the circular buffer.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the most recent frame.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_stop_cont
+
+@note If the camera in use is not able to return the latest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the latest frame in
+#CIRC_NO_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to
+see if the system can perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_get_latest_frame(int16 hcam, void** frame);
+
+/**
+@brief Returns pointer to the most recent frame in circular buffer.
+
+Additionally, this function updates values of timestamps (with precision of 0.1ms),
+frame counter numbers and readout time in variable of #FRAME_INFO type.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the most recent frame.
+@param[out] frame_info Frame info struct pointer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_stop_cont,
+pl_exp_get_oldest_frame_ex, pl_exp_check_cont_status_ex, pl_cam_register_callback_ex2,
+pl_create_frame_info_struct, pl_release_frame_info_struct
+
+@note If the camera in use is not able to return the latest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the latest frame
+in #CIRC_NO_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see
+if the system can perform circular buffer operations.
+Variable pointed to by frame_info must be created with #pl_create_frame_info_struct.
+*/
+rs_bool PV_DECL pl_exp_get_latest_frame_ex(int16 hcam, void** frame,
+ FRAME_INFO* frame_info);
+
+/**
+@brief This function returns pointer to the oldest unretrieved frame in the circular buffer.
+
+After calling this function, #pl_exp_unlock_oldest_frame has to be called to notify PVCAM that
+the oldest frame can be overwritten with new data.\n
+This function should be used with acquisitions running in #CIRC_NO_OVERWRITE mode.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the oldest unretrieved frame.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont, pl_exp_get_oldest_frame_ex
+
+@note If the camera in use is not able to return the oldest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the oldest frame
+in #CIRC_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param
+to see if the system can perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_get_oldest_frame(int16 hcam, void** frame);
+
+/**
+@brief This function returns pointer to the oldest unretrieved frame in the circular buffer.
+
+After calling this function, #pl_exp_unlock_oldest_frame has to be called to notify PVCAM that
+the oldest frame can be overwritten with new data.\n
+This function should be used in acquisitions running in #CIRC_NO_OVERWRITE mode.
+
+Additionally, this function updates the values in the variable pointed to by @a frame_info
+with the data collected at the time of frame reception by the device driver (e.g. frame counter value).
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] frame Pointer to the oldest unretrieved frame.
+@param[out] frame_info Frame info struct pointer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont, pl_exp_check_cont_status_ex,
+pl_cam_register_callback_ex2, pl_create_frame_info_struct, pl_release_frame_info_struct
+
+@note If the camera in use is not able to return the oldest frame for the current operating mode,
+this function will fail. For example, some cameras cannot return the oldest frame in
+#CIRC_OVERWRITE mode. Use the parameter ID #PARAM_CIRC_BUFFER with pl_get_param to see
+if the system can perform circular buffer operations.
+Variable pointed to by frame_info must be created with #pl_create_frame_info_struct.
+*/
+rs_bool PV_DECL pl_exp_get_oldest_frame_ex(int16 hcam, void** frame,
+ FRAME_INFO* frame_info);
+
+/**
+@brief Makes oldest frame in circular buffer overwritable.
+
+This function allows PVCAM to overwrite the oldest frame in the circular buffer.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame,
+pl_exp_unlock_oldest_frame, pl_exp_stop_cont
+
+@note Failure to call this function after using the frame will cause the continuous acquisition
+progress to halt eventually, because the frame cannot be overwritten when it is locked.
+Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to check to see if the system can perform
+circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_unlock_oldest_frame(int16 hcam);
+
+/**
+@brief Stops continuous readout acquisition. Identical to #pl_exp_abort.
+
+This function halts a continuous readout acquisition into the circular buffer.
+@a cam_state defines the new state of the Camera Control Subsystem,
+as described in the documentation for the #pl_exp_abort function. To simplify the code, #pl_exp_abort
+may be used instead of #pl_exp_stop_cont to stop both continuous and sequential acquisitions.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] cam_state State to set the camera in (#CCS_NO_CHANGE,...).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_setup_cont, pl_exp_start_cont, pl_exp_check_cont_status, pl_exp_get_oldest_frame,
+pl_exp_get_latest_frame, pl_exp_unlock_oldest_frame
+
+@note Use the parameter ID #PARAM_CIRC_BUFFER with #pl_get_param to see if the system
+can perform circular buffer operations.
+*/
+rs_bool PV_DECL pl_exp_stop_cont(int16 hcam, int16 cam_state);
+
+/**
+@brief Stops collecting data, cleans up device driver, halts camera.
+
+#pl_exp_abort performs two functions: it stops the host device driver, and it may halt the camera
+(@a hcam specifies which camera and which device driver are being used.) Halting the camera halts
+@a readout, @c clearing, and all other camera activity. On the host side, data collection is controlled
+by a device driver. If data collection is currently enabled (the image data @b active state), this
+function stops collection, returns the low-level communication hardware and software to an image
+data @b idle state, and disables collection. In the @b idle state, any data that arrives is ignored and
+discarded. The @b idle state is the normal system default. On the camera side, the Camera Control
+Subsystem (CCS) may be in the process of collecting data, or it may be in one of several idle states.
+This function always stops the data collection software. In addition, it has the option of forcing
+the CCS into a new state by setting the @a cam_state variable to one of the following constants,
+which are camera-dependent: #PL_CCS_ABORT_MODES.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[out] cam_state State to set the camera in (#CCS_NO_CHANGE,...).
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@note This may also be called outside of an exposure. It can explicitly open the shutter,
+close the shutter, or stop the CCS. In the @b idle state, the system takes the least possible
+amount of action when image data arrives. On some systems, this involves placing the hardware
+in reset state, so it is inactive. On SCSI systems, the driver does not initiate any data transfers,
+although a buffer on the camera end may be filling up. If the CCS is halted and the shutter
+is closed (#CCS_HALT_CLOSE_SHTR), the current image remains on the sensor (although dark charge
+continues to accumulate). If @c clear_cycles is zero or the clear mode is #CLEAR_NEVER, the image
+may be read off by performing a bias readout. In frame transfer mode, you may not want to close
+the shutter when halting the CCS. Some frame transfer systems do not include a shutter, in which
+case an attempt to open or close the shutter is ignored, but does not cause an error.
+*/
+rs_bool PV_DECL pl_exp_abort(int16 hcam, int16 cam_state);
+
+/**
+@brief Finishes and cleans up after #pl_exp_start_seq.
+
+This cleans up after an exposure started through #pl_exp_start_seq has finished readout.
+If the exposure has not finished readout, this function returns with an error.
+Argument @a hbuf is not used at the moment.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] pixel_stream Buffer to hold image(s).
+@param[in] hbuf Standard image buffer. Not used at this time.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_exp_abort, pl_exp_check_status, pl_exp_setup_seq, pl_exp_start_seq
+
+@note This function must also be called if acquiring in sequential mode
+(using #pl_exp_setup_seq and #pl_exp_start_seq) with callback notification
+after a frame is read out and before new exposure is started by calling #pl_exp_start_seq.
+*/
+rs_bool PV_DECL pl_exp_finish_seq(int16 hcam, void* pixel_stream, int16 hbuf);
+
+/**
+@brief Defines control of an I/O line from within a camera script.
+
+This function allows the application program to define control of the available I/O lines
+from within a script. This allows for more precise control of external devices. For example,
+the application could request that a linear stage be indexed immediately after integration,
+instead of waiting until after the data is read out, the shutter is closed, etc.
+
+@a state has different meanings depending on the I/O type which are described here: #PL_IO_TYPE.
+@a location can be set to the values described here: #PL_SRC_MODES.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+@param[in] addr Specifies which I/O address to control.
+@param[in] state Specifies the value to write to the register.
+@param[in] location Specifies when to control the I/O (#SCR_PRE_FLASH,...).
+ Values are listed under #PL_IO_TYPE.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_io_clear_script_control
+*/
+rs_bool PV_DECL pl_io_script_control(int16 hcam, uns16 addr, flt64 state,
+ uns32 location);
+
+/**
+@brief Clears the current setup for control of the available I/O lines within a camera script.
+
+This function allows the application program to clear the current setup for control
+of the available I/O lines within the script. This allows the user to enter
+a new setup for these lines.
+
+@param[in] hcam Camera handle returned from #pl_cam_open.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+
+@see pl_io_script_control
+*/
+rs_bool PV_DECL pl_io_clear_script_control(int16 hcam);
+
+/** @} */ /* grp_pm_functions */
+
+/*****************************************************************************/
+/**
+@addtogroup grp_pm_deprecated_functions
+Most of the functions are obsolete and their corresponding PARAM_
+parameters should be used with #pl_get_param, #pl_set_param,
+#pl_get_enum_param and #pl_enum_str_length.
+@{
+*/
+
+DEPRECATED rs_bool PV_DECL pl_exp_init_seq(void);
+DEPRECATED rs_bool PV_DECL pl_exp_uninit_seq(void);
+/** Use #PARAM_DD_INFO instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_info(int16 hcam, int16 bytes, char* text);
+/** Use #PARAM_DD_INFO_LENGTH instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_info_length(int16 hcam, int16* bytes);
+/** Use #PARAM_DD_VERSION instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_ver(int16 hcam, uns16* dd_version);
+/** Use #PARAM_DD_RETRIES instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_retries(int16 hcam, uns16* max_retries);
+/** Use #PARAM_DD_RETRIES instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_set_retries(int16 hcam, uns16 max_retries);
+/** Use #PARAM_DD_TIMEOUT instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_get_timeout(int16 hcam, uns16* m_sec);
+/** Use #PARAM_DD_TIMEOUT instead. */
+DEPRECATED rs_bool PV_DECL pl_dd_set_timeout(int16 hcam, uns16 m_sec);
+/** Use #PARAM_ADC_OFFSET instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_adc_offset(int16 hcam, int16* offset);
+/** Use #PARAM_ADC_OFFSET instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_adc_offset(int16 hcam, int16 offset);
+/** Use #PARAM_CHIP_NAME instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_chip_name(int16 hcam, char* chip_name);
+/** Use #PARAM_CLEAR_CYCLES instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_clear_cycles(int16 hcam, uns16* clear_cycles);
+/** Use #PARAM_CLEAR_CYCLES instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_clear_cycles(int16 hcam, uns16 clr_cycles);
+/** Use #PARAM_CLEAR_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_clear_mode(int16 hcam, int16* clear_mode);
+/** Use #PARAM_CLEAR_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_clear_mode(int16 hcam, int16 ccd_clear);
+/** Use #PARAM_COLOR_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_color_mode(int16 hcam, uns16* color_mode);
+/** Use #PARAM_COOLING_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_cooling_mode(int16 hcam, int16* cooling);
+/** Use #PARAM_FRAME_CAPABLE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_frame_capable(int16 hcam, rs_bool* frame_capable);
+/** Use #PARAM_FWELL_CAPACITY instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_fwell_capacity(int16 hcam, uns32* fwell_capacity);
+/** Use #PARAM_MPP_CAPABLE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_mpp_capable(int16 hcam, int16* mpp_capable);
+/** Use #PARAM_PREAMP_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_preamp_dly(int16 hcam, uns16* preamp_dly);
+/** Use #PARAM_PREAMP_OFF_CONTROL instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_preamp_off_control(int16 hcam,
+ uns32* preamp_off_control);
+/** Use #PARAM_PREAMP_OFF_CONTROL instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_preamp_off_control(int16 hcam,
+ uns32 preamp_off_control);
+/** Use deprecated PARAM_PREFLASH instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_preflash(int16 hcam, uns16* pre_flash);
+/** Use #PARAM_PMODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pmode(int16 hcam, int16* pmode);
+/** Use #PARAM_PMODE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_pmode(int16 hcam, int16 pmode);
+/** Use #PARAM_PREMASK instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_premask(int16 hcam, uns16* pre_mask);
+/** Use #PARAM_PRESCAN instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_prescan(int16 hcam, uns16* prescan);
+/** Use #PARAM_POSTMASK instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_postmask(int16 hcam, uns16* post_mask);
+/** Use #PARAM_POSTSCAN instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_postscan(int16 hcam, uns16* postscan);
+/** Use #PARAM_PAR_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_par_size(int16 hcam, uns16* par_size);
+/** Use #PARAM_SER_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_ser_size(int16 hcam, uns16* ser_size);
+/** Use deprecated PARAM_SERIAL_NUM instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_serial_num(int16 hcam, uns16* serial_num);
+/** Use deprecated PARAM_CCS_STATUS instead. */
+DEPRECATED rs_bool PV_DECL pl_ccs_get_status(int16 hcam, int16* ccs_status);
+/** Use #PARAM_SUMMING_WELL instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_summing_well(int16 hcam, rs_bool* s_well_exists);
+/** Use #PARAM_TEMP instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_tmp(int16 hcam, int16* cur_tmp);
+/** Use #PARAM_TEMP instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_tmp_range(int16 hcam, int16* tmp_hi_val,
+ int16* tmp_lo_val);
+/** Use #PARAM_TEMP_SETPOINT instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_tmp_setpoint(int16 hcam, int16* tmp_setpoint);
+/** Use #PARAM_TEMP_SETPOINT instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_set_tmp_setpoint(int16 hcam, int16 tmp_setpoint);
+DEPRECATED rs_bool PV_DECL pl_ccd_set_readout_port(int16 , int16 );
+/** Use #PARAM_PIX_PAR_DIST instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_par_dist(int16 hcam, uns16* pix_par_dist);
+/** Use #PARAM_PIX_PAR_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_par_size(int16 hcam, uns16* pix_par_size);
+/** Use #PARAM_PIX_SER_DIST instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_ser_dist(int16 hcam, uns16* pix_ser_dist);
+/** Use #PARAM_PIX_SER_SIZE instead. */
+DEPRECATED rs_bool PV_DECL pl_ccd_get_pix_ser_size(int16 hcam, uns16* pix_ser_size);
+/** Use #PARAM_BIT_DEPTH instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_bits(int16 hcam, int16* spdtab_bits);
+/** Use #PARAM_GAIN_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_gain(int16 hcam, int16* spdtab_gain);
+/** Use #PARAM_GAIN_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_set_gain(int16 hcam, int16 spdtab_gain);
+/** Use #PARAM_GAIN_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_max_gain(int16 hcam, int16* spdtab_max_gain);
+/** Use #PARAM_SPDTAB_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_num(int16 hcam, int16* spdtab_num);
+/** Use #PARAM_SPDTAB_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_set_num(int16 hcam, int16 spdtab_num);
+/** Use #PARAM_SPDTAB_INDEX instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_entries(int16 hcam, int16* spdtab_entries);
+/** Use #PARAM_READOUT_PORT instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_port(int16 hcam, int16* spdtab_port);
+/** Use #PARAM_READOUT_PORT instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_port_total(int16 hcam, int16* total_ports);
+/** Use #PARAM_PIX_TIME instead. */
+DEPRECATED rs_bool PV_DECL pl_spdtab_get_time(int16 hcam, uns16* spdtab_time);
+/** Use #PARAM_SHTR_CLOSE_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_close_dly(int16 hcam, uns16* shtr_close_dly);
+/** Use #PARAM_SHTR_CLOSE_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_set_close_dly(int16 hcam, uns16 shtr_close_dly);
+/** Use #PARAM_SHTR_OPEN_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_open_dly(int16 hcam, uns16* shtr_open_dly);
+/** Use #PARAM_SHTR_OPEN_DELAY instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_set_open_dly(int16 hcam, uns16 shtr_open_dly);
+/** Use #PARAM_SHTR_OPEN_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_open_mode(int16 hcam, int16* shtr_open_mode);
+/** Use #PARAM_SHTR_OPEN_MODE instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_set_open_mode(int16 hcam, int16 shtr_open_mode);
+/** Use #PARAM_SHTR_STATUS instead. */
+DEPRECATED rs_bool PV_DECL pl_shtr_get_status(int16 hcam, int16* shtr_status);
+/** Use #PARAM_EXP_TIME instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_get_time_seq(int16 hcam, uns16* exp_time);
+/** Use #PARAM_EXP_TIME instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_set_time_seq(int16 hcam, uns16 exp_time);
+/** Use #pl_exp_check_status or #pl_exp_check_cont_status instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_check_progress(int16 hcam, int16* status,
+ uns32* bytes_arrived);
+
+/** Use #pl_exp_setup_cont instead. */
+DEPRECATED rs_bool PV_DECL pl_exp_set_cont_mode(int16 hcam, int16 mode);
+DEPRECATED rs_bool PV_DECL pl_subsys_do_diag(int16 hcam, uns8 subsys_id,
+ uns16* err_code);
+DEPRECATED rs_bool PV_DECL pl_subsys_get_id(int16 hcam, uns8 subsys_id,
+ uns16* part_num, uns8* revision);
+DEPRECATED rs_bool PV_DECL pl_subsys_get_name(int16 hcam, uns8 subsys_id,
+ char* subsys_name);
+DEPRECATED rs_bool PV_DECL pl_exp_get_driver_buffer(int16 hcam,
+ void** pixel_stream,
+ uns32* byte_cnt);
+DEPRECATED rs_bool PV_DECL pl_buf_init(void);
+DEPRECATED rs_bool PV_DECL pl_buf_uninit(void);
+DEPRECATED rs_bool PV_DECL pl_buf_alloc(int16* hbuf, int16 exp_total,
+ int16 bit_depth, int16 rgn_total,
+ const rgn_type* rgn_array);
+DEPRECATED rs_bool PV_DECL pl_buf_get_exp_date(int16 hbuf, int16 exp_num, int16* year,
+ uns8* month, uns8* day, uns8* hour,
+ uns8* min, uns8* sec, uns16* msec);
+DEPRECATED rs_bool PV_DECL pl_buf_set_exp_date(int16 hbuf, int16 exp_num, int16 year,
+ uns8 month, uns8 day, uns8 hour,
+ uns8 min, uns8 sec, uns16 msec);
+DEPRECATED rs_bool PV_DECL pl_buf_get_exp_time(int16 hbuf, int16 exp_num, uns32* exp_msec);
+DEPRECATED rs_bool PV_DECL pl_buf_get_exp_total(int16 hbuf, int16* total_exps);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_bin(int16 himg, int16* ibin, int16* jbin);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_handle(int16 hbuf, int16 exp_num,
+ int16 img_num, int16* himg);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_ofs(int16 himg, int16* s_ofs, int16* p_ofs);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_ptr(int16 himg, void** img_addr);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_size(int16 himg, int16* x_size, int16* y_size);
+DEPRECATED rs_bool PV_DECL pl_buf_get_img_total(int16 hbuf, int16* totl_imgs);
+DEPRECATED rs_bool PV_DECL pl_buf_get_size(int16 hbuf, int32* buf_size);
+DEPRECATED rs_bool PV_DECL pl_buf_free(int16 hbuf);
+DEPRECATED rs_bool PV_DECL pl_buf_get_bits(int16 hbuf, int16* bit_depth);
+DEPRECATED rs_bool PV_DECL pl_exp_unravel(int16 hcam, uns16 exposure,
+ void* pixel_stream, uns16 rgn_total,
+ const rgn_type* rgn_array,
+ uns16** array_list);
+DEPRECATED rs_bool PV_DECL pl_exp_wait_start_xfer(int16 hcam, uns32 tlimit);
+DEPRECATED rs_bool PV_DECL pl_exp_wait_end_xfer(int16 hcam, uns32 tlimit);
+
+DEPRECATED rs_bool PV_DECL pv_cam_get_ccs_mem(int16 hcam, uns16* size);
+DEPRECATED rs_bool PV_DECL pv_cam_send_debug(int16 hcam, char* debug_str,
+ uns16 reply_len, char* reply_str);
+DEPRECATED rs_bool PV_DECL pv_cam_write_read(int16 hcam, uns8 c_class, uns16 write_bytes,
+ uns8* write_array, uns8* read_array);
+DEPRECATED rs_bool PV_DECL pv_dd_active(int16 hcam, void* pixel_stream);
+DEPRECATED rs_bool PV_DECL pv_exp_get_bytes(int16 hcam, uns32* exp_bytes);
+DEPRECATED rs_bool PV_DECL pv_exp_get_script(int16 hcam, rs_bool* script_valid);
+DEPRECATED rs_bool PV_DECL pv_exp_get_status(int16 hcam, int16* status,
+ uns32* byte_cnt, uns32* frame_cnt);
+DEPRECATED rs_bool PV_DECL pv_exp_set_bytes(int16 hcam, uns32 frame_count,
+ uns32 seq_bytes, void* pixel_stream);
+DEPRECATED rs_bool PV_DECL pv_exp_set_script(int16 hcam, rs_bool script_valid);
+DEPRECATED rs_bool PV_DECL pv_set_error_code(int16 omode,int16 err_code);
+DEPRECATED rs_bool PV_DECL pv_cam_do_reads(int16 hcam);
+DEPRECATED rs_bool PV_DECL pv_free(void* block, int16 heap);
+DEPRECATED void* PV_DECL pv_malloc(uns32 size, int16 heap);
+DEPRECATED void* PV_DECL pv_realloc(void* block, uns32 size, int16 heap);
+DEPRECATED rs_bool PV_DECL pv_script_set_hook(pm_script_hook* pfn);
+DEPRECATED rs_bool PV_DECL pv_ccd_get_accum_capable(int16 hcam, rs_bool* accum_capable);
+DEPRECATED rs_bool PV_DECL pv_exp_get_frames(int16 hcam, uns32* exp_frames);
+DEPRECATED rs_bool PV_DECL pv_exp_set_frames(int16 hcam, uns32 exp_frames);
+DEPRECATED rs_bool PV_DECL pv_exp_set_no_readout_timeout(int16 hcam);
+DEPRECATED rs_bool PV_DECL pv_exp_reset_no_readout_timeout(int16 hcam);
+DEPRECATED rs_bool PV_DECL pm_cam_write_read(int16 hcam, uns8 c_class, uns16 write_bytes,
+ uns8* write_array, uns8* read_array);
+
+DEPRECATED rs_bool PV_DECL pl_ddi_get_ver(uns16* ddi_version);
+DEPRECATED rs_bool PV_DECL pl_cam_get_diags(int16 hcam);
+
+/** @} */ /* grp_pm_deprecated_functions */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* */
+/* Frame metadata functions */
+/* */
+/*****************************************************************************/
+/*****************************************************************************/
+
+/**
+@addtogroup grp_pm_functions
+@{
+*/
+
+/**
+@brief Decodes a metadata-enabled frame buffer into provided frame descriptor structure.
+
+This function processes the input frame buffer and calculates pointers to frame metadata headers,
+ROI headers and ROI image data and stores them to previously allocated @a pDstFrame structure.
+This function does not copy any pixel data. Since the @a pDstFrame stores only pointers
+to the @a pSrcBuf memory, the @a pSrcBuf must be valid for as long as the @a pDstFrame is
+accessed.
+
+@param[out] pDstFrame A pre-allocated helper structure that will be filled with
+ information from the given raw buffer. Create this structure with
+ #pl_md_create_frame_struct or #pl_md_create_frame_struct_cont functions.
+@param[in] pSrcBuf A pointer to a frame data as retrieved from PVCAM. See functions
+ #pl_exp_get_latest_frame and #pl_exp_get_latest_frame_ex.
+@param[in] srcBufSize The size of the raw frame data. Size of a frame is obtained
+ from #pl_exp_setup_seq and #pl_exp_setup_cont functions.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_frame_decode(md_frame* pDstFrame, void* pSrcBuf, uns32 srcBufSize);
+
+/**
+@brief Optional function that recomposes a multi-ROI frame into a displayable image buffer.
+
+Every ROI will be copied into its appropriate location in the provided buffer.
+Please note that the function will subtract the Implied ROI position from each ROI
+position which essentially moves the entire Implied ROI to a [0, 0] position.
+Use the Offset arguments to shift all ROIs back to desired positions if needed.
+If you use the Implied ROI position for offset arguments, the frame will be recomposed
+as it appears on the full frame.
+
+The caller is responsible for black-filling the input buffer. Usually, this function
+is called during live/preview mode where the destination buffer is re-used. If the
+ROIs do move during acquisition, it is essential to black-fill the destination buffer
+before calling this function. This is not needed if the ROIs do not move.
+If the ROIs move during live mode, it is also recommended to use the offset arguments
+and recompose the ROI to a full frame - with moving ROIs the implied ROI may change
+with each frame and this may cause undesired ROI "twitching" in the displayable image.
+
+@param[out] pDstBuf An output buffer; the buffer must be at least the size of the implied
+ ROI that is calculated during the frame decoding process. The buffer
+ must be of the same type as is the input frame - e.g. if the input
+ frame format is 8-bit, the destination buffer should be 8-bit as well.
+ If offset is set, the buffer dimensions must be large enough to allow
+ the entire implied ROI to be positioned in the buffer.
+@param[in] offX Offset in the destination buffer, in pixels. If 0, the Implied
+ ROI will be shifted to position 0 in the target buffer.
+ Use (ImpliedRoi.s1 / ImplierRoi.sbin) as offset value to
+ disable the shift and keep the ROIs in their absolute positions.
+@param[in] offY Offset in the destination buffer, in pixels. If 0, the Implied
+ ROI will be shifted to position 0 in the target buffer.
+ Use (ImpliedRoi.p1 / ImplierRoi.pbin) as offset value to
+ disable the shift and keep the ROIs in their absolute positions.
+@param[in] dstWidth Width, in pixels of the destination image buffer. The buffer
+ must be large enough to hold the entire Implied ROI, including
+ the offsets (if used).
+@param[in] dstHeight Height, in pixels of the destination image buffer.
+@param[in] pSrcFrame A helper structure, previously decoded using the frame
+ decoding function #pl_md_frame_decode.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_frame_recompose(void* pDstBuf, uns16 offX, uns16 offY,
+ uns16 dstWidth, uns16 dstHeight,
+ md_frame* pSrcFrame);
+
+/**
+@brief This method creates an empty md_frame structure for known number of ROIs.
+
+Use this method to prepare and pre-allocate one structure before starting
+continuous acquisition. Once callback arrives, fill the structure with
+#pl_md_frame_decode and display the metadata.
+Release the structure when not needed.
+
+@param[out] pFrame A pointer to frame helper structure address where the structure
+ will be allocated.
+@param[in] roiCount Number of ROIs the structure should be prepared for.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_create_frame_struct_cont(md_frame** pFrame, uns16 roiCount);
+
+/**
+@brief This method creates an empty md_frame structure from an existing buffer.
+
+Use this method when loading buffers from disk or when performance is not
+critical. Do not forget to release the structure when not needed.
+For continuous acquisition where the number or ROIs is known, it is recommended
+to use the other provided method to avoid frequent memory allocation.
+
+@param[out] pFrame A pointer address where the newly created structure will be stored.
+@param[in] pSrcBuf A raw frame data pointer as returned from the camera.
+@param[in] srcBufSize Size of the raw frame data buffer.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_create_frame_struct(md_frame** pFrame, void* pSrcBuf,
+ uns32 srcBufSize);
+
+/**
+@brief Releases the md_frame struct.
+
+@param[in] pFrame A pointer to the previously allocated structure.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_release_frame_struct(md_frame* pFrame);
+
+/**
+@brief Reads all the extended metadata from the given ext. metadata buffer.
+
+@param[out] pOutput A pre-allocated structure that will be filled with metadata
+@param[in] pExtMdPtr A pointer to the ext. MD buffer, this can be obtained from
+ the md_frame and md_frame_roi structures.
+@param[in] extMdSize Size of the ext. MD buffer, also retrievable from the helper
+ structures.
+
+@return #PV_OK for success, #PV_FAIL for failure. Failure sets #pl_error_code.
+*/
+rs_bool PV_DECL pl_md_read_extended(md_ext_item_collection* pOutput, void* pExtMdPtr,
+ uns32 extMdSize);
+
+/** @} */ /* grp_pm_functions */
+
+#ifdef PV_C_PLUS_PLUS
+};
+#endif
+
+#endif /* PV_EMBEDDED */
+
+/******************************************************************************/
+/* End of function prototypes. */
+/******************************************************************************/
+
+#endif /* _PVCAM_H */
diff --git a/pvcam-sdk/windows/Lib/amd64/pvcam64.lib b/pvcam-sdk/windows/Lib/amd64/pvcam64.lib
new file mode 100644
index 0000000..88cbf5f
Binary files /dev/null and b/pvcam-sdk/windows/Lib/amd64/pvcam64.lib differ
diff --git a/pvcam-sdk/windows/Lib/i386/pvcam32.lib b/pvcam-sdk/windows/Lib/i386/pvcam32.lib
new file mode 100644
index 0000000..d1ff125
Binary files /dev/null and b/pvcam-sdk/windows/Lib/i386/pvcam32.lib differ
diff --git a/pvcam-sdk/windows/version.txt b/pvcam-sdk/windows/version.txt
new file mode 100644
index 0000000..e6fe219
--- /dev/null
+++ b/pvcam-sdk/windows/version.txt
@@ -0,0 +1,3 @@
+Installer file:
+---------------
+PVCam_3.10.1.1-SDK60_Setup.exe
diff --git a/pyproject.toml b/pyproject.toml
index c0b93ae..36c4cb1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -12,8 +12,7 @@ authors = [
]
keywords = ["microscopy"]
readme = "README.md"
-license = {text = "MIT"} # Deprecated
-#license = "MIT" # Should be used since setuptools 77.0
+license = "MIT"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Science/Research",
@@ -54,7 +53,7 @@ source = "https://github.com/Photometrics/PyVCAM"
tracker = "https://github.com/Photometrics/PyVCAM/issues"
[build-system]
-requires = ["setuptools >= 64.0", "wheel >= 0.38"]
+requires = ["setuptools >= 77.0.3"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages.find]