Rename library
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: VL53L3CX_NoShield_1Sensor_poll_Mb06x VL53L3_NoShield_1Sensor_polling_Mb63 X_NUCLEO_53L3A2 53L3A2_Ranging
modules/vl53lx_api_calibration.c@7:7f1bbf370283, 2021-07-21 (annotated)
- Committer:
- charlesmn
- Date:
- Wed Jul 21 14:07:59 2021 +0000
- Revision:
- 7:7f1bbf370283
- Parent:
- 5:89031b2f5316
Moved vl53l3cx_class.cpp and .h to 53l3a2_RangingClass
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Charles MacNeill |
5:89031b2f5316 | 1 | |
Charles MacNeill |
5:89031b2f5316 | 2 | // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause |
Charles MacNeill |
5:89031b2f5316 | 3 | /****************************************************************************** |
Charles MacNeill |
5:89031b2f5316 | 4 | * Copyright (c) 2020, STMicroelectronics - All Rights Reserved |
Charles MacNeill |
5:89031b2f5316 | 5 | |
Charles MacNeill |
5:89031b2f5316 | 6 | This file is part of VL53LX and is dual licensed, |
Charles MacNeill |
5:89031b2f5316 | 7 | either GPL-2.0+ |
Charles MacNeill |
5:89031b2f5316 | 8 | or 'BSD 3-clause "New" or "Revised" License' , at your option. |
Charles MacNeill |
5:89031b2f5316 | 9 | ****************************************************************************** |
Charles MacNeill |
5:89031b2f5316 | 10 | */ |
Charles MacNeill |
5:89031b2f5316 | 11 | |
Charles MacNeill |
5:89031b2f5316 | 12 | |
Charles MacNeill |
5:89031b2f5316 | 13 | |
Charles MacNeill |
5:89031b2f5316 | 14 | |
Charles MacNeill |
5:89031b2f5316 | 15 | |
Charles MacNeill |
5:89031b2f5316 | 16 | #include "vl53lx_platform.h" |
Charles MacNeill |
5:89031b2f5316 | 17 | #include "vl53lx_platform_ipp.h" |
Charles MacNeill |
5:89031b2f5316 | 18 | #include "vl53lx_ll_def.h" |
Charles MacNeill |
5:89031b2f5316 | 19 | #include "vl53lx_ll_device.h" |
Charles MacNeill |
5:89031b2f5316 | 20 | #include "vl53lx_register_map.h" |
Charles MacNeill |
5:89031b2f5316 | 21 | #include "vl53lx_register_funcs.h" |
Charles MacNeill |
5:89031b2f5316 | 22 | #include "vl53lx_register_settings.h" |
Charles MacNeill |
5:89031b2f5316 | 23 | #include "vl53lx_hist_map.h" |
Charles MacNeill |
5:89031b2f5316 | 24 | #include "vl53lx_hist_structs.h" |
Charles MacNeill |
5:89031b2f5316 | 25 | #include "vl53lx_core.h" |
Charles MacNeill |
5:89031b2f5316 | 26 | #include "vl53lx_wait.h" |
Charles MacNeill |
5:89031b2f5316 | 27 | #include "vl53lx_api_preset_modes.h" |
Charles MacNeill |
5:89031b2f5316 | 28 | #include "vl53lx_silicon_core.h" |
Charles MacNeill |
5:89031b2f5316 | 29 | #include "vl53lx_api_core.h" |
Charles MacNeill |
5:89031b2f5316 | 30 | #include "vl53lx_api_calibration.h" |
Charles MacNeill |
5:89031b2f5316 | 31 | |
Charles MacNeill |
5:89031b2f5316 | 32 | #ifdef VL53LX_LOG_ENABLE |
Charles MacNeill |
5:89031b2f5316 | 33 | #include "vl53lx_api_debug.h" |
Charles MacNeill |
5:89031b2f5316 | 34 | #endif |
Charles MacNeill |
5:89031b2f5316 | 35 | |
Charles MacNeill |
5:89031b2f5316 | 36 | |
Charles MacNeill |
5:89031b2f5316 | 37 | #define LOG_FUNCTION_START(fmt, ...) \ |
Charles MacNeill |
5:89031b2f5316 | 38 | _LOG_FUNCTION_START(VL53LX_TRACE_MODULE_CORE, fmt, ##__VA_ARGS__) |
Charles MacNeill |
5:89031b2f5316 | 39 | #define LOG_FUNCTION_END(status, ...) \ |
Charles MacNeill |
5:89031b2f5316 | 40 | _LOG_FUNCTION_END(VL53LX_TRACE_MODULE_CORE, status, ##__VA_ARGS__) |
Charles MacNeill |
5:89031b2f5316 | 41 | #define LOG_FUNCTION_END_FMT(status, fmt, ...) \ |
Charles MacNeill |
5:89031b2f5316 | 42 | _LOG_FUNCTION_END_FMT(VL53LX_TRACE_MODULE_CORE, status, \ |
Charles MacNeill |
5:89031b2f5316 | 43 | fmt, ##__VA_ARGS__) |
Charles MacNeill |
5:89031b2f5316 | 44 | |
Charles MacNeill |
5:89031b2f5316 | 45 | #define trace_print(level, ...) \ |
Charles MacNeill |
5:89031b2f5316 | 46 | _LOG_TRACE_PRINT(VL53LX_TRACE_MODULE_CORE, \ |
Charles MacNeill |
5:89031b2f5316 | 47 | level, VL53LX_TRACE_FUNCTION_NONE, ##__VA_ARGS__) |
Charles MacNeill |
5:89031b2f5316 | 48 | |
Charles MacNeill |
5:89031b2f5316 | 49 | |
Charles MacNeill |
5:89031b2f5316 | 50 | VL53LX_Error VL53LX_run_ref_spad_char( |
Charles MacNeill |
5:89031b2f5316 | 51 | VL53LX_DEV Dev, |
Charles MacNeill |
5:89031b2f5316 | 52 | VL53LX_Error *pcal_status) |
Charles MacNeill |
5:89031b2f5316 | 53 | { |
Charles MacNeill |
5:89031b2f5316 | 54 | |
Charles MacNeill |
5:89031b2f5316 | 55 | |
Charles MacNeill |
5:89031b2f5316 | 56 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 57 | VL53LX_LLDriverData_t *pdev = VL53LXDevStructGetLLDriverHandle(Dev); |
Charles MacNeill |
5:89031b2f5316 | 58 | |
Charles MacNeill |
5:89031b2f5316 | 59 | uint8_t comms_buffer[6]; |
Charles MacNeill |
5:89031b2f5316 | 60 | |
Charles MacNeill |
5:89031b2f5316 | 61 | VL53LX_refspadchar_config_t *prefspadchar = &(pdev->refspadchar); |
Charles MacNeill |
5:89031b2f5316 | 62 | |
Charles MacNeill |
5:89031b2f5316 | 63 | LOG_FUNCTION_START(""); |
Charles MacNeill |
5:89031b2f5316 | 64 | |
Charles MacNeill |
5:89031b2f5316 | 65 | |
Charles MacNeill |
5:89031b2f5316 | 66 | |
Charles MacNeill |
5:89031b2f5316 | 67 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 68 | status = VL53LX_enable_powerforce(Dev); |
Charles MacNeill |
5:89031b2f5316 | 69 | |
Charles MacNeill |
5:89031b2f5316 | 70 | |
Charles MacNeill |
5:89031b2f5316 | 71 | |
Charles MacNeill |
5:89031b2f5316 | 72 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 73 | status = |
Charles MacNeill |
5:89031b2f5316 | 74 | VL53LX_set_ref_spad_char_config( |
Charles MacNeill |
5:89031b2f5316 | 75 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 76 | prefspadchar->VL53LX_p_005, |
Charles MacNeill |
5:89031b2f5316 | 77 | prefspadchar->timeout_us, |
Charles MacNeill |
5:89031b2f5316 | 78 | prefspadchar->target_count_rate_mcps, |
Charles MacNeill |
5:89031b2f5316 | 79 | prefspadchar->max_count_rate_limit_mcps, |
Charles MacNeill |
5:89031b2f5316 | 80 | prefspadchar->min_count_rate_limit_mcps, |
Charles MacNeill |
5:89031b2f5316 | 81 | pdev->stat_nvm.osc_measured__fast_osc__frequency); |
Charles MacNeill |
5:89031b2f5316 | 82 | |
Charles MacNeill |
5:89031b2f5316 | 83 | |
Charles MacNeill |
5:89031b2f5316 | 84 | |
Charles MacNeill |
5:89031b2f5316 | 85 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 86 | status = VL53LX_run_device_test( |
Charles MacNeill |
5:89031b2f5316 | 87 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 88 | prefspadchar->device_test_mode); |
Charles MacNeill |
5:89031b2f5316 | 89 | |
Charles MacNeill |
5:89031b2f5316 | 90 | |
Charles MacNeill |
5:89031b2f5316 | 91 | |
Charles MacNeill |
5:89031b2f5316 | 92 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 93 | status = |
Charles MacNeill |
5:89031b2f5316 | 94 | VL53LX_ReadMulti( |
Charles MacNeill |
5:89031b2f5316 | 95 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 96 | VL53LX_REF_SPAD_CHAR_RESULT__NUM_ACTUAL_REF_SPADS, |
Charles MacNeill |
5:89031b2f5316 | 97 | comms_buffer, |
Charles MacNeill |
5:89031b2f5316 | 98 | 2); |
Charles MacNeill |
5:89031b2f5316 | 99 | |
Charles MacNeill |
5:89031b2f5316 | 100 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 101 | pdev->dbg_results.ref_spad_char_result__num_actual_ref_spads = |
Charles MacNeill |
5:89031b2f5316 | 102 | comms_buffer[0]; |
Charles MacNeill |
5:89031b2f5316 | 103 | pdev->dbg_results.ref_spad_char_result__ref_location = |
Charles MacNeill |
5:89031b2f5316 | 104 | comms_buffer[1]; |
Charles MacNeill |
5:89031b2f5316 | 105 | } |
Charles MacNeill |
5:89031b2f5316 | 106 | |
Charles MacNeill |
5:89031b2f5316 | 107 | |
Charles MacNeill |
5:89031b2f5316 | 108 | |
Charles MacNeill |
5:89031b2f5316 | 109 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 110 | status = |
Charles MacNeill |
5:89031b2f5316 | 111 | VL53LX_WriteMulti( |
Charles MacNeill |
5:89031b2f5316 | 112 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 113 | VL53LX_REF_SPAD_MAN__NUM_REQUESTED_REF_SPADS, |
Charles MacNeill |
5:89031b2f5316 | 114 | comms_buffer, |
Charles MacNeill |
5:89031b2f5316 | 115 | 2); |
Charles MacNeill |
5:89031b2f5316 | 116 | |
Charles MacNeill |
5:89031b2f5316 | 117 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 118 | pdev->customer.ref_spad_man__num_requested_ref_spads = |
Charles MacNeill |
5:89031b2f5316 | 119 | comms_buffer[0]; |
Charles MacNeill |
5:89031b2f5316 | 120 | pdev->customer.ref_spad_man__ref_location = |
Charles MacNeill |
5:89031b2f5316 | 121 | comms_buffer[1]; |
Charles MacNeill |
5:89031b2f5316 | 122 | } |
Charles MacNeill |
5:89031b2f5316 | 123 | |
Charles MacNeill |
5:89031b2f5316 | 124 | |
Charles MacNeill |
5:89031b2f5316 | 125 | |
Charles MacNeill |
5:89031b2f5316 | 126 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 127 | status = |
Charles MacNeill |
5:89031b2f5316 | 128 | VL53LX_ReadMulti( |
Charles MacNeill |
5:89031b2f5316 | 129 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 130 | VL53LX_RESULT__SPARE_0_SD1, |
Charles MacNeill |
5:89031b2f5316 | 131 | comms_buffer, |
Charles MacNeill |
5:89031b2f5316 | 132 | 6); |
Charles MacNeill |
5:89031b2f5316 | 133 | |
Charles MacNeill |
5:89031b2f5316 | 134 | |
Charles MacNeill |
5:89031b2f5316 | 135 | |
Charles MacNeill |
5:89031b2f5316 | 136 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 137 | status = |
Charles MacNeill |
5:89031b2f5316 | 138 | VL53LX_WriteMulti( |
Charles MacNeill |
5:89031b2f5316 | 139 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 140 | VL53LX_GLOBAL_CONFIG__SPAD_ENABLES_REF_0, |
Charles MacNeill |
5:89031b2f5316 | 141 | comms_buffer, |
Charles MacNeill |
5:89031b2f5316 | 142 | 6); |
Charles MacNeill |
5:89031b2f5316 | 143 | |
Charles MacNeill |
5:89031b2f5316 | 144 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 145 | pdev->customer.global_config__spad_enables_ref_0 = |
Charles MacNeill |
5:89031b2f5316 | 146 | comms_buffer[0]; |
Charles MacNeill |
5:89031b2f5316 | 147 | pdev->customer.global_config__spad_enables_ref_1 = |
Charles MacNeill |
5:89031b2f5316 | 148 | comms_buffer[1]; |
Charles MacNeill |
5:89031b2f5316 | 149 | pdev->customer.global_config__spad_enables_ref_2 = |
Charles MacNeill |
5:89031b2f5316 | 150 | comms_buffer[2]; |
Charles MacNeill |
5:89031b2f5316 | 151 | pdev->customer.global_config__spad_enables_ref_3 = |
Charles MacNeill |
5:89031b2f5316 | 152 | comms_buffer[3]; |
Charles MacNeill |
5:89031b2f5316 | 153 | pdev->customer.global_config__spad_enables_ref_4 = |
Charles MacNeill |
5:89031b2f5316 | 154 | comms_buffer[4]; |
Charles MacNeill |
5:89031b2f5316 | 155 | pdev->customer.global_config__spad_enables_ref_5 = |
Charles MacNeill |
5:89031b2f5316 | 156 | comms_buffer[5]; |
Charles MacNeill |
5:89031b2f5316 | 157 | } |
Charles MacNeill |
5:89031b2f5316 | 158 | |
Charles MacNeill |
5:89031b2f5316 | 159 | #ifdef VL53LX_LOG_ENABLE |
Charles MacNeill |
5:89031b2f5316 | 160 | |
Charles MacNeill |
5:89031b2f5316 | 161 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 162 | VL53LX_print_customer_nvm_managed( |
Charles MacNeill |
5:89031b2f5316 | 163 | &(pdev->customer), |
Charles MacNeill |
5:89031b2f5316 | 164 | "run_ref_spad_char():pdev->lldata.customer.", |
Charles MacNeill |
5:89031b2f5316 | 165 | VL53LX_TRACE_MODULE_REF_SPAD_CHAR); |
Charles MacNeill |
5:89031b2f5316 | 166 | #endif |
Charles MacNeill |
5:89031b2f5316 | 167 | |
Charles MacNeill |
5:89031b2f5316 | 168 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 169 | |
Charles MacNeill |
5:89031b2f5316 | 170 | switch (pdev->sys_results.result__range_status) { |
Charles MacNeill |
5:89031b2f5316 | 171 | |
Charles MacNeill |
5:89031b2f5316 | 172 | case VL53LX_DEVICEERROR_REFSPADCHARNOTENOUGHDPADS: |
Charles MacNeill |
5:89031b2f5316 | 173 | status = VL53LX_WARNING_REF_SPAD_CHAR_NOT_ENOUGH_SPADS; |
Charles MacNeill |
5:89031b2f5316 | 174 | break; |
Charles MacNeill |
5:89031b2f5316 | 175 | |
Charles MacNeill |
5:89031b2f5316 | 176 | case VL53LX_DEVICEERROR_REFSPADCHARMORETHANTARGET: |
Charles MacNeill |
5:89031b2f5316 | 177 | status = VL53LX_WARNING_REF_SPAD_CHAR_RATE_TOO_HIGH; |
Charles MacNeill |
5:89031b2f5316 | 178 | break; |
Charles MacNeill |
5:89031b2f5316 | 179 | |
Charles MacNeill |
5:89031b2f5316 | 180 | case VL53LX_DEVICEERROR_REFSPADCHARLESSTHANTARGET: |
Charles MacNeill |
5:89031b2f5316 | 181 | status = VL53LX_WARNING_REF_SPAD_CHAR_RATE_TOO_LOW; |
Charles MacNeill |
5:89031b2f5316 | 182 | break; |
Charles MacNeill |
5:89031b2f5316 | 183 | } |
Charles MacNeill |
5:89031b2f5316 | 184 | } |
Charles MacNeill |
5:89031b2f5316 | 185 | |
Charles MacNeill |
5:89031b2f5316 | 186 | |
Charles MacNeill |
5:89031b2f5316 | 187 | |
Charles MacNeill |
5:89031b2f5316 | 188 | *pcal_status = status; |
Charles MacNeill |
5:89031b2f5316 | 189 | |
Charles MacNeill |
5:89031b2f5316 | 190 | |
Charles MacNeill |
5:89031b2f5316 | 191 | |
Charles MacNeill |
5:89031b2f5316 | 192 | IGNORE_STATUS( |
Charles MacNeill |
5:89031b2f5316 | 193 | IGNORE_REF_SPAD_CHAR_NOT_ENOUGH_SPADS, |
Charles MacNeill |
5:89031b2f5316 | 194 | VL53LX_WARNING_REF_SPAD_CHAR_NOT_ENOUGH_SPADS, |
Charles MacNeill |
5:89031b2f5316 | 195 | status); |
Charles MacNeill |
5:89031b2f5316 | 196 | |
Charles MacNeill |
5:89031b2f5316 | 197 | IGNORE_STATUS( |
Charles MacNeill |
5:89031b2f5316 | 198 | IGNORE_REF_SPAD_CHAR_RATE_TOO_HIGH, |
Charles MacNeill |
5:89031b2f5316 | 199 | VL53LX_WARNING_REF_SPAD_CHAR_RATE_TOO_HIGH, |
Charles MacNeill |
5:89031b2f5316 | 200 | status); |
Charles MacNeill |
5:89031b2f5316 | 201 | |
Charles MacNeill |
5:89031b2f5316 | 202 | IGNORE_STATUS( |
Charles MacNeill |
5:89031b2f5316 | 203 | IGNORE_REF_SPAD_CHAR_RATE_TOO_LOW, |
Charles MacNeill |
5:89031b2f5316 | 204 | VL53LX_WARNING_REF_SPAD_CHAR_RATE_TOO_LOW, |
Charles MacNeill |
5:89031b2f5316 | 205 | status); |
Charles MacNeill |
5:89031b2f5316 | 206 | |
Charles MacNeill |
5:89031b2f5316 | 207 | |
Charles MacNeill |
5:89031b2f5316 | 208 | LOG_FUNCTION_END(status); |
Charles MacNeill |
5:89031b2f5316 | 209 | |
Charles MacNeill |
5:89031b2f5316 | 210 | return status; |
Charles MacNeill |
5:89031b2f5316 | 211 | } |
Charles MacNeill |
5:89031b2f5316 | 212 | |
Charles MacNeill |
5:89031b2f5316 | 213 | |
Charles MacNeill |
5:89031b2f5316 | 214 | VL53LX_Error VL53LX_get_and_avg_xtalk_samples( |
Charles MacNeill |
5:89031b2f5316 | 215 | VL53LX_DEV Dev, |
Charles MacNeill |
5:89031b2f5316 | 216 | uint8_t num_of_samples, |
Charles MacNeill |
5:89031b2f5316 | 217 | uint8_t measurement_mode, |
Charles MacNeill |
5:89031b2f5316 | 218 | int16_t xtalk_filter_thresh_max_mm, |
Charles MacNeill |
5:89031b2f5316 | 219 | int16_t xtalk_filter_thresh_min_mm, |
Charles MacNeill |
5:89031b2f5316 | 220 | uint16_t xtalk_max_valid_rate_kcps, |
Charles MacNeill |
5:89031b2f5316 | 221 | uint8_t xtalk_result_id, |
Charles MacNeill |
5:89031b2f5316 | 222 | uint8_t xtalk_histo_id, |
Charles MacNeill |
5:89031b2f5316 | 223 | VL53LX_xtalk_range_results_t *pXR, |
Charles MacNeill |
5:89031b2f5316 | 224 | VL53LX_histogram_bin_data_t *psum_histo, |
Charles MacNeill |
5:89031b2f5316 | 225 | VL53LX_histogram_bin_data_t *pavg_histo) |
Charles MacNeill |
5:89031b2f5316 | 226 | { |
Charles MacNeill |
5:89031b2f5316 | 227 | |
Charles MacNeill |
5:89031b2f5316 | 228 | |
Charles MacNeill |
5:89031b2f5316 | 229 | |
Charles MacNeill |
5:89031b2f5316 | 230 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 231 | VL53LX_LLDriverData_t *pdev = |
Charles MacNeill |
5:89031b2f5316 | 232 | VL53LXDevStructGetLLDriverHandle(Dev); |
Charles MacNeill |
5:89031b2f5316 | 233 | |
Charles MacNeill |
5:89031b2f5316 | 234 | #ifdef VL53LX_LOG_ENABLE |
Charles MacNeill |
5:89031b2f5316 | 235 | VL53LX_LLDriverResults_t *pres = |
Charles MacNeill |
5:89031b2f5316 | 236 | VL53LXDevStructGetLLResultsHandle(Dev); |
Charles MacNeill |
5:89031b2f5316 | 237 | #endif |
Charles MacNeill |
5:89031b2f5316 | 238 | |
Charles MacNeill |
5:89031b2f5316 | 239 | VL53LX_range_results_t *prs = |
Charles MacNeill |
5:89031b2f5316 | 240 | (VL53LX_range_results_t *) pdev->wArea1; |
Charles MacNeill |
5:89031b2f5316 | 241 | |
Charles MacNeill |
5:89031b2f5316 | 242 | VL53LX_range_data_t *prange_data; |
Charles MacNeill |
5:89031b2f5316 | 243 | VL53LX_xtalk_range_data_t *pxtalk_range_data; |
Charles MacNeill |
5:89031b2f5316 | 244 | |
Charles MacNeill |
5:89031b2f5316 | 245 | uint8_t i = 0; |
Charles MacNeill |
5:89031b2f5316 | 246 | uint8_t j = 0; |
Charles MacNeill |
5:89031b2f5316 | 247 | uint8_t zone_id = 0; |
Charles MacNeill |
5:89031b2f5316 | 248 | uint8_t final_zone = pdev->zone_cfg.active_zones+1; |
Charles MacNeill |
5:89031b2f5316 | 249 | uint8_t valid_result; |
Charles MacNeill |
5:89031b2f5316 | 250 | |
Charles MacNeill |
5:89031b2f5316 | 251 | uint8_t smudge_corr_en = 0; |
Charles MacNeill |
5:89031b2f5316 | 252 | |
Charles MacNeill |
5:89031b2f5316 | 253 | |
Charles MacNeill |
5:89031b2f5316 | 254 | |
Charles MacNeill |
5:89031b2f5316 | 255 | |
Charles MacNeill |
5:89031b2f5316 | 256 | smudge_corr_en = pdev->smudge_correct_config.smudge_corr_enabled; |
Charles MacNeill |
5:89031b2f5316 | 257 | |
Charles MacNeill |
5:89031b2f5316 | 258 | status = VL53LX_dynamic_xtalk_correction_disable(Dev); |
Charles MacNeill |
5:89031b2f5316 | 259 | |
Charles MacNeill |
5:89031b2f5316 | 260 | |
Charles MacNeill |
5:89031b2f5316 | 261 | VL53LX_load_patch(Dev); |
Charles MacNeill |
5:89031b2f5316 | 262 | |
Charles MacNeill |
5:89031b2f5316 | 263 | |
Charles MacNeill |
5:89031b2f5316 | 264 | |
Charles MacNeill |
5:89031b2f5316 | 265 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 266 | status = |
Charles MacNeill |
5:89031b2f5316 | 267 | VL53LX_init_and_start_range( |
Charles MacNeill |
5:89031b2f5316 | 268 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 269 | measurement_mode, |
Charles MacNeill |
5:89031b2f5316 | 270 | VL53LX_DEVICECONFIGLEVEL_CUSTOMER_ONWARDS); |
Charles MacNeill |
5:89031b2f5316 | 271 | |
Charles MacNeill |
5:89031b2f5316 | 272 | |
Charles MacNeill |
5:89031b2f5316 | 273 | for (i = 0; i <= (final_zone*num_of_samples); i++) { |
Charles MacNeill |
5:89031b2f5316 | 274 | |
Charles MacNeill |
5:89031b2f5316 | 275 | |
Charles MacNeill |
5:89031b2f5316 | 276 | |
Charles MacNeill |
5:89031b2f5316 | 277 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 278 | status = VL53LX_wait_for_range_completion(Dev); |
Charles MacNeill |
5:89031b2f5316 | 279 | |
Charles MacNeill |
5:89031b2f5316 | 280 | |
Charles MacNeill |
5:89031b2f5316 | 281 | |
Charles MacNeill |
5:89031b2f5316 | 282 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 283 | status = |
Charles MacNeill |
5:89031b2f5316 | 284 | VL53LX_get_device_results( |
Charles MacNeill |
5:89031b2f5316 | 285 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 286 | VL53LX_DEVICERESULTSLEVEL_FULL, |
Charles MacNeill |
5:89031b2f5316 | 287 | prs); |
Charles MacNeill |
5:89031b2f5316 | 288 | |
Charles MacNeill |
5:89031b2f5316 | 289 | |
Charles MacNeill |
5:89031b2f5316 | 290 | |
Charles MacNeill |
5:89031b2f5316 | 291 | if (status == VL53LX_ERROR_NONE && |
Charles MacNeill |
5:89031b2f5316 | 292 | pdev->ll_state.rd_device_state != |
Charles MacNeill |
5:89031b2f5316 | 293 | VL53LX_DEVICESTATE_RANGING_WAIT_GPH_SYNC) { |
Charles MacNeill |
5:89031b2f5316 | 294 | |
Charles MacNeill |
5:89031b2f5316 | 295 | zone_id = pdev->ll_state.rd_zone_id + xtalk_result_id; |
Charles MacNeill |
5:89031b2f5316 | 296 | prange_data = &(prs->VL53LX_p_003[0]); |
Charles MacNeill |
5:89031b2f5316 | 297 | |
Charles MacNeill |
5:89031b2f5316 | 298 | |
Charles MacNeill |
5:89031b2f5316 | 299 | if (prs->active_results > 1) { |
Charles MacNeill |
5:89031b2f5316 | 300 | for (j = 1; |
Charles MacNeill |
5:89031b2f5316 | 301 | j < prs->active_results; j++) { |
Charles MacNeill |
5:89031b2f5316 | 302 | if (prs->VL53LX_p_003[j].median_range_mm |
Charles MacNeill |
5:89031b2f5316 | 303 | < |
Charles MacNeill |
5:89031b2f5316 | 304 | prange_data->median_range_mm) |
Charles MacNeill |
5:89031b2f5316 | 305 | prange_data = |
Charles MacNeill |
5:89031b2f5316 | 306 | &(prs->VL53LX_p_003[j]); |
Charles MacNeill |
5:89031b2f5316 | 307 | |
Charles MacNeill |
5:89031b2f5316 | 308 | } |
Charles MacNeill |
5:89031b2f5316 | 309 | } |
Charles MacNeill |
5:89031b2f5316 | 310 | |
Charles MacNeill |
5:89031b2f5316 | 311 | pxtalk_range_data = &(pXR->VL53LX_p_003[zone_id]); |
Charles MacNeill |
5:89031b2f5316 | 312 | |
Charles MacNeill |
5:89031b2f5316 | 313 | |
Charles MacNeill |
5:89031b2f5316 | 314 | |
Charles MacNeill |
5:89031b2f5316 | 315 | if ((prs->active_results > 0) && |
Charles MacNeill |
5:89031b2f5316 | 316 | (prange_data->median_range_mm < |
Charles MacNeill |
5:89031b2f5316 | 317 | xtalk_filter_thresh_max_mm) && |
Charles MacNeill |
5:89031b2f5316 | 318 | (prange_data->median_range_mm > |
Charles MacNeill |
5:89031b2f5316 | 319 | xtalk_filter_thresh_min_mm) && |
Charles MacNeill |
5:89031b2f5316 | 320 | (prange_data->VL53LX_p_009 < |
Charles MacNeill |
5:89031b2f5316 | 321 | (uint32_t)(xtalk_max_valid_rate_kcps * 16))) |
Charles MacNeill |
5:89031b2f5316 | 322 | valid_result = 1; |
Charles MacNeill |
5:89031b2f5316 | 323 | else |
Charles MacNeill |
5:89031b2f5316 | 324 | valid_result = 0; |
Charles MacNeill |
5:89031b2f5316 | 325 | |
Charles MacNeill |
5:89031b2f5316 | 326 | if (valid_result == 1) { |
Charles MacNeill |
5:89031b2f5316 | 327 | |
Charles MacNeill |
5:89031b2f5316 | 328 | pxtalk_range_data->no_of_samples++; |
Charles MacNeill |
5:89031b2f5316 | 329 | |
Charles MacNeill |
5:89031b2f5316 | 330 | pxtalk_range_data->rate_per_spad_kcps_sum += |
Charles MacNeill |
5:89031b2f5316 | 331 | prange_data->VL53LX_p_009; |
Charles MacNeill |
5:89031b2f5316 | 332 | |
Charles MacNeill |
5:89031b2f5316 | 333 | pxtalk_range_data->signal_total_events_sum += |
Charles MacNeill |
5:89031b2f5316 | 334 | prange_data->VL53LX_p_010; |
Charles MacNeill |
5:89031b2f5316 | 335 | |
Charles MacNeill |
5:89031b2f5316 | 336 | pxtalk_range_data->sigma_mm_sum += |
Charles MacNeill |
5:89031b2f5316 | 337 | (uint32_t)prange_data->VL53LX_p_002; |
Charles MacNeill |
5:89031b2f5316 | 338 | |
Charles MacNeill |
5:89031b2f5316 | 339 | |
Charles MacNeill |
5:89031b2f5316 | 340 | |
Charles MacNeill |
5:89031b2f5316 | 341 | pxtalk_range_data->median_phase_sum += |
Charles MacNeill |
5:89031b2f5316 | 342 | (uint32_t)prange_data->VL53LX_p_011; |
Charles MacNeill |
5:89031b2f5316 | 343 | |
Charles MacNeill |
5:89031b2f5316 | 344 | |
Charles MacNeill |
5:89031b2f5316 | 345 | |
Charles MacNeill |
5:89031b2f5316 | 346 | |
Charles MacNeill |
5:89031b2f5316 | 347 | } |
Charles MacNeill |
5:89031b2f5316 | 348 | |
Charles MacNeill |
5:89031b2f5316 | 349 | if ((valid_result == 1) && (zone_id >= 4)) { |
Charles MacNeill |
5:89031b2f5316 | 350 | status = VL53LX_sum_histogram_data( |
Charles MacNeill |
5:89031b2f5316 | 351 | &(pdev->hist_data), |
Charles MacNeill |
5:89031b2f5316 | 352 | psum_histo); |
Charles MacNeill |
5:89031b2f5316 | 353 | |
Charles MacNeill |
5:89031b2f5316 | 354 | |
Charles MacNeill |
5:89031b2f5316 | 355 | |
Charles MacNeill |
5:89031b2f5316 | 356 | if (prange_data->VL53LX_p_012 < |
Charles MacNeill |
5:89031b2f5316 | 357 | pXR->central_histogram__window_start) |
Charles MacNeill |
5:89031b2f5316 | 358 | pXR->central_histogram__window_start = |
Charles MacNeill |
5:89031b2f5316 | 359 | prange_data->VL53LX_p_012; |
Charles MacNeill |
5:89031b2f5316 | 360 | |
Charles MacNeill |
5:89031b2f5316 | 361 | |
Charles MacNeill |
5:89031b2f5316 | 362 | if (prange_data->VL53LX_p_013 > |
Charles MacNeill |
5:89031b2f5316 | 363 | pXR->central_histogram__window_end) |
Charles MacNeill |
5:89031b2f5316 | 364 | pXR->central_histogram__window_end = |
Charles MacNeill |
5:89031b2f5316 | 365 | prange_data->VL53LX_p_013; |
Charles MacNeill |
5:89031b2f5316 | 366 | |
Charles MacNeill |
5:89031b2f5316 | 367 | } |
Charles MacNeill |
5:89031b2f5316 | 368 | |
Charles MacNeill |
5:89031b2f5316 | 369 | } |
Charles MacNeill |
5:89031b2f5316 | 370 | |
Charles MacNeill |
5:89031b2f5316 | 371 | |
Charles MacNeill |
5:89031b2f5316 | 372 | |
Charles MacNeill |
5:89031b2f5316 | 373 | #ifdef VL53LX_LOG_ENABLE |
Charles MacNeill |
5:89031b2f5316 | 374 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 375 | VL53LX_print_range_results( |
Charles MacNeill |
5:89031b2f5316 | 376 | &(pres->range_results), |
Charles MacNeill |
5:89031b2f5316 | 377 | "pres->range_results.", |
Charles MacNeill |
5:89031b2f5316 | 378 | VL53LX_TRACE_MODULE_CORE); |
Charles MacNeill |
5:89031b2f5316 | 379 | } |
Charles MacNeill |
5:89031b2f5316 | 380 | #endif |
Charles MacNeill |
5:89031b2f5316 | 381 | |
Charles MacNeill |
5:89031b2f5316 | 382 | |
Charles MacNeill |
5:89031b2f5316 | 383 | |
Charles MacNeill |
5:89031b2f5316 | 384 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 385 | status = VL53LX_wait_for_firmware_ready(Dev); |
Charles MacNeill |
5:89031b2f5316 | 386 | |
Charles MacNeill |
5:89031b2f5316 | 387 | |
Charles MacNeill |
5:89031b2f5316 | 388 | |
Charles MacNeill |
5:89031b2f5316 | 389 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 390 | status = |
Charles MacNeill |
5:89031b2f5316 | 391 | VL53LX_clear_interrupt_and_enable_next_range( |
Charles MacNeill |
5:89031b2f5316 | 392 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 393 | measurement_mode); |
Charles MacNeill |
5:89031b2f5316 | 394 | |
Charles MacNeill |
5:89031b2f5316 | 395 | |
Charles MacNeill |
5:89031b2f5316 | 396 | } |
Charles MacNeill |
5:89031b2f5316 | 397 | |
Charles MacNeill |
5:89031b2f5316 | 398 | |
Charles MacNeill |
5:89031b2f5316 | 399 | |
Charles MacNeill |
5:89031b2f5316 | 400 | |
Charles MacNeill |
5:89031b2f5316 | 401 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 402 | status = VL53LX_stop_range(Dev); |
Charles MacNeill |
5:89031b2f5316 | 403 | |
Charles MacNeill |
5:89031b2f5316 | 404 | VL53LX_unload_patch(Dev); |
Charles MacNeill |
5:89031b2f5316 | 405 | |
Charles MacNeill |
5:89031b2f5316 | 406 | |
Charles MacNeill |
5:89031b2f5316 | 407 | |
Charles MacNeill |
5:89031b2f5316 | 408 | for (i = 0; i < (pdev->zone_cfg.active_zones+1); i++) { |
Charles MacNeill |
5:89031b2f5316 | 409 | |
Charles MacNeill |
5:89031b2f5316 | 410 | pxtalk_range_data = &(pXR->VL53LX_p_003[i+xtalk_result_id]); |
Charles MacNeill |
5:89031b2f5316 | 411 | |
Charles MacNeill |
5:89031b2f5316 | 412 | if (pxtalk_range_data->no_of_samples > 0) { |
Charles MacNeill |
5:89031b2f5316 | 413 | pxtalk_range_data->rate_per_spad_kcps_avg = |
Charles MacNeill |
5:89031b2f5316 | 414 | pxtalk_range_data->rate_per_spad_kcps_sum / |
Charles MacNeill |
5:89031b2f5316 | 415 | (uint32_t)pxtalk_range_data->no_of_samples; |
Charles MacNeill |
5:89031b2f5316 | 416 | |
Charles MacNeill |
5:89031b2f5316 | 417 | pxtalk_range_data->signal_total_events_avg = |
Charles MacNeill |
5:89031b2f5316 | 418 | pxtalk_range_data->signal_total_events_sum / |
Charles MacNeill |
5:89031b2f5316 | 419 | (int32_t)pxtalk_range_data->no_of_samples; |
Charles MacNeill |
5:89031b2f5316 | 420 | |
Charles MacNeill |
5:89031b2f5316 | 421 | pxtalk_range_data->sigma_mm_avg = |
Charles MacNeill |
5:89031b2f5316 | 422 | pxtalk_range_data->sigma_mm_sum / |
Charles MacNeill |
5:89031b2f5316 | 423 | (uint32_t)pxtalk_range_data->no_of_samples; |
Charles MacNeill |
5:89031b2f5316 | 424 | |
Charles MacNeill |
5:89031b2f5316 | 425 | |
Charles MacNeill |
5:89031b2f5316 | 426 | |
Charles MacNeill |
5:89031b2f5316 | 427 | pxtalk_range_data->median_phase_avg = |
Charles MacNeill |
5:89031b2f5316 | 428 | pxtalk_range_data->median_phase_sum / |
Charles MacNeill |
5:89031b2f5316 | 429 | (uint32_t)pxtalk_range_data->no_of_samples; |
Charles MacNeill |
5:89031b2f5316 | 430 | |
Charles MacNeill |
5:89031b2f5316 | 431 | |
Charles MacNeill |
5:89031b2f5316 | 432 | |
Charles MacNeill |
5:89031b2f5316 | 433 | } else { |
Charles MacNeill |
5:89031b2f5316 | 434 | pxtalk_range_data->rate_per_spad_kcps_avg = |
Charles MacNeill |
5:89031b2f5316 | 435 | pxtalk_range_data->rate_per_spad_kcps_sum; |
Charles MacNeill |
5:89031b2f5316 | 436 | pxtalk_range_data->signal_total_events_avg = |
Charles MacNeill |
5:89031b2f5316 | 437 | pxtalk_range_data->signal_total_events_sum; |
Charles MacNeill |
5:89031b2f5316 | 438 | pxtalk_range_data->sigma_mm_avg = |
Charles MacNeill |
5:89031b2f5316 | 439 | pxtalk_range_data->sigma_mm_sum; |
Charles MacNeill |
5:89031b2f5316 | 440 | |
Charles MacNeill |
5:89031b2f5316 | 441 | |
Charles MacNeill |
5:89031b2f5316 | 442 | |
Charles MacNeill |
5:89031b2f5316 | 443 | pxtalk_range_data->median_phase_avg = |
Charles MacNeill |
5:89031b2f5316 | 444 | pxtalk_range_data->median_phase_sum; |
Charles MacNeill |
5:89031b2f5316 | 445 | |
Charles MacNeill |
5:89031b2f5316 | 446 | |
Charles MacNeill |
5:89031b2f5316 | 447 | } |
Charles MacNeill |
5:89031b2f5316 | 448 | } |
Charles MacNeill |
5:89031b2f5316 | 449 | |
Charles MacNeill |
5:89031b2f5316 | 450 | |
Charles MacNeill |
5:89031b2f5316 | 451 | |
Charles MacNeill |
5:89031b2f5316 | 452 | memcpy(pavg_histo, &(pdev->hist_data), |
Charles MacNeill |
5:89031b2f5316 | 453 | sizeof(VL53LX_histogram_bin_data_t)); |
Charles MacNeill |
5:89031b2f5316 | 454 | |
Charles MacNeill |
5:89031b2f5316 | 455 | |
Charles MacNeill |
5:89031b2f5316 | 456 | |
Charles MacNeill |
5:89031b2f5316 | 457 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 458 | |
Charles MacNeill |
5:89031b2f5316 | 459 | pxtalk_range_data = &(pXR->VL53LX_p_003[xtalk_histo_id]); |
Charles MacNeill |
5:89031b2f5316 | 460 | |
Charles MacNeill |
5:89031b2f5316 | 461 | status = VL53LX_avg_histogram_data( |
Charles MacNeill |
5:89031b2f5316 | 462 | pxtalk_range_data->no_of_samples, |
Charles MacNeill |
5:89031b2f5316 | 463 | psum_histo, |
Charles MacNeill |
5:89031b2f5316 | 464 | pavg_histo); |
Charles MacNeill |
5:89031b2f5316 | 465 | } |
Charles MacNeill |
5:89031b2f5316 | 466 | |
Charles MacNeill |
5:89031b2f5316 | 467 | |
Charles MacNeill |
5:89031b2f5316 | 468 | |
Charles MacNeill |
5:89031b2f5316 | 469 | |
Charles MacNeill |
5:89031b2f5316 | 470 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 471 | if (smudge_corr_en == 1) |
Charles MacNeill |
5:89031b2f5316 | 472 | status = VL53LX_dynamic_xtalk_correction_enable(Dev); |
Charles MacNeill |
5:89031b2f5316 | 473 | } |
Charles MacNeill |
5:89031b2f5316 | 474 | |
Charles MacNeill |
5:89031b2f5316 | 475 | |
Charles MacNeill |
5:89031b2f5316 | 476 | LOG_FUNCTION_END(status); |
Charles MacNeill |
5:89031b2f5316 | 477 | |
Charles MacNeill |
5:89031b2f5316 | 478 | return status; |
Charles MacNeill |
5:89031b2f5316 | 479 | |
Charles MacNeill |
5:89031b2f5316 | 480 | } |
Charles MacNeill |
5:89031b2f5316 | 481 | |
Charles MacNeill |
5:89031b2f5316 | 482 | |
Charles MacNeill |
5:89031b2f5316 | 483 | VL53LX_Error VL53LX_run_phasecal_average( |
Charles MacNeill |
5:89031b2f5316 | 484 | VL53LX_DEV Dev, |
Charles MacNeill |
5:89031b2f5316 | 485 | uint8_t measurement_mode, |
Charles MacNeill |
5:89031b2f5316 | 486 | uint8_t phasecal_result__vcsel_start, |
Charles MacNeill |
5:89031b2f5316 | 487 | uint16_t phasecal_num_of_samples, |
Charles MacNeill |
5:89031b2f5316 | 488 | VL53LX_range_results_t *prange_results, |
Charles MacNeill |
5:89031b2f5316 | 489 | uint16_t *pphasecal_result__reference_phase, |
Charles MacNeill |
5:89031b2f5316 | 490 | uint16_t *pzero_distance_phase) |
Charles MacNeill |
5:89031b2f5316 | 491 | { |
Charles MacNeill |
5:89031b2f5316 | 492 | |
Charles MacNeill |
5:89031b2f5316 | 493 | |
Charles MacNeill |
5:89031b2f5316 | 494 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 495 | VL53LX_LLDriverData_t *pdev = |
Charles MacNeill |
5:89031b2f5316 | 496 | VL53LXDevStructGetLLDriverHandle(Dev); |
Charles MacNeill |
5:89031b2f5316 | 497 | |
Charles MacNeill |
5:89031b2f5316 | 498 | uint16_t i = 0; |
Charles MacNeill |
5:89031b2f5316 | 499 | uint16_t m = 0; |
Charles MacNeill |
5:89031b2f5316 | 500 | uint32_t samples = 0; |
Charles MacNeill |
5:89031b2f5316 | 501 | |
Charles MacNeill |
5:89031b2f5316 | 502 | uint32_t period = 0; |
Charles MacNeill |
5:89031b2f5316 | 503 | uint32_t VL53LX_p_014 = 0; |
Charles MacNeill |
5:89031b2f5316 | 504 | uint32_t phasecal_result__reference_phase = 0; |
Charles MacNeill |
5:89031b2f5316 | 505 | uint32_t zero_distance_phase = 0; |
Charles MacNeill |
5:89031b2f5316 | 506 | |
Charles MacNeill |
5:89031b2f5316 | 507 | |
Charles MacNeill |
5:89031b2f5316 | 508 | VL53LX_load_patch(Dev); |
Charles MacNeill |
5:89031b2f5316 | 509 | |
Charles MacNeill |
5:89031b2f5316 | 510 | for (m = 0; m < phasecal_num_of_samples; m++) { |
Charles MacNeill |
5:89031b2f5316 | 511 | |
Charles MacNeill |
5:89031b2f5316 | 512 | |
Charles MacNeill |
5:89031b2f5316 | 513 | |
Charles MacNeill |
5:89031b2f5316 | 514 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 515 | status = |
Charles MacNeill |
5:89031b2f5316 | 516 | VL53LX_init_and_start_range( |
Charles MacNeill |
5:89031b2f5316 | 517 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 518 | measurement_mode, |
Charles MacNeill |
5:89031b2f5316 | 519 | VL53LX_DEVICECONFIGLEVEL_CUSTOMER_ONWARDS); |
Charles MacNeill |
5:89031b2f5316 | 520 | |
Charles MacNeill |
5:89031b2f5316 | 521 | for (i = 0; i <= 1; i++) { |
Charles MacNeill |
5:89031b2f5316 | 522 | |
Charles MacNeill |
5:89031b2f5316 | 523 | |
Charles MacNeill |
5:89031b2f5316 | 524 | |
Charles MacNeill |
5:89031b2f5316 | 525 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 526 | status = |
Charles MacNeill |
5:89031b2f5316 | 527 | VL53LX_wait_for_range_completion(Dev); |
Charles MacNeill |
5:89031b2f5316 | 528 | |
Charles MacNeill |
5:89031b2f5316 | 529 | |
Charles MacNeill |
5:89031b2f5316 | 530 | |
Charles MacNeill |
5:89031b2f5316 | 531 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 532 | status = |
Charles MacNeill |
5:89031b2f5316 | 533 | VL53LX_get_device_results( |
Charles MacNeill |
5:89031b2f5316 | 534 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 535 | VL53LX_DEVICERESULTSLEVEL_FULL, |
Charles MacNeill |
5:89031b2f5316 | 536 | prange_results); |
Charles MacNeill |
5:89031b2f5316 | 537 | |
Charles MacNeill |
5:89031b2f5316 | 538 | |
Charles MacNeill |
5:89031b2f5316 | 539 | |
Charles MacNeill |
5:89031b2f5316 | 540 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 541 | status = |
Charles MacNeill |
5:89031b2f5316 | 542 | VL53LX_wait_for_firmware_ready(Dev); |
Charles MacNeill |
5:89031b2f5316 | 543 | |
Charles MacNeill |
5:89031b2f5316 | 544 | |
Charles MacNeill |
5:89031b2f5316 | 545 | |
Charles MacNeill |
5:89031b2f5316 | 546 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 547 | status = |
Charles MacNeill |
5:89031b2f5316 | 548 | VL53LX_clear_interrupt_and_enable_next_range( |
Charles MacNeill |
5:89031b2f5316 | 549 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 550 | measurement_mode); |
Charles MacNeill |
5:89031b2f5316 | 551 | } |
Charles MacNeill |
5:89031b2f5316 | 552 | |
Charles MacNeill |
5:89031b2f5316 | 553 | |
Charles MacNeill |
5:89031b2f5316 | 554 | |
Charles MacNeill |
5:89031b2f5316 | 555 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 556 | status = VL53LX_stop_range(Dev); |
Charles MacNeill |
5:89031b2f5316 | 557 | |
Charles MacNeill |
5:89031b2f5316 | 558 | |
Charles MacNeill |
5:89031b2f5316 | 559 | |
Charles MacNeill |
5:89031b2f5316 | 560 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 561 | status = VL53LX_WaitUs(Dev, 1000); |
Charles MacNeill |
5:89031b2f5316 | 562 | |
Charles MacNeill |
5:89031b2f5316 | 563 | |
Charles MacNeill |
5:89031b2f5316 | 564 | |
Charles MacNeill |
5:89031b2f5316 | 565 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 566 | |
Charles MacNeill |
5:89031b2f5316 | 567 | samples++; |
Charles MacNeill |
5:89031b2f5316 | 568 | |
Charles MacNeill |
5:89031b2f5316 | 569 | |
Charles MacNeill |
5:89031b2f5316 | 570 | period = 2048 * |
Charles MacNeill |
5:89031b2f5316 | 571 | (uint32_t)VL53LX_decode_vcsel_period( |
Charles MacNeill |
5:89031b2f5316 | 572 | pdev->hist_data.VL53LX_p_005); |
Charles MacNeill |
5:89031b2f5316 | 573 | |
Charles MacNeill |
5:89031b2f5316 | 574 | VL53LX_p_014 = period; |
Charles MacNeill |
5:89031b2f5316 | 575 | VL53LX_p_014 += (uint32_t)( |
Charles MacNeill |
5:89031b2f5316 | 576 | pdev->hist_data.phasecal_result__reference_phase); |
Charles MacNeill |
5:89031b2f5316 | 577 | VL53LX_p_014 += |
Charles MacNeill |
5:89031b2f5316 | 578 | (2048 * |
Charles MacNeill |
5:89031b2f5316 | 579 | (uint32_t)phasecal_result__vcsel_start); |
Charles MacNeill |
5:89031b2f5316 | 580 | VL53LX_p_014 -= (2048 * |
Charles MacNeill |
5:89031b2f5316 | 581 | (uint32_t)pdev->hist_data.cal_config__vcsel_start); |
Charles MacNeill |
5:89031b2f5316 | 582 | |
Charles MacNeill |
5:89031b2f5316 | 583 | VL53LX_p_014 = VL53LX_p_014 % period; |
Charles MacNeill |
5:89031b2f5316 | 584 | |
Charles MacNeill |
5:89031b2f5316 | 585 | phasecal_result__reference_phase += (uint32_t)( |
Charles MacNeill |
5:89031b2f5316 | 586 | pdev->hist_data.phasecal_result__reference_phase); |
Charles MacNeill |
5:89031b2f5316 | 587 | |
Charles MacNeill |
5:89031b2f5316 | 588 | zero_distance_phase += (uint32_t)VL53LX_p_014; |
Charles MacNeill |
5:89031b2f5316 | 589 | } |
Charles MacNeill |
5:89031b2f5316 | 590 | } |
Charles MacNeill |
5:89031b2f5316 | 591 | VL53LX_unload_patch(Dev); |
Charles MacNeill |
5:89031b2f5316 | 592 | |
Charles MacNeill |
5:89031b2f5316 | 593 | |
Charles MacNeill |
5:89031b2f5316 | 594 | |
Charles MacNeill |
5:89031b2f5316 | 595 | if (status == VL53LX_ERROR_NONE && samples > 0) { |
Charles MacNeill |
5:89031b2f5316 | 596 | |
Charles MacNeill |
5:89031b2f5316 | 597 | phasecal_result__reference_phase += (samples >> 1); |
Charles MacNeill |
5:89031b2f5316 | 598 | phasecal_result__reference_phase /= samples; |
Charles MacNeill |
5:89031b2f5316 | 599 | |
Charles MacNeill |
5:89031b2f5316 | 600 | zero_distance_phase += (samples >> 1); |
Charles MacNeill |
5:89031b2f5316 | 601 | zero_distance_phase /= samples; |
Charles MacNeill |
5:89031b2f5316 | 602 | |
Charles MacNeill |
5:89031b2f5316 | 603 | *pphasecal_result__reference_phase = |
Charles MacNeill |
5:89031b2f5316 | 604 | (uint16_t)phasecal_result__reference_phase; |
Charles MacNeill |
5:89031b2f5316 | 605 | *pzero_distance_phase = |
Charles MacNeill |
5:89031b2f5316 | 606 | (uint16_t)zero_distance_phase; |
Charles MacNeill |
5:89031b2f5316 | 607 | } |
Charles MacNeill |
5:89031b2f5316 | 608 | |
Charles MacNeill |
5:89031b2f5316 | 609 | return status; |
Charles MacNeill |
5:89031b2f5316 | 610 | } |
Charles MacNeill |
5:89031b2f5316 | 611 | |
Charles MacNeill |
5:89031b2f5316 | 612 | |
Charles MacNeill |
5:89031b2f5316 | 613 | VL53LX_Error VL53LX_run_device_test( |
Charles MacNeill |
5:89031b2f5316 | 614 | VL53LX_DEV Dev, |
Charles MacNeill |
5:89031b2f5316 | 615 | VL53LX_DeviceTestMode device_test_mode) |
Charles MacNeill |
5:89031b2f5316 | 616 | { |
Charles MacNeill |
5:89031b2f5316 | 617 | |
Charles MacNeill |
5:89031b2f5316 | 618 | |
Charles MacNeill |
5:89031b2f5316 | 619 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 620 | VL53LX_LLDriverData_t *pdev = VL53LXDevStructGetLLDriverHandle(Dev); |
Charles MacNeill |
5:89031b2f5316 | 621 | |
Charles MacNeill |
5:89031b2f5316 | 622 | uint8_t comms_buffer[2]; |
Charles MacNeill |
5:89031b2f5316 | 623 | uint8_t gpio_hv_mux__ctrl = 0; |
Charles MacNeill |
5:89031b2f5316 | 624 | |
Charles MacNeill |
5:89031b2f5316 | 625 | LOG_FUNCTION_START(""); |
Charles MacNeill |
5:89031b2f5316 | 626 | |
Charles MacNeill |
5:89031b2f5316 | 627 | |
Charles MacNeill |
5:89031b2f5316 | 628 | |
Charles MacNeill |
5:89031b2f5316 | 629 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 630 | status = |
Charles MacNeill |
5:89031b2f5316 | 631 | VL53LX_RdByte( |
Charles MacNeill |
5:89031b2f5316 | 632 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 633 | VL53LX_GPIO_HV_MUX__CTRL, |
Charles MacNeill |
5:89031b2f5316 | 634 | &gpio_hv_mux__ctrl); |
Charles MacNeill |
5:89031b2f5316 | 635 | |
Charles MacNeill |
5:89031b2f5316 | 636 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 637 | pdev->stat_cfg.gpio_hv_mux__ctrl = gpio_hv_mux__ctrl; |
Charles MacNeill |
5:89031b2f5316 | 638 | |
Charles MacNeill |
5:89031b2f5316 | 639 | |
Charles MacNeill |
5:89031b2f5316 | 640 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 641 | status = VL53LX_start_test( |
Charles MacNeill |
5:89031b2f5316 | 642 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 643 | device_test_mode); |
Charles MacNeill |
5:89031b2f5316 | 644 | |
Charles MacNeill |
5:89031b2f5316 | 645 | |
Charles MacNeill |
5:89031b2f5316 | 646 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 647 | status = VL53LX_wait_for_test_completion(Dev); |
Charles MacNeill |
5:89031b2f5316 | 648 | |
Charles MacNeill |
5:89031b2f5316 | 649 | |
Charles MacNeill |
5:89031b2f5316 | 650 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 651 | status = |
Charles MacNeill |
5:89031b2f5316 | 652 | VL53LX_ReadMulti( |
Charles MacNeill |
5:89031b2f5316 | 653 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 654 | VL53LX_RESULT__RANGE_STATUS, |
Charles MacNeill |
5:89031b2f5316 | 655 | comms_buffer, |
Charles MacNeill |
5:89031b2f5316 | 656 | 2); |
Charles MacNeill |
5:89031b2f5316 | 657 | |
Charles MacNeill |
5:89031b2f5316 | 658 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 659 | pdev->sys_results.result__range_status = comms_buffer[0]; |
Charles MacNeill |
5:89031b2f5316 | 660 | pdev->sys_results.result__report_status = comms_buffer[1]; |
Charles MacNeill |
5:89031b2f5316 | 661 | } |
Charles MacNeill |
5:89031b2f5316 | 662 | |
Charles MacNeill |
5:89031b2f5316 | 663 | |
Charles MacNeill |
5:89031b2f5316 | 664 | |
Charles MacNeill |
5:89031b2f5316 | 665 | pdev->sys_results.result__range_status &= |
Charles MacNeill |
5:89031b2f5316 | 666 | VL53LX_RANGE_STATUS__RANGE_STATUS_MASK; |
Charles MacNeill |
5:89031b2f5316 | 667 | |
Charles MacNeill |
5:89031b2f5316 | 668 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 669 | trace_print( |
Charles MacNeill |
5:89031b2f5316 | 670 | VL53LX_TRACE_LEVEL_INFO, |
Charles MacNeill |
5:89031b2f5316 | 671 | " Device Test Complete:\n\t%-32s = %3u\n\t%-32s = %3u\n", |
Charles MacNeill |
5:89031b2f5316 | 672 | "result__range_status", |
Charles MacNeill |
5:89031b2f5316 | 673 | pdev->sys_results.result__range_status, |
Charles MacNeill |
5:89031b2f5316 | 674 | "result__report_status", |
Charles MacNeill |
5:89031b2f5316 | 675 | pdev->sys_results.result__report_status); |
Charles MacNeill |
5:89031b2f5316 | 676 | |
Charles MacNeill |
5:89031b2f5316 | 677 | |
Charles MacNeill |
5:89031b2f5316 | 678 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 679 | status = VL53LX_clear_interrupt(Dev); |
Charles MacNeill |
5:89031b2f5316 | 680 | } |
Charles MacNeill |
5:89031b2f5316 | 681 | |
Charles MacNeill |
5:89031b2f5316 | 682 | |
Charles MacNeill |
5:89031b2f5316 | 683 | |
Charles MacNeill |
5:89031b2f5316 | 684 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 685 | status = |
Charles MacNeill |
5:89031b2f5316 | 686 | VL53LX_start_test( |
Charles MacNeill |
5:89031b2f5316 | 687 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 688 | 0x00); |
Charles MacNeill |
5:89031b2f5316 | 689 | |
Charles MacNeill |
5:89031b2f5316 | 690 | LOG_FUNCTION_END(status); |
Charles MacNeill |
5:89031b2f5316 | 691 | |
Charles MacNeill |
5:89031b2f5316 | 692 | return status; |
Charles MacNeill |
5:89031b2f5316 | 693 | } |
Charles MacNeill |
5:89031b2f5316 | 694 | |
Charles MacNeill |
5:89031b2f5316 | 695 | |
Charles MacNeill |
5:89031b2f5316 | 696 | void VL53LX_hist_xtalk_extract_data_init( |
Charles MacNeill |
5:89031b2f5316 | 697 | VL53LX_hist_xtalk_extract_data_t *pxtalk_data) |
Charles MacNeill |
5:89031b2f5316 | 698 | { |
Charles MacNeill |
5:89031b2f5316 | 699 | |
Charles MacNeill |
5:89031b2f5316 | 700 | |
Charles MacNeill |
5:89031b2f5316 | 701 | int32_t lb = 0; |
Charles MacNeill |
5:89031b2f5316 | 702 | |
Charles MacNeill |
5:89031b2f5316 | 703 | pxtalk_data->sample_count = 0U; |
Charles MacNeill |
5:89031b2f5316 | 704 | pxtalk_data->pll_period_mm = 0U; |
Charles MacNeill |
5:89031b2f5316 | 705 | pxtalk_data->peak_duration_us_sum = 0U; |
Charles MacNeill |
5:89031b2f5316 | 706 | pxtalk_data->effective_spad_count_sum = 0U; |
Charles MacNeill |
5:89031b2f5316 | 707 | pxtalk_data->zero_distance_phase_sum = 0U; |
Charles MacNeill |
5:89031b2f5316 | 708 | pxtalk_data->zero_distance_phase_avg = 0U; |
Charles MacNeill |
5:89031b2f5316 | 709 | pxtalk_data->event_scaler_sum = 0U; |
Charles MacNeill |
5:89031b2f5316 | 710 | pxtalk_data->event_scaler_avg = 4096U; |
Charles MacNeill |
5:89031b2f5316 | 711 | pxtalk_data->signal_events_sum = 0; |
Charles MacNeill |
5:89031b2f5316 | 712 | pxtalk_data->xtalk_rate_kcps_per_spad = 0U; |
Charles MacNeill |
5:89031b2f5316 | 713 | pxtalk_data->VL53LX_p_012 = 0U; |
Charles MacNeill |
5:89031b2f5316 | 714 | pxtalk_data->VL53LX_p_013 = 0U; |
Charles MacNeill |
5:89031b2f5316 | 715 | pxtalk_data->target_start = 0U; |
Charles MacNeill |
5:89031b2f5316 | 716 | |
Charles MacNeill |
5:89031b2f5316 | 717 | for (lb = 0; lb < VL53LX_XTALK_HISTO_BINS; lb++) |
Charles MacNeill |
5:89031b2f5316 | 718 | pxtalk_data->bin_data_sums[lb] = 0; |
Charles MacNeill |
5:89031b2f5316 | 719 | |
Charles MacNeill |
5:89031b2f5316 | 720 | } |
Charles MacNeill |
5:89031b2f5316 | 721 | |
Charles MacNeill |
5:89031b2f5316 | 722 | |
Charles MacNeill |
5:89031b2f5316 | 723 | VL53LX_Error VL53LX_hist_xtalk_extract_update( |
Charles MacNeill |
5:89031b2f5316 | 724 | int16_t target_distance_mm, |
Charles MacNeill |
5:89031b2f5316 | 725 | uint16_t target_width_oversize, |
Charles MacNeill |
5:89031b2f5316 | 726 | VL53LX_histogram_bin_data_t *phist_bins, |
Charles MacNeill |
5:89031b2f5316 | 727 | VL53LX_hist_xtalk_extract_data_t *pxtalk_data) |
Charles MacNeill |
5:89031b2f5316 | 728 | { |
Charles MacNeill |
5:89031b2f5316 | 729 | |
Charles MacNeill |
5:89031b2f5316 | 730 | |
Charles MacNeill |
5:89031b2f5316 | 731 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 732 | |
Charles MacNeill |
5:89031b2f5316 | 733 | LOG_FUNCTION_START(""); |
Charles MacNeill |
5:89031b2f5316 | 734 | |
Charles MacNeill |
5:89031b2f5316 | 735 | status = |
Charles MacNeill |
5:89031b2f5316 | 736 | VL53LX_hist_xtalk_extract_calc_window( |
Charles MacNeill |
5:89031b2f5316 | 737 | target_distance_mm, |
Charles MacNeill |
5:89031b2f5316 | 738 | target_width_oversize, |
Charles MacNeill |
5:89031b2f5316 | 739 | phist_bins, |
Charles MacNeill |
5:89031b2f5316 | 740 | pxtalk_data); |
Charles MacNeill |
5:89031b2f5316 | 741 | |
Charles MacNeill |
5:89031b2f5316 | 742 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 743 | status = |
Charles MacNeill |
5:89031b2f5316 | 744 | VL53LX_hist_xtalk_extract_calc_event_sums( |
Charles MacNeill |
5:89031b2f5316 | 745 | phist_bins, |
Charles MacNeill |
5:89031b2f5316 | 746 | pxtalk_data); |
Charles MacNeill |
5:89031b2f5316 | 747 | } |
Charles MacNeill |
5:89031b2f5316 | 748 | |
Charles MacNeill |
5:89031b2f5316 | 749 | LOG_FUNCTION_END(status); |
Charles MacNeill |
5:89031b2f5316 | 750 | |
Charles MacNeill |
5:89031b2f5316 | 751 | return status; |
Charles MacNeill |
5:89031b2f5316 | 752 | } |
Charles MacNeill |
5:89031b2f5316 | 753 | |
Charles MacNeill |
5:89031b2f5316 | 754 | |
Charles MacNeill |
5:89031b2f5316 | 755 | VL53LX_Error VL53LX_hist_xtalk_extract_fini( |
Charles MacNeill |
5:89031b2f5316 | 756 | VL53LX_histogram_bin_data_t *phist_bins, |
Charles MacNeill |
5:89031b2f5316 | 757 | VL53LX_hist_xtalk_extract_data_t *pxtalk_data, |
Charles MacNeill |
5:89031b2f5316 | 758 | VL53LX_xtalk_calibration_results_t *pxtalk_cal, |
Charles MacNeill |
5:89031b2f5316 | 759 | VL53LX_xtalk_histogram_shape_t *pxtalk_shape) |
Charles MacNeill |
5:89031b2f5316 | 760 | { |
Charles MacNeill |
5:89031b2f5316 | 761 | |
Charles MacNeill |
5:89031b2f5316 | 762 | |
Charles MacNeill |
5:89031b2f5316 | 763 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 764 | VL53LX_xtalk_calibration_results_t *pX = pxtalk_cal; |
Charles MacNeill |
5:89031b2f5316 | 765 | |
Charles MacNeill |
5:89031b2f5316 | 766 | LOG_FUNCTION_START(""); |
Charles MacNeill |
5:89031b2f5316 | 767 | |
Charles MacNeill |
5:89031b2f5316 | 768 | if (pxtalk_data->sample_count > 0) { |
Charles MacNeill |
5:89031b2f5316 | 769 | |
Charles MacNeill |
5:89031b2f5316 | 770 | |
Charles MacNeill |
5:89031b2f5316 | 771 | pxtalk_data->event_scaler_avg = pxtalk_data->event_scaler_sum; |
Charles MacNeill |
5:89031b2f5316 | 772 | pxtalk_data->event_scaler_avg += |
Charles MacNeill |
5:89031b2f5316 | 773 | (pxtalk_data->sample_count >> 1); |
Charles MacNeill |
5:89031b2f5316 | 774 | pxtalk_data->event_scaler_avg /= pxtalk_data->sample_count; |
Charles MacNeill |
5:89031b2f5316 | 775 | |
Charles MacNeill |
5:89031b2f5316 | 776 | |
Charles MacNeill |
5:89031b2f5316 | 777 | |
Charles MacNeill |
5:89031b2f5316 | 778 | status = |
Charles MacNeill |
5:89031b2f5316 | 779 | VL53LX_hist_xtalk_extract_calc_rate_per_spad( |
Charles MacNeill |
5:89031b2f5316 | 780 | pxtalk_data); |
Charles MacNeill |
5:89031b2f5316 | 781 | |
Charles MacNeill |
5:89031b2f5316 | 782 | |
Charles MacNeill |
5:89031b2f5316 | 783 | |
Charles MacNeill |
5:89031b2f5316 | 784 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 785 | |
Charles MacNeill |
5:89031b2f5316 | 786 | |
Charles MacNeill |
5:89031b2f5316 | 787 | pxtalk_data->zero_distance_phase_avg = |
Charles MacNeill |
5:89031b2f5316 | 788 | pxtalk_data->zero_distance_phase_sum; |
Charles MacNeill |
5:89031b2f5316 | 789 | pxtalk_data->zero_distance_phase_avg += |
Charles MacNeill |
5:89031b2f5316 | 790 | (pxtalk_data->sample_count >> 1); |
Charles MacNeill |
5:89031b2f5316 | 791 | pxtalk_data->zero_distance_phase_avg /= |
Charles MacNeill |
5:89031b2f5316 | 792 | pxtalk_data->sample_count; |
Charles MacNeill |
5:89031b2f5316 | 793 | |
Charles MacNeill |
5:89031b2f5316 | 794 | |
Charles MacNeill |
5:89031b2f5316 | 795 | status = |
Charles MacNeill |
5:89031b2f5316 | 796 | VL53LX_hist_xtalk_extract_calc_shape( |
Charles MacNeill |
5:89031b2f5316 | 797 | pxtalk_data, |
Charles MacNeill |
5:89031b2f5316 | 798 | pxtalk_shape); |
Charles MacNeill |
5:89031b2f5316 | 799 | |
Charles MacNeill |
5:89031b2f5316 | 800 | |
Charles MacNeill |
5:89031b2f5316 | 801 | |
Charles MacNeill |
5:89031b2f5316 | 802 | |
Charles MacNeill |
5:89031b2f5316 | 803 | pxtalk_shape->phasecal_result__vcsel_start = |
Charles MacNeill |
5:89031b2f5316 | 804 | phist_bins->phasecal_result__vcsel_start; |
Charles MacNeill |
5:89031b2f5316 | 805 | pxtalk_shape->cal_config__vcsel_start = |
Charles MacNeill |
5:89031b2f5316 | 806 | phist_bins->cal_config__vcsel_start; |
Charles MacNeill |
5:89031b2f5316 | 807 | pxtalk_shape->vcsel_width = |
Charles MacNeill |
5:89031b2f5316 | 808 | phist_bins->vcsel_width; |
Charles MacNeill |
5:89031b2f5316 | 809 | pxtalk_shape->VL53LX_p_015 = |
Charles MacNeill |
5:89031b2f5316 | 810 | phist_bins->VL53LX_p_015; |
Charles MacNeill |
5:89031b2f5316 | 811 | } |
Charles MacNeill |
5:89031b2f5316 | 812 | |
Charles MacNeill |
5:89031b2f5316 | 813 | |
Charles MacNeill |
5:89031b2f5316 | 814 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 815 | |
Charles MacNeill |
5:89031b2f5316 | 816 | |
Charles MacNeill |
5:89031b2f5316 | 817 | pX->algo__crosstalk_compensation_plane_offset_kcps = |
Charles MacNeill |
5:89031b2f5316 | 818 | pxtalk_data->xtalk_rate_kcps_per_spad; |
Charles MacNeill |
5:89031b2f5316 | 819 | pX->algo__crosstalk_compensation_x_plane_gradient_kcps |
Charles MacNeill |
5:89031b2f5316 | 820 | = 0U; |
Charles MacNeill |
5:89031b2f5316 | 821 | pX->algo__crosstalk_compensation_y_plane_gradient_kcps |
Charles MacNeill |
5:89031b2f5316 | 822 | = 0U; |
Charles MacNeill |
5:89031b2f5316 | 823 | |
Charles MacNeill |
5:89031b2f5316 | 824 | } |
Charles MacNeill |
5:89031b2f5316 | 825 | } |
Charles MacNeill |
5:89031b2f5316 | 826 | |
Charles MacNeill |
5:89031b2f5316 | 827 | LOG_FUNCTION_END(status); |
Charles MacNeill |
5:89031b2f5316 | 828 | |
Charles MacNeill |
5:89031b2f5316 | 829 | return status; |
Charles MacNeill |
5:89031b2f5316 | 830 | } |
Charles MacNeill |
5:89031b2f5316 | 831 | |
Charles MacNeill |
5:89031b2f5316 | 832 | |
Charles MacNeill |
5:89031b2f5316 | 833 | VL53LX_Error VL53LX_run_hist_xtalk_extraction( |
Charles MacNeill |
5:89031b2f5316 | 834 | VL53LX_DEV Dev, |
Charles MacNeill |
5:89031b2f5316 | 835 | int16_t cal_distance_mm, |
Charles MacNeill |
5:89031b2f5316 | 836 | VL53LX_Error *pcal_status) |
Charles MacNeill |
5:89031b2f5316 | 837 | { |
Charles MacNeill |
5:89031b2f5316 | 838 | |
Charles MacNeill |
5:89031b2f5316 | 839 | |
Charles MacNeill |
5:89031b2f5316 | 840 | #define OVERSIZE 4 |
Charles MacNeill |
5:89031b2f5316 | 841 | VL53LX_Error status = VL53LX_ERROR_NONE; |
Charles MacNeill |
5:89031b2f5316 | 842 | VL53LX_LLDriverData_t *pdev = VL53LXDevStructGetLLDriverHandle(Dev); |
Charles MacNeill |
5:89031b2f5316 | 843 | VL53LX_xtalkextract_config_t *pX = &(pdev->xtalk_extract_cfg); |
Charles MacNeill |
5:89031b2f5316 | 844 | VL53LX_xtalk_config_t *pC = &(pdev->xtalk_cfg); |
Charles MacNeill |
5:89031b2f5316 | 845 | VL53LX_xtalk_calibration_results_t *pXC = &(pdev->xtalk_cal); |
Charles MacNeill |
5:89031b2f5316 | 846 | |
Charles MacNeill |
5:89031b2f5316 | 847 | |
Charles MacNeill |
5:89031b2f5316 | 848 | |
Charles MacNeill |
5:89031b2f5316 | 849 | uint8_t smudge_corr_en = 0; |
Charles MacNeill |
5:89031b2f5316 | 850 | uint8_t i = 0; |
Charles MacNeill |
5:89031b2f5316 | 851 | int8_t k = 0; |
Charles MacNeill |
5:89031b2f5316 | 852 | uint8_t nbloops; |
Charles MacNeill |
5:89031b2f5316 | 853 | int32_t initMergeSize = 0; |
Charles MacNeill |
5:89031b2f5316 | 854 | int32_t MergeEnabled = 0; |
Charles MacNeill |
5:89031b2f5316 | 855 | uint32_t deltaXtalk; |
Charles MacNeill |
5:89031b2f5316 | 856 | uint32_t stepXtalk; |
Charles MacNeill |
5:89031b2f5316 | 857 | uint32_t XtalkMin; |
Charles MacNeill |
5:89031b2f5316 | 858 | uint32_t XtalkMax; |
Charles MacNeill |
5:89031b2f5316 | 859 | uint8_t measurement_mode = VL53LX_DEVICEMEASUREMENTMODE_BACKTOBACK; |
Charles MacNeill |
5:89031b2f5316 | 860 | int8_t MaxId; |
Charles MacNeill |
5:89031b2f5316 | 861 | uint8_t histo_merge_nb; |
Charles MacNeill |
5:89031b2f5316 | 862 | uint8_t wait_for_accumulation; |
Charles MacNeill |
5:89031b2f5316 | 863 | VL53LX_range_results_t *prange_results = |
Charles MacNeill |
5:89031b2f5316 | 864 | (VL53LX_range_results_t *) pdev->wArea1; |
Charles MacNeill |
5:89031b2f5316 | 865 | uint8_t Very1stRange = 0; |
Charles MacNeill |
5:89031b2f5316 | 866 | |
Charles MacNeill |
5:89031b2f5316 | 867 | LOG_FUNCTION_START(""); |
Charles MacNeill |
5:89031b2f5316 | 868 | |
Charles MacNeill |
5:89031b2f5316 | 869 | |
Charles MacNeill |
5:89031b2f5316 | 870 | |
Charles MacNeill |
5:89031b2f5316 | 871 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 872 | status = |
Charles MacNeill |
5:89031b2f5316 | 873 | VL53LX_set_preset_mode( |
Charles MacNeill |
5:89031b2f5316 | 874 | Dev, |
Charles MacNeill |
5:89031b2f5316 | 875 | VL53LX_DEVICEPRESETMODE_HISTOGRAM_LONG_RANGE, |
Charles MacNeill |
5:89031b2f5316 | 876 | pX->dss_config__target_total_rate_mcps, |
Charles MacNeill |
5:89031b2f5316 | 877 | pX->phasecal_config_timeout_us, |
Charles MacNeill |
5:89031b2f5316 | 878 | pX->mm_config_timeout_us, |
Charles MacNeill |
5:89031b2f5316 | 879 | pX->range_config_timeout_us, |
Charles MacNeill |
5:89031b2f5316 | 880 | 100); |
Charles MacNeill |
5:89031b2f5316 | 881 | |
Charles MacNeill |
5:89031b2f5316 | 882 | |
Charles MacNeill |
5:89031b2f5316 | 883 | |
Charles MacNeill |
5:89031b2f5316 | 884 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 885 | status = VL53LX_disable_xtalk_compensation(Dev); |
Charles MacNeill |
5:89031b2f5316 | 886 | |
Charles MacNeill |
5:89031b2f5316 | 887 | |
Charles MacNeill |
5:89031b2f5316 | 888 | |
Charles MacNeill |
5:89031b2f5316 | 889 | smudge_corr_en = pdev->smudge_correct_config.smudge_corr_enabled; |
Charles MacNeill |
5:89031b2f5316 | 890 | |
Charles MacNeill |
5:89031b2f5316 | 891 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 892 | status = VL53LX_dynamic_xtalk_correction_disable(Dev); |
Charles MacNeill |
5:89031b2f5316 | 893 | |
Charles MacNeill |
5:89031b2f5316 | 894 | |
Charles MacNeill |
5:89031b2f5316 | 895 | VL53LX_load_patch(Dev); |
Charles MacNeill |
5:89031b2f5316 | 896 | |
Charles MacNeill |
5:89031b2f5316 | 897 | VL53LX_get_tuning_parm(Dev, VL53LX_TUNINGPARM_HIST_MERGE_MAX_SIZE, |
Charles MacNeill |
5:89031b2f5316 | 898 | &initMergeSize); |
Charles MacNeill |
5:89031b2f5316 | 899 | VL53LX_get_tuning_parm(Dev, VL53LX_TUNINGPARM_HIST_MERGE, |
Charles MacNeill |
5:89031b2f5316 | 900 | &MergeEnabled); |
Charles MacNeill |
5:89031b2f5316 | 901 | memset(&pdev->xtalk_cal, 0, sizeof(pdev->xtalk_cal)); |
Charles MacNeill |
5:89031b2f5316 | 902 | |
Charles MacNeill |
5:89031b2f5316 | 903 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 904 | status = VL53LX_init_and_start_range( |
Charles MacNeill |
5:89031b2f5316 | 905 | Dev, measurement_mode, |
Charles MacNeill |
5:89031b2f5316 | 906 | VL53LX_DEVICECONFIGLEVEL_CUSTOMER_ONWARDS); |
Charles MacNeill |
5:89031b2f5316 | 907 | |
Charles MacNeill |
5:89031b2f5316 | 908 | MaxId = pdev->tuning_parms.tp_hist_merge_max_size - 1; |
Charles MacNeill |
5:89031b2f5316 | 909 | nbloops = (MergeEnabled == 0 ? 1 : 2); |
Charles MacNeill |
5:89031b2f5316 | 910 | for (k = 0; k < nbloops; k++) { |
Charles MacNeill |
5:89031b2f5316 | 911 | |
Charles MacNeill |
5:89031b2f5316 | 912 | VL53LX_hist_xtalk_extract_data_init( |
Charles MacNeill |
5:89031b2f5316 | 913 | &(pdev->xtalk_extract)); |
Charles MacNeill |
5:89031b2f5316 | 914 | VL53LX_set_tuning_parm(Dev, |
Charles MacNeill |
5:89031b2f5316 | 915 | VL53LX_TUNINGPARM_HIST_MERGE_MAX_SIZE, |
Charles MacNeill |
5:89031b2f5316 | 916 | k * MaxId + 1); |
Charles MacNeill |
5:89031b2f5316 | 917 | |
Charles MacNeill |
5:89031b2f5316 | 918 | for (i = 0; i <= pX->num_of_samples; i++) { |
Charles MacNeill |
5:89031b2f5316 | 919 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 920 | status = VL53LX_wait_for_range_completion(Dev); |
Charles MacNeill |
5:89031b2f5316 | 921 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 922 | status = VL53LX_get_device_results(Dev, |
Charles MacNeill |
5:89031b2f5316 | 923 | VL53LX_DEVICERESULTSLEVEL_FULL, |
Charles MacNeill |
5:89031b2f5316 | 924 | prange_results); |
Charles MacNeill |
5:89031b2f5316 | 925 | Very1stRange = |
Charles MacNeill |
5:89031b2f5316 | 926 | (pdev->ll_state.rd_device_state == |
Charles MacNeill |
5:89031b2f5316 | 927 | VL53LX_DEVICESTATE_RANGING_WAIT_GPH_SYNC); |
Charles MacNeill |
5:89031b2f5316 | 928 | |
Charles MacNeill |
5:89031b2f5316 | 929 | VL53LX_compute_histo_merge_nb(Dev, &histo_merge_nb); |
Charles MacNeill |
5:89031b2f5316 | 930 | wait_for_accumulation = ((k != 0) && |
Charles MacNeill |
5:89031b2f5316 | 931 | (MergeEnabled) && |
Charles MacNeill |
5:89031b2f5316 | 932 | (status == VL53LX_ERROR_NONE) && |
Charles MacNeill |
5:89031b2f5316 | 933 | (histo_merge_nb < |
Charles MacNeill |
5:89031b2f5316 | 934 | pdev->tuning_parms.tp_hist_merge_max_size)); |
Charles MacNeill |
5:89031b2f5316 | 935 | if (wait_for_accumulation) |
Charles MacNeill |
5:89031b2f5316 | 936 | i = 0; |
Charles MacNeill |
5:89031b2f5316 | 937 | else { |
Charles MacNeill |
5:89031b2f5316 | 938 | if ((status == VL53LX_ERROR_NONE) && |
Charles MacNeill |
5:89031b2f5316 | 939 | (!Very1stRange)) { |
Charles MacNeill |
5:89031b2f5316 | 940 | status = |
Charles MacNeill |
5:89031b2f5316 | 941 | VL53LX_hist_xtalk_extract_update( |
Charles MacNeill |
5:89031b2f5316 | 942 | cal_distance_mm, |
Charles MacNeill |
5:89031b2f5316 | 943 | OVERSIZE, |
Charles MacNeill |
5:89031b2f5316 | 944 | &(pdev->hist_data), |
Charles MacNeill |
5:89031b2f5316 | 945 | &(pdev->xtalk_extract)); |
Charles MacNeill |
5:89031b2f5316 | 946 | } |
Charles MacNeill |
5:89031b2f5316 | 947 | } |
Charles MacNeill |
5:89031b2f5316 | 948 | |
Charles MacNeill |
5:89031b2f5316 | 949 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 950 | status = VL53LX_wait_for_firmware_ready(Dev); |
Charles MacNeill |
5:89031b2f5316 | 951 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 952 | status = |
Charles MacNeill |
5:89031b2f5316 | 953 | VL53LX_clear_interrupt_and_enable_next_range( |
Charles MacNeill |
5:89031b2f5316 | 954 | Dev, measurement_mode); |
Charles MacNeill |
5:89031b2f5316 | 955 | |
Charles MacNeill |
5:89031b2f5316 | 956 | |
Charles MacNeill |
5:89031b2f5316 | 957 | if (status == VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 958 | status = |
Charles MacNeill |
5:89031b2f5316 | 959 | VL53LX_hist_xtalk_extract_fini( |
Charles MacNeill |
5:89031b2f5316 | 960 | &(pdev->hist_data), |
Charles MacNeill |
5:89031b2f5316 | 961 | &(pdev->xtalk_extract), |
Charles MacNeill |
5:89031b2f5316 | 962 | &(pdev->xtalk_cal), |
Charles MacNeill |
5:89031b2f5316 | 963 | &(pdev->xtalk_shapes.xtalk_shape)); |
Charles MacNeill |
5:89031b2f5316 | 964 | if (status != VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 965 | goto LOOPOUT; |
Charles MacNeill |
5:89031b2f5316 | 966 | pXC->algo__xtalk_cpo_HistoMerge_kcps[k * MaxId] = |
Charles MacNeill |
5:89031b2f5316 | 967 | pXC->algo__crosstalk_compensation_plane_offset_kcps; |
Charles MacNeill |
5:89031b2f5316 | 968 | } |
Charles MacNeill |
5:89031b2f5316 | 969 | } |
Charles MacNeill |
5:89031b2f5316 | 970 | |
Charles MacNeill |
5:89031b2f5316 | 971 | LOOPOUT: |
Charles MacNeill |
5:89031b2f5316 | 972 | |
Charles MacNeill |
5:89031b2f5316 | 973 | VL53LX_stop_range(Dev); |
Charles MacNeill |
5:89031b2f5316 | 974 | |
Charles MacNeill |
5:89031b2f5316 | 975 | VL53LX_set_tuning_parm(Dev, VL53LX_TUNINGPARM_HIST_MERGE_MAX_SIZE, |
Charles MacNeill |
5:89031b2f5316 | 976 | initMergeSize); |
Charles MacNeill |
5:89031b2f5316 | 977 | VL53LX_unload_patch(Dev); |
Charles MacNeill |
5:89031b2f5316 | 978 | |
Charles MacNeill |
5:89031b2f5316 | 979 | if (status != VL53LX_ERROR_NONE) |
Charles MacNeill |
5:89031b2f5316 | 980 | status = VL53LX_ERROR_XTALK_EXTRACTION_SIGMA_LIMIT_FAIL; |
Charles MacNeill |
5:89031b2f5316 | 981 | else if ((MergeEnabled == 1) && (MaxId > 0)) { |
Charles MacNeill |
5:89031b2f5316 | 982 | XtalkMin = pdev->xtalk_cal.algo__xtalk_cpo_HistoMerge_kcps[0]; |
Charles MacNeill |
5:89031b2f5316 | 983 | XtalkMax = |
Charles MacNeill |
5:89031b2f5316 | 984 | pdev->xtalk_cal.algo__xtalk_cpo_HistoMerge_kcps[MaxId]; |
Charles MacNeill |
5:89031b2f5316 | 985 | pdev->xtalk_cal. |
Charles MacNeill |
5:89031b2f5316 | 986 | algo__crosstalk_compensation_plane_offset_kcps = XtalkMin; |
Charles MacNeill |
5:89031b2f5316 | 987 | if (XtalkMax > XtalkMin) { |
Charles MacNeill |
5:89031b2f5316 | 988 | deltaXtalk = XtalkMax - XtalkMin; |
Charles MacNeill |
5:89031b2f5316 | 989 | stepXtalk = deltaXtalk / MaxId; |
Charles MacNeill |
5:89031b2f5316 | 990 | for (k = 1; k < MaxId; k++) |
Charles MacNeill |
5:89031b2f5316 | 991 | pdev->xtalk_cal.algo__xtalk_cpo_HistoMerge_kcps[k] = |
Charles MacNeill |
5:89031b2f5316 | 992 | XtalkMin + stepXtalk * k; |
Charles MacNeill |
5:89031b2f5316 | 993 | } else |
Charles MacNeill |
5:89031b2f5316 | 994 | status = |
Charles MacNeill |
5:89031b2f5316 | 995 | VL53LX_ERROR_XTALK_EXTRACTION_SIGMA_LIMIT_FAIL; |
Charles MacNeill |
5:89031b2f5316 | 996 | } |
Charles MacNeill |
5:89031b2f5316 | 997 | |
Charles MacNeill |
5:89031b2f5316 | 998 | if (status == VL53LX_ERROR_NONE) { |
Charles MacNeill |
5:89031b2f5316 | 999 | pC->algo__crosstalk_compensation_x_plane_gradient_kcps = |
Charles MacNeill |
5:89031b2f5316 | 1000 | pXC->algo__crosstalk_compensation_x_plane_gradient_kcps; |
Charles MacNeill |
5:89031b2f5316 | 1001 | pC->algo__crosstalk_compensation_y_plane_gradient_kcps = |
Charles MacNeill |
5:89031b2f5316 | 1002 | pXC->algo__crosstalk_compensation_y_plane_gradient_kcps; |
Charles MacNeill |
5:89031b2f5316 | 1003 | pC->algo__crosstalk_compensation_plane_offset_kcps = |
Charles MacNeill |
5:89031b2f5316 | 1004 | pXC->algo__crosstalk_compensation_plane_offset_kcps; |
Charles MacNeill |
5:89031b2f5316 | 1005 | } |
Charles MacNeill |
5:89031b2f5316 | 1006 | |
Charles MacNeill |
5:89031b2f5316 | 1007 | |
Charles MacNeill |
5:89031b2f5316 | 1008 | pdev->xtalk_results.cal_status = status; |
Charles MacNeill |
5:89031b2f5316 | 1009 | *pcal_status = pdev->xtalk_results.cal_status; |
Charles MacNeill |
5:89031b2f5316 | 1010 | |
Charles MacNeill |
5:89031b2f5316 | 1011 | |
Charles MacNeill |
5:89031b2f5316 | 1012 | status = VL53LX_enable_xtalk_compensation(Dev); |
Charles MacNeill |
5:89031b2f5316 | 1013 | if (smudge_corr_en == 1) |
Charles MacNeill |
5:89031b2f5316 | 1014 | status = VL53LX_dynamic_xtalk_correction_enable(Dev); |
Charles MacNeill |
5:89031b2f5316 | 1015 | |
Charles MacNeill |
5:89031b2f5316 | 1016 | #ifdef VL53LX_LOG_ENABLE |
Charles MacNeill |
5:89031b2f5316 | 1017 | |
Charles MacNeill |
5:89031b2f5316 | 1018 | |
Charles MacNeill |
5:89031b2f5316 | 1019 | |
Charles MacNeill |
5:89031b2f5316 | 1020 | VL53LX_print_customer_nvm_managed( |
Charles MacNeill |
5:89031b2f5316 | 1021 | &(pdev->customer), |
Charles MacNeill |
5:89031b2f5316 | 1022 | "run_xtalk_extraction():pdev->lldata.customer.", |
Charles MacNeill |
5:89031b2f5316 | 1023 | VL53LX_TRACE_MODULE_XTALK_DATA); |
Charles MacNeill |
5:89031b2f5316 | 1024 | |
Charles MacNeill |
5:89031b2f5316 | 1025 | VL53LX_print_xtalk_config( |
Charles MacNeill |
5:89031b2f5316 | 1026 | &(pdev->xtalk_cfg), |
Charles MacNeill |
5:89031b2f5316 | 1027 | "run_xtalk_extraction():pdev->lldata.xtalk_cfg.", |
Charles MacNeill |
5:89031b2f5316 | 1028 | VL53LX_TRACE_MODULE_XTALK_DATA); |
Charles MacNeill |
5:89031b2f5316 | 1029 | |
Charles MacNeill |
5:89031b2f5316 | 1030 | VL53LX_print_xtalk_histogram_data( |
Charles MacNeill |
5:89031b2f5316 | 1031 | &(pdev->xtalk_shapes), |
Charles MacNeill |
5:89031b2f5316 | 1032 | "pdev->lldata.xtalk_shapes.", |
Charles MacNeill |
5:89031b2f5316 | 1033 | VL53LX_TRACE_MODULE_XTALK_DATA); |
Charles MacNeill |
5:89031b2f5316 | 1034 | |
Charles MacNeill |
5:89031b2f5316 | 1035 | #endif |
Charles MacNeill |
5:89031b2f5316 | 1036 | |
Charles MacNeill |
5:89031b2f5316 | 1037 | LOG_FUNCTION_END(status); |
Charles MacNeill |
5:89031b2f5316 | 1038 | |
Charles MacNeill |
5:89031b2f5316 | 1039 | return status; |
Charles MacNeill |
5:89031b2f5316 | 1040 | } |
Charles MacNeill |
5:89031b2f5316 | 1041 |