O7/rss/include/acc_detector_distance.h

832 lines
32 KiB
C

// Copyright (c) Acconeer AB, 2020-2021
// All rights reserved
#ifndef ACC_DETECTOR_DISTANCE_H_
#define ACC_DETECTOR_DISTANCE_H_
#include <stdbool.h>
#include <stdint.h>
#include "acc_definitions_a111.h"
#include "acc_definitions_common.h"
/**
* @defgroup Distance Distance Detector
* @ingroup Detectors
*
* @brief Distance detector API description
*
* @{
*/
/**
* @brief Metadata for the distance detector
*/
typedef struct
{
/** Start of measurement in meters, derived from request set by @ref acc_detector_distance_configuration_requested_start_set */
float start_m;
/** Length of measurement in meters, derived from request set by @ref acc_detector_distance_configuration_requested_length_set */
float length_m;
/** Length needed for potential background, used in @ref acc_detector_distance_record_background */
uint16_t background_length;
} acc_detector_distance_metadata_t;
/**
* @brief Metadata for the recorded background
*/
typedef struct
{
/** Indication of missed data from the sensor */
bool missed_data;
/** Indication of a sensor communication error, service probably needs to be restarted */
bool sensor_communication_error;
/** Indication of sensor data being saturated, can cause result instability */
bool data_saturated;
/** Indication of bad data quality that may be addressed by restarting the service to recalibrate the sensor */
bool data_quality_warning;
} acc_detector_distance_recorded_background_info_t;
/**
* @brief Metadata for each result provided by the distance detector
*/
typedef struct
{
/** Indication of missed data from the sensor */
bool missed_data;
/** Indication of a sensor communication error, service probably needs to be restarted */
bool sensor_communication_error;
/** Indication of sensor data being saturated, can cause result instability */
bool data_saturated;
/** Indication of bad data quality that may be addressed by restarting the service to recalibrate the sensor */
bool data_quality_warning;
/** Number of detected peaks returned to application. Maximum is number of requested peaks.*/
uint16_t number_of_peaks;
/** Indicating if any measurement samples are above the threshold.*/
bool measurement_sample_above_threshold;
/** The closest measurement distance above the threshold. Only valid if any measurement samples are above
* threshold. Note, it is valid even if no peaks are found.*/
float closest_detection_m;
} acc_detector_distance_result_info_t;
/**
* @brief Enum for threshold type
*/
typedef enum
{
ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_FIXED,
ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_RECORDED,
ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_CFAR
} acc_detector_distance_threshold_type_t;
/**
* @brief Enum for peak sorting algorithms
*/
typedef enum
{
/* Return peaks with the closest detection first. */
ACC_DETECTOR_DISTANCE_PEAK_SORTING_CLOSEST_FIRST,
/* Return peaks with the peak with the highest amplitude first. */
ACC_DETECTOR_DISTANCE_PEAK_SORTING_STRONGEST_FIRST,
/* Return peaks with the peak from the strongest reflector first.
The decrease in amplitude over distance is accounted for.
Cannot be combined with negative start range. */
ACC_DETECTOR_DISTANCE_PEAK_SORTING_STRONGEST_REFLECTOR_FIRST,
/* Return peaks with the peak from the strongest flat reflector first.
The decrease in amplitude over distance is accounted for.
Cannot be combined with negative start range. */
ACC_DETECTOR_DISTANCE_PEAK_SORTING_STRONGEST_FLAT_REFLECTOR_FIRST
} acc_detector_distance_peak_sorting_t;
/**
* @brief Distance detector handle
*/
struct acc_detector_distance_handle;
typedef struct acc_detector_distance_handle *acc_detector_distance_handle_t;
/**
* @brief Distance detector configuration container
*/
struct acc_detector_distance_configuration;
typedef struct acc_detector_distance_configuration *acc_detector_distance_configuration_t;
/**
* @brief Result type for distance detector
*
* @param[out] amplitude Absolute amplitude of peak
* @param[out] distance Distance to peak in meters
*/
typedef struct
{
uint16_t amplitude;
float distance_m;
} acc_detector_distance_result_t;
/**
* @brief A callback for retrieving the service data buffer that the detector is based on
*
* @param[in] data A pointer to the buffer with envelope data
* @param[in] data_length Length of the data buffer
*/
typedef void (*acc_detector_distance_service_data_callback_t)(const uint16_t *data, uint16_t data_length);
/**
* @brief Create a configuration for a distance detector
*
* @return Distance detector configuration, NULL if creation was not possible
*/
acc_detector_distance_configuration_t acc_detector_distance_configuration_create(void);
/**
* @brief Destroy a configuration for a distance detector
*
* @param[in] distance_configuration The configuration to destroy, set to NULL
*/
void acc_detector_distance_configuration_destroy(acc_detector_distance_configuration_t *distance_configuration);
/**
* @brief Create a distance detector with the provided configuration
*
* Only one distance detector may exist for a specific sensor at any given time and
* invalid configurations will not allow for a distance detector creation.
*
* @param[in] distance_configuration The distance detector configuration to create a distance detector with
* @return Distance detector handle, NULL if distance detector was not possible to create
*/
acc_detector_distance_handle_t acc_detector_distance_create(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Destroy a distance detector identified with provided handle
*
* Destroy the context of a distance detector allowing another distance detector to be created using the
* same resources. The distance detector handle reference is set to NULL after destruction.
* If NULL is sent in, nothing happens
*
* @param[in] distance_handle A reference to the distance detector handle to destroy
*/
void acc_detector_distance_destroy(acc_detector_distance_handle_t *distance_handle);
/**
* @brief Activate the distance detector associated with the provided handle
*
* @param[in] distance_handle The distance detector handle for the distance detector to activate
* @return True if successful, otherwise false
*/
bool acc_detector_distance_activate(acc_detector_distance_handle_t distance_handle);
/**
* @brief Deactivate the distance detector associated with the provided handle
*
* @param[in] distance_handle The distance detector handle for the distance detector to deactivate
* @return True if successful, otherwise false
*/
bool acc_detector_distance_deactivate(acc_detector_distance_handle_t distance_handle);
/**
* @brief Reconfigure a distance detector with the provided configuration
*
* Only one distance detector may exist for a specific sensor at any given time.
* A distance detector may not be active when reconfiguring the detector.
* Invalid configurations will not allow for distance detector reconfiguration and
* the distance detector will be destroyed.
*
* NOTE! The old distance handle will be invalid after reconfigure.
*
* @param[in, out] distance_handle A reference to the distance detector handle to reconfigure
* @param[in] distance_configuration The distance detector configuration to reconfigure a distance detector with
* @return True if possible to reconfigure
*/
bool acc_detector_distance_reconfigure(acc_detector_distance_handle_t *distance_handle,
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Get detector metadata
*
* The detector provides metadata after being created with information that could be relevant for an application.
*
* May only be called after a detector has been created.
*
* @param[in] distance_handle The distance detector handle to get metadata for
* @param[out] metadata Metadata are provided in this parameter
* @return True if successful
*/
bool acc_detector_distance_metadata_get(acc_detector_distance_handle_t distance_handle,
acc_detector_distance_metadata_t *metadata);
/**
* @brief Record background
*
* Must be called after @ref acc_detector_distance_create and before @ref acc_detector_distance_activate
* when ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_RECORDED is set.
*
* Can be called again to make a new recording. Detector has to be deactivated to record a new background.
*
* The background length can be retrieved from @ref acc_detector_distance_metadata_get.
*
* The result should typically be set to the detector by calling @ref acc_detector_distance_set_background
*
* @param[in] distance_handle The distance detector handle for the distance detector to record background for
* @param[out] background The recorded background will be stored here
* @param[in] background_length The length of the background
* @param[out] background_info Recorded background metadata, passing NULL is OK
* @return True if successful
*/
bool acc_detector_distance_record_background(acc_detector_distance_handle_t distance_handle,
uint16_t *background,
uint16_t background_length,
acc_detector_distance_recorded_background_info_t *background_info);
/**
* @brief Set a background
*
* Set a previously recorded background. The background can typically be generated using
* @ref acc_detector_distance_record_background. The background must have a length corresponding
* to the configuration that was used when creating the detector. For example, if the background
* was created using @ref acc_detector_distance_record_background, the configuration of the detector
* should be the same both when generating the background as when later setting it.
*
* Must always be called for detector to work in ACC_DETECTOR_DISTANCE_THRESHOLD_TYPE_RECORDED mode.
*
* Must be called after @ref acc_detector_distance_create and before @ref acc_detector_distance_activate
*
* The background length can be retrieved from @ref acc_detector_distance_metadata_get.
*
* @param[in] distance_handle The distance detector handle for the distance detector to set background for
* @param[in] background The background to be set
* @param[in] background_length The length of the background to be set
* @return True if successful
*/
bool acc_detector_distance_set_background(acc_detector_distance_handle_t distance_handle, const uint16_t *background, uint16_t background_length);
/**
* @brief Retrieve the next result from the distance detector
*
* May only be called after a distance detector has been activated, blocks
* the application until result is ready.
*
* When using CFAR threshold, no detections will be made outside of range
* [range_start + (guard / 2) + window, range_end - (guard / 2) - window], if only_lower_distances is not set.
* If only_lower_distances is set, no detections will be made outside of range
* [range_start + (guard / 2) + window, range_end].
*
* @param[in] distance_handle The distance detector handle for the distance detector to get next result for
* @param[out] result Distance detector results, can be NULL if no result is wanted
* @param[in] result_length Length of data array passed to function. Number of peaks returned <= result_length.
* @param[out] result_info Detector result info
* @return True if successful, otherwise false
*/
bool acc_detector_distance_get_next(acc_detector_distance_handle_t distance_handle,
acc_detector_distance_result_t *result,
uint16_t result_length,
acc_detector_distance_result_info_t *result_info);
/**
* @brief Get the sensor ID for the sensor to be configured
*
* @param[in] distance_configuration The detector distance configuration to get the sensor ID from
* @return Sensor ID
*/
acc_sensor_id_t acc_detector_distance_configuration_sensor_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set the sensor ID for the sensor to be configured
*
* @param[in] distance_configuration The detector distance configuration to set the sensor ID in
* @param[in] sensor_id The sensor ID to set
*/
void acc_detector_distance_configuration_sensor_set(acc_detector_distance_configuration_t distance_configuration, acc_sensor_id_t sensor_id);
/**
* @brief Get the requested start distance for measurement in meters
*
* @param[in] distance_configuration The detector distance configuration to get the requested start from
* @return Requested start in meters
*/
float acc_detector_distance_configuration_requested_start_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set the requested start distance for measurement in meters
*
* @param[in] distance_configuration The detector distance configuration to set the requested start in
* @param[in] start_m The requested start in meters
*/
void acc_detector_distance_configuration_requested_start_set(acc_detector_distance_configuration_t distance_configuration, float start_m);
/**
* @brief Get the requested length of the measurement in meters
*
* @param[in] distance_configuration The detector distance configuration to get the requested length from
* @return Requested length in meters
*/
float acc_detector_distance_configuration_requested_length_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set the requested length of the measurement in meters
*
* @param[in] distance_configuration The detector distance configuration to set the requested length in
* @param[in] length_m The requested length in meters
*/
void acc_detector_distance_configuration_requested_length_set(acc_detector_distance_configuration_t distance_configuration, float length_m);
/**
* @brief Get power save mode
*
* The power save modes of the sensor correspond to how much of the sensor hardware is shutdown
* between data aquisition. The supported power save modes are defined in
* @ref acc_power_save_mode_enum_t.
*
* @param[in] distance_configuration The detector distance configuration to get power save mode from
* @return Power save mode
*/
acc_power_save_mode_t acc_detector_distance_configuration_power_save_mode_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set power save mode
*
* The power save modes of the sensor correspond to how much of the sensor hardware is shutdown
* between data aquisition. The supported power save modes are defined in
* @ref acc_power_save_mode_enum_t.
*
* @param[in] distance_configuration The detector distance configuration to set power save mode in
* @param[in] power_save_mode The power save mode to use
*/
void acc_detector_distance_configuration_power_save_mode_set(acc_detector_distance_configuration_t distance_configuration,
acc_power_save_mode_t power_save_mode);
/**
* @brief Get the sensor downsampling factor
*
* Gets the downsampling factor - the number of steps taken between each data point. A downsampling factor of 1 samples
* every possible point in the range. A downsampling factor of 2 samples every other point, and so on. Only 1, 2 and 4
* are valid numbers.
*
* @param[in] distance_configuration The detector distance configuration to get downsampling factor for
* @return Downsampling factor
*/
uint16_t acc_detector_distance_configuration_downsampling_factor_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set the sensor downsampling factor
*
* Gets the downsampling factor - the number of steps taken between each data point. A downsampling factor of 1 samples
* every possible point in the range. A downsampling factor of 2 samples every other point, and so on. Only 1, 2 and 4
* are valid numbers.
*
* @param[in] distance_configuration The detector distance configuration to set downsampling factor for
* @param[in] downsampling_factor Downsampling factor
*/
void acc_detector_distance_configuration_downsampling_factor_set(acc_detector_distance_configuration_t distance_configuration,
uint16_t downsampling_factor);
/**
* @brief Get the service profile
*
* See @ref acc_service_profile_t for details
*
* @param[in] distance_configuration The detector distance configuration to get service profile for
* @return The service profile
*/
acc_service_profile_t acc_detector_distance_configuration_service_profile_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set the service profile
*
* See @ref acc_service_profile_t for details
*
* @param[in] distance_configuration The detector distance configuration to set service profile for
* @param[in] service_profile
*/
void acc_detector_distance_configuration_service_profile_set(acc_detector_distance_configuration_t distance_configuration,
acc_service_profile_t service_profile);
/**
* @brief Get Maximize signal attenuation mode
*
* Will be true if Maximize signal attenuation mode is enabled, false otherwise
*
* @param[in] distance_configuration The detector distance configuration to get Maximize signal attenuation mode for
* @return Maximize signal attenuation mode
*/
bool acc_detector_distance_configuration_maximize_signal_attenuation_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set Maximize signal attenuation mode
*
* Enable or disable Maximize signal attenuation mode to measure the direct leakage
*
* @param[in] distance_configuration The detector distance configuration to set Maximize signal attenuation mode in
* @param[in] maximize_signal_attenuation Maximize signal attenuation mode, true or false
*/
void acc_detector_distance_configuration_maximize_signal_attenuation_set(acc_detector_distance_configuration_t distance_configuration,
bool maximize_signal_attenuation);
/**
* @brief Get receiver gain setting
*
* Will be a value between 0.0 and 1.0, where 0.0 is the lowest gain and 1.0 is the highest gain.
*
* @param[in] distance_configuration The detector distance configuration to get gain setting for
* @return Receiver gain setting
*/
float acc_detector_distance_configuration_receiver_gain_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set receiver gain setting
*
* Must be a value between 0.0 and 1.0, where 0.0 is the lowest gain and 1.0 is the highest gain.
*
* @param[in] distance_configuration The detector distance configuration to set gain setting for
* @param[in] gain Receiver gain setting, must be between 0.0 and 1.0
*/
void acc_detector_distance_configuration_receiver_gain_set(acc_detector_distance_configuration_t distance_configuration, float gain);
/**
* @brief Get the hardware accelerated average samples (HWAAS)
*
* Each data point can be sampled between 1 and 63 times, inclusive, and the sensor hardware then
* produces an average value of those samples. The time needed to measure a sweep is roughly proportional
* to the number of averaged samples. Hence, if there is a need to obtain a higher update rate, HWAAS
* could be decreased but this leads to lower SNR.
*
* @param[in] distance_configuration The distance configuration to get hardware accelerated average samples from
* @return Hardware accelerated average samples
*/
uint8_t acc_detector_distance_configuration_hw_accelerated_average_samples_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set the hardware accelerated average samples (HWAAS)
*
* Each data point can be sampled between 1 and 63 times, inclusive, and the sensor hardware then
* produces an average value of those samples. The time needed to measure a sweep is roughly proportional
* to the number of averaged samples. Hence, if there is a need to obtain a higher update rate, HWAAS
* could be decreased but this leads to lower SNR.
*
* @param[in] distance_configuration The distance configuration to set hardware accelerated average samples in
* @param[in] samples Hardware accelerated average samples
*/
void acc_detector_distance_configuration_hw_accelerated_average_samples_set(
acc_detector_distance_configuration_t distance_configuration, uint8_t samples);
/**
* @brief Get asynchronous measurement mode
*
* If set to true, asynchronous measurement is enabled.
* In synchronous mode the sensor will measure while the host is waiting.
* In asynchronous mode the sensor will measure while the host is working.
*
* This means that if in synchronous mode, the sensor will only measure during
* a get_next call, while in asynchronous mode the sensor can measure outside
* of the get_next call.
*
* @param[in] distance_configuration The configuration to get asynchronous_measurement mode from
* @return Asynchronous measurement mode
*/
bool acc_detector_distance_configuration_asynchronous_measurement_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set asynchronous measurement mode
*
* If set to true, asynchronous measurement is enabled.
* In synchronous mode the sensor will measure while the host is waiting.
* In asynchronous mode the sensor will measure while the host is working.
*
* This means that if in synchronous mode, the sensor will only measure during
* a get_next call, while in asynchronous mode the sensor can measure outside
* of the get_next call.
*
* @param[in] distance_configuration The configuration to set asynchronous_measurement mode in
* @param[in] asynchronous_measurement asynchronous measurement mode, true or false
*/
void acc_detector_distance_configuration_asynchronous_measurement_set(acc_detector_distance_configuration_t distance_configuration,
bool asynchronous_measurement);
/**
* @brief Get number of sweeps to calculate average for
*
* @param[in] distance_configuration The detector distance configuration to get sweep average for
* @return Number of sweeps to calculate average for
*/
uint16_t acc_detector_distance_configuration_sweep_averaging_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set number of sweeps to calculate average for
*
* @param[in] distance_configuration The detector distance configuration to set sweep average for
* @param[in] sweep_averaging Number of sweeps to calculate average for
*/
void acc_detector_distance_configuration_sweep_averaging_set(acc_detector_distance_configuration_t distance_configuration,
uint16_t sweep_averaging);
/**
* @brief Get threshold type
*
* @param[in] distance_configuration The detector distance configuration to set threshold type for
* @return Used threshold type
*/
acc_detector_distance_threshold_type_t acc_detector_distance_configuration_threshold_type_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set threshold type
*
* @param[in] distance_configuration The detector distance configuration to set threshold type for
* @param[in] threshold Threshold type to be used
*/
void acc_detector_distance_configuration_threshold_type_set(acc_detector_distance_configuration_t distance_configuration,
acc_detector_distance_threshold_type_t threshold);
/**
* @brief Get fixed threshold
*
* @param[in] distance_configuration The detector distance configuration to get fixed threshold from
* @return Fixed threshold
*/
uint16_t acc_detector_distance_configuration_fixed_threshold_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set fixed threshold
*
* @param[in] distance_configuration The detector distance configuration to set fixed threshold in
* @param[in] threshold Fixed threshold to be used by the detector
*/
void acc_detector_distance_configuration_fixed_threshold_set(acc_detector_distance_configuration_t distance_configuration,
uint16_t threshold);
/**
* @brief Get number of sweeps to record
*
* @param[in] distance_configuration The detector distance configuration to get number of sweeps to record for
* @return Number of sweeps to record
*/
uint16_t acc_detector_distance_configuration_record_background_sweeps_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set number of sweeps to record
*
* @param[in] distance_configuration The detector distance configuration to set number of sweeps to record in
* @param[in] record_sweeps Number of sweeps to record
*/
void acc_detector_distance_configuration_record_background_sweeps_set(
acc_detector_distance_configuration_t distance_configuration, uint16_t record_sweeps);
/**
* @brief Get threshold sensitivity
*
* Applicable when using recorded threshold or CFAR threshold
*
* @param[in] distance_configuration The detector distance configuration to get threshold sensitivity for
* @return Threshold sensitivity
*/
float acc_detector_distance_configuration_threshold_sensitivity_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set threshold sensitivity
*
* Applicable when using recorded threshold or CFAR threshold
*
* @param[in] distance_configuration The detector distance configuration to set threshold sensitivity in
* @param[in] sensitivity
*/
void acc_detector_distance_configuration_threshold_sensitivity_set(
acc_detector_distance_configuration_t distance_configuration,
float sensitivity);
/**
* @brief Get guard for CFAR threshold
*
* Range around the distance of interest that is omitted when calculating
* CFAR threshold. Can be low, ~0.04 m, for Profile 1, and should be
* increased for higher Profiles.
*
* @param[in] distance_configuration The detector distance configuration to get threshold guard for
* @return Threshold guard in meters
*/
float acc_detector_distance_configuration_cfar_threshold_guard_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set guard for CFAR threshold
*
* Range around the distance of interest that is omitted when calculating
* CFAR threshold. Can be low, ~0.04 cm, for Profile 1, and should be
* increased for higher Profiles.
*
* @param[in] distance_configuration The detector distance configuration to set threshold guard in
* @param[in] guard_m Threshold guard in meters
*/
void acc_detector_distance_configuration_cfar_threshold_guard_set(
acc_detector_distance_configuration_t distance_configuration,
float guard_m);
/**
* @brief Get window for CFAR threshold
*
* Range next to the CFAR guard from which the threshold level will be calculated.
*
* @param[in] distance_configuration The detector distance configuration to get threshold window for
* @return Threshold window in meters
*/
float acc_detector_distance_configuration_cfar_threshold_window_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set window for CFAR threshold
*
* Range next to the CFAR guard from which the threshold level will be calculated.
*
* @param[in] distance_configuration The detector distance configuration to set threshold window in
* @param[in] window_m Threshold window in meters
*/
void acc_detector_distance_configuration_cfar_threshold_window_set(
acc_detector_distance_configuration_t distance_configuration,
float window_m);
/**
* @brief Get if only lower distance is set
*
* Instead of determining the CFAR threshold from sweep amplitudes from
* distances both closer and father away, use only closer. Helpful e.g. for
* fluid level in small tanks, where many multipath signals can appear
* just after the main peak.
*
* @param[in] distance_configuration The detector distance configuration to get setting for
* @return True, if only lower distance is set
*/
bool acc_detector_distance_configuration_cfar_threshold_only_lower_distance_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set only lower distance
*
* Instead of determining the CFAR threshold from sweep amplitudes from
* distances both closer and father away, use only closer. Helpful e.g. for
* fluid level in small tanks, where many multipath signals can appear
* just after the main peak.
*
* @param[in] distance_configuration The detector distance configuration to set setting for
* @param[in] only_lower_distance True if only lower distances should be used
*/
void acc_detector_distance_configuration_cfar_threshold_only_lower_distance_set(
acc_detector_distance_configuration_t distance_configuration,
bool only_lower_distance);
/**
* @brief Get peak sorting algorithm
*
* Peak sorting algoritm specifies in what order peaks should be reported back to the application.
*
* @param[in] distance_configuration The detector distance configuration to get peak sorting algorithm from
* @return Peak sorting algorithm
*/
acc_detector_distance_peak_sorting_t acc_detector_distance_configuration_peak_sorting_get(
acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set peak sorting algorithm to be used
*
* Peak sorting algoritm specifies in what order peaks should be reported back to the application.
*
* @param[in] distance_configuration The detector distance configuration to set peak sorting algorithm in
* @param[in] peak_sorting Peak sorting algorithm to be used
*/
void acc_detector_distance_configuration_peak_sorting_set(acc_detector_distance_configuration_t distance_configuration,
acc_detector_distance_peak_sorting_t peak_sorting);
/**
* @brief Get peak merge limit in meters
*
* Defining minimum distance between peaks to be considered individual peaks
*
* @param[in] distance_configuration The detector distance configuration to get peak merge limit from
* @return Peak merge limit in meters
*/
float acc_detector_distance_configuration_peak_merge_limit_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @brief Set peak merge limit in meters
*
* Defining minimum distance between peaks to be considered individual peaks
*
* @param[in] distance_configuration The detector distance configuration to set peak merge limit in
* @param[in] peak_merge_limit_m Peak merge limit in meters
*/
void acc_detector_distance_configuration_peak_merge_limit_set(acc_detector_distance_configuration_t distance_configuration,
float peak_merge_limit_m);
/**
* @brief Set a callback function to get the service data
*
* A callback can be used to get the envelope service buffer that the detector is based on.
* The data is the unprocessed envelope data that is fed into the distance algorithm.
* Set service_data_callback to NULL to disable callback.
*
* @param[in] distance_configuration The configuration to set the service data callback for
* @param[in] service_data_callback The callback to get service data
*/
void acc_detector_distance_configuration_service_data_callback_set(
acc_detector_distance_configuration_t distance_configuration,
acc_detector_distance_service_data_callback_t service_data_callback);
/**
* @brief Set the maximum unambiguous range
*
* Experimental.
*
* See acc_service_mur_set() for more detailed information.
*
* @param[in] distance_configuration The configuration
* @param[in] max_unambiguous_range The desired maximum unambiguous range
*/
void acc_detector_distance_configuration_mur_set(acc_detector_distance_configuration_t distance_configuration,
acc_service_mur_t max_unambiguous_range);
/**
* @brief Get the maximum unambiguous range
*
* Experimental.
*
* See acc_service_mur_get() for more detailed information.
*
* @param[in] distance_configuration The configuration
* @return Maximum unambiguous range
*/
acc_service_mur_t acc_detector_distance_configuration_mur_get(acc_detector_distance_configuration_t distance_configuration);
/**
* @}
*/
#endif