The VL53L1CB proximity sensor, based on ST’s FlightSense™, Time-of-Flight technology.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   VL53L1CB_noshield_1sensor_polls_auton VL53L1CB_noshield_1sensor_interrupt_auton X_NUCLEO_53L1A2

Based on VL53L1 library, this is a library for the VL53L1CB ToF chip.

inc/vl53l1_ll_def.h

Committer:
charlesmn
Date:
2020-11-06
Revision:
0:3ac96e360672
Child:
7:1add29d51e72

File content as of revision 0:3ac96e360672:


/*******************************************************************************
 * Copyright (c) 2020, STMicroelectronics - All Rights Reserved

 This file is part of VL53L1 Core and is dual licensed,
 either 'STMicroelectronics
 Proprietary license'
 or 'BSD 3-clause "New" or "Revised" License' , at your option.

********************************************************************************

 'STMicroelectronics Proprietary license'

********************************************************************************

 License terms: STMicroelectronics Proprietary in accordance with licensing
 terms at www.st.com/sla0081

 STMicroelectronics confidential
 Reproduction and Communication of this document is strictly prohibited unless
 specifically authorized in writing by STMicroelectronics.


********************************************************************************

 Alternatively, VL53L1 Core may be distributed under the terms of
 'BSD 3-clause "New" or "Revised" License', in which case the following
 provisions apply instead of the ones
 mentioned above :

********************************************************************************

 License terms: BSD 3-clause "New" or "Revised" License.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:

 1. Redistributions of source code must retain the above copyright notice, this
 list of conditions and the following disclaimer.

 2. Redistributions in binary form must reproduce the above copyright notice,
 this list of conditions and the following disclaimer in the documentation
 and/or other materials provided with the distribution.

 3. Neither the name of the copyright holder nor the names of its contributors
 may be used to endorse or promote products derived from this software
 without specific prior written permission.

 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


********************************************************************************

*/





#ifndef _VL53L1_LL_DEF_H_
#define _VL53L1_LL_DEF_H_

#include "vl53l1_error_codes.h"
#include "vl53l1_register_structs.h"
#include "vl53l1_platform_user_config.h"
#include "vl53l1_platform_user_defines.h"
#include "vl53l1_hist_structs.h"
#include "vl53l1_dmax_structs.h"
#include "vl53l1_error_exceptions.h"

#ifdef __cplusplus
extern "C" {
#endif




#define VL53L1_LL_API_IMPLEMENTATION_VER_MAJOR       1

#define VL53L1_LL_API_IMPLEMENTATION_VER_MINOR       1

#define VL53L1_LL_API_IMPLEMENTATION_VER_SUB         48

#define VL53L1_LL_API_IMPLEMENTATION_VER_REVISION   12224

#define VL53L1_LL_API_IMPLEMENTATION_VER_STRING "1.1.48.12224"


#define VL53L1_FIRMWARE_VER_MINIMUM         398
#define VL53L1_FIRMWARE_VER_MAXIMUM         400




#define VL53L1_LL_CALIBRATION_DATA_STRUCT_VERSION       0xECAB0102




#define VL53L1_LL_ZONE_CALIBRATION_DATA_STRUCT_VERSION  0xECAE0101





#define VL53L1_BIN_REC_SIZE 6

#define VL53L1_TIMING_CONF_A_B_SIZE 2

#define VL53L1_FRAME_WAIT_EVENT	6



#define VL53L1_MAX_XTALK_RANGE_RESULTS        5


#define VL53L1_MAX_OFFSET_RANGE_RESULTS       3


#define VL53L1_NVM_MAX_FMT_RANGE_DATA         4


#define VL53L1_NVM_PEAK_RATE_MAP_SAMPLES  25

#define VL53L1_NVM_PEAK_RATE_MAP_WIDTH     5

#define VL53L1_NVM_PEAK_RATE_MAP_HEIGHT     5




#define VL53L1_ERROR_DEVICE_FIRMWARE_TOO_OLD           ((VL53L1_Error) - 80)

#define VL53L1_ERROR_DEVICE_FIRMWARE_TOO_NEW           ((VL53L1_Error) - 85)

#define VL53L1_ERROR_UNIT_TEST_FAIL                    ((VL53L1_Error) - 90)

#define VL53L1_ERROR_FILE_READ_FAIL                    ((VL53L1_Error) - 95)

#define VL53L1_ERROR_FILE_WRITE_FAIL                   ((VL53L1_Error) - 96)






typedef struct {
	uint32_t     ll_revision;
	uint8_t      ll_major;
	uint8_t      ll_minor;
	uint8_t      ll_build;
} VL53L1_ll_version_t;




typedef struct {

	uint8_t    device_test_mode;
	uint8_t    VL53L1_p_009;
	uint32_t   timeout_us;
	uint16_t   target_count_rate_mcps;

	uint16_t   min_count_rate_limit_mcps;

	uint16_t   max_count_rate_limit_mcps;


} VL53L1_refspadchar_config_t;




typedef struct {

	uint16_t  dss_config__target_total_rate_mcps;

	uint32_t  phasecal_config_timeout_us;

	uint32_t  mm_config_timeout_us;

	uint32_t  range_config_timeout_us;

	uint8_t   num_of_samples;

	int16_t   algo__crosstalk_extract_min_valid_range_mm;

	int16_t   algo__crosstalk_extract_max_valid_range_mm;

	uint16_t  algo__crosstalk_extract_max_valid_rate_kcps;

	uint16_t  algo__crosstalk_extract_max_sigma_mm;


} VL53L1_xtalkextract_config_t;




typedef struct {

	uint16_t  dss_config__target_total_rate_mcps;

	uint32_t  phasecal_config_timeout_us;

	uint32_t  range_config_timeout_us;

	uint32_t  mm_config_timeout_us;

	uint8_t   pre_num_of_samples;

	uint8_t   mm1_num_of_samples;

	uint8_t   mm2_num_of_samples;


} VL53L1_offsetcal_config_t;




typedef struct {

	uint16_t   dss_config__target_total_rate_mcps;

	uint32_t   phasecal_config_timeout_us;

	uint32_t   mm_config_timeout_us;

	uint32_t   range_config_timeout_us;

	uint16_t   phasecal_num_of_samples;

	uint16_t   zone_num_of_samples;


} VL53L1_zonecal_config_t;





typedef struct {

	VL53L1_DeviceSscArray  array_select;

	uint8_t    VL53L1_p_009;

	uint8_t    vcsel_start;

	uint8_t    vcsel_width;

	uint32_t   timeout_us;

	uint16_t   rate_limit_mcps;


} VL53L1_ssc_config_t;




typedef struct {


	uint32_t  algo__crosstalk_compensation_plane_offset_kcps;

	int16_t   algo__crosstalk_compensation_x_plane_gradient_kcps;

	int16_t   algo__crosstalk_compensation_y_plane_gradient_kcps;

	uint32_t  nvm_default__crosstalk_compensation_plane_offset_kcps;

	int16_t   nvm_default__crosstalk_compensation_x_plane_gradient_kcps;

	int16_t   nvm_default__crosstalk_compensation_y_plane_gradient_kcps;

	uint8_t   global_crosstalk_compensation_enable;

	int16_t   histogram_mode_crosstalk_margin_kcps;

	int16_t   lite_mode_crosstalk_margin_kcps;

	uint8_t   crosstalk_range_ignore_threshold_mult;

	uint16_t  crosstalk_range_ignore_threshold_rate_mcps;

	int16_t   algo__crosstalk_detect_min_valid_range_mm;

	int16_t   algo__crosstalk_detect_max_valid_range_mm;

	uint16_t  algo__crosstalk_detect_max_valid_rate_kcps;

	uint16_t  algo__crosstalk_detect_max_sigma_mm;



} VL53L1_xtalk_config_t;




typedef struct {


	uint16_t  tp_tuning_parm_version;

	uint16_t  tp_tuning_parm_key_table_version;

	uint16_t  tp_tuning_parm_lld_version;

	uint8_t   tp_init_phase_rtn_lite_long;

	uint8_t   tp_init_phase_rtn_lite_med;

	uint8_t   tp_init_phase_rtn_lite_short;

	uint8_t   tp_init_phase_ref_lite_long;

	uint8_t   tp_init_phase_ref_lite_med;

	uint8_t   tp_init_phase_ref_lite_short;


	uint8_t   tp_init_phase_rtn_hist_long;

	uint8_t   tp_init_phase_rtn_hist_med;

	uint8_t   tp_init_phase_rtn_hist_short;

	uint8_t   tp_init_phase_ref_hist_long;

	uint8_t   tp_init_phase_ref_hist_med;

	uint8_t   tp_init_phase_ref_hist_short;


	uint8_t   tp_consistency_lite_phase_tolerance;

	uint8_t   tp_phasecal_target;

	uint16_t  tp_cal_repeat_rate;

	uint8_t   tp_lite_min_clip;


	uint16_t  tp_lite_long_sigma_thresh_mm;

	uint16_t  tp_lite_med_sigma_thresh_mm;

	uint16_t  tp_lite_short_sigma_thresh_mm;


	uint16_t  tp_lite_long_min_count_rate_rtn_mcps;

	uint16_t  tp_lite_med_min_count_rate_rtn_mcps;

	uint16_t  tp_lite_short_min_count_rate_rtn_mcps;


	uint8_t   tp_lite_sigma_est_pulse_width_ns;

	uint8_t   tp_lite_sigma_est_amb_width_ns;

	uint8_t   tp_lite_sigma_ref_mm;

	uint8_t   tp_lite_seed_cfg;

	uint8_t   tp_timed_seed_cfg;


	uint8_t   tp_lite_quantifier;

	uint8_t   tp_lite_first_order_select;


	uint16_t  tp_dss_target_lite_mcps;

	uint16_t  tp_dss_target_histo_mcps;

	uint16_t  tp_dss_target_histo_mz_mcps;

	uint16_t  tp_dss_target_timed_mcps;

	uint16_t  tp_dss_target_very_short_mcps;


	uint32_t  tp_phasecal_timeout_lite_us;

	uint32_t  tp_phasecal_timeout_hist_long_us;

	uint32_t  tp_phasecal_timeout_hist_med_us;

	uint32_t  tp_phasecal_timeout_hist_short_us;


	uint32_t  tp_phasecal_timeout_mz_long_us;

	uint32_t  tp_phasecal_timeout_mz_med_us;

	uint32_t  tp_phasecal_timeout_mz_short_us;

	uint32_t  tp_phasecal_timeout_timed_us;


	uint32_t  tp_mm_timeout_lite_us;

	uint32_t  tp_mm_timeout_histo_us;

	uint32_t  tp_mm_timeout_mz_us;

	uint32_t  tp_mm_timeout_timed_us;

	uint32_t  tp_mm_timeout_lpa_us;


	uint32_t  tp_range_timeout_lite_us;

	uint32_t  tp_range_timeout_histo_us;

	uint32_t  tp_range_timeout_mz_us;

	uint32_t  tp_range_timeout_timed_us;

	uint32_t  tp_range_timeout_lpa_us;

	uint32_t tp_phasecal_patch_power;

	uint8_t tp_hist_merge;

	uint32_t tp_reset_merge_threshold;

	uint8_t tp_hist_merge_max_size;

	uint8_t tp_uwr_enable;
	int16_t tp_uwr_med_z_1_min;
	int16_t tp_uwr_med_z_1_max;
	int16_t tp_uwr_med_z_2_min;
	int16_t tp_uwr_med_z_2_max;
	int16_t tp_uwr_med_z_3_min;
	int16_t tp_uwr_med_z_3_max;
	int16_t tp_uwr_med_z_4_min;
	int16_t tp_uwr_med_z_4_max;
	int16_t tp_uwr_med_z_5_min;
	int16_t tp_uwr_med_z_5_max;
	int16_t tp_uwr_med_z_6_min;
	int16_t tp_uwr_med_z_6_max;
	int16_t tp_uwr_med_corr_z_1_rangea;
	int16_t tp_uwr_med_corr_z_1_rangeb;
	int16_t tp_uwr_med_corr_z_2_rangea;
	int16_t tp_uwr_med_corr_z_2_rangeb;
	int16_t tp_uwr_med_corr_z_3_rangea;
	int16_t tp_uwr_med_corr_z_3_rangeb;
	int16_t tp_uwr_med_corr_z_4_rangea;
	int16_t tp_uwr_med_corr_z_4_rangeb;
	int16_t tp_uwr_med_corr_z_5_rangea;
	int16_t tp_uwr_med_corr_z_5_rangeb;
	int16_t tp_uwr_med_corr_z_6_rangea;
	int16_t tp_uwr_med_corr_z_6_rangeb;
	int16_t tp_uwr_lng_z_1_min;
	int16_t tp_uwr_lng_z_1_max;
	int16_t tp_uwr_lng_z_2_min;
	int16_t tp_uwr_lng_z_2_max;
	int16_t tp_uwr_lng_z_3_min;
	int16_t tp_uwr_lng_z_3_max;
	int16_t tp_uwr_lng_z_4_min;
	int16_t tp_uwr_lng_z_4_max;
	int16_t tp_uwr_lng_z_5_min;
	int16_t tp_uwr_lng_z_5_max;
	int16_t tp_uwr_lng_corr_z_1_rangea;
	int16_t tp_uwr_lng_corr_z_1_rangeb;
	int16_t tp_uwr_lng_corr_z_2_rangea;
	int16_t tp_uwr_lng_corr_z_2_rangeb;
	int16_t tp_uwr_lng_corr_z_3_rangea;
	int16_t tp_uwr_lng_corr_z_3_rangeb;
	int16_t tp_uwr_lng_corr_z_4_rangea;
	int16_t tp_uwr_lng_corr_z_4_rangeb;
	int16_t tp_uwr_lng_corr_z_5_rangea;
	int16_t tp_uwr_lng_corr_z_5_rangeb;

} VL53L1_tuning_parm_storage_t;





typedef struct {

	uint8_t   x_centre;
	uint8_t   y_centre;

} VL53L1_optical_centre_t;




typedef struct {

	uint8_t   x_centre;
	uint8_t   y_centre;
	uint8_t   width;
	uint8_t   height;

} VL53L1_user_zone_t;




typedef struct {

	uint8_t             max_zones;
	uint8_t             active_zones;



VL53L1_histogram_config_t multizone_hist_cfg;

	VL53L1_user_zone_t user_zones[VL53L1_MAX_USER_ZONES];


	uint8_t bin_config[VL53L1_MAX_USER_ZONES];


} VL53L1_zone_config_t;



typedef struct {


	VL53L1_GPIO_Interrupt_Mode	intr_mode_distance;


	VL53L1_GPIO_Interrupt_Mode	intr_mode_rate;


	uint8_t				intr_new_measure_ready;


	uint8_t				intr_no_target;


	uint8_t				intr_combined_mode;





	uint16_t			threshold_distance_high;


	uint16_t			threshold_distance_low;


	uint16_t			threshold_rate_high;


	uint16_t			threshold_rate_low;

} VL53L1_GPIO_interrupt_config_t;




typedef struct {


	uint8_t		vhv_loop_bound;


	uint8_t		is_low_power_auto_mode;


	uint8_t		low_power_auto_range_count;


	uint8_t		saved_interrupt_config;


	uint8_t		saved_vhv_init;


	uint8_t		saved_vhv_timeout;


	uint8_t		first_run_phasecal_result;


	uint32_t	dss__total_rate_per_spad_mcps;


	uint16_t	dss__required_spads;

} VL53L1_low_power_auto_data_t;







typedef struct {


	uint8_t	smudge_corr_enabled;


	uint8_t	smudge_corr_apply_enabled;


	uint8_t	smudge_corr_single_apply;




	uint16_t	smudge_margin;


	uint32_t	noise_margin;


	uint32_t	user_xtalk_offset_limit;


	uint8_t	user_xtalk_offset_limit_hi;


	uint32_t	sample_limit;


	uint32_t	single_xtalk_delta;


	uint32_t	averaged_xtalk_delta;


	uint32_t	smudge_corr_clip_limit;


	uint32_t	smudge_corr_ambient_threshold;


	uint8_t	scaler_calc_method;


	int16_t	x_gradient_scaler;


	int16_t	y_gradient_scaler;


	uint8_t	user_scaler_set;


	uint32_t nodetect_ambient_threshold;


	uint32_t nodetect_sample_limit;


	uint32_t nodetect_xtalk_offset;


	uint16_t nodetect_min_range_mm;


	uint32_t max_smudge_factor;

} VL53L1_smudge_corrector_config_t;



typedef struct {


	uint32_t	current_samples;


	uint32_t	required_samples;


	uint64_t	accumulator;


	uint32_t	nodetect_counter;

} VL53L1_smudge_corrector_internals_t;



typedef struct {


	uint8_t	smudge_corr_valid;


	uint8_t	smudge_corr_clipped;


	uint8_t	single_xtalk_delta_flag;


	uint8_t	averaged_xtalk_delta_flag;


	uint8_t	sample_limit_exceeded_flag;


	uint8_t gradient_zero_flag;


	uint8_t new_xtalk_applied_flag;


	uint32_t  algo__crosstalk_compensation_plane_offset_kcps;


	int16_t   algo__crosstalk_compensation_x_plane_gradient_kcps;


	int16_t   algo__crosstalk_compensation_y_plane_gradient_kcps;


} VL53L1_smudge_corrector_data_t;





typedef struct {



	uint8_t  range_id;

	uint32_t time_stamp;

	uint8_t  VL53L1_p_015;

	uint8_t  VL53L1_p_022;

	uint8_t  VL53L1_p_025;

	uint8_t  VL53L1_p_026;

	uint8_t  VL53L1_p_016;

	uint8_t  VL53L1_p_027;


	uint16_t   width;

	uint8_t    VL53L1_p_030;


	uint16_t   fast_osc_frequency;

	uint16_t   zero_distance_phase;

	uint16_t   VL53L1_p_006;


	uint32_t   total_periods_elapsed;


	uint32_t   peak_duration_us;


	uint32_t   woi_duration_us;





	uint32_t   VL53L1_p_020;

	uint32_t   VL53L1_p_021;

	int32_t    VL53L1_p_013;




	uint16_t    peak_signal_count_rate_mcps;

	uint16_t    avg_signal_count_rate_mcps;

	uint16_t    ambient_count_rate_mcps;

	uint16_t    total_rate_per_spad_mcps;

	uint32_t    VL53L1_p_012;




	uint16_t   VL53L1_p_005;




	uint16_t   VL53L1_p_028;

	uint16_t   VL53L1_p_014;

	uint16_t   VL53L1_p_029;




	int16_t    min_range_mm;

	int16_t    median_range_mm;

	int16_t    max_range_mm;




	uint8_t    range_status;

} VL53L1_range_data_t;




typedef struct {

	VL53L1_DeviceState     cfg_device_state;

	VL53L1_DeviceState     rd_device_state;

	uint8_t                zone_id;

	uint8_t                stream_count;


	int16_t                VL53L1_p_007[VL53L1_MAX_AMBIENT_DMAX_VALUES];

	int16_t                wrap_dmax_mm;


	uint8_t                device_status;


	uint8_t                max_results;

	uint8_t                active_results;

	VL53L1_range_data_t    VL53L1_p_002[VL53L1_MAX_RANGE_RESULTS];

	VL53L1_range_data_t    xmonitor;

	VL53L1_smudge_corrector_data_t smudge_corrector_data;



} VL53L1_range_results_t;




typedef struct {

	uint8_t    no_of_samples;

	uint32_t   rate_per_spad_kcps_sum;

	uint32_t   rate_per_spad_kcps_avg;

	int32_t    signal_total_events_sum;

	int32_t    signal_total_events_avg;

	uint32_t   sigma_mm_sum;

	uint32_t   sigma_mm_avg;

	uint32_t   median_phase_sum;

	uint32_t   median_phase_avg;


} VL53L1_xtalk_range_data_t;




typedef struct {

	VL53L1_Error                cal_status;

	uint8_t                     num_of_samples_status;

	uint8_t                     zero_samples_status;

	uint8_t                     max_sigma_status;

	uint8_t                     max_results;

	uint8_t                     active_results;


	VL53L1_xtalk_range_data_t
		VL53L1_p_002[VL53L1_MAX_XTALK_RANGE_RESULTS];

	VL53L1_histogram_bin_data_t central_histogram_sum;

	VL53L1_histogram_bin_data_t central_histogram_avg;

	uint8_t central_histogram__window_start;

	uint8_t central_histogram__window_end;

	VL53L1_histogram_bin_data_t
		histogram_avg_1[VL53L1_MAX_XTALK_RANGE_RESULTS];

	VL53L1_histogram_bin_data_t
		histogram_avg_2[VL53L1_MAX_XTALK_RANGE_RESULTS];

	VL53L1_histogram_bin_data_t
		xtalk_avg[VL53L1_MAX_XTALK_RANGE_RESULTS];


} VL53L1_xtalk_range_results_t;




typedef struct {

	uint8_t    preset_mode;

	uint8_t    dss_config__roi_mode_control;

	uint16_t   dss_config__manual_effective_spads_select;

	uint8_t    no_of_samples;

	uint32_t   effective_spads;

	uint32_t   peak_rate_mcps;

	uint32_t   VL53L1_p_005;

	int32_t    median_range_mm;

	int32_t    range_mm_offset;


} VL53L1_offset_range_data_t;




typedef struct {

	int16_t      cal_distance_mm;

	uint16_t     cal_reflectance_pc;

	VL53L1_Error cal_status;

	uint8_t      cal_report;

	uint8_t      max_results;

	uint8_t      active_results;

	VL53L1_offset_range_data_t
		VL53L1_p_002[VL53L1_MAX_OFFSET_RANGE_RESULTS];


} VL53L1_offset_range_results_t;




typedef struct {

	uint16_t  result__mm_inner_actual_effective_spads;

	uint16_t  result__mm_outer_actual_effective_spads;

	uint16_t  result__mm_inner_peak_signal_count_rtn_mcps;

	uint16_t  result__mm_outer_peak_signal_count_rtn_mcps;


} VL53L1_additional_offset_cal_data_t;



typedef struct {
	int16_t   short_a_offset_mm;
	int16_t   short_b_offset_mm;
	int16_t   medium_a_offset_mm;
	int16_t   medium_b_offset_mm;
	int16_t   long_a_offset_mm;
	int16_t   long_b_offset_mm;
} VL53L1_per_vcsel_period_offset_cal_data_t;





typedef struct {

	uint32_t   VL53L1_p_020;

	uint32_t   VL53L1_p_021;

	uint16_t   VL53L1_p_014;

	uint8_t    range_status;


} VL53L1_object_data_t;




typedef struct {

	VL53L1_DeviceState     cfg_device_state;

	VL53L1_DeviceState     rd_device_state;

	uint8_t                zone_id;

	uint8_t                stream_count;

	uint8_t                max_objects;

	uint8_t                active_objects;

	VL53L1_object_data_t   VL53L1_p_002[VL53L1_MAX_RANGE_RESULTS];


	VL53L1_object_data_t   xmonitor;


} VL53L1_zone_objects_t;






typedef struct {

	uint8_t                max_zones;

	uint8_t                active_zones;

	VL53L1_zone_objects_t VL53L1_p_002[VL53L1_MAX_USER_ZONES];


} VL53L1_zone_results_t;




typedef struct {

	VL53L1_DeviceState     rd_device_state;


	uint8_t  number_of_ambient_bins;


	uint16_t result__dss_actual_effective_spads;

	uint8_t  VL53L1_p_009;

	uint32_t total_periods_elapsed;


	int32_t  ambient_events_sum;


} VL53L1_zone_hist_info_t;




typedef struct {

	uint8_t                     max_zones;

	uint8_t                     active_zones;

	VL53L1_zone_hist_info_t     VL53L1_p_002[VL53L1_MAX_USER_ZONES];


} VL53L1_zone_histograms_t;




typedef struct {

	uint32_t   no_of_samples;

	uint32_t   effective_spads;

	uint32_t   peak_rate_mcps;

	uint32_t   VL53L1_p_014;

	uint32_t   VL53L1_p_005;

	int32_t    median_range_mm;

	int32_t    range_mm_offset;


} VL53L1_zone_calibration_data_t;






typedef struct {

	uint32_t                         struct_version;

	VL53L1_DevicePresetModes         preset_mode;

	VL53L1_DeviceZonePreset          zone_preset;

	int16_t                          cal_distance_mm;

	uint16_t                         cal_reflectance_pc;

	uint16_t                         phasecal_result__reference_phase;

	uint16_t                         zero_distance_phase;

	VL53L1_Error                     cal_status;

	uint8_t                          max_zones;

	uint8_t                          active_zones;

	VL53L1_zone_calibration_data_t   VL53L1_p_002[VL53L1_MAX_USER_ZONES];


} VL53L1_zone_calibration_results_t;





typedef struct {

	int16_t     cal_distance_mm;

	uint16_t    cal_reflectance_pc;

	uint16_t    max_samples;

	uint16_t    width;

	uint16_t    height;

	uint16_t    peak_rate_mcps[VL53L1_NVM_PEAK_RATE_MAP_SAMPLES];


} VL53L1_cal_peak_rate_map_t;




typedef struct {

	uint8_t      expected_stream_count;

	uint8_t      expected_gph_id;

	uint8_t      dss_mode;

	uint16_t     dss_requested_effective_spad_count;

	uint8_t      seed_cfg;

	uint8_t      initial_phase_seed;


	uint8_t  roi_config__user_roi_centre_spad;

	uint8_t  roi_config__user_roi_requested_global_xy_size;


} VL53L1_zone_private_dyn_cfg_t;




typedef struct {

	uint8_t                     max_zones;

	uint8_t                     active_zones;

	VL53L1_zone_private_dyn_cfg_t VL53L1_p_002[VL53L1_MAX_USER_ZONES];


} VL53L1_zone_private_dyn_cfgs_t;



typedef struct {

	uint32_t  algo__crosstalk_compensation_plane_offset_kcps;

	int16_t   algo__crosstalk_compensation_x_plane_gradient_kcps;

	int16_t   algo__crosstalk_compensation_y_plane_gradient_kcps;

	uint32_t  algo__xtalk_cpo_HistoMerge_kcps[VL53L1_BIN_REC_SIZE];


} VL53L1_xtalk_calibration_results_t;




typedef struct {


	uint32_t   sample_count;


	uint32_t   pll_period_mm;


	uint32_t   peak_duration_us_sum;


	uint32_t   effective_spad_count_sum;


	uint32_t   zero_distance_phase_sum;


	uint32_t   zero_distance_phase_avg;


	int32_t    event_scaler_sum;


	int32_t    event_scaler_avg;


	int32_t   signal_events_sum;


	uint32_t  xtalk_rate_kcps_per_spad;


	int32_t   xtalk_start_phase;


	int32_t   xtalk_end_phase;


	int32_t   xtalk_width_phase;


	int32_t   target_start_phase;


	int32_t   target_end_phase;


	int32_t   target_width_phase;


	int32_t   effective_width;


	int32_t   event_scaler;


	uint8_t   VL53L1_p_015;


	uint8_t   VL53L1_p_016;


	uint8_t   target_start;


	int32_t   max_shape_value;


	int32_t   bin_data_sums[VL53L1_XTALK_HISTO_BINS];

} VL53L1_hist_xtalk_extract_data_t;




typedef struct {

	uint16_t   standard_ranging_gain_factor;

	uint16_t   histogram_ranging_gain_factor;


} VL53L1_gain_calibration_data_t;




typedef struct {

	VL53L1_DeviceState   cfg_device_state;

	uint8_t   cfg_stream_count;

	uint8_t   cfg_internal_stream_count;

	uint8_t   cfg_internal_stream_count_val;

	uint8_t   cfg_gph_id;

	uint8_t   cfg_timing_status;

	uint8_t   cfg_zone_id;


	VL53L1_DeviceState   rd_device_state;

	uint8_t   rd_stream_count;

	uint8_t   rd_internal_stream_count;

	uint8_t   rd_internal_stream_count_val;

	uint8_t   rd_gph_id;

	uint8_t   rd_timing_status;

	uint8_t   rd_zone_id;


} VL53L1_ll_driver_state_t;




typedef struct {

	uint8_t   wait_method;

	VL53L1_DevicePresetModes        preset_mode;

	VL53L1_DeviceZonePreset         zone_preset;

	VL53L1_DeviceMeasurementModes   measurement_mode;

	VL53L1_OffsetCalibrationMode    offset_calibration_mode;

	VL53L1_OffsetCorrectionMode     offset_correction_mode;

	VL53L1_DeviceDmaxMode           dmax_mode;

	uint32_t  phasecal_config_timeout_us;

	uint32_t  mm_config_timeout_us;

	uint32_t  range_config_timeout_us;

	uint32_t  inter_measurement_period_ms;

	uint16_t  dss_config__target_total_rate_mcps;

	uint32_t  fw_ready_poll_duration_ms;

	uint8_t   fw_ready;

	uint8_t   debug_mode;



	VL53L1_ll_version_t                 version;


	VL53L1_ll_driver_state_t            ll_state;


	VL53L1_GPIO_interrupt_config_t	    gpio_interrupt_config;


	VL53L1_customer_nvm_managed_t       customer;
	VL53L1_cal_peak_rate_map_t          cal_peak_rate_map;
	VL53L1_additional_offset_cal_data_t add_off_cal_data;
	VL53L1_dmax_calibration_data_t      fmt_dmax_cal;
	VL53L1_dmax_calibration_data_t      cust_dmax_cal;
	VL53L1_gain_calibration_data_t      gain_cal;
	VL53L1_user_zone_t                  mm_roi;
	VL53L1_optical_centre_t             optical_centre;
	VL53L1_zone_config_t                zone_cfg;


	VL53L1_tuning_parm_storage_t        tuning_parms;


	uint8_t rtn_good_spads[VL53L1_RTN_SPAD_BUFFER_SIZE];


	VL53L1_refspadchar_config_t         refspadchar;
	VL53L1_ssc_config_t                 ssc_cfg;
	VL53L1_hist_post_process_config_t   histpostprocess;
	VL53L1_hist_gen3_dmax_config_t      dmax_cfg;
	VL53L1_xtalkextract_config_t        xtalk_extract_cfg;
	VL53L1_xtalk_config_t               xtalk_cfg;
	VL53L1_offsetcal_config_t           offsetcal_cfg;
	VL53L1_zonecal_config_t             zonecal_cfg;


	VL53L1_static_nvm_managed_t         stat_nvm;
	VL53L1_histogram_config_t           hist_cfg;
	VL53L1_static_config_t              stat_cfg;
	VL53L1_general_config_t             gen_cfg;
	VL53L1_timing_config_t              tim_cfg;
	VL53L1_dynamic_config_t             dyn_cfg;
	VL53L1_system_control_t             sys_ctrl;
	VL53L1_system_results_t             sys_results;
	VL53L1_nvm_copy_data_t              nvm_copy_data;


	VL53L1_histogram_bin_data_t         hist_data;
	VL53L1_histogram_bin_data_t         hist_xtalk;


	VL53L1_xtalk_histogram_data_t       xtalk_shapes;
	VL53L1_xtalk_range_results_t        xtalk_results;
	VL53L1_xtalk_calibration_results_t  xtalk_cal;
	VL53L1_hist_xtalk_extract_data_t    xtalk_extract;


	VL53L1_offset_range_results_t       offset_results;


	VL53L1_core_results_t               core_results;
	VL53L1_debug_results_t              dbg_results;

	VL53L1_smudge_corrector_config_t	smudge_correct_config;

	VL53L1_smudge_corrector_internals_t smudge_corrector_internals;




	VL53L1_low_power_auto_data_t		low_power_auto_data;


#ifdef PAL_EXTENDED

	VL53L1_patch_results_t                patch_results;
	VL53L1_shadow_core_results_t          shadow_core_results;
	VL53L1_shadow_system_results_t        shadow_sys_results;
	VL53L1_prev_shadow_core_results_t     prev_shadow_core_results;
	VL53L1_prev_shadow_system_results_t   prev_shadow_sys_results;
#endif
	uint8_t  wArea1[1536];
	uint8_t  wArea2[512];
	VL53L1_per_vcsel_period_offset_cal_data_t per_vcsel_cal_data;

	uint8_t bin_rec_pos;

	uint8_t pos_before_next_recom;

	int32_t multi_bins_rec[VL53L1_BIN_REC_SIZE]
		[VL53L1_TIMING_CONF_A_B_SIZE][VL53L1_HISTOGRAM_BUFFER_SIZE];

	int16_t PreviousRangeMilliMeter[VL53L1_MAX_RANGE_RESULTS];
	uint8_t PreviousRangeStatus[VL53L1_MAX_RANGE_RESULTS];
	uint8_t PreviousExtendedRange[VL53L1_MAX_RANGE_RESULTS];
	uint8_t PreviousStreamCount;

} VL53L1_LLDriverData_t;




typedef struct {


	VL53L1_range_results_t             range_results;


	VL53L1_zone_private_dyn_cfgs_t     zone_dyn_cfgs;


	VL53L1_zone_results_t              zone_results;
	VL53L1_zone_histograms_t           zone_hists;
	VL53L1_zone_calibration_results_t  zone_cal;

} VL53L1_LLDriverResults_t;




typedef struct {

	uint32_t                             struct_version;
	VL53L1_customer_nvm_managed_t        customer;
	VL53L1_dmax_calibration_data_t       fmt_dmax_cal;
	VL53L1_dmax_calibration_data_t       cust_dmax_cal;
	VL53L1_additional_offset_cal_data_t  add_off_cal_data;
	VL53L1_optical_centre_t              optical_centre;
	VL53L1_xtalk_histogram_data_t        xtalkhisto;
	VL53L1_gain_calibration_data_t       gain_cal;
	VL53L1_cal_peak_rate_map_t           cal_peak_rate_map;
	VL53L1_per_vcsel_period_offset_cal_data_t per_vcsel_cal_data;

} VL53L1_calibration_data_t;




typedef struct {

	VL53L1_customer_nvm_managed_t        customer;
	VL53L1_xtalkextract_config_t         xtalk_extract_cfg;
	VL53L1_xtalk_config_t                xtalk_cfg;
	VL53L1_histogram_bin_data_t          hist_data;
	VL53L1_xtalk_histogram_data_t        xtalk_shapes;
	VL53L1_xtalk_range_results_t         xtalk_results;

} VL53L1_xtalk_debug_data_t;




typedef struct {

	VL53L1_customer_nvm_managed_t        customer;
	VL53L1_dmax_calibration_data_t       fmt_dmax_cal;
	VL53L1_dmax_calibration_data_t       cust_dmax_cal;
	VL53L1_additional_offset_cal_data_t  add_off_cal_data;
	VL53L1_offset_range_results_t        offset_results;

} VL53L1_offset_debug_data_t;




typedef struct {
	uint16_t        vl53l1_tuningparm_version;
	uint16_t        vl53l1_tuningparm_key_table_version;
	uint16_t        vl53l1_tuningparm_lld_version;
	uint8_t        vl53l1_tuningparm_hist_algo_select;
	uint8_t        vl53l1_tuningparm_hist_target_order;
	uint8_t        vl53l1_tuningparm_hist_filter_woi_0;
	uint8_t        vl53l1_tuningparm_hist_filter_woi_1;
	uint8_t        vl53l1_tuningparm_hist_amb_est_method;
	uint8_t        vl53l1_tuningparm_hist_amb_thresh_sigma_0;
	uint8_t        vl53l1_tuningparm_hist_amb_thresh_sigma_1;
	int32_t        vl53l1_tuningparm_hist_min_amb_thresh_events;
	uint16_t        vl53l1_tuningparm_hist_amb_events_scaler;
	uint16_t        vl53l1_tuningparm_hist_noise_threshold;
	int32_t        vl53l1_tuningparm_hist_signal_total_events_limit;
	uint8_t        vl53l1_tuningparm_hist_sigma_est_ref_mm;
	uint16_t        vl53l1_tuningparm_hist_sigma_thresh_mm;
	uint16_t        vl53l1_tuningparm_hist_gain_factor;
	uint8_t        vl53l1_tuningparm_consistency_hist_phase_tolerance;
	uint16_t  vl53l1_tuningparm_consistency_hist_min_max_tolerance_mm;
	uint8_t        vl53l1_tuningparm_consistency_hist_event_sigma;
	uint16_t  vl53l1_tuningparm_consistency_hist_event_sigma_min_spad_limit;
	uint8_t        vl53l1_tuningparm_initial_phase_rtn_histo_long_range;
	uint8_t        vl53l1_tuningparm_initial_phase_rtn_histo_med_range;
	uint8_t        vl53l1_tuningparm_initial_phase_rtn_histo_short_range;
	uint8_t        vl53l1_tuningparm_initial_phase_ref_histo_long_range;
	uint8_t        vl53l1_tuningparm_initial_phase_ref_histo_med_range;
	uint8_t        vl53l1_tuningparm_initial_phase_ref_histo_short_range;
	int16_t        vl53l1_tuningparm_xtalk_detect_min_valid_range_mm;
	int16_t        vl53l1_tuningparm_xtalk_detect_max_valid_range_mm;
	uint16_t        vl53l1_tuningparm_xtalk_detect_max_sigma_mm;
	uint16_t        vl53l1_tuningparm_xtalk_detect_min_max_tolerance;
	uint16_t        vl53l1_tuningparm_xtalk_detect_max_valid_rate_kcps;
	uint8_t        vl53l1_tuningparm_xtalk_detect_event_sigma;
	int16_t        vl53l1_tuningparm_hist_xtalk_margin_kcps;
	uint8_t        vl53l1_tuningparm_consistency_lite_phase_tolerance;
	uint8_t        vl53l1_tuningparm_phasecal_target;
	uint16_t        vl53l1_tuningparm_lite_cal_repeat_rate;
	uint16_t        vl53l1_tuningparm_lite_ranging_gain_factor;
	uint8_t        vl53l1_tuningparm_lite_min_clip_mm;
	uint16_t        vl53l1_tuningparm_lite_long_sigma_thresh_mm;
	uint16_t        vl53l1_tuningparm_lite_med_sigma_thresh_mm;
	uint16_t        vl53l1_tuningparm_lite_short_sigma_thresh_mm;
	uint16_t        vl53l1_tuningparm_lite_long_min_count_rate_rtn_mcps;
	uint16_t        vl53l1_tuningparm_lite_med_min_count_rate_rtn_mcps;
	uint16_t        vl53l1_tuningparm_lite_short_min_count_rate_rtn_mcps;
	uint8_t        vl53l1_tuningparm_lite_sigma_est_pulse_width;
	uint8_t        vl53l1_tuningparm_lite_sigma_est_amb_width_ns;
	uint8_t        vl53l1_tuningparm_lite_sigma_ref_mm;
	uint8_t        vl53l1_tuningparm_lite_rit_mult;
	uint8_t        vl53l1_tuningparm_lite_seed_config;
	uint8_t        vl53l1_tuningparm_lite_quantifier;
	uint8_t        vl53l1_tuningparm_lite_first_order_select;
	int16_t        vl53l1_tuningparm_lite_xtalk_margin_kcps;
	uint8_t        vl53l1_tuningparm_initial_phase_rtn_lite_long_range;
	uint8_t        vl53l1_tuningparm_initial_phase_rtn_lite_med_range;
	uint8_t        vl53l1_tuningparm_initial_phase_rtn_lite_short_range;
	uint8_t        vl53l1_tuningparm_initial_phase_ref_lite_long_range;
	uint8_t        vl53l1_tuningparm_initial_phase_ref_lite_med_range;
	uint8_t        vl53l1_tuningparm_initial_phase_ref_lite_short_range;
	uint8_t        vl53l1_tuningparm_timed_seed_config;
	uint8_t        vl53l1_tuningparm_dmax_cfg_signal_thresh_sigma;
	uint16_t        vl53l1_tuningparm_dmax_cfg_reflectance_array_0;
	uint16_t        vl53l1_tuningparm_dmax_cfg_reflectance_array_1;
	uint16_t        vl53l1_tuningparm_dmax_cfg_reflectance_array_2;
	uint16_t        vl53l1_tuningparm_dmax_cfg_reflectance_array_3;
	uint16_t        vl53l1_tuningparm_dmax_cfg_reflectance_array_4;
	uint8_t        vl53l1_tuningparm_vhv_loopbound;
	uint8_t        vl53l1_tuningparm_refspadchar_device_test_mode;
	uint8_t        vl53l1_tuningparm_refspadchar_vcsel_period;
	uint32_t        vl53l1_tuningparm_refspadchar_phasecal_timeout_us;
	uint16_t        vl53l1_tuningparm_refspadchar_target_count_rate_mcps;
	uint16_t        vl53l1_tuningparm_refspadchar_min_countrate_limit_mcps;
	uint16_t        vl53l1_tuningparm_refspadchar_max_countrate_limit_mcps;
	uint8_t        vl53l1_tuningparm_xtalk_extract_num_of_samples;
	int16_t        vl53l1_tuningparm_xtalk_extract_min_filter_thresh_mm;
	int16_t        vl53l1_tuningparm_xtalk_extract_max_filter_thresh_mm;
	uint16_t        vl53l1_tuningparm_xtalk_extract_dss_rate_mcps;
	uint32_t        vl53l1_tuningparm_xtalk_extract_phasecal_timeout_us;
	uint16_t        vl53l1_tuningparm_xtalk_extract_max_valid_rate_kcps;
	uint16_t        vl53l1_tuningparm_xtalk_extract_sigma_threshold_mm;
	uint32_t        vl53l1_tuningparm_xtalk_extract_dss_timeout_us;
	uint32_t        vl53l1_tuningparm_xtalk_extract_bin_timeout_us;
	uint16_t        vl53l1_tuningparm_offset_cal_dss_rate_mcps;
	uint32_t        vl53l1_tuningparm_offset_cal_phasecal_timeout_us;
	uint32_t        vl53l1_tuningparm_offset_cal_mm_timeout_us;
	uint32_t        vl53l1_tuningparm_offset_cal_range_timeout_us;
	uint8_t        vl53l1_tuningparm_offset_cal_pre_samples;
	uint8_t        vl53l1_tuningparm_offset_cal_mm1_samples;
	uint8_t        vl53l1_tuningparm_offset_cal_mm2_samples;
	uint16_t        vl53l1_tuningparm_zone_cal_dss_rate_mcps;
	uint32_t        vl53l1_tuningparm_zone_cal_phasecal_timeout_us;
	uint32_t        vl53l1_tuningparm_zone_cal_dss_timeout_us;
	uint16_t        vl53l1_tuningparm_zone_cal_phasecal_num_samples;
	uint32_t        vl53l1_tuningparm_zone_cal_range_timeout_us;
	uint16_t        vl53l1_tuningparm_zone_cal_zone_num_samples;
	uint8_t        vl53l1_tuningparm_spadmap_vcsel_period;
	uint8_t        vl53l1_tuningparm_spadmap_vcsel_start;
	uint16_t        vl53l1_tuningparm_spadmap_rate_limit_mcps;
	uint16_t  vl53l1_tuningparm_lite_dss_config_target_total_rate_mcps;
	uint16_t   vl53l1_tuningparm_ranging_dss_config_target_total_rate_mcps;
	uint16_t        vl53l1_tuningparm_mz_dss_config_target_total_rate_mcps;
	uint16_t     vl53l1_tuningparm_timed_dss_config_target_total_rate_mcps;
	uint32_t        vl53l1_tuningparm_lite_phasecal_config_timeout_us;
	uint32_t     vl53l1_tuningparm_ranging_long_phasecal_config_timeout_us;
	uint32_t      vl53l1_tuningparm_ranging_med_phasecal_config_timeout_us;
	uint32_t    vl53l1_tuningparm_ranging_short_phasecal_config_timeout_us;
	uint32_t        vl53l1_tuningparm_mz_long_phasecal_config_timeout_us;
	uint32_t        vl53l1_tuningparm_mz_med_phasecal_config_timeout_us;
	uint32_t        vl53l1_tuningparm_mz_short_phasecal_config_timeout_us;
	uint32_t        vl53l1_tuningparm_timed_phasecal_config_timeout_us;
	uint32_t        vl53l1_tuningparm_lite_mm_config_timeout_us;
	uint32_t        vl53l1_tuningparm_ranging_mm_config_timeout_us;
	uint32_t        vl53l1_tuningparm_mz_mm_config_timeout_us;
	uint32_t        vl53l1_tuningparm_timed_mm_config_timeout_us;
	uint32_t        vl53l1_tuningparm_lite_range_config_timeout_us;
	uint32_t        vl53l1_tuningparm_ranging_range_config_timeout_us;
	uint32_t        vl53l1_tuningparm_mz_range_config_timeout_us;
	uint32_t        vl53l1_tuningparm_timed_range_config_timeout_us;
	uint16_t        vl53l1_tuningparm_dynxtalk_smudge_margin;
	uint32_t        vl53l1_tuningparm_dynxtalk_noise_margin;
	uint32_t        vl53l1_tuningparm_dynxtalk_xtalk_offset_limit;
	uint8_t        vl53l1_tuningparm_dynxtalk_xtalk_offset_limit_hi;
	uint32_t        vl53l1_tuningparm_dynxtalk_sample_limit;
	uint32_t        vl53l1_tuningparm_dynxtalk_single_xtalk_delta;
	uint32_t        vl53l1_tuningparm_dynxtalk_averaged_xtalk_delta;
	uint32_t        vl53l1_tuningparm_dynxtalk_clip_limit;
	uint8_t        vl53l1_tuningparm_dynxtalk_scaler_calc_method;
	int16_t        vl53l1_tuningparm_dynxtalk_xgradient_scaler;
	int16_t        vl53l1_tuningparm_dynxtalk_ygradient_scaler;
	uint8_t        vl53l1_tuningparm_dynxtalk_user_scaler_set;
	uint8_t        vl53l1_tuningparm_dynxtalk_smudge_cor_single_apply;
	uint32_t        vl53l1_tuningparm_dynxtalk_xtalk_amb_threshold;
	uint32_t        vl53l1_tuningparm_dynxtalk_nodetect_amb_threshold_kcps;
	uint32_t        vl53l1_tuningparm_dynxtalk_nodetect_sample_limit;
	uint32_t        vl53l1_tuningparm_dynxtalk_nodetect_xtalk_offset_kcps;
	uint16_t        vl53l1_tuningparm_dynxtalk_nodetect_min_range_mm;
	uint8_t        vl53l1_tuningparm_lowpowerauto_vhv_loop_bound;
	uint32_t        vl53l1_tuningparm_lowpowerauto_mm_config_timeout_us;
	uint32_t        vl53l1_tuningparm_lowpowerauto_range_config_timeout_us;
	uint16_t        vl53l1_tuningparm_very_short_dss_rate_mcps;
	uint32_t        vl53l1_tuningparm_phasecal_patch_power;
} VL53L1_tuning_parameters_t;





typedef struct {

	uint16_t  target_reflectance_for_dmax[VL53L1_MAX_AMBIENT_DMAX_VALUES];

} VL53L1_dmax_reflectance_array_t;




typedef struct {

	uint8_t    spad_type;

	uint16_t   VL53L1_p_023;

	uint16_t   rate_data[VL53L1_NO_OF_SPAD_ENABLES];

	uint16_t    no_of_values;

	uint8_t    fractional_bits;

	uint8_t    error_status;


} VL53L1_spad_rate_data_t;






typedef struct {

	VL53L1_DevicePresetModes        preset_mode;

	VL53L1_DeviceZonePreset         zone_preset;

	VL53L1_DeviceMeasurementModes   measurement_mode;

	VL53L1_OffsetCalibrationMode    offset_calibration_mode;

	VL53L1_OffsetCorrectionMode     offset_correction_mode;

	VL53L1_DeviceDmaxMode           dmax_mode;


	uint32_t  phasecal_config_timeout_us;

	uint32_t  mm_config_timeout_us;

	uint32_t  range_config_timeout_us;

	uint32_t  inter_measurement_period_ms;

	uint16_t  dss_config__target_total_rate_mcps;


	VL53L1_histogram_bin_data_t    VL53L1_p_010;


} VL53L1_additional_data_t;








#define SUPPRESS_UNUSED_WARNING(x) \
	((void) (x))


#define IGNORE_STATUS(__FUNCTION_ID__, __ERROR_STATUS_CHECK__, __STATUS__) \
	do { \
		DISABLE_WARNINGS(); \
		if (__FUNCTION_ID__) { \
			if (__STATUS__ == __ERROR_STATUS_CHECK__) { \
				__STATUS__ = VL53L1_ERROR_NONE; \
				WARN_OVERRIDE_STATUS(__FUNCTION_ID__); \
			} \
		} \
		ENABLE_WARNINGS(); \
	} \
	while (0)

#define VL53L1_COPYSTRING(str, ...) \
	(strncpy(str, ##__VA_ARGS__, VL53L1_MAX_STRING_LENGTH-1))

#ifdef __cplusplus
}
#endif

#endif