Updates to follow mbed SDK coding style guidelines.
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Dependents: 53L0A1_Satellites_with_Interrupts_OS5 Display_53L0A1_OS5
Fork of X_NUCLEO_53L0A1 by
Components/VL53L0X/vl53l0x_class.cpp@21:627b65069e6d, 2017-06-28 (annotated)
- Committer:
- JerrySzczurak
- Date:
- Wed Jun 28 12:23:03 2017 +0000
- Revision:
- 21:627b65069e6d
- Parent:
- 20:cf211a3b3d9e
Cosmetic changes to v53l0x class; wrWord and rdWord calls changed to write_word and read_word
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
johnAlexander | 0:c523920bcc09 | 1 | /** |
johnAlexander | 0:c523920bcc09 | 2 | ****************************************************************************** |
johnAlexander | 0:c523920bcc09 | 3 | * @file vl53l0x_class.cpp |
johnAlexander | 0:c523920bcc09 | 4 | * @author IMG |
johnAlexander | 0:c523920bcc09 | 5 | * @version V0.0.1 |
johnAlexander | 0:c523920bcc09 | 6 | * @date 28-June-2016 |
johnAlexander | 0:c523920bcc09 | 7 | * @brief Implementation file for the VL53L0X driver class |
johnAlexander | 0:c523920bcc09 | 8 | ****************************************************************************** |
johnAlexander | 0:c523920bcc09 | 9 | * @attention |
johnAlexander | 0:c523920bcc09 | 10 | * |
johnAlexander | 0:c523920bcc09 | 11 | * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> |
johnAlexander | 0:c523920bcc09 | 12 | * |
johnAlexander | 0:c523920bcc09 | 13 | * Redistribution and use in source and binary forms, with or without modification, |
johnAlexander | 0:c523920bcc09 | 14 | * are permitted provided that the following conditions are met: |
johnAlexander | 0:c523920bcc09 | 15 | * 1. Redistributions of source code must retain the above copyright notice, |
johnAlexander | 0:c523920bcc09 | 16 | * this list of conditions and the following disclaimer. |
johnAlexander | 0:c523920bcc09 | 17 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
johnAlexander | 0:c523920bcc09 | 18 | * this list of conditions and the following disclaimer in the documentation |
johnAlexander | 0:c523920bcc09 | 19 | * and/or other materials provided with the distribution. |
johnAlexander | 0:c523920bcc09 | 20 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
johnAlexander | 0:c523920bcc09 | 21 | * may be used to endorse or promote products derived from this software |
johnAlexander | 0:c523920bcc09 | 22 | * without specific prior written permission. |
johnAlexander | 0:c523920bcc09 | 23 | * |
johnAlexander | 0:c523920bcc09 | 24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
johnAlexander | 0:c523920bcc09 | 25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
johnAlexander | 0:c523920bcc09 | 26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
johnAlexander | 0:c523920bcc09 | 27 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
johnAlexander | 0:c523920bcc09 | 28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
johnAlexander | 0:c523920bcc09 | 29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
johnAlexander | 0:c523920bcc09 | 30 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
johnAlexander | 0:c523920bcc09 | 31 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
johnAlexander | 0:c523920bcc09 | 32 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
johnAlexander | 0:c523920bcc09 | 33 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
johnAlexander | 0:c523920bcc09 | 34 | * |
johnAlexander | 0:c523920bcc09 | 35 | ****************************************************************************** |
johnAlexander | 0:c523920bcc09 | 36 | */ |
johnAlexander | 15:932d8b4e52c9 | 37 | |
johnAlexander | 0:c523920bcc09 | 38 | /* Includes */ |
johnAlexander | 0:c523920bcc09 | 39 | #include <stdlib.h> |
johnAlexander | 0:c523920bcc09 | 40 | |
johnAlexander | 0:c523920bcc09 | 41 | #include "vl53l0x_class.h" |
johnAlexander | 0:c523920bcc09 | 42 | |
johnAlexander | 0:c523920bcc09 | 43 | //#include "vl53l0x_api_core.h" |
johnAlexander | 0:c523920bcc09 | 44 | //#include "vl53l0x_api_calibration.h" |
johnAlexander | 0:c523920bcc09 | 45 | //#include "vl53l0x_api_strings.h" |
johnAlexander | 0:c523920bcc09 | 46 | #include "vl53l0x_interrupt_threshold_settings.h" |
johnAlexander | 0:c523920bcc09 | 47 | #include "vl53l0x_tuning.h" |
johnAlexander | 0:c523920bcc09 | 48 | #include "vl53l0x_types.h" |
johnAlexander | 0:c523920bcc09 | 49 | |
johnAlexander | 0:c523920bcc09 | 50 | |
johnAlexander | 0:c523920bcc09 | 51 | /****************** define for i2c configuration *******************************/ |
johnAlexander | 15:932d8b4e52c9 | 52 | |
johnAlexander | 0:c523920bcc09 | 53 | #define TEMP_BUF_SIZE 64 |
johnAlexander | 0:c523920bcc09 | 54 | |
johnAlexander | 0:c523920bcc09 | 55 | /** Maximum buffer size to be used in i2c */ |
johnAlexander | 0:c523920bcc09 | 56 | #define VL53L0X_MAX_I2C_XFER_SIZE 64 /* Maximum buffer size to be used in i2c */ |
johnAlexander | 0:c523920bcc09 | 57 | #define VL53L0X_I2C_USER_VAR /* none but could be for a flag var to get/pass to mutex interruptible return flags and try again */ |
johnAlexander | 15:932d8b4e52c9 | 58 | |
johnAlexander | 0:c523920bcc09 | 59 | |
johnAlexander | 0:c523920bcc09 | 60 | #define LOG_FUNCTION_START(fmt, ...) \ |
johnAlexander | 0:c523920bcc09 | 61 | _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) |
johnAlexander | 0:c523920bcc09 | 62 | #define LOG_FUNCTION_END(status, ...) \ |
johnAlexander | 0:c523920bcc09 | 63 | _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) |
johnAlexander | 0:c523920bcc09 | 64 | #define LOG_FUNCTION_END_FMT(status, fmt, ...) \ |
johnAlexander | 0:c523920bcc09 | 65 | _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) |
johnAlexander | 0:c523920bcc09 | 66 | |
johnAlexander | 0:c523920bcc09 | 67 | #ifdef VL53L0X_LOG_ENABLE |
johnAlexander | 0:c523920bcc09 | 68 | #define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_API, \ |
johnAlexander | 0:c523920bcc09 | 69 | level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) |
johnAlexander | 0:c523920bcc09 | 70 | #endif |
johnAlexander | 0:c523920bcc09 | 71 | |
johnAlexander | 0:c523920bcc09 | 72 | #define REF_ARRAY_SPAD_0 0 |
johnAlexander | 0:c523920bcc09 | 73 | #define REF_ARRAY_SPAD_5 5 |
johnAlexander | 0:c523920bcc09 | 74 | #define REF_ARRAY_SPAD_10 10 |
johnAlexander | 0:c523920bcc09 | 75 | |
johnAlexander | 0:c523920bcc09 | 76 | uint32_t refArrayQuadrants[4] = {REF_ARRAY_SPAD_10, REF_ARRAY_SPAD_5, |
johnAlexander | 15:932d8b4e52c9 | 77 | REF_ARRAY_SPAD_0, REF_ARRAY_SPAD_5 |
johnAlexander | 15:932d8b4e52c9 | 78 | }; |
johnAlexander | 0:c523920bcc09 | 79 | |
johnAlexander | 0:c523920bcc09 | 80 | |
johnAlexander | 0:c523920bcc09 | 81 | |
johnAlexander | 0:c523920bcc09 | 82 | |
JerrySzczurak | 20:cf211a3b3d9e | 83 | VL53L0X_Error VL53L0X::vl53l0x_device_read_strobe( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 84 | { |
johnAlexander | 16:98ce55ddbb1a | 85 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 86 | uint8_t strobe; |
johnAlexander | 16:98ce55ddbb1a | 87 | uint32_t loop_nb; |
JerrySzczurak | 20:cf211a3b3d9e | 88 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 89 | |
JerrySzczurak | 20:cf211a3b3d9e | 90 | status |= vl53l0x_write_byte( dev, 0x83, 0x00 ); |
johnAlexander | 15:932d8b4e52c9 | 91 | |
johnAlexander | 15:932d8b4e52c9 | 92 | /* polling |
johnAlexander | 15:932d8b4e52c9 | 93 | * use timeout to avoid deadlock*/ |
JerrySzczurak | 20:cf211a3b3d9e | 94 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 95 | loop_nb = 0; |
johnAlexander | 15:932d8b4e52c9 | 96 | do { |
JerrySzczurak | 20:cf211a3b3d9e | 97 | status = vl53l0x_read_byte( dev, 0x83, &strobe ); |
JerrySzczurak | 20:cf211a3b3d9e | 98 | if ( ( strobe != 0x00 ) || status != VL53L0X_ERROR_NONE ) |
johnAlexander | 15:932d8b4e52c9 | 99 | break; |
johnAlexander | 15:932d8b4e52c9 | 100 | |
johnAlexander | 16:98ce55ddbb1a | 101 | loop_nb = loop_nb + 1; |
JerrySzczurak | 20:cf211a3b3d9e | 102 | } while ( loop_nb < VL53L0X_DEFAULT_MAX_LOOP ); |
JerrySzczurak | 20:cf211a3b3d9e | 103 | |
JerrySzczurak | 20:cf211a3b3d9e | 104 | if ( loop_nb >= VL53L0X_DEFAULT_MAX_LOOP ) |
johnAlexander | 16:98ce55ddbb1a | 105 | status = VL53L0X_ERROR_TIME_OUT; |
johnAlexander | 15:932d8b4e52c9 | 106 | |
johnAlexander | 15:932d8b4e52c9 | 107 | } |
johnAlexander | 15:932d8b4e52c9 | 108 | |
JerrySzczurak | 20:cf211a3b3d9e | 109 | status |= vl53l0x_write_byte( dev, 0x83, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 110 | |
JerrySzczurak | 20:cf211a3b3d9e | 111 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 112 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 113 | |
JerrySzczurak | 20:cf211a3b3d9e | 114 | } |
JerrySzczurak | 20:cf211a3b3d9e | 115 | |
JerrySzczurak | 20:cf211a3b3d9e | 116 | VL53L0X_Error VL53L0X::vl53l0x_get_info_from_device( VL53L0X_DEV dev, uint8_t option ) |
johnAlexander | 0:c523920bcc09 | 117 | { |
johnAlexander | 0:c523920bcc09 | 118 | |
johnAlexander | 16:98ce55ddbb1a | 119 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 120 | uint8_t byte; |
johnAlexander | 16:98ce55ddbb1a | 121 | uint32_t tmp_dword; |
johnAlexander | 16:98ce55ddbb1a | 122 | uint8_t module_id; |
johnAlexander | 16:98ce55ddbb1a | 123 | uint8_t revision; |
johnAlexander | 16:98ce55ddbb1a | 124 | uint8_t reference_spad_count = 0; |
johnAlexander | 16:98ce55ddbb1a | 125 | uint8_t reference_spad_type = 0; |
johnAlexander | 16:98ce55ddbb1a | 126 | uint32_t part_uid_upper = 0; |
johnAlexander | 16:98ce55ddbb1a | 127 | uint32_t part_uid_lower = 0; |
johnAlexander | 16:98ce55ddbb1a | 128 | uint32_t offset_fixed1104_mm = 0; |
johnAlexander | 16:98ce55ddbb1a | 129 | int16_t offset_micro_meters = 0; |
johnAlexander | 16:98ce55ddbb1a | 130 | uint32_t dist_meas_tgt_fixed1104_mm = 400 << 4; |
johnAlexander | 16:98ce55ddbb1a | 131 | uint32_t dist_meas_fixed1104_400_mm = 0; |
johnAlexander | 16:98ce55ddbb1a | 132 | uint32_t signal_rate_meas_fixed1104_400_mm = 0; |
johnAlexander | 16:98ce55ddbb1a | 133 | char product_id[19]; |
johnAlexander | 16:98ce55ddbb1a | 134 | char *product_id_tmp; |
johnAlexander | 16:98ce55ddbb1a | 135 | uint8_t read_data_from_device_done; |
johnAlexander | 16:98ce55ddbb1a | 136 | FixPoint1616_t signal_rate_meas_fixed400_mm_fix = 0; |
johnAlexander | 16:98ce55ddbb1a | 137 | uint8_t nvm_ref_good_spad_map[VL53L0X_REF_SPAD_BUFFER_SIZE]; |
johnAlexander | 15:932d8b4e52c9 | 138 | int i; |
johnAlexander | 15:932d8b4e52c9 | 139 | |
johnAlexander | 15:932d8b4e52c9 | 140 | |
JerrySzczurak | 20:cf211a3b3d9e | 141 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 142 | |
JerrySzczurak | 20:cf211a3b3d9e | 143 | read_data_from_device_done = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 144 | ReadDataFromDeviceDone ); |
johnAlexander | 15:932d8b4e52c9 | 145 | |
johnAlexander | 15:932d8b4e52c9 | 146 | /* This access is done only once after that a GetDeviceInfo or |
johnAlexander | 15:932d8b4e52c9 | 147 | * datainit is done*/ |
JerrySzczurak | 20:cf211a3b3d9e | 148 | if ( read_data_from_device_done != 7 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 149 | |
JerrySzczurak | 20:cf211a3b3d9e | 150 | status |= vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 151 | status |= vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 152 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 153 | |
JerrySzczurak | 20:cf211a3b3d9e | 154 | status |= vl53l0x_write_byte( dev, 0xFF, 0x06 ); |
JerrySzczurak | 20:cf211a3b3d9e | 155 | status |= vl53l0x_read_byte( dev, 0x83, &byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 156 | status |= vl53l0x_write_byte( dev, 0x83, byte | 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 157 | status |= vl53l0x_write_byte( dev, 0xFF, 0x07 ); |
JerrySzczurak | 20:cf211a3b3d9e | 158 | status |= vl53l0x_write_byte( dev, 0x81, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 159 | |
JerrySzczurak | 20:cf211a3b3d9e | 160 | status |= vl53l0x_polling_delay( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 161 | |
JerrySzczurak | 20:cf211a3b3d9e | 162 | status |= vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 163 | |
JerrySzczurak | 20:cf211a3b3d9e | 164 | if ( ( ( option & 1 ) == 1 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 165 | ( ( read_data_from_device_done & 1 ) == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 166 | status |= vl53l0x_write_byte( dev, 0x94, 0x6b ); |
JerrySzczurak | 20:cf211a3b3d9e | 167 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 168 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 169 | |
JerrySzczurak | 20:cf211a3b3d9e | 170 | reference_spad_count = ( uint8_t )( ( tmp_dword >> 8 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 171 | reference_spad_type = ( uint8_t )( ( tmp_dword >> 15 ) & 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 172 | |
JerrySzczurak | 20:cf211a3b3d9e | 173 | status |= vl53l0x_write_byte( dev, 0x94, 0x24 ); |
JerrySzczurak | 20:cf211a3b3d9e | 174 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 175 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 176 | |
JerrySzczurak | 20:cf211a3b3d9e | 177 | |
JerrySzczurak | 20:cf211a3b3d9e | 178 | nvm_ref_good_spad_map[0] = ( uint8_t )( ( tmp_dword >> 24 ) |
JerrySzczurak | 20:cf211a3b3d9e | 179 | & 0xff ); |
JerrySzczurak | 20:cf211a3b3d9e | 180 | nvm_ref_good_spad_map[1] = ( uint8_t )( ( tmp_dword >> 16 ) |
JerrySzczurak | 20:cf211a3b3d9e | 181 | & 0xff ); |
JerrySzczurak | 20:cf211a3b3d9e | 182 | nvm_ref_good_spad_map[2] = ( uint8_t )( ( tmp_dword >> 8 ) |
JerrySzczurak | 20:cf211a3b3d9e | 183 | & 0xff ); |
JerrySzczurak | 20:cf211a3b3d9e | 184 | nvm_ref_good_spad_map[3] = ( uint8_t )( tmp_dword & 0xff ); |
JerrySzczurak | 20:cf211a3b3d9e | 185 | |
JerrySzczurak | 20:cf211a3b3d9e | 186 | status |= vl53l0x_write_byte( dev, 0x94, 0x25 ); |
JerrySzczurak | 20:cf211a3b3d9e | 187 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 188 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 189 | |
JerrySzczurak | 20:cf211a3b3d9e | 190 | nvm_ref_good_spad_map[4] = ( uint8_t )( ( tmp_dword >> 24 ) |
JerrySzczurak | 20:cf211a3b3d9e | 191 | & 0xff ); |
JerrySzczurak | 20:cf211a3b3d9e | 192 | nvm_ref_good_spad_map[5] = ( uint8_t )( ( tmp_dword >> 16 ) |
JerrySzczurak | 20:cf211a3b3d9e | 193 | & 0xff ); |
johnAlexander | 15:932d8b4e52c9 | 194 | } |
johnAlexander | 15:932d8b4e52c9 | 195 | |
JerrySzczurak | 20:cf211a3b3d9e | 196 | if ( ( ( option & 2 ) == 2 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 197 | ( ( read_data_from_device_done & 2 ) == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 198 | |
JerrySzczurak | 20:cf211a3b3d9e | 199 | status |= vl53l0x_write_byte( dev, 0x94, 0x02 ); |
JerrySzczurak | 20:cf211a3b3d9e | 200 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 201 | status |= vl53l0x_read_byte( dev, 0x90, &module_id ); |
JerrySzczurak | 20:cf211a3b3d9e | 202 | |
JerrySzczurak | 20:cf211a3b3d9e | 203 | status |= vl53l0x_write_byte( dev, 0x94, 0x7B ); |
JerrySzczurak | 20:cf211a3b3d9e | 204 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 205 | status |= vl53l0x_read_byte( dev, 0x90, &revision ); |
JerrySzczurak | 20:cf211a3b3d9e | 206 | |
JerrySzczurak | 20:cf211a3b3d9e | 207 | status |= vl53l0x_write_byte( dev, 0x94, 0x77 ); |
JerrySzczurak | 20:cf211a3b3d9e | 208 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 209 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 210 | |
JerrySzczurak | 20:cf211a3b3d9e | 211 | product_id[0] = ( char )( ( tmp_dword >> 25 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 212 | product_id[1] = ( char )( ( tmp_dword >> 18 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 213 | product_id[2] = ( char )( ( tmp_dword >> 11 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 214 | product_id[3] = ( char )( ( tmp_dword >> 4 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 215 | |
JerrySzczurak | 20:cf211a3b3d9e | 216 | byte = ( uint8_t )( ( tmp_dword & 0x00f ) << 3 ); |
JerrySzczurak | 20:cf211a3b3d9e | 217 | |
JerrySzczurak | 20:cf211a3b3d9e | 218 | status |= vl53l0x_write_byte( dev, 0x94, 0x78 ); |
JerrySzczurak | 20:cf211a3b3d9e | 219 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 220 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 221 | |
JerrySzczurak | 20:cf211a3b3d9e | 222 | product_id[4] = ( char )( byte + |
JerrySzczurak | 20:cf211a3b3d9e | 223 | ( ( tmp_dword >> 29 ) & 0x07f ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 224 | product_id[5] = ( char )( ( tmp_dword >> 22 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 225 | product_id[6] = ( char )( ( tmp_dword >> 15 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 226 | product_id[7] = ( char )( ( tmp_dword >> 8 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 227 | product_id[8] = ( char )( ( tmp_dword >> 1 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 228 | |
JerrySzczurak | 20:cf211a3b3d9e | 229 | byte = ( uint8_t )( ( tmp_dword & 0x001 ) << 6 ); |
JerrySzczurak | 20:cf211a3b3d9e | 230 | |
JerrySzczurak | 20:cf211a3b3d9e | 231 | status |= vl53l0x_write_byte( dev, 0x94, 0x79 ); |
JerrySzczurak | 20:cf211a3b3d9e | 232 | |
JerrySzczurak | 20:cf211a3b3d9e | 233 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 234 | |
JerrySzczurak | 20:cf211a3b3d9e | 235 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 236 | |
JerrySzczurak | 20:cf211a3b3d9e | 237 | product_id[9] = ( char )( byte + |
JerrySzczurak | 20:cf211a3b3d9e | 238 | ( ( tmp_dword >> 26 ) & 0x07f ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 239 | product_id[10] = ( char )( ( tmp_dword >> 19 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 240 | product_id[11] = ( char )( ( tmp_dword >> 12 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 241 | product_id[12] = ( char )( ( tmp_dword >> 5 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 242 | |
JerrySzczurak | 20:cf211a3b3d9e | 243 | byte = ( uint8_t )( ( tmp_dword & 0x01f ) << 2 ); |
JerrySzczurak | 20:cf211a3b3d9e | 244 | |
JerrySzczurak | 20:cf211a3b3d9e | 245 | status |= vl53l0x_write_byte( dev, 0x94, 0x7A ); |
JerrySzczurak | 20:cf211a3b3d9e | 246 | |
JerrySzczurak | 20:cf211a3b3d9e | 247 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 248 | |
JerrySzczurak | 20:cf211a3b3d9e | 249 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 250 | |
JerrySzczurak | 20:cf211a3b3d9e | 251 | product_id[13] = ( char )( byte + |
JerrySzczurak | 20:cf211a3b3d9e | 252 | ( ( tmp_dword >> 30 ) & 0x07f ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 253 | product_id[14] = ( char )( ( tmp_dword >> 23 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 254 | product_id[15] = ( char )( ( tmp_dword >> 16 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 255 | product_id[16] = ( char )( ( tmp_dword >> 9 ) & 0x07f ); |
JerrySzczurak | 20:cf211a3b3d9e | 256 | product_id[17] = ( char )( ( tmp_dword >> 2 ) & 0x07f ); |
johnAlexander | 16:98ce55ddbb1a | 257 | product_id[18] = '\0'; |
johnAlexander | 15:932d8b4e52c9 | 258 | |
johnAlexander | 15:932d8b4e52c9 | 259 | } |
johnAlexander | 15:932d8b4e52c9 | 260 | |
JerrySzczurak | 20:cf211a3b3d9e | 261 | if ( ( ( option & 4 ) == 4 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 262 | ( ( read_data_from_device_done & 4 ) == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 263 | |
JerrySzczurak | 20:cf211a3b3d9e | 264 | status |= vl53l0x_write_byte( dev, 0x94, 0x7B ); |
JerrySzczurak | 20:cf211a3b3d9e | 265 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 266 | status |= vl53l0x_read_dword( dev, 0x90, &part_uid_upper ); |
JerrySzczurak | 20:cf211a3b3d9e | 267 | |
JerrySzczurak | 20:cf211a3b3d9e | 268 | status |= vl53l0x_write_byte( dev, 0x94, 0x7C ); |
JerrySzczurak | 20:cf211a3b3d9e | 269 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 270 | status |= vl53l0x_read_dword( dev, 0x90, &part_uid_lower ); |
JerrySzczurak | 20:cf211a3b3d9e | 271 | |
JerrySzczurak | 20:cf211a3b3d9e | 272 | status |= vl53l0x_write_byte( dev, 0x94, 0x73 ); |
JerrySzczurak | 20:cf211a3b3d9e | 273 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 274 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 275 | |
JerrySzczurak | 20:cf211a3b3d9e | 276 | signal_rate_meas_fixed1104_400_mm = ( tmp_dword & |
JerrySzczurak | 20:cf211a3b3d9e | 277 | 0x0000000ff ) << 8; |
JerrySzczurak | 20:cf211a3b3d9e | 278 | |
JerrySzczurak | 20:cf211a3b3d9e | 279 | status |= vl53l0x_write_byte( dev, 0x94, 0x74 ); |
JerrySzczurak | 20:cf211a3b3d9e | 280 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 281 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 282 | |
JerrySzczurak | 20:cf211a3b3d9e | 283 | signal_rate_meas_fixed1104_400_mm |= ( ( tmp_dword & |
JerrySzczurak | 20:cf211a3b3d9e | 284 | 0xff000000 ) >> 24 ); |
JerrySzczurak | 20:cf211a3b3d9e | 285 | |
JerrySzczurak | 20:cf211a3b3d9e | 286 | status |= vl53l0x_write_byte( dev, 0x94, 0x75 ); |
JerrySzczurak | 20:cf211a3b3d9e | 287 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 288 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 289 | |
JerrySzczurak | 20:cf211a3b3d9e | 290 | dist_meas_fixed1104_400_mm = ( tmp_dword & 0x0000000ff ) |
johnAlexander | 16:98ce55ddbb1a | 291 | << 8; |
johnAlexander | 16:98ce55ddbb1a | 292 | |
JerrySzczurak | 20:cf211a3b3d9e | 293 | status |= vl53l0x_write_byte( dev, 0x94, 0x76 ); |
JerrySzczurak | 20:cf211a3b3d9e | 294 | status |= vl53l0x_device_read_strobe( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 295 | status |= vl53l0x_read_dword( dev, 0x90, &tmp_dword ); |
JerrySzczurak | 20:cf211a3b3d9e | 296 | |
JerrySzczurak | 20:cf211a3b3d9e | 297 | dist_meas_fixed1104_400_mm |= ( ( tmp_dword & 0xff000000 ) |
JerrySzczurak | 20:cf211a3b3d9e | 298 | >> 24 ); |
johnAlexander | 15:932d8b4e52c9 | 299 | } |
johnAlexander | 15:932d8b4e52c9 | 300 | |
JerrySzczurak | 20:cf211a3b3d9e | 301 | status |= vl53l0x_write_byte( dev, 0x81, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 302 | status |= vl53l0x_write_byte( dev, 0xFF, 0x06 ); |
JerrySzczurak | 20:cf211a3b3d9e | 303 | status |= vl53l0x_read_byte( dev, 0x83, &byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 304 | status |= vl53l0x_write_byte( dev, 0x83, byte & 0xfb ); |
JerrySzczurak | 20:cf211a3b3d9e | 305 | status |= vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 306 | status |= vl53l0x_write_byte( dev, 0x00, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 307 | |
JerrySzczurak | 20:cf211a3b3d9e | 308 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 309 | status |= vl53l0x_write_byte( dev, 0x80, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 310 | } |
JerrySzczurak | 20:cf211a3b3d9e | 311 | |
JerrySzczurak | 20:cf211a3b3d9e | 312 | if ( ( status == VL53L0X_ERROR_NONE ) && |
JerrySzczurak | 20:cf211a3b3d9e | 313 | ( read_data_from_device_done != 7 ) ) { |
johnAlexander | 15:932d8b4e52c9 | 314 | /* Assign to variable if status is ok */ |
JerrySzczurak | 20:cf211a3b3d9e | 315 | if ( ( ( option & 1 ) == 1 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 316 | ( ( read_data_from_device_done & 1 ) == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 317 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 318 | ReferenceSpadCount, reference_spad_count ); |
JerrySzczurak | 20:cf211a3b3d9e | 319 | |
JerrySzczurak | 20:cf211a3b3d9e | 320 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 321 | ReferenceSpadType, reference_spad_type ); |
JerrySzczurak | 20:cf211a3b3d9e | 322 | |
JerrySzczurak | 20:cf211a3b3d9e | 323 | for ( i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++ ) { |
johnAlexander | 16:98ce55ddbb1a | 324 | dev->Data.SpadData.RefGoodSpadMap[i] = |
johnAlexander | 16:98ce55ddbb1a | 325 | nvm_ref_good_spad_map[i]; |
johnAlexander | 15:932d8b4e52c9 | 326 | } |
johnAlexander | 15:932d8b4e52c9 | 327 | } |
johnAlexander | 15:932d8b4e52c9 | 328 | |
JerrySzczurak | 20:cf211a3b3d9e | 329 | if ( ( ( option & 2 ) == 2 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 330 | ( ( read_data_from_device_done & 2 ) == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 331 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 332 | ModuleId, module_id ); |
JerrySzczurak | 20:cf211a3b3d9e | 333 | |
JerrySzczurak | 20:cf211a3b3d9e | 334 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 335 | Revision, revision ); |
JerrySzczurak | 20:cf211a3b3d9e | 336 | |
JerrySzczurak | 20:cf211a3b3d9e | 337 | product_id_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 338 | ProductId ); |
JerrySzczurak | 20:cf211a3b3d9e | 339 | VL53L0X_COPYSTRING( product_id_tmp, product_id ); |
johnAlexander | 15:932d8b4e52c9 | 340 | |
johnAlexander | 15:932d8b4e52c9 | 341 | } |
johnAlexander | 15:932d8b4e52c9 | 342 | |
JerrySzczurak | 20:cf211a3b3d9e | 343 | if ( ( ( option & 4 ) == 4 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 344 | ( ( read_data_from_device_done & 4 ) == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 345 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 346 | PartUIDUpper, part_uid_upper ); |
JerrySzczurak | 20:cf211a3b3d9e | 347 | |
JerrySzczurak | 20:cf211a3b3d9e | 348 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 349 | PartUIDLower, part_uid_lower ); |
johnAlexander | 16:98ce55ddbb1a | 350 | |
johnAlexander | 16:98ce55ddbb1a | 351 | signal_rate_meas_fixed400_mm_fix = |
johnAlexander | 15:932d8b4e52c9 | 352 | VL53L0X_FIXPOINT97TOFIXPOINT1616( |
JerrySzczurak | 20:cf211a3b3d9e | 353 | signal_rate_meas_fixed1104_400_mm ); |
JerrySzczurak | 20:cf211a3b3d9e | 354 | |
JerrySzczurak | 20:cf211a3b3d9e | 355 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 356 | SignalRateMeasFixed400mm, |
JerrySzczurak | 20:cf211a3b3d9e | 357 | signal_rate_meas_fixed400_mm_fix ); |
johnAlexander | 16:98ce55ddbb1a | 358 | |
johnAlexander | 16:98ce55ddbb1a | 359 | offset_micro_meters = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 360 | if ( dist_meas_fixed1104_400_mm != 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 361 | offset_fixed1104_mm = |
johnAlexander | 16:98ce55ddbb1a | 362 | dist_meas_fixed1104_400_mm - |
johnAlexander | 16:98ce55ddbb1a | 363 | dist_meas_tgt_fixed1104_mm; |
JerrySzczurak | 20:cf211a3b3d9e | 364 | offset_micro_meters = ( offset_fixed1104_mm |
JerrySzczurak | 20:cf211a3b3d9e | 365 | * 1000 ) >> 4; |
johnAlexander | 16:98ce55ddbb1a | 366 | offset_micro_meters *= -1; |
johnAlexander | 15:932d8b4e52c9 | 367 | } |
johnAlexander | 15:932d8b4e52c9 | 368 | |
JerrySzczurak | 20:cf211a3b3d9e | 369 | PALDevDataSet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 370 | Part2PartOffsetAdjustmentNVMMicroMeter, |
JerrySzczurak | 20:cf211a3b3d9e | 371 | offset_micro_meters ); |
johnAlexander | 15:932d8b4e52c9 | 372 | } |
JerrySzczurak | 20:cf211a3b3d9e | 373 | byte = ( uint8_t )( read_data_from_device_done | option ); |
JerrySzczurak | 20:cf211a3b3d9e | 374 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, ReadDataFromDeviceDone, |
JerrySzczurak | 20:cf211a3b3d9e | 375 | byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 376 | } |
JerrySzczurak | 20:cf211a3b3d9e | 377 | |
JerrySzczurak | 20:cf211a3b3d9e | 378 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 379 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 380 | } |
JerrySzczurak | 20:cf211a3b3d9e | 381 | |
JerrySzczurak | 20:cf211a3b3d9e | 382 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_offset_calibration_data_micro_meter( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 383 | int32_t *p_offset_calibration_data_micro_meter ) |
johnAlexander | 0:c523920bcc09 | 384 | { |
johnAlexander | 16:98ce55ddbb1a | 385 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 386 | uint16_t range_offset_register; |
johnAlexander | 16:98ce55ddbb1a | 387 | int16_t c_max_offset = 2047; |
johnAlexander | 16:98ce55ddbb1a | 388 | int16_t c_offset_range = 4096; |
johnAlexander | 15:932d8b4e52c9 | 389 | |
johnAlexander | 15:932d8b4e52c9 | 390 | /* Note that offset has 10.2 format */ |
johnAlexander | 15:932d8b4e52c9 | 391 | |
JerrySzczurak | 20:cf211a3b3d9e | 392 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 393 | VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, |
JerrySzczurak | 20:cf211a3b3d9e | 394 | &range_offset_register ); |
JerrySzczurak | 20:cf211a3b3d9e | 395 | |
JerrySzczurak | 20:cf211a3b3d9e | 396 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 397 | range_offset_register = ( range_offset_register & 0x0fff ); |
johnAlexander | 15:932d8b4e52c9 | 398 | |
johnAlexander | 15:932d8b4e52c9 | 399 | /* Apply 12 bit 2's compliment conversion */ |
JerrySzczurak | 20:cf211a3b3d9e | 400 | if ( range_offset_register > c_max_offset ) |
johnAlexander | 16:98ce55ddbb1a | 401 | *p_offset_calibration_data_micro_meter = |
JerrySzczurak | 20:cf211a3b3d9e | 402 | ( int16_t )( range_offset_register - c_offset_range ) |
johnAlexander | 15:932d8b4e52c9 | 403 | * 250; |
johnAlexander | 15:932d8b4e52c9 | 404 | else |
johnAlexander | 16:98ce55ddbb1a | 405 | *p_offset_calibration_data_micro_meter = |
JerrySzczurak | 20:cf211a3b3d9e | 406 | ( int16_t )range_offset_register * 250; |
JerrySzczurak | 20:cf211a3b3d9e | 407 | |
JerrySzczurak | 20:cf211a3b3d9e | 408 | } |
JerrySzczurak | 20:cf211a3b3d9e | 409 | |
JerrySzczurak | 20:cf211a3b3d9e | 410 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 411 | } |
JerrySzczurak | 20:cf211a3b3d9e | 412 | |
JerrySzczurak | 20:cf211a3b3d9e | 413 | VL53L0X_Error VL53L0X::vl53l0x_get_offset_calibration_data_micro_meter( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 414 | int32_t *p_offset_calibration_data_micro_meter ) |
johnAlexander | 0:c523920bcc09 | 415 | { |
johnAlexander | 16:98ce55ddbb1a | 416 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 417 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 418 | |
JerrySzczurak | 20:cf211a3b3d9e | 419 | status = wrapped_vl53l0x_get_offset_calibration_data_micro_meter( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 420 | p_offset_calibration_data_micro_meter ); |
JerrySzczurak | 20:cf211a3b3d9e | 421 | |
JerrySzczurak | 20:cf211a3b3d9e | 422 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 423 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 424 | } |
JerrySzczurak | 20:cf211a3b3d9e | 425 | |
JerrySzczurak | 20:cf211a3b3d9e | 426 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_set_offset_calibration_data_micro_meter( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 427 | int32_t offset_calibration_data_micro_meter ) |
johnAlexander | 0:c523920bcc09 | 428 | { |
johnAlexander | 16:98ce55ddbb1a | 429 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 430 | int32_t c_max_offset_micro_meter = 511000; |
johnAlexander | 16:98ce55ddbb1a | 431 | int32_t c_min_offset_micro_meter = -512000; |
johnAlexander | 16:98ce55ddbb1a | 432 | int16_t c_offset_range = 4096; |
johnAlexander | 16:98ce55ddbb1a | 433 | uint32_t encoded_offset_val; |
johnAlexander | 15:932d8b4e52c9 | 434 | |
JerrySzczurak | 20:cf211a3b3d9e | 435 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 436 | |
JerrySzczurak | 20:cf211a3b3d9e | 437 | if ( offset_calibration_data_micro_meter > c_max_offset_micro_meter ) |
johnAlexander | 16:98ce55ddbb1a | 438 | offset_calibration_data_micro_meter = c_max_offset_micro_meter; |
JerrySzczurak | 20:cf211a3b3d9e | 439 | else if ( offset_calibration_data_micro_meter < c_min_offset_micro_meter ) |
johnAlexander | 16:98ce55ddbb1a | 440 | offset_calibration_data_micro_meter = c_min_offset_micro_meter; |
johnAlexander | 15:932d8b4e52c9 | 441 | |
johnAlexander | 15:932d8b4e52c9 | 442 | /* The offset register is 10.2 format and units are mm |
johnAlexander | 15:932d8b4e52c9 | 443 | * therefore conversion is applied by a division of |
johnAlexander | 15:932d8b4e52c9 | 444 | * 250. |
johnAlexander | 15:932d8b4e52c9 | 445 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 446 | if ( offset_calibration_data_micro_meter >= 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 447 | encoded_offset_val = |
JerrySzczurak | 20:cf211a3b3d9e | 448 | offset_calibration_data_micro_meter / 250; |
johnAlexander | 15:932d8b4e52c9 | 449 | } else { |
johnAlexander | 16:98ce55ddbb1a | 450 | encoded_offset_val = |
johnAlexander | 16:98ce55ddbb1a | 451 | c_offset_range + |
JerrySzczurak | 20:cf211a3b3d9e | 452 | offset_calibration_data_micro_meter / 250; |
JerrySzczurak | 20:cf211a3b3d9e | 453 | } |
JerrySzczurak | 20:cf211a3b3d9e | 454 | |
JerrySzczurak | 20:cf211a3b3d9e | 455 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 456 | VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, |
JerrySzczurak | 20:cf211a3b3d9e | 457 | encoded_offset_val ); |
JerrySzczurak | 20:cf211a3b3d9e | 458 | |
JerrySzczurak | 20:cf211a3b3d9e | 459 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 460 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 461 | } |
JerrySzczurak | 20:cf211a3b3d9e | 462 | |
JerrySzczurak | 20:cf211a3b3d9e | 463 | VL53L0X_Error VL53L0X::vl53l0x_set_offset_calibration_data_micro_meter( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 464 | int32_t offset_calibration_data_micro_meter ) |
johnAlexander | 0:c523920bcc09 | 465 | { |
johnAlexander | 16:98ce55ddbb1a | 466 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 467 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 468 | |
JerrySzczurak | 20:cf211a3b3d9e | 469 | status = wrapped_vl53l0x_set_offset_calibration_data_micro_meter( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 470 | offset_calibration_data_micro_meter ); |
JerrySzczurak | 20:cf211a3b3d9e | 471 | |
JerrySzczurak | 20:cf211a3b3d9e | 472 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 473 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 474 | } |
JerrySzczurak | 20:cf211a3b3d9e | 475 | |
JerrySzczurak | 20:cf211a3b3d9e | 476 | VL53L0X_Error VL53L0X::vl53l0x_apply_offset_adjustment( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 477 | { |
johnAlexander | 16:98ce55ddbb1a | 478 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 479 | int32_t corrected_offset_micro_meters; |
johnAlexander | 16:98ce55ddbb1a | 480 | int32_t current_offset_micro_meters; |
johnAlexander | 15:932d8b4e52c9 | 481 | |
johnAlexander | 15:932d8b4e52c9 | 482 | /* if we run on this function we can read all the NVM info |
johnAlexander | 15:932d8b4e52c9 | 483 | * used by the API */ |
JerrySzczurak | 20:cf211a3b3d9e | 484 | status = vl53l0x_get_info_from_device( dev, 7 ); |
johnAlexander | 15:932d8b4e52c9 | 485 | |
johnAlexander | 15:932d8b4e52c9 | 486 | /* Read back current device offset */ |
JerrySzczurak | 20:cf211a3b3d9e | 487 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 488 | status = vl53l0x_get_offset_calibration_data_micro_meter( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 489 | ¤t_offset_micro_meters ); |
johnAlexander | 15:932d8b4e52c9 | 490 | } |
johnAlexander | 15:932d8b4e52c9 | 491 | |
johnAlexander | 15:932d8b4e52c9 | 492 | /* Apply Offset Adjustment derived from 400mm measurements */ |
JerrySzczurak | 20:cf211a3b3d9e | 493 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 494 | |
johnAlexander | 15:932d8b4e52c9 | 495 | /* Store initial device offset */ |
JerrySzczurak | 20:cf211a3b3d9e | 496 | PALDevDataSet( dev, Part2PartOffsetNVMMicroMeter, |
JerrySzczurak | 20:cf211a3b3d9e | 497 | current_offset_micro_meters ); |
johnAlexander | 16:98ce55ddbb1a | 498 | |
johnAlexander | 16:98ce55ddbb1a | 499 | corrected_offset_micro_meters = current_offset_micro_meters + |
JerrySzczurak | 20:cf211a3b3d9e | 500 | ( int32_t )PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 501 | Part2PartOffsetAdjustmentNVMMicroMeter ); |
JerrySzczurak | 20:cf211a3b3d9e | 502 | |
JerrySzczurak | 20:cf211a3b3d9e | 503 | status = vl53l0x_set_offset_calibration_data_micro_meter( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 504 | corrected_offset_micro_meters ); |
johnAlexander | 15:932d8b4e52c9 | 505 | |
johnAlexander | 15:932d8b4e52c9 | 506 | /* store current, adjusted offset */ |
JerrySzczurak | 20:cf211a3b3d9e | 507 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 508 | VL53L0X_SETPARAMETERFIELD( dev, RangeOffsetMicroMeters, |
JerrySzczurak | 20:cf211a3b3d9e | 509 | corrected_offset_micro_meters ); |
johnAlexander | 15:932d8b4e52c9 | 510 | } |
johnAlexander | 15:932d8b4e52c9 | 511 | } |
johnAlexander | 15:932d8b4e52c9 | 512 | |
johnAlexander | 16:98ce55ddbb1a | 513 | return status; |
johnAlexander | 0:c523920bcc09 | 514 | } |
johnAlexander | 0:c523920bcc09 | 515 | |
JerrySzczurak | 20:cf211a3b3d9e | 516 | VL53L0X_Error VL53L0X::vl53l0x_get_device_mode( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 517 | VL53L0X_DeviceModes *p_device_mode ) |
johnAlexander | 0:c523920bcc09 | 518 | { |
johnAlexander | 16:98ce55ddbb1a | 519 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 520 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 521 | |
JerrySzczurak | 20:cf211a3b3d9e | 522 | VL53L0X_GETPARAMETERFIELD( dev, DeviceMode, *p_device_mode ); |
JerrySzczurak | 20:cf211a3b3d9e | 523 | |
JerrySzczurak | 20:cf211a3b3d9e | 524 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 525 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 526 | } |
JerrySzczurak | 20:cf211a3b3d9e | 527 | |
JerrySzczurak | 20:cf211a3b3d9e | 528 | VL53L0X_Error VL53L0X::vl53l0x_get_inter_measurement_period_milli_seconds( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 529 | uint32_t *p_inter_measurement_period_milli_seconds ) |
johnAlexander | 0:c523920bcc09 | 530 | { |
johnAlexander | 16:98ce55ddbb1a | 531 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 532 | uint16_t osc_calibrate_val; |
johnAlexander | 16:98ce55ddbb1a | 533 | uint32_t im_period_milli_seconds; |
johnAlexander | 15:932d8b4e52c9 | 534 | |
JerrySzczurak | 20:cf211a3b3d9e | 535 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 536 | |
JerrySzczurak | 20:cf211a3b3d9e | 537 | status = vl53l0x_read_word( dev, VL53L0X_REG_OSC_CALIBRATE_VAL, |
JerrySzczurak | 20:cf211a3b3d9e | 538 | &osc_calibrate_val ); |
JerrySzczurak | 20:cf211a3b3d9e | 539 | |
JerrySzczurak | 20:cf211a3b3d9e | 540 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 541 | status = vl53l0x_read_dword( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 542 | VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, |
JerrySzczurak | 20:cf211a3b3d9e | 543 | &im_period_milli_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 544 | } |
JerrySzczurak | 20:cf211a3b3d9e | 545 | |
JerrySzczurak | 20:cf211a3b3d9e | 546 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 547 | if ( osc_calibrate_val != 0 ) { |
johnAlexander | 17:1b842521063a | 548 | *p_inter_measurement_period_milli_seconds = |
johnAlexander | 16:98ce55ddbb1a | 549 | im_period_milli_seconds / osc_calibrate_val; |
johnAlexander | 15:932d8b4e52c9 | 550 | } |
JerrySzczurak | 20:cf211a3b3d9e | 551 | VL53L0X_SETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 552 | InterMeasurementPeriodMilliSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 553 | *p_inter_measurement_period_milli_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 554 | } |
JerrySzczurak | 20:cf211a3b3d9e | 555 | |
JerrySzczurak | 20:cf211a3b3d9e | 556 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 557 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 558 | } |
JerrySzczurak | 20:cf211a3b3d9e | 559 | |
JerrySzczurak | 20:cf211a3b3d9e | 560 | VL53L0X_Error VL53L0X::vl53l0x_get_x_talk_compensation_rate_mega_cps( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 561 | FixPoint1616_t *p_xtalk_compensation_rate_mega_cps ) |
johnAlexander | 0:c523920bcc09 | 562 | { |
johnAlexander | 16:98ce55ddbb1a | 563 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 564 | uint16_t value; |
johnAlexander | 16:98ce55ddbb1a | 565 | FixPoint1616_t temp_fix1616; |
johnAlexander | 15:932d8b4e52c9 | 566 | |
JerrySzczurak | 20:cf211a3b3d9e | 567 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 568 | |
JerrySzczurak | 20:cf211a3b3d9e | 569 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 570 | VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, ( uint16_t * )&value ); |
JerrySzczurak | 20:cf211a3b3d9e | 571 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 572 | if ( value == 0 ) { |
johnAlexander | 15:932d8b4e52c9 | 573 | /* the Xtalk is disabled return value from memory */ |
JerrySzczurak | 20:cf211a3b3d9e | 574 | VL53L0X_GETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 575 | XTalkCompensationRateMegaCps, temp_fix1616 ); |
johnAlexander | 17:1b842521063a | 576 | *p_xtalk_compensation_rate_mega_cps = temp_fix1616; |
JerrySzczurak | 20:cf211a3b3d9e | 577 | VL53L0X_SETPARAMETERFIELD( dev, XTalkCompensationEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 578 | 0 ); |
johnAlexander | 15:932d8b4e52c9 | 579 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 580 | temp_fix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616( value ); |
johnAlexander | 17:1b842521063a | 581 | *p_xtalk_compensation_rate_mega_cps = temp_fix1616; |
JerrySzczurak | 20:cf211a3b3d9e | 582 | VL53L0X_SETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 583 | XTalkCompensationRateMegaCps, temp_fix1616 ); |
JerrySzczurak | 20:cf211a3b3d9e | 584 | VL53L0X_SETPARAMETERFIELD( dev, XTalkCompensationEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 585 | 1 ); |
johnAlexander | 15:932d8b4e52c9 | 586 | } |
johnAlexander | 15:932d8b4e52c9 | 587 | } |
johnAlexander | 15:932d8b4e52c9 | 588 | |
JerrySzczurak | 20:cf211a3b3d9e | 589 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 590 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 591 | } |
JerrySzczurak | 20:cf211a3b3d9e | 592 | |
JerrySzczurak | 20:cf211a3b3d9e | 593 | VL53L0X_Error VL53L0X::vl53l0x_get_limit_check_value( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 594 | FixPoint1616_t *p_limit_check_value ) |
johnAlexander | 0:c523920bcc09 | 595 | { |
johnAlexander | 16:98ce55ddbb1a | 596 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 597 | uint8_t enable_zero_value = 0; |
johnAlexander | 16:98ce55ddbb1a | 598 | uint16_t temp16; |
johnAlexander | 16:98ce55ddbb1a | 599 | FixPoint1616_t temp_fix1616; |
johnAlexander | 15:932d8b4e52c9 | 600 | |
JerrySzczurak | 20:cf211a3b3d9e | 601 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 602 | |
JerrySzczurak | 20:cf211a3b3d9e | 603 | switch ( limit_check_id ) { |
johnAlexander | 15:932d8b4e52c9 | 604 | |
johnAlexander | 15:932d8b4e52c9 | 605 | case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 606 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 607 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 608 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, temp_fix1616 ); |
johnAlexander | 16:98ce55ddbb1a | 609 | enable_zero_value = 0; |
johnAlexander | 15:932d8b4e52c9 | 610 | break; |
johnAlexander | 15:932d8b4e52c9 | 611 | |
johnAlexander | 15:932d8b4e52c9 | 612 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 613 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 614 | VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, |
JerrySzczurak | 20:cf211a3b3d9e | 615 | &temp16 ); |
JerrySzczurak | 20:cf211a3b3d9e | 616 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 617 | temp_fix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616( temp16 ); |
johnAlexander | 16:98ce55ddbb1a | 618 | |
johnAlexander | 16:98ce55ddbb1a | 619 | |
johnAlexander | 16:98ce55ddbb1a | 620 | enable_zero_value = 1; |
johnAlexander | 15:932d8b4e52c9 | 621 | break; |
johnAlexander | 15:932d8b4e52c9 | 622 | |
johnAlexander | 15:932d8b4e52c9 | 623 | case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: |
johnAlexander | 15:932d8b4e52c9 | 624 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 625 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 626 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, temp_fix1616 ); |
johnAlexander | 16:98ce55ddbb1a | 627 | enable_zero_value = 0; |
johnAlexander | 15:932d8b4e52c9 | 628 | break; |
johnAlexander | 15:932d8b4e52c9 | 629 | |
johnAlexander | 15:932d8b4e52c9 | 630 | case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: |
johnAlexander | 15:932d8b4e52c9 | 631 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 632 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 633 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, temp_fix1616 ); |
johnAlexander | 16:98ce55ddbb1a | 634 | enable_zero_value = 0; |
johnAlexander | 15:932d8b4e52c9 | 635 | break; |
johnAlexander | 15:932d8b4e52c9 | 636 | |
johnAlexander | 15:932d8b4e52c9 | 637 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: |
johnAlexander | 15:932d8b4e52c9 | 638 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 639 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 640 | VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, |
JerrySzczurak | 20:cf211a3b3d9e | 641 | &temp16 ); |
JerrySzczurak | 20:cf211a3b3d9e | 642 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 643 | temp_fix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616( temp16 ); |
johnAlexander | 16:98ce55ddbb1a | 644 | |
johnAlexander | 16:98ce55ddbb1a | 645 | |
johnAlexander | 16:98ce55ddbb1a | 646 | enable_zero_value = 0; |
johnAlexander | 15:932d8b4e52c9 | 647 | break; |
johnAlexander | 15:932d8b4e52c9 | 648 | |
johnAlexander | 15:932d8b4e52c9 | 649 | default: |
johnAlexander | 16:98ce55ddbb1a | 650 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 651 | |
johnAlexander | 15:932d8b4e52c9 | 652 | } |
johnAlexander | 15:932d8b4e52c9 | 653 | |
JerrySzczurak | 20:cf211a3b3d9e | 654 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 655 | |
JerrySzczurak | 20:cf211a3b3d9e | 656 | if ( enable_zero_value == 1 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 657 | |
JerrySzczurak | 20:cf211a3b3d9e | 658 | if ( temp_fix1616 == 0 ) { |
johnAlexander | 15:932d8b4e52c9 | 659 | /* disabled: return value from memory */ |
JerrySzczurak | 20:cf211a3b3d9e | 660 | VL53L0X_GETARRAYPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 661 | LimitChecksValue, limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 662 | temp_fix1616 ); |
johnAlexander | 17:1b842521063a | 663 | *p_limit_check_value = temp_fix1616; |
JerrySzczurak | 20:cf211a3b3d9e | 664 | VL53L0X_SETARRAYPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 665 | LimitChecksEnable, limit_check_id, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 666 | } else { |
johnAlexander | 17:1b842521063a | 667 | *p_limit_check_value = temp_fix1616; |
JerrySzczurak | 20:cf211a3b3d9e | 668 | VL53L0X_SETARRAYPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 669 | LimitChecksValue, limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 670 | temp_fix1616 ); |
JerrySzczurak | 20:cf211a3b3d9e | 671 | VL53L0X_SETARRAYPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 672 | LimitChecksEnable, limit_check_id, 1 ); |
johnAlexander | 15:932d8b4e52c9 | 673 | } |
johnAlexander | 15:932d8b4e52c9 | 674 | } else { |
johnAlexander | 17:1b842521063a | 675 | *p_limit_check_value = temp_fix1616; |
johnAlexander | 15:932d8b4e52c9 | 676 | } |
johnAlexander | 15:932d8b4e52c9 | 677 | } |
johnAlexander | 15:932d8b4e52c9 | 678 | |
JerrySzczurak | 20:cf211a3b3d9e | 679 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 680 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 681 | |
JerrySzczurak | 20:cf211a3b3d9e | 682 | } |
JerrySzczurak | 20:cf211a3b3d9e | 683 | |
JerrySzczurak | 20:cf211a3b3d9e | 684 | VL53L0X_Error VL53L0X::vl53l0x_get_limit_check_enable( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 685 | uint8_t *p_limit_check_enable ) |
johnAlexander | 0:c523920bcc09 | 686 | { |
johnAlexander | 16:98ce55ddbb1a | 687 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 688 | uint8_t temp8; |
johnAlexander | 15:932d8b4e52c9 | 689 | |
JerrySzczurak | 20:cf211a3b3d9e | 690 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 691 | |
JerrySzczurak | 20:cf211a3b3d9e | 692 | if ( limit_check_id >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS ) { |
johnAlexander | 16:98ce55ddbb1a | 693 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 17:1b842521063a | 694 | *p_limit_check_enable = 0; |
johnAlexander | 15:932d8b4e52c9 | 695 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 696 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 697 | limit_check_id, temp8 ); |
johnAlexander | 17:1b842521063a | 698 | *p_limit_check_enable = temp8; |
johnAlexander | 15:932d8b4e52c9 | 699 | } |
johnAlexander | 15:932d8b4e52c9 | 700 | |
JerrySzczurak | 20:cf211a3b3d9e | 701 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 702 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 703 | } |
JerrySzczurak | 20:cf211a3b3d9e | 704 | |
JerrySzczurak | 20:cf211a3b3d9e | 705 | VL53L0X_Error VL53L0X::vl53l0x_get_wrap_around_check_enable( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 706 | uint8_t *p_wrap_around_check_enable ) |
johnAlexander | 0:c523920bcc09 | 707 | { |
johnAlexander | 16:98ce55ddbb1a | 708 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 709 | uint8_t data; |
johnAlexander | 15:932d8b4e52c9 | 710 | |
JerrySzczurak | 20:cf211a3b3d9e | 711 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 712 | |
JerrySzczurak | 20:cf211a3b3d9e | 713 | status = vl53l0x_read_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data ); |
JerrySzczurak | 20:cf211a3b3d9e | 714 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 715 | PALDevDataSet( dev, SequenceConfig, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 716 | if ( data & ( 0x01 << 7 ) ) |
johnAlexander | 17:1b842521063a | 717 | *p_wrap_around_check_enable = 0x01; |
johnAlexander | 15:932d8b4e52c9 | 718 | else |
johnAlexander | 17:1b842521063a | 719 | *p_wrap_around_check_enable = 0x00; |
johnAlexander | 15:932d8b4e52c9 | 720 | } |
JerrySzczurak | 20:cf211a3b3d9e | 721 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 722 | VL53L0X_SETPARAMETERFIELD( dev, WrapAroundCheckEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 723 | *p_wrap_around_check_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 724 | } |
JerrySzczurak | 20:cf211a3b3d9e | 725 | |
JerrySzczurak | 20:cf211a3b3d9e | 726 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 727 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 728 | } |
JerrySzczurak | 20:cf211a3b3d9e | 729 | |
JerrySzczurak | 20:cf211a3b3d9e | 730 | VL53L0X_Error VL53L0X::sequence_step_enabled( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 731 | VL53L0X_SequenceStepId sequence_step_id, uint8_t sequence_config, |
JerrySzczurak | 20:cf211a3b3d9e | 732 | uint8_t *p_sequence_step_enabled ) |
johnAlexander | 0:c523920bcc09 | 733 | { |
johnAlexander | 15:932d8b4e52c9 | 734 | VL53L0X_Error Status = VL53L0X_ERROR_NONE; |
johnAlexander | 17:1b842521063a | 735 | *p_sequence_step_enabled = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 736 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 737 | |
JerrySzczurak | 20:cf211a3b3d9e | 738 | switch ( sequence_step_id ) { |
johnAlexander | 15:932d8b4e52c9 | 739 | case VL53L0X_SEQUENCESTEP_TCC: |
JerrySzczurak | 20:cf211a3b3d9e | 740 | *p_sequence_step_enabled = ( sequence_config & 0x10 ) >> 4; |
johnAlexander | 15:932d8b4e52c9 | 741 | break; |
johnAlexander | 15:932d8b4e52c9 | 742 | case VL53L0X_SEQUENCESTEP_DSS: |
JerrySzczurak | 20:cf211a3b3d9e | 743 | *p_sequence_step_enabled = ( sequence_config & 0x08 ) >> 3; |
johnAlexander | 15:932d8b4e52c9 | 744 | break; |
johnAlexander | 15:932d8b4e52c9 | 745 | case VL53L0X_SEQUENCESTEP_MSRC: |
JerrySzczurak | 20:cf211a3b3d9e | 746 | *p_sequence_step_enabled = ( sequence_config & 0x04 ) >> 2; |
johnAlexander | 15:932d8b4e52c9 | 747 | break; |
johnAlexander | 15:932d8b4e52c9 | 748 | case VL53L0X_SEQUENCESTEP_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 749 | *p_sequence_step_enabled = ( sequence_config & 0x40 ) >> 6; |
johnAlexander | 15:932d8b4e52c9 | 750 | break; |
johnAlexander | 15:932d8b4e52c9 | 751 | case VL53L0X_SEQUENCESTEP_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 752 | *p_sequence_step_enabled = ( sequence_config & 0x80 ) >> 7; |
johnAlexander | 15:932d8b4e52c9 | 753 | break; |
johnAlexander | 15:932d8b4e52c9 | 754 | default: |
johnAlexander | 15:932d8b4e52c9 | 755 | Status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 756 | } |
johnAlexander | 15:932d8b4e52c9 | 757 | |
JerrySzczurak | 20:cf211a3b3d9e | 758 | LOG_FUNCTION_END( status ); |
johnAlexander | 15:932d8b4e52c9 | 759 | return Status; |
johnAlexander | 0:c523920bcc09 | 760 | } |
johnAlexander | 0:c523920bcc09 | 761 | |
JerrySzczurak | 20:cf211a3b3d9e | 762 | VL53L0X_Error VL53L0X::vl53l0x_get_sequence_step_enables( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 763 | VL53L0X_SchedulerSequenceSteps_t *p_scheduler_sequence_steps ) |
johnAlexander | 0:c523920bcc09 | 764 | { |
johnAlexander | 16:98ce55ddbb1a | 765 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 766 | uint8_t sequence_config = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 767 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 768 | |
JerrySzczurak | 20:cf211a3b3d9e | 769 | status = vl53l0x_read_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 770 | &sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 771 | |
JerrySzczurak | 20:cf211a3b3d9e | 772 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 773 | status = sequence_step_enabled( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 774 | VL53L0X_SEQUENCESTEP_TCC, sequence_config, |
JerrySzczurak | 20:cf211a3b3d9e | 775 | &p_scheduler_sequence_steps->TccOn ); |
JerrySzczurak | 20:cf211a3b3d9e | 776 | } |
JerrySzczurak | 20:cf211a3b3d9e | 777 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 778 | status = sequence_step_enabled( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 779 | VL53L0X_SEQUENCESTEP_DSS, sequence_config, |
JerrySzczurak | 20:cf211a3b3d9e | 780 | &p_scheduler_sequence_steps->DssOn ); |
JerrySzczurak | 20:cf211a3b3d9e | 781 | } |
JerrySzczurak | 20:cf211a3b3d9e | 782 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 783 | status = sequence_step_enabled( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 784 | VL53L0X_SEQUENCESTEP_MSRC, sequence_config, |
JerrySzczurak | 20:cf211a3b3d9e | 785 | &p_scheduler_sequence_steps->MsrcOn ); |
JerrySzczurak | 20:cf211a3b3d9e | 786 | } |
JerrySzczurak | 20:cf211a3b3d9e | 787 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 788 | status = sequence_step_enabled( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 789 | VL53L0X_SEQUENCESTEP_PRE_RANGE, sequence_config, |
JerrySzczurak | 20:cf211a3b3d9e | 790 | &p_scheduler_sequence_steps->PreRangeOn ); |
JerrySzczurak | 20:cf211a3b3d9e | 791 | } |
JerrySzczurak | 20:cf211a3b3d9e | 792 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 793 | status = sequence_step_enabled( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 794 | VL53L0X_SEQUENCESTEP_FINAL_RANGE, sequence_config, |
JerrySzczurak | 20:cf211a3b3d9e | 795 | &p_scheduler_sequence_steps->FinalRangeOn ); |
JerrySzczurak | 20:cf211a3b3d9e | 796 | } |
JerrySzczurak | 20:cf211a3b3d9e | 797 | |
JerrySzczurak | 20:cf211a3b3d9e | 798 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 799 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 800 | } |
JerrySzczurak | 20:cf211a3b3d9e | 801 | |
JerrySzczurak | 20:cf211a3b3d9e | 802 | uint8_t VL53L0X::vl53l0x_decode_vcsel_period( uint8_t vcsel_period_reg ) |
johnAlexander | 0:c523920bcc09 | 803 | { |
johnAlexander | 15:932d8b4e52c9 | 804 | /*! |
johnAlexander | 15:932d8b4e52c9 | 805 | * Converts the encoded VCSEL period register value into the real |
johnAlexander | 15:932d8b4e52c9 | 806 | * period in PLL clocks |
johnAlexander | 15:932d8b4e52c9 | 807 | */ |
johnAlexander | 15:932d8b4e52c9 | 808 | |
johnAlexander | 15:932d8b4e52c9 | 809 | uint8_t vcsel_period_pclks = 0; |
johnAlexander | 15:932d8b4e52c9 | 810 | |
JerrySzczurak | 20:cf211a3b3d9e | 811 | vcsel_period_pclks = ( vcsel_period_reg + 1 ) << 1; |
johnAlexander | 15:932d8b4e52c9 | 812 | |
johnAlexander | 15:932d8b4e52c9 | 813 | return vcsel_period_pclks; |
johnAlexander | 0:c523920bcc09 | 814 | } |
johnAlexander | 0:c523920bcc09 | 815 | |
JerrySzczurak | 20:cf211a3b3d9e | 816 | uint8_t VL53L0X::lv53l0x_encode_vcsel_period( uint8_t vcsel_period_pclks ) |
johnAlexander | 0:c523920bcc09 | 817 | { |
johnAlexander | 15:932d8b4e52c9 | 818 | /*! |
johnAlexander | 15:932d8b4e52c9 | 819 | * Converts the encoded VCSEL period register value into the real period |
johnAlexander | 15:932d8b4e52c9 | 820 | * in PLL clocks |
johnAlexander | 15:932d8b4e52c9 | 821 | */ |
johnAlexander | 15:932d8b4e52c9 | 822 | |
johnAlexander | 15:932d8b4e52c9 | 823 | uint8_t vcsel_period_reg = 0; |
johnAlexander | 15:932d8b4e52c9 | 824 | |
JerrySzczurak | 20:cf211a3b3d9e | 825 | vcsel_period_reg = ( vcsel_period_pclks >> 1 ) - 1; |
johnAlexander | 15:932d8b4e52c9 | 826 | |
johnAlexander | 15:932d8b4e52c9 | 827 | return vcsel_period_reg; |
johnAlexander | 0:c523920bcc09 | 828 | } |
johnAlexander | 0:c523920bcc09 | 829 | |
johnAlexander | 0:c523920bcc09 | 830 | |
JerrySzczurak | 20:cf211a3b3d9e | 831 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_set_vcsel_pulse_period( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 832 | VL53L0X_VcselPeriod vcsel_period_type, uint8_t vcsel_pulse_period_pclk ) |
johnAlexander | 0:c523920bcc09 | 833 | { |
johnAlexander | 16:98ce55ddbb1a | 834 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 835 | uint8_t vcsel_period_reg; |
johnAlexander | 16:98ce55ddbb1a | 836 | uint8_t min_pre_vcsel_period_pclk = 12; |
johnAlexander | 16:98ce55ddbb1a | 837 | uint8_t max_pre_vcsel_period_pclk = 18; |
johnAlexander | 16:98ce55ddbb1a | 838 | uint8_t min_final_vcsel_period_pclk = 8; |
johnAlexander | 16:98ce55ddbb1a | 839 | uint8_t max_final_vcsel_period_pclk = 14; |
johnAlexander | 16:98ce55ddbb1a | 840 | uint32_t measurement_timing_budget_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 841 | uint32_t final_range_timeout_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 842 | uint32_t pre_range_timeout_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 843 | uint32_t msrc_timeout_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 844 | uint8_t phase_cal_int = 0; |
johnAlexander | 15:932d8b4e52c9 | 845 | |
johnAlexander | 15:932d8b4e52c9 | 846 | /* Check if valid clock period requested */ |
johnAlexander | 15:932d8b4e52c9 | 847 | |
JerrySzczurak | 20:cf211a3b3d9e | 848 | if ( ( vcsel_pulse_period_pclk % 2 ) != 0 ) { |
johnAlexander | 15:932d8b4e52c9 | 849 | /* Value must be an even number */ |
johnAlexander | 16:98ce55ddbb1a | 850 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 851 | } else if ( vcsel_period_type == VL53L0X_VCSEL_PERIOD_PRE_RANGE && |
JerrySzczurak | 20:cf211a3b3d9e | 852 | ( vcsel_pulse_period_pclk < min_pre_vcsel_period_pclk || |
JerrySzczurak | 20:cf211a3b3d9e | 853 | vcsel_pulse_period_pclk > max_pre_vcsel_period_pclk ) ) { |
johnAlexander | 16:98ce55ddbb1a | 854 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 855 | } else if ( vcsel_period_type == VL53L0X_VCSEL_PERIOD_FINAL_RANGE && |
JerrySzczurak | 20:cf211a3b3d9e | 856 | ( vcsel_pulse_period_pclk < min_final_vcsel_period_pclk || |
JerrySzczurak | 20:cf211a3b3d9e | 857 | vcsel_pulse_period_pclk > max_final_vcsel_period_pclk ) ) { |
johnAlexander | 16:98ce55ddbb1a | 858 | |
johnAlexander | 16:98ce55ddbb1a | 859 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 860 | } |
johnAlexander | 15:932d8b4e52c9 | 861 | |
johnAlexander | 15:932d8b4e52c9 | 862 | /* Apply specific settings for the requested clock period */ |
johnAlexander | 15:932d8b4e52c9 | 863 | |
JerrySzczurak | 20:cf211a3b3d9e | 864 | if ( status != VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 865 | return status; |
johnAlexander | 16:98ce55ddbb1a | 866 | |
johnAlexander | 16:98ce55ddbb1a | 867 | |
JerrySzczurak | 20:cf211a3b3d9e | 868 | if ( vcsel_period_type == VL53L0X_VCSEL_PERIOD_PRE_RANGE ) { |
johnAlexander | 15:932d8b4e52c9 | 869 | |
johnAlexander | 15:932d8b4e52c9 | 870 | /* Set phase check limits */ |
JerrySzczurak | 20:cf211a3b3d9e | 871 | if ( vcsel_pulse_period_pclk == 12 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 872 | |
JerrySzczurak | 20:cf211a3b3d9e | 873 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 874 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 875 | 0x18 ); |
JerrySzczurak | 20:cf211a3b3d9e | 876 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 877 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 878 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 879 | } else if ( vcsel_pulse_period_pclk == 14 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 880 | |
JerrySzczurak | 20:cf211a3b3d9e | 881 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 882 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 883 | 0x30 ); |
JerrySzczurak | 20:cf211a3b3d9e | 884 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 885 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 886 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 887 | } else if ( vcsel_pulse_period_pclk == 16 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 888 | |
JerrySzczurak | 20:cf211a3b3d9e | 889 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 890 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 891 | 0x40 ); |
JerrySzczurak | 20:cf211a3b3d9e | 892 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 893 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 894 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 895 | } else if ( vcsel_pulse_period_pclk == 18 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 896 | |
JerrySzczurak | 20:cf211a3b3d9e | 897 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 898 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 899 | 0x50 ); |
JerrySzczurak | 20:cf211a3b3d9e | 900 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 901 | VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 902 | 0x08 ); |
johnAlexander | 15:932d8b4e52c9 | 903 | } |
JerrySzczurak | 20:cf211a3b3d9e | 904 | } else if ( vcsel_period_type == VL53L0X_VCSEL_PERIOD_FINAL_RANGE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 905 | |
JerrySzczurak | 20:cf211a3b3d9e | 906 | if ( vcsel_pulse_period_pclk == 8 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 907 | |
JerrySzczurak | 20:cf211a3b3d9e | 908 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 909 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 910 | 0x10 ); |
JerrySzczurak | 20:cf211a3b3d9e | 911 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 912 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 913 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 914 | |
JerrySzczurak | 20:cf211a3b3d9e | 915 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 916 | VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02 ); |
JerrySzczurak | 20:cf211a3b3d9e | 917 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 918 | VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C ); |
JerrySzczurak | 20:cf211a3b3d9e | 919 | |
JerrySzczurak | 20:cf211a3b3d9e | 920 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 921 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 922 | VL53L0X_REG_ALGO_PHASECAL_LIM, |
JerrySzczurak | 20:cf211a3b3d9e | 923 | 0x30 ); |
JerrySzczurak | 20:cf211a3b3d9e | 924 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 925 | } else if ( vcsel_pulse_period_pclk == 10 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 926 | |
JerrySzczurak | 20:cf211a3b3d9e | 927 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 928 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 929 | 0x28 ); |
JerrySzczurak | 20:cf211a3b3d9e | 930 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 931 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 932 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 933 | |
JerrySzczurak | 20:cf211a3b3d9e | 934 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 935 | VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03 ); |
JerrySzczurak | 20:cf211a3b3d9e | 936 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 937 | VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09 ); |
JerrySzczurak | 20:cf211a3b3d9e | 938 | |
JerrySzczurak | 20:cf211a3b3d9e | 939 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 940 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 941 | VL53L0X_REG_ALGO_PHASECAL_LIM, |
JerrySzczurak | 20:cf211a3b3d9e | 942 | 0x20 ); |
JerrySzczurak | 20:cf211a3b3d9e | 943 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 944 | } else if ( vcsel_pulse_period_pclk == 12 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 945 | |
JerrySzczurak | 20:cf211a3b3d9e | 946 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 947 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 948 | 0x38 ); |
JerrySzczurak | 20:cf211a3b3d9e | 949 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 950 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 951 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 952 | |
JerrySzczurak | 20:cf211a3b3d9e | 953 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 954 | VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03 ); |
JerrySzczurak | 20:cf211a3b3d9e | 955 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 956 | VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 957 | |
JerrySzczurak | 20:cf211a3b3d9e | 958 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 959 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 960 | VL53L0X_REG_ALGO_PHASECAL_LIM, |
JerrySzczurak | 20:cf211a3b3d9e | 961 | 0x20 ); |
JerrySzczurak | 20:cf211a3b3d9e | 962 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 963 | } else if ( vcsel_pulse_period_pclk == 14 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 964 | |
JerrySzczurak | 20:cf211a3b3d9e | 965 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 966 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 967 | 0x048 ); |
JerrySzczurak | 20:cf211a3b3d9e | 968 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 969 | VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, |
JerrySzczurak | 20:cf211a3b3d9e | 970 | 0x08 ); |
JerrySzczurak | 20:cf211a3b3d9e | 971 | |
JerrySzczurak | 20:cf211a3b3d9e | 972 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 973 | VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03 ); |
JerrySzczurak | 20:cf211a3b3d9e | 974 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 975 | VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07 ); |
JerrySzczurak | 20:cf211a3b3d9e | 976 | |
JerrySzczurak | 20:cf211a3b3d9e | 977 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 978 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 979 | VL53L0X_REG_ALGO_PHASECAL_LIM, |
JerrySzczurak | 20:cf211a3b3d9e | 980 | 0x20 ); |
JerrySzczurak | 20:cf211a3b3d9e | 981 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
johnAlexander | 15:932d8b4e52c9 | 982 | } |
johnAlexander | 15:932d8b4e52c9 | 983 | } |
johnAlexander | 15:932d8b4e52c9 | 984 | |
johnAlexander | 15:932d8b4e52c9 | 985 | |
johnAlexander | 15:932d8b4e52c9 | 986 | /* Re-calculate and apply timeouts, in macro periods */ |
johnAlexander | 15:932d8b4e52c9 | 987 | |
JerrySzczurak | 20:cf211a3b3d9e | 988 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 989 | vcsel_period_reg = lv53l0x_encode_vcsel_period( ( uint8_t ) |
JerrySzczurak | 20:cf211a3b3d9e | 990 | vcsel_pulse_period_pclk ); |
johnAlexander | 15:932d8b4e52c9 | 991 | |
johnAlexander | 15:932d8b4e52c9 | 992 | /* When the VCSEL period for the pre or final range is changed, |
johnAlexander | 15:932d8b4e52c9 | 993 | * the corresponding timeout must be read from the device using |
johnAlexander | 15:932d8b4e52c9 | 994 | * the current VCSEL period, then the new VCSEL period can be |
johnAlexander | 15:932d8b4e52c9 | 995 | * applied. The timeout then must be written back to the device |
johnAlexander | 15:932d8b4e52c9 | 996 | * using the new VCSEL period. |
johnAlexander | 15:932d8b4e52c9 | 997 | * |
johnAlexander | 15:932d8b4e52c9 | 998 | * For the MSRC timeout, the same applies - this timeout being |
johnAlexander | 15:932d8b4e52c9 | 999 | * dependant on the pre-range vcsel period. |
johnAlexander | 15:932d8b4e52c9 | 1000 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 1001 | switch ( vcsel_period_type ) { |
johnAlexander | 15:932d8b4e52c9 | 1002 | case VL53L0X_VCSEL_PERIOD_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 1003 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1004 | VL53L0X_SEQUENCESTEP_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1005 | &pre_range_timeout_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1006 | |
JerrySzczurak | 20:cf211a3b3d9e | 1007 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1008 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1009 | VL53L0X_SEQUENCESTEP_MSRC, |
JerrySzczurak | 20:cf211a3b3d9e | 1010 | &msrc_timeout_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1011 | |
JerrySzczurak | 20:cf211a3b3d9e | 1012 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1013 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1014 | VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, |
JerrySzczurak | 20:cf211a3b3d9e | 1015 | vcsel_period_reg ); |
JerrySzczurak | 20:cf211a3b3d9e | 1016 | |
JerrySzczurak | 20:cf211a3b3d9e | 1017 | |
JerrySzczurak | 20:cf211a3b3d9e | 1018 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1019 | status = set_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1020 | VL53L0X_SEQUENCESTEP_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1021 | pre_range_timeout_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1022 | |
JerrySzczurak | 20:cf211a3b3d9e | 1023 | |
JerrySzczurak | 20:cf211a3b3d9e | 1024 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1025 | status = set_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1026 | VL53L0X_SEQUENCESTEP_MSRC, |
JerrySzczurak | 20:cf211a3b3d9e | 1027 | msrc_timeout_micro_seconds ); |
johnAlexander | 15:932d8b4e52c9 | 1028 | |
johnAlexander | 15:932d8b4e52c9 | 1029 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 16:98ce55ddbb1a | 1030 | dev, |
johnAlexander | 15:932d8b4e52c9 | 1031 | PreRangeVcselPulsePeriod, |
JerrySzczurak | 20:cf211a3b3d9e | 1032 | vcsel_pulse_period_pclk ); |
johnAlexander | 15:932d8b4e52c9 | 1033 | break; |
johnAlexander | 15:932d8b4e52c9 | 1034 | case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 1035 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1036 | VL53L0X_SEQUENCESTEP_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1037 | &final_range_timeout_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1038 | |
JerrySzczurak | 20:cf211a3b3d9e | 1039 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1040 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1041 | VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, |
JerrySzczurak | 20:cf211a3b3d9e | 1042 | vcsel_period_reg ); |
JerrySzczurak | 20:cf211a3b3d9e | 1043 | |
JerrySzczurak | 20:cf211a3b3d9e | 1044 | |
JerrySzczurak | 20:cf211a3b3d9e | 1045 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1046 | status = set_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1047 | VL53L0X_SEQUENCESTEP_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1048 | final_range_timeout_micro_seconds ); |
johnAlexander | 15:932d8b4e52c9 | 1049 | |
johnAlexander | 15:932d8b4e52c9 | 1050 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 16:98ce55ddbb1a | 1051 | dev, |
johnAlexander | 15:932d8b4e52c9 | 1052 | FinalRangeVcselPulsePeriod, |
JerrySzczurak | 20:cf211a3b3d9e | 1053 | vcsel_pulse_period_pclk ); |
johnAlexander | 15:932d8b4e52c9 | 1054 | break; |
johnAlexander | 15:932d8b4e52c9 | 1055 | default: |
johnAlexander | 16:98ce55ddbb1a | 1056 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 1057 | } |
johnAlexander | 15:932d8b4e52c9 | 1058 | } |
johnAlexander | 15:932d8b4e52c9 | 1059 | |
johnAlexander | 15:932d8b4e52c9 | 1060 | /* Finally, the timing budget must be re-applied */ |
JerrySzczurak | 20:cf211a3b3d9e | 1061 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1062 | VL53L0X_GETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1063 | MeasurementTimingBudgetMicroSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 1064 | measurement_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1065 | |
JerrySzczurak | 20:cf211a3b3d9e | 1066 | status = vl53l0x_set_measurement_timing_budget_micro_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1067 | measurement_timing_budget_micro_seconds ); |
johnAlexander | 15:932d8b4e52c9 | 1068 | } |
johnAlexander | 15:932d8b4e52c9 | 1069 | |
johnAlexander | 15:932d8b4e52c9 | 1070 | /* Perform the phase calibration. This is needed after changing on |
johnAlexander | 15:932d8b4e52c9 | 1071 | * vcsel period. |
johnAlexander | 15:932d8b4e52c9 | 1072 | * get_data_enable = 0, restore_config = 1 */ |
JerrySzczurak | 20:cf211a3b3d9e | 1073 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 1074 | status = vl53l0x_perform_phase_calibration( |
JerrySzczurak | 20:cf211a3b3d9e | 1075 | dev, &phase_cal_int, 0, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1076 | |
JerrySzczurak | 20:cf211a3b3d9e | 1077 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1078 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1079 | |
JerrySzczurak | 20:cf211a3b3d9e | 1080 | VL53L0X_Error VL53L0X::vl53l0x_set_vcsel_pulse_period( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1081 | VL53L0X_VcselPeriod vcsel_period_type, uint8_t vcsel_pulse_period ) |
johnAlexander | 16:98ce55ddbb1a | 1082 | { |
johnAlexander | 16:98ce55ddbb1a | 1083 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 1084 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1085 | |
JerrySzczurak | 20:cf211a3b3d9e | 1086 | status = wrapped_vl53l0x_set_vcsel_pulse_period( dev, vcsel_period_type, |
JerrySzczurak | 20:cf211a3b3d9e | 1087 | vcsel_pulse_period ); |
JerrySzczurak | 20:cf211a3b3d9e | 1088 | |
JerrySzczurak | 20:cf211a3b3d9e | 1089 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1090 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1091 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1092 | |
JerrySzczurak | 20:cf211a3b3d9e | 1093 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_vcsel_pulse_period( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1094 | VL53L0X_VcselPeriod vcsel_period_type, uint8_t *p_vcsel_pulse_period_pclk ) |
johnAlexander | 0:c523920bcc09 | 1095 | { |
johnAlexander | 16:98ce55ddbb1a | 1096 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1097 | uint8_t vcsel_period_reg; |
johnAlexander | 16:98ce55ddbb1a | 1098 | |
JerrySzczurak | 20:cf211a3b3d9e | 1099 | switch ( vcsel_period_type ) { |
johnAlexander | 16:98ce55ddbb1a | 1100 | case VL53L0X_VCSEL_PERIOD_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 1101 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1102 | VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, |
JerrySzczurak | 20:cf211a3b3d9e | 1103 | &vcsel_period_reg ); |
johnAlexander | 16:98ce55ddbb1a | 1104 | break; |
johnAlexander | 16:98ce55ddbb1a | 1105 | case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 1106 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1107 | VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, |
JerrySzczurak | 20:cf211a3b3d9e | 1108 | &vcsel_period_reg ); |
johnAlexander | 16:98ce55ddbb1a | 1109 | break; |
johnAlexander | 16:98ce55ddbb1a | 1110 | default: |
johnAlexander | 16:98ce55ddbb1a | 1111 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 16:98ce55ddbb1a | 1112 | } |
johnAlexander | 16:98ce55ddbb1a | 1113 | |
JerrySzczurak | 20:cf211a3b3d9e | 1114 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 1115 | *p_vcsel_pulse_period_pclk = |
JerrySzczurak | 20:cf211a3b3d9e | 1116 | vl53l0x_decode_vcsel_period( vcsel_period_reg ); |
JerrySzczurak | 20:cf211a3b3d9e | 1117 | |
JerrySzczurak | 20:cf211a3b3d9e | 1118 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1119 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1120 | |
JerrySzczurak | 20:cf211a3b3d9e | 1121 | VL53L0X_Error VL53L0X::vl53l0x_get_vcsel_pulse_period( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1122 | VL53L0X_VcselPeriod vcsel_period_type, uint8_t *p_vcsel_pulse_period_pclk ) |
johnAlexander | 0:c523920bcc09 | 1123 | { |
johnAlexander | 16:98ce55ddbb1a | 1124 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 1125 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1126 | |
JerrySzczurak | 20:cf211a3b3d9e | 1127 | status = wrapped_vl53l0x_get_vcsel_pulse_period( dev, vcsel_period_type, |
JerrySzczurak | 20:cf211a3b3d9e | 1128 | p_vcsel_pulse_period_pclk ); |
JerrySzczurak | 20:cf211a3b3d9e | 1129 | |
JerrySzczurak | 20:cf211a3b3d9e | 1130 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1131 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1132 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1133 | |
JerrySzczurak | 20:cf211a3b3d9e | 1134 | uint32_t VL53L0X::vl53l0x_decode_timeout( uint16_t encoded_timeout ) |
johnAlexander | 0:c523920bcc09 | 1135 | { |
johnAlexander | 15:932d8b4e52c9 | 1136 | /*! |
johnAlexander | 15:932d8b4e52c9 | 1137 | * Decode 16-bit timeout register value - format (LSByte * 2^MSByte) + 1 |
johnAlexander | 15:932d8b4e52c9 | 1138 | */ |
johnAlexander | 15:932d8b4e52c9 | 1139 | |
johnAlexander | 15:932d8b4e52c9 | 1140 | uint32_t timeout_macro_clks = 0; |
johnAlexander | 15:932d8b4e52c9 | 1141 | |
JerrySzczurak | 20:cf211a3b3d9e | 1142 | timeout_macro_clks = ( ( uint32_t ) ( encoded_timeout & 0x00FF ) |
JerrySzczurak | 20:cf211a3b3d9e | 1143 | << ( uint32_t ) ( ( encoded_timeout & 0xFF00 ) >> 8 ) ) + 1; |
johnAlexander | 15:932d8b4e52c9 | 1144 | |
johnAlexander | 15:932d8b4e52c9 | 1145 | return timeout_macro_clks; |
johnAlexander | 0:c523920bcc09 | 1146 | } |
johnAlexander | 0:c523920bcc09 | 1147 | |
JerrySzczurak | 20:cf211a3b3d9e | 1148 | uint32_t VL53L0X::vl53l0x_calc_macro_period_ps( VL53L0X_DEV dev, uint8_t vcsel_period_pclks ) |
johnAlexander | 0:c523920bcc09 | 1149 | { |
johnAlexander | 16:98ce55ddbb1a | 1150 | uint64_t pll_period_ps; |
johnAlexander | 15:932d8b4e52c9 | 1151 | uint32_t macro_period_vclks; |
johnAlexander | 15:932d8b4e52c9 | 1152 | uint32_t macro_period_ps; |
johnAlexander | 15:932d8b4e52c9 | 1153 | |
JerrySzczurak | 20:cf211a3b3d9e | 1154 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 1155 | |
johnAlexander | 15:932d8b4e52c9 | 1156 | /* The above calculation will produce rounding errors, |
johnAlexander | 15:932d8b4e52c9 | 1157 | therefore set fixed value |
johnAlexander | 15:932d8b4e52c9 | 1158 | */ |
johnAlexander | 16:98ce55ddbb1a | 1159 | pll_period_ps = 1655; |
johnAlexander | 15:932d8b4e52c9 | 1160 | |
johnAlexander | 15:932d8b4e52c9 | 1161 | macro_period_vclks = 2304; |
JerrySzczurak | 20:cf211a3b3d9e | 1162 | macro_period_ps = ( uint32_t )( macro_period_vclks |
JerrySzczurak | 20:cf211a3b3d9e | 1163 | * vcsel_period_pclks * pll_period_ps ); |
JerrySzczurak | 20:cf211a3b3d9e | 1164 | |
JerrySzczurak | 20:cf211a3b3d9e | 1165 | LOG_FUNCTION_END( "" ); |
johnAlexander | 15:932d8b4e52c9 | 1166 | return macro_period_ps; |
johnAlexander | 0:c523920bcc09 | 1167 | } |
johnAlexander | 0:c523920bcc09 | 1168 | |
johnAlexander | 0:c523920bcc09 | 1169 | /* To convert register value into us */ |
JerrySzczurak | 20:cf211a3b3d9e | 1170 | uint32_t VL53L0X::vl53l0x_calc_timeout_us( VL53L0X_DEV dev, |
johnAlexander | 15:932d8b4e52c9 | 1171 | uint16_t timeout_period_mclks, |
JerrySzczurak | 20:cf211a3b3d9e | 1172 | uint8_t vcsel_period_pclks ) |
johnAlexander | 0:c523920bcc09 | 1173 | { |
johnAlexander | 15:932d8b4e52c9 | 1174 | uint32_t macro_period_ps; |
johnAlexander | 15:932d8b4e52c9 | 1175 | uint32_t macro_period_ns; |
johnAlexander | 15:932d8b4e52c9 | 1176 | uint32_t actual_timeout_period_us = 0; |
johnAlexander | 15:932d8b4e52c9 | 1177 | |
JerrySzczurak | 20:cf211a3b3d9e | 1178 | macro_period_ps = vl53l0x_calc_macro_period_ps( dev, vcsel_period_pclks ); |
JerrySzczurak | 20:cf211a3b3d9e | 1179 | macro_period_ns = ( macro_period_ps + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 1180 | |
johnAlexander | 15:932d8b4e52c9 | 1181 | actual_timeout_period_us = |
JerrySzczurak | 20:cf211a3b3d9e | 1182 | ( ( timeout_period_mclks * macro_period_ns ) + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 1183 | |
johnAlexander | 15:932d8b4e52c9 | 1184 | return actual_timeout_period_us; |
johnAlexander | 0:c523920bcc09 | 1185 | } |
johnAlexander | 0:c523920bcc09 | 1186 | |
JerrySzczurak | 20:cf211a3b3d9e | 1187 | VL53L0X_Error VL53L0X::get_sequence_step_timeout( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 1188 | VL53L0X_SequenceStepId sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 1189 | uint32_t *p_time_out_micro_secs ) |
johnAlexander | 0:c523920bcc09 | 1190 | { |
johnAlexander | 16:98ce55ddbb1a | 1191 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1192 | uint8_t current_vcsel_pulse_period_p_clk; |
johnAlexander | 16:98ce55ddbb1a | 1193 | uint8_t encoded_time_out_byte = 0; |
johnAlexander | 16:98ce55ddbb1a | 1194 | uint32_t timeout_micro_seconds = 0; |
johnAlexander | 16:98ce55ddbb1a | 1195 | uint16_t pre_range_encoded_time_out = 0; |
johnAlexander | 16:98ce55ddbb1a | 1196 | uint16_t msrc_time_out_m_clks; |
johnAlexander | 16:98ce55ddbb1a | 1197 | uint16_t pre_range_time_out_m_clks; |
johnAlexander | 16:98ce55ddbb1a | 1198 | uint16_t final_range_time_out_m_clks = 0; |
johnAlexander | 16:98ce55ddbb1a | 1199 | uint16_t final_range_encoded_time_out; |
johnAlexander | 16:98ce55ddbb1a | 1200 | VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps; |
johnAlexander | 16:98ce55ddbb1a | 1201 | |
JerrySzczurak | 20:cf211a3b3d9e | 1202 | if ( ( sequence_step_id == VL53L0X_SEQUENCESTEP_TCC ) || |
JerrySzczurak | 20:cf211a3b3d9e | 1203 | ( sequence_step_id == VL53L0X_SEQUENCESTEP_DSS ) || |
JerrySzczurak | 20:cf211a3b3d9e | 1204 | ( sequence_step_id == VL53L0X_SEQUENCESTEP_MSRC ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1205 | |
JerrySzczurak | 20:cf211a3b3d9e | 1206 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1207 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1208 | ¤t_vcsel_pulse_period_p_clk ); |
JerrySzczurak | 20:cf211a3b3d9e | 1209 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1210 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1211 | VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, |
JerrySzczurak | 20:cf211a3b3d9e | 1212 | &encoded_time_out_byte ); |
johnAlexander | 15:932d8b4e52c9 | 1213 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1214 | msrc_time_out_m_clks = vl53l0x_decode_timeout( encoded_time_out_byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 1215 | |
JerrySzczurak | 20:cf211a3b3d9e | 1216 | timeout_micro_seconds = vl53l0x_calc_timeout_us( dev, |
johnAlexander | 16:98ce55ddbb1a | 1217 | msrc_time_out_m_clks, |
JerrySzczurak | 20:cf211a3b3d9e | 1218 | current_vcsel_pulse_period_p_clk ); |
JerrySzczurak | 20:cf211a3b3d9e | 1219 | } else if ( sequence_step_id == VL53L0X_SEQUENCESTEP_PRE_RANGE ) { |
johnAlexander | 15:932d8b4e52c9 | 1220 | /* Retrieve PRE-RANGE VCSEL Period */ |
JerrySzczurak | 20:cf211a3b3d9e | 1221 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1222 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1223 | ¤t_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 1224 | |
johnAlexander | 15:932d8b4e52c9 | 1225 | /* Retrieve PRE-RANGE Timeout in Macro periods (MCLKS) */ |
JerrySzczurak | 20:cf211a3b3d9e | 1226 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 1227 | |
johnAlexander | 15:932d8b4e52c9 | 1228 | /* Retrieve PRE-RANGE VCSEL Period */ |
JerrySzczurak | 20:cf211a3b3d9e | 1229 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1230 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1231 | ¤t_vcsel_pulse_period_p_clk ); |
JerrySzczurak | 20:cf211a3b3d9e | 1232 | |
JerrySzczurak | 20:cf211a3b3d9e | 1233 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1234 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1235 | VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, |
JerrySzczurak | 20:cf211a3b3d9e | 1236 | &pre_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 1237 | } |
johnAlexander | 15:932d8b4e52c9 | 1238 | |
johnAlexander | 16:98ce55ddbb1a | 1239 | pre_range_time_out_m_clks = vl53l0x_decode_timeout( |
JerrySzczurak | 20:cf211a3b3d9e | 1240 | pre_range_encoded_time_out ); |
JerrySzczurak | 20:cf211a3b3d9e | 1241 | |
JerrySzczurak | 20:cf211a3b3d9e | 1242 | timeout_micro_seconds = vl53l0x_calc_timeout_us( dev, |
johnAlexander | 16:98ce55ddbb1a | 1243 | pre_range_time_out_m_clks, |
JerrySzczurak | 20:cf211a3b3d9e | 1244 | current_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 1245 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1246 | } else if ( sequence_step_id == VL53L0X_SEQUENCESTEP_FINAL_RANGE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1247 | |
JerrySzczurak | 20:cf211a3b3d9e | 1248 | vl53l0x_get_sequence_step_enables( dev, &scheduler_sequence_steps ); |
johnAlexander | 16:98ce55ddbb1a | 1249 | pre_range_time_out_m_clks = 0; |
johnAlexander | 16:98ce55ddbb1a | 1250 | |
JerrySzczurak | 20:cf211a3b3d9e | 1251 | if ( scheduler_sequence_steps.PreRangeOn ) { |
johnAlexander | 15:932d8b4e52c9 | 1252 | /* Retrieve PRE-RANGE VCSEL Period */ |
JerrySzczurak | 20:cf211a3b3d9e | 1253 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1254 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1255 | ¤t_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 1256 | |
johnAlexander | 15:932d8b4e52c9 | 1257 | /* Retrieve PRE-RANGE Timeout in Macro periods |
johnAlexander | 15:932d8b4e52c9 | 1258 | * (MCLKS) */ |
JerrySzczurak | 20:cf211a3b3d9e | 1259 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1260 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1261 | VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, |
JerrySzczurak | 20:cf211a3b3d9e | 1262 | &pre_range_encoded_time_out ); |
johnAlexander | 16:98ce55ddbb1a | 1263 | pre_range_time_out_m_clks = vl53l0x_decode_timeout( |
JerrySzczurak | 20:cf211a3b3d9e | 1264 | pre_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 1265 | } |
johnAlexander | 15:932d8b4e52c9 | 1266 | } |
johnAlexander | 15:932d8b4e52c9 | 1267 | |
JerrySzczurak | 20:cf211a3b3d9e | 1268 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 1269 | /* Retrieve FINAL-RANGE VCSEL Period */ |
JerrySzczurak | 20:cf211a3b3d9e | 1270 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1271 | VL53L0X_VCSEL_PERIOD_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1272 | ¤t_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 1273 | } |
johnAlexander | 15:932d8b4e52c9 | 1274 | |
johnAlexander | 15:932d8b4e52c9 | 1275 | /* Retrieve FINAL-RANGE Timeout in Macro periods (MCLKS) */ |
JerrySzczurak | 20:cf211a3b3d9e | 1276 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1277 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1278 | VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, |
JerrySzczurak | 20:cf211a3b3d9e | 1279 | &final_range_encoded_time_out ); |
johnAlexander | 16:98ce55ddbb1a | 1280 | final_range_time_out_m_clks = vl53l0x_decode_timeout( |
JerrySzczurak | 20:cf211a3b3d9e | 1281 | final_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 1282 | } |
johnAlexander | 15:932d8b4e52c9 | 1283 | |
johnAlexander | 16:98ce55ddbb1a | 1284 | final_range_time_out_m_clks -= pre_range_time_out_m_clks; |
JerrySzczurak | 20:cf211a3b3d9e | 1285 | timeout_micro_seconds = vl53l0x_calc_timeout_us( dev, |
johnAlexander | 16:98ce55ddbb1a | 1286 | final_range_time_out_m_clks, |
JerrySzczurak | 20:cf211a3b3d9e | 1287 | current_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 1288 | } |
johnAlexander | 15:932d8b4e52c9 | 1289 | |
johnAlexander | 16:98ce55ddbb1a | 1290 | *p_time_out_micro_secs = timeout_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 1291 | |
johnAlexander | 16:98ce55ddbb1a | 1292 | return status; |
johnAlexander | 0:c523920bcc09 | 1293 | } |
johnAlexander | 0:c523920bcc09 | 1294 | |
JerrySzczurak | 20:cf211a3b3d9e | 1295 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_measurement_timing_budget_micro_seconds( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1296 | uint32_t *p_measurement_timing_budget_micro_seconds ) |
johnAlexander | 0:c523920bcc09 | 1297 | { |
johnAlexander | 16:98ce55ddbb1a | 1298 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1299 | VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps; |
johnAlexander | 16:98ce55ddbb1a | 1300 | uint32_t final_range_timeout_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 1301 | uint32_t msrc_dcc_tcc_timeout_micro_seconds = 2000; |
johnAlexander | 16:98ce55ddbb1a | 1302 | uint32_t start_overhead_micro_seconds = 1910; |
johnAlexander | 16:98ce55ddbb1a | 1303 | uint32_t end_overhead_micro_seconds = 960; |
johnAlexander | 16:98ce55ddbb1a | 1304 | uint32_t msrc_overhead_micro_seconds = 660; |
johnAlexander | 16:98ce55ddbb1a | 1305 | uint32_t tcc_overhead_micro_seconds = 590; |
johnAlexander | 16:98ce55ddbb1a | 1306 | uint32_t dss_overhead_micro_seconds = 690; |
johnAlexander | 16:98ce55ddbb1a | 1307 | uint32_t pre_range_overhead_micro_seconds = 660; |
johnAlexander | 16:98ce55ddbb1a | 1308 | uint32_t final_range_overhead_micro_seconds = 550; |
johnAlexander | 16:98ce55ddbb1a | 1309 | uint32_t pre_range_timeout_micro_seconds = 0; |
johnAlexander | 15:932d8b4e52c9 | 1310 | |
JerrySzczurak | 20:cf211a3b3d9e | 1311 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 1312 | |
johnAlexander | 15:932d8b4e52c9 | 1313 | /* Start and end overhead times always present */ |
johnAlexander | 16:98ce55ddbb1a | 1314 | *p_measurement_timing_budget_micro_seconds |
johnAlexander | 16:98ce55ddbb1a | 1315 | = start_overhead_micro_seconds + end_overhead_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 1316 | |
JerrySzczurak | 20:cf211a3b3d9e | 1317 | status = vl53l0x_get_sequence_step_enables( dev, &scheduler_sequence_steps ); |
JerrySzczurak | 20:cf211a3b3d9e | 1318 | |
JerrySzczurak | 20:cf211a3b3d9e | 1319 | if ( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1320 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 1321 | return status; |
johnAlexander | 15:932d8b4e52c9 | 1322 | } |
johnAlexander | 15:932d8b4e52c9 | 1323 | |
johnAlexander | 15:932d8b4e52c9 | 1324 | |
JerrySzczurak | 20:cf211a3b3d9e | 1325 | if ( scheduler_sequence_steps.TccOn || |
johnAlexander | 16:98ce55ddbb1a | 1326 | scheduler_sequence_steps.MsrcOn || |
JerrySzczurak | 20:cf211a3b3d9e | 1327 | scheduler_sequence_steps.DssOn ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1328 | |
JerrySzczurak | 20:cf211a3b3d9e | 1329 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1330 | VL53L0X_SEQUENCESTEP_MSRC, |
JerrySzczurak | 20:cf211a3b3d9e | 1331 | &msrc_dcc_tcc_timeout_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1332 | |
JerrySzczurak | 20:cf211a3b3d9e | 1333 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1334 | if ( scheduler_sequence_steps.TccOn ) { |
johnAlexander | 16:98ce55ddbb1a | 1335 | *p_measurement_timing_budget_micro_seconds += |
johnAlexander | 16:98ce55ddbb1a | 1336 | msrc_dcc_tcc_timeout_micro_seconds + |
johnAlexander | 16:98ce55ddbb1a | 1337 | tcc_overhead_micro_seconds; |
johnAlexander | 15:932d8b4e52c9 | 1338 | } |
johnAlexander | 15:932d8b4e52c9 | 1339 | |
JerrySzczurak | 20:cf211a3b3d9e | 1340 | if ( scheduler_sequence_steps.DssOn ) { |
johnAlexander | 16:98ce55ddbb1a | 1341 | *p_measurement_timing_budget_micro_seconds += |
JerrySzczurak | 20:cf211a3b3d9e | 1342 | 2 * ( msrc_dcc_tcc_timeout_micro_seconds + |
JerrySzczurak | 20:cf211a3b3d9e | 1343 | dss_overhead_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1344 | } else if ( scheduler_sequence_steps.MsrcOn ) { |
johnAlexander | 16:98ce55ddbb1a | 1345 | *p_measurement_timing_budget_micro_seconds += |
johnAlexander | 16:98ce55ddbb1a | 1346 | msrc_dcc_tcc_timeout_micro_seconds + |
johnAlexander | 16:98ce55ddbb1a | 1347 | msrc_overhead_micro_seconds; |
johnAlexander | 15:932d8b4e52c9 | 1348 | } |
johnAlexander | 15:932d8b4e52c9 | 1349 | } |
johnAlexander | 15:932d8b4e52c9 | 1350 | } |
johnAlexander | 15:932d8b4e52c9 | 1351 | |
JerrySzczurak | 20:cf211a3b3d9e | 1352 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1353 | if ( scheduler_sequence_steps.PreRangeOn ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1354 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1355 | VL53L0X_SEQUENCESTEP_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1356 | &pre_range_timeout_micro_seconds ); |
johnAlexander | 16:98ce55ddbb1a | 1357 | *p_measurement_timing_budget_micro_seconds += |
johnAlexander | 16:98ce55ddbb1a | 1358 | pre_range_timeout_micro_seconds + |
johnAlexander | 16:98ce55ddbb1a | 1359 | pre_range_overhead_micro_seconds; |
johnAlexander | 15:932d8b4e52c9 | 1360 | } |
johnAlexander | 15:932d8b4e52c9 | 1361 | } |
johnAlexander | 15:932d8b4e52c9 | 1362 | |
JerrySzczurak | 20:cf211a3b3d9e | 1363 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1364 | if ( scheduler_sequence_steps.FinalRangeOn ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1365 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1366 | VL53L0X_SEQUENCESTEP_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1367 | &final_range_timeout_micro_seconds ); |
johnAlexander | 16:98ce55ddbb1a | 1368 | *p_measurement_timing_budget_micro_seconds += |
JerrySzczurak | 20:cf211a3b3d9e | 1369 | ( final_range_timeout_micro_seconds + |
JerrySzczurak | 20:cf211a3b3d9e | 1370 | final_range_overhead_micro_seconds ); |
johnAlexander | 15:932d8b4e52c9 | 1371 | } |
johnAlexander | 15:932d8b4e52c9 | 1372 | } |
johnAlexander | 15:932d8b4e52c9 | 1373 | |
JerrySzczurak | 20:cf211a3b3d9e | 1374 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1375 | VL53L0X_SETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1376 | MeasurementTimingBudgetMicroSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 1377 | *p_measurement_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1378 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1379 | |
JerrySzczurak | 20:cf211a3b3d9e | 1380 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1381 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1382 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1383 | |
JerrySzczurak | 20:cf211a3b3d9e | 1384 | VL53L0X_Error VL53L0X::vl53l0x_get_measurement_timing_budget_micro_seconds( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1385 | uint32_t *p_measurement_timing_budget_micro_seconds ) |
johnAlexander | 0:c523920bcc09 | 1386 | { |
johnAlexander | 16:98ce55ddbb1a | 1387 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 1388 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1389 | |
JerrySzczurak | 20:cf211a3b3d9e | 1390 | status = wrapped_vl53l0x_get_measurement_timing_budget_micro_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1391 | p_measurement_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 1392 | |
JerrySzczurak | 20:cf211a3b3d9e | 1393 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1394 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1395 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1396 | |
JerrySzczurak | 20:cf211a3b3d9e | 1397 | VL53L0X_Error VL53L0X::vl53l0x_get_device_parameters( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1398 | VL53L0X_DeviceParameters_t *p_device_parameters ) |
johnAlexander | 0:c523920bcc09 | 1399 | { |
johnAlexander | 16:98ce55ddbb1a | 1400 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 1401 | int i; |
johnAlexander | 15:932d8b4e52c9 | 1402 | |
JerrySzczurak | 20:cf211a3b3d9e | 1403 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1404 | |
JerrySzczurak | 20:cf211a3b3d9e | 1405 | status = vl53l0x_get_device_mode( dev, &( p_device_parameters->DeviceMode ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1406 | |
JerrySzczurak | 20:cf211a3b3d9e | 1407 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1408 | status = vl53l0x_get_inter_measurement_period_milli_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1409 | &( p_device_parameters->InterMeasurementPeriodMilliSeconds ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1410 | |
JerrySzczurak | 20:cf211a3b3d9e | 1411 | |
JerrySzczurak | 20:cf211a3b3d9e | 1412 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 17:1b842521063a | 1413 | p_device_parameters->XTalkCompensationEnable = 0; |
johnAlexander | 15:932d8b4e52c9 | 1414 | |
JerrySzczurak | 20:cf211a3b3d9e | 1415 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1416 | status = vl53l0x_get_x_talk_compensation_rate_mega_cps( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1417 | &( p_device_parameters->XTalkCompensationRateMegaCps ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1418 | |
JerrySzczurak | 20:cf211a3b3d9e | 1419 | |
JerrySzczurak | 20:cf211a3b3d9e | 1420 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1421 | status = vl53l0x_get_offset_calibration_data_micro_meter( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1422 | &( p_device_parameters->RangeOffsetMicroMeters ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1423 | |
JerrySzczurak | 20:cf211a3b3d9e | 1424 | |
JerrySzczurak | 20:cf211a3b3d9e | 1425 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1426 | for ( i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++ ) { |
johnAlexander | 15:932d8b4e52c9 | 1427 | /* get first the values, then the enables. |
johnAlexander | 15:932d8b4e52c9 | 1428 | * VL53L0X_GetLimitCheckValue will modify the enable |
johnAlexander | 15:932d8b4e52c9 | 1429 | * flags |
johnAlexander | 15:932d8b4e52c9 | 1430 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 1431 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1432 | status |= vl53l0x_get_limit_check_value( dev, i, |
JerrySzczurak | 20:cf211a3b3d9e | 1433 | &( p_device_parameters->LimitChecksValue[i] ) ); |
johnAlexander | 15:932d8b4e52c9 | 1434 | } else { |
johnAlexander | 15:932d8b4e52c9 | 1435 | break; |
johnAlexander | 15:932d8b4e52c9 | 1436 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1437 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1438 | status |= vl53l0x_get_limit_check_enable( dev, i, |
JerrySzczurak | 20:cf211a3b3d9e | 1439 | &( p_device_parameters->LimitChecksEnable[i] ) ); |
johnAlexander | 15:932d8b4e52c9 | 1440 | } else { |
johnAlexander | 15:932d8b4e52c9 | 1441 | break; |
johnAlexander | 15:932d8b4e52c9 | 1442 | } |
johnAlexander | 15:932d8b4e52c9 | 1443 | } |
johnAlexander | 15:932d8b4e52c9 | 1444 | } |
johnAlexander | 15:932d8b4e52c9 | 1445 | |
JerrySzczurak | 20:cf211a3b3d9e | 1446 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1447 | status = vl53l0x_get_wrap_around_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1448 | &( p_device_parameters->WrapAroundCheckEnable ) ); |
johnAlexander | 15:932d8b4e52c9 | 1449 | } |
johnAlexander | 15:932d8b4e52c9 | 1450 | |
johnAlexander | 15:932d8b4e52c9 | 1451 | /* Need to be done at the end as it uses VCSELPulsePeriod */ |
JerrySzczurak | 20:cf211a3b3d9e | 1452 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1453 | status = vl53l0x_get_measurement_timing_budget_micro_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1454 | &( p_device_parameters->MeasurementTimingBudgetMicroSeconds ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1455 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1456 | |
JerrySzczurak | 20:cf211a3b3d9e | 1457 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1458 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1459 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1460 | |
JerrySzczurak | 20:cf211a3b3d9e | 1461 | VL53L0X_Error VL53L0X::vl53l0x_set_limit_check_value( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 1462 | FixPoint1616_t limit_check_value ) |
johnAlexander | 0:c523920bcc09 | 1463 | { |
johnAlexander | 16:98ce55ddbb1a | 1464 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1465 | uint8_t temp8; |
johnAlexander | 15:932d8b4e52c9 | 1466 | |
JerrySzczurak | 20:cf211a3b3d9e | 1467 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1468 | |
JerrySzczurak | 20:cf211a3b3d9e | 1469 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksEnable, limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 1470 | temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1471 | |
JerrySzczurak | 20:cf211a3b3d9e | 1472 | if ( temp8 == 0 ) { /* disabled write only internal value */ |
JerrySzczurak | 20:cf211a3b3d9e | 1473 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 1474 | limit_check_id, limit_check_value ); |
johnAlexander | 15:932d8b4e52c9 | 1475 | } else { |
johnAlexander | 15:932d8b4e52c9 | 1476 | |
JerrySzczurak | 20:cf211a3b3d9e | 1477 | switch ( limit_check_id ) { |
johnAlexander | 15:932d8b4e52c9 | 1478 | |
johnAlexander | 15:932d8b4e52c9 | 1479 | case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 1480 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 1481 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 1482 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1483 | limit_check_value ); |
johnAlexander | 15:932d8b4e52c9 | 1484 | break; |
johnAlexander | 15:932d8b4e52c9 | 1485 | |
johnAlexander | 15:932d8b4e52c9 | 1486 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 1487 | |
JerrySzczurak | 20:cf211a3b3d9e | 1488 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1489 | VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, |
JerrySzczurak | 20:cf211a3b3d9e | 1490 | VL53L0X_FIXPOINT1616TOFIXPOINT97( |
JerrySzczurak | 20:cf211a3b3d9e | 1491 | limit_check_value ) ); |
johnAlexander | 15:932d8b4e52c9 | 1492 | |
johnAlexander | 15:932d8b4e52c9 | 1493 | break; |
johnAlexander | 15:932d8b4e52c9 | 1494 | |
johnAlexander | 15:932d8b4e52c9 | 1495 | case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: |
johnAlexander | 15:932d8b4e52c9 | 1496 | |
johnAlexander | 15:932d8b4e52c9 | 1497 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 1498 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 1499 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, |
JerrySzczurak | 20:cf211a3b3d9e | 1500 | limit_check_value ); |
johnAlexander | 15:932d8b4e52c9 | 1501 | |
johnAlexander | 15:932d8b4e52c9 | 1502 | break; |
johnAlexander | 15:932d8b4e52c9 | 1503 | |
johnAlexander | 15:932d8b4e52c9 | 1504 | case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: |
johnAlexander | 15:932d8b4e52c9 | 1505 | |
johnAlexander | 15:932d8b4e52c9 | 1506 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 1507 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 1508 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, |
JerrySzczurak | 20:cf211a3b3d9e | 1509 | limit_check_value ); |
johnAlexander | 15:932d8b4e52c9 | 1510 | |
johnAlexander | 15:932d8b4e52c9 | 1511 | break; |
johnAlexander | 15:932d8b4e52c9 | 1512 | |
johnAlexander | 15:932d8b4e52c9 | 1513 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: |
johnAlexander | 15:932d8b4e52c9 | 1514 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 1515 | |
JerrySzczurak | 20:cf211a3b3d9e | 1516 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1517 | VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, |
JerrySzczurak | 20:cf211a3b3d9e | 1518 | VL53L0X_FIXPOINT1616TOFIXPOINT97( |
JerrySzczurak | 20:cf211a3b3d9e | 1519 | limit_check_value ) ); |
johnAlexander | 15:932d8b4e52c9 | 1520 | |
johnAlexander | 15:932d8b4e52c9 | 1521 | break; |
johnAlexander | 15:932d8b4e52c9 | 1522 | |
johnAlexander | 15:932d8b4e52c9 | 1523 | default: |
johnAlexander | 16:98ce55ddbb1a | 1524 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 1525 | |
johnAlexander | 15:932d8b4e52c9 | 1526 | } |
johnAlexander | 15:932d8b4e52c9 | 1527 | |
JerrySzczurak | 20:cf211a3b3d9e | 1528 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1529 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 1530 | limit_check_id, limit_check_value ); |
johnAlexander | 15:932d8b4e52c9 | 1531 | } |
johnAlexander | 15:932d8b4e52c9 | 1532 | } |
johnAlexander | 15:932d8b4e52c9 | 1533 | |
JerrySzczurak | 20:cf211a3b3d9e | 1534 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1535 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1536 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1537 | |
JerrySzczurak | 20:cf211a3b3d9e | 1538 | VL53L0X_Error VL53L0X::vl53l0x_data_init( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 1539 | { |
johnAlexander | 16:98ce55ddbb1a | 1540 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 1541 | VL53L0X_DeviceParameters_t CurrentParameters; |
johnAlexander | 15:932d8b4e52c9 | 1542 | int i; |
johnAlexander | 15:932d8b4e52c9 | 1543 | uint8_t StopVariable; |
johnAlexander | 15:932d8b4e52c9 | 1544 | |
JerrySzczurak | 20:cf211a3b3d9e | 1545 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 1546 | |
johnAlexander | 15:932d8b4e52c9 | 1547 | /* by default the I2C is running at 1V8 if you want to change it you |
johnAlexander | 15:932d8b4e52c9 | 1548 | * need to include this define at compilation level. */ |
johnAlexander | 0:c523920bcc09 | 1549 | #ifdef USE_I2C_2V8 |
JerrySzczurak | 21:627b65069e6d | 1550 | Status = vl53l0x_update_word( Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1551 | VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, |
JerrySzczurak | 20:cf211a3b3d9e | 1552 | 0xFE, |
JerrySzczurak | 20:cf211a3b3d9e | 1553 | 0x01 ); |
johnAlexander | 0:c523920bcc09 | 1554 | #endif |
johnAlexander | 0:c523920bcc09 | 1555 | |
johnAlexander | 15:932d8b4e52c9 | 1556 | /* Set I2C standard mode */ |
JerrySzczurak | 20:cf211a3b3d9e | 1557 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1558 | status = vl53l0x_write_byte( dev, 0x88, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1559 | |
JerrySzczurak | 20:cf211a3b3d9e | 1560 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, ReadDataFromDeviceDone, 0 ); |
johnAlexander | 0:c523920bcc09 | 1561 | |
johnAlexander | 0:c523920bcc09 | 1562 | #ifdef USE_IQC_STATION |
JerrySzczurak | 20:cf211a3b3d9e | 1563 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1564 | Status = VL53L0X_apply_offset_adjustment( Dev ); |
johnAlexander | 0:c523920bcc09 | 1565 | #endif |
johnAlexander | 0:c523920bcc09 | 1566 | |
johnAlexander | 15:932d8b4e52c9 | 1567 | /* Default value is 1000 for Linearity Corrective Gain */ |
JerrySzczurak | 20:cf211a3b3d9e | 1568 | PALDevDataSet( dev, LinearityCorrectiveGain, 1000 ); |
johnAlexander | 15:932d8b4e52c9 | 1569 | |
johnAlexander | 15:932d8b4e52c9 | 1570 | /* Dmax default Parameter */ |
JerrySzczurak | 20:cf211a3b3d9e | 1571 | PALDevDataSet( dev, DmaxCalRangeMilliMeter, 400 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1572 | PALDevDataSet( dev, DmaxCalSignalRateRtnMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 1573 | ( FixPoint1616_t )( ( 0x00016B85 ) ) ); /* 1.42 No Cover Glass*/ |
johnAlexander | 15:932d8b4e52c9 | 1574 | |
johnAlexander | 15:932d8b4e52c9 | 1575 | /* Set Default static parameters |
johnAlexander | 15:932d8b4e52c9 | 1576 | *set first temporary values 9.44MHz * 65536 = 618660 */ |
JerrySzczurak | 20:cf211a3b3d9e | 1577 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, OscFrequencyMHz, 618660 ); |
johnAlexander | 15:932d8b4e52c9 | 1578 | |
johnAlexander | 15:932d8b4e52c9 | 1579 | /* Set Default XTalkCompensationRateMegaCps to 0 */ |
JerrySzczurak | 20:cf211a3b3d9e | 1580 | VL53L0X_SETPARAMETERFIELD( dev, XTalkCompensationRateMegaCps, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 1581 | |
johnAlexander | 15:932d8b4e52c9 | 1582 | /* Get default parameters */ |
JerrySzczurak | 20:cf211a3b3d9e | 1583 | status = vl53l0x_get_device_parameters( dev, &CurrentParameters ); |
JerrySzczurak | 20:cf211a3b3d9e | 1584 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 1585 | /* initialize PAL values */ |
johnAlexander | 15:932d8b4e52c9 | 1586 | CurrentParameters.DeviceMode = VL53L0X_DEVICEMODE_SINGLE_RANGING; |
johnAlexander | 15:932d8b4e52c9 | 1587 | CurrentParameters.HistogramMode = VL53L0X_HISTOGRAMMODE_DISABLED; |
JerrySzczurak | 20:cf211a3b3d9e | 1588 | PALDevDataSet( dev, CurrentParameters, CurrentParameters ); |
johnAlexander | 15:932d8b4e52c9 | 1589 | } |
johnAlexander | 15:932d8b4e52c9 | 1590 | |
johnAlexander | 15:932d8b4e52c9 | 1591 | /* Sigma estimator variable */ |
JerrySzczurak | 20:cf211a3b3d9e | 1592 | PALDevDataSet( dev, SigmaEstRefArray, 100 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1593 | PALDevDataSet( dev, SigmaEstEffPulseWidth, 900 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1594 | PALDevDataSet( dev, SigmaEstEffAmbWidth, 500 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1595 | PALDevDataSet( dev, targetRefRate, 0x0A00 ); /* 20 MCPS in 9:7 format */ |
johnAlexander | 15:932d8b4e52c9 | 1596 | |
johnAlexander | 15:932d8b4e52c9 | 1597 | /* Use internal default settings */ |
JerrySzczurak | 20:cf211a3b3d9e | 1598 | PALDevDataSet( dev, UseInternalTuningSettings, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1599 | |
JerrySzczurak | 20:cf211a3b3d9e | 1600 | status |= vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1601 | status |= vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1602 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1603 | status |= vl53l0x_read_byte( dev, 0x91, &StopVariable ); |
JerrySzczurak | 20:cf211a3b3d9e | 1604 | PALDevDataSet( dev, StopVariable, StopVariable ); |
JerrySzczurak | 20:cf211a3b3d9e | 1605 | status |= vl53l0x_write_byte( dev, 0x00, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1606 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1607 | status |= vl53l0x_write_byte( dev, 0x80, 0x00 ); |
johnAlexander | 15:932d8b4e52c9 | 1608 | |
johnAlexander | 15:932d8b4e52c9 | 1609 | /* Enable all check */ |
JerrySzczurak | 20:cf211a3b3d9e | 1610 | for ( i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1611 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1612 | status |= vl53l0x_set_limit_check_enable( dev, i, 1 ); |
johnAlexander | 15:932d8b4e52c9 | 1613 | else |
johnAlexander | 15:932d8b4e52c9 | 1614 | break; |
johnAlexander | 15:932d8b4e52c9 | 1615 | |
johnAlexander | 15:932d8b4e52c9 | 1616 | } |
johnAlexander | 15:932d8b4e52c9 | 1617 | |
johnAlexander | 15:932d8b4e52c9 | 1618 | /* Disable the following checks */ |
JerrySzczurak | 20:cf211a3b3d9e | 1619 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1620 | status = vl53l0x_set_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1621 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1622 | |
JerrySzczurak | 20:cf211a3b3d9e | 1623 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1624 | status = vl53l0x_set_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1625 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1626 | |
JerrySzczurak | 20:cf211a3b3d9e | 1627 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1628 | status = vl53l0x_set_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1629 | VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1630 | |
JerrySzczurak | 20:cf211a3b3d9e | 1631 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1632 | status = vl53l0x_set_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1633 | VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 1634 | |
johnAlexander | 15:932d8b4e52c9 | 1635 | /* Limit default values */ |
JerrySzczurak | 20:cf211a3b3d9e | 1636 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1637 | status = vl53l0x_set_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1638 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1639 | ( FixPoint1616_t )( 18 * 65536 ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1640 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1641 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1642 | status = vl53l0x_set_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1643 | VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 1644 | ( FixPoint1616_t )( 25 * 65536 / 100 ) ); |
johnAlexander | 15:932d8b4e52c9 | 1645 | /* 0.25 * 65536 */ |
johnAlexander | 15:932d8b4e52c9 | 1646 | } |
johnAlexander | 15:932d8b4e52c9 | 1647 | |
JerrySzczurak | 20:cf211a3b3d9e | 1648 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1649 | status = vl53l0x_set_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1650 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, |
JerrySzczurak | 20:cf211a3b3d9e | 1651 | ( FixPoint1616_t )( 35 * 65536 ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1652 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1653 | |
JerrySzczurak | 20:cf211a3b3d9e | 1654 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1655 | status = vl53l0x_set_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1656 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, |
JerrySzczurak | 20:cf211a3b3d9e | 1657 | ( FixPoint1616_t )( 0 * 65536 ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1658 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1659 | |
JerrySzczurak | 20:cf211a3b3d9e | 1660 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1661 | |
JerrySzczurak | 20:cf211a3b3d9e | 1662 | PALDevDataSet( dev, SequenceConfig, 0xFF ); |
JerrySzczurak | 20:cf211a3b3d9e | 1663 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 1664 | 0xFF ); |
johnAlexander | 15:932d8b4e52c9 | 1665 | |
johnAlexander | 15:932d8b4e52c9 | 1666 | /* Set PAL state to tell that we are waiting for call to |
johnAlexander | 15:932d8b4e52c9 | 1667 | * VL53L0X_StaticInit */ |
JerrySzczurak | 20:cf211a3b3d9e | 1668 | PALDevDataSet( dev, PalState, VL53L0X_STATE_WAIT_STATICINIT ); |
JerrySzczurak | 20:cf211a3b3d9e | 1669 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1670 | |
JerrySzczurak | 20:cf211a3b3d9e | 1671 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1672 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, RefSpadsInitialised, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1673 | |
JerrySzczurak | 20:cf211a3b3d9e | 1674 | |
JerrySzczurak | 20:cf211a3b3d9e | 1675 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1676 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1677 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1678 | |
JerrySzczurak | 20:cf211a3b3d9e | 1679 | VL53L0X_Error VL53L0X::vl53l0x_check_part_used( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 1680 | uint8_t *revision, |
JerrySzczurak | 20:cf211a3b3d9e | 1681 | VL53L0X_DeviceInfo_t *p_vl53l0x_device_info ) |
johnAlexander | 0:c523920bcc09 | 1682 | { |
johnAlexander | 16:98ce55ddbb1a | 1683 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1684 | uint8_t module_id_int; |
johnAlexander | 16:98ce55ddbb1a | 1685 | char *product_id_tmp; |
johnAlexander | 15:932d8b4e52c9 | 1686 | |
JerrySzczurak | 20:cf211a3b3d9e | 1687 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1688 | |
JerrySzczurak | 20:cf211a3b3d9e | 1689 | status = vl53l0x_get_info_from_device( dev, 2 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1690 | |
JerrySzczurak | 20:cf211a3b3d9e | 1691 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1692 | module_id_int = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, ModuleId ); |
JerrySzczurak | 20:cf211a3b3d9e | 1693 | |
JerrySzczurak | 20:cf211a3b3d9e | 1694 | if ( module_id_int == 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 1695 | *revision = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 1696 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->ProductId, "" ); |
johnAlexander | 15:932d8b4e52c9 | 1697 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 1698 | *revision = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, Revision ); |
JerrySzczurak | 20:cf211a3b3d9e | 1699 | product_id_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1700 | ProductId ); |
JerrySzczurak | 20:cf211a3b3d9e | 1701 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->ProductId, product_id_tmp ); |
johnAlexander | 15:932d8b4e52c9 | 1702 | } |
johnAlexander | 15:932d8b4e52c9 | 1703 | } |
johnAlexander | 15:932d8b4e52c9 | 1704 | |
JerrySzczurak | 20:cf211a3b3d9e | 1705 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1706 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1707 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1708 | |
JerrySzczurak | 20:cf211a3b3d9e | 1709 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_device_info( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1710 | VL53L0X_DeviceInfo_t *p_vl53l0x_device_info ) |
johnAlexander | 0:c523920bcc09 | 1711 | { |
johnAlexander | 16:98ce55ddbb1a | 1712 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 1713 | uint8_t revision_id; |
johnAlexander | 16:98ce55ddbb1a | 1714 | uint8_t revision; |
johnAlexander | 16:98ce55ddbb1a | 1715 | |
JerrySzczurak | 20:cf211a3b3d9e | 1716 | status = vl53l0x_check_part_used( dev, &revision, p_vl53l0x_device_info ); |
JerrySzczurak | 20:cf211a3b3d9e | 1717 | |
JerrySzczurak | 20:cf211a3b3d9e | 1718 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1719 | if ( revision == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1720 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->Name, |
JerrySzczurak | 20:cf211a3b3d9e | 1721 | VL53L0X_STRING_DEVICE_INFO_NAME_TS0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1722 | } else if ( ( revision <= 34 ) && ( revision != 32 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1723 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->Name, |
JerrySzczurak | 20:cf211a3b3d9e | 1724 | VL53L0X_STRING_DEVICE_INFO_NAME_TS1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1725 | } else if ( revision < 39 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1726 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->Name, |
JerrySzczurak | 20:cf211a3b3d9e | 1727 | VL53L0X_STRING_DEVICE_INFO_NAME_TS2 ); |
johnAlexander | 15:932d8b4e52c9 | 1728 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 1729 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->Name, |
JerrySzczurak | 20:cf211a3b3d9e | 1730 | VL53L0X_STRING_DEVICE_INFO_NAME_ES1 ); |
johnAlexander | 15:932d8b4e52c9 | 1731 | } |
johnAlexander | 15:932d8b4e52c9 | 1732 | |
JerrySzczurak | 20:cf211a3b3d9e | 1733 | VL53L0X_COPYSTRING( p_vl53l0x_device_info->Type, |
JerrySzczurak | 20:cf211a3b3d9e | 1734 | VL53L0X_STRING_DEVICE_INFO_TYPE ); |
JerrySzczurak | 20:cf211a3b3d9e | 1735 | |
JerrySzczurak | 20:cf211a3b3d9e | 1736 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1737 | |
JerrySzczurak | 20:cf211a3b3d9e | 1738 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1739 | status = vl53l0x_read_byte( dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, |
JerrySzczurak | 20:cf211a3b3d9e | 1740 | &p_vl53l0x_device_info->ProductType ); |
JerrySzczurak | 20:cf211a3b3d9e | 1741 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1742 | |
JerrySzczurak | 20:cf211a3b3d9e | 1743 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1744 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1745 | VL53L0X_REG_IDENTIFICATION_REVISION_ID, |
JerrySzczurak | 20:cf211a3b3d9e | 1746 | &revision_id ); |
johnAlexander | 16:98ce55ddbb1a | 1747 | p_vl53l0x_device_info->ProductRevisionMajor = 1; |
johnAlexander | 16:98ce55ddbb1a | 1748 | p_vl53l0x_device_info->ProductRevisionMinor = |
JerrySzczurak | 20:cf211a3b3d9e | 1749 | ( revision_id & 0xF0 ) >> 4; |
JerrySzczurak | 20:cf211a3b3d9e | 1750 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1751 | |
JerrySzczurak | 20:cf211a3b3d9e | 1752 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1753 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1754 | |
JerrySzczurak | 20:cf211a3b3d9e | 1755 | VL53L0X_Error VL53L0X::vl53l0x_get_device_info( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1756 | VL53L0X_DeviceInfo_t *p_vl53l0x_device_info ) |
johnAlexander | 0:c523920bcc09 | 1757 | { |
johnAlexander | 16:98ce55ddbb1a | 1758 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 1759 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1760 | |
JerrySzczurak | 20:cf211a3b3d9e | 1761 | status = wrapped_vl53l0x_get_device_info( dev, p_vl53l0x_device_info ); |
JerrySzczurak | 20:cf211a3b3d9e | 1762 | |
JerrySzczurak | 20:cf211a3b3d9e | 1763 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1764 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1765 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1766 | |
JerrySzczurak | 20:cf211a3b3d9e | 1767 | VL53L0X_Error VL53L0X::vl53l0x_get_interrupt_mask_status( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1768 | uint32_t *p_interrupt_mask_status ) |
johnAlexander | 0:c523920bcc09 | 1769 | { |
johnAlexander | 16:98ce55ddbb1a | 1770 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1771 | uint8_t byte; |
JerrySzczurak | 20:cf211a3b3d9e | 1772 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1773 | |
JerrySzczurak | 20:cf211a3b3d9e | 1774 | status = vl53l0x_read_byte( dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, &byte ); |
johnAlexander | 17:1b842521063a | 1775 | *p_interrupt_mask_status = byte & 0x07; |
johnAlexander | 16:98ce55ddbb1a | 1776 | |
JerrySzczurak | 20:cf211a3b3d9e | 1777 | if ( byte & 0x18 ) |
johnAlexander | 16:98ce55ddbb1a | 1778 | status = VL53L0X_ERROR_RANGE_ERROR; |
johnAlexander | 16:98ce55ddbb1a | 1779 | |
JerrySzczurak | 20:cf211a3b3d9e | 1780 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1781 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1782 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1783 | |
JerrySzczurak | 20:cf211a3b3d9e | 1784 | VL53L0X_Error VL53L0X::vl53l0x_get_measurement_data_ready( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1785 | uint8_t *p_measurement_data_ready ) |
johnAlexander | 0:c523920bcc09 | 1786 | { |
johnAlexander | 16:98ce55ddbb1a | 1787 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1788 | uint8_t sys_range_status_register; |
johnAlexander | 16:98ce55ddbb1a | 1789 | uint8_t interrupt_config; |
johnAlexander | 16:98ce55ddbb1a | 1790 | uint32_t interrupt_mask; |
JerrySzczurak | 20:cf211a3b3d9e | 1791 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 1792 | |
JerrySzczurak | 20:cf211a3b3d9e | 1793 | interrupt_config = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1794 | Pin0GpioFunctionality ); |
JerrySzczurak | 20:cf211a3b3d9e | 1795 | |
JerrySzczurak | 20:cf211a3b3d9e | 1796 | if ( interrupt_config == |
JerrySzczurak | 20:cf211a3b3d9e | 1797 | VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1798 | status = vl53l0x_get_interrupt_mask_status( dev, &interrupt_mask ); |
JerrySzczurak | 20:cf211a3b3d9e | 1799 | if ( interrupt_mask == |
JerrySzczurak | 20:cf211a3b3d9e | 1800 | VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY ) |
johnAlexander | 17:1b842521063a | 1801 | *p_measurement_data_ready = 1; |
johnAlexander | 15:932d8b4e52c9 | 1802 | else |
johnAlexander | 17:1b842521063a | 1803 | *p_measurement_data_ready = 0; |
johnAlexander | 15:932d8b4e52c9 | 1804 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 1805 | status = vl53l0x_read_byte( dev, VL53L0X_REG_RESULT_RANGE_STATUS, |
JerrySzczurak | 20:cf211a3b3d9e | 1806 | &sys_range_status_register ); |
JerrySzczurak | 20:cf211a3b3d9e | 1807 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1808 | if ( sys_range_status_register & 0x01 ) |
johnAlexander | 17:1b842521063a | 1809 | *p_measurement_data_ready = 1; |
johnAlexander | 15:932d8b4e52c9 | 1810 | else |
johnAlexander | 17:1b842521063a | 1811 | *p_measurement_data_ready = 0; |
johnAlexander | 15:932d8b4e52c9 | 1812 | } |
johnAlexander | 15:932d8b4e52c9 | 1813 | } |
johnAlexander | 15:932d8b4e52c9 | 1814 | |
JerrySzczurak | 20:cf211a3b3d9e | 1815 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1816 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1817 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1818 | |
JerrySzczurak | 20:cf211a3b3d9e | 1819 | VL53L0X_Error VL53L0X::vl53l0x_polling_delay( VL53L0X_DEV dev ) |
johnAlexander | 15:932d8b4e52c9 | 1820 | { |
johnAlexander | 0:c523920bcc09 | 1821 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 0:c523920bcc09 | 1822 | |
johnAlexander | 0:c523920bcc09 | 1823 | // do nothing |
johnAlexander | 0:c523920bcc09 | 1824 | VL53L0X_OsDelay(); |
johnAlexander | 0:c523920bcc09 | 1825 | return status; |
johnAlexander | 0:c523920bcc09 | 1826 | } |
johnAlexander | 0:c523920bcc09 | 1827 | |
JerrySzczurak | 20:cf211a3b3d9e | 1828 | VL53L0X_Error VL53L0X::vl53l0x_measurement_poll_for_completion( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 1829 | { |
johnAlexander | 16:98ce55ddbb1a | 1830 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1831 | uint8_t new_data_ready = 0; |
johnAlexander | 16:98ce55ddbb1a | 1832 | uint32_t loop_nb; |
johnAlexander | 15:932d8b4e52c9 | 1833 | |
JerrySzczurak | 20:cf211a3b3d9e | 1834 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 1835 | |
johnAlexander | 16:98ce55ddbb1a | 1836 | loop_nb = 0; |
johnAlexander | 15:932d8b4e52c9 | 1837 | |
johnAlexander | 15:932d8b4e52c9 | 1838 | do { |
JerrySzczurak | 20:cf211a3b3d9e | 1839 | status = vl53l0x_get_measurement_data_ready( dev, &new_data_ready ); |
JerrySzczurak | 20:cf211a3b3d9e | 1840 | if ( status != 0 ) |
johnAlexander | 15:932d8b4e52c9 | 1841 | break; /* the error is set */ |
johnAlexander | 15:932d8b4e52c9 | 1842 | |
JerrySzczurak | 20:cf211a3b3d9e | 1843 | if ( new_data_ready == 1 ) |
johnAlexander | 15:932d8b4e52c9 | 1844 | break; /* done note that status == 0 */ |
johnAlexander | 15:932d8b4e52c9 | 1845 | |
johnAlexander | 16:98ce55ddbb1a | 1846 | loop_nb++; |
JerrySzczurak | 20:cf211a3b3d9e | 1847 | if ( loop_nb >= VL53L0X_DEFAULT_MAX_LOOP ) { |
johnAlexander | 16:98ce55ddbb1a | 1848 | status = VL53L0X_ERROR_TIME_OUT; |
johnAlexander | 15:932d8b4e52c9 | 1849 | break; |
johnAlexander | 15:932d8b4e52c9 | 1850 | } |
johnAlexander | 15:932d8b4e52c9 | 1851 | |
JerrySzczurak | 20:cf211a3b3d9e | 1852 | vl53l0x_polling_delay( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 1853 | } while ( 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1854 | |
JerrySzczurak | 20:cf211a3b3d9e | 1855 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 1856 | |
johnAlexander | 16:98ce55ddbb1a | 1857 | return status; |
johnAlexander | 0:c523920bcc09 | 1858 | } |
johnAlexander | 0:c523920bcc09 | 1859 | |
johnAlexander | 0:c523920bcc09 | 1860 | /* Group PAL Interrupt Functions */ |
JerrySzczurak | 20:cf211a3b3d9e | 1861 | VL53L0X_Error VL53L0X::vl53l0x_clear_interrupt_mask( VL53L0X_DEV dev, uint32_t interrupt_mask ) |
johnAlexander | 0:c523920bcc09 | 1862 | { |
johnAlexander | 16:98ce55ddbb1a | 1863 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1864 | uint8_t loop_count; |
johnAlexander | 17:1b842521063a | 1865 | uint8_t byte; |
JerrySzczurak | 20:cf211a3b3d9e | 1866 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 1867 | |
johnAlexander | 15:932d8b4e52c9 | 1868 | /* clear bit 0 range interrupt, bit 1 error interrupt */ |
johnAlexander | 16:98ce55ddbb1a | 1869 | loop_count = 0; |
johnAlexander | 15:932d8b4e52c9 | 1870 | do { |
JerrySzczurak | 20:cf211a3b3d9e | 1871 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1872 | VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1873 | status |= vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1874 | VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1875 | status |= vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1876 | VL53L0X_REG_RESULT_INTERRUPT_STATUS, &byte ); |
johnAlexander | 16:98ce55ddbb1a | 1877 | loop_count++; |
JerrySzczurak | 20:cf211a3b3d9e | 1878 | } while ( ( ( byte & 0x07 ) != 0x00 ) |
JerrySzczurak | 20:cf211a3b3d9e | 1879 | && ( loop_count < 3 ) |
JerrySzczurak | 20:cf211a3b3d9e | 1880 | && ( status == VL53L0X_ERROR_NONE ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 1881 | |
JerrySzczurak | 20:cf211a3b3d9e | 1882 | |
JerrySzczurak | 20:cf211a3b3d9e | 1883 | if ( loop_count >= 3 ) |
johnAlexander | 16:98ce55ddbb1a | 1884 | status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED; |
johnAlexander | 16:98ce55ddbb1a | 1885 | |
JerrySzczurak | 20:cf211a3b3d9e | 1886 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 1887 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1888 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1889 | |
JerrySzczurak | 20:cf211a3b3d9e | 1890 | VL53L0X_Error VL53L0X::vl53l0x_perform_single_ref_calibration( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 1891 | uint8_t vhv_init_byte ) |
johnAlexander | 0:c523920bcc09 | 1892 | { |
johnAlexander | 16:98ce55ddbb1a | 1893 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1894 | |
JerrySzczurak | 20:cf211a3b3d9e | 1895 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1896 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSRANGE_START, |
JerrySzczurak | 20:cf211a3b3d9e | 1897 | VL53L0X_REG_SYSRANGE_MODE_START_STOP | |
JerrySzczurak | 20:cf211a3b3d9e | 1898 | vhv_init_byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 1899 | |
JerrySzczurak | 20:cf211a3b3d9e | 1900 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1901 | status = vl53l0x_measurement_poll_for_completion( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 1902 | |
JerrySzczurak | 20:cf211a3b3d9e | 1903 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1904 | status = vl53l0x_clear_interrupt_mask( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1905 | |
JerrySzczurak | 20:cf211a3b3d9e | 1906 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1907 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSRANGE_START, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1908 | |
JerrySzczurak | 20:cf211a3b3d9e | 1909 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1910 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1911 | |
JerrySzczurak | 20:cf211a3b3d9e | 1912 | VL53L0X_Error VL53L0X::vl53l0x_ref_calibration_io( VL53L0X_DEV dev, uint8_t read_not_write, |
johnAlexander | 16:98ce55ddbb1a | 1913 | uint8_t vhv_settings, uint8_t phase_cal, |
johnAlexander | 16:98ce55ddbb1a | 1914 | uint8_t *p_vhv_settings, uint8_t *p_phase_cal, |
JerrySzczurak | 20:cf211a3b3d9e | 1915 | const uint8_t vhv_enable, const uint8_t phase_enable ) |
johnAlexander | 0:c523920bcc09 | 1916 | { |
johnAlexander | 16:98ce55ddbb1a | 1917 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1918 | uint8_t phase_calint = 0; |
johnAlexander | 15:932d8b4e52c9 | 1919 | |
johnAlexander | 15:932d8b4e52c9 | 1920 | /* Read VHV from device */ |
JerrySzczurak | 20:cf211a3b3d9e | 1921 | status |= vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1922 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1923 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1924 | |
JerrySzczurak | 20:cf211a3b3d9e | 1925 | if ( read_not_write ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1926 | if ( vhv_enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 1927 | status |= vl53l0x_read_byte( dev, 0xCB, p_vhv_settings ); |
JerrySzczurak | 20:cf211a3b3d9e | 1928 | if ( phase_enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 1929 | status |= vl53l0x_read_byte( dev, 0xEE, &phase_calint ); |
johnAlexander | 15:932d8b4e52c9 | 1930 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 1931 | if ( vhv_enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 1932 | status |= vl53l0x_write_byte( dev, 0xCB, vhv_settings ); |
JerrySzczurak | 20:cf211a3b3d9e | 1933 | if ( phase_enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 1934 | status |= vl53l0x_update_byte( dev, 0xEE, 0x80, phase_cal ); |
JerrySzczurak | 20:cf211a3b3d9e | 1935 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1936 | |
JerrySzczurak | 20:cf211a3b3d9e | 1937 | status |= vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1938 | status |= vl53l0x_write_byte( dev, 0x00, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1939 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1940 | |
JerrySzczurak | 20:cf211a3b3d9e | 1941 | *p_phase_cal = ( uint8_t )( phase_calint & 0xEF ); |
JerrySzczurak | 20:cf211a3b3d9e | 1942 | |
JerrySzczurak | 20:cf211a3b3d9e | 1943 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1944 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1945 | |
JerrySzczurak | 20:cf211a3b3d9e | 1946 | VL53L0X_Error VL53L0X::vl53l0x_perform_vhv_calibration( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 1947 | uint8_t *p_vhv_settings, const uint8_t get_data_enable, |
JerrySzczurak | 20:cf211a3b3d9e | 1948 | const uint8_t restore_config ) |
johnAlexander | 0:c523920bcc09 | 1949 | { |
johnAlexander | 16:98ce55ddbb1a | 1950 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1951 | uint8_t sequence_config = 0; |
johnAlexander | 16:98ce55ddbb1a | 1952 | uint8_t vhv_settings = 0; |
johnAlexander | 16:98ce55ddbb1a | 1953 | uint8_t phase_cal = 0; |
johnAlexander | 16:98ce55ddbb1a | 1954 | uint8_t phase_cal_int = 0; |
johnAlexander | 15:932d8b4e52c9 | 1955 | |
johnAlexander | 15:932d8b4e52c9 | 1956 | /* store the value of the sequence config, |
johnAlexander | 15:932d8b4e52c9 | 1957 | * this will be reset before the end of the function |
johnAlexander | 15:932d8b4e52c9 | 1958 | */ |
johnAlexander | 15:932d8b4e52c9 | 1959 | |
JerrySzczurak | 20:cf211a3b3d9e | 1960 | if ( restore_config ) |
JerrySzczurak | 20:cf211a3b3d9e | 1961 | sequence_config = PALDevDataGet( dev, SequenceConfig ); |
johnAlexander | 15:932d8b4e52c9 | 1962 | |
johnAlexander | 15:932d8b4e52c9 | 1963 | /* Run VHV */ |
JerrySzczurak | 20:cf211a3b3d9e | 1964 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 1965 | |
JerrySzczurak | 20:cf211a3b3d9e | 1966 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1967 | status = vl53l0x_perform_single_ref_calibration( dev, 0x40 ); |
johnAlexander | 15:932d8b4e52c9 | 1968 | |
johnAlexander | 15:932d8b4e52c9 | 1969 | /* Read VHV from device */ |
JerrySzczurak | 20:cf211a3b3d9e | 1970 | if ( ( status == VL53L0X_ERROR_NONE ) && ( get_data_enable == 1 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 1971 | status = vl53l0x_ref_calibration_io( dev, 1, |
JerrySzczurak | 20:cf211a3b3d9e | 1972 | vhv_settings, phase_cal, /* Not used here */ |
JerrySzczurak | 20:cf211a3b3d9e | 1973 | p_vhv_settings, &phase_cal_int, |
JerrySzczurak | 20:cf211a3b3d9e | 1974 | 1, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 1975 | } else |
johnAlexander | 16:98ce55ddbb1a | 1976 | *p_vhv_settings = 0; |
johnAlexander | 16:98ce55ddbb1a | 1977 | |
johnAlexander | 16:98ce55ddbb1a | 1978 | |
JerrySzczurak | 20:cf211a3b3d9e | 1979 | if ( ( status == VL53L0X_ERROR_NONE ) && restore_config ) { |
johnAlexander | 15:932d8b4e52c9 | 1980 | /* restore the previous Sequence Config */ |
JerrySzczurak | 20:cf211a3b3d9e | 1981 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 1982 | sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 1983 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 1984 | PALDevDataSet( dev, SequenceConfig, sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 1985 | |
JerrySzczurak | 20:cf211a3b3d9e | 1986 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1987 | |
JerrySzczurak | 20:cf211a3b3d9e | 1988 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 1989 | } |
JerrySzczurak | 20:cf211a3b3d9e | 1990 | |
JerrySzczurak | 20:cf211a3b3d9e | 1991 | VL53L0X_Error VL53L0X::vl53l0x_perform_phase_calibration( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 1992 | uint8_t *p_phase_cal, const uint8_t get_data_enable, |
JerrySzczurak | 20:cf211a3b3d9e | 1993 | const uint8_t restore_config ) |
johnAlexander | 0:c523920bcc09 | 1994 | { |
johnAlexander | 16:98ce55ddbb1a | 1995 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 1996 | uint8_t sequence_config = 0; |
johnAlexander | 16:98ce55ddbb1a | 1997 | uint8_t vhv_settings = 0; |
johnAlexander | 16:98ce55ddbb1a | 1998 | uint8_t phase_cal = 0; |
johnAlexander | 16:98ce55ddbb1a | 1999 | uint8_t vhv_settingsint; |
johnAlexander | 15:932d8b4e52c9 | 2000 | |
johnAlexander | 15:932d8b4e52c9 | 2001 | /* store the value of the sequence config, |
johnAlexander | 15:932d8b4e52c9 | 2002 | * this will be reset before the end of the function |
johnAlexander | 15:932d8b4e52c9 | 2003 | */ |
johnAlexander | 15:932d8b4e52c9 | 2004 | |
JerrySzczurak | 20:cf211a3b3d9e | 2005 | if ( restore_config ) |
JerrySzczurak | 20:cf211a3b3d9e | 2006 | sequence_config = PALDevDataGet( dev, SequenceConfig ); |
johnAlexander | 15:932d8b4e52c9 | 2007 | |
johnAlexander | 15:932d8b4e52c9 | 2008 | /* Run PhaseCal */ |
JerrySzczurak | 20:cf211a3b3d9e | 2009 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x02 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2010 | |
JerrySzczurak | 20:cf211a3b3d9e | 2011 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2012 | status = vl53l0x_perform_single_ref_calibration( dev, 0x0 ); |
johnAlexander | 15:932d8b4e52c9 | 2013 | |
johnAlexander | 15:932d8b4e52c9 | 2014 | /* Read PhaseCal from device */ |
JerrySzczurak | 20:cf211a3b3d9e | 2015 | if ( ( status == VL53L0X_ERROR_NONE ) && ( get_data_enable == 1 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2016 | status = vl53l0x_ref_calibration_io( dev, 1, |
JerrySzczurak | 20:cf211a3b3d9e | 2017 | vhv_settings, phase_cal, /* Not used here */ |
JerrySzczurak | 20:cf211a3b3d9e | 2018 | &vhv_settingsint, p_phase_cal, |
JerrySzczurak | 20:cf211a3b3d9e | 2019 | 0, 1 ); |
johnAlexander | 15:932d8b4e52c9 | 2020 | } else |
johnAlexander | 16:98ce55ddbb1a | 2021 | *p_phase_cal = 0; |
johnAlexander | 16:98ce55ddbb1a | 2022 | |
johnAlexander | 16:98ce55ddbb1a | 2023 | |
JerrySzczurak | 20:cf211a3b3d9e | 2024 | if ( ( status == VL53L0X_ERROR_NONE ) && restore_config ) { |
johnAlexander | 15:932d8b4e52c9 | 2025 | /* restore the previous Sequence Config */ |
JerrySzczurak | 20:cf211a3b3d9e | 2026 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 2027 | sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 2028 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2029 | PALDevDataSet( dev, SequenceConfig, sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 2030 | |
JerrySzczurak | 20:cf211a3b3d9e | 2031 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2032 | |
JerrySzczurak | 20:cf211a3b3d9e | 2033 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2034 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2035 | |
JerrySzczurak | 20:cf211a3b3d9e | 2036 | VL53L0X_Error VL53L0X::vl53l0x_perform_ref_calibration( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2037 | uint8_t *p_vhv_settings, uint8_t *p_phase_cal, uint8_t get_data_enable ) |
johnAlexander | 0:c523920bcc09 | 2038 | { |
johnAlexander | 16:98ce55ddbb1a | 2039 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2040 | uint8_t sequence_config = 0; |
johnAlexander | 15:932d8b4e52c9 | 2041 | |
johnAlexander | 15:932d8b4e52c9 | 2042 | /* store the value of the sequence config, |
johnAlexander | 15:932d8b4e52c9 | 2043 | * this will be reset before the end of the function |
johnAlexander | 15:932d8b4e52c9 | 2044 | */ |
johnAlexander | 15:932d8b4e52c9 | 2045 | |
JerrySzczurak | 20:cf211a3b3d9e | 2046 | sequence_config = PALDevDataGet( dev, SequenceConfig ); |
johnAlexander | 15:932d8b4e52c9 | 2047 | |
johnAlexander | 15:932d8b4e52c9 | 2048 | /* In the following function we don't save the config to optimize |
johnAlexander | 15:932d8b4e52c9 | 2049 | * writes on device. Config is saved and restored only once. */ |
johnAlexander | 16:98ce55ddbb1a | 2050 | status = vl53l0x_perform_vhv_calibration( |
JerrySzczurak | 20:cf211a3b3d9e | 2051 | dev, p_vhv_settings, get_data_enable, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2052 | |
JerrySzczurak | 20:cf211a3b3d9e | 2053 | |
JerrySzczurak | 20:cf211a3b3d9e | 2054 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 2055 | status = vl53l0x_perform_phase_calibration( |
JerrySzczurak | 20:cf211a3b3d9e | 2056 | dev, p_phase_cal, get_data_enable, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2057 | |
JerrySzczurak | 20:cf211a3b3d9e | 2058 | |
JerrySzczurak | 20:cf211a3b3d9e | 2059 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 2060 | /* restore the previous Sequence Config */ |
JerrySzczurak | 20:cf211a3b3d9e | 2061 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 2062 | sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 2063 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2064 | PALDevDataSet( dev, SequenceConfig, sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 2065 | |
JerrySzczurak | 20:cf211a3b3d9e | 2066 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2067 | |
JerrySzczurak | 20:cf211a3b3d9e | 2068 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2069 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2070 | |
JerrySzczurak | 20:cf211a3b3d9e | 2071 | void VL53L0X::get_next_good_spad( uint8_t good_spad_array[], uint32_t size, |
JerrySzczurak | 20:cf211a3b3d9e | 2072 | uint32_t curr, int32_t *p_next ) |
johnAlexander | 0:c523920bcc09 | 2073 | { |
johnAlexander | 16:98ce55ddbb1a | 2074 | uint32_t start_index; |
johnAlexander | 16:98ce55ddbb1a | 2075 | uint32_t fine_offset; |
johnAlexander | 16:98ce55ddbb1a | 2076 | uint32_t c_spads_per_byte = 8; |
johnAlexander | 16:98ce55ddbb1a | 2077 | uint32_t coarse_index; |
johnAlexander | 16:98ce55ddbb1a | 2078 | uint32_t fine_index; |
johnAlexander | 16:98ce55ddbb1a | 2079 | uint8_t data_byte; |
johnAlexander | 15:932d8b4e52c9 | 2080 | uint8_t success = 0; |
johnAlexander | 15:932d8b4e52c9 | 2081 | |
johnAlexander | 15:932d8b4e52c9 | 2082 | /* |
johnAlexander | 15:932d8b4e52c9 | 2083 | * Starting with the current good spad, loop through the array to find |
johnAlexander | 15:932d8b4e52c9 | 2084 | * the next. i.e. the next bit set in the sequence. |
johnAlexander | 15:932d8b4e52c9 | 2085 | * |
johnAlexander | 15:932d8b4e52c9 | 2086 | * The coarse index is the byte index of the array and the fine index is |
johnAlexander | 15:932d8b4e52c9 | 2087 | * the index of the bit within each byte. |
johnAlexander | 15:932d8b4e52c9 | 2088 | */ |
johnAlexander | 15:932d8b4e52c9 | 2089 | |
johnAlexander | 16:98ce55ddbb1a | 2090 | *p_next = -1; |
johnAlexander | 16:98ce55ddbb1a | 2091 | |
johnAlexander | 16:98ce55ddbb1a | 2092 | start_index = curr / c_spads_per_byte; |
johnAlexander | 16:98ce55ddbb1a | 2093 | fine_offset = curr % c_spads_per_byte; |
johnAlexander | 16:98ce55ddbb1a | 2094 | |
JerrySzczurak | 20:cf211a3b3d9e | 2095 | for ( coarse_index = start_index; ( ( coarse_index < size ) && !success ); |
JerrySzczurak | 20:cf211a3b3d9e | 2096 | coarse_index++ ) { |
johnAlexander | 16:98ce55ddbb1a | 2097 | fine_index = 0; |
johnAlexander | 16:98ce55ddbb1a | 2098 | data_byte = good_spad_array[coarse_index]; |
johnAlexander | 16:98ce55ddbb1a | 2099 | |
JerrySzczurak | 20:cf211a3b3d9e | 2100 | if ( coarse_index == start_index ) { |
johnAlexander | 15:932d8b4e52c9 | 2101 | /* locate the bit position of the provided current |
johnAlexander | 15:932d8b4e52c9 | 2102 | * spad bit before iterating */ |
johnAlexander | 16:98ce55ddbb1a | 2103 | data_byte >>= fine_offset; |
johnAlexander | 16:98ce55ddbb1a | 2104 | fine_index = fine_offset; |
johnAlexander | 15:932d8b4e52c9 | 2105 | } |
johnAlexander | 15:932d8b4e52c9 | 2106 | |
JerrySzczurak | 20:cf211a3b3d9e | 2107 | while ( fine_index < c_spads_per_byte ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2108 | if ( ( data_byte & 0x1 ) == 1 ) { |
johnAlexander | 15:932d8b4e52c9 | 2109 | success = 1; |
johnAlexander | 16:98ce55ddbb1a | 2110 | *p_next = coarse_index * c_spads_per_byte + fine_index; |
johnAlexander | 15:932d8b4e52c9 | 2111 | break; |
johnAlexander | 15:932d8b4e52c9 | 2112 | } |
johnAlexander | 16:98ce55ddbb1a | 2113 | data_byte >>= 1; |
johnAlexander | 16:98ce55ddbb1a | 2114 | fine_index++; |
johnAlexander | 15:932d8b4e52c9 | 2115 | } |
johnAlexander | 15:932d8b4e52c9 | 2116 | } |
johnAlexander | 0:c523920bcc09 | 2117 | } |
johnAlexander | 0:c523920bcc09 | 2118 | |
JerrySzczurak | 20:cf211a3b3d9e | 2119 | uint8_t VL53L0X::is_aperture( uint32_t spad_index ) |
johnAlexander | 0:c523920bcc09 | 2120 | { |
johnAlexander | 15:932d8b4e52c9 | 2121 | /* |
johnAlexander | 15:932d8b4e52c9 | 2122 | * This function reports if a given spad index is an aperture SPAD by |
johnAlexander | 15:932d8b4e52c9 | 2123 | * deriving the quadrant. |
johnAlexander | 15:932d8b4e52c9 | 2124 | */ |
johnAlexander | 15:932d8b4e52c9 | 2125 | uint32_t quadrant; |
johnAlexander | 16:98ce55ddbb1a | 2126 | uint8_t is_aperture = 1; |
johnAlexander | 16:98ce55ddbb1a | 2127 | quadrant = spad_index >> 6; |
JerrySzczurak | 20:cf211a3b3d9e | 2128 | if ( refArrayQuadrants[quadrant] == REF_ARRAY_SPAD_0 ) |
johnAlexander | 16:98ce55ddbb1a | 2129 | is_aperture = 0; |
johnAlexander | 16:98ce55ddbb1a | 2130 | |
johnAlexander | 16:98ce55ddbb1a | 2131 | return is_aperture; |
johnAlexander | 0:c523920bcc09 | 2132 | } |
johnAlexander | 0:c523920bcc09 | 2133 | |
JerrySzczurak | 20:cf211a3b3d9e | 2134 | VL53L0X_Error VL53L0X::enable_spad_bit( uint8_t spad_array[], uint32_t size, |
JerrySzczurak | 20:cf211a3b3d9e | 2135 | uint32_t spad_index ) |
johnAlexander | 0:c523920bcc09 | 2136 | { |
johnAlexander | 15:932d8b4e52c9 | 2137 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2138 | uint32_t c_spads_per_byte = 8; |
johnAlexander | 16:98ce55ddbb1a | 2139 | uint32_t coarse_index; |
johnAlexander | 16:98ce55ddbb1a | 2140 | uint32_t fine_index; |
johnAlexander | 16:98ce55ddbb1a | 2141 | |
johnAlexander | 16:98ce55ddbb1a | 2142 | coarse_index = spad_index / c_spads_per_byte; |
johnAlexander | 16:98ce55ddbb1a | 2143 | fine_index = spad_index % c_spads_per_byte; |
JerrySzczurak | 20:cf211a3b3d9e | 2144 | if ( coarse_index >= size ) |
johnAlexander | 15:932d8b4e52c9 | 2145 | status = VL53L0X_ERROR_REF_SPAD_INIT; |
johnAlexander | 15:932d8b4e52c9 | 2146 | else |
JerrySzczurak | 20:cf211a3b3d9e | 2147 | spad_array[coarse_index] |= ( 1 << fine_index ); |
JerrySzczurak | 20:cf211a3b3d9e | 2148 | |
JerrySzczurak | 20:cf211a3b3d9e | 2149 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2150 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2151 | |
JerrySzczurak | 20:cf211a3b3d9e | 2152 | VL53L0X_Error VL53L0X::set_ref_spad_map( VL53L0X_DEV dev, uint8_t *p_ref_spad_array ) |
JerrySzczurak | 20:cf211a3b3d9e | 2153 | { |
JerrySzczurak | 20:cf211a3b3d9e | 2154 | VL53L0X_Error status = vl53l0x_write_multi( dev, |
johnAlexander | 15:932d8b4e52c9 | 2155 | VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, |
JerrySzczurak | 20:cf211a3b3d9e | 2156 | p_ref_spad_array, 6 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2157 | |
JerrySzczurak | 20:cf211a3b3d9e | 2158 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2159 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2160 | |
JerrySzczurak | 20:cf211a3b3d9e | 2161 | VL53L0X_Error VL53L0X::get_ref_spad_map( VL53L0X_DEV dev, uint8_t *p_ref_spad_array ) |
JerrySzczurak | 20:cf211a3b3d9e | 2162 | { |
JerrySzczurak | 20:cf211a3b3d9e | 2163 | VL53L0X_Error status = vl53l0x_read_multi( dev, |
johnAlexander | 15:932d8b4e52c9 | 2164 | VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, |
johnAlexander | 16:98ce55ddbb1a | 2165 | p_ref_spad_array, |
JerrySzczurak | 20:cf211a3b3d9e | 2166 | 6 ); |
johnAlexander | 0:c523920bcc09 | 2167 | // VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 0:c523920bcc09 | 2168 | // uint8_t count=0; |
johnAlexander | 0:c523920bcc09 | 2169 | |
johnAlexander | 0:c523920bcc09 | 2170 | // for (count = 0; count < 6; count++) |
JerrySzczurak | 21:627b65069e6d | 2171 | // status = vl53l0x_read_byte(Dev, (VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0 + count), &refSpadArray[count]); |
johnAlexander | 15:932d8b4e52c9 | 2172 | return status; |
johnAlexander | 0:c523920bcc09 | 2173 | } |
johnAlexander | 0:c523920bcc09 | 2174 | |
JerrySzczurak | 20:cf211a3b3d9e | 2175 | VL53L0X_Error VL53L0X::enable_ref_spads( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2176 | uint8_t aperture_spads, |
JerrySzczurak | 20:cf211a3b3d9e | 2177 | uint8_t good_spad_array[], |
JerrySzczurak | 20:cf211a3b3d9e | 2178 | uint8_t spad_array[], |
JerrySzczurak | 20:cf211a3b3d9e | 2179 | uint32_t size, |
JerrySzczurak | 20:cf211a3b3d9e | 2180 | uint32_t start, |
JerrySzczurak | 20:cf211a3b3d9e | 2181 | uint32_t offset, |
JerrySzczurak | 20:cf211a3b3d9e | 2182 | uint32_t spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 2183 | uint32_t *p_last_spad ) |
johnAlexander | 0:c523920bcc09 | 2184 | { |
johnAlexander | 15:932d8b4e52c9 | 2185 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 2186 | uint32_t index; |
johnAlexander | 15:932d8b4e52c9 | 2187 | uint32_t i; |
johnAlexander | 16:98ce55ddbb1a | 2188 | int32_t next_good_spad = offset; |
johnAlexander | 16:98ce55ddbb1a | 2189 | uint32_t current_spad; |
johnAlexander | 16:98ce55ddbb1a | 2190 | uint8_t check_spad_array[6]; |
johnAlexander | 15:932d8b4e52c9 | 2191 | |
johnAlexander | 15:932d8b4e52c9 | 2192 | /* |
johnAlexander | 15:932d8b4e52c9 | 2193 | * This function takes in a spad array which may or may not have SPADS |
johnAlexander | 15:932d8b4e52c9 | 2194 | * already enabled and appends from a given offset a requested number |
johnAlexander | 15:932d8b4e52c9 | 2195 | * of new SPAD enables. The 'good spad map' is applied to |
johnAlexander | 15:932d8b4e52c9 | 2196 | * determine the next SPADs to enable. |
johnAlexander | 15:932d8b4e52c9 | 2197 | * |
johnAlexander | 15:932d8b4e52c9 | 2198 | * This function applies to only aperture or only non-aperture spads. |
johnAlexander | 15:932d8b4e52c9 | 2199 | * Checks are performed to ensure this. |
johnAlexander | 15:932d8b4e52c9 | 2200 | */ |
johnAlexander | 15:932d8b4e52c9 | 2201 | |
johnAlexander | 16:98ce55ddbb1a | 2202 | current_spad = offset; |
JerrySzczurak | 20:cf211a3b3d9e | 2203 | for ( index = 0; index < spad_count; index++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2204 | get_next_good_spad( good_spad_array, size, current_spad, |
JerrySzczurak | 20:cf211a3b3d9e | 2205 | &next_good_spad ); |
JerrySzczurak | 20:cf211a3b3d9e | 2206 | |
JerrySzczurak | 20:cf211a3b3d9e | 2207 | if ( next_good_spad == -1 ) { |
johnAlexander | 15:932d8b4e52c9 | 2208 | status = VL53L0X_ERROR_REF_SPAD_INIT; |
johnAlexander | 15:932d8b4e52c9 | 2209 | break; |
johnAlexander | 15:932d8b4e52c9 | 2210 | } |
johnAlexander | 15:932d8b4e52c9 | 2211 | |
johnAlexander | 15:932d8b4e52c9 | 2212 | /* Confirm that the next good SPAD is non-aperture */ |
JerrySzczurak | 20:cf211a3b3d9e | 2213 | if ( is_aperture( start + next_good_spad ) != aperture_spads ) { |
johnAlexander | 15:932d8b4e52c9 | 2214 | /* if we can't get the required number of good aperture |
johnAlexander | 15:932d8b4e52c9 | 2215 | * spads from the current quadrant then this is an error |
johnAlexander | 15:932d8b4e52c9 | 2216 | */ |
johnAlexander | 15:932d8b4e52c9 | 2217 | status = VL53L0X_ERROR_REF_SPAD_INIT; |
johnAlexander | 15:932d8b4e52c9 | 2218 | break; |
johnAlexander | 15:932d8b4e52c9 | 2219 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2220 | current_spad = ( uint32_t )next_good_spad; |
JerrySzczurak | 20:cf211a3b3d9e | 2221 | enable_spad_bit( spad_array, size, current_spad ); |
johnAlexander | 16:98ce55ddbb1a | 2222 | current_spad++; |
johnAlexander | 15:932d8b4e52c9 | 2223 | } |
johnAlexander | 16:98ce55ddbb1a | 2224 | *p_last_spad = current_spad; |
johnAlexander | 15:932d8b4e52c9 | 2225 | |
JerrySzczurak | 20:cf211a3b3d9e | 2226 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2227 | status = set_ref_spad_map( dev, spad_array ); |
JerrySzczurak | 20:cf211a3b3d9e | 2228 | |
JerrySzczurak | 20:cf211a3b3d9e | 2229 | |
JerrySzczurak | 20:cf211a3b3d9e | 2230 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2231 | status = get_ref_spad_map( dev, check_spad_array ); |
johnAlexander | 15:932d8b4e52c9 | 2232 | |
johnAlexander | 15:932d8b4e52c9 | 2233 | i = 0; |
johnAlexander | 15:932d8b4e52c9 | 2234 | |
johnAlexander | 15:932d8b4e52c9 | 2235 | /* Compare spad maps. If not equal report error. */ |
JerrySzczurak | 20:cf211a3b3d9e | 2236 | while ( i < size ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2237 | if ( spad_array[i] != check_spad_array[i] ) { |
johnAlexander | 15:932d8b4e52c9 | 2238 | status = VL53L0X_ERROR_REF_SPAD_INIT; |
johnAlexander | 15:932d8b4e52c9 | 2239 | break; |
johnAlexander | 15:932d8b4e52c9 | 2240 | } |
johnAlexander | 15:932d8b4e52c9 | 2241 | i++; |
johnAlexander | 15:932d8b4e52c9 | 2242 | } |
johnAlexander | 15:932d8b4e52c9 | 2243 | } |
johnAlexander | 15:932d8b4e52c9 | 2244 | return status; |
johnAlexander | 0:c523920bcc09 | 2245 | } |
johnAlexander | 0:c523920bcc09 | 2246 | |
JerrySzczurak | 20:cf211a3b3d9e | 2247 | VL53L0X_Error VL53L0X::vl53l0x_set_device_mode( VL53L0X_DEV dev, VL53L0X_DeviceModes device_mode ) |
johnAlexander | 0:c523920bcc09 | 2248 | { |
johnAlexander | 16:98ce55ddbb1a | 2249 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 2250 | |
JerrySzczurak | 20:cf211a3b3d9e | 2251 | LOG_FUNCTION_START( "%d", ( int )DeviceMode ); |
JerrySzczurak | 20:cf211a3b3d9e | 2252 | |
JerrySzczurak | 20:cf211a3b3d9e | 2253 | switch ( device_mode ) { |
johnAlexander | 15:932d8b4e52c9 | 2254 | case VL53L0X_DEVICEMODE_SINGLE_RANGING: |
johnAlexander | 15:932d8b4e52c9 | 2255 | case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: |
johnAlexander | 15:932d8b4e52c9 | 2256 | case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: |
johnAlexander | 15:932d8b4e52c9 | 2257 | case VL53L0X_DEVICEMODE_GPIO_DRIVE: |
johnAlexander | 15:932d8b4e52c9 | 2258 | case VL53L0X_DEVICEMODE_GPIO_OSC: |
johnAlexander | 15:932d8b4e52c9 | 2259 | /* Supported modes */ |
JerrySzczurak | 20:cf211a3b3d9e | 2260 | VL53L0X_SETPARAMETERFIELD( dev, DeviceMode, device_mode ); |
johnAlexander | 15:932d8b4e52c9 | 2261 | break; |
johnAlexander | 15:932d8b4e52c9 | 2262 | default: |
johnAlexander | 15:932d8b4e52c9 | 2263 | /* Unsupported mode */ |
johnAlexander | 16:98ce55ddbb1a | 2264 | status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; |
johnAlexander | 15:932d8b4e52c9 | 2265 | } |
johnAlexander | 15:932d8b4e52c9 | 2266 | |
JerrySzczurak | 20:cf211a3b3d9e | 2267 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2268 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2269 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2270 | |
JerrySzczurak | 20:cf211a3b3d9e | 2271 | VL53L0X_Error VL53L0X::vl53l0x_set_interrupt_thresholds( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 2272 | VL53L0X_DeviceModes device_mode, FixPoint1616_t threshold_low, |
JerrySzczurak | 20:cf211a3b3d9e | 2273 | FixPoint1616_t threshold_high ) |
johnAlexander | 13:615f7e38568c | 2274 | { |
johnAlexander | 16:98ce55ddbb1a | 2275 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2276 | uint16_t threshold16; |
JerrySzczurak | 20:cf211a3b3d9e | 2277 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2278 | |
johnAlexander | 15:932d8b4e52c9 | 2279 | /* no dependency on DeviceMode for Ewok */ |
johnAlexander | 15:932d8b4e52c9 | 2280 | /* Need to divide by 2 because the FW will apply a x2 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2281 | threshold16 = ( uint16_t )( ( threshold_low >> 17 ) & 0x00fff ); |
JerrySzczurak | 20:cf211a3b3d9e | 2282 | status = vl53l0x_write_word( dev, VL53L0X_REG_SYSTEM_THRESH_LOW, threshold16 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2283 | |
JerrySzczurak | 20:cf211a3b3d9e | 2284 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 2285 | /* Need to divide by 2 because the FW will apply a x2 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2286 | threshold16 = ( uint16_t )( ( threshold_high >> 17 ) & 0x00fff ); |
JerrySzczurak | 20:cf211a3b3d9e | 2287 | status = vl53l0x_write_word( dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 2288 | threshold16 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2289 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2290 | |
JerrySzczurak | 20:cf211a3b3d9e | 2291 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2292 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2293 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2294 | |
JerrySzczurak | 20:cf211a3b3d9e | 2295 | VL53L0X_Error VL53L0X::vl53l0x_get_interrupt_thresholds( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 2296 | VL53L0X_DeviceModes device_mode, FixPoint1616_t *p_threshold_low, |
JerrySzczurak | 20:cf211a3b3d9e | 2297 | FixPoint1616_t *p_threshold_high ) |
johnAlexander | 0:c523920bcc09 | 2298 | { |
johnAlexander | 16:98ce55ddbb1a | 2299 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2300 | uint16_t threshold16; |
JerrySzczurak | 20:cf211a3b3d9e | 2301 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2302 | |
johnAlexander | 15:932d8b4e52c9 | 2303 | /* no dependency on DeviceMode for Ewok */ |
johnAlexander | 15:932d8b4e52c9 | 2304 | |
JerrySzczurak | 20:cf211a3b3d9e | 2305 | status = vl53l0x_read_word( dev, VL53L0X_REG_SYSTEM_THRESH_LOW, &threshold16 ); |
johnAlexander | 15:932d8b4e52c9 | 2306 | /* Need to multiply by 2 because the FW will apply a x2 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2307 | *p_threshold_low = ( FixPoint1616_t )( ( 0x00fff & threshold16 ) << 17 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2308 | |
JerrySzczurak | 20:cf211a3b3d9e | 2309 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2310 | status = vl53l0x_read_word( dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 2311 | &threshold16 ); |
johnAlexander | 15:932d8b4e52c9 | 2312 | /* Need to multiply by 2 because the FW will apply a x2 */ |
johnAlexander | 16:98ce55ddbb1a | 2313 | *p_threshold_high = |
JerrySzczurak | 20:cf211a3b3d9e | 2314 | ( FixPoint1616_t )( ( 0x00fff & threshold16 ) << 17 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2315 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2316 | |
JerrySzczurak | 20:cf211a3b3d9e | 2317 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2318 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2319 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2320 | |
JerrySzczurak | 20:cf211a3b3d9e | 2321 | VL53L0X_Error VL53L0X::vl53l0x_load_tuning_settings( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2322 | uint8_t *p_tuning_setting_buffer ) |
johnAlexander | 0:c523920bcc09 | 2323 | { |
johnAlexander | 16:98ce55ddbb1a | 2324 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 2325 | int i; |
johnAlexander | 16:98ce55ddbb1a | 2326 | int index; |
johnAlexander | 15:932d8b4e52c9 | 2327 | uint8_t msb; |
johnAlexander | 15:932d8b4e52c9 | 2328 | uint8_t lsb; |
johnAlexander | 16:98ce55ddbb1a | 2329 | uint8_t select_param; |
johnAlexander | 16:98ce55ddbb1a | 2330 | uint8_t number_of_writes; |
johnAlexander | 16:98ce55ddbb1a | 2331 | uint8_t address; |
johnAlexander | 16:98ce55ddbb1a | 2332 | uint8_t local_buffer[4]; /* max */ |
johnAlexander | 16:98ce55ddbb1a | 2333 | uint16_t temp16; |
johnAlexander | 15:932d8b4e52c9 | 2334 | |
JerrySzczurak | 20:cf211a3b3d9e | 2335 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2336 | |
johnAlexander | 16:98ce55ddbb1a | 2337 | index = 0; |
johnAlexander | 16:98ce55ddbb1a | 2338 | |
JerrySzczurak | 20:cf211a3b3d9e | 2339 | while ( ( *( p_tuning_setting_buffer + index ) != 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 2340 | ( status == VL53L0X_ERROR_NONE ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2341 | number_of_writes = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2342 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2343 | if ( number_of_writes == 0xFF ) { |
johnAlexander | 15:932d8b4e52c9 | 2344 | /* internal parameters */ |
JerrySzczurak | 20:cf211a3b3d9e | 2345 | select_param = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2346 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2347 | switch ( select_param ) { |
johnAlexander | 15:932d8b4e52c9 | 2348 | case 0: /* uint16_t SigmaEstRefArray -> 2 bytes */ |
JerrySzczurak | 20:cf211a3b3d9e | 2349 | msb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2350 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2351 | lsb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2352 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2353 | temp16 = VL53L0X_MAKEUINT16( lsb, msb ); |
JerrySzczurak | 20:cf211a3b3d9e | 2354 | PALDevDataSet( dev, SigmaEstRefArray, temp16 ); |
johnAlexander | 15:932d8b4e52c9 | 2355 | break; |
johnAlexander | 15:932d8b4e52c9 | 2356 | case 1: /* uint16_t SigmaEstEffPulseWidth -> 2 bytes */ |
JerrySzczurak | 20:cf211a3b3d9e | 2357 | msb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2358 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2359 | lsb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2360 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2361 | temp16 = VL53L0X_MAKEUINT16( lsb, msb ); |
JerrySzczurak | 20:cf211a3b3d9e | 2362 | PALDevDataSet( dev, SigmaEstEffPulseWidth, |
JerrySzczurak | 20:cf211a3b3d9e | 2363 | temp16 ); |
johnAlexander | 15:932d8b4e52c9 | 2364 | break; |
johnAlexander | 15:932d8b4e52c9 | 2365 | case 2: /* uint16_t SigmaEstEffAmbWidth -> 2 bytes */ |
JerrySzczurak | 20:cf211a3b3d9e | 2366 | msb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2367 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2368 | lsb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2369 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2370 | temp16 = VL53L0X_MAKEUINT16( lsb, msb ); |
JerrySzczurak | 20:cf211a3b3d9e | 2371 | PALDevDataSet( dev, SigmaEstEffAmbWidth, temp16 ); |
johnAlexander | 15:932d8b4e52c9 | 2372 | break; |
johnAlexander | 15:932d8b4e52c9 | 2373 | case 3: /* uint16_t targetRefRate -> 2 bytes */ |
JerrySzczurak | 20:cf211a3b3d9e | 2374 | msb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2375 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2376 | lsb = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2377 | index++; |
JerrySzczurak | 20:cf211a3b3d9e | 2378 | temp16 = VL53L0X_MAKEUINT16( lsb, msb ); |
JerrySzczurak | 20:cf211a3b3d9e | 2379 | PALDevDataSet( dev, targetRefRate, temp16 ); |
johnAlexander | 15:932d8b4e52c9 | 2380 | break; |
johnAlexander | 15:932d8b4e52c9 | 2381 | default: /* invalid parameter */ |
johnAlexander | 16:98ce55ddbb1a | 2382 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 2383 | } |
johnAlexander | 15:932d8b4e52c9 | 2384 | |
JerrySzczurak | 20:cf211a3b3d9e | 2385 | } else if ( number_of_writes <= 4 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2386 | address = *( p_tuning_setting_buffer + index ); |
johnAlexander | 16:98ce55ddbb1a | 2387 | index++; |
johnAlexander | 16:98ce55ddbb1a | 2388 | |
JerrySzczurak | 20:cf211a3b3d9e | 2389 | for ( i = 0; i < number_of_writes; i++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2390 | local_buffer[i] = *( p_tuning_setting_buffer + |
JerrySzczurak | 20:cf211a3b3d9e | 2391 | index ); |
johnAlexander | 16:98ce55ddbb1a | 2392 | index++; |
johnAlexander | 15:932d8b4e52c9 | 2393 | } |
johnAlexander | 15:932d8b4e52c9 | 2394 | |
JerrySzczurak | 20:cf211a3b3d9e | 2395 | status = vl53l0x_write_multi( dev, address, local_buffer, |
JerrySzczurak | 20:cf211a3b3d9e | 2396 | number_of_writes ); |
johnAlexander | 15:932d8b4e52c9 | 2397 | |
johnAlexander | 15:932d8b4e52c9 | 2398 | } else { |
johnAlexander | 16:98ce55ddbb1a | 2399 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 2400 | } |
johnAlexander | 15:932d8b4e52c9 | 2401 | } |
johnAlexander | 15:932d8b4e52c9 | 2402 | |
JerrySzczurak | 20:cf211a3b3d9e | 2403 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2404 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2405 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2406 | |
JerrySzczurak | 20:cf211a3b3d9e | 2407 | VL53L0X_Error VL53L0X::vl53l0x_check_and_load_interrupt_settings( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2408 | uint8_t start_not_stopflag ) |
johnAlexander | 0:c523920bcc09 | 2409 | { |
johnAlexander | 16:98ce55ddbb1a | 2410 | uint8_t interrupt_config; |
johnAlexander | 16:98ce55ddbb1a | 2411 | FixPoint1616_t threshold_low; |
johnAlexander | 16:98ce55ddbb1a | 2412 | FixPoint1616_t threshold_high; |
johnAlexander | 16:98ce55ddbb1a | 2413 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2414 | |
JerrySzczurak | 20:cf211a3b3d9e | 2415 | interrupt_config = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2416 | Pin0GpioFunctionality ); |
JerrySzczurak | 20:cf211a3b3d9e | 2417 | |
JerrySzczurak | 20:cf211a3b3d9e | 2418 | if ( ( interrupt_config == |
JerrySzczurak | 20:cf211a3b3d9e | 2419 | VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW ) || |
JerrySzczurak | 20:cf211a3b3d9e | 2420 | ( interrupt_config == |
JerrySzczurak | 20:cf211a3b3d9e | 2421 | VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH ) || |
JerrySzczurak | 20:cf211a3b3d9e | 2422 | ( interrupt_config == |
JerrySzczurak | 20:cf211a3b3d9e | 2423 | VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2424 | |
JerrySzczurak | 20:cf211a3b3d9e | 2425 | status = vl53l0x_get_interrupt_thresholds( dev, |
johnAlexander | 16:98ce55ddbb1a | 2426 | VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, |
JerrySzczurak | 20:cf211a3b3d9e | 2427 | &threshold_low, &threshold_high ); |
JerrySzczurak | 20:cf211a3b3d9e | 2428 | |
JerrySzczurak | 20:cf211a3b3d9e | 2429 | if ( ( ( threshold_low > 255 * 65536 ) || |
JerrySzczurak | 20:cf211a3b3d9e | 2430 | ( threshold_high > 255 * 65536 ) ) && |
JerrySzczurak | 20:cf211a3b3d9e | 2431 | ( status == VL53L0X_ERROR_NONE ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2432 | |
JerrySzczurak | 20:cf211a3b3d9e | 2433 | if ( start_not_stopflag != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2434 | status = vl53l0x_load_tuning_settings( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2435 | InterruptThresholdSettings ); |
johnAlexander | 15:932d8b4e52c9 | 2436 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 2437 | status |= vl53l0x_write_byte( dev, 0xFF, 0x04 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2438 | status |= vl53l0x_write_byte( dev, 0x70, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2439 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2440 | status |= vl53l0x_write_byte( dev, 0x80, 0x00 ); |
johnAlexander | 15:932d8b4e52c9 | 2441 | } |
johnAlexander | 15:932d8b4e52c9 | 2442 | |
johnAlexander | 15:932d8b4e52c9 | 2443 | } |
johnAlexander | 15:932d8b4e52c9 | 2444 | |
johnAlexander | 15:932d8b4e52c9 | 2445 | |
johnAlexander | 15:932d8b4e52c9 | 2446 | } |
johnAlexander | 15:932d8b4e52c9 | 2447 | |
johnAlexander | 16:98ce55ddbb1a | 2448 | return status; |
johnAlexander | 0:c523920bcc09 | 2449 | |
johnAlexander | 0:c523920bcc09 | 2450 | } |
johnAlexander | 0:c523920bcc09 | 2451 | |
JerrySzczurak | 20:cf211a3b3d9e | 2452 | VL53L0X_Error VL53L0X::vl53l0x_start_measurement( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 2453 | { |
johnAlexander | 16:98ce55ddbb1a | 2454 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2455 | VL53L0X_DeviceModes device_mode; |
johnAlexander | 16:98ce55ddbb1a | 2456 | uint8_t byte; |
johnAlexander | 16:98ce55ddbb1a | 2457 | uint8_t start_stop_byte = VL53L0X_REG_SYSRANGE_MODE_START_STOP; |
johnAlexander | 16:98ce55ddbb1a | 2458 | uint32_t loop_nb; |
JerrySzczurak | 20:cf211a3b3d9e | 2459 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2460 | |
johnAlexander | 15:932d8b4e52c9 | 2461 | /* Get Current DeviceMode */ |
JerrySzczurak | 20:cf211a3b3d9e | 2462 | vl53l0x_get_device_mode( dev, &device_mode ); |
JerrySzczurak | 20:cf211a3b3d9e | 2463 | |
JerrySzczurak | 20:cf211a3b3d9e | 2464 | status = vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2465 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2466 | status = vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2467 | status = vl53l0x_write_byte( dev, 0x91, PALDevDataGet( dev, StopVariable ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 2468 | status = vl53l0x_write_byte( dev, 0x00, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2469 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2470 | status = vl53l0x_write_byte( dev, 0x80, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2471 | |
JerrySzczurak | 20:cf211a3b3d9e | 2472 | switch ( device_mode ) { |
johnAlexander | 15:932d8b4e52c9 | 2473 | case VL53L0X_DEVICEMODE_SINGLE_RANGING: |
JerrySzczurak | 20:cf211a3b3d9e | 2474 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSRANGE_START, 0x01 ); |
johnAlexander | 16:98ce55ddbb1a | 2475 | |
johnAlexander | 16:98ce55ddbb1a | 2476 | byte = start_stop_byte; |
JerrySzczurak | 20:cf211a3b3d9e | 2477 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 2478 | /* Wait until start bit has been cleared */ |
johnAlexander | 16:98ce55ddbb1a | 2479 | loop_nb = 0; |
johnAlexander | 15:932d8b4e52c9 | 2480 | do { |
JerrySzczurak | 20:cf211a3b3d9e | 2481 | if ( loop_nb > 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 2482 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2483 | VL53L0X_REG_SYSRANGE_START, &byte ); |
johnAlexander | 16:98ce55ddbb1a | 2484 | loop_nb = loop_nb + 1; |
JerrySzczurak | 20:cf211a3b3d9e | 2485 | } while ( ( ( byte & start_stop_byte ) == start_stop_byte ) |
JerrySzczurak | 20:cf211a3b3d9e | 2486 | && ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2487 | && ( loop_nb < VL53L0X_DEFAULT_MAX_LOOP ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 2488 | |
JerrySzczurak | 20:cf211a3b3d9e | 2489 | if ( loop_nb >= VL53L0X_DEFAULT_MAX_LOOP ) |
johnAlexander | 16:98ce55ddbb1a | 2490 | status = VL53L0X_ERROR_TIME_OUT; |
johnAlexander | 15:932d8b4e52c9 | 2491 | |
johnAlexander | 15:932d8b4e52c9 | 2492 | } |
johnAlexander | 15:932d8b4e52c9 | 2493 | |
johnAlexander | 15:932d8b4e52c9 | 2494 | break; |
johnAlexander | 15:932d8b4e52c9 | 2495 | case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: |
johnAlexander | 15:932d8b4e52c9 | 2496 | /* Back-to-back mode */ |
johnAlexander | 15:932d8b4e52c9 | 2497 | |
johnAlexander | 15:932d8b4e52c9 | 2498 | /* Check if need to apply interrupt settings */ |
JerrySzczurak | 20:cf211a3b3d9e | 2499 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2500 | status = vl53l0x_check_and_load_interrupt_settings( dev, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2501 | |
JerrySzczurak | 20:cf211a3b3d9e | 2502 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2503 | VL53L0X_REG_SYSRANGE_START, |
JerrySzczurak | 20:cf211a3b3d9e | 2504 | VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK ); |
JerrySzczurak | 20:cf211a3b3d9e | 2505 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 2506 | /* Set PAL State to Running */ |
JerrySzczurak | 20:cf211a3b3d9e | 2507 | PALDevDataSet( dev, PalState, VL53L0X_STATE_RUNNING ); |
johnAlexander | 15:932d8b4e52c9 | 2508 | } |
johnAlexander | 15:932d8b4e52c9 | 2509 | break; |
johnAlexander | 15:932d8b4e52c9 | 2510 | case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: |
johnAlexander | 15:932d8b4e52c9 | 2511 | /* Continuous mode */ |
johnAlexander | 15:932d8b4e52c9 | 2512 | /* Check if need to apply interrupt settings */ |
JerrySzczurak | 20:cf211a3b3d9e | 2513 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2514 | status = vl53l0x_check_and_load_interrupt_settings( dev, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2515 | |
JerrySzczurak | 20:cf211a3b3d9e | 2516 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2517 | VL53L0X_REG_SYSRANGE_START, |
JerrySzczurak | 20:cf211a3b3d9e | 2518 | VL53L0X_REG_SYSRANGE_MODE_TIMED ); |
JerrySzczurak | 20:cf211a3b3d9e | 2519 | |
JerrySzczurak | 20:cf211a3b3d9e | 2520 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 2521 | /* Set PAL State to Running */ |
JerrySzczurak | 20:cf211a3b3d9e | 2522 | PALDevDataSet( dev, PalState, VL53L0X_STATE_RUNNING ); |
johnAlexander | 15:932d8b4e52c9 | 2523 | } |
johnAlexander | 15:932d8b4e52c9 | 2524 | break; |
johnAlexander | 15:932d8b4e52c9 | 2525 | default: |
johnAlexander | 15:932d8b4e52c9 | 2526 | /* Selected mode not supported */ |
johnAlexander | 16:98ce55ddbb1a | 2527 | status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; |
johnAlexander | 15:932d8b4e52c9 | 2528 | } |
johnAlexander | 15:932d8b4e52c9 | 2529 | |
johnAlexander | 15:932d8b4e52c9 | 2530 | |
JerrySzczurak | 20:cf211a3b3d9e | 2531 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 2532 | return status; |
johnAlexander | 0:c523920bcc09 | 2533 | } |
johnAlexander | 0:c523920bcc09 | 2534 | |
johnAlexander | 0:c523920bcc09 | 2535 | /* Group PAL Measurement Functions */ |
JerrySzczurak | 20:cf211a3b3d9e | 2536 | VL53L0X_Error VL53L0X::vl53l0x_perform_single_measurement( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 2537 | { |
johnAlexander | 16:98ce55ddbb1a | 2538 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2539 | VL53L0X_DeviceModes device_mode; |
johnAlexander | 15:932d8b4e52c9 | 2540 | |
JerrySzczurak | 20:cf211a3b3d9e | 2541 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2542 | |
johnAlexander | 15:932d8b4e52c9 | 2543 | /* Get Current DeviceMode */ |
JerrySzczurak | 20:cf211a3b3d9e | 2544 | status = vl53l0x_get_device_mode( dev, &device_mode ); |
johnAlexander | 15:932d8b4e52c9 | 2545 | |
johnAlexander | 15:932d8b4e52c9 | 2546 | /* Start immediately to run a single ranging measurement in case of |
johnAlexander | 15:932d8b4e52c9 | 2547 | * single ranging or single histogram */ |
JerrySzczurak | 20:cf211a3b3d9e | 2548 | if ( status == VL53L0X_ERROR_NONE |
JerrySzczurak | 20:cf211a3b3d9e | 2549 | && device_mode == VL53L0X_DEVICEMODE_SINGLE_RANGING ) |
JerrySzczurak | 20:cf211a3b3d9e | 2550 | status = vl53l0x_start_measurement( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 2551 | |
JerrySzczurak | 20:cf211a3b3d9e | 2552 | |
JerrySzczurak | 20:cf211a3b3d9e | 2553 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 2554 | status = vl53l0x_measurement_poll_for_completion( dev ); |
johnAlexander | 15:932d8b4e52c9 | 2555 | |
johnAlexander | 15:932d8b4e52c9 | 2556 | |
johnAlexander | 15:932d8b4e52c9 | 2557 | /* Change PAL State in case of single ranging or single histogram */ |
JerrySzczurak | 20:cf211a3b3d9e | 2558 | if ( status == VL53L0X_ERROR_NONE |
JerrySzczurak | 20:cf211a3b3d9e | 2559 | && device_mode == VL53L0X_DEVICEMODE_SINGLE_RANGING ) |
JerrySzczurak | 20:cf211a3b3d9e | 2560 | PALDevDataSet( dev, PalState, VL53L0X_STATE_IDLE ); |
JerrySzczurak | 20:cf211a3b3d9e | 2561 | |
JerrySzczurak | 20:cf211a3b3d9e | 2562 | |
JerrySzczurak | 20:cf211a3b3d9e | 2563 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2564 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2565 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2566 | |
JerrySzczurak | 20:cf211a3b3d9e | 2567 | VL53L0X_Error VL53L0X::vl53l0x_get_x_talk_compensation_enable( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 2568 | uint8_t *p_x_talk_compensation_enable ) |
johnAlexander | 0:c523920bcc09 | 2569 | { |
johnAlexander | 16:98ce55ddbb1a | 2570 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2571 | uint8_t temp8; |
JerrySzczurak | 20:cf211a3b3d9e | 2572 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 2573 | |
JerrySzczurak | 20:cf211a3b3d9e | 2574 | VL53L0X_GETPARAMETERFIELD( dev, XTalkCompensationEnable, temp8 ); |
johnAlexander | 16:98ce55ddbb1a | 2575 | *p_x_talk_compensation_enable = temp8; |
johnAlexander | 16:98ce55ddbb1a | 2576 | |
JerrySzczurak | 20:cf211a3b3d9e | 2577 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2578 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2579 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2580 | |
JerrySzczurak | 20:cf211a3b3d9e | 2581 | VL53L0X_Error VL53L0X::vl53l0x_get_total_xtalk_rate( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 2582 | VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data, |
JerrySzczurak | 20:cf211a3b3d9e | 2583 | FixPoint1616_t *p_total_xtalk_rate_mcps ) |
johnAlexander | 0:c523920bcc09 | 2584 | { |
johnAlexander | 16:98ce55ddbb1a | 2585 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2586 | |
johnAlexander | 16:98ce55ddbb1a | 2587 | uint8_t xtalk_comp_enable; |
johnAlexander | 16:98ce55ddbb1a | 2588 | FixPoint1616_t total_xtalk_mega_cps; |
johnAlexander | 16:98ce55ddbb1a | 2589 | FixPoint1616_t xtalk_per_spad_mega_cps; |
johnAlexander | 16:98ce55ddbb1a | 2590 | |
johnAlexander | 16:98ce55ddbb1a | 2591 | *p_total_xtalk_rate_mcps = 0; |
johnAlexander | 16:98ce55ddbb1a | 2592 | |
JerrySzczurak | 20:cf211a3b3d9e | 2593 | status = vl53l0x_get_x_talk_compensation_enable( dev, &xtalk_comp_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 2594 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2595 | |
JerrySzczurak | 20:cf211a3b3d9e | 2596 | if ( xtalk_comp_enable ) { |
johnAlexander | 15:932d8b4e52c9 | 2597 | |
johnAlexander | 15:932d8b4e52c9 | 2598 | VL53L0X_GETPARAMETERFIELD( |
johnAlexander | 16:98ce55ddbb1a | 2599 | dev, |
johnAlexander | 15:932d8b4e52c9 | 2600 | XTalkCompensationRateMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 2601 | xtalk_per_spad_mega_cps ); |
johnAlexander | 15:932d8b4e52c9 | 2602 | |
johnAlexander | 15:932d8b4e52c9 | 2603 | /* FixPoint1616 * FixPoint 8:8 = FixPoint0824 */ |
johnAlexander | 16:98ce55ddbb1a | 2604 | total_xtalk_mega_cps = |
johnAlexander | 16:98ce55ddbb1a | 2605 | p_ranging_measurement_data->EffectiveSpadRtnCount * |
johnAlexander | 16:98ce55ddbb1a | 2606 | xtalk_per_spad_mega_cps; |
johnAlexander | 15:932d8b4e52c9 | 2607 | |
johnAlexander | 15:932d8b4e52c9 | 2608 | /* FixPoint0824 >> 8 = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 2609 | *p_total_xtalk_rate_mcps = |
JerrySzczurak | 20:cf211a3b3d9e | 2610 | ( total_xtalk_mega_cps + 0x80 ) >> 8; |
johnAlexander | 15:932d8b4e52c9 | 2611 | } |
johnAlexander | 15:932d8b4e52c9 | 2612 | } |
johnAlexander | 15:932d8b4e52c9 | 2613 | |
johnAlexander | 16:98ce55ddbb1a | 2614 | return status; |
johnAlexander | 0:c523920bcc09 | 2615 | } |
johnAlexander | 0:c523920bcc09 | 2616 | |
JerrySzczurak | 20:cf211a3b3d9e | 2617 | VL53L0X_Error VL53L0X::vl53l0x_get_total_signal_rate( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 2618 | VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data, |
JerrySzczurak | 20:cf211a3b3d9e | 2619 | FixPoint1616_t *p_total_signal_rate_mcps ) |
johnAlexander | 0:c523920bcc09 | 2620 | { |
johnAlexander | 16:98ce55ddbb1a | 2621 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 2622 | FixPoint1616_t total_xtalk_mega_cps; |
johnAlexander | 15:932d8b4e52c9 | 2623 | |
JerrySzczurak | 20:cf211a3b3d9e | 2624 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2625 | |
johnAlexander | 16:98ce55ddbb1a | 2626 | *p_total_signal_rate_mcps = |
johnAlexander | 16:98ce55ddbb1a | 2627 | p_ranging_measurement_data->SignalRateRtnMegaCps; |
johnAlexander | 16:98ce55ddbb1a | 2628 | |
johnAlexander | 16:98ce55ddbb1a | 2629 | status = vl53l0x_get_total_xtalk_rate( |
JerrySzczurak | 20:cf211a3b3d9e | 2630 | dev, p_ranging_measurement_data, &total_xtalk_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 2631 | |
JerrySzczurak | 20:cf211a3b3d9e | 2632 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 2633 | *p_total_signal_rate_mcps += total_xtalk_mega_cps; |
johnAlexander | 16:98ce55ddbb1a | 2634 | |
johnAlexander | 16:98ce55ddbb1a | 2635 | return status; |
johnAlexander | 0:c523920bcc09 | 2636 | } |
johnAlexander | 0:c523920bcc09 | 2637 | |
johnAlexander | 0:c523920bcc09 | 2638 | /* To convert ms into register value */ |
JerrySzczurak | 20:cf211a3b3d9e | 2639 | uint32_t VL53L0X::vl53l0x_calc_timeout_mclks( VL53L0X_DEV dev, |
johnAlexander | 15:932d8b4e52c9 | 2640 | uint32_t timeout_period_us, |
JerrySzczurak | 20:cf211a3b3d9e | 2641 | uint8_t vcsel_period_pclks ) |
johnAlexander | 0:c523920bcc09 | 2642 | { |
johnAlexander | 15:932d8b4e52c9 | 2643 | uint32_t macro_period_ps; |
johnAlexander | 15:932d8b4e52c9 | 2644 | uint32_t macro_period_ns; |
johnAlexander | 15:932d8b4e52c9 | 2645 | uint32_t timeout_period_mclks = 0; |
johnAlexander | 15:932d8b4e52c9 | 2646 | |
JerrySzczurak | 20:cf211a3b3d9e | 2647 | macro_period_ps = vl53l0x_calc_macro_period_ps( dev, vcsel_period_pclks ); |
JerrySzczurak | 20:cf211a3b3d9e | 2648 | macro_period_ns = ( macro_period_ps + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 2649 | |
johnAlexander | 15:932d8b4e52c9 | 2650 | timeout_period_mclks = |
JerrySzczurak | 20:cf211a3b3d9e | 2651 | ( uint32_t ) ( ( ( timeout_period_us * 1000 ) |
JerrySzczurak | 20:cf211a3b3d9e | 2652 | + ( macro_period_ns / 2 ) ) / macro_period_ns ); |
johnAlexander | 0:c523920bcc09 | 2653 | |
johnAlexander | 0:c523920bcc09 | 2654 | return timeout_period_mclks; |
johnAlexander | 0:c523920bcc09 | 2655 | } |
johnAlexander | 0:c523920bcc09 | 2656 | |
JerrySzczurak | 20:cf211a3b3d9e | 2657 | uint32_t VL53L0X::vl53l0x_isqrt( uint32_t num ) |
johnAlexander | 0:c523920bcc09 | 2658 | { |
johnAlexander | 15:932d8b4e52c9 | 2659 | /* |
johnAlexander | 15:932d8b4e52c9 | 2660 | * Implements an integer square root |
johnAlexander | 15:932d8b4e52c9 | 2661 | * |
johnAlexander | 15:932d8b4e52c9 | 2662 | * From: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots |
johnAlexander | 15:932d8b4e52c9 | 2663 | */ |
johnAlexander | 15:932d8b4e52c9 | 2664 | |
johnAlexander | 15:932d8b4e52c9 | 2665 | uint32_t res = 0; |
johnAlexander | 15:932d8b4e52c9 | 2666 | uint32_t bit = 1 << 30; |
johnAlexander | 15:932d8b4e52c9 | 2667 | /* The second-to-top bit is set: |
johnAlexander | 15:932d8b4e52c9 | 2668 | * 1 << 14 for 16-bits, 1 << 30 for 32 bits */ |
johnAlexander | 15:932d8b4e52c9 | 2669 | |
johnAlexander | 15:932d8b4e52c9 | 2670 | /* "bit" starts at the highest power of four <= the argument. */ |
JerrySzczurak | 20:cf211a3b3d9e | 2671 | while ( bit > num ) |
johnAlexander | 15:932d8b4e52c9 | 2672 | bit >>= 2; |
johnAlexander | 15:932d8b4e52c9 | 2673 | |
johnAlexander | 15:932d8b4e52c9 | 2674 | |
JerrySzczurak | 20:cf211a3b3d9e | 2675 | while ( bit != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 2676 | if ( num >= res + bit ) { |
johnAlexander | 15:932d8b4e52c9 | 2677 | num -= res + bit; |
JerrySzczurak | 20:cf211a3b3d9e | 2678 | res = ( res >> 1 ) + bit; |
johnAlexander | 15:932d8b4e52c9 | 2679 | } else |
johnAlexander | 15:932d8b4e52c9 | 2680 | res >>= 1; |
johnAlexander | 15:932d8b4e52c9 | 2681 | |
johnAlexander | 15:932d8b4e52c9 | 2682 | bit >>= 2; |
johnAlexander | 15:932d8b4e52c9 | 2683 | } |
johnAlexander | 15:932d8b4e52c9 | 2684 | |
johnAlexander | 15:932d8b4e52c9 | 2685 | return res; |
johnAlexander | 0:c523920bcc09 | 2686 | } |
johnAlexander | 0:c523920bcc09 | 2687 | |
JerrySzczurak | 20:cf211a3b3d9e | 2688 | uint32_t VL53L0X::vl53l0x_quadrature_sum( uint32_t a, uint32_t b ) |
JerrySzczurak | 20:cf211a3b3d9e | 2689 | { |
JerrySzczurak | 20:cf211a3b3d9e | 2690 | /* |
JerrySzczurak | 20:cf211a3b3d9e | 2691 | * Implements a quadrature sum |
JerrySzczurak | 20:cf211a3b3d9e | 2692 | * |
JerrySzczurak | 20:cf211a3b3d9e | 2693 | * rea = sqrt(a^2 + b^2) |
JerrySzczurak | 20:cf211a3b3d9e | 2694 | * |
JerrySzczurak | 20:cf211a3b3d9e | 2695 | * Trap overflow case max input value is 65535 (16-bit value) |
JerrySzczurak | 20:cf211a3b3d9e | 2696 | * as internal calc are 32-bit wide |
JerrySzczurak | 20:cf211a3b3d9e | 2697 | * |
JerrySzczurak | 20:cf211a3b3d9e | 2698 | * If overflow then seta output to maximum |
JerrySzczurak | 20:cf211a3b3d9e | 2699 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 2700 | uint32_t res = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 2701 | |
JerrySzczurak | 20:cf211a3b3d9e | 2702 | if ( a > 65535 || b > 65535 ) |
JerrySzczurak | 20:cf211a3b3d9e | 2703 | res = 65535; |
JerrySzczurak | 20:cf211a3b3d9e | 2704 | else |
JerrySzczurak | 20:cf211a3b3d9e | 2705 | res = vl53l0x_isqrt( a * a + b * b ); |
JerrySzczurak | 20:cf211a3b3d9e | 2706 | |
JerrySzczurak | 20:cf211a3b3d9e | 2707 | return res; |
JerrySzczurak | 20:cf211a3b3d9e | 2708 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2709 | |
johnAlexander | 16:98ce55ddbb1a | 2710 | VL53L0X_Error VL53L0X::vl53l0x_calc_dmax( |
johnAlexander | 16:98ce55ddbb1a | 2711 | VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 2712 | FixPoint1616_t total_signal_rate_mcps, |
johnAlexander | 16:98ce55ddbb1a | 2713 | FixPoint1616_t total_corr_signal_rate_mcps, |
johnAlexander | 16:98ce55ddbb1a | 2714 | FixPoint1616_t pw_mult, |
johnAlexander | 16:98ce55ddbb1a | 2715 | uint32_t sigma_estimate_p1, |
johnAlexander | 16:98ce55ddbb1a | 2716 | FixPoint1616_t sigma_estimate_p2, |
johnAlexander | 16:98ce55ddbb1a | 2717 | uint32_t peak_vcsel_duration_us, |
JerrySzczurak | 20:cf211a3b3d9e | 2718 | uint32_t *pd_max_mm ) |
johnAlexander | 0:c523920bcc09 | 2719 | { |
johnAlexander | 16:98ce55ddbb1a | 2720 | const uint32_t c_sigma_limit = 18; |
johnAlexander | 16:98ce55ddbb1a | 2721 | const FixPoint1616_t c_signal_limit = 0x4000; /* 0.25 */ |
johnAlexander | 16:98ce55ddbb1a | 2722 | const FixPoint1616_t c_sigma_est_ref = 0x00000042; /* 0.001 */ |
johnAlexander | 16:98ce55ddbb1a | 2723 | const uint32_t c_amb_eff_width_sigma_est_ns = 6; |
johnAlexander | 16:98ce55ddbb1a | 2724 | const uint32_t c_amb_eff_width_d_max_ns = 7; |
johnAlexander | 16:98ce55ddbb1a | 2725 | uint32_t dmax_cal_range_mm; |
johnAlexander | 16:98ce55ddbb1a | 2726 | FixPoint1616_t dmax_cal_signal_rate_rtn_mcps; |
johnAlexander | 16:98ce55ddbb1a | 2727 | FixPoint1616_t min_signal_needed; |
johnAlexander | 16:98ce55ddbb1a | 2728 | FixPoint1616_t min_signal_needed_p1; |
johnAlexander | 16:98ce55ddbb1a | 2729 | FixPoint1616_t min_signal_needed_p2; |
johnAlexander | 16:98ce55ddbb1a | 2730 | FixPoint1616_t min_signal_needed_p3; |
johnAlexander | 16:98ce55ddbb1a | 2731 | FixPoint1616_t min_signal_needed_p4; |
johnAlexander | 16:98ce55ddbb1a | 2732 | FixPoint1616_t sigma_limit_tmp; |
johnAlexander | 16:98ce55ddbb1a | 2733 | FixPoint1616_t sigma_est_sq_tmp; |
johnAlexander | 16:98ce55ddbb1a | 2734 | FixPoint1616_t signal_limit_tmp; |
johnAlexander | 16:98ce55ddbb1a | 2735 | FixPoint1616_t signal_at0_mm; |
johnAlexander | 16:98ce55ddbb1a | 2736 | FixPoint1616_t dmax_dark; |
johnAlexander | 16:98ce55ddbb1a | 2737 | FixPoint1616_t dmax_ambient; |
johnAlexander | 16:98ce55ddbb1a | 2738 | FixPoint1616_t dmax_dark_tmp; |
johnAlexander | 16:98ce55ddbb1a | 2739 | FixPoint1616_t sigma_est_p2_tmp; |
johnAlexander | 16:98ce55ddbb1a | 2740 | uint32_t signal_rate_temp_mcps; |
johnAlexander | 16:98ce55ddbb1a | 2741 | |
johnAlexander | 16:98ce55ddbb1a | 2742 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 2743 | |
JerrySzczurak | 20:cf211a3b3d9e | 2744 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 2745 | |
johnAlexander | 16:98ce55ddbb1a | 2746 | dmax_cal_range_mm = |
JerrySzczurak | 20:cf211a3b3d9e | 2747 | PALDevDataGet( dev, DmaxCalRangeMilliMeter ); |
johnAlexander | 16:98ce55ddbb1a | 2748 | |
johnAlexander | 16:98ce55ddbb1a | 2749 | dmax_cal_signal_rate_rtn_mcps = |
JerrySzczurak | 20:cf211a3b3d9e | 2750 | PALDevDataGet( dev, DmaxCalSignalRateRtnMegaCps ); |
johnAlexander | 15:932d8b4e52c9 | 2751 | |
johnAlexander | 15:932d8b4e52c9 | 2752 | /* uint32 * FixPoint1616 = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 2753 | signal_at0_mm = dmax_cal_range_mm * dmax_cal_signal_rate_rtn_mcps; |
johnAlexander | 15:932d8b4e52c9 | 2754 | |
johnAlexander | 15:932d8b4e52c9 | 2755 | /* FixPoint1616 >> 8 = FixPoint2408 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2756 | signal_at0_mm = ( signal_at0_mm + 0x80 ) >> 8; |
johnAlexander | 16:98ce55ddbb1a | 2757 | signal_at0_mm *= dmax_cal_range_mm; |
johnAlexander | 16:98ce55ddbb1a | 2758 | |
johnAlexander | 16:98ce55ddbb1a | 2759 | min_signal_needed_p1 = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 2760 | if ( total_corr_signal_rate_mcps > 0 ) { |
johnAlexander | 15:932d8b4e52c9 | 2761 | |
johnAlexander | 15:932d8b4e52c9 | 2762 | /* Shift by 10 bits to increase resolution prior to the |
johnAlexander | 15:932d8b4e52c9 | 2763 | * division */ |
johnAlexander | 16:98ce55ddbb1a | 2764 | signal_rate_temp_mcps = total_signal_rate_mcps << 10; |
johnAlexander | 15:932d8b4e52c9 | 2765 | |
johnAlexander | 15:932d8b4e52c9 | 2766 | /* Add rounding value prior to division */ |
johnAlexander | 16:98ce55ddbb1a | 2767 | min_signal_needed_p1 = signal_rate_temp_mcps + |
JerrySzczurak | 20:cf211a3b3d9e | 2768 | ( total_corr_signal_rate_mcps / 2 ); |
johnAlexander | 15:932d8b4e52c9 | 2769 | |
johnAlexander | 15:932d8b4e52c9 | 2770 | /* FixPoint0626/FixPoint1616 = FixPoint2210 */ |
johnAlexander | 16:98ce55ddbb1a | 2771 | min_signal_needed_p1 /= total_corr_signal_rate_mcps; |
johnAlexander | 15:932d8b4e52c9 | 2772 | |
johnAlexander | 15:932d8b4e52c9 | 2773 | /* Apply a factored version of the speed of light. |
johnAlexander | 15:932d8b4e52c9 | 2774 | Correction to be applied at the end */ |
johnAlexander | 16:98ce55ddbb1a | 2775 | min_signal_needed_p1 *= 3; |
johnAlexander | 15:932d8b4e52c9 | 2776 | |
johnAlexander | 15:932d8b4e52c9 | 2777 | /* FixPoint2210 * FixPoint2210 = FixPoint1220 */ |
johnAlexander | 16:98ce55ddbb1a | 2778 | min_signal_needed_p1 *= min_signal_needed_p1; |
johnAlexander | 15:932d8b4e52c9 | 2779 | |
johnAlexander | 15:932d8b4e52c9 | 2780 | /* FixPoint1220 >> 16 = FixPoint2804 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2781 | min_signal_needed_p1 = ( min_signal_needed_p1 + 0x8000 ) >> 16; |
johnAlexander | 15:932d8b4e52c9 | 2782 | } |
johnAlexander | 15:932d8b4e52c9 | 2783 | |
johnAlexander | 16:98ce55ddbb1a | 2784 | min_signal_needed_p2 = pw_mult * sigma_estimate_p1; |
johnAlexander | 15:932d8b4e52c9 | 2785 | |
johnAlexander | 15:932d8b4e52c9 | 2786 | /* FixPoint1616 >> 16 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2787 | min_signal_needed_p2 = ( min_signal_needed_p2 + 0x8000 ) >> 16; |
johnAlexander | 15:932d8b4e52c9 | 2788 | |
johnAlexander | 15:932d8b4e52c9 | 2789 | /* uint32 * uint32 = uint32 */ |
johnAlexander | 16:98ce55ddbb1a | 2790 | min_signal_needed_p2 *= min_signal_needed_p2; |
johnAlexander | 15:932d8b4e52c9 | 2791 | |
johnAlexander | 15:932d8b4e52c9 | 2792 | /* Check sigmaEstimateP2 |
johnAlexander | 15:932d8b4e52c9 | 2793 | * If this value is too high there is not enough signal rate |
johnAlexander | 15:932d8b4e52c9 | 2794 | * to calculate dmax value so set a suitable value to ensure |
johnAlexander | 15:932d8b4e52c9 | 2795 | * a very small dmax. |
johnAlexander | 15:932d8b4e52c9 | 2796 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 2797 | sigma_est_p2_tmp = ( sigma_estimate_p2 + 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 2798 | sigma_est_p2_tmp = ( sigma_est_p2_tmp + c_amb_eff_width_sigma_est_ns / 2 ) / |
johnAlexander | 16:98ce55ddbb1a | 2799 | c_amb_eff_width_sigma_est_ns; |
johnAlexander | 16:98ce55ddbb1a | 2800 | sigma_est_p2_tmp *= c_amb_eff_width_d_max_ns; |
johnAlexander | 16:98ce55ddbb1a | 2801 | |
JerrySzczurak | 20:cf211a3b3d9e | 2802 | if ( sigma_est_p2_tmp > 0xffff ) { |
johnAlexander | 16:98ce55ddbb1a | 2803 | min_signal_needed_p3 = 0xfff00000; |
johnAlexander | 15:932d8b4e52c9 | 2804 | } else { |
johnAlexander | 15:932d8b4e52c9 | 2805 | |
johnAlexander | 15:932d8b4e52c9 | 2806 | /* DMAX uses a different ambient width from sigma, so apply |
johnAlexander | 15:932d8b4e52c9 | 2807 | * correction. |
johnAlexander | 15:932d8b4e52c9 | 2808 | * Perform division before multiplication to prevent overflow. |
johnAlexander | 15:932d8b4e52c9 | 2809 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 2810 | sigma_estimate_p2 = ( sigma_estimate_p2 + c_amb_eff_width_sigma_est_ns / 2 ) / |
johnAlexander | 16:98ce55ddbb1a | 2811 | c_amb_eff_width_sigma_est_ns; |
johnAlexander | 16:98ce55ddbb1a | 2812 | sigma_estimate_p2 *= c_amb_eff_width_d_max_ns; |
johnAlexander | 15:932d8b4e52c9 | 2813 | |
johnAlexander | 15:932d8b4e52c9 | 2814 | /* FixPoint1616 >> 16 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2815 | min_signal_needed_p3 = ( sigma_estimate_p2 + 0x8000 ) >> 16; |
johnAlexander | 16:98ce55ddbb1a | 2816 | |
johnAlexander | 16:98ce55ddbb1a | 2817 | min_signal_needed_p3 *= min_signal_needed_p3; |
johnAlexander | 15:932d8b4e52c9 | 2818 | |
johnAlexander | 15:932d8b4e52c9 | 2819 | } |
johnAlexander | 15:932d8b4e52c9 | 2820 | |
johnAlexander | 15:932d8b4e52c9 | 2821 | /* FixPoint1814 / uint32 = FixPoint1814 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2822 | sigma_limit_tmp = ( ( c_sigma_limit << 14 ) + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 2823 | |
johnAlexander | 15:932d8b4e52c9 | 2824 | /* FixPoint1814 * FixPoint1814 = FixPoint3628 := FixPoint0428 */ |
johnAlexander | 16:98ce55ddbb1a | 2825 | sigma_limit_tmp *= sigma_limit_tmp; |
johnAlexander | 15:932d8b4e52c9 | 2826 | |
johnAlexander | 15:932d8b4e52c9 | 2827 | /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ |
johnAlexander | 16:98ce55ddbb1a | 2828 | sigma_est_sq_tmp = c_sigma_est_ref * c_sigma_est_ref; |
johnAlexander | 15:932d8b4e52c9 | 2829 | |
johnAlexander | 15:932d8b4e52c9 | 2830 | /* FixPoint3232 >> 4 = FixPoint0428 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2831 | sigma_est_sq_tmp = ( sigma_est_sq_tmp + 0x08 ) >> 4; |
johnAlexander | 15:932d8b4e52c9 | 2832 | |
johnAlexander | 15:932d8b4e52c9 | 2833 | /* FixPoint0428 - FixPoint0428 = FixPoint0428 */ |
johnAlexander | 16:98ce55ddbb1a | 2834 | sigma_limit_tmp -= sigma_est_sq_tmp; |
johnAlexander | 15:932d8b4e52c9 | 2835 | |
johnAlexander | 15:932d8b4e52c9 | 2836 | /* uint32_t * FixPoint0428 = FixPoint0428 */ |
johnAlexander | 16:98ce55ddbb1a | 2837 | min_signal_needed_p4 = 4 * 12 * sigma_limit_tmp; |
johnAlexander | 15:932d8b4e52c9 | 2838 | |
johnAlexander | 15:932d8b4e52c9 | 2839 | /* FixPoint0428 >> 14 = FixPoint1814 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2840 | min_signal_needed_p4 = ( min_signal_needed_p4 + 0x2000 ) >> 14; |
johnAlexander | 15:932d8b4e52c9 | 2841 | |
johnAlexander | 15:932d8b4e52c9 | 2842 | /* uint32 + uint32 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2843 | min_signal_needed = ( min_signal_needed_p2 + min_signal_needed_p3 ); |
johnAlexander | 15:932d8b4e52c9 | 2844 | |
johnAlexander | 15:932d8b4e52c9 | 2845 | /* uint32 / uint32 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2846 | min_signal_needed += ( peak_vcsel_duration_us / 2 ); |
johnAlexander | 16:98ce55ddbb1a | 2847 | min_signal_needed /= peak_vcsel_duration_us; |
johnAlexander | 15:932d8b4e52c9 | 2848 | |
johnAlexander | 15:932d8b4e52c9 | 2849 | /* uint32 << 14 = FixPoint1814 */ |
johnAlexander | 16:98ce55ddbb1a | 2850 | min_signal_needed <<= 14; |
johnAlexander | 15:932d8b4e52c9 | 2851 | |
johnAlexander | 15:932d8b4e52c9 | 2852 | /* FixPoint1814 / FixPoint1814 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2853 | min_signal_needed += ( min_signal_needed_p4 / 2 ); |
johnAlexander | 16:98ce55ddbb1a | 2854 | min_signal_needed /= min_signal_needed_p4; |
johnAlexander | 15:932d8b4e52c9 | 2855 | |
johnAlexander | 15:932d8b4e52c9 | 2856 | /* FixPoint3200 * FixPoint2804 := FixPoint2804*/ |
johnAlexander | 16:98ce55ddbb1a | 2857 | min_signal_needed *= min_signal_needed_p1; |
johnAlexander | 15:932d8b4e52c9 | 2858 | |
johnAlexander | 15:932d8b4e52c9 | 2859 | /* Apply correction by dividing by 1000000. |
johnAlexander | 15:932d8b4e52c9 | 2860 | * This assumes 10E16 on the numerator of the equation |
johnAlexander | 15:932d8b4e52c9 | 2861 | * and 10E-22 on the denominator. |
johnAlexander | 15:932d8b4e52c9 | 2862 | * We do this because 32bit fix point calculation can't |
johnAlexander | 15:932d8b4e52c9 | 2863 | * handle the larger and smaller elements of this equation, |
johnAlexander | 15:932d8b4e52c9 | 2864 | * i.e. speed of light and pulse widths. |
johnAlexander | 15:932d8b4e52c9 | 2865 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 2866 | min_signal_needed = ( min_signal_needed + 500 ) / 1000; |
johnAlexander | 16:98ce55ddbb1a | 2867 | min_signal_needed <<= 4; |
johnAlexander | 16:98ce55ddbb1a | 2868 | |
JerrySzczurak | 20:cf211a3b3d9e | 2869 | min_signal_needed = ( min_signal_needed + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 2870 | |
johnAlexander | 15:932d8b4e52c9 | 2871 | /* FixPoint1616 >> 8 = FixPoint2408 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2872 | signal_limit_tmp = ( c_signal_limit + 0x80 ) >> 8; |
johnAlexander | 15:932d8b4e52c9 | 2873 | |
johnAlexander | 15:932d8b4e52c9 | 2874 | /* FixPoint2408/FixPoint2408 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2875 | if ( signal_limit_tmp != 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 2876 | dmax_dark_tmp = ( signal_at0_mm + ( signal_limit_tmp / 2 ) ) |
johnAlexander | 16:98ce55ddbb1a | 2877 | / signal_limit_tmp; |
johnAlexander | 15:932d8b4e52c9 | 2878 | else |
johnAlexander | 16:98ce55ddbb1a | 2879 | dmax_dark_tmp = 0; |
johnAlexander | 16:98ce55ddbb1a | 2880 | |
JerrySzczurak | 20:cf211a3b3d9e | 2881 | dmax_dark = vl53l0x_isqrt( dmax_dark_tmp ); |
johnAlexander | 15:932d8b4e52c9 | 2882 | |
johnAlexander | 15:932d8b4e52c9 | 2883 | /* FixPoint2408/FixPoint2408 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 2884 | if ( min_signal_needed != 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 2885 | dmax_ambient = ( signal_at0_mm + min_signal_needed / 2 ) |
johnAlexander | 16:98ce55ddbb1a | 2886 | / min_signal_needed; |
johnAlexander | 15:932d8b4e52c9 | 2887 | else |
johnAlexander | 16:98ce55ddbb1a | 2888 | dmax_ambient = 0; |
johnAlexander | 16:98ce55ddbb1a | 2889 | |
JerrySzczurak | 20:cf211a3b3d9e | 2890 | dmax_ambient = vl53l0x_isqrt( dmax_ambient ); |
johnAlexander | 16:98ce55ddbb1a | 2891 | |
johnAlexander | 16:98ce55ddbb1a | 2892 | *pd_max_mm = dmax_dark; |
JerrySzczurak | 20:cf211a3b3d9e | 2893 | if ( dmax_dark > dmax_ambient ) |
johnAlexander | 16:98ce55ddbb1a | 2894 | *pd_max_mm = dmax_ambient; |
johnAlexander | 16:98ce55ddbb1a | 2895 | |
JerrySzczurak | 20:cf211a3b3d9e | 2896 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 2897 | |
JerrySzczurak | 20:cf211a3b3d9e | 2898 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 2899 | } |
JerrySzczurak | 20:cf211a3b3d9e | 2900 | |
JerrySzczurak | 20:cf211a3b3d9e | 2901 | VL53L0X_Error VL53L0X::vl53l0x_calc_sigma_estimate( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 2902 | VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data, |
johnAlexander | 16:98ce55ddbb1a | 2903 | FixPoint1616_t *p_sigma_estimate, |
JerrySzczurak | 20:cf211a3b3d9e | 2904 | uint32_t *p_dmax_mm ) |
johnAlexander | 0:c523920bcc09 | 2905 | { |
johnAlexander | 15:932d8b4e52c9 | 2906 | /* Expressed in 100ths of a ns, i.e. centi-ns */ |
johnAlexander | 16:98ce55ddbb1a | 2907 | const uint32_t c_pulse_effective_width_centi_ns = 800; |
johnAlexander | 15:932d8b4e52c9 | 2908 | /* Expressed in 100ths of a ns, i.e. centi-ns */ |
johnAlexander | 16:98ce55ddbb1a | 2909 | const uint32_t c_ambient_effective_width_centi_ns = 600; |
johnAlexander | 16:98ce55ddbb1a | 2910 | const FixPoint1616_t c_dflt_final_range_integration_time_milli_secs = 0x00190000; /* 25ms */ |
johnAlexander | 16:98ce55ddbb1a | 2911 | const uint32_t c_vcsel_pulse_width_ps = 4700; /* pico secs */ |
johnAlexander | 16:98ce55ddbb1a | 2912 | const FixPoint1616_t c_sigma_est_max = 0x028F87AE; |
johnAlexander | 16:98ce55ddbb1a | 2913 | const FixPoint1616_t c_sigma_est_rtn_max = 0xF000; |
JerrySzczurak | 20:cf211a3b3d9e | 2914 | const FixPoint1616_t c_amb_to_signal_ratio_max = 0xF0000000 / |
johnAlexander | 16:98ce55ddbb1a | 2915 | c_ambient_effective_width_centi_ns; |
johnAlexander | 15:932d8b4e52c9 | 2916 | /* Time Of Flight per mm (6.6 pico secs) */ |
johnAlexander | 16:98ce55ddbb1a | 2917 | const FixPoint1616_t c_tof_per_mm_ps = 0x0006999A; |
johnAlexander | 16:98ce55ddbb1a | 2918 | const uint32_t c_16bit_rounding_param = 0x00008000; |
johnAlexander | 16:98ce55ddbb1a | 2919 | const FixPoint1616_t c_max_x_talk_kcps = 0x00320000; |
johnAlexander | 16:98ce55ddbb1a | 2920 | const uint32_t c_pll_period_ps = 1655; |
johnAlexander | 16:98ce55ddbb1a | 2921 | |
johnAlexander | 16:98ce55ddbb1a | 2922 | uint32_t vcsel_total_events_rtn; |
johnAlexander | 16:98ce55ddbb1a | 2923 | uint32_t final_range_timeout_micro_secs; |
johnAlexander | 16:98ce55ddbb1a | 2924 | uint32_t pre_range_timeout_micro_secs; |
johnAlexander | 16:98ce55ddbb1a | 2925 | uint32_t final_range_integration_time_milli_secs; |
johnAlexander | 16:98ce55ddbb1a | 2926 | FixPoint1616_t sigma_estimate_p1; |
johnAlexander | 16:98ce55ddbb1a | 2927 | FixPoint1616_t sigma_estimate_p2; |
johnAlexander | 16:98ce55ddbb1a | 2928 | FixPoint1616_t sigma_estimate_p3; |
johnAlexander | 16:98ce55ddbb1a | 2929 | FixPoint1616_t delta_t_ps; |
johnAlexander | 16:98ce55ddbb1a | 2930 | FixPoint1616_t pw_mult; |
johnAlexander | 16:98ce55ddbb1a | 2931 | FixPoint1616_t sigma_est_rtn; |
johnAlexander | 16:98ce55ddbb1a | 2932 | FixPoint1616_t sigma_estimate; |
johnAlexander | 16:98ce55ddbb1a | 2933 | FixPoint1616_t x_talk_correction; |
johnAlexander | 16:98ce55ddbb1a | 2934 | FixPoint1616_t ambient_rate_kcps; |
johnAlexander | 16:98ce55ddbb1a | 2935 | FixPoint1616_t peak_signal_rate_kcps; |
johnAlexander | 16:98ce55ddbb1a | 2936 | FixPoint1616_t x_talk_comp_rate_mcps; |
johnAlexander | 16:98ce55ddbb1a | 2937 | uint32_t x_talk_comp_rate_kcps; |
johnAlexander | 16:98ce55ddbb1a | 2938 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 2939 | FixPoint1616_t diff1_mcps; |
johnAlexander | 15:932d8b4e52c9 | 2940 | FixPoint1616_t diff2_mcps; |
johnAlexander | 15:932d8b4e52c9 | 2941 | FixPoint1616_t sqr1; |
johnAlexander | 15:932d8b4e52c9 | 2942 | FixPoint1616_t sqr2; |
johnAlexander | 16:98ce55ddbb1a | 2943 | FixPoint1616_t sqr_sum; |
johnAlexander | 16:98ce55ddbb1a | 2944 | FixPoint1616_t sqrt_result_centi_ns; |
johnAlexander | 16:98ce55ddbb1a | 2945 | FixPoint1616_t sqrt_result; |
johnAlexander | 16:98ce55ddbb1a | 2946 | FixPoint1616_t total_signal_rate_mcps; |
johnAlexander | 16:98ce55ddbb1a | 2947 | FixPoint1616_t corrected_signal_rate_mcps; |
johnAlexander | 16:98ce55ddbb1a | 2948 | FixPoint1616_t sigma_est_ref; |
johnAlexander | 16:98ce55ddbb1a | 2949 | uint32_t vcsel_width; |
johnAlexander | 16:98ce55ddbb1a | 2950 | uint32_t final_range_macro_pclks; |
johnAlexander | 16:98ce55ddbb1a | 2951 | uint32_t pre_range_macro_pclks; |
johnAlexander | 16:98ce55ddbb1a | 2952 | uint32_t peak_vcsel_duration_us; |
johnAlexander | 16:98ce55ddbb1a | 2953 | uint8_t final_range_vcsel_pclks; |
johnAlexander | 16:98ce55ddbb1a | 2954 | uint8_t pre_range_vcsel_pclks; |
johnAlexander | 15:932d8b4e52c9 | 2955 | /*! \addtogroup calc_sigma_estimate |
johnAlexander | 15:932d8b4e52c9 | 2956 | * @{ |
johnAlexander | 15:932d8b4e52c9 | 2957 | * |
johnAlexander | 15:932d8b4e52c9 | 2958 | * Estimates the range sigma |
johnAlexander | 15:932d8b4e52c9 | 2959 | */ |
johnAlexander | 15:932d8b4e52c9 | 2960 | |
JerrySzczurak | 20:cf211a3b3d9e | 2961 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 2962 | |
JerrySzczurak | 20:cf211a3b3d9e | 2963 | VL53L0X_GETPARAMETERFIELD( dev, XTalkCompensationRateMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 2964 | x_talk_comp_rate_mcps ); |
johnAlexander | 15:932d8b4e52c9 | 2965 | |
johnAlexander | 15:932d8b4e52c9 | 2966 | /* |
johnAlexander | 15:932d8b4e52c9 | 2967 | * We work in kcps rather than mcps as this helps keep within the |
johnAlexander | 15:932d8b4e52c9 | 2968 | * confines of the 32 Fix1616 type. |
johnAlexander | 15:932d8b4e52c9 | 2969 | */ |
johnAlexander | 15:932d8b4e52c9 | 2970 | |
johnAlexander | 16:98ce55ddbb1a | 2971 | ambient_rate_kcps = |
JerrySzczurak | 20:cf211a3b3d9e | 2972 | ( p_ranging_measurement_data->AmbientRateRtnMegaCps * 1000 ) >> 16; |
johnAlexander | 16:98ce55ddbb1a | 2973 | |
johnAlexander | 16:98ce55ddbb1a | 2974 | corrected_signal_rate_mcps = |
johnAlexander | 16:98ce55ddbb1a | 2975 | p_ranging_measurement_data->SignalRateRtnMegaCps; |
johnAlexander | 16:98ce55ddbb1a | 2976 | |
johnAlexander | 16:98ce55ddbb1a | 2977 | |
johnAlexander | 16:98ce55ddbb1a | 2978 | status = vl53l0x_get_total_signal_rate( |
JerrySzczurak | 20:cf211a3b3d9e | 2979 | dev, p_ranging_measurement_data, &total_signal_rate_mcps ); |
johnAlexander | 16:98ce55ddbb1a | 2980 | status = vl53l0x_get_total_xtalk_rate( |
JerrySzczurak | 20:cf211a3b3d9e | 2981 | dev, p_ranging_measurement_data, &x_talk_comp_rate_mcps ); |
johnAlexander | 15:932d8b4e52c9 | 2982 | |
johnAlexander | 15:932d8b4e52c9 | 2983 | |
johnAlexander | 15:932d8b4e52c9 | 2984 | /* Signal rate measurement provided by device is the |
johnAlexander | 15:932d8b4e52c9 | 2985 | * peak signal rate, not average. |
johnAlexander | 15:932d8b4e52c9 | 2986 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 2987 | peak_signal_rate_kcps = ( total_signal_rate_mcps * 1000 ); |
JerrySzczurak | 20:cf211a3b3d9e | 2988 | peak_signal_rate_kcps = ( peak_signal_rate_kcps + 0x8000 ) >> 16; |
johnAlexander | 16:98ce55ddbb1a | 2989 | |
johnAlexander | 16:98ce55ddbb1a | 2990 | x_talk_comp_rate_kcps = x_talk_comp_rate_mcps * 1000; |
johnAlexander | 16:98ce55ddbb1a | 2991 | |
JerrySzczurak | 20:cf211a3b3d9e | 2992 | if ( x_talk_comp_rate_kcps > c_max_x_talk_kcps ) |
johnAlexander | 16:98ce55ddbb1a | 2993 | x_talk_comp_rate_kcps = c_max_x_talk_kcps; |
johnAlexander | 16:98ce55ddbb1a | 2994 | |
JerrySzczurak | 20:cf211a3b3d9e | 2995 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 2996 | |
johnAlexander | 15:932d8b4e52c9 | 2997 | /* Calculate final range macro periods */ |
johnAlexander | 16:98ce55ddbb1a | 2998 | final_range_timeout_micro_secs = VL53L0X_GETDEVICESPECIFICPARAMETER( |
JerrySzczurak | 20:cf211a3b3d9e | 2999 | dev, FinalRangeTimeoutMicroSecs ); |
johnAlexander | 16:98ce55ddbb1a | 3000 | |
johnAlexander | 16:98ce55ddbb1a | 3001 | final_range_vcsel_pclks = VL53L0X_GETDEVICESPECIFICPARAMETER( |
JerrySzczurak | 20:cf211a3b3d9e | 3002 | dev, FinalRangeVcselPulsePeriod ); |
johnAlexander | 16:98ce55ddbb1a | 3003 | |
johnAlexander | 16:98ce55ddbb1a | 3004 | final_range_macro_pclks = vl53l0x_calc_timeout_mclks( |
JerrySzczurak | 20:cf211a3b3d9e | 3005 | dev, final_range_timeout_micro_secs, final_range_vcsel_pclks ); |
johnAlexander | 15:932d8b4e52c9 | 3006 | |
johnAlexander | 15:932d8b4e52c9 | 3007 | /* Calculate pre-range macro periods */ |
johnAlexander | 16:98ce55ddbb1a | 3008 | pre_range_timeout_micro_secs = VL53L0X_GETDEVICESPECIFICPARAMETER( |
JerrySzczurak | 20:cf211a3b3d9e | 3009 | dev, PreRangeTimeoutMicroSecs ); |
johnAlexander | 16:98ce55ddbb1a | 3010 | |
johnAlexander | 16:98ce55ddbb1a | 3011 | pre_range_vcsel_pclks = VL53L0X_GETDEVICESPECIFICPARAMETER( |
JerrySzczurak | 20:cf211a3b3d9e | 3012 | dev, PreRangeVcselPulsePeriod ); |
johnAlexander | 16:98ce55ddbb1a | 3013 | |
johnAlexander | 16:98ce55ddbb1a | 3014 | pre_range_macro_pclks = vl53l0x_calc_timeout_mclks( |
JerrySzczurak | 20:cf211a3b3d9e | 3015 | dev, pre_range_timeout_micro_secs, pre_range_vcsel_pclks ); |
johnAlexander | 16:98ce55ddbb1a | 3016 | |
johnAlexander | 16:98ce55ddbb1a | 3017 | vcsel_width = 3; |
JerrySzczurak | 20:cf211a3b3d9e | 3018 | if ( final_range_vcsel_pclks == 8 ) |
johnAlexander | 16:98ce55ddbb1a | 3019 | vcsel_width = 2; |
johnAlexander | 16:98ce55ddbb1a | 3020 | |
johnAlexander | 16:98ce55ddbb1a | 3021 | |
johnAlexander | 16:98ce55ddbb1a | 3022 | peak_vcsel_duration_us = vcsel_width * 2048 * |
JerrySzczurak | 20:cf211a3b3d9e | 3023 | ( pre_range_macro_pclks + final_range_macro_pclks ); |
JerrySzczurak | 20:cf211a3b3d9e | 3024 | peak_vcsel_duration_us = ( peak_vcsel_duration_us + 500 ) / 1000; |
johnAlexander | 16:98ce55ddbb1a | 3025 | peak_vcsel_duration_us *= c_pll_period_ps; |
JerrySzczurak | 20:cf211a3b3d9e | 3026 | peak_vcsel_duration_us = ( peak_vcsel_duration_us + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 3027 | |
johnAlexander | 15:932d8b4e52c9 | 3028 | /* Fix1616 >> 8 = Fix2408 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3029 | total_signal_rate_mcps = ( total_signal_rate_mcps + 0x80 ) >> 8; |
johnAlexander | 15:932d8b4e52c9 | 3030 | |
johnAlexander | 15:932d8b4e52c9 | 3031 | /* Fix2408 * uint32 = Fix2408 */ |
johnAlexander | 16:98ce55ddbb1a | 3032 | vcsel_total_events_rtn = total_signal_rate_mcps * |
johnAlexander | 16:98ce55ddbb1a | 3033 | peak_vcsel_duration_us; |
johnAlexander | 15:932d8b4e52c9 | 3034 | |
johnAlexander | 15:932d8b4e52c9 | 3035 | /* Fix2408 >> 8 = uint32 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3036 | vcsel_total_events_rtn = ( vcsel_total_events_rtn + 0x80 ) >> 8; |
johnAlexander | 15:932d8b4e52c9 | 3037 | |
johnAlexander | 15:932d8b4e52c9 | 3038 | /* Fix2408 << 8 = Fix1616 = */ |
johnAlexander | 16:98ce55ddbb1a | 3039 | total_signal_rate_mcps <<= 8; |
johnAlexander | 15:932d8b4e52c9 | 3040 | } |
johnAlexander | 15:932d8b4e52c9 | 3041 | |
JerrySzczurak | 20:cf211a3b3d9e | 3042 | if ( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3043 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 3044 | return status; |
johnAlexander | 15:932d8b4e52c9 | 3045 | } |
johnAlexander | 15:932d8b4e52c9 | 3046 | |
JerrySzczurak | 20:cf211a3b3d9e | 3047 | if ( peak_signal_rate_kcps == 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 3048 | *p_sigma_estimate = c_sigma_est_max; |
JerrySzczurak | 20:cf211a3b3d9e | 3049 | PALDevDataSet( dev, SigmaEstimate, c_sigma_est_max ); |
johnAlexander | 16:98ce55ddbb1a | 3050 | *p_dmax_mm = 0; |
johnAlexander | 15:932d8b4e52c9 | 3051 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 3052 | if ( vcsel_total_events_rtn < 1 ) |
johnAlexander | 16:98ce55ddbb1a | 3053 | vcsel_total_events_rtn = 1; |
johnAlexander | 16:98ce55ddbb1a | 3054 | |
johnAlexander | 16:98ce55ddbb1a | 3055 | sigma_estimate_p1 = c_pulse_effective_width_centi_ns; |
johnAlexander | 15:932d8b4e52c9 | 3056 | |
johnAlexander | 15:932d8b4e52c9 | 3057 | /* ((FixPoint1616 << 16)* uint32)/uint32 = FixPoint1616 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3058 | sigma_estimate_p2 = ( ambient_rate_kcps << 16 ) / peak_signal_rate_kcps; |
JerrySzczurak | 20:cf211a3b3d9e | 3059 | if ( sigma_estimate_p2 > c_amb_to_signal_ratio_max ) { |
johnAlexander | 15:932d8b4e52c9 | 3060 | /* Clip to prevent overflow. Will ensure safe |
johnAlexander | 15:932d8b4e52c9 | 3061 | * max result. */ |
johnAlexander | 16:98ce55ddbb1a | 3062 | sigma_estimate_p2 = c_amb_to_signal_ratio_max; |
johnAlexander | 15:932d8b4e52c9 | 3063 | } |
johnAlexander | 16:98ce55ddbb1a | 3064 | sigma_estimate_p2 *= c_ambient_effective_width_centi_ns; |
johnAlexander | 16:98ce55ddbb1a | 3065 | |
JerrySzczurak | 20:cf211a3b3d9e | 3066 | sigma_estimate_p3 = 2 * vl53l0x_isqrt( vcsel_total_events_rtn * 12 ); |
johnAlexander | 15:932d8b4e52c9 | 3067 | |
johnAlexander | 15:932d8b4e52c9 | 3068 | /* uint32 * FixPoint1616 = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 3069 | delta_t_ps = p_ranging_measurement_data->RangeMilliMeter * |
johnAlexander | 16:98ce55ddbb1a | 3070 | c_tof_per_mm_ps; |
johnAlexander | 15:932d8b4e52c9 | 3071 | |
johnAlexander | 15:932d8b4e52c9 | 3072 | /* |
johnAlexander | 15:932d8b4e52c9 | 3073 | * vcselRate - xtalkCompRate |
johnAlexander | 15:932d8b4e52c9 | 3074 | * (uint32 << 16) - FixPoint1616 = FixPoint1616. |
johnAlexander | 15:932d8b4e52c9 | 3075 | * Divide result by 1000 to convert to mcps. |
johnAlexander | 15:932d8b4e52c9 | 3076 | * 500 is added to ensure rounding when integer division |
johnAlexander | 15:932d8b4e52c9 | 3077 | * truncates. |
johnAlexander | 15:932d8b4e52c9 | 3078 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3079 | diff1_mcps = ( ( ( peak_signal_rate_kcps << 16 ) - |
JerrySzczurak | 20:cf211a3b3d9e | 3080 | 2 * x_talk_comp_rate_kcps ) + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 3081 | |
johnAlexander | 15:932d8b4e52c9 | 3082 | /* vcselRate + xtalkCompRate */ |
JerrySzczurak | 20:cf211a3b3d9e | 3083 | diff2_mcps = ( ( peak_signal_rate_kcps << 16 ) + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 3084 | |
johnAlexander | 15:932d8b4e52c9 | 3085 | /* Shift by 8 bits to increase resolution prior to the |
johnAlexander | 15:932d8b4e52c9 | 3086 | * division */ |
johnAlexander | 15:932d8b4e52c9 | 3087 | diff1_mcps <<= 8; |
johnAlexander | 15:932d8b4e52c9 | 3088 | |
johnAlexander | 15:932d8b4e52c9 | 3089 | /* FixPoint0824/FixPoint1616 = FixPoint2408 */ |
johnAlexander | 0:c523920bcc09 | 3090 | // xTalkCorrection = abs(diff1_mcps/diff2_mcps); |
johnAlexander | 0:c523920bcc09 | 3091 | // abs is causing compiler overloading isue in C++, but unsigned types. So, redundant call anyway! |
JerrySzczurak | 20:cf211a3b3d9e | 3092 | x_talk_correction = diff1_mcps / diff2_mcps; |
johnAlexander | 15:932d8b4e52c9 | 3093 | |
johnAlexander | 15:932d8b4e52c9 | 3094 | /* FixPoint2408 << 8 = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 3095 | x_talk_correction <<= 8; |
johnAlexander | 16:98ce55ddbb1a | 3096 | |
JerrySzczurak | 20:cf211a3b3d9e | 3097 | if( p_ranging_measurement_data->RangeStatus != 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 3098 | pw_mult = 1 << 16; |
johnAlexander | 15:932d8b4e52c9 | 3099 | } else { |
johnAlexander | 15:932d8b4e52c9 | 3100 | /* FixPoint1616/uint32 = FixPoint1616 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3101 | pw_mult = delta_t_ps / c_vcsel_pulse_width_ps; /* smaller than 1.0f */ |
johnAlexander | 15:932d8b4e52c9 | 3102 | |
johnAlexander | 15:932d8b4e52c9 | 3103 | /* |
johnAlexander | 15:932d8b4e52c9 | 3104 | * FixPoint1616 * FixPoint1616 = FixPoint3232, however both |
johnAlexander | 15:932d8b4e52c9 | 3105 | * values are small enough such that32 bits will not be |
johnAlexander | 15:932d8b4e52c9 | 3106 | * exceeded. |
johnAlexander | 15:932d8b4e52c9 | 3107 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3108 | pw_mult *= ( ( 1 << 16 ) - x_talk_correction ); |
johnAlexander | 15:932d8b4e52c9 | 3109 | |
johnAlexander | 15:932d8b4e52c9 | 3110 | /* (FixPoint3232 >> 16) = FixPoint1616 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3111 | pw_mult = ( pw_mult + c_16bit_rounding_param ) >> 16; |
johnAlexander | 15:932d8b4e52c9 | 3112 | |
johnAlexander | 15:932d8b4e52c9 | 3113 | /* FixPoint1616 + FixPoint1616 = FixPoint1616 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3114 | pw_mult += ( 1 << 16 ); |
johnAlexander | 15:932d8b4e52c9 | 3115 | |
johnAlexander | 15:932d8b4e52c9 | 3116 | /* |
johnAlexander | 15:932d8b4e52c9 | 3117 | * At this point the value will be 1.xx, therefore if we square |
johnAlexander | 15:932d8b4e52c9 | 3118 | * the value this will exceed 32 bits. To address this perform |
johnAlexander | 15:932d8b4e52c9 | 3119 | * a single shift to the right before the multiplication. |
johnAlexander | 15:932d8b4e52c9 | 3120 | */ |
johnAlexander | 16:98ce55ddbb1a | 3121 | pw_mult >>= 1; |
johnAlexander | 15:932d8b4e52c9 | 3122 | /* FixPoint1715 * FixPoint1715 = FixPoint3430 */ |
johnAlexander | 16:98ce55ddbb1a | 3123 | pw_mult = pw_mult * pw_mult; |
johnAlexander | 15:932d8b4e52c9 | 3124 | |
johnAlexander | 15:932d8b4e52c9 | 3125 | /* (FixPoint3430 >> 14) = Fix1616 */ |
johnAlexander | 16:98ce55ddbb1a | 3126 | pw_mult >>= 14; |
johnAlexander | 15:932d8b4e52c9 | 3127 | } |
johnAlexander | 15:932d8b4e52c9 | 3128 | |
johnAlexander | 15:932d8b4e52c9 | 3129 | /* FixPoint1616 * uint32 = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 3130 | sqr1 = pw_mult * sigma_estimate_p1; |
johnAlexander | 15:932d8b4e52c9 | 3131 | |
johnAlexander | 15:932d8b4e52c9 | 3132 | /* (FixPoint1616 >> 16) = FixPoint3200 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3133 | sqr1 = ( sqr1 + 0x8000 ) >> 16; |
johnAlexander | 15:932d8b4e52c9 | 3134 | |
johnAlexander | 15:932d8b4e52c9 | 3135 | /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ |
johnAlexander | 15:932d8b4e52c9 | 3136 | sqr1 *= sqr1; |
johnAlexander | 15:932d8b4e52c9 | 3137 | |
johnAlexander | 16:98ce55ddbb1a | 3138 | sqr2 = sigma_estimate_p2; |
johnAlexander | 15:932d8b4e52c9 | 3139 | |
johnAlexander | 15:932d8b4e52c9 | 3140 | /* (FixPoint1616 >> 16) = FixPoint3200 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3141 | sqr2 = ( sqr2 + 0x8000 ) >> 16; |
johnAlexander | 15:932d8b4e52c9 | 3142 | |
johnAlexander | 15:932d8b4e52c9 | 3143 | /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ |
johnAlexander | 15:932d8b4e52c9 | 3144 | sqr2 *= sqr2; |
johnAlexander | 15:932d8b4e52c9 | 3145 | |
johnAlexander | 15:932d8b4e52c9 | 3146 | /* FixPoint64000 + FixPoint6400 = FixPoint6400 */ |
johnAlexander | 16:98ce55ddbb1a | 3147 | sqr_sum = sqr1 + sqr2; |
johnAlexander | 15:932d8b4e52c9 | 3148 | |
johnAlexander | 15:932d8b4e52c9 | 3149 | /* SQRT(FixPoin6400) = FixPoint3200 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3150 | sqrt_result_centi_ns = vl53l0x_isqrt( sqr_sum ); |
johnAlexander | 15:932d8b4e52c9 | 3151 | |
johnAlexander | 15:932d8b4e52c9 | 3152 | /* (FixPoint3200 << 16) = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 3153 | sqrt_result_centi_ns <<= 16; |
johnAlexander | 15:932d8b4e52c9 | 3154 | |
johnAlexander | 15:932d8b4e52c9 | 3155 | /* |
johnAlexander | 15:932d8b4e52c9 | 3156 | * Note that the Speed Of Light is expressed in um per 1E-10 |
johnAlexander | 15:932d8b4e52c9 | 3157 | * seconds (2997) Therefore to get mm/ns we have to divide by |
johnAlexander | 15:932d8b4e52c9 | 3158 | * 10000 |
johnAlexander | 15:932d8b4e52c9 | 3159 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3160 | sigma_est_rtn = ( ( ( sqrt_result_centi_ns + 50 ) / 100 ) / |
JerrySzczurak | 20:cf211a3b3d9e | 3161 | sigma_estimate_p3 ); |
johnAlexander | 16:98ce55ddbb1a | 3162 | sigma_est_rtn *= VL53L0X_SPEED_OF_LIGHT_IN_AIR; |
johnAlexander | 15:932d8b4e52c9 | 3163 | |
johnAlexander | 15:932d8b4e52c9 | 3164 | /* Add 5000 before dividing by 10000 to ensure rounding. */ |
johnAlexander | 16:98ce55ddbb1a | 3165 | sigma_est_rtn += 5000; |
johnAlexander | 16:98ce55ddbb1a | 3166 | sigma_est_rtn /= 10000; |
johnAlexander | 16:98ce55ddbb1a | 3167 | |
JerrySzczurak | 20:cf211a3b3d9e | 3168 | if ( sigma_est_rtn > c_sigma_est_rtn_max ) { |
johnAlexander | 15:932d8b4e52c9 | 3169 | /* Clip to prevent overflow. Will ensure safe |
johnAlexander | 15:932d8b4e52c9 | 3170 | * max result. */ |
johnAlexander | 16:98ce55ddbb1a | 3171 | sigma_est_rtn = c_sigma_est_rtn_max; |
johnAlexander | 15:932d8b4e52c9 | 3172 | } |
johnAlexander | 16:98ce55ddbb1a | 3173 | final_range_integration_time_milli_secs = |
JerrySzczurak | 20:cf211a3b3d9e | 3174 | ( final_range_timeout_micro_secs + pre_range_timeout_micro_secs + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 3175 | |
johnAlexander | 15:932d8b4e52c9 | 3176 | /* sigmaEstRef = 1mm * 25ms/final range integration time (inc pre-range) |
johnAlexander | 15:932d8b4e52c9 | 3177 | * sqrt(FixPoint1616/int) = FixPoint2408) |
johnAlexander | 15:932d8b4e52c9 | 3178 | */ |
johnAlexander | 16:98ce55ddbb1a | 3179 | sigma_est_ref = |
JerrySzczurak | 20:cf211a3b3d9e | 3180 | vl53l0x_isqrt( ( c_dflt_final_range_integration_time_milli_secs + |
JerrySzczurak | 20:cf211a3b3d9e | 3181 | final_range_integration_time_milli_secs / 2 ) / |
JerrySzczurak | 20:cf211a3b3d9e | 3182 | final_range_integration_time_milli_secs ); |
johnAlexander | 15:932d8b4e52c9 | 3183 | |
johnAlexander | 15:932d8b4e52c9 | 3184 | /* FixPoint2408 << 8 = FixPoint1616 */ |
johnAlexander | 16:98ce55ddbb1a | 3185 | sigma_est_ref <<= 8; |
JerrySzczurak | 20:cf211a3b3d9e | 3186 | sigma_est_ref = ( sigma_est_ref + 500 ) / 1000; |
johnAlexander | 15:932d8b4e52c9 | 3187 | |
johnAlexander | 15:932d8b4e52c9 | 3188 | /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ |
johnAlexander | 16:98ce55ddbb1a | 3189 | sqr1 = sigma_est_rtn * sigma_est_rtn; |
johnAlexander | 15:932d8b4e52c9 | 3190 | /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ |
johnAlexander | 16:98ce55ddbb1a | 3191 | sqr2 = sigma_est_ref * sigma_est_ref; |
johnAlexander | 15:932d8b4e52c9 | 3192 | |
johnAlexander | 15:932d8b4e52c9 | 3193 | /* sqrt(FixPoint3232) = FixPoint1616 */ |
JerrySzczurak | 20:cf211a3b3d9e | 3194 | sqrt_result = vl53l0x_isqrt( ( sqr1 + sqr2 ) ); |
johnAlexander | 15:932d8b4e52c9 | 3195 | /* |
johnAlexander | 15:932d8b4e52c9 | 3196 | * Note that the Shift by 4 bits increases resolution prior to |
johnAlexander | 15:932d8b4e52c9 | 3197 | * the sqrt, therefore the result must be shifted by 2 bits to |
johnAlexander | 15:932d8b4e52c9 | 3198 | * the right to revert back to the FixPoint1616 format. |
johnAlexander | 15:932d8b4e52c9 | 3199 | */ |
johnAlexander | 15:932d8b4e52c9 | 3200 | |
johnAlexander | 16:98ce55ddbb1a | 3201 | sigma_estimate = 1000 * sqrt_result; |
johnAlexander | 16:98ce55ddbb1a | 3202 | |
JerrySzczurak | 20:cf211a3b3d9e | 3203 | if ( ( peak_signal_rate_kcps < 1 ) || ( vcsel_total_events_rtn < 1 ) || |
JerrySzczurak | 20:cf211a3b3d9e | 3204 | ( sigma_estimate > c_sigma_est_max ) ) { |
johnAlexander | 16:98ce55ddbb1a | 3205 | sigma_estimate = c_sigma_est_max; |
johnAlexander | 15:932d8b4e52c9 | 3206 | } |
johnAlexander | 15:932d8b4e52c9 | 3207 | |
JerrySzczurak | 20:cf211a3b3d9e | 3208 | *p_sigma_estimate = ( uint32_t )( sigma_estimate ); |
JerrySzczurak | 20:cf211a3b3d9e | 3209 | PALDevDataSet( dev, SigmaEstimate, *p_sigma_estimate ); |
johnAlexander | 16:98ce55ddbb1a | 3210 | status = vl53l0x_calc_dmax( |
johnAlexander | 16:98ce55ddbb1a | 3211 | dev, |
johnAlexander | 16:98ce55ddbb1a | 3212 | total_signal_rate_mcps, |
johnAlexander | 16:98ce55ddbb1a | 3213 | corrected_signal_rate_mcps, |
johnAlexander | 16:98ce55ddbb1a | 3214 | pw_mult, |
johnAlexander | 16:98ce55ddbb1a | 3215 | sigma_estimate_p1, |
johnAlexander | 16:98ce55ddbb1a | 3216 | sigma_estimate_p2, |
johnAlexander | 16:98ce55ddbb1a | 3217 | peak_vcsel_duration_us, |
JerrySzczurak | 20:cf211a3b3d9e | 3218 | p_dmax_mm ); |
JerrySzczurak | 20:cf211a3b3d9e | 3219 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3220 | |
JerrySzczurak | 20:cf211a3b3d9e | 3221 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 3222 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 3223 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3224 | |
JerrySzczurak | 20:cf211a3b3d9e | 3225 | VL53L0X_Error VL53L0X::vl53l0x_get_pal_range_status( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 3226 | uint8_t device_range_status, |
johnAlexander | 16:98ce55ddbb1a | 3227 | FixPoint1616_t signal_rate, |
johnAlexander | 16:98ce55ddbb1a | 3228 | uint16_t effective_spad_rtn_count, |
johnAlexander | 16:98ce55ddbb1a | 3229 | VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data, |
JerrySzczurak | 20:cf211a3b3d9e | 3230 | uint8_t *p_pal_range_status ) |
johnAlexander | 0:c523920bcc09 | 3231 | { |
johnAlexander | 16:98ce55ddbb1a | 3232 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 3233 | uint8_t none_flag; |
johnAlexander | 16:98ce55ddbb1a | 3234 | uint8_t sigma_limitflag = 0; |
johnAlexander | 16:98ce55ddbb1a | 3235 | uint8_t signal_ref_clipflag = 0; |
johnAlexander | 16:98ce55ddbb1a | 3236 | uint8_t range_ignore_thresholdflag = 0; |
johnAlexander | 16:98ce55ddbb1a | 3237 | uint8_t sigma_limit_check_enable = 0; |
johnAlexander | 16:98ce55ddbb1a | 3238 | uint8_t signal_rate_final_range_limit_check_enable = 0; |
johnAlexander | 16:98ce55ddbb1a | 3239 | uint8_t signal_ref_clip_limit_check_enable = 0; |
johnAlexander | 16:98ce55ddbb1a | 3240 | uint8_t range_ignore_threshold_limit_check_enable = 0; |
johnAlexander | 16:98ce55ddbb1a | 3241 | FixPoint1616_t sigma_estimate; |
johnAlexander | 16:98ce55ddbb1a | 3242 | FixPoint1616_t sigma_limit_value; |
johnAlexander | 16:98ce55ddbb1a | 3243 | FixPoint1616_t signal_ref_clip_value; |
johnAlexander | 16:98ce55ddbb1a | 3244 | FixPoint1616_t range_ignore_threshold_value; |
johnAlexander | 16:98ce55ddbb1a | 3245 | FixPoint1616_t signal_rate_per_spad; |
johnAlexander | 16:98ce55ddbb1a | 3246 | uint8_t device_range_status_internal = 0; |
johnAlexander | 16:98ce55ddbb1a | 3247 | uint16_t tmp_word = 0; |
johnAlexander | 16:98ce55ddbb1a | 3248 | uint8_t temp8; |
johnAlexander | 16:98ce55ddbb1a | 3249 | uint32_t dmax_mm = 0; |
johnAlexander | 16:98ce55ddbb1a | 3250 | FixPoint1616_t last_signal_ref_mcps; |
johnAlexander | 15:932d8b4e52c9 | 3251 | |
JerrySzczurak | 20:cf211a3b3d9e | 3252 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 3253 | |
johnAlexander | 15:932d8b4e52c9 | 3254 | |
johnAlexander | 15:932d8b4e52c9 | 3255 | /* |
johnAlexander | 15:932d8b4e52c9 | 3256 | * VL53L0X has a good ranging when the value of the |
johnAlexander | 15:932d8b4e52c9 | 3257 | * DeviceRangeStatus = 11. This function will replace the value 0 with |
johnAlexander | 15:932d8b4e52c9 | 3258 | * the value 11 in the DeviceRangeStatus. |
johnAlexander | 15:932d8b4e52c9 | 3259 | * In addition, the SigmaEstimator is not included in the VL53L0X |
johnAlexander | 15:932d8b4e52c9 | 3260 | * DeviceRangeStatus, this will be added in the PalRangeStatus. |
johnAlexander | 15:932d8b4e52c9 | 3261 | */ |
johnAlexander | 15:932d8b4e52c9 | 3262 | |
JerrySzczurak | 20:cf211a3b3d9e | 3263 | device_range_status_internal = ( ( device_range_status & 0x78 ) >> 3 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3264 | |
JerrySzczurak | 20:cf211a3b3d9e | 3265 | if ( device_range_status_internal == 0 || |
johnAlexander | 16:98ce55ddbb1a | 3266 | device_range_status_internal == 5 || |
johnAlexander | 16:98ce55ddbb1a | 3267 | device_range_status_internal == 7 || |
johnAlexander | 16:98ce55ddbb1a | 3268 | device_range_status_internal == 12 || |
johnAlexander | 16:98ce55ddbb1a | 3269 | device_range_status_internal == 13 || |
johnAlexander | 16:98ce55ddbb1a | 3270 | device_range_status_internal == 14 || |
johnAlexander | 16:98ce55ddbb1a | 3271 | device_range_status_internal == 15 |
johnAlexander | 15:932d8b4e52c9 | 3272 | ) { |
johnAlexander | 16:98ce55ddbb1a | 3273 | none_flag = 1; |
johnAlexander | 15:932d8b4e52c9 | 3274 | } else { |
johnAlexander | 16:98ce55ddbb1a | 3275 | none_flag = 0; |
johnAlexander | 15:932d8b4e52c9 | 3276 | } |
johnAlexander | 15:932d8b4e52c9 | 3277 | |
johnAlexander | 15:932d8b4e52c9 | 3278 | /* |
johnAlexander | 15:932d8b4e52c9 | 3279 | * Check if Sigma limit is enabled, if yes then do comparison with limit |
johnAlexander | 15:932d8b4e52c9 | 3280 | * value and put the result back into pPalRangeStatus. |
johnAlexander | 15:932d8b4e52c9 | 3281 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3282 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3283 | status = vl53l0x_get_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3284 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 3285 | &sigma_limit_check_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 3286 | |
JerrySzczurak | 20:cf211a3b3d9e | 3287 | if ( ( sigma_limit_check_enable != 0 ) && ( status == VL53L0X_ERROR_NONE ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3288 | /* |
johnAlexander | 15:932d8b4e52c9 | 3289 | * compute the Sigma and check with limit |
johnAlexander | 15:932d8b4e52c9 | 3290 | */ |
johnAlexander | 16:98ce55ddbb1a | 3291 | status = vl53l0x_calc_sigma_estimate( |
johnAlexander | 16:98ce55ddbb1a | 3292 | dev, |
johnAlexander | 16:98ce55ddbb1a | 3293 | p_ranging_measurement_data, |
johnAlexander | 16:98ce55ddbb1a | 3294 | &sigma_estimate, |
JerrySzczurak | 20:cf211a3b3d9e | 3295 | &dmax_mm ); |
JerrySzczurak | 20:cf211a3b3d9e | 3296 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 3297 | p_ranging_measurement_data->RangeDMaxMilliMeter = dmax_mm; |
johnAlexander | 16:98ce55ddbb1a | 3298 | |
JerrySzczurak | 20:cf211a3b3d9e | 3299 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3300 | status = vl53l0x_get_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3301 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 3302 | &sigma_limit_value ); |
JerrySzczurak | 20:cf211a3b3d9e | 3303 | |
JerrySzczurak | 20:cf211a3b3d9e | 3304 | if ( ( sigma_limit_value > 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3305 | ( sigma_estimate > sigma_limit_value ) ) |
johnAlexander | 15:932d8b4e52c9 | 3306 | /* Limit Fail */ |
johnAlexander | 16:98ce55ddbb1a | 3307 | sigma_limitflag = 1; |
johnAlexander | 15:932d8b4e52c9 | 3308 | } |
johnAlexander | 15:932d8b4e52c9 | 3309 | } |
johnAlexander | 15:932d8b4e52c9 | 3310 | |
johnAlexander | 15:932d8b4e52c9 | 3311 | /* |
johnAlexander | 15:932d8b4e52c9 | 3312 | * Check if Signal ref clip limit is enabled, if yes then do comparison |
johnAlexander | 15:932d8b4e52c9 | 3313 | * with limit value and put the result back into pPalRangeStatus. |
johnAlexander | 15:932d8b4e52c9 | 3314 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3315 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3316 | status = vl53l0x_get_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3317 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, |
JerrySzczurak | 20:cf211a3b3d9e | 3318 | &signal_ref_clip_limit_check_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 3319 | |
JerrySzczurak | 20:cf211a3b3d9e | 3320 | if ( ( signal_ref_clip_limit_check_enable != 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3321 | ( status == VL53L0X_ERROR_NONE ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3322 | |
JerrySzczurak | 20:cf211a3b3d9e | 3323 | status = vl53l0x_get_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3324 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, |
JerrySzczurak | 20:cf211a3b3d9e | 3325 | &signal_ref_clip_value ); |
johnAlexander | 15:932d8b4e52c9 | 3326 | |
johnAlexander | 15:932d8b4e52c9 | 3327 | /* Read LastSignalRefMcps from device */ |
JerrySzczurak | 20:cf211a3b3d9e | 3328 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3329 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3330 | |
JerrySzczurak | 20:cf211a3b3d9e | 3331 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3332 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3333 | VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, |
JerrySzczurak | 20:cf211a3b3d9e | 3334 | &tmp_word ); |
JerrySzczurak | 20:cf211a3b3d9e | 3335 | |
JerrySzczurak | 20:cf211a3b3d9e | 3336 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3337 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3338 | |
JerrySzczurak | 20:cf211a3b3d9e | 3339 | last_signal_ref_mcps = VL53L0X_FIXPOINT97TOFIXPOINT1616( tmp_word ); |
JerrySzczurak | 20:cf211a3b3d9e | 3340 | PALDevDataSet( dev, LastSignalRefMcps, last_signal_ref_mcps ); |
JerrySzczurak | 20:cf211a3b3d9e | 3341 | |
JerrySzczurak | 20:cf211a3b3d9e | 3342 | if ( ( signal_ref_clip_value > 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3343 | ( last_signal_ref_mcps > signal_ref_clip_value ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3344 | /* Limit Fail */ |
johnAlexander | 16:98ce55ddbb1a | 3345 | signal_ref_clipflag = 1; |
johnAlexander | 15:932d8b4e52c9 | 3346 | } |
johnAlexander | 15:932d8b4e52c9 | 3347 | } |
johnAlexander | 15:932d8b4e52c9 | 3348 | |
johnAlexander | 15:932d8b4e52c9 | 3349 | /* |
johnAlexander | 15:932d8b4e52c9 | 3350 | * Check if Signal ref clip limit is enabled, if yes then do comparison |
johnAlexander | 15:932d8b4e52c9 | 3351 | * with limit value and put the result back into pPalRangeStatus. |
johnAlexander | 15:932d8b4e52c9 | 3352 | * EffectiveSpadRtnCount has a format 8.8 |
johnAlexander | 15:932d8b4e52c9 | 3353 | * If (Return signal rate < (1.5 x Xtalk x number of Spads)) : FAIL |
johnAlexander | 15:932d8b4e52c9 | 3354 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3355 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3356 | status = vl53l0x_get_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3357 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, |
JerrySzczurak | 20:cf211a3b3d9e | 3358 | &range_ignore_threshold_limit_check_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 3359 | |
JerrySzczurak | 20:cf211a3b3d9e | 3360 | if ( ( range_ignore_threshold_limit_check_enable != 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3361 | ( status == VL53L0X_ERROR_NONE ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3362 | |
johnAlexander | 15:932d8b4e52c9 | 3363 | /* Compute the signal rate per spad */ |
JerrySzczurak | 20:cf211a3b3d9e | 3364 | if ( effective_spad_rtn_count == 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 3365 | signal_rate_per_spad = 0; |
johnAlexander | 15:932d8b4e52c9 | 3366 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 3367 | signal_rate_per_spad = ( FixPoint1616_t )( ( 256 * signal_rate ) |
JerrySzczurak | 20:cf211a3b3d9e | 3368 | / effective_spad_rtn_count ); |
johnAlexander | 15:932d8b4e52c9 | 3369 | } |
johnAlexander | 15:932d8b4e52c9 | 3370 | |
JerrySzczurak | 20:cf211a3b3d9e | 3371 | status = vl53l0x_get_limit_check_value( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3372 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, |
JerrySzczurak | 20:cf211a3b3d9e | 3373 | &range_ignore_threshold_value ); |
JerrySzczurak | 20:cf211a3b3d9e | 3374 | |
JerrySzczurak | 20:cf211a3b3d9e | 3375 | if ( ( range_ignore_threshold_value > 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3376 | ( signal_rate_per_spad < range_ignore_threshold_value ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3377 | /* Limit Fail add 2^6 to range status */ |
johnAlexander | 16:98ce55ddbb1a | 3378 | range_ignore_thresholdflag = 1; |
johnAlexander | 15:932d8b4e52c9 | 3379 | } |
johnAlexander | 15:932d8b4e52c9 | 3380 | } |
johnAlexander | 15:932d8b4e52c9 | 3381 | |
JerrySzczurak | 20:cf211a3b3d9e | 3382 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3383 | if ( none_flag == 1 ) { |
johnAlexander | 16:98ce55ddbb1a | 3384 | *p_pal_range_status = 255; /* NONE */ |
JerrySzczurak | 20:cf211a3b3d9e | 3385 | } else if ( device_range_status_internal == 1 || |
JerrySzczurak | 20:cf211a3b3d9e | 3386 | device_range_status_internal == 2 || |
JerrySzczurak | 20:cf211a3b3d9e | 3387 | device_range_status_internal == 3 ) { |
johnAlexander | 16:98ce55ddbb1a | 3388 | *p_pal_range_status = 5; /* HW fail */ |
JerrySzczurak | 20:cf211a3b3d9e | 3389 | } else if ( device_range_status_internal == 6 || |
JerrySzczurak | 20:cf211a3b3d9e | 3390 | device_range_status_internal == 9 ) { |
johnAlexander | 16:98ce55ddbb1a | 3391 | *p_pal_range_status = 4; /* Phase fail */ |
JerrySzczurak | 20:cf211a3b3d9e | 3392 | } else if ( device_range_status_internal == 8 || |
JerrySzczurak | 20:cf211a3b3d9e | 3393 | device_range_status_internal == 10 || |
JerrySzczurak | 20:cf211a3b3d9e | 3394 | signal_ref_clipflag == 1 ) { |
johnAlexander | 16:98ce55ddbb1a | 3395 | *p_pal_range_status = 3; /* Min range */ |
JerrySzczurak | 20:cf211a3b3d9e | 3396 | } else if ( device_range_status_internal == 4 || |
JerrySzczurak | 20:cf211a3b3d9e | 3397 | range_ignore_thresholdflag == 1 ) { |
johnAlexander | 16:98ce55ddbb1a | 3398 | *p_pal_range_status = 2; /* Signal Fail */ |
JerrySzczurak | 20:cf211a3b3d9e | 3399 | } else if ( sigma_limitflag == 1 ) { |
johnAlexander | 16:98ce55ddbb1a | 3400 | *p_pal_range_status = 1; /* Sigma Fail */ |
johnAlexander | 15:932d8b4e52c9 | 3401 | } else { |
johnAlexander | 16:98ce55ddbb1a | 3402 | *p_pal_range_status = 0; /* Range Valid */ |
johnAlexander | 15:932d8b4e52c9 | 3403 | } |
johnAlexander | 15:932d8b4e52c9 | 3404 | } |
johnAlexander | 15:932d8b4e52c9 | 3405 | |
johnAlexander | 15:932d8b4e52c9 | 3406 | /* DMAX only relevant during range error */ |
JerrySzczurak | 20:cf211a3b3d9e | 3407 | if ( *p_pal_range_status == 0 ) |
johnAlexander | 16:98ce55ddbb1a | 3408 | p_ranging_measurement_data->RangeDMaxMilliMeter = 0; |
johnAlexander | 15:932d8b4e52c9 | 3409 | |
johnAlexander | 15:932d8b4e52c9 | 3410 | /* fill the Limit Check Status */ |
johnAlexander | 15:932d8b4e52c9 | 3411 | |
JerrySzczurak | 20:cf211a3b3d9e | 3412 | status = vl53l0x_get_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3413 | VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 3414 | &signal_rate_final_range_limit_check_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 3415 | |
JerrySzczurak | 20:cf211a3b3d9e | 3416 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3417 | if ( ( sigma_limit_check_enable == 0 ) || ( sigma_limitflag == 1 ) ) |
johnAlexander | 16:98ce55ddbb1a | 3418 | temp8 = 1; |
johnAlexander | 15:932d8b4e52c9 | 3419 | else |
johnAlexander | 16:98ce55ddbb1a | 3420 | temp8 = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 3421 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksStatus, |
JerrySzczurak | 20:cf211a3b3d9e | 3422 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3423 | |
JerrySzczurak | 20:cf211a3b3d9e | 3424 | if ( ( device_range_status_internal == 4 ) || |
JerrySzczurak | 20:cf211a3b3d9e | 3425 | ( signal_rate_final_range_limit_check_enable == 0 ) ) |
johnAlexander | 16:98ce55ddbb1a | 3426 | temp8 = 1; |
johnAlexander | 15:932d8b4e52c9 | 3427 | else |
johnAlexander | 16:98ce55ddbb1a | 3428 | temp8 = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 3429 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksStatus, |
JerrySzczurak | 20:cf211a3b3d9e | 3430 | VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 3431 | temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3432 | |
JerrySzczurak | 20:cf211a3b3d9e | 3433 | if ( ( signal_ref_clip_limit_check_enable == 0 ) || |
JerrySzczurak | 20:cf211a3b3d9e | 3434 | ( signal_ref_clipflag == 1 ) ) |
johnAlexander | 16:98ce55ddbb1a | 3435 | temp8 = 1; |
johnAlexander | 15:932d8b4e52c9 | 3436 | else |
johnAlexander | 16:98ce55ddbb1a | 3437 | temp8 = 0; |
johnAlexander | 16:98ce55ddbb1a | 3438 | |
JerrySzczurak | 20:cf211a3b3d9e | 3439 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksStatus, |
JerrySzczurak | 20:cf211a3b3d9e | 3440 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3441 | |
JerrySzczurak | 20:cf211a3b3d9e | 3442 | if ( ( range_ignore_threshold_limit_check_enable == 0 ) || |
JerrySzczurak | 20:cf211a3b3d9e | 3443 | ( range_ignore_thresholdflag == 1 ) ) |
johnAlexander | 16:98ce55ddbb1a | 3444 | temp8 = 1; |
johnAlexander | 15:932d8b4e52c9 | 3445 | else |
johnAlexander | 16:98ce55ddbb1a | 3446 | temp8 = 0; |
johnAlexander | 16:98ce55ddbb1a | 3447 | |
JerrySzczurak | 20:cf211a3b3d9e | 3448 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksStatus, |
JerrySzczurak | 20:cf211a3b3d9e | 3449 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, |
JerrySzczurak | 20:cf211a3b3d9e | 3450 | temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3451 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3452 | |
JerrySzczurak | 20:cf211a3b3d9e | 3453 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 3454 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 3455 | |
JerrySzczurak | 20:cf211a3b3d9e | 3456 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3457 | |
JerrySzczurak | 20:cf211a3b3d9e | 3458 | VL53L0X_Error VL53L0X::vl53l0x_get_ranging_measurement_data( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3459 | VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data ) |
johnAlexander | 0:c523920bcc09 | 3460 | { |
johnAlexander | 16:98ce55ddbb1a | 3461 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 3462 | uint8_t device_range_status; |
johnAlexander | 16:98ce55ddbb1a | 3463 | uint8_t range_fractional_enable; |
johnAlexander | 16:98ce55ddbb1a | 3464 | uint8_t pal_range_status; |
johnAlexander | 16:98ce55ddbb1a | 3465 | uint8_t x_talk_compensation_enable; |
johnAlexander | 16:98ce55ddbb1a | 3466 | uint16_t ambient_rate; |
johnAlexander | 16:98ce55ddbb1a | 3467 | FixPoint1616_t signal_rate; |
johnAlexander | 16:98ce55ddbb1a | 3468 | uint16_t x_talk_compensation_rate_mega_cps; |
johnAlexander | 16:98ce55ddbb1a | 3469 | uint16_t effective_spad_rtn_count; |
johnAlexander | 15:932d8b4e52c9 | 3470 | uint16_t tmpuint16; |
johnAlexander | 16:98ce55ddbb1a | 3471 | uint16_t xtalk_range_milli_meter; |
johnAlexander | 16:98ce55ddbb1a | 3472 | uint16_t linearity_corrective_gain; |
johnAlexander | 15:932d8b4e52c9 | 3473 | uint8_t localBuffer[12]; |
johnAlexander | 16:98ce55ddbb1a | 3474 | VL53L0X_RangingMeasurementData_t last_range_data_buffer; |
johnAlexander | 15:932d8b4e52c9 | 3475 | |
JerrySzczurak | 20:cf211a3b3d9e | 3476 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 3477 | |
johnAlexander | 15:932d8b4e52c9 | 3478 | /* |
johnAlexander | 15:932d8b4e52c9 | 3479 | * use multi read even if some registers are not useful, result will |
johnAlexander | 15:932d8b4e52c9 | 3480 | * be more efficient |
johnAlexander | 15:932d8b4e52c9 | 3481 | * start reading at 0x14 dec20 |
johnAlexander | 15:932d8b4e52c9 | 3482 | * end reading at 0x21 dec33 total 14 bytes to read |
johnAlexander | 15:932d8b4e52c9 | 3483 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3484 | status = vl53l0x_read_multi( dev, 0x14, localBuffer, 12 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3485 | |
JerrySzczurak | 20:cf211a3b3d9e | 3486 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 3487 | |
johnAlexander | 16:98ce55ddbb1a | 3488 | p_ranging_measurement_data->ZoneId = 0; /* Only one zone */ |
johnAlexander | 16:98ce55ddbb1a | 3489 | p_ranging_measurement_data->TimeStamp = 0; /* Not Implemented */ |
johnAlexander | 15:932d8b4e52c9 | 3490 | |
JerrySzczurak | 20:cf211a3b3d9e | 3491 | tmpuint16 = VL53L0X_MAKEUINT16( localBuffer[11], localBuffer[10] ); |
johnAlexander | 15:932d8b4e52c9 | 3492 | /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional |
johnAlexander | 15:932d8b4e52c9 | 3493 | *(format 11.2) else no fractional |
johnAlexander | 15:932d8b4e52c9 | 3494 | */ |
johnAlexander | 15:932d8b4e52c9 | 3495 | |
johnAlexander | 16:98ce55ddbb1a | 3496 | p_ranging_measurement_data->MeasurementTimeUsec = 0; |
johnAlexander | 16:98ce55ddbb1a | 3497 | |
johnAlexander | 16:98ce55ddbb1a | 3498 | signal_rate = VL53L0X_FIXPOINT97TOFIXPOINT1616( |
JerrySzczurak | 20:cf211a3b3d9e | 3499 | VL53L0X_MAKEUINT16( localBuffer[7], localBuffer[6] ) ); |
johnAlexander | 15:932d8b4e52c9 | 3500 | /* peak_signal_count_rate_rtn_mcps */ |
johnAlexander | 16:98ce55ddbb1a | 3501 | p_ranging_measurement_data->SignalRateRtnMegaCps = signal_rate; |
johnAlexander | 16:98ce55ddbb1a | 3502 | |
JerrySzczurak | 20:cf211a3b3d9e | 3503 | ambient_rate = VL53L0X_MAKEUINT16( localBuffer[9], localBuffer[8] ); |
johnAlexander | 16:98ce55ddbb1a | 3504 | p_ranging_measurement_data->AmbientRateRtnMegaCps = |
JerrySzczurak | 20:cf211a3b3d9e | 3505 | VL53L0X_FIXPOINT97TOFIXPOINT1616( ambient_rate ); |
JerrySzczurak | 20:cf211a3b3d9e | 3506 | |
JerrySzczurak | 20:cf211a3b3d9e | 3507 | effective_spad_rtn_count = VL53L0X_MAKEUINT16( localBuffer[3], |
JerrySzczurak | 20:cf211a3b3d9e | 3508 | localBuffer[2] ); |
johnAlexander | 15:932d8b4e52c9 | 3509 | /* EffectiveSpadRtnCount is 8.8 format */ |
johnAlexander | 16:98ce55ddbb1a | 3510 | p_ranging_measurement_data->EffectiveSpadRtnCount = |
johnAlexander | 16:98ce55ddbb1a | 3511 | effective_spad_rtn_count; |
johnAlexander | 16:98ce55ddbb1a | 3512 | |
johnAlexander | 16:98ce55ddbb1a | 3513 | device_range_status = localBuffer[0]; |
johnAlexander | 15:932d8b4e52c9 | 3514 | |
johnAlexander | 15:932d8b4e52c9 | 3515 | /* Get Linearity Corrective Gain */ |
JerrySzczurak | 20:cf211a3b3d9e | 3516 | linearity_corrective_gain = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3517 | LinearityCorrectiveGain ); |
johnAlexander | 15:932d8b4e52c9 | 3518 | |
johnAlexander | 15:932d8b4e52c9 | 3519 | /* Get ranging configuration */ |
JerrySzczurak | 20:cf211a3b3d9e | 3520 | range_fractional_enable = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3521 | RangeFractionalEnable ); |
JerrySzczurak | 20:cf211a3b3d9e | 3522 | |
JerrySzczurak | 20:cf211a3b3d9e | 3523 | if ( linearity_corrective_gain != 1000 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3524 | |
JerrySzczurak | 20:cf211a3b3d9e | 3525 | tmpuint16 = ( uint16_t )( ( linearity_corrective_gain |
JerrySzczurak | 20:cf211a3b3d9e | 3526 | * tmpuint16 + 500 ) / 1000 ); |
johnAlexander | 15:932d8b4e52c9 | 3527 | |
johnAlexander | 15:932d8b4e52c9 | 3528 | /* Implement Xtalk */ |
JerrySzczurak | 20:cf211a3b3d9e | 3529 | VL53L0X_GETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3530 | XTalkCompensationRateMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 3531 | x_talk_compensation_rate_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 3532 | VL53L0X_GETPARAMETERFIELD( dev, XTalkCompensationEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 3533 | x_talk_compensation_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 3534 | |
JerrySzczurak | 20:cf211a3b3d9e | 3535 | if ( x_talk_compensation_enable ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3536 | |
JerrySzczurak | 20:cf211a3b3d9e | 3537 | if ( ( signal_rate |
JerrySzczurak | 20:cf211a3b3d9e | 3538 | - ( ( x_talk_compensation_rate_mega_cps |
JerrySzczurak | 20:cf211a3b3d9e | 3539 | * effective_spad_rtn_count ) >> 8 ) ) |
JerrySzczurak | 20:cf211a3b3d9e | 3540 | <= 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 3541 | if ( range_fractional_enable ) |
johnAlexander | 16:98ce55ddbb1a | 3542 | xtalk_range_milli_meter = 8888; |
johnAlexander | 15:932d8b4e52c9 | 3543 | else |
johnAlexander | 16:98ce55ddbb1a | 3544 | xtalk_range_milli_meter = 8888 |
johnAlexander | 16:98ce55ddbb1a | 3545 | << 2; |
johnAlexander | 15:932d8b4e52c9 | 3546 | } else { |
johnAlexander | 16:98ce55ddbb1a | 3547 | xtalk_range_milli_meter = |
JerrySzczurak | 20:cf211a3b3d9e | 3548 | ( tmpuint16 * signal_rate ) |
JerrySzczurak | 20:cf211a3b3d9e | 3549 | / ( signal_rate |
JerrySzczurak | 20:cf211a3b3d9e | 3550 | - ( ( x_talk_compensation_rate_mega_cps |
JerrySzczurak | 20:cf211a3b3d9e | 3551 | * effective_spad_rtn_count ) |
JerrySzczurak | 20:cf211a3b3d9e | 3552 | >> 8 ) ); |
johnAlexander | 15:932d8b4e52c9 | 3553 | } |
johnAlexander | 15:932d8b4e52c9 | 3554 | |
johnAlexander | 16:98ce55ddbb1a | 3555 | tmpuint16 = xtalk_range_milli_meter; |
johnAlexander | 15:932d8b4e52c9 | 3556 | } |
johnAlexander | 15:932d8b4e52c9 | 3557 | |
johnAlexander | 15:932d8b4e52c9 | 3558 | } |
johnAlexander | 15:932d8b4e52c9 | 3559 | |
JerrySzczurak | 20:cf211a3b3d9e | 3560 | if ( range_fractional_enable ) { |
johnAlexander | 16:98ce55ddbb1a | 3561 | p_ranging_measurement_data->RangeMilliMeter = |
JerrySzczurak | 20:cf211a3b3d9e | 3562 | ( uint16_t )( ( tmpuint16 ) >> 2 ); |
johnAlexander | 16:98ce55ddbb1a | 3563 | p_ranging_measurement_data->RangeFractionalPart = |
JerrySzczurak | 20:cf211a3b3d9e | 3564 | ( uint8_t )( ( tmpuint16 & 0x03 ) << 6 ); |
johnAlexander | 15:932d8b4e52c9 | 3565 | } else { |
johnAlexander | 16:98ce55ddbb1a | 3566 | p_ranging_measurement_data->RangeMilliMeter = tmpuint16; |
johnAlexander | 16:98ce55ddbb1a | 3567 | p_ranging_measurement_data->RangeFractionalPart = 0; |
johnAlexander | 15:932d8b4e52c9 | 3568 | } |
johnAlexander | 15:932d8b4e52c9 | 3569 | |
johnAlexander | 15:932d8b4e52c9 | 3570 | /* |
johnAlexander | 15:932d8b4e52c9 | 3571 | * For a standard definition of RangeStatus, this should |
johnAlexander | 15:932d8b4e52c9 | 3572 | * return 0 in case of good result after a ranging |
johnAlexander | 15:932d8b4e52c9 | 3573 | * The range status depends on the device so call a device |
johnAlexander | 15:932d8b4e52c9 | 3574 | * specific function to obtain the right Status. |
johnAlexander | 15:932d8b4e52c9 | 3575 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3576 | status |= vl53l0x_get_pal_range_status( dev, device_range_status, |
JerrySzczurak | 20:cf211a3b3d9e | 3577 | signal_rate, effective_spad_rtn_count, |
JerrySzczurak | 20:cf211a3b3d9e | 3578 | p_ranging_measurement_data, &pal_range_status ); |
JerrySzczurak | 20:cf211a3b3d9e | 3579 | |
JerrySzczurak | 20:cf211a3b3d9e | 3580 | if ( status == VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 3581 | p_ranging_measurement_data->RangeStatus = pal_range_status; |
johnAlexander | 15:932d8b4e52c9 | 3582 | |
johnAlexander | 15:932d8b4e52c9 | 3583 | } |
johnAlexander | 15:932d8b4e52c9 | 3584 | |
JerrySzczurak | 20:cf211a3b3d9e | 3585 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 3586 | /* Copy last read data into Dev buffer */ |
JerrySzczurak | 20:cf211a3b3d9e | 3587 | last_range_data_buffer = PALDevDataGet( dev, LastRangeMeasure ); |
johnAlexander | 16:98ce55ddbb1a | 3588 | |
johnAlexander | 16:98ce55ddbb1a | 3589 | last_range_data_buffer.RangeMilliMeter = |
johnAlexander | 16:98ce55ddbb1a | 3590 | p_ranging_measurement_data->RangeMilliMeter; |
johnAlexander | 16:98ce55ddbb1a | 3591 | last_range_data_buffer.RangeFractionalPart = |
johnAlexander | 16:98ce55ddbb1a | 3592 | p_ranging_measurement_data->RangeFractionalPart; |
johnAlexander | 16:98ce55ddbb1a | 3593 | last_range_data_buffer.RangeDMaxMilliMeter = |
johnAlexander | 16:98ce55ddbb1a | 3594 | p_ranging_measurement_data->RangeDMaxMilliMeter; |
johnAlexander | 16:98ce55ddbb1a | 3595 | last_range_data_buffer.MeasurementTimeUsec = |
johnAlexander | 16:98ce55ddbb1a | 3596 | p_ranging_measurement_data->MeasurementTimeUsec; |
johnAlexander | 16:98ce55ddbb1a | 3597 | last_range_data_buffer.SignalRateRtnMegaCps = |
johnAlexander | 16:98ce55ddbb1a | 3598 | p_ranging_measurement_data->SignalRateRtnMegaCps; |
johnAlexander | 16:98ce55ddbb1a | 3599 | last_range_data_buffer.AmbientRateRtnMegaCps = |
johnAlexander | 16:98ce55ddbb1a | 3600 | p_ranging_measurement_data->AmbientRateRtnMegaCps; |
johnAlexander | 16:98ce55ddbb1a | 3601 | last_range_data_buffer.EffectiveSpadRtnCount = |
johnAlexander | 16:98ce55ddbb1a | 3602 | p_ranging_measurement_data->EffectiveSpadRtnCount; |
johnAlexander | 16:98ce55ddbb1a | 3603 | last_range_data_buffer.RangeStatus = |
johnAlexander | 16:98ce55ddbb1a | 3604 | p_ranging_measurement_data->RangeStatus; |
johnAlexander | 16:98ce55ddbb1a | 3605 | |
JerrySzczurak | 20:cf211a3b3d9e | 3606 | PALDevDataSet( dev, LastRangeMeasure, last_range_data_buffer ); |
JerrySzczurak | 20:cf211a3b3d9e | 3607 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3608 | |
JerrySzczurak | 20:cf211a3b3d9e | 3609 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 3610 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 3611 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3612 | |
JerrySzczurak | 20:cf211a3b3d9e | 3613 | VL53L0X_Error VL53L0X::vl53l0x_perform_single_ranging_measurement( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3614 | VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data ) |
johnAlexander | 0:c523920bcc09 | 3615 | { |
johnAlexander | 16:98ce55ddbb1a | 3616 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 3617 | |
JerrySzczurak | 20:cf211a3b3d9e | 3618 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 3619 | |
johnAlexander | 15:932d8b4e52c9 | 3620 | /* This function will do a complete single ranging |
johnAlexander | 15:932d8b4e52c9 | 3621 | * Here we fix the mode! */ |
JerrySzczurak | 20:cf211a3b3d9e | 3622 | status = vl53l0x_set_device_mode( dev, VL53L0X_DEVICEMODE_SINGLE_RANGING ); |
JerrySzczurak | 20:cf211a3b3d9e | 3623 | |
JerrySzczurak | 20:cf211a3b3d9e | 3624 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3625 | status = vl53l0x_perform_single_measurement( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 3626 | |
JerrySzczurak | 20:cf211a3b3d9e | 3627 | |
JerrySzczurak | 20:cf211a3b3d9e | 3628 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3629 | status = vl53l0x_get_ranging_measurement_data( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3630 | p_ranging_measurement_data ); |
JerrySzczurak | 20:cf211a3b3d9e | 3631 | |
JerrySzczurak | 20:cf211a3b3d9e | 3632 | |
JerrySzczurak | 20:cf211a3b3d9e | 3633 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3634 | status = vl53l0x_clear_interrupt_mask( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3635 | |
JerrySzczurak | 20:cf211a3b3d9e | 3636 | |
JerrySzczurak | 20:cf211a3b3d9e | 3637 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 3638 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 3639 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3640 | |
JerrySzczurak | 20:cf211a3b3d9e | 3641 | VL53L0X_Error VL53L0X::perform_ref_signal_measurement( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3642 | uint16_t *p_ref_signal_rate ) |
johnAlexander | 0:c523920bcc09 | 3643 | { |
johnAlexander | 15:932d8b4e52c9 | 3644 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 3645 | VL53L0X_RangingMeasurementData_t ranging_measurement_data; |
johnAlexander | 16:98ce55ddbb1a | 3646 | |
johnAlexander | 16:98ce55ddbb1a | 3647 | uint8_t sequence_config = 0; |
johnAlexander | 15:932d8b4e52c9 | 3648 | |
johnAlexander | 15:932d8b4e52c9 | 3649 | /* store the value of the sequence config, |
johnAlexander | 15:932d8b4e52c9 | 3650 | * this will be reset before the end of the function |
johnAlexander | 15:932d8b4e52c9 | 3651 | */ |
johnAlexander | 15:932d8b4e52c9 | 3652 | |
JerrySzczurak | 20:cf211a3b3d9e | 3653 | sequence_config = PALDevDataGet( dev, SequenceConfig ); |
johnAlexander | 15:932d8b4e52c9 | 3654 | |
johnAlexander | 15:932d8b4e52c9 | 3655 | /* |
johnAlexander | 15:932d8b4e52c9 | 3656 | * This function performs a reference signal rate measurement. |
johnAlexander | 15:932d8b4e52c9 | 3657 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3658 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3659 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3660 | VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0xC0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3661 | |
JerrySzczurak | 20:cf211a3b3d9e | 3662 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3663 | status = vl53l0x_perform_single_ranging_measurement( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3664 | &ranging_measurement_data ); |
JerrySzczurak | 20:cf211a3b3d9e | 3665 | |
JerrySzczurak | 20:cf211a3b3d9e | 3666 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3667 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3668 | |
JerrySzczurak | 20:cf211a3b3d9e | 3669 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3670 | status = vl53l0x_read_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3671 | VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, |
JerrySzczurak | 20:cf211a3b3d9e | 3672 | p_ref_signal_rate ); |
JerrySzczurak | 20:cf211a3b3d9e | 3673 | |
JerrySzczurak | 20:cf211a3b3d9e | 3674 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3675 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3676 | |
JerrySzczurak | 20:cf211a3b3d9e | 3677 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 3678 | /* restore the previous Sequence Config */ |
JerrySzczurak | 20:cf211a3b3d9e | 3679 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 3680 | sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 3681 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3682 | PALDevDataSet( dev, SequenceConfig, sequence_config ); |
JerrySzczurak | 20:cf211a3b3d9e | 3683 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3684 | |
JerrySzczurak | 20:cf211a3b3d9e | 3685 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 3686 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3687 | |
JerrySzczurak | 20:cf211a3b3d9e | 3688 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_perform_ref_spad_management( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 3689 | uint32_t *ref_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 3690 | uint8_t *is_aperture_spads ) |
johnAlexander | 0:c523920bcc09 | 3691 | { |
johnAlexander | 16:98ce55ddbb1a | 3692 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 3693 | uint8_t last_spad_array[6]; |
johnAlexander | 16:98ce55ddbb1a | 3694 | uint8_t start_select = 0xB4; |
johnAlexander | 16:98ce55ddbb1a | 3695 | uint32_t minimum_spad_count = 3; |
johnAlexander | 16:98ce55ddbb1a | 3696 | uint32_t max_spad_count = 44; |
johnAlexander | 16:98ce55ddbb1a | 3697 | uint32_t current_spad_index = 0; |
johnAlexander | 16:98ce55ddbb1a | 3698 | uint32_t last_spad_index = 0; |
johnAlexander | 16:98ce55ddbb1a | 3699 | int32_t next_good_spad = 0; |
johnAlexander | 16:98ce55ddbb1a | 3700 | uint16_t target_ref_rate = 0x0A00; /* 20 MCPS in 9:7 format */ |
johnAlexander | 16:98ce55ddbb1a | 3701 | uint16_t peak_signal_rate_ref; |
johnAlexander | 16:98ce55ddbb1a | 3702 | uint32_t need_apt_spads = 0; |
johnAlexander | 15:932d8b4e52c9 | 3703 | uint32_t index = 0; |
johnAlexander | 16:98ce55ddbb1a | 3704 | uint32_t spad_array_size = 6; |
johnAlexander | 16:98ce55ddbb1a | 3705 | uint32_t signal_rate_diff = 0; |
johnAlexander | 16:98ce55ddbb1a | 3706 | uint32_t last_signal_rate_diff = 0; |
johnAlexander | 15:932d8b4e52c9 | 3707 | uint8_t complete = 0; |
johnAlexander | 16:98ce55ddbb1a | 3708 | uint8_t vhv_settings = 0; |
johnAlexander | 16:98ce55ddbb1a | 3709 | uint8_t phase_cal = 0; |
johnAlexander | 16:98ce55ddbb1a | 3710 | uint32_t ref_spad_count_int = 0; |
johnAlexander | 16:98ce55ddbb1a | 3711 | uint8_t is_aperture_spads_int = 0; |
johnAlexander | 15:932d8b4e52c9 | 3712 | |
johnAlexander | 15:932d8b4e52c9 | 3713 | /* |
johnAlexander | 15:932d8b4e52c9 | 3714 | * The reference SPAD initialization procedure determines the minimum |
johnAlexander | 15:932d8b4e52c9 | 3715 | * amount of reference spads to be enables to achieve a target reference |
johnAlexander | 15:932d8b4e52c9 | 3716 | * signal rate and should be performed once during initialization. |
johnAlexander | 15:932d8b4e52c9 | 3717 | * |
johnAlexander | 15:932d8b4e52c9 | 3718 | * Either aperture or non-aperture spads are applied but never both. |
johnAlexander | 15:932d8b4e52c9 | 3719 | * Firstly non-aperture spads are set, begining with 5 spads, and |
johnAlexander | 15:932d8b4e52c9 | 3720 | * increased one spad at a time until the closest measurement to the |
johnAlexander | 15:932d8b4e52c9 | 3721 | * target rate is achieved. |
johnAlexander | 15:932d8b4e52c9 | 3722 | * |
johnAlexander | 15:932d8b4e52c9 | 3723 | * If the target rate is exceeded when 5 non-aperture spads are enabled, |
johnAlexander | 15:932d8b4e52c9 | 3724 | * initialization is performed instead with aperture spads. |
johnAlexander | 15:932d8b4e52c9 | 3725 | * |
johnAlexander | 15:932d8b4e52c9 | 3726 | * When setting spads, a 'Good Spad Map' is applied. |
johnAlexander | 15:932d8b4e52c9 | 3727 | * |
johnAlexander | 15:932d8b4e52c9 | 3728 | * This procedure operates within a SPAD window of interest of a maximum |
johnAlexander | 15:932d8b4e52c9 | 3729 | * 44 spads. |
johnAlexander | 15:932d8b4e52c9 | 3730 | * The start point is currently fixed to 180, which lies towards the end |
johnAlexander | 15:932d8b4e52c9 | 3731 | * of the non-aperture quadrant and runs in to the adjacent aperture |
johnAlexander | 15:932d8b4e52c9 | 3732 | * quadrant. |
johnAlexander | 15:932d8b4e52c9 | 3733 | */ |
johnAlexander | 15:932d8b4e52c9 | 3734 | |
johnAlexander | 15:932d8b4e52c9 | 3735 | |
JerrySzczurak | 20:cf211a3b3d9e | 3736 | target_ref_rate = PALDevDataGet( dev, targetRefRate ); |
johnAlexander | 15:932d8b4e52c9 | 3737 | |
johnAlexander | 15:932d8b4e52c9 | 3738 | /* |
johnAlexander | 15:932d8b4e52c9 | 3739 | * Initialize Spad arrays. |
johnAlexander | 15:932d8b4e52c9 | 3740 | * Currently the good spad map is initialised to 'All good'. |
johnAlexander | 15:932d8b4e52c9 | 3741 | * This is a short term implementation. The good spad map will be |
johnAlexander | 15:932d8b4e52c9 | 3742 | * provided as an input. |
johnAlexander | 15:932d8b4e52c9 | 3743 | * Note that there are 6 bytes. Only the first 44 bits will be used to |
johnAlexander | 15:932d8b4e52c9 | 3744 | * represent spads. |
johnAlexander | 15:932d8b4e52c9 | 3745 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3746 | for ( index = 0; index < spad_array_size; index++ ) |
johnAlexander | 16:98ce55ddbb1a | 3747 | dev->Data.SpadData.RefSpadEnables[index] = 0; |
johnAlexander | 16:98ce55ddbb1a | 3748 | |
johnAlexander | 16:98ce55ddbb1a | 3749 | |
JerrySzczurak | 20:cf211a3b3d9e | 3750 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3751 | |
JerrySzczurak | 20:cf211a3b3d9e | 3752 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3753 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3754 | VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3755 | |
JerrySzczurak | 20:cf211a3b3d9e | 3756 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3757 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3758 | VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C ); |
JerrySzczurak | 20:cf211a3b3d9e | 3759 | |
JerrySzczurak | 20:cf211a3b3d9e | 3760 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3761 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3762 | |
JerrySzczurak | 20:cf211a3b3d9e | 3763 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3764 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3765 | VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, |
JerrySzczurak | 20:cf211a3b3d9e | 3766 | start_select ); |
JerrySzczurak | 20:cf211a3b3d9e | 3767 | |
JerrySzczurak | 20:cf211a3b3d9e | 3768 | |
JerrySzczurak | 20:cf211a3b3d9e | 3769 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3770 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3771 | VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 3772 | |
johnAlexander | 15:932d8b4e52c9 | 3773 | /* Perform ref calibration */ |
JerrySzczurak | 20:cf211a3b3d9e | 3774 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3775 | status = vl53l0x_perform_ref_calibration( dev, &vhv_settings, |
JerrySzczurak | 20:cf211a3b3d9e | 3776 | &phase_cal, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3777 | |
JerrySzczurak | 20:cf211a3b3d9e | 3778 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 3779 | /* Enable Minimum NON-APERTURE Spads */ |
johnAlexander | 16:98ce55ddbb1a | 3780 | current_spad_index = 0; |
johnAlexander | 16:98ce55ddbb1a | 3781 | last_spad_index = current_spad_index; |
johnAlexander | 16:98ce55ddbb1a | 3782 | need_apt_spads = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 3783 | status = enable_ref_spads( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3784 | need_apt_spads, |
JerrySzczurak | 20:cf211a3b3d9e | 3785 | dev->Data.SpadData.RefGoodSpadMap, |
JerrySzczurak | 20:cf211a3b3d9e | 3786 | dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 3787 | spad_array_size, |
JerrySzczurak | 20:cf211a3b3d9e | 3788 | start_select, |
JerrySzczurak | 20:cf211a3b3d9e | 3789 | current_spad_index, |
JerrySzczurak | 20:cf211a3b3d9e | 3790 | minimum_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 3791 | &last_spad_index ); |
JerrySzczurak | 20:cf211a3b3d9e | 3792 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3793 | |
JerrySzczurak | 20:cf211a3b3d9e | 3794 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 3795 | current_spad_index = last_spad_index; |
johnAlexander | 16:98ce55ddbb1a | 3796 | |
JerrySzczurak | 20:cf211a3b3d9e | 3797 | status = perform_ref_signal_measurement( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3798 | &peak_signal_rate_ref ); |
JerrySzczurak | 20:cf211a3b3d9e | 3799 | if ( ( status == VL53L0X_ERROR_NONE ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3800 | ( peak_signal_rate_ref > target_ref_rate ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3801 | /* Signal rate measurement too high, |
johnAlexander | 15:932d8b4e52c9 | 3802 | * switch to APERTURE SPADs */ |
johnAlexander | 15:932d8b4e52c9 | 3803 | |
JerrySzczurak | 20:cf211a3b3d9e | 3804 | for ( index = 0; index < spad_array_size; index++ ) |
johnAlexander | 16:98ce55ddbb1a | 3805 | dev->Data.SpadData.RefSpadEnables[index] = 0; |
johnAlexander | 15:932d8b4e52c9 | 3806 | |
johnAlexander | 15:932d8b4e52c9 | 3807 | |
johnAlexander | 15:932d8b4e52c9 | 3808 | /* Increment to the first APERTURE spad */ |
JerrySzczurak | 20:cf211a3b3d9e | 3809 | while ( ( is_aperture( start_select + current_spad_index ) |
JerrySzczurak | 20:cf211a3b3d9e | 3810 | == 0 ) && ( current_spad_index < max_spad_count ) ) { |
johnAlexander | 16:98ce55ddbb1a | 3811 | current_spad_index++; |
johnAlexander | 15:932d8b4e52c9 | 3812 | } |
johnAlexander | 15:932d8b4e52c9 | 3813 | |
johnAlexander | 16:98ce55ddbb1a | 3814 | need_apt_spads = 1; |
johnAlexander | 16:98ce55ddbb1a | 3815 | |
JerrySzczurak | 20:cf211a3b3d9e | 3816 | status = enable_ref_spads( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3817 | need_apt_spads, |
JerrySzczurak | 20:cf211a3b3d9e | 3818 | dev->Data.SpadData.RefGoodSpadMap, |
JerrySzczurak | 20:cf211a3b3d9e | 3819 | dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 3820 | spad_array_size, |
JerrySzczurak | 20:cf211a3b3d9e | 3821 | start_select, |
JerrySzczurak | 20:cf211a3b3d9e | 3822 | current_spad_index, |
JerrySzczurak | 20:cf211a3b3d9e | 3823 | minimum_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 3824 | &last_spad_index ); |
JerrySzczurak | 20:cf211a3b3d9e | 3825 | |
JerrySzczurak | 20:cf211a3b3d9e | 3826 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 3827 | current_spad_index = last_spad_index; |
JerrySzczurak | 20:cf211a3b3d9e | 3828 | status = perform_ref_signal_measurement( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3829 | &peak_signal_rate_ref ); |
JerrySzczurak | 20:cf211a3b3d9e | 3830 | |
JerrySzczurak | 20:cf211a3b3d9e | 3831 | if ( ( status == VL53L0X_ERROR_NONE ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3832 | ( peak_signal_rate_ref > target_ref_rate ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3833 | /* Signal rate still too high after |
johnAlexander | 15:932d8b4e52c9 | 3834 | * setting the minimum number of |
johnAlexander | 15:932d8b4e52c9 | 3835 | * APERTURE spads. Can do no more |
johnAlexander | 15:932d8b4e52c9 | 3836 | * therefore set the min number of |
johnAlexander | 15:932d8b4e52c9 | 3837 | * aperture spads as the result. |
johnAlexander | 15:932d8b4e52c9 | 3838 | */ |
johnAlexander | 16:98ce55ddbb1a | 3839 | is_aperture_spads_int = 1; |
johnAlexander | 16:98ce55ddbb1a | 3840 | ref_spad_count_int = minimum_spad_count; |
johnAlexander | 15:932d8b4e52c9 | 3841 | } |
johnAlexander | 15:932d8b4e52c9 | 3842 | } |
johnAlexander | 15:932d8b4e52c9 | 3843 | } else { |
johnAlexander | 16:98ce55ddbb1a | 3844 | need_apt_spads = 0; |
johnAlexander | 15:932d8b4e52c9 | 3845 | } |
johnAlexander | 15:932d8b4e52c9 | 3846 | } |
johnAlexander | 15:932d8b4e52c9 | 3847 | |
JerrySzczurak | 20:cf211a3b3d9e | 3848 | if ( ( status == VL53L0X_ERROR_NONE ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3849 | ( peak_signal_rate_ref < target_ref_rate ) ) { |
johnAlexander | 15:932d8b4e52c9 | 3850 | /* At this point, the minimum number of either aperture |
johnAlexander | 15:932d8b4e52c9 | 3851 | * or non-aperture spads have been set. Proceed to add |
johnAlexander | 15:932d8b4e52c9 | 3852 | * spads and perform measurements until the target |
johnAlexander | 15:932d8b4e52c9 | 3853 | * reference is reached. |
johnAlexander | 15:932d8b4e52c9 | 3854 | */ |
johnAlexander | 16:98ce55ddbb1a | 3855 | is_aperture_spads_int = need_apt_spads; |
johnAlexander | 16:98ce55ddbb1a | 3856 | ref_spad_count_int = minimum_spad_count; |
johnAlexander | 16:98ce55ddbb1a | 3857 | |
JerrySzczurak | 20:cf211a3b3d9e | 3858 | memcpy( last_spad_array, dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 3859 | spad_array_size ); |
JerrySzczurak | 20:cf211a3b3d9e | 3860 | last_signal_rate_diff = abs( peak_signal_rate_ref - |
JerrySzczurak | 20:cf211a3b3d9e | 3861 | target_ref_rate ); |
johnAlexander | 15:932d8b4e52c9 | 3862 | complete = 0; |
johnAlexander | 15:932d8b4e52c9 | 3863 | |
JerrySzczurak | 20:cf211a3b3d9e | 3864 | while ( !complete ) { |
johnAlexander | 15:932d8b4e52c9 | 3865 | get_next_good_spad( |
johnAlexander | 16:98ce55ddbb1a | 3866 | dev->Data.SpadData.RefGoodSpadMap, |
johnAlexander | 16:98ce55ddbb1a | 3867 | spad_array_size, current_spad_index, |
JerrySzczurak | 20:cf211a3b3d9e | 3868 | &next_good_spad ); |
JerrySzczurak | 20:cf211a3b3d9e | 3869 | |
JerrySzczurak | 20:cf211a3b3d9e | 3870 | if ( next_good_spad == -1 ) { |
johnAlexander | 16:98ce55ddbb1a | 3871 | status = VL53L0X_ERROR_REF_SPAD_INIT; |
johnAlexander | 15:932d8b4e52c9 | 3872 | break; |
johnAlexander | 15:932d8b4e52c9 | 3873 | } |
johnAlexander | 15:932d8b4e52c9 | 3874 | |
johnAlexander | 15:932d8b4e52c9 | 3875 | /* Cannot combine Aperture and Non-Aperture spads, so |
johnAlexander | 15:932d8b4e52c9 | 3876 | * ensure the current spad is of the correct type. |
johnAlexander | 15:932d8b4e52c9 | 3877 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3878 | if ( is_aperture( ( uint32_t )start_select + next_good_spad ) != |
JerrySzczurak | 20:cf211a3b3d9e | 3879 | need_apt_spads ) { |
johnAlexander | 15:932d8b4e52c9 | 3880 | /* At this point we have enabled the maximum |
johnAlexander | 15:932d8b4e52c9 | 3881 | * number of Aperture spads. |
johnAlexander | 15:932d8b4e52c9 | 3882 | */ |
johnAlexander | 15:932d8b4e52c9 | 3883 | complete = 1; |
johnAlexander | 15:932d8b4e52c9 | 3884 | break; |
johnAlexander | 15:932d8b4e52c9 | 3885 | } |
johnAlexander | 15:932d8b4e52c9 | 3886 | |
JerrySzczurak | 20:cf211a3b3d9e | 3887 | ( ref_spad_count_int )++; |
johnAlexander | 16:98ce55ddbb1a | 3888 | |
johnAlexander | 16:98ce55ddbb1a | 3889 | current_spad_index = next_good_spad; |
johnAlexander | 16:98ce55ddbb1a | 3890 | status = enable_spad_bit( |
johnAlexander | 16:98ce55ddbb1a | 3891 | dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 3892 | spad_array_size, current_spad_index ); |
JerrySzczurak | 20:cf211a3b3d9e | 3893 | |
JerrySzczurak | 20:cf211a3b3d9e | 3894 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 3895 | current_spad_index++; |
johnAlexander | 15:932d8b4e52c9 | 3896 | /* Proceed to apply the additional spad and |
johnAlexander | 15:932d8b4e52c9 | 3897 | * perform measurement. */ |
JerrySzczurak | 20:cf211a3b3d9e | 3898 | status = set_ref_spad_map( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3899 | dev->Data.SpadData.RefSpadEnables ); |
johnAlexander | 15:932d8b4e52c9 | 3900 | } |
johnAlexander | 15:932d8b4e52c9 | 3901 | |
JerrySzczurak | 20:cf211a3b3d9e | 3902 | if ( status != VL53L0X_ERROR_NONE ) |
johnAlexander | 15:932d8b4e52c9 | 3903 | break; |
johnAlexander | 15:932d8b4e52c9 | 3904 | |
JerrySzczurak | 20:cf211a3b3d9e | 3905 | status = perform_ref_signal_measurement( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3906 | &peak_signal_rate_ref ); |
JerrySzczurak | 20:cf211a3b3d9e | 3907 | |
JerrySzczurak | 20:cf211a3b3d9e | 3908 | if ( status != VL53L0X_ERROR_NONE ) |
johnAlexander | 15:932d8b4e52c9 | 3909 | break; |
johnAlexander | 15:932d8b4e52c9 | 3910 | |
JerrySzczurak | 20:cf211a3b3d9e | 3911 | signal_rate_diff = abs( peak_signal_rate_ref - target_ref_rate ); |
JerrySzczurak | 20:cf211a3b3d9e | 3912 | |
JerrySzczurak | 20:cf211a3b3d9e | 3913 | if ( peak_signal_rate_ref > target_ref_rate ) { |
johnAlexander | 15:932d8b4e52c9 | 3914 | /* Select the spad map that provides the |
johnAlexander | 15:932d8b4e52c9 | 3915 | * measurement closest to the target rate, |
johnAlexander | 15:932d8b4e52c9 | 3916 | * either above or below it. |
johnAlexander | 15:932d8b4e52c9 | 3917 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 3918 | if ( signal_rate_diff > last_signal_rate_diff ) { |
johnAlexander | 15:932d8b4e52c9 | 3919 | /* Previous spad map produced a closer |
johnAlexander | 15:932d8b4e52c9 | 3920 | * measurement, so choose this. */ |
JerrySzczurak | 20:cf211a3b3d9e | 3921 | status = set_ref_spad_map( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3922 | last_spad_array ); |
johnAlexander | 15:932d8b4e52c9 | 3923 | memcpy( |
johnAlexander | 16:98ce55ddbb1a | 3924 | dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 3925 | last_spad_array, spad_array_size ); |
JerrySzczurak | 20:cf211a3b3d9e | 3926 | |
JerrySzczurak | 20:cf211a3b3d9e | 3927 | ( ref_spad_count_int )--; |
johnAlexander | 15:932d8b4e52c9 | 3928 | } |
johnAlexander | 15:932d8b4e52c9 | 3929 | complete = 1; |
johnAlexander | 15:932d8b4e52c9 | 3930 | } else { |
johnAlexander | 15:932d8b4e52c9 | 3931 | /* Continue to add spads */ |
johnAlexander | 16:98ce55ddbb1a | 3932 | last_signal_rate_diff = signal_rate_diff; |
JerrySzczurak | 20:cf211a3b3d9e | 3933 | memcpy( last_spad_array, |
JerrySzczurak | 20:cf211a3b3d9e | 3934 | dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 3935 | spad_array_size ); |
johnAlexander | 15:932d8b4e52c9 | 3936 | } |
johnAlexander | 15:932d8b4e52c9 | 3937 | |
johnAlexander | 15:932d8b4e52c9 | 3938 | } /* while */ |
johnAlexander | 15:932d8b4e52c9 | 3939 | } |
johnAlexander | 15:932d8b4e52c9 | 3940 | |
JerrySzczurak | 20:cf211a3b3d9e | 3941 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 3942 | *ref_spad_count = ref_spad_count_int; |
johnAlexander | 16:98ce55ddbb1a | 3943 | *is_aperture_spads = is_aperture_spads_int; |
johnAlexander | 16:98ce55ddbb1a | 3944 | |
JerrySzczurak | 20:cf211a3b3d9e | 3945 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, RefSpadsInitialised, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3946 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3947 | ReferenceSpadCount, ( uint8_t )( *ref_spad_count ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 3948 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3949 | ReferenceSpadType, *is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 3950 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3951 | |
JerrySzczurak | 20:cf211a3b3d9e | 3952 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 3953 | } |
JerrySzczurak | 20:cf211a3b3d9e | 3954 | |
JerrySzczurak | 20:cf211a3b3d9e | 3955 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_set_reference_spads( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3956 | uint32_t count, uint8_t is_aperture_spads ) |
johnAlexander | 0:c523920bcc09 | 3957 | { |
johnAlexander | 16:98ce55ddbb1a | 3958 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 3959 | uint32_t current_spad_index = 0; |
johnAlexander | 16:98ce55ddbb1a | 3960 | uint8_t start_select = 0xB4; |
johnAlexander | 16:98ce55ddbb1a | 3961 | uint32_t spad_array_size = 6; |
johnAlexander | 16:98ce55ddbb1a | 3962 | uint32_t max_spad_count = 44; |
johnAlexander | 16:98ce55ddbb1a | 3963 | uint32_t last_spad_index; |
johnAlexander | 15:932d8b4e52c9 | 3964 | uint32_t index; |
johnAlexander | 15:932d8b4e52c9 | 3965 | |
johnAlexander | 15:932d8b4e52c9 | 3966 | /* |
johnAlexander | 15:932d8b4e52c9 | 3967 | * This function applies a requested number of reference spads, either |
johnAlexander | 15:932d8b4e52c9 | 3968 | * aperture or |
johnAlexander | 15:932d8b4e52c9 | 3969 | * non-aperture, as requested. |
johnAlexander | 15:932d8b4e52c9 | 3970 | * The good spad map will be applied. |
johnAlexander | 15:932d8b4e52c9 | 3971 | */ |
johnAlexander | 15:932d8b4e52c9 | 3972 | |
JerrySzczurak | 20:cf211a3b3d9e | 3973 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3974 | |
JerrySzczurak | 20:cf211a3b3d9e | 3975 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3976 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3977 | VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3978 | |
JerrySzczurak | 20:cf211a3b3d9e | 3979 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3980 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3981 | VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C ); |
JerrySzczurak | 20:cf211a3b3d9e | 3982 | |
JerrySzczurak | 20:cf211a3b3d9e | 3983 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3984 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 3985 | |
JerrySzczurak | 20:cf211a3b3d9e | 3986 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 3987 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 3988 | VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, |
JerrySzczurak | 20:cf211a3b3d9e | 3989 | start_select ); |
JerrySzczurak | 20:cf211a3b3d9e | 3990 | |
JerrySzczurak | 20:cf211a3b3d9e | 3991 | for ( index = 0; index < spad_array_size; index++ ) |
johnAlexander | 16:98ce55ddbb1a | 3992 | dev->Data.SpadData.RefSpadEnables[index] = 0; |
johnAlexander | 16:98ce55ddbb1a | 3993 | |
JerrySzczurak | 20:cf211a3b3d9e | 3994 | if ( is_aperture_spads ) { |
johnAlexander | 15:932d8b4e52c9 | 3995 | /* Increment to the first APERTURE spad */ |
JerrySzczurak | 20:cf211a3b3d9e | 3996 | while ( ( is_aperture( start_select + current_spad_index ) == 0 ) && |
JerrySzczurak | 20:cf211a3b3d9e | 3997 | ( current_spad_index < max_spad_count ) ) { |
johnAlexander | 16:98ce55ddbb1a | 3998 | current_spad_index++; |
johnAlexander | 15:932d8b4e52c9 | 3999 | } |
johnAlexander | 15:932d8b4e52c9 | 4000 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4001 | status = enable_ref_spads( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4002 | is_aperture_spads, |
JerrySzczurak | 20:cf211a3b3d9e | 4003 | dev->Data.SpadData.RefGoodSpadMap, |
JerrySzczurak | 20:cf211a3b3d9e | 4004 | dev->Data.SpadData.RefSpadEnables, |
JerrySzczurak | 20:cf211a3b3d9e | 4005 | spad_array_size, |
JerrySzczurak | 20:cf211a3b3d9e | 4006 | start_select, |
JerrySzczurak | 20:cf211a3b3d9e | 4007 | current_spad_index, |
JerrySzczurak | 20:cf211a3b3d9e | 4008 | count, |
JerrySzczurak | 20:cf211a3b3d9e | 4009 | &last_spad_index ); |
JerrySzczurak | 20:cf211a3b3d9e | 4010 | |
JerrySzczurak | 20:cf211a3b3d9e | 4011 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4012 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, RefSpadsInitialised, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4013 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4014 | ReferenceSpadCount, ( uint8_t )( count ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 4015 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4016 | ReferenceSpadType, is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 4017 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4018 | |
JerrySzczurak | 20:cf211a3b3d9e | 4019 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4020 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4021 | |
JerrySzczurak | 20:cf211a3b3d9e | 4022 | VL53L0X_Error VL53L0X::vl53l0x_wait_device_booted( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 4023 | { |
johnAlexander | 16:98ce55ddbb1a | 4024 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 4025 | LOG_FUNCTION_START( "" ); |
johnAlexander | 15:932d8b4e52c9 | 4026 | |
johnAlexander | 15:932d8b4e52c9 | 4027 | /* not implemented on VL53L0X */ |
johnAlexander | 15:932d8b4e52c9 | 4028 | |
JerrySzczurak | 20:cf211a3b3d9e | 4029 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4030 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4031 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4032 | |
JerrySzczurak | 20:cf211a3b3d9e | 4033 | VL53L0X_Error VL53L0X::vl53l0x_perform_ref_calibration( VL53L0X_DEV dev, uint8_t *p_vhv_settings, |
JerrySzczurak | 20:cf211a3b3d9e | 4034 | uint8_t *p_phase_cal ) |
johnAlexander | 0:c523920bcc09 | 4035 | { |
johnAlexander | 16:98ce55ddbb1a | 4036 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 4037 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4038 | |
JerrySzczurak | 20:cf211a3b3d9e | 4039 | status = vl53l0x_perform_ref_calibration( dev, p_vhv_settings, |
JerrySzczurak | 20:cf211a3b3d9e | 4040 | p_phase_cal, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4041 | |
JerrySzczurak | 20:cf211a3b3d9e | 4042 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4043 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4044 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4045 | |
JerrySzczurak | 20:cf211a3b3d9e | 4046 | VL53L0X_Error VL53L0X::vl53l0x_perform_ref_spad_management( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4047 | uint32_t *ref_spad_count, uint8_t *is_aperture_spads ) |
johnAlexander | 0:c523920bcc09 | 4048 | { |
johnAlexander | 16:98ce55ddbb1a | 4049 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 4050 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4051 | |
JerrySzczurak | 20:cf211a3b3d9e | 4052 | status = wrapped_vl53l0x_perform_ref_spad_management( dev, ref_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 4053 | is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 4054 | |
JerrySzczurak | 20:cf211a3b3d9e | 4055 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 4056 | |
johnAlexander | 16:98ce55ddbb1a | 4057 | return status; |
johnAlexander | 0:c523920bcc09 | 4058 | } |
johnAlexander | 0:c523920bcc09 | 4059 | |
johnAlexander | 0:c523920bcc09 | 4060 | /* Group PAL Init Functions */ |
JerrySzczurak | 20:cf211a3b3d9e | 4061 | VL53L0X_Error VL53L0X::vl53l0x_set_device_address( VL53L0X_DEV dev, uint8_t device_address ) |
johnAlexander | 0:c523920bcc09 | 4062 | { |
johnAlexander | 16:98ce55ddbb1a | 4063 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 4064 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4065 | |
JerrySzczurak | 20:cf211a3b3d9e | 4066 | status = vl53l0x_write_byte( dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, |
JerrySzczurak | 20:cf211a3b3d9e | 4067 | device_address / 2 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4068 | |
JerrySzczurak | 20:cf211a3b3d9e | 4069 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4070 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4071 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4072 | |
JerrySzczurak | 20:cf211a3b3d9e | 4073 | VL53L0X_Error VL53L0X::vl53l0x_set_gpio_config( VL53L0X_DEV dev, uint8_t pin, |
johnAlexander | 16:98ce55ddbb1a | 4074 | VL53L0X_DeviceModes device_mode, VL53L0X_GpioFunctionality functionality, |
JerrySzczurak | 20:cf211a3b3d9e | 4075 | VL53L0X_InterruptPolarity polarity ) |
johnAlexander | 0:c523920bcc09 | 4076 | { |
johnAlexander | 16:98ce55ddbb1a | 4077 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 15:932d8b4e52c9 | 4078 | uint8_t data; |
johnAlexander | 15:932d8b4e52c9 | 4079 | |
JerrySzczurak | 20:cf211a3b3d9e | 4080 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4081 | |
JerrySzczurak | 20:cf211a3b3d9e | 4082 | if ( pin != 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 4083 | status = VL53L0X_ERROR_GPIO_NOT_EXISTING; |
JerrySzczurak | 20:cf211a3b3d9e | 4084 | } else if ( device_mode == VL53L0X_DEVICEMODE_GPIO_DRIVE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4085 | if ( polarity == VL53L0X_INTERRUPTPOLARITY_LOW ) |
johnAlexander | 15:932d8b4e52c9 | 4086 | data = 0x10; |
johnAlexander | 15:932d8b4e52c9 | 4087 | else |
johnAlexander | 15:932d8b4e52c9 | 4088 | data = 1; |
johnAlexander | 15:932d8b4e52c9 | 4089 | |
JerrySzczurak | 20:cf211a3b3d9e | 4090 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4091 | VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 4092 | |
JerrySzczurak | 20:cf211a3b3d9e | 4093 | } else if ( device_mode == VL53L0X_DEVICEMODE_GPIO_OSC ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4094 | |
JerrySzczurak | 20:cf211a3b3d9e | 4095 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4096 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4097 | |
JerrySzczurak | 20:cf211a3b3d9e | 4098 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4099 | status |= vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4100 | status |= vl53l0x_write_byte( dev, 0x85, 0x02 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4101 | |
JerrySzczurak | 20:cf211a3b3d9e | 4102 | status |= vl53l0x_write_byte( dev, 0xff, 0x04 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4103 | status |= vl53l0x_write_byte( dev, 0xcd, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4104 | status |= vl53l0x_write_byte( dev, 0xcc, 0x11 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4105 | |
JerrySzczurak | 20:cf211a3b3d9e | 4106 | status |= vl53l0x_write_byte( dev, 0xff, 0x07 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4107 | status |= vl53l0x_write_byte( dev, 0xbe, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4108 | |
JerrySzczurak | 20:cf211a3b3d9e | 4109 | status |= vl53l0x_write_byte( dev, 0xff, 0x06 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4110 | status |= vl53l0x_write_byte( dev, 0xcc, 0x09 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4111 | |
JerrySzczurak | 20:cf211a3b3d9e | 4112 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4113 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4114 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
johnAlexander | 15:932d8b4e52c9 | 4115 | |
johnAlexander | 15:932d8b4e52c9 | 4116 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4117 | |
JerrySzczurak | 20:cf211a3b3d9e | 4118 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4119 | switch ( functionality ) { |
johnAlexander | 15:932d8b4e52c9 | 4120 | case VL53L0X_GPIOFUNCTIONALITY_OFF: |
johnAlexander | 15:932d8b4e52c9 | 4121 | data = 0x00; |
johnAlexander | 15:932d8b4e52c9 | 4122 | break; |
johnAlexander | 15:932d8b4e52c9 | 4123 | case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: |
johnAlexander | 15:932d8b4e52c9 | 4124 | data = 0x01; |
johnAlexander | 15:932d8b4e52c9 | 4125 | break; |
johnAlexander | 15:932d8b4e52c9 | 4126 | case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: |
johnAlexander | 15:932d8b4e52c9 | 4127 | data = 0x02; |
johnAlexander | 15:932d8b4e52c9 | 4128 | break; |
johnAlexander | 15:932d8b4e52c9 | 4129 | case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: |
johnAlexander | 15:932d8b4e52c9 | 4130 | data = 0x03; |
johnAlexander | 15:932d8b4e52c9 | 4131 | break; |
johnAlexander | 15:932d8b4e52c9 | 4132 | case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY: |
johnAlexander | 15:932d8b4e52c9 | 4133 | data = 0x04; |
johnAlexander | 15:932d8b4e52c9 | 4134 | break; |
johnAlexander | 15:932d8b4e52c9 | 4135 | default: |
johnAlexander | 16:98ce55ddbb1a | 4136 | status = |
johnAlexander | 15:932d8b4e52c9 | 4137 | VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; |
johnAlexander | 15:932d8b4e52c9 | 4138 | } |
johnAlexander | 15:932d8b4e52c9 | 4139 | } |
johnAlexander | 15:932d8b4e52c9 | 4140 | |
JerrySzczurak | 20:cf211a3b3d9e | 4141 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4142 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4143 | VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 4144 | |
JerrySzczurak | 20:cf211a3b3d9e | 4145 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4146 | if ( polarity == VL53L0X_INTERRUPTPOLARITY_LOW ) |
johnAlexander | 15:932d8b4e52c9 | 4147 | data = 0; |
johnAlexander | 15:932d8b4e52c9 | 4148 | else |
JerrySzczurak | 20:cf211a3b3d9e | 4149 | data = ( uint8_t )( 1 << 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4150 | |
JerrySzczurak | 20:cf211a3b3d9e | 4151 | status = vl53l0x_update_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4152 | VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data ); |
johnAlexander | 15:932d8b4e52c9 | 4153 | } |
johnAlexander | 15:932d8b4e52c9 | 4154 | |
JerrySzczurak | 20:cf211a3b3d9e | 4155 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4156 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4157 | Pin0GpioFunctionality, functionality ); |
JerrySzczurak | 20:cf211a3b3d9e | 4158 | |
JerrySzczurak | 20:cf211a3b3d9e | 4159 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4160 | status = vl53l0x_clear_interrupt_mask( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4161 | |
JerrySzczurak | 20:cf211a3b3d9e | 4162 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4163 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4164 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4165 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4166 | |
JerrySzczurak | 20:cf211a3b3d9e | 4167 | VL53L0X_Error VL53L0X::vl53l0x_get_fraction_enable( VL53L0X_DEV dev, uint8_t *p_enabled ) |
johnAlexander | 0:c523920bcc09 | 4168 | { |
johnAlexander | 16:98ce55ddbb1a | 4169 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 4170 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4171 | |
JerrySzczurak | 20:cf211a3b3d9e | 4172 | status = vl53l0x_read_byte( dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, p_enabled ); |
JerrySzczurak | 20:cf211a3b3d9e | 4173 | |
JerrySzczurak | 20:cf211a3b3d9e | 4174 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4175 | *p_enabled = ( *p_enabled & 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4176 | |
JerrySzczurak | 20:cf211a3b3d9e | 4177 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4178 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4179 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4180 | |
JerrySzczurak | 20:cf211a3b3d9e | 4181 | uint16_t VL53L0X::vl53l0x_encode_timeout( uint32_t timeout_macro_clks ) |
johnAlexander | 0:c523920bcc09 | 4182 | { |
johnAlexander | 15:932d8b4e52c9 | 4183 | /*! |
johnAlexander | 15:932d8b4e52c9 | 4184 | * Encode timeout in macro periods in (LSByte * 2^MSByte) + 1 format |
johnAlexander | 15:932d8b4e52c9 | 4185 | */ |
johnAlexander | 15:932d8b4e52c9 | 4186 | |
johnAlexander | 15:932d8b4e52c9 | 4187 | uint16_t encoded_timeout = 0; |
johnAlexander | 15:932d8b4e52c9 | 4188 | uint32_t ls_byte = 0; |
johnAlexander | 15:932d8b4e52c9 | 4189 | uint16_t ms_byte = 0; |
johnAlexander | 15:932d8b4e52c9 | 4190 | |
JerrySzczurak | 20:cf211a3b3d9e | 4191 | if ( timeout_macro_clks > 0 ) { |
johnAlexander | 15:932d8b4e52c9 | 4192 | ls_byte = timeout_macro_clks - 1; |
johnAlexander | 15:932d8b4e52c9 | 4193 | |
JerrySzczurak | 20:cf211a3b3d9e | 4194 | while ( ( ls_byte & 0xFFFFFF00 ) > 0 ) { |
johnAlexander | 15:932d8b4e52c9 | 4195 | ls_byte = ls_byte >> 1; |
johnAlexander | 15:932d8b4e52c9 | 4196 | ms_byte++; |
johnAlexander | 15:932d8b4e52c9 | 4197 | } |
johnAlexander | 15:932d8b4e52c9 | 4198 | |
JerrySzczurak | 20:cf211a3b3d9e | 4199 | encoded_timeout = ( ms_byte << 8 ) |
JerrySzczurak | 20:cf211a3b3d9e | 4200 | + ( uint16_t ) ( ls_byte & 0x000000FF ); |
johnAlexander | 15:932d8b4e52c9 | 4201 | } |
johnAlexander | 15:932d8b4e52c9 | 4202 | |
johnAlexander | 15:932d8b4e52c9 | 4203 | return encoded_timeout; |
johnAlexander | 0:c523920bcc09 | 4204 | |
johnAlexander | 0:c523920bcc09 | 4205 | } |
johnAlexander | 0:c523920bcc09 | 4206 | |
JerrySzczurak | 20:cf211a3b3d9e | 4207 | VL53L0X_Error VL53L0X::set_sequence_step_timeout( VL53L0X_DEV dev, |
johnAlexander | 16:98ce55ddbb1a | 4208 | VL53L0X_SequenceStepId sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 4209 | uint32_t timeout_micro_secs ) |
johnAlexander | 0:c523920bcc09 | 4210 | { |
johnAlexander | 16:98ce55ddbb1a | 4211 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 4212 | uint8_t current_vcsel_pulse_period_p_clk; |
johnAlexander | 16:98ce55ddbb1a | 4213 | uint8_t msrc_encoded_time_out; |
johnAlexander | 16:98ce55ddbb1a | 4214 | uint16_t pre_range_encoded_time_out; |
johnAlexander | 16:98ce55ddbb1a | 4215 | uint16_t pre_range_time_out_m_clks; |
johnAlexander | 16:98ce55ddbb1a | 4216 | uint16_t msrc_range_time_out_m_clks; |
johnAlexander | 16:98ce55ddbb1a | 4217 | uint32_t final_range_time_out_m_clks; |
johnAlexander | 16:98ce55ddbb1a | 4218 | uint16_t final_range_encoded_time_out; |
johnAlexander | 16:98ce55ddbb1a | 4219 | VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps; |
johnAlexander | 16:98ce55ddbb1a | 4220 | |
JerrySzczurak | 20:cf211a3b3d9e | 4221 | if ( ( sequence_step_id == VL53L0X_SEQUENCESTEP_TCC ) || |
JerrySzczurak | 20:cf211a3b3d9e | 4222 | ( sequence_step_id == VL53L0X_SEQUENCESTEP_DSS ) || |
JerrySzczurak | 20:cf211a3b3d9e | 4223 | ( sequence_step_id == VL53L0X_SEQUENCESTEP_MSRC ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4224 | |
JerrySzczurak | 20:cf211a3b3d9e | 4225 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4226 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4227 | ¤t_vcsel_pulse_period_p_clk ); |
JerrySzczurak | 20:cf211a3b3d9e | 4228 | |
JerrySzczurak | 20:cf211a3b3d9e | 4229 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4230 | msrc_range_time_out_m_clks = vl53l0x_calc_timeout_mclks( dev, |
johnAlexander | 16:98ce55ddbb1a | 4231 | timeout_micro_secs, |
JerrySzczurak | 20:cf211a3b3d9e | 4232 | ( uint8_t )current_vcsel_pulse_period_p_clk ); |
JerrySzczurak | 20:cf211a3b3d9e | 4233 | |
JerrySzczurak | 20:cf211a3b3d9e | 4234 | if ( msrc_range_time_out_m_clks > 256 ) |
johnAlexander | 16:98ce55ddbb1a | 4235 | msrc_encoded_time_out = 255; |
johnAlexander | 15:932d8b4e52c9 | 4236 | else |
johnAlexander | 16:98ce55ddbb1a | 4237 | msrc_encoded_time_out = |
JerrySzczurak | 20:cf211a3b3d9e | 4238 | ( uint8_t )msrc_range_time_out_m_clks - 1; |
JerrySzczurak | 20:cf211a3b3d9e | 4239 | |
JerrySzczurak | 20:cf211a3b3d9e | 4240 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4241 | LastEncodedTimeout, |
JerrySzczurak | 20:cf211a3b3d9e | 4242 | msrc_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 4243 | } |
johnAlexander | 15:932d8b4e52c9 | 4244 | |
JerrySzczurak | 20:cf211a3b3d9e | 4245 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4246 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4247 | VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, |
JerrySzczurak | 20:cf211a3b3d9e | 4248 | msrc_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 4249 | } |
johnAlexander | 15:932d8b4e52c9 | 4250 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4251 | |
JerrySzczurak | 20:cf211a3b3d9e | 4252 | if ( sequence_step_id == VL53L0X_SEQUENCESTEP_PRE_RANGE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4253 | |
JerrySzczurak | 20:cf211a3b3d9e | 4254 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4255 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4256 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4257 | ¤t_vcsel_pulse_period_p_clk ); |
johnAlexander | 16:98ce55ddbb1a | 4258 | pre_range_time_out_m_clks = |
JerrySzczurak | 20:cf211a3b3d9e | 4259 | vl53l0x_calc_timeout_mclks( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4260 | timeout_micro_secs, |
JerrySzczurak | 20:cf211a3b3d9e | 4261 | ( uint8_t )current_vcsel_pulse_period_p_clk ); |
johnAlexander | 16:98ce55ddbb1a | 4262 | pre_range_encoded_time_out = vl53l0x_encode_timeout( |
JerrySzczurak | 20:cf211a3b3d9e | 4263 | pre_range_time_out_m_clks ); |
JerrySzczurak | 20:cf211a3b3d9e | 4264 | |
JerrySzczurak | 20:cf211a3b3d9e | 4265 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4266 | LastEncodedTimeout, |
JerrySzczurak | 20:cf211a3b3d9e | 4267 | pre_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 4268 | } |
johnAlexander | 15:932d8b4e52c9 | 4269 | |
JerrySzczurak | 20:cf211a3b3d9e | 4270 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4271 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4272 | VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, |
JerrySzczurak | 20:cf211a3b3d9e | 4273 | pre_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 4274 | } |
johnAlexander | 15:932d8b4e52c9 | 4275 | |
JerrySzczurak | 20:cf211a3b3d9e | 4276 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4277 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 16:98ce55ddbb1a | 4278 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4279 | PreRangeTimeoutMicroSecs, |
JerrySzczurak | 20:cf211a3b3d9e | 4280 | timeout_micro_secs ); |
johnAlexander | 15:932d8b4e52c9 | 4281 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4282 | } else if ( sequence_step_id == VL53L0X_SEQUENCESTEP_FINAL_RANGE ) { |
johnAlexander | 15:932d8b4e52c9 | 4283 | |
johnAlexander | 15:932d8b4e52c9 | 4284 | /* For the final range timeout, the pre-range timeout |
johnAlexander | 15:932d8b4e52c9 | 4285 | * must be added. To do this both final and pre-range |
johnAlexander | 15:932d8b4e52c9 | 4286 | * timeouts must be expressed in macro periods MClks |
johnAlexander | 15:932d8b4e52c9 | 4287 | * because they have different vcsel periods. |
johnAlexander | 15:932d8b4e52c9 | 4288 | */ |
johnAlexander | 15:932d8b4e52c9 | 4289 | |
JerrySzczurak | 20:cf211a3b3d9e | 4290 | vl53l0x_get_sequence_step_enables( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4291 | &scheduler_sequence_steps ); |
johnAlexander | 16:98ce55ddbb1a | 4292 | pre_range_time_out_m_clks = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 4293 | if ( scheduler_sequence_steps.PreRangeOn ) { |
johnAlexander | 15:932d8b4e52c9 | 4294 | |
johnAlexander | 15:932d8b4e52c9 | 4295 | /* Retrieve PRE-RANGE VCSEL Period */ |
JerrySzczurak | 20:cf211a3b3d9e | 4296 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4297 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4298 | ¤t_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 4299 | |
johnAlexander | 15:932d8b4e52c9 | 4300 | /* Retrieve PRE-RANGE Timeout in Macro periods |
johnAlexander | 15:932d8b4e52c9 | 4301 | * (MCLKS) */ |
JerrySzczurak | 20:cf211a3b3d9e | 4302 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4303 | status = vl53l0x_read_word( dev, 0x51, |
JerrySzczurak | 20:cf211a3b3d9e | 4304 | &pre_range_encoded_time_out ); |
johnAlexander | 16:98ce55ddbb1a | 4305 | pre_range_time_out_m_clks = |
johnAlexander | 16:98ce55ddbb1a | 4306 | vl53l0x_decode_timeout( |
JerrySzczurak | 20:cf211a3b3d9e | 4307 | pre_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 4308 | } |
johnAlexander | 15:932d8b4e52c9 | 4309 | } |
johnAlexander | 15:932d8b4e52c9 | 4310 | |
johnAlexander | 15:932d8b4e52c9 | 4311 | /* Calculate FINAL RANGE Timeout in Macro Periods |
johnAlexander | 15:932d8b4e52c9 | 4312 | * (MCLKS) and add PRE-RANGE value |
johnAlexander | 15:932d8b4e52c9 | 4313 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 4314 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4315 | |
JerrySzczurak | 20:cf211a3b3d9e | 4316 | status = vl53l0x_get_vcsel_pulse_period( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4317 | VL53L0X_VCSEL_PERIOD_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4318 | ¤t_vcsel_pulse_period_p_clk ); |
johnAlexander | 15:932d8b4e52c9 | 4319 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4320 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 4321 | |
johnAlexander | 16:98ce55ddbb1a | 4322 | final_range_time_out_m_clks = |
JerrySzczurak | 20:cf211a3b3d9e | 4323 | vl53l0x_calc_timeout_mclks( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4324 | timeout_micro_secs, |
JerrySzczurak | 20:cf211a3b3d9e | 4325 | ( uint8_t ) current_vcsel_pulse_period_p_clk ); |
johnAlexander | 16:98ce55ddbb1a | 4326 | |
johnAlexander | 16:98ce55ddbb1a | 4327 | final_range_time_out_m_clks += pre_range_time_out_m_clks; |
johnAlexander | 16:98ce55ddbb1a | 4328 | |
johnAlexander | 16:98ce55ddbb1a | 4329 | final_range_encoded_time_out = |
JerrySzczurak | 20:cf211a3b3d9e | 4330 | vl53l0x_encode_timeout( final_range_time_out_m_clks ); |
JerrySzczurak | 20:cf211a3b3d9e | 4331 | |
JerrySzczurak | 20:cf211a3b3d9e | 4332 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4333 | status = vl53l0x_write_word( dev, 0x71, |
JerrySzczurak | 20:cf211a3b3d9e | 4334 | final_range_encoded_time_out ); |
johnAlexander | 15:932d8b4e52c9 | 4335 | } |
johnAlexander | 15:932d8b4e52c9 | 4336 | |
JerrySzczurak | 20:cf211a3b3d9e | 4337 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4338 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 16:98ce55ddbb1a | 4339 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4340 | FinalRangeTimeoutMicroSecs, |
JerrySzczurak | 20:cf211a3b3d9e | 4341 | timeout_micro_secs ); |
johnAlexander | 15:932d8b4e52c9 | 4342 | } |
johnAlexander | 15:932d8b4e52c9 | 4343 | } |
johnAlexander | 15:932d8b4e52c9 | 4344 | } else |
johnAlexander | 16:98ce55ddbb1a | 4345 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4346 | |
johnAlexander | 15:932d8b4e52c9 | 4347 | } |
johnAlexander | 16:98ce55ddbb1a | 4348 | return status; |
johnAlexander | 0:c523920bcc09 | 4349 | } |
johnAlexander | 0:c523920bcc09 | 4350 | |
JerrySzczurak | 20:cf211a3b3d9e | 4351 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_set_measurement_timing_budget_micro_seconds( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4352 | uint32_t measurement_timing_budget_micro_seconds ) |
johnAlexander | 0:c523920bcc09 | 4353 | { |
johnAlexander | 16:98ce55ddbb1a | 4354 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 4355 | uint32_t final_range_timing_budget_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 4356 | VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps; |
johnAlexander | 16:98ce55ddbb1a | 4357 | uint32_t msrc_dcc_tcc_timeout_micro_seconds = 2000; |
johnAlexander | 16:98ce55ddbb1a | 4358 | uint32_t start_overhead_micro_seconds = 1910; |
johnAlexander | 16:98ce55ddbb1a | 4359 | uint32_t end_overhead_micro_seconds = 960; |
johnAlexander | 16:98ce55ddbb1a | 4360 | uint32_t msrc_overhead_micro_seconds = 660; |
johnAlexander | 16:98ce55ddbb1a | 4361 | uint32_t tcc_overhead_micro_seconds = 590; |
johnAlexander | 16:98ce55ddbb1a | 4362 | uint32_t dss_overhead_micro_seconds = 690; |
johnAlexander | 16:98ce55ddbb1a | 4363 | uint32_t pre_range_overhead_micro_seconds = 660; |
johnAlexander | 16:98ce55ddbb1a | 4364 | uint32_t final_range_overhead_micro_seconds = 550; |
johnAlexander | 16:98ce55ddbb1a | 4365 | uint32_t pre_range_timeout_micro_seconds = 0; |
johnAlexander | 16:98ce55ddbb1a | 4366 | uint32_t c_min_timing_budget_micro_seconds = 20000; |
johnAlexander | 16:98ce55ddbb1a | 4367 | uint32_t sub_timeout = 0; |
johnAlexander | 15:932d8b4e52c9 | 4368 | |
JerrySzczurak | 20:cf211a3b3d9e | 4369 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4370 | |
JerrySzczurak | 20:cf211a3b3d9e | 4371 | if ( measurement_timing_budget_micro_seconds |
JerrySzczurak | 20:cf211a3b3d9e | 4372 | < c_min_timing_budget_micro_seconds ) { |
johnAlexander | 16:98ce55ddbb1a | 4373 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 16:98ce55ddbb1a | 4374 | return status; |
johnAlexander | 15:932d8b4e52c9 | 4375 | } |
johnAlexander | 15:932d8b4e52c9 | 4376 | |
johnAlexander | 16:98ce55ddbb1a | 4377 | final_range_timing_budget_micro_seconds = |
johnAlexander | 16:98ce55ddbb1a | 4378 | measurement_timing_budget_micro_seconds - |
JerrySzczurak | 20:cf211a3b3d9e | 4379 | ( start_overhead_micro_seconds + end_overhead_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 4380 | |
JerrySzczurak | 20:cf211a3b3d9e | 4381 | status = vl53l0x_get_sequence_step_enables( dev, &scheduler_sequence_steps ); |
JerrySzczurak | 20:cf211a3b3d9e | 4382 | |
JerrySzczurak | 20:cf211a3b3d9e | 4383 | if ( status == VL53L0X_ERROR_NONE && |
JerrySzczurak | 20:cf211a3b3d9e | 4384 | ( scheduler_sequence_steps.TccOn || |
JerrySzczurak | 20:cf211a3b3d9e | 4385 | scheduler_sequence_steps.MsrcOn || |
JerrySzczurak | 20:cf211a3b3d9e | 4386 | scheduler_sequence_steps.DssOn ) ) { |
johnAlexander | 15:932d8b4e52c9 | 4387 | |
johnAlexander | 15:932d8b4e52c9 | 4388 | /* TCC, MSRC and DSS all share the same timeout */ |
JerrySzczurak | 20:cf211a3b3d9e | 4389 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4390 | VL53L0X_SEQUENCESTEP_MSRC, |
JerrySzczurak | 20:cf211a3b3d9e | 4391 | &msrc_dcc_tcc_timeout_micro_seconds ); |
johnAlexander | 15:932d8b4e52c9 | 4392 | |
johnAlexander | 15:932d8b4e52c9 | 4393 | /* Subtract the TCC, MSRC and DSS timeouts if they are |
johnAlexander | 15:932d8b4e52c9 | 4394 | * enabled. */ |
johnAlexander | 15:932d8b4e52c9 | 4395 | |
JerrySzczurak | 20:cf211a3b3d9e | 4396 | if ( status != VL53L0X_ERROR_NONE ) |
johnAlexander | 16:98ce55ddbb1a | 4397 | return status; |
johnAlexander | 15:932d8b4e52c9 | 4398 | |
johnAlexander | 15:932d8b4e52c9 | 4399 | /* TCC */ |
JerrySzczurak | 20:cf211a3b3d9e | 4400 | if ( scheduler_sequence_steps.TccOn ) { |
johnAlexander | 16:98ce55ddbb1a | 4401 | |
johnAlexander | 16:98ce55ddbb1a | 4402 | sub_timeout = msrc_dcc_tcc_timeout_micro_seconds |
johnAlexander | 16:98ce55ddbb1a | 4403 | + tcc_overhead_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 4404 | |
JerrySzczurak | 20:cf211a3b3d9e | 4405 | if ( sub_timeout < |
JerrySzczurak | 20:cf211a3b3d9e | 4406 | final_range_timing_budget_micro_seconds ) { |
johnAlexander | 16:98ce55ddbb1a | 4407 | final_range_timing_budget_micro_seconds -= |
johnAlexander | 16:98ce55ddbb1a | 4408 | sub_timeout; |
johnAlexander | 15:932d8b4e52c9 | 4409 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4410 | /* Requested timeout too big. */ |
johnAlexander | 16:98ce55ddbb1a | 4411 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4412 | } |
johnAlexander | 15:932d8b4e52c9 | 4413 | } |
johnAlexander | 15:932d8b4e52c9 | 4414 | |
JerrySzczurak | 20:cf211a3b3d9e | 4415 | if ( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4416 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 4417 | return status; |
johnAlexander | 15:932d8b4e52c9 | 4418 | } |
johnAlexander | 15:932d8b4e52c9 | 4419 | |
johnAlexander | 15:932d8b4e52c9 | 4420 | /* DSS */ |
JerrySzczurak | 20:cf211a3b3d9e | 4421 | if ( scheduler_sequence_steps.DssOn ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4422 | |
JerrySzczurak | 20:cf211a3b3d9e | 4423 | sub_timeout = 2 * ( msrc_dcc_tcc_timeout_micro_seconds + |
JerrySzczurak | 20:cf211a3b3d9e | 4424 | dss_overhead_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 4425 | |
JerrySzczurak | 20:cf211a3b3d9e | 4426 | if ( sub_timeout < final_range_timing_budget_micro_seconds ) { |
johnAlexander | 16:98ce55ddbb1a | 4427 | final_range_timing_budget_micro_seconds |
johnAlexander | 16:98ce55ddbb1a | 4428 | -= sub_timeout; |
johnAlexander | 15:932d8b4e52c9 | 4429 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4430 | /* Requested timeout too big. */ |
johnAlexander | 16:98ce55ddbb1a | 4431 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4432 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4433 | } else if ( scheduler_sequence_steps.MsrcOn ) { |
johnAlexander | 15:932d8b4e52c9 | 4434 | /* MSRC */ |
johnAlexander | 16:98ce55ddbb1a | 4435 | sub_timeout = msrc_dcc_tcc_timeout_micro_seconds + |
johnAlexander | 16:98ce55ddbb1a | 4436 | msrc_overhead_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 4437 | |
JerrySzczurak | 20:cf211a3b3d9e | 4438 | if ( sub_timeout < final_range_timing_budget_micro_seconds ) { |
johnAlexander | 16:98ce55ddbb1a | 4439 | final_range_timing_budget_micro_seconds |
johnAlexander | 16:98ce55ddbb1a | 4440 | -= sub_timeout; |
johnAlexander | 15:932d8b4e52c9 | 4441 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4442 | /* Requested timeout too big. */ |
johnAlexander | 16:98ce55ddbb1a | 4443 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4444 | } |
johnAlexander | 15:932d8b4e52c9 | 4445 | } |
johnAlexander | 15:932d8b4e52c9 | 4446 | |
johnAlexander | 15:932d8b4e52c9 | 4447 | } |
johnAlexander | 15:932d8b4e52c9 | 4448 | |
JerrySzczurak | 20:cf211a3b3d9e | 4449 | if ( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4450 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 4451 | return status; |
johnAlexander | 15:932d8b4e52c9 | 4452 | } |
johnAlexander | 15:932d8b4e52c9 | 4453 | |
JerrySzczurak | 20:cf211a3b3d9e | 4454 | if ( scheduler_sequence_steps.PreRangeOn ) { |
johnAlexander | 15:932d8b4e52c9 | 4455 | |
johnAlexander | 15:932d8b4e52c9 | 4456 | /* Subtract the Pre-range timeout if enabled. */ |
johnAlexander | 15:932d8b4e52c9 | 4457 | |
JerrySzczurak | 20:cf211a3b3d9e | 4458 | status = get_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4459 | VL53L0X_SEQUENCESTEP_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4460 | &pre_range_timeout_micro_seconds ); |
johnAlexander | 16:98ce55ddbb1a | 4461 | |
johnAlexander | 16:98ce55ddbb1a | 4462 | sub_timeout = pre_range_timeout_micro_seconds + |
johnAlexander | 16:98ce55ddbb1a | 4463 | pre_range_overhead_micro_seconds; |
johnAlexander | 16:98ce55ddbb1a | 4464 | |
JerrySzczurak | 20:cf211a3b3d9e | 4465 | if ( sub_timeout < final_range_timing_budget_micro_seconds ) { |
johnAlexander | 16:98ce55ddbb1a | 4466 | final_range_timing_budget_micro_seconds -= sub_timeout; |
johnAlexander | 15:932d8b4e52c9 | 4467 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4468 | /* Requested timeout too big. */ |
johnAlexander | 16:98ce55ddbb1a | 4469 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4470 | } |
johnAlexander | 15:932d8b4e52c9 | 4471 | } |
johnAlexander | 15:932d8b4e52c9 | 4472 | |
johnAlexander | 15:932d8b4e52c9 | 4473 | |
JerrySzczurak | 20:cf211a3b3d9e | 4474 | if ( status == VL53L0X_ERROR_NONE && |
JerrySzczurak | 20:cf211a3b3d9e | 4475 | scheduler_sequence_steps.FinalRangeOn ) { |
johnAlexander | 16:98ce55ddbb1a | 4476 | |
johnAlexander | 16:98ce55ddbb1a | 4477 | final_range_timing_budget_micro_seconds -= |
johnAlexander | 16:98ce55ddbb1a | 4478 | final_range_overhead_micro_seconds; |
johnAlexander | 15:932d8b4e52c9 | 4479 | |
johnAlexander | 15:932d8b4e52c9 | 4480 | /* Final Range Timeout |
johnAlexander | 15:932d8b4e52c9 | 4481 | * Note that the final range timeout is determined by the timing |
johnAlexander | 15:932d8b4e52c9 | 4482 | * budget and the sum of all other timeouts within the sequence. |
johnAlexander | 15:932d8b4e52c9 | 4483 | * If there is no room for the final range timeout, then an error |
johnAlexander | 15:932d8b4e52c9 | 4484 | * will be set. Otherwise the remaining time will be applied to |
johnAlexander | 15:932d8b4e52c9 | 4485 | * the final range. |
johnAlexander | 15:932d8b4e52c9 | 4486 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 4487 | status = set_sequence_step_timeout( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4488 | VL53L0X_SEQUENCESTEP_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4489 | final_range_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 4490 | |
JerrySzczurak | 20:cf211a3b3d9e | 4491 | VL53L0X_SETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4492 | MeasurementTimingBudgetMicroSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 4493 | measurement_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 4494 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4495 | |
JerrySzczurak | 20:cf211a3b3d9e | 4496 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4497 | |
JerrySzczurak | 20:cf211a3b3d9e | 4498 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4499 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4500 | |
JerrySzczurak | 20:cf211a3b3d9e | 4501 | VL53L0X_Error VL53L0X::vl53l0x_set_measurement_timing_budget_micro_seconds( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4502 | uint32_t measurement_timing_budget_micro_seconds ) |
johnAlexander | 0:c523920bcc09 | 4503 | { |
johnAlexander | 16:98ce55ddbb1a | 4504 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 4505 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4506 | |
JerrySzczurak | 20:cf211a3b3d9e | 4507 | status = wrapped_vl53l0x_set_measurement_timing_budget_micro_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4508 | measurement_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 4509 | |
JerrySzczurak | 20:cf211a3b3d9e | 4510 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4511 | |
JerrySzczurak | 20:cf211a3b3d9e | 4512 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4513 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4514 | |
JerrySzczurak | 20:cf211a3b3d9e | 4515 | VL53L0X_Error VL53L0X::vl53l0x_set_sequence_step_enable( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4516 | VL53L0X_SequenceStepId sequence_step_id, uint8_t sequence_step_enabled ) |
johnAlexander | 0:c523920bcc09 | 4517 | { |
johnAlexander | 16:98ce55ddbb1a | 4518 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 4519 | uint8_t sequence_config = 0; |
johnAlexander | 16:98ce55ddbb1a | 4520 | uint8_t sequence_config_new = 0; |
johnAlexander | 16:98ce55ddbb1a | 4521 | uint32_t measurement_timing_budget_micro_seconds; |
JerrySzczurak | 20:cf211a3b3d9e | 4522 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4523 | |
JerrySzczurak | 20:cf211a3b3d9e | 4524 | status = vl53l0x_read_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 4525 | &sequence_config ); |
johnAlexander | 16:98ce55ddbb1a | 4526 | |
johnAlexander | 16:98ce55ddbb1a | 4527 | sequence_config_new = sequence_config; |
johnAlexander | 16:98ce55ddbb1a | 4528 | |
JerrySzczurak | 20:cf211a3b3d9e | 4529 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4530 | if ( sequence_step_enabled == 1 ) { |
johnAlexander | 15:932d8b4e52c9 | 4531 | |
johnAlexander | 15:932d8b4e52c9 | 4532 | /* Enable requested sequence step |
johnAlexander | 15:932d8b4e52c9 | 4533 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 4534 | switch ( sequence_step_id ) { |
johnAlexander | 15:932d8b4e52c9 | 4535 | case VL53L0X_SEQUENCESTEP_TCC: |
johnAlexander | 16:98ce55ddbb1a | 4536 | sequence_config_new |= 0x10; |
johnAlexander | 15:932d8b4e52c9 | 4537 | break; |
johnAlexander | 15:932d8b4e52c9 | 4538 | case VL53L0X_SEQUENCESTEP_DSS: |
johnAlexander | 16:98ce55ddbb1a | 4539 | sequence_config_new |= 0x28; |
johnAlexander | 15:932d8b4e52c9 | 4540 | break; |
johnAlexander | 15:932d8b4e52c9 | 4541 | case VL53L0X_SEQUENCESTEP_MSRC: |
johnAlexander | 16:98ce55ddbb1a | 4542 | sequence_config_new |= 0x04; |
johnAlexander | 15:932d8b4e52c9 | 4543 | break; |
johnAlexander | 15:932d8b4e52c9 | 4544 | case VL53L0X_SEQUENCESTEP_PRE_RANGE: |
johnAlexander | 16:98ce55ddbb1a | 4545 | sequence_config_new |= 0x40; |
johnAlexander | 15:932d8b4e52c9 | 4546 | break; |
johnAlexander | 15:932d8b4e52c9 | 4547 | case VL53L0X_SEQUENCESTEP_FINAL_RANGE: |
johnAlexander | 16:98ce55ddbb1a | 4548 | sequence_config_new |= 0x80; |
johnAlexander | 15:932d8b4e52c9 | 4549 | break; |
johnAlexander | 15:932d8b4e52c9 | 4550 | default: |
johnAlexander | 16:98ce55ddbb1a | 4551 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4552 | } |
johnAlexander | 15:932d8b4e52c9 | 4553 | } else { |
johnAlexander | 15:932d8b4e52c9 | 4554 | /* Disable requested sequence step |
johnAlexander | 15:932d8b4e52c9 | 4555 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 4556 | switch ( sequence_step_id ) { |
johnAlexander | 15:932d8b4e52c9 | 4557 | case VL53L0X_SEQUENCESTEP_TCC: |
johnAlexander | 16:98ce55ddbb1a | 4558 | sequence_config_new &= 0xef; |
johnAlexander | 15:932d8b4e52c9 | 4559 | break; |
johnAlexander | 15:932d8b4e52c9 | 4560 | case VL53L0X_SEQUENCESTEP_DSS: |
johnAlexander | 16:98ce55ddbb1a | 4561 | sequence_config_new &= 0xd7; |
johnAlexander | 15:932d8b4e52c9 | 4562 | break; |
johnAlexander | 15:932d8b4e52c9 | 4563 | case VL53L0X_SEQUENCESTEP_MSRC: |
johnAlexander | 16:98ce55ddbb1a | 4564 | sequence_config_new &= 0xfb; |
johnAlexander | 15:932d8b4e52c9 | 4565 | break; |
johnAlexander | 15:932d8b4e52c9 | 4566 | case VL53L0X_SEQUENCESTEP_PRE_RANGE: |
johnAlexander | 16:98ce55ddbb1a | 4567 | sequence_config_new &= 0xbf; |
johnAlexander | 15:932d8b4e52c9 | 4568 | break; |
johnAlexander | 15:932d8b4e52c9 | 4569 | case VL53L0X_SEQUENCESTEP_FINAL_RANGE: |
johnAlexander | 16:98ce55ddbb1a | 4570 | sequence_config_new &= 0x7f; |
johnAlexander | 15:932d8b4e52c9 | 4571 | break; |
johnAlexander | 15:932d8b4e52c9 | 4572 | default: |
johnAlexander | 16:98ce55ddbb1a | 4573 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4574 | } |
johnAlexander | 15:932d8b4e52c9 | 4575 | } |
johnAlexander | 15:932d8b4e52c9 | 4576 | } |
johnAlexander | 15:932d8b4e52c9 | 4577 | |
JerrySzczurak | 20:cf211a3b3d9e | 4578 | if ( sequence_config_new != sequence_config ) { |
johnAlexander | 15:932d8b4e52c9 | 4579 | /* Apply New Setting */ |
JerrySzczurak | 20:cf211a3b3d9e | 4580 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4581 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4582 | VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, sequence_config_new ); |
johnAlexander | 15:932d8b4e52c9 | 4583 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4584 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4585 | PALDevDataSet( dev, SequenceConfig, sequence_config_new ); |
johnAlexander | 15:932d8b4e52c9 | 4586 | |
johnAlexander | 15:932d8b4e52c9 | 4587 | |
johnAlexander | 15:932d8b4e52c9 | 4588 | /* Recalculate timing budget */ |
JerrySzczurak | 20:cf211a3b3d9e | 4589 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4590 | VL53L0X_GETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4591 | MeasurementTimingBudgetMicroSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 4592 | measurement_timing_budget_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 4593 | |
JerrySzczurak | 20:cf211a3b3d9e | 4594 | vl53l0x_set_measurement_timing_budget_micro_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4595 | measurement_timing_budget_micro_seconds ); |
johnAlexander | 15:932d8b4e52c9 | 4596 | } |
johnAlexander | 15:932d8b4e52c9 | 4597 | } |
johnAlexander | 15:932d8b4e52c9 | 4598 | |
JerrySzczurak | 20:cf211a3b3d9e | 4599 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4600 | |
JerrySzczurak | 20:cf211a3b3d9e | 4601 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4602 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4603 | |
JerrySzczurak | 20:cf211a3b3d9e | 4604 | VL53L0X_Error VL53L0X::vl53l0x_set_limit_check_enable( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 4605 | uint8_t limit_check_enable ) |
johnAlexander | 0:c523920bcc09 | 4606 | { |
johnAlexander | 16:98ce55ddbb1a | 4607 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 4608 | FixPoint1616_t temp_fix1616 = 0; |
johnAlexander | 16:98ce55ddbb1a | 4609 | uint8_t limit_check_enable_int = 0; |
johnAlexander | 16:98ce55ddbb1a | 4610 | uint8_t limit_check_disable = 0; |
johnAlexander | 16:98ce55ddbb1a | 4611 | uint8_t temp8; |
johnAlexander | 15:932d8b4e52c9 | 4612 | |
JerrySzczurak | 20:cf211a3b3d9e | 4613 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4614 | |
JerrySzczurak | 20:cf211a3b3d9e | 4615 | if ( limit_check_id >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS ) { |
johnAlexander | 16:98ce55ddbb1a | 4616 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4617 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 4618 | if ( limit_check_enable == 0 ) { |
johnAlexander | 16:98ce55ddbb1a | 4619 | temp_fix1616 = 0; |
johnAlexander | 16:98ce55ddbb1a | 4620 | limit_check_enable_int = 0; |
johnAlexander | 16:98ce55ddbb1a | 4621 | limit_check_disable = 1; |
johnAlexander | 15:932d8b4e52c9 | 4622 | |
johnAlexander | 15:932d8b4e52c9 | 4623 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 4624 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksValue, |
JerrySzczurak | 20:cf211a3b3d9e | 4625 | limit_check_id, temp_fix1616 ); |
johnAlexander | 16:98ce55ddbb1a | 4626 | limit_check_disable = 0; |
johnAlexander | 15:932d8b4e52c9 | 4627 | /* this to be sure to have either 0 or 1 */ |
johnAlexander | 16:98ce55ddbb1a | 4628 | limit_check_enable_int = 1; |
johnAlexander | 15:932d8b4e52c9 | 4629 | } |
johnAlexander | 15:932d8b4e52c9 | 4630 | |
JerrySzczurak | 20:cf211a3b3d9e | 4631 | switch ( limit_check_id ) { |
johnAlexander | 15:932d8b4e52c9 | 4632 | |
johnAlexander | 15:932d8b4e52c9 | 4633 | case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 4634 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 4635 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 4636 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4637 | limit_check_enable_int ); |
johnAlexander | 15:932d8b4e52c9 | 4638 | |
johnAlexander | 15:932d8b4e52c9 | 4639 | break; |
johnAlexander | 15:932d8b4e52c9 | 4640 | |
johnAlexander | 15:932d8b4e52c9 | 4641 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 4642 | |
JerrySzczurak | 20:cf211a3b3d9e | 4643 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4644 | VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, |
JerrySzczurak | 20:cf211a3b3d9e | 4645 | VL53L0X_FIXPOINT1616TOFIXPOINT97( temp_fix1616 ) ); |
johnAlexander | 15:932d8b4e52c9 | 4646 | |
johnAlexander | 15:932d8b4e52c9 | 4647 | break; |
johnAlexander | 15:932d8b4e52c9 | 4648 | |
johnAlexander | 15:932d8b4e52c9 | 4649 | case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: |
johnAlexander | 15:932d8b4e52c9 | 4650 | |
johnAlexander | 15:932d8b4e52c9 | 4651 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 4652 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 4653 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, |
JerrySzczurak | 20:cf211a3b3d9e | 4654 | limit_check_enable_int ); |
johnAlexander | 15:932d8b4e52c9 | 4655 | |
johnAlexander | 15:932d8b4e52c9 | 4656 | break; |
johnAlexander | 15:932d8b4e52c9 | 4657 | |
johnAlexander | 15:932d8b4e52c9 | 4658 | case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: |
johnAlexander | 15:932d8b4e52c9 | 4659 | |
johnAlexander | 15:932d8b4e52c9 | 4660 | /* internal computation: */ |
JerrySzczurak | 20:cf211a3b3d9e | 4661 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 4662 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, |
JerrySzczurak | 20:cf211a3b3d9e | 4663 | limit_check_enable_int ); |
johnAlexander | 15:932d8b4e52c9 | 4664 | |
johnAlexander | 15:932d8b4e52c9 | 4665 | break; |
johnAlexander | 15:932d8b4e52c9 | 4666 | |
johnAlexander | 15:932d8b4e52c9 | 4667 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: |
johnAlexander | 15:932d8b4e52c9 | 4668 | |
JerrySzczurak | 20:cf211a3b3d9e | 4669 | temp8 = ( uint8_t )( limit_check_disable << 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4670 | status = vl53l0x_update_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4671 | VL53L0X_REG_MSRC_CONFIG_CONTROL, |
JerrySzczurak | 20:cf211a3b3d9e | 4672 | 0xFE, temp8 ); |
johnAlexander | 15:932d8b4e52c9 | 4673 | |
johnAlexander | 15:932d8b4e52c9 | 4674 | break; |
johnAlexander | 15:932d8b4e52c9 | 4675 | |
johnAlexander | 15:932d8b4e52c9 | 4676 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: |
johnAlexander | 15:932d8b4e52c9 | 4677 | |
JerrySzczurak | 20:cf211a3b3d9e | 4678 | temp8 = ( uint8_t )( limit_check_disable << 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4679 | status = vl53l0x_update_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4680 | VL53L0X_REG_MSRC_CONFIG_CONTROL, |
JerrySzczurak | 20:cf211a3b3d9e | 4681 | 0xEF, temp8 ); |
johnAlexander | 15:932d8b4e52c9 | 4682 | |
johnAlexander | 15:932d8b4e52c9 | 4683 | break; |
johnAlexander | 15:932d8b4e52c9 | 4684 | |
johnAlexander | 15:932d8b4e52c9 | 4685 | |
johnAlexander | 15:932d8b4e52c9 | 4686 | default: |
johnAlexander | 16:98ce55ddbb1a | 4687 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 4688 | |
johnAlexander | 15:932d8b4e52c9 | 4689 | } |
johnAlexander | 15:932d8b4e52c9 | 4690 | |
johnAlexander | 15:932d8b4e52c9 | 4691 | } |
johnAlexander | 15:932d8b4e52c9 | 4692 | |
JerrySzczurak | 20:cf211a3b3d9e | 4693 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4694 | if ( limit_check_enable == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4695 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 4696 | limit_check_id, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 4697 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 4698 | VL53L0X_SETARRAYPARAMETERFIELD( dev, LimitChecksEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 4699 | limit_check_id, 1 ); |
johnAlexander | 15:932d8b4e52c9 | 4700 | } |
johnAlexander | 15:932d8b4e52c9 | 4701 | } |
johnAlexander | 15:932d8b4e52c9 | 4702 | |
JerrySzczurak | 20:cf211a3b3d9e | 4703 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4704 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4705 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4706 | |
JerrySzczurak | 20:cf211a3b3d9e | 4707 | VL53L0X_Error VL53L0X::vl53l0x_static_init( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 4708 | { |
johnAlexander | 16:98ce55ddbb1a | 4709 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 4710 | VL53L0X_DeviceParameters_t current_parameters = {0}; |
johnAlexander | 16:98ce55ddbb1a | 4711 | uint8_t *p_tuning_setting_buffer; |
johnAlexander | 15:932d8b4e52c9 | 4712 | uint16_t tempword = 0; |
johnAlexander | 15:932d8b4e52c9 | 4713 | uint8_t tempbyte = 0; |
johnAlexander | 16:98ce55ddbb1a | 4714 | uint8_t use_internal_tuning_settings = 0; |
johnAlexander | 15:932d8b4e52c9 | 4715 | uint32_t count = 0; |
johnAlexander | 16:98ce55ddbb1a | 4716 | uint8_t is_aperture_spads = 0; |
johnAlexander | 16:98ce55ddbb1a | 4717 | uint32_t ref_spad_count = 0; |
johnAlexander | 16:98ce55ddbb1a | 4718 | uint8_t aperture_spads = 0; |
johnAlexander | 16:98ce55ddbb1a | 4719 | uint8_t vcsel_pulse_period_pclk; |
johnAlexander | 16:98ce55ddbb1a | 4720 | uint32_t seq_timeout_micro_secs; |
johnAlexander | 15:932d8b4e52c9 | 4721 | |
JerrySzczurak | 20:cf211a3b3d9e | 4722 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4723 | |
JerrySzczurak | 20:cf211a3b3d9e | 4724 | status = vl53l0x_get_info_from_device( dev, 1 ); |
johnAlexander | 15:932d8b4e52c9 | 4725 | |
johnAlexander | 15:932d8b4e52c9 | 4726 | /* set the ref spad from NVM */ |
JerrySzczurak | 20:cf211a3b3d9e | 4727 | count = ( uint32_t )VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4728 | ReferenceSpadCount ); |
JerrySzczurak | 20:cf211a3b3d9e | 4729 | aperture_spads = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4730 | ReferenceSpadType ); |
johnAlexander | 15:932d8b4e52c9 | 4731 | |
johnAlexander | 15:932d8b4e52c9 | 4732 | /* NVM value invalid */ |
JerrySzczurak | 20:cf211a3b3d9e | 4733 | if ( ( aperture_spads > 1 ) || |
JerrySzczurak | 20:cf211a3b3d9e | 4734 | ( ( aperture_spads == 1 ) && ( count > 32 ) ) || |
JerrySzczurak | 20:cf211a3b3d9e | 4735 | ( ( aperture_spads == 0 ) && ( count > 12 ) ) ) |
JerrySzczurak | 20:cf211a3b3d9e | 4736 | status = wrapped_vl53l0x_perform_ref_spad_management( dev, &ref_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 4737 | &is_aperture_spads ); |
johnAlexander | 15:932d8b4e52c9 | 4738 | else |
JerrySzczurak | 20:cf211a3b3d9e | 4739 | status = wrapped_vl53l0x_set_reference_spads( dev, count, aperture_spads ); |
johnAlexander | 15:932d8b4e52c9 | 4740 | |
johnAlexander | 15:932d8b4e52c9 | 4741 | |
johnAlexander | 15:932d8b4e52c9 | 4742 | /* Initialize tuning settings buffer to prevent compiler warning. */ |
johnAlexander | 16:98ce55ddbb1a | 4743 | p_tuning_setting_buffer = DefaultTuningSettings; |
johnAlexander | 16:98ce55ddbb1a | 4744 | |
JerrySzczurak | 20:cf211a3b3d9e | 4745 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4746 | use_internal_tuning_settings = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4747 | UseInternalTuningSettings ); |
JerrySzczurak | 20:cf211a3b3d9e | 4748 | |
JerrySzczurak | 20:cf211a3b3d9e | 4749 | if ( use_internal_tuning_settings == 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 4750 | p_tuning_setting_buffer = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4751 | pTuningSettingsPointer ); |
johnAlexander | 15:932d8b4e52c9 | 4752 | else |
johnAlexander | 16:98ce55ddbb1a | 4753 | p_tuning_setting_buffer = DefaultTuningSettings; |
johnAlexander | 15:932d8b4e52c9 | 4754 | |
johnAlexander | 15:932d8b4e52c9 | 4755 | } |
johnAlexander | 15:932d8b4e52c9 | 4756 | |
JerrySzczurak | 20:cf211a3b3d9e | 4757 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4758 | status = vl53l0x_load_tuning_settings( dev, p_tuning_setting_buffer ); |
johnAlexander | 15:932d8b4e52c9 | 4759 | |
johnAlexander | 15:932d8b4e52c9 | 4760 | |
johnAlexander | 15:932d8b4e52c9 | 4761 | /* Set interrupt config to new sample ready */ |
JerrySzczurak | 20:cf211a3b3d9e | 4762 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4763 | status = vl53l0x_set_gpio_config( dev, 0, 0, |
JerrySzczurak | 20:cf211a3b3d9e | 4764 | VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, |
JerrySzczurak | 20:cf211a3b3d9e | 4765 | VL53L0X_INTERRUPTPOLARITY_LOW ); |
JerrySzczurak | 20:cf211a3b3d9e | 4766 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4767 | |
JerrySzczurak | 20:cf211a3b3d9e | 4768 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4769 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4770 | status |= vl53l0x_read_word( dev, 0x84, &tempword ); |
JerrySzczurak | 20:cf211a3b3d9e | 4771 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4772 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4773 | |
JerrySzczurak | 20:cf211a3b3d9e | 4774 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4775 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, OscFrequencyMHz, |
JerrySzczurak | 20:cf211a3b3d9e | 4776 | VL53L0X_FIXPOINT412TOFIXPOINT1616( tempword ) ); |
johnAlexander | 15:932d8b4e52c9 | 4777 | } |
johnAlexander | 15:932d8b4e52c9 | 4778 | |
johnAlexander | 15:932d8b4e52c9 | 4779 | /* After static init, some device parameters may be changed, |
johnAlexander | 15:932d8b4e52c9 | 4780 | * so update them */ |
JerrySzczurak | 20:cf211a3b3d9e | 4781 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4782 | status = vl53l0x_get_device_parameters( dev, ¤t_parameters ); |
JerrySzczurak | 20:cf211a3b3d9e | 4783 | |
JerrySzczurak | 20:cf211a3b3d9e | 4784 | |
JerrySzczurak | 20:cf211a3b3d9e | 4785 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4786 | status = vl53l0x_get_fraction_enable( dev, &tempbyte ); |
JerrySzczurak | 20:cf211a3b3d9e | 4787 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4788 | PALDevDataSet( dev, RangeFractionalEnable, tempbyte ); |
JerrySzczurak | 20:cf211a3b3d9e | 4789 | |
JerrySzczurak | 20:cf211a3b3d9e | 4790 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4791 | |
JerrySzczurak | 20:cf211a3b3d9e | 4792 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4793 | PALDevDataSet( dev, CurrentParameters, current_parameters ); |
johnAlexander | 15:932d8b4e52c9 | 4794 | |
johnAlexander | 15:932d8b4e52c9 | 4795 | |
johnAlexander | 15:932d8b4e52c9 | 4796 | /* read the sequence config and save it */ |
JerrySzczurak | 20:cf211a3b3d9e | 4797 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4798 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4799 | VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte ); |
JerrySzczurak | 20:cf211a3b3d9e | 4800 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4801 | PALDevDataSet( dev, SequenceConfig, tempbyte ); |
johnAlexander | 15:932d8b4e52c9 | 4802 | |
johnAlexander | 15:932d8b4e52c9 | 4803 | } |
johnAlexander | 15:932d8b4e52c9 | 4804 | |
johnAlexander | 15:932d8b4e52c9 | 4805 | /* Disable MSRC and TCC by default */ |
JerrySzczurak | 20:cf211a3b3d9e | 4806 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4807 | status = vl53l0x_set_sequence_step_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4808 | VL53L0X_SEQUENCESTEP_TCC, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4809 | |
JerrySzczurak | 20:cf211a3b3d9e | 4810 | |
JerrySzczurak | 20:cf211a3b3d9e | 4811 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4812 | status = vl53l0x_set_sequence_step_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4813 | VL53L0X_SEQUENCESTEP_MSRC, 0 ); |
johnAlexander | 15:932d8b4e52c9 | 4814 | |
johnAlexander | 15:932d8b4e52c9 | 4815 | |
johnAlexander | 15:932d8b4e52c9 | 4816 | /* Set PAL State to standby */ |
JerrySzczurak | 20:cf211a3b3d9e | 4817 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4818 | PALDevDataSet( dev, PalState, VL53L0X_STATE_IDLE ); |
johnAlexander | 15:932d8b4e52c9 | 4819 | |
johnAlexander | 15:932d8b4e52c9 | 4820 | |
johnAlexander | 15:932d8b4e52c9 | 4821 | |
johnAlexander | 15:932d8b4e52c9 | 4822 | /* Store pre-range vcsel period */ |
JerrySzczurak | 20:cf211a3b3d9e | 4823 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 4824 | status = vl53l0x_get_vcsel_pulse_period( |
JerrySzczurak | 20:cf211a3b3d9e | 4825 | dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4826 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4827 | &vcsel_pulse_period_pclk ); |
JerrySzczurak | 20:cf211a3b3d9e | 4828 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4829 | |
JerrySzczurak | 20:cf211a3b3d9e | 4830 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4831 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 17:1b842521063a | 4832 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4833 | PreRangeVcselPulsePeriod, |
JerrySzczurak | 20:cf211a3b3d9e | 4834 | vcsel_pulse_period_pclk ); |
johnAlexander | 15:932d8b4e52c9 | 4835 | } |
johnAlexander | 15:932d8b4e52c9 | 4836 | |
johnAlexander | 15:932d8b4e52c9 | 4837 | /* Store final-range vcsel period */ |
JerrySzczurak | 20:cf211a3b3d9e | 4838 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 4839 | status = vl53l0x_get_vcsel_pulse_period( |
JerrySzczurak | 20:cf211a3b3d9e | 4840 | dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4841 | VL53L0X_VCSEL_PERIOD_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4842 | &vcsel_pulse_period_pclk ); |
JerrySzczurak | 20:cf211a3b3d9e | 4843 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4844 | |
JerrySzczurak | 20:cf211a3b3d9e | 4845 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4846 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 17:1b842521063a | 4847 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4848 | FinalRangeVcselPulsePeriod, |
JerrySzczurak | 20:cf211a3b3d9e | 4849 | vcsel_pulse_period_pclk ); |
johnAlexander | 15:932d8b4e52c9 | 4850 | } |
johnAlexander | 15:932d8b4e52c9 | 4851 | |
johnAlexander | 15:932d8b4e52c9 | 4852 | /* Store pre-range timeout */ |
JerrySzczurak | 20:cf211a3b3d9e | 4853 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 4854 | status = get_sequence_step_timeout( |
johnAlexander | 17:1b842521063a | 4855 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4856 | VL53L0X_SEQUENCESTEP_PRE_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4857 | &seq_timeout_micro_secs ); |
JerrySzczurak | 20:cf211a3b3d9e | 4858 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4859 | |
JerrySzczurak | 20:cf211a3b3d9e | 4860 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4861 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 17:1b842521063a | 4862 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4863 | PreRangeTimeoutMicroSecs, |
JerrySzczurak | 20:cf211a3b3d9e | 4864 | seq_timeout_micro_secs ); |
johnAlexander | 15:932d8b4e52c9 | 4865 | } |
johnAlexander | 15:932d8b4e52c9 | 4866 | |
johnAlexander | 15:932d8b4e52c9 | 4867 | /* Store final-range timeout */ |
JerrySzczurak | 20:cf211a3b3d9e | 4868 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 4869 | status = get_sequence_step_timeout( |
johnAlexander | 17:1b842521063a | 4870 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4871 | VL53L0X_SEQUENCESTEP_FINAL_RANGE, |
JerrySzczurak | 20:cf211a3b3d9e | 4872 | &seq_timeout_micro_secs ); |
JerrySzczurak | 20:cf211a3b3d9e | 4873 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4874 | |
JerrySzczurak | 20:cf211a3b3d9e | 4875 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4876 | VL53L0X_SETDEVICESPECIFICPARAMETER( |
johnAlexander | 17:1b842521063a | 4877 | dev, |
johnAlexander | 15:932d8b4e52c9 | 4878 | FinalRangeTimeoutMicroSecs, |
JerrySzczurak | 20:cf211a3b3d9e | 4879 | seq_timeout_micro_secs ); |
JerrySzczurak | 20:cf211a3b3d9e | 4880 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4881 | |
JerrySzczurak | 20:cf211a3b3d9e | 4882 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4883 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4884 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4885 | |
JerrySzczurak | 20:cf211a3b3d9e | 4886 | |
JerrySzczurak | 20:cf211a3b3d9e | 4887 | VL53L0X_Error VL53L0X::vl53l0x_stop_measurement( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 4888 | { |
johnAlexander | 16:98ce55ddbb1a | 4889 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 4890 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4891 | |
JerrySzczurak | 20:cf211a3b3d9e | 4892 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSRANGE_START, |
JerrySzczurak | 20:cf211a3b3d9e | 4893 | VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT ); |
JerrySzczurak | 20:cf211a3b3d9e | 4894 | |
JerrySzczurak | 20:cf211a3b3d9e | 4895 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4896 | status = vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4897 | status = vl53l0x_write_byte( dev, 0x91, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4898 | status = vl53l0x_write_byte( dev, 0x00, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4899 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4900 | |
JerrySzczurak | 20:cf211a3b3d9e | 4901 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 15:932d8b4e52c9 | 4902 | /* Set PAL State to Idle */ |
JerrySzczurak | 20:cf211a3b3d9e | 4903 | PALDevDataSet( dev, PalState, VL53L0X_STATE_IDLE ); |
johnAlexander | 15:932d8b4e52c9 | 4904 | } |
johnAlexander | 15:932d8b4e52c9 | 4905 | |
johnAlexander | 15:932d8b4e52c9 | 4906 | /* Check if need to apply interrupt settings */ |
JerrySzczurak | 20:cf211a3b3d9e | 4907 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4908 | status = vl53l0x_check_and_load_interrupt_settings( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4909 | |
JerrySzczurak | 20:cf211a3b3d9e | 4910 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 4911 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4912 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4913 | |
JerrySzczurak | 20:cf211a3b3d9e | 4914 | VL53L0X_Error VL53L0X::vl53l0x_get_stop_completed_status( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 4915 | uint32_t *p_stop_status ) |
johnAlexander | 0:c523920bcc09 | 4916 | { |
johnAlexander | 16:98ce55ddbb1a | 4917 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
johnAlexander | 16:98ce55ddbb1a | 4918 | uint8_t byte = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 4919 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 4920 | |
JerrySzczurak | 20:cf211a3b3d9e | 4921 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4922 | |
JerrySzczurak | 20:cf211a3b3d9e | 4923 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4924 | status = vl53l0x_read_byte( dev, 0x04, &byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 4925 | |
JerrySzczurak | 20:cf211a3b3d9e | 4926 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 4927 | status = vl53l0x_write_byte( dev, 0xFF, 0x0 ); |
johnAlexander | 16:98ce55ddbb1a | 4928 | |
johnAlexander | 16:98ce55ddbb1a | 4929 | *p_stop_status = byte; |
johnAlexander | 16:98ce55ddbb1a | 4930 | |
JerrySzczurak | 20:cf211a3b3d9e | 4931 | if ( byte == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 4932 | status = vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4933 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4934 | status = vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4935 | status = vl53l0x_write_byte( dev, 0x91, |
JerrySzczurak | 20:cf211a3b3d9e | 4936 | PALDevDataGet( dev, StopVariable ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 4937 | status = vl53l0x_write_byte( dev, 0x00, 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4938 | status = vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4939 | status = vl53l0x_write_byte( dev, 0x80, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4940 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4941 | |
JerrySzczurak | 20:cf211a3b3d9e | 4942 | LOG_FUNCTION_END( status ); |
johnAlexander | 16:98ce55ddbb1a | 4943 | return status; |
johnAlexander | 0:c523920bcc09 | 4944 | } |
johnAlexander | 0:c523920bcc09 | 4945 | |
johnAlexander | 0:c523920bcc09 | 4946 | /****************** Write and read functions from I2C *************************/ |
johnAlexander | 0:c523920bcc09 | 4947 | |
JerrySzczurak | 20:cf211a3b3d9e | 4948 | VL53L0X_Error VL53L0X::vl53l0x_write_multi( VL53L0X_DEV dev, uint8_t index, uint8_t *p_data, uint32_t count ) |
johnAlexander | 0:c523920bcc09 | 4949 | { |
johnAlexander | 15:932d8b4e52c9 | 4950 | int status; |
johnAlexander | 15:932d8b4e52c9 | 4951 | |
JerrySzczurak | 20:cf211a3b3d9e | 4952 | status = vl53l0x_i2c_write( dev->I2cDevAddr, index, p_data, ( uint16_t )count ); |
JerrySzczurak | 20:cf211a3b3d9e | 4953 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4954 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4955 | |
JerrySzczurak | 20:cf211a3b3d9e | 4956 | VL53L0X_Error VL53L0X::vl53l0x_read_multi( VL53L0X_DEV dev, uint8_t index, uint8_t *p_data, uint32_t count ) |
johnAlexander | 0:c523920bcc09 | 4957 | { |
johnAlexander | 0:c523920bcc09 | 4958 | int status; |
johnAlexander | 0:c523920bcc09 | 4959 | |
JerrySzczurak | 20:cf211a3b3d9e | 4960 | if ( count >= VL53L0X_MAX_I2C_XFER_SIZE ) { |
johnAlexander | 0:c523920bcc09 | 4961 | status = VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 0:c523920bcc09 | 4962 | } |
johnAlexander | 0:c523920bcc09 | 4963 | |
JerrySzczurak | 20:cf211a3b3d9e | 4964 | status = vl53l0x_i2c_read( dev->I2cDevAddr, index, p_data, ( uint16_t )count ); |
JerrySzczurak | 20:cf211a3b3d9e | 4965 | |
JerrySzczurak | 20:cf211a3b3d9e | 4966 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4967 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4968 | |
JerrySzczurak | 20:cf211a3b3d9e | 4969 | |
JerrySzczurak | 20:cf211a3b3d9e | 4970 | VL53L0X_Error VL53L0X::vl53l0x_write_byte( VL53L0X_DEV Dev, uint8_t index, uint8_t data ) |
johnAlexander | 0:c523920bcc09 | 4971 | { |
johnAlexander | 15:932d8b4e52c9 | 4972 | int status; |
johnAlexander | 15:932d8b4e52c9 | 4973 | |
JerrySzczurak | 20:cf211a3b3d9e | 4974 | status = vl53l0x_i2c_write( Dev->I2cDevAddr, index, &data, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4975 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4976 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4977 | |
JerrySzczurak | 20:cf211a3b3d9e | 4978 | VL53L0X_Error VL53L0X::vl53l0x_write_word( VL53L0X_DEV dev, uint8_t index, uint16_t data ) |
johnAlexander | 0:c523920bcc09 | 4979 | { |
johnAlexander | 15:932d8b4e52c9 | 4980 | int status; |
johnAlexander | 15:932d8b4e52c9 | 4981 | uint8_t buffer[2]; |
johnAlexander | 15:932d8b4e52c9 | 4982 | |
johnAlexander | 15:932d8b4e52c9 | 4983 | buffer[0] = data >> 8; |
johnAlexander | 15:932d8b4e52c9 | 4984 | buffer[1] = data & 0x00FF; |
JerrySzczurak | 20:cf211a3b3d9e | 4985 | status = vl53l0x_i2c_write( dev->I2cDevAddr, index, ( uint8_t * )buffer, 2 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4986 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 4987 | } |
JerrySzczurak | 20:cf211a3b3d9e | 4988 | |
JerrySzczurak | 20:cf211a3b3d9e | 4989 | VL53L0X_Error VL53L0X::vl53l0x_write_dword( VL53L0X_DEV Dev, uint8_t index, uint32_t data ) |
johnAlexander | 0:c523920bcc09 | 4990 | { |
johnAlexander | 15:932d8b4e52c9 | 4991 | int status; |
johnAlexander | 15:932d8b4e52c9 | 4992 | uint8_t buffer[4]; |
johnAlexander | 15:932d8b4e52c9 | 4993 | |
JerrySzczurak | 20:cf211a3b3d9e | 4994 | buffer[0] = ( data >> 24 ) & 0xFF; |
JerrySzczurak | 20:cf211a3b3d9e | 4995 | buffer[1] = ( data >> 16 ) & 0xFF; |
JerrySzczurak | 20:cf211a3b3d9e | 4996 | buffer[2] = ( data >> 8 ) & 0xFF; |
JerrySzczurak | 20:cf211a3b3d9e | 4997 | buffer[3] = ( data >> 0 ) & 0xFF; |
JerrySzczurak | 20:cf211a3b3d9e | 4998 | status = vl53l0x_i2c_write( Dev->I2cDevAddr, index, ( uint8_t * )buffer, 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 4999 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5000 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5001 | |
JerrySzczurak | 20:cf211a3b3d9e | 5002 | |
JerrySzczurak | 20:cf211a3b3d9e | 5003 | VL53L0X_Error VL53L0X::vl53l0x_read_byte( VL53L0X_DEV Dev, uint8_t index, uint8_t *p_data ) |
johnAlexander | 0:c523920bcc09 | 5004 | { |
johnAlexander | 15:932d8b4e52c9 | 5005 | int status; |
johnAlexander | 15:932d8b4e52c9 | 5006 | |
JerrySzczurak | 20:cf211a3b3d9e | 5007 | status = vl53l0x_i2c_read( Dev->I2cDevAddr, index, p_data, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5008 | |
JerrySzczurak | 20:cf211a3b3d9e | 5009 | if( status ) |
johnAlexander | 15:932d8b4e52c9 | 5010 | return -1; |
johnAlexander | 15:932d8b4e52c9 | 5011 | |
johnAlexander | 15:932d8b4e52c9 | 5012 | return 0; |
johnAlexander | 0:c523920bcc09 | 5013 | } |
johnAlexander | 15:932d8b4e52c9 | 5014 | |
JerrySzczurak | 20:cf211a3b3d9e | 5015 | VL53L0X_Error VL53L0X::vl53l0x_read_word( VL53L0X_DEV Dev, uint8_t index, uint16_t *p_data ) |
johnAlexander | 0:c523920bcc09 | 5016 | { |
johnAlexander | 15:932d8b4e52c9 | 5017 | int status; |
JerrySzczurak | 20:cf211a3b3d9e | 5018 | uint8_t buffer[2] = {0, 0}; |
JerrySzczurak | 20:cf211a3b3d9e | 5019 | |
JerrySzczurak | 20:cf211a3b3d9e | 5020 | status = vl53l0x_i2c_read( Dev->I2cDevAddr, index, buffer, 2 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5021 | if ( !status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5022 | *p_data = ( buffer[0] << 8 ) + buffer[1]; |
JerrySzczurak | 20:cf211a3b3d9e | 5023 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5024 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5025 | |
JerrySzczurak | 20:cf211a3b3d9e | 5026 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5027 | |
JerrySzczurak | 20:cf211a3b3d9e | 5028 | VL53L0X_Error VL53L0X::vl53l0x_read_dword( VL53L0X_DEV Dev, uint8_t index, uint32_t *p_data ) |
johnAlexander | 0:c523920bcc09 | 5029 | { |
johnAlexander | 15:932d8b4e52c9 | 5030 | int status; |
JerrySzczurak | 20:cf211a3b3d9e | 5031 | uint8_t buffer[4] = {0, 0, 0, 0}; |
JerrySzczurak | 20:cf211a3b3d9e | 5032 | |
JerrySzczurak | 20:cf211a3b3d9e | 5033 | status = vl53l0x_i2c_read( Dev->I2cDevAddr, index, buffer, 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5034 | if( !status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5035 | *p_data = ( buffer[0] << 24 ) + ( buffer[1] << 16 ) + ( buffer[2] << 8 ) + buffer[3]; |
JerrySzczurak | 20:cf211a3b3d9e | 5036 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5037 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5038 | |
JerrySzczurak | 20:cf211a3b3d9e | 5039 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5040 | |
JerrySzczurak | 20:cf211a3b3d9e | 5041 | VL53L0X_Error VL53L0X::vl53l0x_update_byte( VL53L0X_DEV Dev, uint8_t index, uint8_t and_data, uint8_t or_data ) |
johnAlexander | 0:c523920bcc09 | 5042 | { |
johnAlexander | 15:932d8b4e52c9 | 5043 | int status; |
johnAlexander | 15:932d8b4e52c9 | 5044 | uint8_t buffer = 0; |
johnAlexander | 15:932d8b4e52c9 | 5045 | |
johnAlexander | 15:932d8b4e52c9 | 5046 | /* read data direct onto buffer */ |
JerrySzczurak | 20:cf211a3b3d9e | 5047 | status = vl53l0x_i2c_read( Dev->I2cDevAddr, index, &buffer, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5048 | if ( !status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5049 | buffer = ( buffer & and_data ) | or_data; |
JerrySzczurak | 20:cf211a3b3d9e | 5050 | status = vl53l0x_i2c_write( Dev->I2cDevAddr, index, &buffer, ( uint8_t )1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5051 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5052 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5053 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5054 | |
JerrySzczurak | 20:cf211a3b3d9e | 5055 | VL53L0X_Error VL53L0X::vl53l0x_i2c_write( uint8_t DeviceAddr, uint8_t RegisterAddr, uint8_t *p_data, |
JerrySzczurak | 20:cf211a3b3d9e | 5056 | uint16_t NumByteToWrite ) |
johnAlexander | 0:c523920bcc09 | 5057 | { |
johnAlexander | 15:932d8b4e52c9 | 5058 | int ret; |
johnAlexander | 15:932d8b4e52c9 | 5059 | |
JerrySzczurak | 20:cf211a3b3d9e | 5060 | ret = dev_i2c.i2c_write( p_data, DeviceAddr, RegisterAddr, NumByteToWrite ); |
JerrySzczurak | 20:cf211a3b3d9e | 5061 | |
JerrySzczurak | 20:cf211a3b3d9e | 5062 | if( ret ) |
johnAlexander | 15:932d8b4e52c9 | 5063 | return -1; |
johnAlexander | 15:932d8b4e52c9 | 5064 | return 0; |
johnAlexander | 0:c523920bcc09 | 5065 | } |
johnAlexander | 15:932d8b4e52c9 | 5066 | |
JerrySzczurak | 20:cf211a3b3d9e | 5067 | VL53L0X_Error VL53L0X::vl53l0x_i2c_read( uint8_t DeviceAddr, uint8_t RegisterAddr, uint8_t *p_data, |
JerrySzczurak | 20:cf211a3b3d9e | 5068 | uint16_t NumByteToRead ) |
johnAlexander | 0:c523920bcc09 | 5069 | { |
johnAlexander | 15:932d8b4e52c9 | 5070 | int ret; |
johnAlexander | 15:932d8b4e52c9 | 5071 | |
JerrySzczurak | 20:cf211a3b3d9e | 5072 | ret = dev_i2c.i2c_read( p_data, DeviceAddr, RegisterAddr, NumByteToRead ); |
JerrySzczurak | 20:cf211a3b3d9e | 5073 | |
JerrySzczurak | 20:cf211a3b3d9e | 5074 | if( ret ) |
johnAlexander | 15:932d8b4e52c9 | 5075 | return -1; |
johnAlexander | 15:932d8b4e52c9 | 5076 | return 0; |
johnAlexander | 15:932d8b4e52c9 | 5077 | } |
johnAlexander | 0:c523920bcc09 | 5078 | |
JerrySzczurak | 20:cf211a3b3d9e | 5079 | int VL53L0X::read_id( uint8_t *id ) |
johnAlexander | 0:c523920bcc09 | 5080 | { |
johnAlexander | 0:c523920bcc09 | 5081 | int status = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5082 | uint16_t rl_id = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5083 | |
JerrySzczurak | 20:cf211a3b3d9e | 5084 | status = vl53l0x_read_word( _device, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &rl_id ); |
JerrySzczurak | 20:cf211a3b3d9e | 5085 | if ( rl_id == 0xEEAA ) |
johnAlexander | 0:c523920bcc09 | 5086 | return status; |
johnAlexander | 15:932d8b4e52c9 | 5087 | |
johnAlexander | 0:c523920bcc09 | 5088 | return -1; |
johnAlexander | 0:c523920bcc09 | 5089 | } |
JerrySzczurak | 11:ceaa5a026412 | 5090 | |
johnAlexander | 15:932d8b4e52c9 | 5091 | |
JerrySzczurak | 20:cf211a3b3d9e | 5092 | VL53L0X_Error VL53L0X::wait_measurement_data_ready( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 5093 | { |
johnAlexander | 16:98ce55ddbb1a | 5094 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5095 | uint8_t new_dat_ready = 0; |
johnAlexander | 16:98ce55ddbb1a | 5096 | uint32_t loop_nb; |
johnAlexander | 0:c523920bcc09 | 5097 | |
johnAlexander | 0:c523920bcc09 | 5098 | // Wait until it finished |
johnAlexander | 0:c523920bcc09 | 5099 | // use timeout to avoid deadlock |
JerrySzczurak | 20:cf211a3b3d9e | 5100 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 5101 | loop_nb = 0; |
johnAlexander | 0:c523920bcc09 | 5102 | do { |
JerrySzczurak | 20:cf211a3b3d9e | 5103 | status = vl53l0x_get_measurement_data_ready( dev, &new_dat_ready ); |
JerrySzczurak | 20:cf211a3b3d9e | 5104 | if ( ( new_dat_ready == 0x01 ) || status != VL53L0X_ERROR_NONE ) { |
johnAlexander | 0:c523920bcc09 | 5105 | break; |
johnAlexander | 0:c523920bcc09 | 5106 | } |
johnAlexander | 16:98ce55ddbb1a | 5107 | loop_nb = loop_nb + 1; |
JerrySzczurak | 20:cf211a3b3d9e | 5108 | vl53l0x_polling_delay( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 5109 | } while ( loop_nb < VL53L0X_DEFAULT_MAX_LOOP ); |
JerrySzczurak | 20:cf211a3b3d9e | 5110 | |
JerrySzczurak | 20:cf211a3b3d9e | 5111 | if ( loop_nb >= VL53L0X_DEFAULT_MAX_LOOP ) { |
johnAlexander | 16:98ce55ddbb1a | 5112 | status = VL53L0X_ERROR_TIME_OUT; |
johnAlexander | 0:c523920bcc09 | 5113 | } |
johnAlexander | 0:c523920bcc09 | 5114 | } |
johnAlexander | 0:c523920bcc09 | 5115 | |
johnAlexander | 16:98ce55ddbb1a | 5116 | return status; |
johnAlexander | 0:c523920bcc09 | 5117 | } |
johnAlexander | 0:c523920bcc09 | 5118 | |
JerrySzczurak | 20:cf211a3b3d9e | 5119 | VL53L0X_Error VL53L0X::wait_stop_completed( VL53L0X_DEV dev ) |
johnAlexander | 0:c523920bcc09 | 5120 | { |
johnAlexander | 16:98ce55ddbb1a | 5121 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5122 | uint32_t stop_completed = 0; |
johnAlexander | 16:98ce55ddbb1a | 5123 | uint32_t loop_nb; |
johnAlexander | 0:c523920bcc09 | 5124 | |
johnAlexander | 0:c523920bcc09 | 5125 | // Wait until it finished |
johnAlexander | 0:c523920bcc09 | 5126 | // use timeout to avoid deadlock |
JerrySzczurak | 20:cf211a3b3d9e | 5127 | if ( status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 16:98ce55ddbb1a | 5128 | loop_nb = 0; |
johnAlexander | 0:c523920bcc09 | 5129 | do { |
JerrySzczurak | 20:cf211a3b3d9e | 5130 | status = vl53l0x_get_stop_completed_status( dev, &stop_completed ); |
JerrySzczurak | 20:cf211a3b3d9e | 5131 | if ( ( stop_completed == 0x00 ) || status != VL53L0X_ERROR_NONE ) { |
johnAlexander | 0:c523920bcc09 | 5132 | break; |
johnAlexander | 0:c523920bcc09 | 5133 | } |
johnAlexander | 16:98ce55ddbb1a | 5134 | loop_nb = loop_nb + 1; |
JerrySzczurak | 20:cf211a3b3d9e | 5135 | vl53l0x_polling_delay( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 5136 | } while ( loop_nb < VL53L0X_DEFAULT_MAX_LOOP ); |
JerrySzczurak | 20:cf211a3b3d9e | 5137 | |
JerrySzczurak | 20:cf211a3b3d9e | 5138 | if ( loop_nb >= VL53L0X_DEFAULT_MAX_LOOP ) { |
johnAlexander | 16:98ce55ddbb1a | 5139 | status = VL53L0X_ERROR_TIME_OUT; |
johnAlexander | 0:c523920bcc09 | 5140 | } |
johnAlexander | 0:c523920bcc09 | 5141 | |
johnAlexander | 0:c523920bcc09 | 5142 | } |
johnAlexander | 0:c523920bcc09 | 5143 | |
johnAlexander | 16:98ce55ddbb1a | 5144 | return status; |
johnAlexander | 0:c523920bcc09 | 5145 | } |
johnAlexander | 0:c523920bcc09 | 5146 | |
johnAlexander | 0:c523920bcc09 | 5147 | |
JerrySzczurak | 20:cf211a3b3d9e | 5148 | int VL53L0X::init_sensor( uint8_t new_addr ) |
johnAlexander | 0:c523920bcc09 | 5149 | { |
johnAlexander | 15:932d8b4e52c9 | 5150 | int status; |
johnAlexander | 15:932d8b4e52c9 | 5151 | |
johnAlexander | 16:98ce55ddbb1a | 5152 | vl53l0x_off(); |
johnAlexander | 16:98ce55ddbb1a | 5153 | vl53l0x_on(); |
johnAlexander | 0:c523920bcc09 | 5154 | |
johnAlexander | 0:c523920bcc09 | 5155 | // status=VL53L0X_WaitDeviceBooted(Device); |
johnAlexander | 0:c523920bcc09 | 5156 | // if(status) |
johnAlexander | 0:c523920bcc09 | 5157 | // printf("WaitDeviceBooted fail\n\r"); |
JerrySzczurak | 20:cf211a3b3d9e | 5158 | status = is_present(); |
JerrySzczurak | 20:cf211a3b3d9e | 5159 | if( !status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5160 | status = init( &_my_device ); |
JerrySzczurak | 20:cf211a3b3d9e | 5161 | if( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5162 | printf( "Failed to init VL53L0X sensor!\n\r" ); |
johnAlexander | 0:c523920bcc09 | 5163 | return status; |
johnAlexander | 15:932d8b4e52c9 | 5164 | } |
johnAlexander | 15:932d8b4e52c9 | 5165 | |
johnAlexander | 15:932d8b4e52c9 | 5166 | // deduce silicon version |
JerrySzczurak | 20:cf211a3b3d9e | 5167 | status = vl53l0x_get_device_info( &_my_device, &_device_info ); |
JerrySzczurak | 20:cf211a3b3d9e | 5168 | |
JerrySzczurak | 20:cf211a3b3d9e | 5169 | |
JerrySzczurak | 20:cf211a3b3d9e | 5170 | status = prepare(); |
JerrySzczurak | 20:cf211a3b3d9e | 5171 | if( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5172 | printf( "Failed to prepare VL53L0X!\n\r" ); |
johnAlexander | 15:932d8b4e52c9 | 5173 | return status; |
johnAlexander | 15:932d8b4e52c9 | 5174 | } |
johnAlexander | 15:932d8b4e52c9 | 5175 | |
JerrySzczurak | 20:cf211a3b3d9e | 5176 | if( new_addr != DEFAULT_DEVICE_ADDRESS ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5177 | status = set_device_address( new_addr ); |
JerrySzczurak | 20:cf211a3b3d9e | 5178 | if( status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5179 | printf( "Failed to change I2C address!\n\r" ); |
johnAlexander | 15:932d8b4e52c9 | 5180 | return status; |
johnAlexander | 15:932d8b4e52c9 | 5181 | } |
johnAlexander | 15:932d8b4e52c9 | 5182 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 5183 | printf( "Invalid new address!\n\r" ); |
johnAlexander | 15:932d8b4e52c9 | 5184 | return VL53L0X_ERROR_INVALID_PARAMS; |
johnAlexander | 15:932d8b4e52c9 | 5185 | } |
johnAlexander | 15:932d8b4e52c9 | 5186 | } |
johnAlexander | 15:932d8b4e52c9 | 5187 | return status; |
johnAlexander | 0:c523920bcc09 | 5188 | } |
johnAlexander | 12:f6e2bad00dc7 | 5189 | |
JerrySzczurak | 20:cf211a3b3d9e | 5190 | int VL53L0X::range_meas_int_continuous_mode( void ( *fptr )( void ) ) |
johnAlexander | 12:f6e2bad00dc7 | 5191 | { |
johnAlexander | 16:98ce55ddbb1a | 5192 | int status, clr_status; |
johnAlexander | 16:98ce55ddbb1a | 5193 | |
JerrySzczurak | 20:cf211a3b3d9e | 5194 | status = vl53l0x_stop_measurement( _device ); // it is safer to do this while sensor is stopped |
johnAlexander | 13:615f7e38568c | 5195 | |
johnAlexander | 13:615f7e38568c | 5196 | // status = VL53L0X_SetInterruptThresholds(Device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, 0, 300); |
johnAlexander | 13:615f7e38568c | 5197 | |
JerrySzczurak | 20:cf211a3b3d9e | 5198 | status = vl53l0x_set_gpio_config( _device, 0, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, |
JerrySzczurak | 20:cf211a3b3d9e | 5199 | VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, |
JerrySzczurak | 20:cf211a3b3d9e | 5200 | VL53L0X_INTERRUPTPOLARITY_HIGH ); |
JerrySzczurak | 20:cf211a3b3d9e | 5201 | |
JerrySzczurak | 20:cf211a3b3d9e | 5202 | if ( !status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5203 | attach_interrupt_measure_detection_irq( fptr ); |
johnAlexander | 16:98ce55ddbb1a | 5204 | enable_interrupt_measure_detection_irq(); |
johnAlexander | 15:932d8b4e52c9 | 5205 | } |
johnAlexander | 15:932d8b4e52c9 | 5206 | |
JerrySzczurak | 20:cf211a3b3d9e | 5207 | clr_status = clear_interrupt( VL53L0X_REG_RESULT_INTERRUPT_STATUS | VL53L0X_REG_RESULT_RANGE_STATUS ); |
JerrySzczurak | 20:cf211a3b3d9e | 5208 | if( clr_status ) |
JerrySzczurak | 20:cf211a3b3d9e | 5209 | VL53L0X_ErrLog( "VL53L0X_ClearErrorInterrupt fail\r\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5210 | |
JerrySzczurak | 20:cf211a3b3d9e | 5211 | if( !status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5212 | status = range_start_continuous_mode(); |
JerrySzczurak | 20:cf211a3b3d9e | 5213 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5214 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5215 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5216 | |
JerrySzczurak | 20:cf211a3b3d9e | 5217 | |
JerrySzczurak | 20:cf211a3b3d9e | 5218 | int VL53L0X::start_measurement( OperatingMode operating_mode, void ( *fptr )( void ) ) |
johnAlexander | 0:c523920bcc09 | 5219 | { |
johnAlexander | 0:c523920bcc09 | 5220 | int Status = VL53L0X_ERROR_NONE; |
johnAlexander | 13:615f7e38568c | 5221 | int ClrStatus; |
johnAlexander | 0:c523920bcc09 | 5222 | |
johnAlexander | 0:c523920bcc09 | 5223 | uint8_t VhvSettings; |
johnAlexander | 0:c523920bcc09 | 5224 | uint8_t PhaseCal; |
johnAlexander | 0:c523920bcc09 | 5225 | // *** from mass market cube expansion v1.1, ranging with satellites. |
johnAlexander | 0:c523920bcc09 | 5226 | // default settings, for normal range. |
JerrySzczurak | 20:cf211a3b3d9e | 5227 | FixPoint1616_t signalLimit = ( FixPoint1616_t )( 0.25 * 65536 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5228 | FixPoint1616_t sigmaLimit = ( FixPoint1616_t )( 18 * 65536 ); |
johnAlexander | 15:932d8b4e52c9 | 5229 | uint32_t timingBudget = 33000; |
johnAlexander | 15:932d8b4e52c9 | 5230 | uint8_t preRangeVcselPeriod = 14; |
johnAlexander | 15:932d8b4e52c9 | 5231 | uint8_t finalRangeVcselPeriod = 10; |
johnAlexander | 15:932d8b4e52c9 | 5232 | |
JerrySzczurak | 20:cf211a3b3d9e | 5233 | if ( operating_mode == range_continuous_interrupt ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5234 | if ( gpio1Int == NULL ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5235 | printf ( "GPIO1 Error\r\n" ); |
johnAlexander | 12:f6e2bad00dc7 | 5236 | return 1; |
johnAlexander | 12:f6e2bad00dc7 | 5237 | } |
johnAlexander | 13:615f7e38568c | 5238 | |
JerrySzczurak | 20:cf211a3b3d9e | 5239 | Status = vl53l0x_stop_measurement( _device ); // it is safer to do this while sensor is stopped |
johnAlexander | 13:615f7e38568c | 5240 | |
johnAlexander | 13:615f7e38568c | 5241 | // Status = VL53L0X_SetInterruptThresholds(Device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, 0, 300); |
johnAlexander | 13:615f7e38568c | 5242 | |
JerrySzczurak | 20:cf211a3b3d9e | 5243 | Status = vl53l0x_set_gpio_config( _device, 0, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, |
JerrySzczurak | 20:cf211a3b3d9e | 5244 | VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, |
JerrySzczurak | 20:cf211a3b3d9e | 5245 | VL53L0X_INTERRUPTPOLARITY_HIGH ); |
JerrySzczurak | 20:cf211a3b3d9e | 5246 | |
JerrySzczurak | 20:cf211a3b3d9e | 5247 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5248 | attach_interrupt_measure_detection_irq( fptr ); |
johnAlexander | 16:98ce55ddbb1a | 5249 | enable_interrupt_measure_detection_irq(); |
johnAlexander | 12:f6e2bad00dc7 | 5250 | } |
johnAlexander | 13:615f7e38568c | 5251 | |
JerrySzczurak | 20:cf211a3b3d9e | 5252 | ClrStatus = clear_interrupt( VL53L0X_REG_RESULT_INTERRUPT_STATUS | VL53L0X_REG_RESULT_RANGE_STATUS ); |
JerrySzczurak | 20:cf211a3b3d9e | 5253 | if( ClrStatus ) |
JerrySzczurak | 20:cf211a3b3d9e | 5254 | VL53L0X_ErrLog( "VL53L0X_ClearErrorInterrupt fail\r\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5255 | |
JerrySzczurak | 20:cf211a3b3d9e | 5256 | if( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5257 | Status = vl53l0x_set_device_mode( _device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING ); // Setup in continuous ranging mode |
johnAlexander | 13:615f7e38568c | 5258 | } |
johnAlexander | 13:615f7e38568c | 5259 | |
JerrySzczurak | 20:cf211a3b3d9e | 5260 | if( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5261 | Status = vl53l0x_start_measurement( _device ); |
johnAlexander | 13:615f7e38568c | 5262 | } |
johnAlexander | 12:f6e2bad00dc7 | 5263 | } |
johnAlexander | 0:c523920bcc09 | 5264 | |
JerrySzczurak | 20:cf211a3b3d9e | 5265 | if ( operating_mode == range_single_shot_polling ) { |
johnAlexander | 0:c523920bcc09 | 5266 | // singelshot, polled ranging |
JerrySzczurak | 20:cf211a3b3d9e | 5267 | if( Status == VL53L0X_ERROR_NONE ) { |
johnAlexander | 0:c523920bcc09 | 5268 | // no need to do this when we use VL53L0X_PerformSingleRangingMeasurement |
JerrySzczurak | 20:cf211a3b3d9e | 5269 | Status = vl53l0x_set_device_mode( _device, VL53L0X_DEVICEMODE_SINGLE_RANGING ); // Setup in single ranging mode |
johnAlexander | 0:c523920bcc09 | 5270 | } |
johnAlexander | 0:c523920bcc09 | 5271 | |
johnAlexander | 0:c523920bcc09 | 5272 | // Enable/Disable Sigma and Signal check |
JerrySzczurak | 20:cf211a3b3d9e | 5273 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5274 | Status = vl53l0x_set_limit_check_enable( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5275 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1 ); |
johnAlexander | 0:c523920bcc09 | 5276 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5277 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5278 | Status = vl53l0x_set_limit_check_enable( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5279 | VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1 ); |
johnAlexander | 0:c523920bcc09 | 5280 | } |
johnAlexander | 0:c523920bcc09 | 5281 | |
johnAlexander | 0:c523920bcc09 | 5282 | // *** from mass market cube expansion v1.1, ranging with satellites. |
johnAlexander | 15:932d8b4e52c9 | 5283 | /* Ranging configuration */ |
johnAlexander | 0:c523920bcc09 | 5284 | //* |
johnAlexander | 0:c523920bcc09 | 5285 | // switch(rangingConfig) { |
johnAlexander | 0:c523920bcc09 | 5286 | // case LONG_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 5287 | signalLimit = ( FixPoint1616_t )( 0.1 * 65536 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5288 | sigmaLimit = ( FixPoint1616_t )( 60 * 65536 ); |
johnAlexander | 15:932d8b4e52c9 | 5289 | timingBudget = 33000; |
johnAlexander | 15:932d8b4e52c9 | 5290 | preRangeVcselPeriod = 18; |
johnAlexander | 15:932d8b4e52c9 | 5291 | finalRangeVcselPeriod = 14; |
johnAlexander | 15:932d8b4e52c9 | 5292 | /* break; |
johnAlexander | 15:932d8b4e52c9 | 5293 | case HIGH_ACCURACY: |
johnAlexander | 15:932d8b4e52c9 | 5294 | signalLimit = (FixPoint1616_t)(0.25*65536); |
johnAlexander | 15:932d8b4e52c9 | 5295 | sigmaLimit = (FixPoint1616_t)(18*65536); |
johnAlexander | 15:932d8b4e52c9 | 5296 | timingBudget = 200000; |
johnAlexander | 15:932d8b4e52c9 | 5297 | preRangeVcselPeriod = 14; |
johnAlexander | 15:932d8b4e52c9 | 5298 | finalRangeVcselPeriod = 10; |
johnAlexander | 15:932d8b4e52c9 | 5299 | break; |
johnAlexander | 15:932d8b4e52c9 | 5300 | case HIGH_SPEED: |
johnAlexander | 15:932d8b4e52c9 | 5301 | signalLimit = (FixPoint1616_t)(0.25*65536); |
johnAlexander | 15:932d8b4e52c9 | 5302 | sigmaLimit = (FixPoint1616_t)(32*65536); |
johnAlexander | 15:932d8b4e52c9 | 5303 | timingBudget = 20000; |
johnAlexander | 15:932d8b4e52c9 | 5304 | preRangeVcselPeriod = 14; |
johnAlexander | 15:932d8b4e52c9 | 5305 | finalRangeVcselPeriod = 10; |
johnAlexander | 15:932d8b4e52c9 | 5306 | break; |
johnAlexander | 15:932d8b4e52c9 | 5307 | default: |
johnAlexander | 15:932d8b4e52c9 | 5308 | debug_printf("Not Supported"); |
johnAlexander | 15:932d8b4e52c9 | 5309 | } |
johnAlexander | 15:932d8b4e52c9 | 5310 | */ |
johnAlexander | 0:c523920bcc09 | 5311 | |
JerrySzczurak | 20:cf211a3b3d9e | 5312 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5313 | Status = vl53l0x_set_limit_check_value( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5314 | VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, signalLimit ); |
johnAlexander | 15:932d8b4e52c9 | 5315 | } |
johnAlexander | 0:c523920bcc09 | 5316 | |
JerrySzczurak | 20:cf211a3b3d9e | 5317 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5318 | Status = vl53l0x_set_limit_check_value( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5319 | VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, sigmaLimit ); |
johnAlexander | 15:932d8b4e52c9 | 5320 | } |
johnAlexander | 0:c523920bcc09 | 5321 | |
JerrySzczurak | 20:cf211a3b3d9e | 5322 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5323 | Status = vl53l0x_set_measurement_timing_budget_micro_seconds( _device, timingBudget ); |
johnAlexander | 0:c523920bcc09 | 5324 | } |
johnAlexander | 0:c523920bcc09 | 5325 | |
JerrySzczurak | 20:cf211a3b3d9e | 5326 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5327 | Status = vl53l0x_set_vcsel_pulse_period( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5328 | VL53L0X_VCSEL_PERIOD_PRE_RANGE, preRangeVcselPeriod ); |
johnAlexander | 15:932d8b4e52c9 | 5329 | } |
johnAlexander | 0:c523920bcc09 | 5330 | |
JerrySzczurak | 20:cf211a3b3d9e | 5331 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5332 | Status = vl53l0x_set_vcsel_pulse_period( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5333 | VL53L0X_VCSEL_PERIOD_FINAL_RANGE, finalRangeVcselPeriod ); |
johnAlexander | 15:932d8b4e52c9 | 5334 | } |
johnAlexander | 0:c523920bcc09 | 5335 | |
JerrySzczurak | 20:cf211a3b3d9e | 5336 | if ( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5337 | Status = vl53l0x_perform_ref_calibration( _device, &VhvSettings, &PhaseCal ); |
johnAlexander | 15:932d8b4e52c9 | 5338 | } |
johnAlexander | 0:c523920bcc09 | 5339 | |
johnAlexander | 0:c523920bcc09 | 5340 | } |
johnAlexander | 0:c523920bcc09 | 5341 | |
JerrySzczurak | 20:cf211a3b3d9e | 5342 | if ( operating_mode == range_continuous_polling ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5343 | if( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5344 | printf ( "Call of VL53L0X_SetDeviceMode\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5345 | Status = vl53l0x_set_device_mode( _device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING ); // Setup in continuous ranging mode |
johnAlexander | 0:c523920bcc09 | 5346 | } |
johnAlexander | 0:c523920bcc09 | 5347 | |
JerrySzczurak | 20:cf211a3b3d9e | 5348 | if( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5349 | printf ( "Call of VL53L0X_StartMeasurement\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5350 | Status = vl53l0x_start_measurement( _device ); |
johnAlexander | 0:c523920bcc09 | 5351 | } |
johnAlexander | 0:c523920bcc09 | 5352 | } |
johnAlexander | 0:c523920bcc09 | 5353 | |
johnAlexander | 0:c523920bcc09 | 5354 | return Status; |
johnAlexander | 0:c523920bcc09 | 5355 | } |
johnAlexander | 15:932d8b4e52c9 | 5356 | |
johnAlexander | 15:932d8b4e52c9 | 5357 | |
JerrySzczurak | 20:cf211a3b3d9e | 5358 | int VL53L0X::get_measurement( OperatingMode operating_mode, VL53L0X_RangingMeasurementData_t *p_data ) |
johnAlexander | 0:c523920bcc09 | 5359 | { |
johnAlexander | 0:c523920bcc09 | 5360 | int Status = VL53L0X_ERROR_NONE; |
johnAlexander | 0:c523920bcc09 | 5361 | |
JerrySzczurak | 20:cf211a3b3d9e | 5362 | if ( operating_mode == range_single_shot_polling ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5363 | Status = vl53l0x_perform_single_ranging_measurement( _device, p_data ); |
JerrySzczurak | 20:cf211a3b3d9e | 5364 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5365 | |
JerrySzczurak | 20:cf211a3b3d9e | 5366 | if ( operating_mode == range_continuous_polling ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5367 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 5368 | Status = vl53l0x_measurement_poll_for_completion( _device ); |
JerrySzczurak | 20:cf211a3b3d9e | 5369 | |
JerrySzczurak | 20:cf211a3b3d9e | 5370 | if( Status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5371 | Status = vl53l0x_get_ranging_measurement_data( _device, p_data ); |
johnAlexander | 0:c523920bcc09 | 5372 | |
johnAlexander | 15:932d8b4e52c9 | 5373 | // Clear the interrupt |
JerrySzczurak | 20:cf211a3b3d9e | 5374 | vl53l0x_clear_interrupt_mask( _device, VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY ); |
JerrySzczurak | 20:cf211a3b3d9e | 5375 | vl53l0x_polling_delay( _device ); |
johnAlexander | 0:c523920bcc09 | 5376 | } |
johnAlexander | 0:c523920bcc09 | 5377 | } |
johnAlexander | 0:c523920bcc09 | 5378 | |
JerrySzczurak | 20:cf211a3b3d9e | 5379 | if ( operating_mode == range_continuous_interrupt ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5380 | Status = vl53l0x_get_ranging_measurement_data( _device, p_data ); |
JerrySzczurak | 20:cf211a3b3d9e | 5381 | vl53l0x_clear_interrupt_mask( _device, VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR | VL53L0X_REG_RESULT_INTERRUPT_STATUS ); |
johnAlexander | 15:932d8b4e52c9 | 5382 | } |
johnAlexander | 0:c523920bcc09 | 5383 | |
johnAlexander | 0:c523920bcc09 | 5384 | return Status; |
johnAlexander | 0:c523920bcc09 | 5385 | } |
johnAlexander | 15:932d8b4e52c9 | 5386 | |
johnAlexander | 0:c523920bcc09 | 5387 | |
JerrySzczurak | 20:cf211a3b3d9e | 5388 | int VL53L0X::stop_measurement( OperatingMode operating_mode ) |
johnAlexander | 0:c523920bcc09 | 5389 | { |
johnAlexander | 0:c523920bcc09 | 5390 | int status = VL53L0X_ERROR_NONE; |
johnAlexander | 0:c523920bcc09 | 5391 | |
johnAlexander | 0:c523920bcc09 | 5392 | |
johnAlexander | 15:932d8b4e52c9 | 5393 | // don't need to stop for a singleshot range! |
JerrySzczurak | 20:cf211a3b3d9e | 5394 | if ( operating_mode == range_single_shot_polling ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5395 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5396 | |
JerrySzczurak | 20:cf211a3b3d9e | 5397 | if ( operating_mode == range_continuous_interrupt || operating_mode == range_continuous_polling ) { |
johnAlexander | 15:932d8b4e52c9 | 5398 | // continuous mode |
JerrySzczurak | 20:cf211a3b3d9e | 5399 | if( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5400 | printf ( "Call of VL53L0X_StopMeasurement\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5401 | status = vl53l0x_stop_measurement( _device ); |
johnAlexander | 0:c523920bcc09 | 5402 | } |
johnAlexander | 0:c523920bcc09 | 5403 | |
JerrySzczurak | 20:cf211a3b3d9e | 5404 | if( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5405 | printf ( "Wait Stop to be competed\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5406 | status = wait_stop_completed( _device ); |
johnAlexander | 0:c523920bcc09 | 5407 | } |
johnAlexander | 0:c523920bcc09 | 5408 | |
JerrySzczurak | 20:cf211a3b3d9e | 5409 | if( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 5410 | status = vl53l0x_clear_interrupt_mask( _device, |
JerrySzczurak | 20:cf211a3b3d9e | 5411 | VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY ); |
JerrySzczurak | 20:cf211a3b3d9e | 5412 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5413 | |
JerrySzczurak | 20:cf211a3b3d9e | 5414 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5415 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5416 | |
JerrySzczurak | 20:cf211a3b3d9e | 5417 | |
JerrySzczurak | 20:cf211a3b3d9e | 5418 | int VL53L0X::handle_irq( OperatingMode operating_mode, VL53L0X_RangingMeasurementData_t *data ) |
johnAlexander | 0:c523920bcc09 | 5419 | { |
johnAlexander | 15:932d8b4e52c9 | 5420 | int status; |
JerrySzczurak | 20:cf211a3b3d9e | 5421 | status = get_measurement( operating_mode, data ); |
johnAlexander | 16:98ce55ddbb1a | 5422 | enable_interrupt_measure_detection_irq(); |
johnAlexander | 15:932d8b4e52c9 | 5423 | return status; |
johnAlexander | 0:c523920bcc09 | 5424 | } |
johnAlexander | 15:932d8b4e52c9 | 5425 | |
JerrySzczurak | 20:cf211a3b3d9e | 5426 | int32_t VL53L0X::vl53l0x_cycle_power( void ) |
JerrySzczurak | 20:cf211a3b3d9e | 5427 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5428 | int32_t status = STATUS_OK; |
JerrySzczurak | 20:cf211a3b3d9e | 5429 | #ifdef VL53L0X_LOG_ENABLE |
JerrySzczurak | 20:cf211a3b3d9e | 5430 | trace_i2c( "// cycle sensor power\n" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5431 | #endif |
JerrySzczurak | 20:cf211a3b3d9e | 5432 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5433 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5434 | |
JerrySzczurak | 20:cf211a3b3d9e | 5435 | uint8_t VL53L0X::vl53l0x_encode_vcsel_period( uint8_t vcsel_period_pclks ) |
JerrySzczurak | 20:cf211a3b3d9e | 5436 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5437 | /*! |
JerrySzczurak | 20:cf211a3b3d9e | 5438 | * Converts the encoded VCSEL period register value into the real period |
JerrySzczurak | 20:cf211a3b3d9e | 5439 | * in PLL clocks |
JerrySzczurak | 20:cf211a3b3d9e | 5440 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 5441 | |
JerrySzczurak | 20:cf211a3b3d9e | 5442 | uint8_t vcsel_period_reg = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5443 | |
JerrySzczurak | 20:cf211a3b3d9e | 5444 | vcsel_period_reg = ( vcsel_period_pclks >> 1 ) - 1; |
JerrySzczurak | 20:cf211a3b3d9e | 5445 | |
JerrySzczurak | 20:cf211a3b3d9e | 5446 | return vcsel_period_reg; |
JerrySzczurak | 20:cf211a3b3d9e | 5447 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5448 | |
JerrySzczurak | 20:cf211a3b3d9e | 5449 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_device_error_string( VL53L0X_DeviceError error_code, |
JerrySzczurak | 20:cf211a3b3d9e | 5450 | char *p_device_error_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5451 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5452 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5453 | |
JerrySzczurak | 20:cf211a3b3d9e | 5454 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5455 | |
JerrySzczurak | 20:cf211a3b3d9e | 5456 | switch ( error_code ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5457 | case VL53L0X_DEVICEERROR_NONE: |
JerrySzczurak | 20:cf211a3b3d9e | 5458 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5459 | VL53L0X_STRING_DEVICEERROR_NONE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5460 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5461 | case VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE: |
JerrySzczurak | 20:cf211a3b3d9e | 5462 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5463 | VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5464 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5465 | case VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE: |
JerrySzczurak | 20:cf211a3b3d9e | 5466 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5467 | VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5468 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5469 | case VL53L0X_DEVICEERROR_NOVHVVALUEFOUND: |
JerrySzczurak | 20:cf211a3b3d9e | 5470 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5471 | VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND ); |
JerrySzczurak | 20:cf211a3b3d9e | 5472 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5473 | case VL53L0X_DEVICEERROR_MSRCNOTARGET: |
JerrySzczurak | 20:cf211a3b3d9e | 5474 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5475 | VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET ); |
JerrySzczurak | 20:cf211a3b3d9e | 5476 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5477 | case VL53L0X_DEVICEERROR_SNRCHECK: |
JerrySzczurak | 20:cf211a3b3d9e | 5478 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5479 | VL53L0X_STRING_DEVICEERROR_SNRCHECK ); |
JerrySzczurak | 20:cf211a3b3d9e | 5480 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5481 | case VL53L0X_DEVICEERROR_RANGEPHASECHECK: |
JerrySzczurak | 20:cf211a3b3d9e | 5482 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5483 | VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK ); |
JerrySzczurak | 20:cf211a3b3d9e | 5484 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5485 | case VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK: |
JerrySzczurak | 20:cf211a3b3d9e | 5486 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5487 | VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK ); |
JerrySzczurak | 20:cf211a3b3d9e | 5488 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5489 | case VL53L0X_DEVICEERROR_TCC: |
JerrySzczurak | 20:cf211a3b3d9e | 5490 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5491 | VL53L0X_STRING_DEVICEERROR_TCC ); |
JerrySzczurak | 20:cf211a3b3d9e | 5492 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5493 | case VL53L0X_DEVICEERROR_PHASECONSISTENCY: |
JerrySzczurak | 20:cf211a3b3d9e | 5494 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5495 | VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY ); |
JerrySzczurak | 20:cf211a3b3d9e | 5496 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5497 | case VL53L0X_DEVICEERROR_MINCLIP: |
JerrySzczurak | 20:cf211a3b3d9e | 5498 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5499 | VL53L0X_STRING_DEVICEERROR_MINCLIP ); |
JerrySzczurak | 20:cf211a3b3d9e | 5500 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5501 | case VL53L0X_DEVICEERROR_RANGECOMPLETE: |
JerrySzczurak | 20:cf211a3b3d9e | 5502 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5503 | VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5504 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5505 | case VL53L0X_DEVICEERROR_ALGOUNDERFLOW: |
JerrySzczurak | 20:cf211a3b3d9e | 5506 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5507 | VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW ); |
JerrySzczurak | 20:cf211a3b3d9e | 5508 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5509 | case VL53L0X_DEVICEERROR_ALGOOVERFLOW: |
JerrySzczurak | 20:cf211a3b3d9e | 5510 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5511 | VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW ); |
JerrySzczurak | 20:cf211a3b3d9e | 5512 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5513 | case VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD: |
JerrySzczurak | 20:cf211a3b3d9e | 5514 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5515 | VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD ); |
JerrySzczurak | 20:cf211a3b3d9e | 5516 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5517 | |
JerrySzczurak | 20:cf211a3b3d9e | 5518 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 5519 | VL53L0X_COPYSTRING( p_device_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5520 | VL53L0X_STRING_UNKNOW_ERROR_CODE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5521 | |
JerrySzczurak | 20:cf211a3b3d9e | 5522 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5523 | |
JerrySzczurak | 20:cf211a3b3d9e | 5524 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5525 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5526 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5527 | |
JerrySzczurak | 20:cf211a3b3d9e | 5528 | |
JerrySzczurak | 20:cf211a3b3d9e | 5529 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_limit_check_info( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 5530 | char *p_limit_check_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5531 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5532 | |
JerrySzczurak | 20:cf211a3b3d9e | 5533 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5534 | |
JerrySzczurak | 20:cf211a3b3d9e | 5535 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5536 | |
JerrySzczurak | 20:cf211a3b3d9e | 5537 | switch ( limit_check_id ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5538 | case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 5539 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5540 | VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5541 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5542 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 5543 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5544 | VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5545 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5546 | case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: |
JerrySzczurak | 20:cf211a3b3d9e | 5547 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5548 | VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP ); |
JerrySzczurak | 20:cf211a3b3d9e | 5549 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5550 | case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: |
JerrySzczurak | 20:cf211a3b3d9e | 5551 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5552 | VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD ); |
JerrySzczurak | 20:cf211a3b3d9e | 5553 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5554 | |
JerrySzczurak | 20:cf211a3b3d9e | 5555 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: |
JerrySzczurak | 20:cf211a3b3d9e | 5556 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5557 | VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC ); |
JerrySzczurak | 20:cf211a3b3d9e | 5558 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5559 | |
JerrySzczurak | 20:cf211a3b3d9e | 5560 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 5561 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5562 | VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5563 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5564 | |
JerrySzczurak | 20:cf211a3b3d9e | 5565 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 5566 | VL53L0X_COPYSTRING( p_limit_check_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5567 | VL53L0X_STRING_UNKNOW_ERROR_CODE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5568 | |
JerrySzczurak | 20:cf211a3b3d9e | 5569 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5570 | |
JerrySzczurak | 20:cf211a3b3d9e | 5571 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5572 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5573 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5574 | |
JerrySzczurak | 20:cf211a3b3d9e | 5575 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_pal_error_string( VL53L0X_Error pal_error_code, |
JerrySzczurak | 20:cf211a3b3d9e | 5576 | char *p_pal_error_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5577 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5578 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5579 | |
JerrySzczurak | 20:cf211a3b3d9e | 5580 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5581 | |
JerrySzczurak | 20:cf211a3b3d9e | 5582 | switch ( pal_error_code ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5583 | case VL53L0X_ERROR_NONE: |
JerrySzczurak | 20:cf211a3b3d9e | 5584 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5585 | VL53L0X_STRING_ERROR_NONE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5586 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5587 | case VL53L0X_ERROR_CALIBRATION_WARNING: |
JerrySzczurak | 20:cf211a3b3d9e | 5588 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5589 | VL53L0X_STRING_ERROR_CALIBRATION_WARNING ); |
JerrySzczurak | 20:cf211a3b3d9e | 5590 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5591 | case VL53L0X_ERROR_MIN_CLIPPED: |
JerrySzczurak | 20:cf211a3b3d9e | 5592 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5593 | VL53L0X_STRING_ERROR_MIN_CLIPPED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5594 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5595 | case VL53L0X_ERROR_UNDEFINED: |
JerrySzczurak | 20:cf211a3b3d9e | 5596 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5597 | VL53L0X_STRING_ERROR_UNDEFINED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5598 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5599 | case VL53L0X_ERROR_INVALID_PARAMS: |
JerrySzczurak | 20:cf211a3b3d9e | 5600 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5601 | VL53L0X_STRING_ERROR_INVALID_PARAMS ); |
JerrySzczurak | 20:cf211a3b3d9e | 5602 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5603 | case VL53L0X_ERROR_NOT_SUPPORTED: |
JerrySzczurak | 20:cf211a3b3d9e | 5604 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5605 | VL53L0X_STRING_ERROR_NOT_SUPPORTED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5606 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5607 | case VL53L0X_ERROR_INTERRUPT_NOT_CLEARED: |
JerrySzczurak | 20:cf211a3b3d9e | 5608 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5609 | VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5610 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5611 | case VL53L0X_ERROR_RANGE_ERROR: |
JerrySzczurak | 20:cf211a3b3d9e | 5612 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5613 | VL53L0X_STRING_ERROR_RANGE_ERROR ); |
JerrySzczurak | 20:cf211a3b3d9e | 5614 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5615 | case VL53L0X_ERROR_TIME_OUT: |
JerrySzczurak | 20:cf211a3b3d9e | 5616 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5617 | VL53L0X_STRING_ERROR_TIME_OUT ); |
JerrySzczurak | 20:cf211a3b3d9e | 5618 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5619 | case VL53L0X_ERROR_MODE_NOT_SUPPORTED: |
JerrySzczurak | 20:cf211a3b3d9e | 5620 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5621 | VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5622 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5623 | case VL53L0X_ERROR_BUFFER_TOO_SMALL: |
JerrySzczurak | 20:cf211a3b3d9e | 5624 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5625 | VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL ); |
JerrySzczurak | 20:cf211a3b3d9e | 5626 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5627 | case VL53L0X_ERROR_GPIO_NOT_EXISTING: |
JerrySzczurak | 20:cf211a3b3d9e | 5628 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5629 | VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING ); |
JerrySzczurak | 20:cf211a3b3d9e | 5630 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5631 | case VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED: |
JerrySzczurak | 20:cf211a3b3d9e | 5632 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5633 | VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5634 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5635 | case VL53L0X_ERROR_CONTROL_INTERFACE: |
JerrySzczurak | 20:cf211a3b3d9e | 5636 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5637 | VL53L0X_STRING_ERROR_CONTROL_INTERFACE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5638 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5639 | case VL53L0X_ERROR_INVALID_COMMAND: |
JerrySzczurak | 20:cf211a3b3d9e | 5640 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5641 | VL53L0X_STRING_ERROR_INVALID_COMMAND ); |
JerrySzczurak | 20:cf211a3b3d9e | 5642 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5643 | case VL53L0X_ERROR_DIVISION_BY_ZERO: |
JerrySzczurak | 20:cf211a3b3d9e | 5644 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5645 | VL53L0X_STRING_ERROR_DIVISION_BY_ZERO ); |
JerrySzczurak | 20:cf211a3b3d9e | 5646 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5647 | case VL53L0X_ERROR_REF_SPAD_INIT: |
JerrySzczurak | 20:cf211a3b3d9e | 5648 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5649 | VL53L0X_STRING_ERROR_REF_SPAD_INIT ); |
JerrySzczurak | 20:cf211a3b3d9e | 5650 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5651 | case VL53L0X_ERROR_NOT_IMPLEMENTED: |
JerrySzczurak | 20:cf211a3b3d9e | 5652 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5653 | VL53L0X_STRING_ERROR_NOT_IMPLEMENTED ); |
JerrySzczurak | 20:cf211a3b3d9e | 5654 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5655 | |
JerrySzczurak | 20:cf211a3b3d9e | 5656 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 5657 | VL53L0X_COPYSTRING( p_pal_error_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5658 | VL53L0X_STRING_UNKNOW_ERROR_CODE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5659 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5660 | |
JerrySzczurak | 20:cf211a3b3d9e | 5661 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5662 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5663 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5664 | |
JerrySzczurak | 20:cf211a3b3d9e | 5665 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_pal_state_string( VL53L0X_State pal_state_code, |
JerrySzczurak | 20:cf211a3b3d9e | 5666 | char *p_pal_state_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5667 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5668 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5669 | |
JerrySzczurak | 20:cf211a3b3d9e | 5670 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5671 | |
JerrySzczurak | 20:cf211a3b3d9e | 5672 | switch ( pal_state_code ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5673 | case VL53L0X_STATE_POWERDOWN: |
JerrySzczurak | 20:cf211a3b3d9e | 5674 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5675 | VL53L0X_STRING_STATE_POWERDOWN ); |
JerrySzczurak | 20:cf211a3b3d9e | 5676 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5677 | case VL53L0X_STATE_WAIT_STATICINIT: |
JerrySzczurak | 20:cf211a3b3d9e | 5678 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5679 | VL53L0X_STRING_STATE_WAIT_STATICINIT ); |
JerrySzczurak | 20:cf211a3b3d9e | 5680 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5681 | case VL53L0X_STATE_STANDBY: |
JerrySzczurak | 20:cf211a3b3d9e | 5682 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5683 | VL53L0X_STRING_STATE_STANDBY ); |
JerrySzczurak | 20:cf211a3b3d9e | 5684 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5685 | case VL53L0X_STATE_IDLE: |
JerrySzczurak | 20:cf211a3b3d9e | 5686 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5687 | VL53L0X_STRING_STATE_IDLE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5688 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5689 | case VL53L0X_STATE_RUNNING: |
JerrySzczurak | 20:cf211a3b3d9e | 5690 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5691 | VL53L0X_STRING_STATE_RUNNING ); |
JerrySzczurak | 20:cf211a3b3d9e | 5692 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5693 | case VL53L0X_STATE_UNKNOWN: |
JerrySzczurak | 20:cf211a3b3d9e | 5694 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5695 | VL53L0X_STRING_STATE_UNKNOWN ); |
JerrySzczurak | 20:cf211a3b3d9e | 5696 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5697 | case VL53L0X_STATE_ERROR: |
JerrySzczurak | 20:cf211a3b3d9e | 5698 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5699 | VL53L0X_STRING_STATE_ERROR ); |
JerrySzczurak | 20:cf211a3b3d9e | 5700 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5701 | |
JerrySzczurak | 20:cf211a3b3d9e | 5702 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 5703 | VL53L0X_COPYSTRING( p_pal_state_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5704 | VL53L0X_STRING_STATE_UNKNOWN ); |
JerrySzczurak | 20:cf211a3b3d9e | 5705 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5706 | |
JerrySzczurak | 20:cf211a3b3d9e | 5707 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5708 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5709 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5710 | |
JerrySzczurak | 20:cf211a3b3d9e | 5711 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_range_status_string( uint8_t range_status, |
JerrySzczurak | 20:cf211a3b3d9e | 5712 | char *p_range_status_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5713 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5714 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5715 | |
JerrySzczurak | 20:cf211a3b3d9e | 5716 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5717 | |
JerrySzczurak | 20:cf211a3b3d9e | 5718 | switch ( range_status ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5719 | case 0: |
JerrySzczurak | 20:cf211a3b3d9e | 5720 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5721 | VL53L0X_STRING_RANGESTATUS_RANGEVALID ); |
JerrySzczurak | 20:cf211a3b3d9e | 5722 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5723 | case 1: |
JerrySzczurak | 20:cf211a3b3d9e | 5724 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5725 | VL53L0X_STRING_RANGESTATUS_SIGMA ); |
JerrySzczurak | 20:cf211a3b3d9e | 5726 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5727 | case 2: |
JerrySzczurak | 20:cf211a3b3d9e | 5728 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5729 | VL53L0X_STRING_RANGESTATUS_SIGNAL ); |
JerrySzczurak | 20:cf211a3b3d9e | 5730 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5731 | case 3: |
JerrySzczurak | 20:cf211a3b3d9e | 5732 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5733 | VL53L0X_STRING_RANGESTATUS_MINRANGE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5734 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5735 | case 4: |
JerrySzczurak | 20:cf211a3b3d9e | 5736 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5737 | VL53L0X_STRING_RANGESTATUS_PHASE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5738 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5739 | case 5: |
JerrySzczurak | 20:cf211a3b3d9e | 5740 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5741 | VL53L0X_STRING_RANGESTATUS_HW ); |
JerrySzczurak | 20:cf211a3b3d9e | 5742 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5743 | |
JerrySzczurak | 20:cf211a3b3d9e | 5744 | default: /**/ |
JerrySzczurak | 20:cf211a3b3d9e | 5745 | VL53L0X_COPYSTRING( p_range_status_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5746 | VL53L0X_STRING_RANGESTATUS_NONE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5747 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5748 | |
JerrySzczurak | 20:cf211a3b3d9e | 5749 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5750 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5751 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5752 | |
JerrySzczurak | 20:cf211a3b3d9e | 5753 | |
JerrySzczurak | 20:cf211a3b3d9e | 5754 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_ref_calibration( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5755 | uint8_t *p_vhv_settings, uint8_t *p_phase_cal ) |
JerrySzczurak | 20:cf211a3b3d9e | 5756 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5757 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5758 | uint8_t vhv_settings = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5759 | uint8_t phase_cal = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5760 | |
JerrySzczurak | 20:cf211a3b3d9e | 5761 | status = vl53l0x_ref_calibration_io( dev, 1, |
JerrySzczurak | 20:cf211a3b3d9e | 5762 | vhv_settings, phase_cal, |
JerrySzczurak | 20:cf211a3b3d9e | 5763 | p_vhv_settings, p_phase_cal, |
JerrySzczurak | 20:cf211a3b3d9e | 5764 | 1, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5765 | |
JerrySzczurak | 20:cf211a3b3d9e | 5766 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5767 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5768 | |
JerrySzczurak | 20:cf211a3b3d9e | 5769 | VL53L0X_Error VL53L0X::count_enabled_spads( uint8_t spad_array[], |
JerrySzczurak | 20:cf211a3b3d9e | 5770 | uint32_t byte_count, uint32_t max_spads, |
JerrySzczurak | 20:cf211a3b3d9e | 5771 | uint32_t *p_total_spads_enabled, uint8_t *p_is_aperture ) |
JerrySzczurak | 20:cf211a3b3d9e | 5772 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5773 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5774 | uint32_t c_spads_per_byte = 8; |
JerrySzczurak | 20:cf211a3b3d9e | 5775 | uint32_t last_byte; |
JerrySzczurak | 20:cf211a3b3d9e | 5776 | uint32_t last_bit; |
JerrySzczurak | 20:cf211a3b3d9e | 5777 | uint32_t byte_index = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5778 | uint32_t bit_index = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5779 | uint8_t temp_byte; |
JerrySzczurak | 20:cf211a3b3d9e | 5780 | uint8_t spad_type_identified = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5781 | |
JerrySzczurak | 20:cf211a3b3d9e | 5782 | /* The entire array will not be used for spads, therefore the last |
JerrySzczurak | 20:cf211a3b3d9e | 5783 | * byte and last bit is determined from the max spads value. |
JerrySzczurak | 20:cf211a3b3d9e | 5784 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 5785 | |
JerrySzczurak | 20:cf211a3b3d9e | 5786 | last_byte = max_spads / c_spads_per_byte; |
JerrySzczurak | 20:cf211a3b3d9e | 5787 | last_bit = max_spads % c_spads_per_byte; |
JerrySzczurak | 20:cf211a3b3d9e | 5788 | |
JerrySzczurak | 20:cf211a3b3d9e | 5789 | /* Check that the max spads value does not exceed the array bounds. */ |
JerrySzczurak | 20:cf211a3b3d9e | 5790 | if ( last_byte >= byte_count ) |
JerrySzczurak | 20:cf211a3b3d9e | 5791 | status = VL53L0X_ERROR_REF_SPAD_INIT; |
JerrySzczurak | 20:cf211a3b3d9e | 5792 | |
JerrySzczurak | 20:cf211a3b3d9e | 5793 | *p_total_spads_enabled = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5794 | |
JerrySzczurak | 20:cf211a3b3d9e | 5795 | /* Count the bits enabled in the whole bytes */ |
JerrySzczurak | 20:cf211a3b3d9e | 5796 | for ( byte_index = 0; byte_index <= ( last_byte - 1 ); byte_index++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5797 | temp_byte = spad_array[byte_index]; |
JerrySzczurak | 20:cf211a3b3d9e | 5798 | |
JerrySzczurak | 20:cf211a3b3d9e | 5799 | for ( bit_index = 0; bit_index <= c_spads_per_byte; bit_index++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5800 | if ( ( temp_byte & 0x01 ) == 1 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5801 | ( *p_total_spads_enabled )++; |
JerrySzczurak | 20:cf211a3b3d9e | 5802 | |
JerrySzczurak | 20:cf211a3b3d9e | 5803 | if ( !spad_type_identified ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5804 | *p_is_aperture = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 5805 | if ( ( byte_index < 2 ) && ( bit_index < 4 ) ) |
JerrySzczurak | 20:cf211a3b3d9e | 5806 | *p_is_aperture = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5807 | spad_type_identified = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 5808 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5809 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5810 | temp_byte >>= 1; |
JerrySzczurak | 20:cf211a3b3d9e | 5811 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5812 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5813 | |
JerrySzczurak | 20:cf211a3b3d9e | 5814 | /* Count the number of bits enabled in the last byte accounting |
JerrySzczurak | 20:cf211a3b3d9e | 5815 | * for the fact that not all bits in the byte may be used. |
JerrySzczurak | 20:cf211a3b3d9e | 5816 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 5817 | temp_byte = spad_array[last_byte]; |
JerrySzczurak | 20:cf211a3b3d9e | 5818 | |
JerrySzczurak | 20:cf211a3b3d9e | 5819 | for ( bit_index = 0; bit_index <= last_bit; bit_index++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5820 | if ( ( temp_byte & 0x01 ) == 1 ) |
JerrySzczurak | 20:cf211a3b3d9e | 5821 | ( *p_total_spads_enabled )++; |
JerrySzczurak | 20:cf211a3b3d9e | 5822 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5823 | |
JerrySzczurak | 20:cf211a3b3d9e | 5824 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5825 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5826 | |
JerrySzczurak | 20:cf211a3b3d9e | 5827 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_reference_spads( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5828 | uint32_t *p_spad_count, uint8_t *p_is_aperture_spads ) |
JerrySzczurak | 20:cf211a3b3d9e | 5829 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5830 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5831 | uint8_t ref_spads_initialised; |
JerrySzczurak | 20:cf211a3b3d9e | 5832 | uint8_t ref_spad_array[6]; |
JerrySzczurak | 20:cf211a3b3d9e | 5833 | uint32_t c_max_spad_count = 44; |
JerrySzczurak | 20:cf211a3b3d9e | 5834 | uint32_t c_spad_array_size = 6; |
JerrySzczurak | 20:cf211a3b3d9e | 5835 | uint32_t spads_enabled; |
JerrySzczurak | 20:cf211a3b3d9e | 5836 | uint8_t is_aperture_spads = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5837 | |
JerrySzczurak | 20:cf211a3b3d9e | 5838 | ref_spads_initialised = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5839 | RefSpadsInitialised ); |
JerrySzczurak | 20:cf211a3b3d9e | 5840 | |
JerrySzczurak | 20:cf211a3b3d9e | 5841 | if ( ref_spads_initialised == 1 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5842 | |
JerrySzczurak | 20:cf211a3b3d9e | 5843 | *p_spad_count = ( uint32_t )VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5844 | ReferenceSpadCount ); |
JerrySzczurak | 20:cf211a3b3d9e | 5845 | *p_is_aperture_spads = VL53L0X_GETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5846 | ReferenceSpadType ); |
JerrySzczurak | 20:cf211a3b3d9e | 5847 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 5848 | |
JerrySzczurak | 20:cf211a3b3d9e | 5849 | /* obtain spad info from device.*/ |
JerrySzczurak | 20:cf211a3b3d9e | 5850 | status = get_ref_spad_map( dev, ref_spad_array ); |
JerrySzczurak | 20:cf211a3b3d9e | 5851 | |
JerrySzczurak | 20:cf211a3b3d9e | 5852 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5853 | /* count enabled spads within spad map array and |
JerrySzczurak | 20:cf211a3b3d9e | 5854 | * determine if Aperture or Non-Aperture. |
JerrySzczurak | 20:cf211a3b3d9e | 5855 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 5856 | status = count_enabled_spads( ref_spad_array, |
JerrySzczurak | 20:cf211a3b3d9e | 5857 | c_spad_array_size, |
JerrySzczurak | 20:cf211a3b3d9e | 5858 | c_max_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 5859 | &spads_enabled, |
JerrySzczurak | 20:cf211a3b3d9e | 5860 | &is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 5861 | |
JerrySzczurak | 20:cf211a3b3d9e | 5862 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5863 | |
JerrySzczurak | 20:cf211a3b3d9e | 5864 | *p_spad_count = spads_enabled; |
JerrySzczurak | 20:cf211a3b3d9e | 5865 | *p_is_aperture_spads = is_aperture_spads; |
JerrySzczurak | 20:cf211a3b3d9e | 5866 | |
JerrySzczurak | 20:cf211a3b3d9e | 5867 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5868 | RefSpadsInitialised, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5869 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5870 | ReferenceSpadCount, |
JerrySzczurak | 20:cf211a3b3d9e | 5871 | ( uint8_t )spads_enabled ); |
JerrySzczurak | 20:cf211a3b3d9e | 5872 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5873 | ReferenceSpadType, is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 5874 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5875 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5876 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5877 | |
JerrySzczurak | 20:cf211a3b3d9e | 5878 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5879 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5880 | |
JerrySzczurak | 20:cf211a3b3d9e | 5881 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_get_sequence_steps_info( |
JerrySzczurak | 20:cf211a3b3d9e | 5882 | VL53L0X_SequenceStepId sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 5883 | char *p_sequence_steps_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5884 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5885 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5886 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5887 | |
JerrySzczurak | 20:cf211a3b3d9e | 5888 | switch ( sequence_step_id ) { |
JerrySzczurak | 20:cf211a3b3d9e | 5889 | case VL53L0X_SEQUENCESTEP_TCC: |
JerrySzczurak | 20:cf211a3b3d9e | 5890 | VL53L0X_COPYSTRING( p_sequence_steps_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5891 | VL53L0X_STRING_SEQUENCESTEP_TCC ); |
JerrySzczurak | 20:cf211a3b3d9e | 5892 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5893 | case VL53L0X_SEQUENCESTEP_DSS: |
JerrySzczurak | 20:cf211a3b3d9e | 5894 | VL53L0X_COPYSTRING( p_sequence_steps_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5895 | VL53L0X_STRING_SEQUENCESTEP_DSS ); |
JerrySzczurak | 20:cf211a3b3d9e | 5896 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5897 | case VL53L0X_SEQUENCESTEP_MSRC: |
JerrySzczurak | 20:cf211a3b3d9e | 5898 | VL53L0X_COPYSTRING( p_sequence_steps_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5899 | VL53L0X_STRING_SEQUENCESTEP_MSRC ); |
JerrySzczurak | 20:cf211a3b3d9e | 5900 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5901 | case VL53L0X_SEQUENCESTEP_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 5902 | VL53L0X_COPYSTRING( p_sequence_steps_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5903 | VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5904 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5905 | case VL53L0X_SEQUENCESTEP_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 5906 | VL53L0X_COPYSTRING( p_sequence_steps_string, |
JerrySzczurak | 20:cf211a3b3d9e | 5907 | VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE ); |
JerrySzczurak | 20:cf211a3b3d9e | 5908 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 5909 | |
JerrySzczurak | 20:cf211a3b3d9e | 5910 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 5911 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 5912 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5913 | |
JerrySzczurak | 20:cf211a3b3d9e | 5914 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5915 | |
JerrySzczurak | 20:cf211a3b3d9e | 5916 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5917 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5918 | |
JerrySzczurak | 20:cf211a3b3d9e | 5919 | VL53L0X_Error VL53L0X::vl53l0x_get_sequence_steps_info( VL53L0X_SequenceStepId sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 5920 | char *p_sequence_steps_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5921 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5922 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5923 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5924 | |
JerrySzczurak | 20:cf211a3b3d9e | 5925 | status = wrapped_vl53l0x_get_sequence_steps_info( |
JerrySzczurak | 20:cf211a3b3d9e | 5926 | sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 5927 | p_sequence_steps_string ); |
JerrySzczurak | 20:cf211a3b3d9e | 5928 | |
JerrySzczurak | 20:cf211a3b3d9e | 5929 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5930 | |
JerrySzczurak | 20:cf211a3b3d9e | 5931 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5932 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5933 | |
JerrySzczurak | 20:cf211a3b3d9e | 5934 | int32_t VL53L0X::vl53l0x_get_timer_frequency( int32_t *p_timer_freq_hz ) |
JerrySzczurak | 20:cf211a3b3d9e | 5935 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5936 | *p_timer_freq_hz = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5937 | return STATUS_FAIL; |
JerrySzczurak | 20:cf211a3b3d9e | 5938 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5939 | |
JerrySzczurak | 20:cf211a3b3d9e | 5940 | int32_t VL53L0X::vl53l0x_get_timer_value( int32_t *p_timer_count ) |
JerrySzczurak | 20:cf211a3b3d9e | 5941 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5942 | *p_timer_count = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 5943 | return STATUS_FAIL; |
JerrySzczurak | 20:cf211a3b3d9e | 5944 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5945 | |
JerrySzczurak | 20:cf211a3b3d9e | 5946 | VL53L0X_Error VL53L0X::vl53l0x_enable_interrupt_mask( VL53L0X_DEV dev, uint32_t interrupt_mask ) |
JerrySzczurak | 20:cf211a3b3d9e | 5947 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5948 | VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 5949 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5950 | |
JerrySzczurak | 20:cf211a3b3d9e | 5951 | /* not implemented for VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 5952 | |
JerrySzczurak | 20:cf211a3b3d9e | 5953 | LOG_FUNCTION_END( Status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5954 | return Status; |
JerrySzczurak | 20:cf211a3b3d9e | 5955 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5956 | |
JerrySzczurak | 20:cf211a3b3d9e | 5957 | VL53L0X_Error VL53L0X::vl53l0x_get_device_error_status( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5958 | VL53L0X_DeviceError *p_device_error_status ) |
JerrySzczurak | 20:cf211a3b3d9e | 5959 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5960 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5961 | uint8_t range_status; |
JerrySzczurak | 20:cf211a3b3d9e | 5962 | |
JerrySzczurak | 20:cf211a3b3d9e | 5963 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5964 | |
JerrySzczurak | 21:627b65069e6d | 5965 | status = vl53l0x_read_byte( dev, VL53L0X_REG_RESULT_RANGE_STATUS, |
JerrySzczurak | 20:cf211a3b3d9e | 5966 | &range_status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5967 | |
JerrySzczurak | 20:cf211a3b3d9e | 5968 | *p_device_error_status = ( VL53L0X_DeviceError )( ( range_status & 0x78 ) >> 3 ); |
JerrySzczurak | 20:cf211a3b3d9e | 5969 | |
JerrySzczurak | 20:cf211a3b3d9e | 5970 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5971 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5972 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5973 | |
JerrySzczurak | 20:cf211a3b3d9e | 5974 | |
JerrySzczurak | 20:cf211a3b3d9e | 5975 | VL53L0X_Error VL53L0X::vl53l0x_get_device_error_string( VL53L0X_DeviceError error_code, |
JerrySzczurak | 20:cf211a3b3d9e | 5976 | char *p_device_error_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 5977 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5978 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5979 | |
JerrySzczurak | 20:cf211a3b3d9e | 5980 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5981 | |
JerrySzczurak | 20:cf211a3b3d9e | 5982 | status = wrapped_vl53l0x_get_device_error_string( error_code, p_device_error_string ); |
JerrySzczurak | 20:cf211a3b3d9e | 5983 | |
JerrySzczurak | 20:cf211a3b3d9e | 5984 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 5985 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 5986 | } |
JerrySzczurak | 20:cf211a3b3d9e | 5987 | |
JerrySzczurak | 20:cf211a3b3d9e | 5988 | VL53L0X_Error VL53L0X::vl53l0x_get_dmax_cal_parameters( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5989 | uint16_t *p_range_milli_meter, FixPoint1616_t *p_signal_rate_rtn_mega_cps ) |
JerrySzczurak | 20:cf211a3b3d9e | 5990 | { |
JerrySzczurak | 20:cf211a3b3d9e | 5991 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 5992 | |
JerrySzczurak | 20:cf211a3b3d9e | 5993 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 5994 | |
JerrySzczurak | 20:cf211a3b3d9e | 5995 | *p_range_milli_meter = PALDevDataGet( dev, DmaxCalRangeMilliMeter ); |
JerrySzczurak | 20:cf211a3b3d9e | 5996 | *p_signal_rate_rtn_mega_cps = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 5997 | DmaxCalSignalRateRtnMegaCps ); |
JerrySzczurak | 20:cf211a3b3d9e | 5998 | |
JerrySzczurak | 20:cf211a3b3d9e | 5999 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6000 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6001 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6002 | |
JerrySzczurak | 20:cf211a3b3d9e | 6003 | VL53L0X_Error VL53L0X::vl53l0x_get_dmax_cal_parameters( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6004 | uint16_t range_milli_meter, FixPoint1616_t signal_rate_rtn_mega_cps ) |
JerrySzczurak | 20:cf211a3b3d9e | 6005 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6006 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6007 | FixPoint1616_t signal_rate_rtn_mega_cps_temp = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6008 | |
JerrySzczurak | 20:cf211a3b3d9e | 6009 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6010 | |
JerrySzczurak | 20:cf211a3b3d9e | 6011 | /* Check if one of input parameter is zero, in that case the |
JerrySzczurak | 20:cf211a3b3d9e | 6012 | * value are get from NVM */ |
JerrySzczurak | 20:cf211a3b3d9e | 6013 | if ( ( range_milli_meter == 0 ) || ( signal_rate_rtn_mega_cps == 0 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6014 | /* NVM parameters */ |
JerrySzczurak | 20:cf211a3b3d9e | 6015 | /* Run VL53L0X_get_info_from_device wit option 4 to get |
JerrySzczurak | 20:cf211a3b3d9e | 6016 | * signal rate at 400 mm if the value have been already |
JerrySzczurak | 20:cf211a3b3d9e | 6017 | * get this function will return with no access to device */ |
JerrySzczurak | 20:cf211a3b3d9e | 6018 | vl53l0x_get_info_from_device( dev, 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6019 | |
JerrySzczurak | 20:cf211a3b3d9e | 6020 | signal_rate_rtn_mega_cps_temp = VL53L0X_GETDEVICESPECIFICPARAMETER( |
JerrySzczurak | 20:cf211a3b3d9e | 6021 | dev, SignalRateMeasFixed400mm ); |
JerrySzczurak | 20:cf211a3b3d9e | 6022 | |
JerrySzczurak | 20:cf211a3b3d9e | 6023 | PALDevDataSet( dev, DmaxCalRangeMilliMeter, 400 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6024 | PALDevDataSet( dev, DmaxCalSignalRateRtnMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 6025 | signal_rate_rtn_mega_cps_temp ); |
JerrySzczurak | 20:cf211a3b3d9e | 6026 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6027 | /* User parameters */ |
JerrySzczurak | 20:cf211a3b3d9e | 6028 | PALDevDataSet( dev, DmaxCalRangeMilliMeter, range_milli_meter ); |
JerrySzczurak | 20:cf211a3b3d9e | 6029 | PALDevDataSet( dev, DmaxCalSignalRateRtnMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 6030 | signal_rate_rtn_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 6031 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6032 | |
JerrySzczurak | 20:cf211a3b3d9e | 6033 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6034 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6035 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6036 | |
JerrySzczurak | 20:cf211a3b3d9e | 6037 | VL53L0X_Error VL53L0X::vl53L0x_set_gpio_config( VL53L0X_DEV dev, uint8_t pin, |
JerrySzczurak | 20:cf211a3b3d9e | 6038 | VL53L0X_DeviceModes device_mode, VL53L0X_GpioFunctionality functionality, |
JerrySzczurak | 20:cf211a3b3d9e | 6039 | VL53L0X_InterruptPolarity polarity ) |
JerrySzczurak | 20:cf211a3b3d9e | 6040 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6041 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6042 | uint8_t data; |
JerrySzczurak | 20:cf211a3b3d9e | 6043 | |
JerrySzczurak | 20:cf211a3b3d9e | 6044 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6045 | |
JerrySzczurak | 20:cf211a3b3d9e | 6046 | if ( pin != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6047 | status = VL53L0X_ERROR_GPIO_NOT_EXISTING; |
JerrySzczurak | 20:cf211a3b3d9e | 6048 | } else if ( device_mode == VL53L0X_DEVICEMODE_GPIO_DRIVE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6049 | if ( polarity == VL53L0X_INTERRUPTPOLARITY_LOW ) |
JerrySzczurak | 20:cf211a3b3d9e | 6050 | data = 0x10; |
JerrySzczurak | 20:cf211a3b3d9e | 6051 | else |
JerrySzczurak | 20:cf211a3b3d9e | 6052 | data = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 6053 | |
JerrySzczurak | 21:627b65069e6d | 6054 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6055 | VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 6056 | |
JerrySzczurak | 20:cf211a3b3d9e | 6057 | } else if ( device_mode == VL53L0X_DEVICEMODE_GPIO_OSC ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6058 | |
JerrySzczurak | 21:627b65069e6d | 6059 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6060 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 21:627b65069e6d | 6061 | |
JerrySzczurak | 21:627b65069e6d | 6062 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 21:627b65069e6d | 6063 | status |= vl53l0x_write_byte( dev, 0x80, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6064 | status |= vl53l0x_write_byte( dev, 0x85, 0x02 ); |
JerrySzczurak | 21:627b65069e6d | 6065 | |
JerrySzczurak | 21:627b65069e6d | 6066 | status |= vl53l0x_write_byte( dev, 0xff, 0x04 ); |
JerrySzczurak | 21:627b65069e6d | 6067 | status |= vl53l0x_write_byte( dev, 0xcd, 0x00 ); |
JerrySzczurak | 21:627b65069e6d | 6068 | status |= vl53l0x_write_byte( dev, 0xcc, 0x11 ); |
JerrySzczurak | 21:627b65069e6d | 6069 | |
JerrySzczurak | 21:627b65069e6d | 6070 | status |= vl53l0x_write_byte( dev, 0xff, 0x07 ); |
JerrySzczurak | 21:627b65069e6d | 6071 | status |= vl53l0x_write_byte( dev, 0xbe, 0x00 ); |
JerrySzczurak | 21:627b65069e6d | 6072 | |
JerrySzczurak | 21:627b65069e6d | 6073 | status |= vl53l0x_write_byte( dev, 0xff, 0x06 ); |
JerrySzczurak | 21:627b65069e6d | 6074 | status |= vl53l0x_write_byte( dev, 0xcc, 0x09 ); |
JerrySzczurak | 21:627b65069e6d | 6075 | |
JerrySzczurak | 21:627b65069e6d | 6076 | status |= vl53l0x_write_byte( dev, 0xff, 0x00 ); |
JerrySzczurak | 21:627b65069e6d | 6077 | status |= vl53l0x_write_byte( dev, 0xff, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6078 | status |= vl53l0x_write_byte( dev, 0x00, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6079 | |
JerrySzczurak | 20:cf211a3b3d9e | 6080 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6081 | |
JerrySzczurak | 20:cf211a3b3d9e | 6082 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6083 | switch ( functionality ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6084 | case VL53L0X_GPIOFUNCTIONALITY_OFF: |
JerrySzczurak | 20:cf211a3b3d9e | 6085 | data = 0x00; |
JerrySzczurak | 20:cf211a3b3d9e | 6086 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6087 | case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: |
JerrySzczurak | 20:cf211a3b3d9e | 6088 | data = 0x01; |
JerrySzczurak | 20:cf211a3b3d9e | 6089 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6090 | case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: |
JerrySzczurak | 20:cf211a3b3d9e | 6091 | data = 0x02; |
JerrySzczurak | 20:cf211a3b3d9e | 6092 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6093 | case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: |
JerrySzczurak | 20:cf211a3b3d9e | 6094 | data = 0x03; |
JerrySzczurak | 20:cf211a3b3d9e | 6095 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6096 | case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY: |
JerrySzczurak | 20:cf211a3b3d9e | 6097 | data = 0x04; |
JerrySzczurak | 20:cf211a3b3d9e | 6098 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6099 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 6100 | status = |
JerrySzczurak | 20:cf211a3b3d9e | 6101 | VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6102 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6103 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6104 | |
JerrySzczurak | 20:cf211a3b3d9e | 6105 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 21:627b65069e6d | 6106 | status = vl53l0x_write_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6107 | VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 6108 | |
JerrySzczurak | 20:cf211a3b3d9e | 6109 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6110 | if ( polarity == VL53L0X_INTERRUPTPOLARITY_LOW ) |
JerrySzczurak | 20:cf211a3b3d9e | 6111 | data = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6112 | else |
JerrySzczurak | 20:cf211a3b3d9e | 6113 | data = ( uint8_t )( 1 << 4 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6114 | |
JerrySzczurak | 21:627b65069e6d | 6115 | status = vl53l0x_update_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6116 | VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 6117 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6118 | |
JerrySzczurak | 20:cf211a3b3d9e | 6119 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6120 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6121 | Pin0GpioFunctionality, functionality ); |
JerrySzczurak | 20:cf211a3b3d9e | 6122 | |
JerrySzczurak | 20:cf211a3b3d9e | 6123 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6124 | status = vl53l0x_clear_interrupt_mask( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6125 | |
JerrySzczurak | 20:cf211a3b3d9e | 6126 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6127 | |
JerrySzczurak | 20:cf211a3b3d9e | 6128 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6129 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6130 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6131 | |
JerrySzczurak | 20:cf211a3b3d9e | 6132 | |
JerrySzczurak | 20:cf211a3b3d9e | 6133 | VL53L0X_Error VL53L0X::vl53l0x_get_gpio_config( VL53L0X_DEV dev, uint8_t pin, |
JerrySzczurak | 20:cf211a3b3d9e | 6134 | VL53L0X_DeviceModes *p_device_mode, |
JerrySzczurak | 20:cf211a3b3d9e | 6135 | VL53L0X_GpioFunctionality *p_functionality, |
JerrySzczurak | 20:cf211a3b3d9e | 6136 | VL53L0X_InterruptPolarity *p_polarity ) |
JerrySzczurak | 20:cf211a3b3d9e | 6137 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6138 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6139 | VL53L0X_GpioFunctionality gpio_functionality; |
JerrySzczurak | 20:cf211a3b3d9e | 6140 | uint8_t data; |
JerrySzczurak | 20:cf211a3b3d9e | 6141 | |
JerrySzczurak | 20:cf211a3b3d9e | 6142 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6143 | |
JerrySzczurak | 20:cf211a3b3d9e | 6144 | /* pDeviceMode not managed by Ewok it return the current mode */ |
JerrySzczurak | 20:cf211a3b3d9e | 6145 | |
JerrySzczurak | 20:cf211a3b3d9e | 6146 | status = vl53l0x_get_device_mode( dev, p_device_mode ); |
JerrySzczurak | 20:cf211a3b3d9e | 6147 | |
JerrySzczurak | 20:cf211a3b3d9e | 6148 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6149 | if ( pin != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6150 | status = VL53L0X_ERROR_GPIO_NOT_EXISTING; |
JerrySzczurak | 20:cf211a3b3d9e | 6151 | } else { |
JerrySzczurak | 21:627b65069e6d | 6152 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6153 | VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, &data ); |
JerrySzczurak | 20:cf211a3b3d9e | 6154 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6155 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6156 | |
JerrySzczurak | 20:cf211a3b3d9e | 6157 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6158 | switch ( data & 0x07 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6159 | case 0x00: |
JerrySzczurak | 20:cf211a3b3d9e | 6160 | gpio_functionality = VL53L0X_GPIOFUNCTIONALITY_OFF; |
JerrySzczurak | 20:cf211a3b3d9e | 6161 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6162 | case 0x01: |
JerrySzczurak | 20:cf211a3b3d9e | 6163 | gpio_functionality = |
JerrySzczurak | 20:cf211a3b3d9e | 6164 | VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW; |
JerrySzczurak | 20:cf211a3b3d9e | 6165 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6166 | case 0x02: |
JerrySzczurak | 20:cf211a3b3d9e | 6167 | gpio_functionality = |
JerrySzczurak | 20:cf211a3b3d9e | 6168 | VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH; |
JerrySzczurak | 20:cf211a3b3d9e | 6169 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6170 | case 0x03: |
JerrySzczurak | 20:cf211a3b3d9e | 6171 | gpio_functionality = |
JerrySzczurak | 20:cf211a3b3d9e | 6172 | VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT; |
JerrySzczurak | 20:cf211a3b3d9e | 6173 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6174 | case 0x04: |
JerrySzczurak | 20:cf211a3b3d9e | 6175 | gpio_functionality = |
JerrySzczurak | 20:cf211a3b3d9e | 6176 | VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY; |
JerrySzczurak | 20:cf211a3b3d9e | 6177 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6178 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 6179 | status = VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6180 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6181 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6182 | |
JerrySzczurak | 20:cf211a3b3d9e | 6183 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 21:627b65069e6d | 6184 | status = vl53l0x_read_byte( dev, VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, |
JerrySzczurak | 20:cf211a3b3d9e | 6185 | &data ); |
JerrySzczurak | 20:cf211a3b3d9e | 6186 | |
JerrySzczurak | 20:cf211a3b3d9e | 6187 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6188 | if ( ( data & ( uint8_t )( 1 << 4 ) ) == 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6189 | *p_polarity = VL53L0X_INTERRUPTPOLARITY_LOW; |
JerrySzczurak | 20:cf211a3b3d9e | 6190 | else |
JerrySzczurak | 20:cf211a3b3d9e | 6191 | *p_polarity = VL53L0X_INTERRUPTPOLARITY_HIGH; |
JerrySzczurak | 20:cf211a3b3d9e | 6192 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6193 | |
JerrySzczurak | 20:cf211a3b3d9e | 6194 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6195 | *p_functionality = gpio_functionality; |
JerrySzczurak | 20:cf211a3b3d9e | 6196 | VL53L0X_SETDEVICESPECIFICPARAMETER( dev, Pin0GpioFunctionality, |
JerrySzczurak | 20:cf211a3b3d9e | 6197 | gpio_functionality ); |
JerrySzczurak | 20:cf211a3b3d9e | 6198 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6199 | |
JerrySzczurak | 20:cf211a3b3d9e | 6200 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6201 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6202 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6203 | |
JerrySzczurak | 20:cf211a3b3d9e | 6204 | VL53L0X_Error VL53L0X::vl53l0x_get_histogram_measurement_data( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6205 | VL53L0X_HistogramMeasurementData_t *p_histogram_measurement_data ) |
JerrySzczurak | 20:cf211a3b3d9e | 6206 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6207 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6208 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6209 | |
JerrySzczurak | 20:cf211a3b3d9e | 6210 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6211 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6212 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6213 | |
JerrySzczurak | 20:cf211a3b3d9e | 6214 | VL53L0X_Error VL53L0X::vl53l0x_get_histogram_mode( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6215 | VL53L0X_HistogramModes *p_histogram_mode ) |
JerrySzczurak | 20:cf211a3b3d9e | 6216 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6217 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6218 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6219 | |
JerrySzczurak | 20:cf211a3b3d9e | 6220 | /* not implemented on VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 6221 | |
JerrySzczurak | 20:cf211a3b3d9e | 6222 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6223 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6224 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6225 | |
JerrySzczurak | 20:cf211a3b3d9e | 6226 | VL53L0X_Error VL53L0X::vl53l0x_set_histogram_mode( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6227 | VL53L0X_HistogramModes histogram_mode ) |
JerrySzczurak | 20:cf211a3b3d9e | 6228 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6229 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6230 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6231 | |
JerrySzczurak | 20:cf211a3b3d9e | 6232 | /* not implemented on VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 6233 | |
JerrySzczurak | 20:cf211a3b3d9e | 6234 | LOG_FUNCTION_END( Status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6235 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6236 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6237 | |
JerrySzczurak | 20:cf211a3b3d9e | 6238 | VL53L0X_Error VL53L0X::vl53l0x_get_limit_check_current( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6239 | FixPoint1616_t *p_limit_check_current ) |
JerrySzczurak | 20:cf211a3b3d9e | 6240 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6241 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6242 | VL53L0X_RangingMeasurementData_t last_range_data_buffer; |
JerrySzczurak | 20:cf211a3b3d9e | 6243 | |
JerrySzczurak | 20:cf211a3b3d9e | 6244 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6245 | |
JerrySzczurak | 20:cf211a3b3d9e | 6246 | if ( limit_check_id >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6247 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6248 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6249 | switch ( limit_check_id ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6250 | case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 6251 | /* Need to run a ranging to have the latest values */ |
JerrySzczurak | 20:cf211a3b3d9e | 6252 | *p_limit_check_current = PALDevDataGet( dev, SigmaEstimate ); |
JerrySzczurak | 20:cf211a3b3d9e | 6253 | |
JerrySzczurak | 20:cf211a3b3d9e | 6254 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6255 | |
JerrySzczurak | 20:cf211a3b3d9e | 6256 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 6257 | /* Need to run a ranging to have the latest values */ |
JerrySzczurak | 20:cf211a3b3d9e | 6258 | last_range_data_buffer = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6259 | LastRangeMeasure ); |
JerrySzczurak | 20:cf211a3b3d9e | 6260 | *p_limit_check_current = |
JerrySzczurak | 20:cf211a3b3d9e | 6261 | last_range_data_buffer.SignalRateRtnMegaCps; |
JerrySzczurak | 20:cf211a3b3d9e | 6262 | |
JerrySzczurak | 20:cf211a3b3d9e | 6263 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6264 | |
JerrySzczurak | 20:cf211a3b3d9e | 6265 | case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: |
JerrySzczurak | 20:cf211a3b3d9e | 6266 | /* Need to run a ranging to have the latest values */ |
JerrySzczurak | 20:cf211a3b3d9e | 6267 | *p_limit_check_current = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6268 | LastSignalRefMcps ); |
JerrySzczurak | 20:cf211a3b3d9e | 6269 | |
JerrySzczurak | 20:cf211a3b3d9e | 6270 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6271 | |
JerrySzczurak | 20:cf211a3b3d9e | 6272 | case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: |
JerrySzczurak | 20:cf211a3b3d9e | 6273 | /* Need to run a ranging to have the latest values */ |
JerrySzczurak | 20:cf211a3b3d9e | 6274 | last_range_data_buffer = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6275 | LastRangeMeasure ); |
JerrySzczurak | 20:cf211a3b3d9e | 6276 | *p_limit_check_current = |
JerrySzczurak | 20:cf211a3b3d9e | 6277 | last_range_data_buffer.SignalRateRtnMegaCps; |
JerrySzczurak | 20:cf211a3b3d9e | 6278 | |
JerrySzczurak | 20:cf211a3b3d9e | 6279 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6280 | |
JerrySzczurak | 20:cf211a3b3d9e | 6281 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: |
JerrySzczurak | 20:cf211a3b3d9e | 6282 | /* Need to run a ranging to have the latest values */ |
JerrySzczurak | 20:cf211a3b3d9e | 6283 | last_range_data_buffer = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6284 | LastRangeMeasure ); |
JerrySzczurak | 20:cf211a3b3d9e | 6285 | *p_limit_check_current = |
JerrySzczurak | 20:cf211a3b3d9e | 6286 | last_range_data_buffer.SignalRateRtnMegaCps; |
JerrySzczurak | 20:cf211a3b3d9e | 6287 | |
JerrySzczurak | 20:cf211a3b3d9e | 6288 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6289 | |
JerrySzczurak | 20:cf211a3b3d9e | 6290 | case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: |
JerrySzczurak | 20:cf211a3b3d9e | 6291 | /* Need to run a ranging to have the latest values */ |
JerrySzczurak | 20:cf211a3b3d9e | 6292 | last_range_data_buffer = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6293 | LastRangeMeasure ); |
JerrySzczurak | 20:cf211a3b3d9e | 6294 | *p_limit_check_current = |
JerrySzczurak | 20:cf211a3b3d9e | 6295 | last_range_data_buffer.SignalRateRtnMegaCps; |
JerrySzczurak | 20:cf211a3b3d9e | 6296 | |
JerrySzczurak | 20:cf211a3b3d9e | 6297 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6298 | |
JerrySzczurak | 20:cf211a3b3d9e | 6299 | default: |
JerrySzczurak | 20:cf211a3b3d9e | 6300 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6301 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6302 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6303 | |
JerrySzczurak | 20:cf211a3b3d9e | 6304 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6305 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6306 | |
JerrySzczurak | 20:cf211a3b3d9e | 6307 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6308 | |
JerrySzczurak | 20:cf211a3b3d9e | 6309 | VL53L0X_Error VL53L0X::vl53l0x_get_limit_check_info( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6310 | char *p_limit_check_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 6311 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6312 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6313 | |
JerrySzczurak | 20:cf211a3b3d9e | 6314 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6315 | |
JerrySzczurak | 20:cf211a3b3d9e | 6316 | status = wrapped_vl53l0x_get_limit_check_info( dev, limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6317 | p_limit_check_string ); |
JerrySzczurak | 20:cf211a3b3d9e | 6318 | |
JerrySzczurak | 20:cf211a3b3d9e | 6319 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6320 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6321 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6322 | |
JerrySzczurak | 20:cf211a3b3d9e | 6323 | VL53L0X_Error VL53L0X::vl53l0x_get_limit_check_status( VL53L0X_DEV dev, uint16_t limit_check_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6324 | uint8_t *p_limit_check_status ) |
JerrySzczurak | 20:cf211a3b3d9e | 6325 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6326 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6327 | uint8_t temp8; |
JerrySzczurak | 20:cf211a3b3d9e | 6328 | |
JerrySzczurak | 20:cf211a3b3d9e | 6329 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6330 | |
JerrySzczurak | 20:cf211a3b3d9e | 6331 | if ( limit_check_id >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6332 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6333 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6334 | |
JerrySzczurak | 20:cf211a3b3d9e | 6335 | VL53L0X_GETARRAYPARAMETERFIELD( dev, LimitChecksStatus, |
JerrySzczurak | 20:cf211a3b3d9e | 6336 | limit_check_id, temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6337 | |
JerrySzczurak | 20:cf211a3b3d9e | 6338 | *p_limit_check_status = temp8; |
JerrySzczurak | 20:cf211a3b3d9e | 6339 | |
JerrySzczurak | 20:cf211a3b3d9e | 6340 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6341 | |
JerrySzczurak | 20:cf211a3b3d9e | 6342 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6343 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6344 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6345 | |
JerrySzczurak | 20:cf211a3b3d9e | 6346 | VL53L0X_Error VL53L0X::vl53l0x_set_linearity_corrective_gain( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6347 | int16_t linearity_corrective_gain ) |
JerrySzczurak | 20:cf211a3b3d9e | 6348 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6349 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6350 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6351 | |
JerrySzczurak | 20:cf211a3b3d9e | 6352 | if ( ( linearity_corrective_gain < 0 ) || ( linearity_corrective_gain > 1000 ) ) |
JerrySzczurak | 20:cf211a3b3d9e | 6353 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6354 | else { |
JerrySzczurak | 20:cf211a3b3d9e | 6355 | PALDevDataSet( dev, LinearityCorrectiveGain, |
JerrySzczurak | 20:cf211a3b3d9e | 6356 | linearity_corrective_gain ); |
JerrySzczurak | 20:cf211a3b3d9e | 6357 | |
JerrySzczurak | 20:cf211a3b3d9e | 6358 | if ( linearity_corrective_gain != 1000 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6359 | /* Disable FW Xtalk */ |
JerrySzczurak | 21:627b65069e6d | 6360 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6361 | VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6362 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6363 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6364 | |
JerrySzczurak | 20:cf211a3b3d9e | 6365 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6366 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6367 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6368 | |
JerrySzczurak | 20:cf211a3b3d9e | 6369 | VL53L0X_Error VL53L0X::vl53l0x_get_linearity_corrective_gain( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6370 | uint16_t *p_linearity_corrective_gain ) |
JerrySzczurak | 20:cf211a3b3d9e | 6371 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6372 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6373 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6374 | |
JerrySzczurak | 20:cf211a3b3d9e | 6375 | *p_linearity_corrective_gain = PALDevDataGet( dev, LinearityCorrectiveGain ); |
JerrySzczurak | 20:cf211a3b3d9e | 6376 | |
JerrySzczurak | 20:cf211a3b3d9e | 6377 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6378 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6379 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6380 | |
JerrySzczurak | 20:cf211a3b3d9e | 6381 | VL53L0X_Error VL53L0X::vl53l0x_get_max_number_of_roi_zones( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6382 | uint8_t *p_max_number_of_roi_zones ) |
JerrySzczurak | 20:cf211a3b3d9e | 6383 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6384 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6385 | |
JerrySzczurak | 20:cf211a3b3d9e | 6386 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6387 | |
JerrySzczurak | 20:cf211a3b3d9e | 6388 | *p_max_number_of_roi_zones = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 6389 | |
JerrySzczurak | 20:cf211a3b3d9e | 6390 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6391 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6392 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6393 | |
JerrySzczurak | 20:cf211a3b3d9e | 6394 | VL53L0X_Error VL53L0X::vl53l0x_get_measurement_ref_signal( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6395 | FixPoint1616_t *p_measurement_ref_signal ) |
JerrySzczurak | 20:cf211a3b3d9e | 6396 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6397 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6398 | uint8_t signal_ref_clip_limit_check_enable = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6399 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6400 | |
JerrySzczurak | 20:cf211a3b3d9e | 6401 | status = vl53l0x_get_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6402 | VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, |
JerrySzczurak | 20:cf211a3b3d9e | 6403 | &signal_ref_clip_limit_check_enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 6404 | if ( signal_ref_clip_limit_check_enable != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6405 | *p_measurement_ref_signal = PALDevDataGet( dev, LastSignalRefMcps ); |
JerrySzczurak | 20:cf211a3b3d9e | 6406 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6407 | status = VL53L0X_ERROR_INVALID_COMMAND; |
JerrySzczurak | 20:cf211a3b3d9e | 6408 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6409 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6410 | |
JerrySzczurak | 20:cf211a3b3d9e | 6411 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6412 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6413 | |
JerrySzczurak | 20:cf211a3b3d9e | 6414 | |
JerrySzczurak | 20:cf211a3b3d9e | 6415 | VL53L0X_Error VL53L0X::vl53l0x_get_number_of_limit_check( uint16_t *p_number_of_limit_check ) |
JerrySzczurak | 20:cf211a3b3d9e | 6416 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6417 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6418 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6419 | |
JerrySzczurak | 20:cf211a3b3d9e | 6420 | *p_number_of_limit_check = VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; |
JerrySzczurak | 20:cf211a3b3d9e | 6421 | |
JerrySzczurak | 20:cf211a3b3d9e | 6422 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6423 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6424 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6425 | |
JerrySzczurak | 20:cf211a3b3d9e | 6426 | VL53L0X_Error VL53L0X::vl53l0x_get_number_of_roi_zones( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6427 | uint8_t *p_number_of_roi_zones ) |
JerrySzczurak | 20:cf211a3b3d9e | 6428 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6429 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6430 | |
JerrySzczurak | 20:cf211a3b3d9e | 6431 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6432 | |
JerrySzczurak | 20:cf211a3b3d9e | 6433 | *p_number_of_roi_zones = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 6434 | |
JerrySzczurak | 20:cf211a3b3d9e | 6435 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6436 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6437 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6438 | |
JerrySzczurak | 20:cf211a3b3d9e | 6439 | VL53L0X_Error VL53L0X::vl53l0x_set_number_of_roi_zones( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6440 | uint8_t number_of_roi_zones ) |
JerrySzczurak | 20:cf211a3b3d9e | 6441 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6442 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6443 | |
JerrySzczurak | 20:cf211a3b3d9e | 6444 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6445 | |
JerrySzczurak | 20:cf211a3b3d9e | 6446 | if ( number_of_roi_zones != 1 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6447 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6448 | |
JerrySzczurak | 20:cf211a3b3d9e | 6449 | |
JerrySzczurak | 20:cf211a3b3d9e | 6450 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6451 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6452 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6453 | |
JerrySzczurak | 20:cf211a3b3d9e | 6454 | VL53L0X_Error VL53L0X::vl53l0x_get_number_of_sequence_steps( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6455 | uint8_t *p_number_of_sequence_steps ) |
JerrySzczurak | 20:cf211a3b3d9e | 6456 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6457 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6458 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6459 | |
JerrySzczurak | 20:cf211a3b3d9e | 6460 | *p_number_of_sequence_steps = VL53L0X_SEQUENCESTEP_NUMBER_OF_CHECKS; |
JerrySzczurak | 20:cf211a3b3d9e | 6461 | |
JerrySzczurak | 20:cf211a3b3d9e | 6462 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6463 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6464 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6465 | |
JerrySzczurak | 20:cf211a3b3d9e | 6466 | VL53L0X_Error VL53L0X::vl53l0x_get_pal_error_string( VL53L0X_Error pal_error_code, |
JerrySzczurak | 20:cf211a3b3d9e | 6467 | char *p_pal_error_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 6468 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6469 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6470 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6471 | |
JerrySzczurak | 20:cf211a3b3d9e | 6472 | status = wrapped_vl53l0x_get_pal_error_string( pal_error_code, p_pal_error_string ); |
JerrySzczurak | 20:cf211a3b3d9e | 6473 | |
JerrySzczurak | 20:cf211a3b3d9e | 6474 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6475 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6476 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6477 | |
JerrySzczurak | 20:cf211a3b3d9e | 6478 | VL53L0X_Error VL53L0X::vl53l0x_get_pal_spec_version( VL53L0X_Version_t *p_pal_spec_version ) |
JerrySzczurak | 20:cf211a3b3d9e | 6479 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6480 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6481 | |
JerrySzczurak | 20:cf211a3b3d9e | 6482 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6483 | |
JerrySzczurak | 20:cf211a3b3d9e | 6484 | p_pal_spec_version->major = VL53L0X_SPECIFICATION_VER_MAJOR; |
JerrySzczurak | 20:cf211a3b3d9e | 6485 | p_pal_spec_version->minor = VL53L0X_SPECIFICATION_VER_MINOR; |
JerrySzczurak | 20:cf211a3b3d9e | 6486 | p_pal_spec_version->build = VL53L0X_SPECIFICATION_VER_SUB; |
JerrySzczurak | 20:cf211a3b3d9e | 6487 | |
JerrySzczurak | 20:cf211a3b3d9e | 6488 | p_pal_spec_version->revision = VL53L0X_SPECIFICATION_VER_REVISION; |
JerrySzczurak | 20:cf211a3b3d9e | 6489 | |
JerrySzczurak | 20:cf211a3b3d9e | 6490 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6491 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6492 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6493 | |
JerrySzczurak | 20:cf211a3b3d9e | 6494 | VL53L0X_Error VL53L0X::vl53l0x_get_pal_state( VL53L0X_DEV dev, VL53L0X_State *p_pal_state ) |
JerrySzczurak | 20:cf211a3b3d9e | 6495 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6496 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6497 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6498 | |
JerrySzczurak | 20:cf211a3b3d9e | 6499 | *p_pal_state = PALDevDataGet( dev, PalState ); |
JerrySzczurak | 20:cf211a3b3d9e | 6500 | |
JerrySzczurak | 20:cf211a3b3d9e | 6501 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6502 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6503 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6504 | |
JerrySzczurak | 20:cf211a3b3d9e | 6505 | VL53L0X_Error VL53L0X::vl53l0x_get_pal_state_string( VL53L0X_State pal_state_code, |
JerrySzczurak | 20:cf211a3b3d9e | 6506 | char *p_pal_state_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 6507 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6508 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6509 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6510 | |
JerrySzczurak | 20:cf211a3b3d9e | 6511 | status = wrapped_vl53l0x_get_pal_state_string( pal_state_code, p_pal_state_string ); |
JerrySzczurak | 20:cf211a3b3d9e | 6512 | |
JerrySzczurak | 20:cf211a3b3d9e | 6513 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6514 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6515 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6516 | |
JerrySzczurak | 20:cf211a3b3d9e | 6517 | VL53L0X_Error VL53L0X::vl53l0x_get_power_mode( VL53L0X_DEV dev, VL53L0X_PowerModes *p_power_mode ) |
JerrySzczurak | 20:cf211a3b3d9e | 6518 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6519 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6520 | uint8_t byte; |
JerrySzczurak | 20:cf211a3b3d9e | 6521 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6522 | |
JerrySzczurak | 20:cf211a3b3d9e | 6523 | /* Only level1 of Power mode exists */ |
JerrySzczurak | 21:627b65069e6d | 6524 | status = vl53l0x_read_byte( dev, 0x80, &byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 6525 | |
JerrySzczurak | 20:cf211a3b3d9e | 6526 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6527 | if ( byte == 1 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6528 | PALDevDataSet( dev, PowerMode, |
JerrySzczurak | 20:cf211a3b3d9e | 6529 | VL53L0X_POWERMODE_IDLE_LEVEL1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6530 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6531 | PALDevDataSet( dev, PowerMode, |
JerrySzczurak | 20:cf211a3b3d9e | 6532 | VL53L0X_POWERMODE_STANDBY_LEVEL1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6533 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6534 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6535 | |
JerrySzczurak | 20:cf211a3b3d9e | 6536 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6537 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6538 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6539 | |
JerrySzczurak | 20:cf211a3b3d9e | 6540 | VL53L0X_Error VL53L0X::vl53l0x_set_power_mode( VL53L0X_DEV dev, VL53L0X_PowerModes power_mode ) |
JerrySzczurak | 20:cf211a3b3d9e | 6541 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6542 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6543 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6544 | |
JerrySzczurak | 20:cf211a3b3d9e | 6545 | /* Only level1 of Power mode exists */ |
JerrySzczurak | 20:cf211a3b3d9e | 6546 | if ( ( power_mode != VL53L0X_POWERMODE_STANDBY_LEVEL1 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6547 | && ( power_mode != VL53L0X_POWERMODE_IDLE_LEVEL1 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6548 | status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6549 | } else if ( power_mode == VL53L0X_POWERMODE_STANDBY_LEVEL1 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6550 | /* set the standby level1 of power mode */ |
JerrySzczurak | 21:627b65069e6d | 6551 | status = vl53l0x_write_byte( dev, 0x80, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6552 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6553 | /* Set PAL State to standby */ |
JerrySzczurak | 20:cf211a3b3d9e | 6554 | PALDevDataSet( dev, PalState, VL53L0X_STATE_STANDBY ); |
JerrySzczurak | 20:cf211a3b3d9e | 6555 | PALDevDataSet( dev, PowerMode, |
JerrySzczurak | 20:cf211a3b3d9e | 6556 | VL53L0X_POWERMODE_STANDBY_LEVEL1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6557 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6558 | |
JerrySzczurak | 20:cf211a3b3d9e | 6559 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6560 | /* VL53L0X_POWERMODE_IDLE_LEVEL1 */ |
JerrySzczurak | 21:627b65069e6d | 6561 | status = vl53l0x_write_byte( dev, 0x80, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6562 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6563 | status = vl53l0x_static_init( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 6564 | |
JerrySzczurak | 20:cf211a3b3d9e | 6565 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6566 | PALDevDataSet( dev, PowerMode, |
JerrySzczurak | 20:cf211a3b3d9e | 6567 | VL53L0X_POWERMODE_IDLE_LEVEL1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6568 | |
JerrySzczurak | 20:cf211a3b3d9e | 6569 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6570 | |
JerrySzczurak | 20:cf211a3b3d9e | 6571 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6572 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6573 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6574 | |
JerrySzczurak | 20:cf211a3b3d9e | 6575 | VL53L0X_Error VL53L0X::vl53l0x_get_product_revision( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6576 | uint8_t *p_product_revision_major, uint8_t *p_product_revision_minor ) |
JerrySzczurak | 20:cf211a3b3d9e | 6577 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6578 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6579 | uint8_t revision_id; |
JerrySzczurak | 20:cf211a3b3d9e | 6580 | |
JerrySzczurak | 20:cf211a3b3d9e | 6581 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6582 | |
JerrySzczurak | 21:627b65069e6d | 6583 | status = vl53l0x_read_byte( dev, VL53L0X_REG_IDENTIFICATION_REVISION_ID, |
JerrySzczurak | 20:cf211a3b3d9e | 6584 | &revision_id ); |
JerrySzczurak | 20:cf211a3b3d9e | 6585 | *p_product_revision_major = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 6586 | *p_product_revision_minor = ( revision_id & 0xF0 ) >> 4; |
JerrySzczurak | 20:cf211a3b3d9e | 6587 | |
JerrySzczurak | 20:cf211a3b3d9e | 6588 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6589 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6590 | |
JerrySzczurak | 20:cf211a3b3d9e | 6591 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6592 | |
JerrySzczurak | 20:cf211a3b3d9e | 6593 | VL53L0X_Error VL53L0X::vl53l0x_get_range_status_string( uint8_t range_status, |
JerrySzczurak | 20:cf211a3b3d9e | 6594 | char *p_range_status_string ) |
JerrySzczurak | 20:cf211a3b3d9e | 6595 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6596 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6597 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6598 | |
JerrySzczurak | 20:cf211a3b3d9e | 6599 | status = wrapped_vl53l0x_get_range_status_string( range_status, |
JerrySzczurak | 20:cf211a3b3d9e | 6600 | p_range_status_string ); |
JerrySzczurak | 20:cf211a3b3d9e | 6601 | |
JerrySzczurak | 20:cf211a3b3d9e | 6602 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6603 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6604 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6605 | |
JerrySzczurak | 20:cf211a3b3d9e | 6606 | VL53L0X_Error VL53L0X::vl53l0x_get_ref_calibration( VL53L0X_DEV dev, uint8_t *p_vhv_settings, |
JerrySzczurak | 20:cf211a3b3d9e | 6607 | uint8_t *p_phase_cal ) |
JerrySzczurak | 20:cf211a3b3d9e | 6608 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6609 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6610 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6611 | |
JerrySzczurak | 20:cf211a3b3d9e | 6612 | status = wrapped_vl53l0x_get_ref_calibration( dev, p_vhv_settings, p_phase_cal ); |
JerrySzczurak | 20:cf211a3b3d9e | 6613 | |
JerrySzczurak | 20:cf211a3b3d9e | 6614 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6615 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6616 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6617 | |
JerrySzczurak | 20:cf211a3b3d9e | 6618 | VL53L0X_Error VL53L0X::vl53l0x_get_sequence_step_enable( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6619 | VL53L0X_SequenceStepId sequence_step_id, uint8_t *p_sequence_step_enabled ) |
JerrySzczurak | 20:cf211a3b3d9e | 6620 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6621 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6622 | uint8_t SequenceConfig = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6623 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6624 | |
JerrySzczurak | 21:627b65069e6d | 6625 | status = vl53l0x_read_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, |
JerrySzczurak | 20:cf211a3b3d9e | 6626 | &SequenceConfig ); |
JerrySzczurak | 20:cf211a3b3d9e | 6627 | |
JerrySzczurak | 20:cf211a3b3d9e | 6628 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6629 | status = sequence_step_enabled( dev, sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6630 | SequenceConfig, p_sequence_step_enabled ); |
JerrySzczurak | 20:cf211a3b3d9e | 6631 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6632 | |
JerrySzczurak | 20:cf211a3b3d9e | 6633 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6634 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6635 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6636 | |
JerrySzczurak | 20:cf211a3b3d9e | 6637 | VL53L0X_Error VL53L0X::vl53l0x_set_sequence_step_timeout( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6638 | VL53L0X_SequenceStepId sequence_step_id, FixPoint1616_t time_out_milli_secs ) |
JerrySzczurak | 20:cf211a3b3d9e | 6639 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6640 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6641 | VL53L0X_Error status1 = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6642 | uint32_t TimeoutMicroSeconds = ( ( time_out_milli_secs * 1000 ) + 0x8000 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6643 | >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 6644 | uint32_t MeasurementTimingBudgetMicroSeconds; |
JerrySzczurak | 20:cf211a3b3d9e | 6645 | FixPoint1616_t OldTimeOutMicroSeconds; |
JerrySzczurak | 20:cf211a3b3d9e | 6646 | |
JerrySzczurak | 20:cf211a3b3d9e | 6647 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6648 | |
JerrySzczurak | 20:cf211a3b3d9e | 6649 | /* Read back the current value in case we need to revert back to this. |
JerrySzczurak | 20:cf211a3b3d9e | 6650 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 6651 | status = get_sequence_step_timeout( dev, sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6652 | &OldTimeOutMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6653 | |
JerrySzczurak | 20:cf211a3b3d9e | 6654 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6655 | status = set_sequence_step_timeout( dev, sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6656 | TimeoutMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6657 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6658 | |
JerrySzczurak | 20:cf211a3b3d9e | 6659 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6660 | VL53L0X_GETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6661 | MeasurementTimingBudgetMicroSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 6662 | MeasurementTimingBudgetMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6663 | |
JerrySzczurak | 20:cf211a3b3d9e | 6664 | /* At this point we don't know if the requested value is valid, |
JerrySzczurak | 20:cf211a3b3d9e | 6665 | therefore proceed to update the entire timing budget and |
JerrySzczurak | 20:cf211a3b3d9e | 6666 | if this fails, revert back to the previous value. |
JerrySzczurak | 20:cf211a3b3d9e | 6667 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 6668 | status = vl53l0x_set_measurement_timing_budget_micro_seconds( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6669 | MeasurementTimingBudgetMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6670 | |
JerrySzczurak | 20:cf211a3b3d9e | 6671 | if ( status != VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6672 | status1 = set_sequence_step_timeout( dev, sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6673 | OldTimeOutMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6674 | |
JerrySzczurak | 20:cf211a3b3d9e | 6675 | if ( status1 == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6676 | status1 = |
JerrySzczurak | 20:cf211a3b3d9e | 6677 | vl53l0x_set_measurement_timing_budget_micro_seconds( |
JerrySzczurak | 20:cf211a3b3d9e | 6678 | dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6679 | MeasurementTimingBudgetMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6680 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6681 | |
JerrySzczurak | 20:cf211a3b3d9e | 6682 | status = status1; |
JerrySzczurak | 20:cf211a3b3d9e | 6683 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6684 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6685 | |
JerrySzczurak | 20:cf211a3b3d9e | 6686 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6687 | |
JerrySzczurak | 20:cf211a3b3d9e | 6688 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6689 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6690 | |
JerrySzczurak | 20:cf211a3b3d9e | 6691 | VL53L0X_Error VL53L0X::vl53l0x_get_sequence_step_timeout( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6692 | VL53L0X_SequenceStepId sequence_step_id, FixPoint1616_t *p_time_out_milli_secs ) |
JerrySzczurak | 20:cf211a3b3d9e | 6693 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6694 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6695 | uint32_t timeout_micro_seconds; |
JerrySzczurak | 20:cf211a3b3d9e | 6696 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6697 | |
JerrySzczurak | 20:cf211a3b3d9e | 6698 | status = get_sequence_step_timeout( dev, sequence_step_id, |
JerrySzczurak | 20:cf211a3b3d9e | 6699 | &timeout_micro_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 6700 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6701 | timeout_micro_seconds <<= 8; |
JerrySzczurak | 20:cf211a3b3d9e | 6702 | *p_time_out_milli_secs = ( timeout_micro_seconds + 500 ) / 1000; |
JerrySzczurak | 20:cf211a3b3d9e | 6703 | *p_time_out_milli_secs <<= 8; |
JerrySzczurak | 20:cf211a3b3d9e | 6704 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6705 | |
JerrySzczurak | 20:cf211a3b3d9e | 6706 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6707 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6708 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6709 | |
JerrySzczurak | 20:cf211a3b3d9e | 6710 | VL53L0X_Error VL53L0X::vl53l0x_set_spad_ambient_damper_factor( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6711 | uint16_t spad_ambient_damper_factor ) |
JerrySzczurak | 20:cf211a3b3d9e | 6712 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6713 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6714 | uint8_t byte; |
JerrySzczurak | 20:cf211a3b3d9e | 6715 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6716 | |
JerrySzczurak | 20:cf211a3b3d9e | 6717 | byte = ( uint8_t )( spad_ambient_damper_factor & 0x00FF ); |
JerrySzczurak | 20:cf211a3b3d9e | 6718 | |
JerrySzczurak | 21:627b65069e6d | 6719 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6720 | status |= vl53l0x_write_byte( dev, 0x42, byte ); |
JerrySzczurak | 21:627b65069e6d | 6721 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6722 | |
JerrySzczurak | 20:cf211a3b3d9e | 6723 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6724 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6725 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6726 | |
JerrySzczurak | 20:cf211a3b3d9e | 6727 | |
JerrySzczurak | 20:cf211a3b3d9e | 6728 | VL53L0X_Error VL53L0X::vl53l0x_get_spad_ambient_damper_factor( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6729 | uint16_t *p_spad_ambient_damper_factor ) |
JerrySzczurak | 20:cf211a3b3d9e | 6730 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6731 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6732 | uint8_t Byte; |
JerrySzczurak | 20:cf211a3b3d9e | 6733 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6734 | |
JerrySzczurak | 21:627b65069e6d | 6735 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6736 | status |= vl53l0x_read_byte( dev, 0x42, &Byte ); |
JerrySzczurak | 21:627b65069e6d | 6737 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6738 | *p_spad_ambient_damper_factor = ( uint16_t )Byte; |
JerrySzczurak | 20:cf211a3b3d9e | 6739 | |
JerrySzczurak | 20:cf211a3b3d9e | 6740 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6741 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6742 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6743 | |
JerrySzczurak | 20:cf211a3b3d9e | 6744 | VL53L0X_Error VL53L0X::vl53l0x_set_spad_ambient_damper_threshold( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6745 | uint16_t spad_ambient_damper_threshold ) |
JerrySzczurak | 20:cf211a3b3d9e | 6746 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6747 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6748 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6749 | |
JerrySzczurak | 21:627b65069e6d | 6750 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6751 | status |= vl53l0x_write_word( dev, 0x40, spad_ambient_damper_threshold ); |
JerrySzczurak | 21:627b65069e6d | 6752 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6753 | |
JerrySzczurak | 20:cf211a3b3d9e | 6754 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6755 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6756 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6757 | |
JerrySzczurak | 20:cf211a3b3d9e | 6758 | VL53L0X_Error VL53L0X::vl53l0x_get_spad_ambient_damper_threshold( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6759 | uint16_t *p_spad_ambient_damper_threshold ) |
JerrySzczurak | 20:cf211a3b3d9e | 6760 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6761 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6762 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6763 | |
JerrySzczurak | 21:627b65069e6d | 6764 | status = vl53l0x_write_byte( dev, 0xFF, 0x01 ); |
JerrySzczurak | 21:627b65069e6d | 6765 | status |= vl53l0x_read_word( dev, 0x40, p_spad_ambient_damper_threshold ); |
JerrySzczurak | 21:627b65069e6d | 6766 | status |= vl53l0x_write_byte( dev, 0xFF, 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6767 | |
JerrySzczurak | 20:cf211a3b3d9e | 6768 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6769 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6770 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6771 | |
JerrySzczurak | 20:cf211a3b3d9e | 6772 | VL53L0X_Error VL53L0X::vl53l0x_get_upper_limit_milli_meter( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6773 | uint16_t *p_upper_limit_milli_meter ) |
JerrySzczurak | 20:cf211a3b3d9e | 6774 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6775 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 6776 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6777 | |
JerrySzczurak | 20:cf211a3b3d9e | 6778 | /* not implemented on VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 6779 | |
JerrySzczurak | 20:cf211a3b3d9e | 6780 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6781 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6782 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6783 | |
JerrySzczurak | 20:cf211a3b3d9e | 6784 | VL53L0X_Error VL53L0X::vl53l0x_set_tuning_setting_buffer( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6785 | uint8_t *p_tuning_setting_buffer, uint8_t use_internal_tuning_settings ) |
JerrySzczurak | 20:cf211a3b3d9e | 6786 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6787 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6788 | |
JerrySzczurak | 20:cf211a3b3d9e | 6789 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6790 | |
JerrySzczurak | 20:cf211a3b3d9e | 6791 | if ( use_internal_tuning_settings == 1 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6792 | /* Force use internal settings */ |
JerrySzczurak | 20:cf211a3b3d9e | 6793 | PALDevDataSet( dev, UseInternalTuningSettings, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6794 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6795 | |
JerrySzczurak | 20:cf211a3b3d9e | 6796 | /* check that the first byte is not 0 */ |
JerrySzczurak | 20:cf211a3b3d9e | 6797 | if ( *p_tuning_setting_buffer != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6798 | PALDevDataSet( dev, pTuningSettingsPointer, |
JerrySzczurak | 20:cf211a3b3d9e | 6799 | p_tuning_setting_buffer ); |
JerrySzczurak | 20:cf211a3b3d9e | 6800 | PALDevDataSet( dev, UseInternalTuningSettings, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6801 | |
JerrySzczurak | 20:cf211a3b3d9e | 6802 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6803 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6804 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6805 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6806 | |
JerrySzczurak | 20:cf211a3b3d9e | 6807 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6808 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6809 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6810 | |
JerrySzczurak | 20:cf211a3b3d9e | 6811 | VL53L0X_Error VL53L0X::vl53l0x_get_tuning_setting_buffer( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6812 | uint8_t **pp_tuning_setting_buffer, uint8_t *p_use_internal_tuning_settings ) |
JerrySzczurak | 20:cf211a3b3d9e | 6813 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6814 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6815 | |
JerrySzczurak | 20:cf211a3b3d9e | 6816 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6817 | |
JerrySzczurak | 20:cf211a3b3d9e | 6818 | *pp_tuning_setting_buffer = PALDevDataGet( dev, pTuningSettingsPointer ); |
JerrySzczurak | 20:cf211a3b3d9e | 6819 | *p_use_internal_tuning_settings = PALDevDataGet( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6820 | UseInternalTuningSettings ); |
JerrySzczurak | 20:cf211a3b3d9e | 6821 | |
JerrySzczurak | 20:cf211a3b3d9e | 6822 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6823 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6824 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6825 | |
JerrySzczurak | 20:cf211a3b3d9e | 6826 | VL53L0X_Error VL53L0X::vl53l0x_get_version( VL53L0X_Version_t *p_version ) |
JerrySzczurak | 20:cf211a3b3d9e | 6827 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6828 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6829 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6830 | |
JerrySzczurak | 20:cf211a3b3d9e | 6831 | p_version->major = VL53L0X_IMPLEMENTATION_VER_MAJOR; |
JerrySzczurak | 20:cf211a3b3d9e | 6832 | p_version->minor = VL53L0X_IMPLEMENTATION_VER_MINOR; |
JerrySzczurak | 20:cf211a3b3d9e | 6833 | p_version->build = VL53L0X_IMPLEMENTATION_VER_SUB; |
JerrySzczurak | 20:cf211a3b3d9e | 6834 | |
JerrySzczurak | 20:cf211a3b3d9e | 6835 | p_version->revision = VL53L0X_IMPLEMENTATION_VER_REVISION; |
JerrySzczurak | 20:cf211a3b3d9e | 6836 | |
JerrySzczurak | 20:cf211a3b3d9e | 6837 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6838 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6839 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6840 | |
JerrySzczurak | 20:cf211a3b3d9e | 6841 | VL53L0X_Error VL53L0X::vl53l0x_lock_sequence_access( VL53L0X_DEV dev ) |
JerrySzczurak | 20:cf211a3b3d9e | 6842 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6843 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6844 | |
JerrySzczurak | 20:cf211a3b3d9e | 6845 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6846 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6847 | |
JerrySzczurak | 20:cf211a3b3d9e | 6848 | VL53L0X_Error VL53L0X::vl53l0x_unlock_sequence_access( VL53L0X_DEV dev ) |
JerrySzczurak | 20:cf211a3b3d9e | 6849 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6850 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6851 | |
JerrySzczurak | 20:cf211a3b3d9e | 6852 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6853 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6854 | |
JerrySzczurak | 20:cf211a3b3d9e | 6855 | VL53L0X_Error VL53L0X::vl53l0x_perform_offset_calibration( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6856 | FixPoint1616_t cal_distance_milli_meter, |
JerrySzczurak | 20:cf211a3b3d9e | 6857 | int32_t *p_offset_micro_meter ) |
JerrySzczurak | 20:cf211a3b3d9e | 6858 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6859 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6860 | uint16_t sum_ranging = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6861 | FixPoint1616_t total_count = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6862 | VL53L0X_RangingMeasurementData_t ranging_measurement_data; |
JerrySzczurak | 20:cf211a3b3d9e | 6863 | FixPoint1616_t stored_mean_range; |
JerrySzczurak | 20:cf211a3b3d9e | 6864 | uint32_t stored_mean_range_as_int; |
JerrySzczurak | 20:cf211a3b3d9e | 6865 | uint32_t cal_distance_as_int_mm; |
JerrySzczurak | 20:cf211a3b3d9e | 6866 | uint8_t sequence_step_enabled; |
JerrySzczurak | 20:cf211a3b3d9e | 6867 | int meas = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6868 | |
JerrySzczurak | 20:cf211a3b3d9e | 6869 | if ( cal_distance_milli_meter <= 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6870 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 6871 | |
JerrySzczurak | 20:cf211a3b3d9e | 6872 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6873 | status = wrapped_vl53l0x_set_offset_calibration_data_micro_meter( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6874 | |
JerrySzczurak | 20:cf211a3b3d9e | 6875 | |
JerrySzczurak | 20:cf211a3b3d9e | 6876 | /* Get the value of the TCC */ |
JerrySzczurak | 20:cf211a3b3d9e | 6877 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6878 | status = vl53l0x_get_sequence_step_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6879 | VL53L0X_SEQUENCESTEP_TCC, &sequence_step_enabled ); |
JerrySzczurak | 20:cf211a3b3d9e | 6880 | |
JerrySzczurak | 20:cf211a3b3d9e | 6881 | |
JerrySzczurak | 20:cf211a3b3d9e | 6882 | /* Disable the TCC */ |
JerrySzczurak | 20:cf211a3b3d9e | 6883 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6884 | status = vl53l0x_set_sequence_step_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6885 | VL53L0X_SEQUENCESTEP_TCC, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6886 | |
JerrySzczurak | 20:cf211a3b3d9e | 6887 | |
JerrySzczurak | 20:cf211a3b3d9e | 6888 | /* Disable the RIT */ |
JerrySzczurak | 20:cf211a3b3d9e | 6889 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6890 | status = vl53l0x_set_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6891 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6892 | |
JerrySzczurak | 20:cf211a3b3d9e | 6893 | /* Perform 50 measurements and compute the averages */ |
JerrySzczurak | 20:cf211a3b3d9e | 6894 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6895 | sum_ranging = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6896 | total_count = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6897 | for ( meas = 0; meas < 50; meas++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6898 | status = vl53l0x_perform_single_ranging_measurement( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6899 | &ranging_measurement_data ); |
JerrySzczurak | 20:cf211a3b3d9e | 6900 | |
JerrySzczurak | 20:cf211a3b3d9e | 6901 | if ( status != VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 6902 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 6903 | |
JerrySzczurak | 20:cf211a3b3d9e | 6904 | /* The range is valid when RangeStatus = 0 */ |
JerrySzczurak | 20:cf211a3b3d9e | 6905 | if ( ranging_measurement_data.RangeStatus == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6906 | sum_ranging = sum_ranging + |
JerrySzczurak | 20:cf211a3b3d9e | 6907 | ranging_measurement_data.RangeMilliMeter; |
JerrySzczurak | 20:cf211a3b3d9e | 6908 | total_count = total_count + 1; |
JerrySzczurak | 20:cf211a3b3d9e | 6909 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6910 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6911 | |
JerrySzczurak | 20:cf211a3b3d9e | 6912 | /* no valid values found */ |
JerrySzczurak | 20:cf211a3b3d9e | 6913 | if ( total_count == 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6914 | status = VL53L0X_ERROR_RANGE_ERROR; |
JerrySzczurak | 20:cf211a3b3d9e | 6915 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6916 | |
JerrySzczurak | 20:cf211a3b3d9e | 6917 | |
JerrySzczurak | 20:cf211a3b3d9e | 6918 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6919 | /* FixPoint1616_t / uint16_t = FixPoint1616_t */ |
JerrySzczurak | 20:cf211a3b3d9e | 6920 | stored_mean_range = ( FixPoint1616_t )( ( uint32_t )( sum_ranging << 16 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6921 | / total_count ); |
JerrySzczurak | 20:cf211a3b3d9e | 6922 | |
JerrySzczurak | 20:cf211a3b3d9e | 6923 | stored_mean_range_as_int = ( stored_mean_range + 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 6924 | |
JerrySzczurak | 20:cf211a3b3d9e | 6925 | /* Round Cal Distance to Whole Number. |
JerrySzczurak | 20:cf211a3b3d9e | 6926 | * Note that the cal distance is in mm, therefore no resolution |
JerrySzczurak | 20:cf211a3b3d9e | 6927 | * is lost.*/ |
JerrySzczurak | 20:cf211a3b3d9e | 6928 | cal_distance_as_int_mm = ( cal_distance_milli_meter + 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 6929 | |
JerrySzczurak | 20:cf211a3b3d9e | 6930 | *p_offset_micro_meter = ( cal_distance_as_int_mm - |
JerrySzczurak | 20:cf211a3b3d9e | 6931 | stored_mean_range_as_int ) * 1000; |
JerrySzczurak | 20:cf211a3b3d9e | 6932 | |
JerrySzczurak | 20:cf211a3b3d9e | 6933 | /* Apply the calculated offset */ |
JerrySzczurak | 20:cf211a3b3d9e | 6934 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6935 | VL53L0X_SETPARAMETERFIELD( dev, RangeOffsetMicroMeters, |
JerrySzczurak | 20:cf211a3b3d9e | 6936 | *p_offset_micro_meter ); |
JerrySzczurak | 20:cf211a3b3d9e | 6937 | status = vl53l0x_set_offset_calibration_data_micro_meter( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6938 | *p_offset_micro_meter ); |
JerrySzczurak | 20:cf211a3b3d9e | 6939 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6940 | |
JerrySzczurak | 20:cf211a3b3d9e | 6941 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6942 | |
JerrySzczurak | 20:cf211a3b3d9e | 6943 | /* Restore the TCC */ |
JerrySzczurak | 20:cf211a3b3d9e | 6944 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6945 | if ( sequence_step_enabled != 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6946 | status = vl53l0x_set_sequence_step_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6947 | VL53L0X_SEQUENCESTEP_TCC, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6948 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6949 | |
JerrySzczurak | 20:cf211a3b3d9e | 6950 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6951 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6952 | |
JerrySzczurak | 20:cf211a3b3d9e | 6953 | VL53L0X_Error VL53L0X::vl53l0x_set_x_talk_compensation_enable( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6954 | uint8_t x_talk_compensation_enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 6955 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6956 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6957 | FixPoint1616_t temp_fix1616; |
JerrySzczurak | 20:cf211a3b3d9e | 6958 | uint16_t linearity_corrective_gain; |
JerrySzczurak | 20:cf211a3b3d9e | 6959 | |
JerrySzczurak | 20:cf211a3b3d9e | 6960 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 6961 | |
JerrySzczurak | 20:cf211a3b3d9e | 6962 | linearity_corrective_gain = PALDevDataGet( dev, LinearityCorrectiveGain ); |
JerrySzczurak | 20:cf211a3b3d9e | 6963 | |
JerrySzczurak | 20:cf211a3b3d9e | 6964 | if ( ( x_talk_compensation_enable == 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 6965 | || ( linearity_corrective_gain != 1000 ) ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6966 | temp_fix1616 = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6967 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6968 | VL53L0X_GETPARAMETERFIELD( dev, XTalkCompensationRateMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 6969 | temp_fix1616 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6970 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6971 | |
JerrySzczurak | 20:cf211a3b3d9e | 6972 | /* the following register has a format 3.13 */ |
JerrySzczurak | 21:627b65069e6d | 6973 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6974 | VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, |
JerrySzczurak | 20:cf211a3b3d9e | 6975 | VL53L0X_FIXPOINT1616TOFIXPOINT313( temp_fix1616 ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 6976 | |
JerrySzczurak | 20:cf211a3b3d9e | 6977 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6978 | if ( x_talk_compensation_enable == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 6979 | VL53L0X_SETPARAMETERFIELD( dev, XTalkCompensationEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 6980 | 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6981 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 6982 | VL53L0X_SETPARAMETERFIELD( dev, XTalkCompensationEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 6983 | 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 6984 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6985 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6986 | |
JerrySzczurak | 20:cf211a3b3d9e | 6987 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 6988 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 6989 | } |
JerrySzczurak | 20:cf211a3b3d9e | 6990 | |
JerrySzczurak | 20:cf211a3b3d9e | 6991 | |
JerrySzczurak | 20:cf211a3b3d9e | 6992 | VL53L0X_Error VL53L0X::vl53l0x_perform_xtalk_calibration( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 6993 | FixPoint1616_t xtalk_cal_distance, |
JerrySzczurak | 20:cf211a3b3d9e | 6994 | FixPoint1616_t *p_xtalk_compensation_rate_mega_cps ) |
JerrySzczurak | 20:cf211a3b3d9e | 6995 | { |
JerrySzczurak | 20:cf211a3b3d9e | 6996 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 6997 | uint16_t sum_ranging = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6998 | uint16_t sum_spads = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 6999 | FixPoint1616_t sum_signal_rate = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7000 | FixPoint1616_t total_count = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7001 | uint8_t xtalk_meas = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7002 | VL53L0X_RangingMeasurementData_t ranging_measurement_data; |
JerrySzczurak | 20:cf211a3b3d9e | 7003 | FixPoint1616_t x_talk_stored_mean_signal_rate; |
JerrySzczurak | 20:cf211a3b3d9e | 7004 | FixPoint1616_t x_talk_stored_mean_range; |
JerrySzczurak | 20:cf211a3b3d9e | 7005 | FixPoint1616_t x_talk_stored_mean_rtn_spads; |
JerrySzczurak | 20:cf211a3b3d9e | 7006 | uint32_t signal_x_talk_total_per_spad; |
JerrySzczurak | 20:cf211a3b3d9e | 7007 | uint32_t x_talk_stored_mean_rtn_spads_as_int; |
JerrySzczurak | 20:cf211a3b3d9e | 7008 | uint32_t x_talk_cal_distance_as_int; |
JerrySzczurak | 20:cf211a3b3d9e | 7009 | FixPoint1616_t x_talk_compensation_rate_mega_cps; |
JerrySzczurak | 20:cf211a3b3d9e | 7010 | |
JerrySzczurak | 20:cf211a3b3d9e | 7011 | if ( xtalk_cal_distance <= 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 7012 | status = VL53L0X_ERROR_INVALID_PARAMS; |
JerrySzczurak | 20:cf211a3b3d9e | 7013 | |
JerrySzczurak | 20:cf211a3b3d9e | 7014 | /* Disable the XTalk compensation */ |
JerrySzczurak | 20:cf211a3b3d9e | 7015 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7016 | status = vl53l0x_set_x_talk_compensation_enable( dev, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7017 | |
JerrySzczurak | 20:cf211a3b3d9e | 7018 | /* Disable the RIT */ |
JerrySzczurak | 20:cf211a3b3d9e | 7019 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7020 | status = vl53l0x_set_limit_check_enable( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7021 | VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7022 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7023 | |
JerrySzczurak | 20:cf211a3b3d9e | 7024 | /* Perform 50 measurements and compute the averages */ |
JerrySzczurak | 20:cf211a3b3d9e | 7025 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7026 | sum_ranging = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7027 | sum_spads = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7028 | sum_signal_rate = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7029 | total_count = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7030 | for ( xtalk_meas = 0; xtalk_meas < 50; xtalk_meas++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7031 | status = vl53l0x_perform_single_ranging_measurement( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7032 | &ranging_measurement_data ); |
JerrySzczurak | 20:cf211a3b3d9e | 7033 | |
JerrySzczurak | 20:cf211a3b3d9e | 7034 | if ( status != VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7035 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 7036 | |
JerrySzczurak | 20:cf211a3b3d9e | 7037 | /* The range is valid when RangeStatus = 0 */ |
JerrySzczurak | 20:cf211a3b3d9e | 7038 | if ( ranging_measurement_data.RangeStatus == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7039 | sum_ranging = sum_ranging + |
JerrySzczurak | 20:cf211a3b3d9e | 7040 | ranging_measurement_data.RangeMilliMeter; |
JerrySzczurak | 20:cf211a3b3d9e | 7041 | sum_signal_rate = sum_signal_rate + |
JerrySzczurak | 20:cf211a3b3d9e | 7042 | ranging_measurement_data.SignalRateRtnMegaCps; |
JerrySzczurak | 20:cf211a3b3d9e | 7043 | sum_spads = sum_spads + |
JerrySzczurak | 20:cf211a3b3d9e | 7044 | ranging_measurement_data.EffectiveSpadRtnCount |
JerrySzczurak | 20:cf211a3b3d9e | 7045 | / 256; |
JerrySzczurak | 20:cf211a3b3d9e | 7046 | total_count = total_count + 1; |
JerrySzczurak | 20:cf211a3b3d9e | 7047 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7048 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7049 | |
JerrySzczurak | 20:cf211a3b3d9e | 7050 | /* no valid values found */ |
JerrySzczurak | 20:cf211a3b3d9e | 7051 | if ( total_count == 0 ) |
JerrySzczurak | 20:cf211a3b3d9e | 7052 | status = VL53L0X_ERROR_RANGE_ERROR; |
JerrySzczurak | 20:cf211a3b3d9e | 7053 | |
JerrySzczurak | 20:cf211a3b3d9e | 7054 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7055 | |
JerrySzczurak | 20:cf211a3b3d9e | 7056 | |
JerrySzczurak | 20:cf211a3b3d9e | 7057 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7058 | /* FixPoint1616_t / uint16_t = FixPoint1616_t */ |
JerrySzczurak | 20:cf211a3b3d9e | 7059 | x_talk_stored_mean_signal_rate = sum_signal_rate / total_count; |
JerrySzczurak | 20:cf211a3b3d9e | 7060 | x_talk_stored_mean_range = ( FixPoint1616_t )( ( uint32_t )( |
JerrySzczurak | 20:cf211a3b3d9e | 7061 | sum_ranging << 16 ) / total_count ); |
JerrySzczurak | 20:cf211a3b3d9e | 7062 | x_talk_stored_mean_rtn_spads = ( FixPoint1616_t )( ( uint32_t )( |
JerrySzczurak | 20:cf211a3b3d9e | 7063 | sum_spads << 16 ) / total_count ); |
JerrySzczurak | 20:cf211a3b3d9e | 7064 | |
JerrySzczurak | 20:cf211a3b3d9e | 7065 | /* Round Mean Spads to Whole Number. |
JerrySzczurak | 20:cf211a3b3d9e | 7066 | * Typically the calculated mean SPAD count is a whole number |
JerrySzczurak | 20:cf211a3b3d9e | 7067 | * or very close to a whole |
JerrySzczurak | 20:cf211a3b3d9e | 7068 | * number, therefore any truncation will not result in a |
JerrySzczurak | 20:cf211a3b3d9e | 7069 | * significant loss in accuracy. |
JerrySzczurak | 20:cf211a3b3d9e | 7070 | * Also, for a grey target at a typical distance of around |
JerrySzczurak | 20:cf211a3b3d9e | 7071 | * 400mm, around 220 SPADs will |
JerrySzczurak | 20:cf211a3b3d9e | 7072 | * be enabled, therefore, any truncation will result in a loss |
JerrySzczurak | 20:cf211a3b3d9e | 7073 | * of accuracy of less than |
JerrySzczurak | 20:cf211a3b3d9e | 7074 | * 0.5%. |
JerrySzczurak | 20:cf211a3b3d9e | 7075 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 7076 | x_talk_stored_mean_rtn_spads_as_int = ( x_talk_stored_mean_rtn_spads + |
JerrySzczurak | 20:cf211a3b3d9e | 7077 | 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 7078 | |
JerrySzczurak | 20:cf211a3b3d9e | 7079 | /* Round Cal Distance to Whole Number. |
JerrySzczurak | 20:cf211a3b3d9e | 7080 | * Note that the cal distance is in mm, therefore no resolution |
JerrySzczurak | 20:cf211a3b3d9e | 7081 | * is lost.*/ |
JerrySzczurak | 20:cf211a3b3d9e | 7082 | x_talk_cal_distance_as_int = ( xtalk_cal_distance + 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 7083 | |
JerrySzczurak | 20:cf211a3b3d9e | 7084 | if ( x_talk_stored_mean_rtn_spads_as_int == 0 || |
JerrySzczurak | 20:cf211a3b3d9e | 7085 | x_talk_cal_distance_as_int == 0 || |
JerrySzczurak | 20:cf211a3b3d9e | 7086 | x_talk_stored_mean_range >= xtalk_cal_distance ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7087 | x_talk_compensation_rate_mega_cps = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7088 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 7089 | /* Round Cal Distance to Whole Number. |
JerrySzczurak | 20:cf211a3b3d9e | 7090 | Note that the cal distance is in mm, therefore no |
JerrySzczurak | 20:cf211a3b3d9e | 7091 | resolution is lost.*/ |
JerrySzczurak | 20:cf211a3b3d9e | 7092 | x_talk_cal_distance_as_int = ( xtalk_cal_distance + |
JerrySzczurak | 20:cf211a3b3d9e | 7093 | 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 7094 | |
JerrySzczurak | 20:cf211a3b3d9e | 7095 | /* Apply division by mean spad count early in the |
JerrySzczurak | 20:cf211a3b3d9e | 7096 | * calculation to keep the numbers small. |
JerrySzczurak | 20:cf211a3b3d9e | 7097 | * This ensures we can maintain a 32bit calculation. |
JerrySzczurak | 20:cf211a3b3d9e | 7098 | * Fixed1616 / int := Fixed1616 */ |
JerrySzczurak | 20:cf211a3b3d9e | 7099 | signal_x_talk_total_per_spad = ( x_talk_stored_mean_signal_rate ) / |
JerrySzczurak | 20:cf211a3b3d9e | 7100 | x_talk_stored_mean_rtn_spads_as_int; |
JerrySzczurak | 20:cf211a3b3d9e | 7101 | |
JerrySzczurak | 20:cf211a3b3d9e | 7102 | /* Complete the calculation for total Signal XTalk per |
JerrySzczurak | 20:cf211a3b3d9e | 7103 | * SPAD |
JerrySzczurak | 20:cf211a3b3d9e | 7104 | * Fixed1616 * (Fixed1616 - Fixed1616/int) := |
JerrySzczurak | 20:cf211a3b3d9e | 7105 | * (2^16 * Fixed1616) |
JerrySzczurak | 20:cf211a3b3d9e | 7106 | */ |
JerrySzczurak | 20:cf211a3b3d9e | 7107 | signal_x_talk_total_per_spad *= ( ( 1 << 16 ) - |
JerrySzczurak | 20:cf211a3b3d9e | 7108 | ( x_talk_stored_mean_range / x_talk_cal_distance_as_int ) ); |
JerrySzczurak | 20:cf211a3b3d9e | 7109 | |
JerrySzczurak | 20:cf211a3b3d9e | 7110 | /* Round from 2^16 * Fixed1616, to Fixed1616. */ |
JerrySzczurak | 20:cf211a3b3d9e | 7111 | x_talk_compensation_rate_mega_cps = ( signal_x_talk_total_per_spad |
JerrySzczurak | 20:cf211a3b3d9e | 7112 | + 0x8000 ) >> 16; |
JerrySzczurak | 20:cf211a3b3d9e | 7113 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7114 | |
JerrySzczurak | 20:cf211a3b3d9e | 7115 | *p_xtalk_compensation_rate_mega_cps = x_talk_compensation_rate_mega_cps; |
JerrySzczurak | 20:cf211a3b3d9e | 7116 | |
JerrySzczurak | 20:cf211a3b3d9e | 7117 | /* Enable the XTalk compensation */ |
JerrySzczurak | 20:cf211a3b3d9e | 7118 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7119 | status = vl53l0x_set_x_talk_compensation_enable( dev, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7120 | |
JerrySzczurak | 20:cf211a3b3d9e | 7121 | /* Enable the XTalk compensation */ |
JerrySzczurak | 20:cf211a3b3d9e | 7122 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7123 | status = vl53l0x_set_x_talk_compensation_rate_mega_cps( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7124 | x_talk_compensation_rate_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 7125 | |
JerrySzczurak | 20:cf211a3b3d9e | 7126 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7127 | |
JerrySzczurak | 20:cf211a3b3d9e | 7128 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7129 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7130 | |
JerrySzczurak | 20:cf211a3b3d9e | 7131 | VL53L0X_Error VL53L0X::vl53l0x_set_x_talk_compensation_rate_mega_cps( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7132 | FixPoint1616_t x_talk_compensation_rate_mega_cps ) |
JerrySzczurak | 20:cf211a3b3d9e | 7133 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7134 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7135 | uint8_t temp8; |
JerrySzczurak | 20:cf211a3b3d9e | 7136 | uint16_t linearity_corrective_gain; |
JerrySzczurak | 20:cf211a3b3d9e | 7137 | uint16_t data; |
JerrySzczurak | 20:cf211a3b3d9e | 7138 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7139 | |
JerrySzczurak | 20:cf211a3b3d9e | 7140 | VL53L0X_GETPARAMETERFIELD( dev, XTalkCompensationEnable, temp8 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7141 | linearity_corrective_gain = PALDevDataGet( dev, LinearityCorrectiveGain ); |
JerrySzczurak | 20:cf211a3b3d9e | 7142 | |
JerrySzczurak | 20:cf211a3b3d9e | 7143 | if ( temp8 == 0 ) { /* disabled write only internal value */ |
JerrySzczurak | 20:cf211a3b3d9e | 7144 | VL53L0X_SETPARAMETERFIELD( dev, XTalkCompensationRateMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 7145 | x_talk_compensation_rate_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 7146 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 7147 | /* the following register has a format 3.13 */ |
JerrySzczurak | 20:cf211a3b3d9e | 7148 | if ( linearity_corrective_gain == 1000 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7149 | data = VL53L0X_FIXPOINT1616TOFIXPOINT313( |
JerrySzczurak | 20:cf211a3b3d9e | 7150 | x_talk_compensation_rate_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 7151 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 7152 | data = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7153 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7154 | |
JerrySzczurak | 21:627b65069e6d | 7155 | status = vl53l0x_write_word( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7156 | VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 7157 | |
JerrySzczurak | 20:cf211a3b3d9e | 7158 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7159 | VL53L0X_SETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7160 | XTalkCompensationRateMegaCps, |
JerrySzczurak | 20:cf211a3b3d9e | 7161 | x_talk_compensation_rate_mega_cps ); |
JerrySzczurak | 20:cf211a3b3d9e | 7162 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7163 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7164 | |
JerrySzczurak | 20:cf211a3b3d9e | 7165 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7166 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7167 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7168 | |
JerrySzczurak | 20:cf211a3b3d9e | 7169 | VL53L0X_Error VL53L0X::vl53l0x_perform_xtalk_measurement( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7170 | uint32_t timeout_ms, FixPoint1616_t *p_xtalk_per_spad, |
JerrySzczurak | 20:cf211a3b3d9e | 7171 | uint8_t *p_ambient_too_high ) |
JerrySzczurak | 20:cf211a3b3d9e | 7172 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7173 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 7174 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7175 | |
JerrySzczurak | 20:cf211a3b3d9e | 7176 | /* not implemented on VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 7177 | |
JerrySzczurak | 20:cf211a3b3d9e | 7178 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7179 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7180 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7181 | |
JerrySzczurak | 20:cf211a3b3d9e | 7182 | VL53L0X_Error VL53L0X::vl53l0x_reset_device( VL53L0X_DEV dev ) |
JerrySzczurak | 20:cf211a3b3d9e | 7183 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7184 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7185 | uint8_t byte; |
JerrySzczurak | 20:cf211a3b3d9e | 7186 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7187 | |
JerrySzczurak | 20:cf211a3b3d9e | 7188 | /* Set reset bit */ |
JerrySzczurak | 21:627b65069e6d | 7189 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, |
JerrySzczurak | 20:cf211a3b3d9e | 7190 | 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7191 | |
JerrySzczurak | 20:cf211a3b3d9e | 7192 | /* Wait for some time */ |
JerrySzczurak | 20:cf211a3b3d9e | 7193 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7194 | do { |
JerrySzczurak | 21:627b65069e6d | 7195 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7196 | VL53L0X_REG_IDENTIFICATION_MODEL_ID, &byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 7197 | } while ( byte != 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7198 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7199 | |
JerrySzczurak | 21:627b65069e6d | 7200 | vl53l0x_polling_delay( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 7201 | |
JerrySzczurak | 20:cf211a3b3d9e | 7202 | /* Release reset */ |
JerrySzczurak | 21:627b65069e6d | 7203 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, |
JerrySzczurak | 20:cf211a3b3d9e | 7204 | 0x01 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7205 | |
JerrySzczurak | 20:cf211a3b3d9e | 7206 | /* Wait until correct boot-up of the device */ |
JerrySzczurak | 20:cf211a3b3d9e | 7207 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7208 | do { |
JerrySzczurak | 21:627b65069e6d | 7209 | status = vl53l0x_read_byte( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7210 | VL53L0X_REG_IDENTIFICATION_MODEL_ID, &byte ); |
JerrySzczurak | 20:cf211a3b3d9e | 7211 | } while ( byte == 0x00 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7212 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7213 | |
JerrySzczurak | 21:627b65069e6d | 7214 | vl53l0x_polling_delay( dev ); |
JerrySzczurak | 20:cf211a3b3d9e | 7215 | |
JerrySzczurak | 20:cf211a3b3d9e | 7216 | /* Set PAL State to VL53L0X_STATE_POWERDOWN */ |
JerrySzczurak | 20:cf211a3b3d9e | 7217 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7218 | PALDevDataSet( dev, PalState, VL53L0X_STATE_POWERDOWN ); |
JerrySzczurak | 20:cf211a3b3d9e | 7219 | |
JerrySzczurak | 20:cf211a3b3d9e | 7220 | |
JerrySzczurak | 20:cf211a3b3d9e | 7221 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7222 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7223 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7224 | |
JerrySzczurak | 20:cf211a3b3d9e | 7225 | VL53L0X_Error VL53L0X::VL53L0X_reverse_bytes( uint8_t *data, uint32_t size ) |
JerrySzczurak | 20:cf211a3b3d9e | 7226 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7227 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7228 | uint8_t temp_data; |
JerrySzczurak | 20:cf211a3b3d9e | 7229 | uint32_t mirror_index; |
JerrySzczurak | 20:cf211a3b3d9e | 7230 | uint32_t middle = size / 2; |
JerrySzczurak | 20:cf211a3b3d9e | 7231 | uint32_t index; |
JerrySzczurak | 20:cf211a3b3d9e | 7232 | |
JerrySzczurak | 20:cf211a3b3d9e | 7233 | for ( index = 0; index < middle; index++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7234 | mirror_index = size - index - 1; |
JerrySzczurak | 20:cf211a3b3d9e | 7235 | temp_data = data[index]; |
JerrySzczurak | 20:cf211a3b3d9e | 7236 | data[index] = data[mirror_index]; |
JerrySzczurak | 20:cf211a3b3d9e | 7237 | data[mirror_index] = temp_data; |
JerrySzczurak | 20:cf211a3b3d9e | 7238 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7239 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7240 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7241 | |
JerrySzczurak | 20:cf211a3b3d9e | 7242 | VL53L0X_Error VL53L0X::vl53l0x_set_ref_calibration( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7243 | uint8_t vhv_settings, uint8_t phase_cal ) |
JerrySzczurak | 20:cf211a3b3d9e | 7244 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7245 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7246 | uint8_t p_vhv_settings; |
JerrySzczurak | 20:cf211a3b3d9e | 7247 | uint8_t p_phase_cal; |
JerrySzczurak | 20:cf211a3b3d9e | 7248 | |
JerrySzczurak | 20:cf211a3b3d9e | 7249 | status = vl53l0x_ref_calibration_io( dev, 0, |
JerrySzczurak | 20:cf211a3b3d9e | 7250 | vhv_settings, phase_cal, |
JerrySzczurak | 20:cf211a3b3d9e | 7251 | &p_vhv_settings, &p_phase_cal, |
JerrySzczurak | 20:cf211a3b3d9e | 7252 | 1, 1 ); |
JerrySzczurak | 20:cf211a3b3d9e | 7253 | |
JerrySzczurak | 20:cf211a3b3d9e | 7254 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7255 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7256 | |
JerrySzczurak | 20:cf211a3b3d9e | 7257 | VL53L0X_Error VL53L0X::VL53L0X_SetDeviceParameters( VL53L0X_DEV Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7258 | const VL53L0X_DeviceParameters_t *pDeviceParameters ) |
JerrySzczurak | 20:cf211a3b3d9e | 7259 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7260 | VL53L0X_Error Status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7261 | int i; |
JerrySzczurak | 20:cf211a3b3d9e | 7262 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7263 | Status = vl53l0x_set_device_mode( Dev, pDeviceParameters->DeviceMode ); |
JerrySzczurak | 20:cf211a3b3d9e | 7264 | |
JerrySzczurak | 20:cf211a3b3d9e | 7265 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7266 | Status = vl53l0x_set_inter_measurement_period_milli_seconds( Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7267 | pDeviceParameters->InterMeasurementPeriodMilliSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 7268 | |
JerrySzczurak | 20:cf211a3b3d9e | 7269 | |
JerrySzczurak | 20:cf211a3b3d9e | 7270 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7271 | Status = vl53l0x_set_x_talk_compensation_rate_mega_cps( Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7272 | pDeviceParameters->XTalkCompensationRateMegaCps ); |
JerrySzczurak | 20:cf211a3b3d9e | 7273 | |
JerrySzczurak | 20:cf211a3b3d9e | 7274 | |
JerrySzczurak | 20:cf211a3b3d9e | 7275 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7276 | Status = vl53l0x_set_offset_calibration_data_micro_meter( Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7277 | pDeviceParameters->RangeOffsetMicroMeters ); |
JerrySzczurak | 20:cf211a3b3d9e | 7278 | |
JerrySzczurak | 20:cf211a3b3d9e | 7279 | |
JerrySzczurak | 20:cf211a3b3d9e | 7280 | for ( i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++ ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7281 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7282 | Status |= vl53l0x_set_limit_check_enable( Dev, i, |
JerrySzczurak | 20:cf211a3b3d9e | 7283 | pDeviceParameters->LimitChecksEnable[i] ); |
JerrySzczurak | 20:cf211a3b3d9e | 7284 | else |
JerrySzczurak | 20:cf211a3b3d9e | 7285 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 7286 | |
JerrySzczurak | 20:cf211a3b3d9e | 7287 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7288 | Status |= vl53l0x_set_limit_check_value( Dev, i, |
JerrySzczurak | 20:cf211a3b3d9e | 7289 | pDeviceParameters->LimitChecksValue[i] ); |
JerrySzczurak | 20:cf211a3b3d9e | 7290 | else |
JerrySzczurak | 20:cf211a3b3d9e | 7291 | break; |
JerrySzczurak | 20:cf211a3b3d9e | 7292 | |
JerrySzczurak | 20:cf211a3b3d9e | 7293 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7294 | |
JerrySzczurak | 20:cf211a3b3d9e | 7295 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7296 | Status = vl53l0x_set_wrap_around_check_enable( Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7297 | pDeviceParameters->WrapAroundCheckEnable ); |
JerrySzczurak | 20:cf211a3b3d9e | 7298 | |
JerrySzczurak | 20:cf211a3b3d9e | 7299 | if ( Status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7300 | Status = vl53l0x_set_measurement_timing_budget_micro_seconds( Dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7301 | pDeviceParameters->MeasurementTimingBudgetMicroSeconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 7302 | |
JerrySzczurak | 20:cf211a3b3d9e | 7303 | |
JerrySzczurak | 20:cf211a3b3d9e | 7304 | LOG_FUNCTION_END( Status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7305 | return Status; |
JerrySzczurak | 20:cf211a3b3d9e | 7306 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7307 | |
JerrySzczurak | 20:cf211a3b3d9e | 7308 | VL53L0X_Error VL53L0X::vl53l0x_set_inter_measurement_period_milli_seconds( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7309 | uint32_t inter_measurement_period_milli_seconds ) |
JerrySzczurak | 20:cf211a3b3d9e | 7310 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7311 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7312 | uint16_t osc_calibrate_val; |
JerrySzczurak | 20:cf211a3b3d9e | 7313 | uint32_t im_period_milli_seconds; |
JerrySzczurak | 20:cf211a3b3d9e | 7314 | |
JerrySzczurak | 20:cf211a3b3d9e | 7315 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7316 | |
JerrySzczurak | 21:627b65069e6d | 7317 | status = vl53l0x_read_word( dev, VL53L0X_REG_OSC_CALIBRATE_VAL, |
JerrySzczurak | 20:cf211a3b3d9e | 7318 | &osc_calibrate_val ); |
JerrySzczurak | 20:cf211a3b3d9e | 7319 | |
JerrySzczurak | 20:cf211a3b3d9e | 7320 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7321 | if ( osc_calibrate_val != 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7322 | im_period_milli_seconds = |
JerrySzczurak | 20:cf211a3b3d9e | 7323 | inter_measurement_period_milli_seconds |
JerrySzczurak | 20:cf211a3b3d9e | 7324 | * osc_calibrate_val; |
JerrySzczurak | 20:cf211a3b3d9e | 7325 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 7326 | im_period_milli_seconds = |
JerrySzczurak | 20:cf211a3b3d9e | 7327 | inter_measurement_period_milli_seconds; |
JerrySzczurak | 20:cf211a3b3d9e | 7328 | } |
JerrySzczurak | 21:627b65069e6d | 7329 | status = vl53l0x_write_dword( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7330 | VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, |
JerrySzczurak | 20:cf211a3b3d9e | 7331 | im_period_milli_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 7332 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7333 | |
JerrySzczurak | 20:cf211a3b3d9e | 7334 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7335 | VL53L0X_SETPARAMETERFIELD( dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7336 | InterMeasurementPeriodMilliSeconds, |
JerrySzczurak | 20:cf211a3b3d9e | 7337 | inter_measurement_period_milli_seconds ); |
JerrySzczurak | 20:cf211a3b3d9e | 7338 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7339 | |
JerrySzczurak | 20:cf211a3b3d9e | 7340 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7341 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7342 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7343 | |
JerrySzczurak | 20:cf211a3b3d9e | 7344 | VL53L0X_Error VL53L0X::vl53l0x_set_wrap_around_check_enable( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7345 | uint8_t wrap_around_check_enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 7346 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7347 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7348 | uint8_t data; |
JerrySzczurak | 20:cf211a3b3d9e | 7349 | uint8_t wrap_around_check_enable_int; |
JerrySzczurak | 20:cf211a3b3d9e | 7350 | |
JerrySzczurak | 20:cf211a3b3d9e | 7351 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7352 | |
JerrySzczurak | 21:627b65069e6d | 7353 | status = vl53l0x_read_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data ); |
JerrySzczurak | 20:cf211a3b3d9e | 7354 | if ( wrap_around_check_enable == 0 ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7355 | /* Disable wraparound */ |
JerrySzczurak | 20:cf211a3b3d9e | 7356 | data = data & 0x7F; |
JerrySzczurak | 20:cf211a3b3d9e | 7357 | wrap_around_check_enable_int = 0; |
JerrySzczurak | 20:cf211a3b3d9e | 7358 | } else { |
JerrySzczurak | 20:cf211a3b3d9e | 7359 | /*Enable wraparound */ |
JerrySzczurak | 20:cf211a3b3d9e | 7360 | data = data | 0x80; |
JerrySzczurak | 20:cf211a3b3d9e | 7361 | wrap_around_check_enable_int = 1; |
JerrySzczurak | 20:cf211a3b3d9e | 7362 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7363 | |
JerrySzczurak | 21:627b65069e6d | 7364 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 7365 | |
JerrySzczurak | 20:cf211a3b3d9e | 7366 | if ( status == VL53L0X_ERROR_NONE ) { |
JerrySzczurak | 20:cf211a3b3d9e | 7367 | PALDevDataSet( dev, SequenceConfig, data ); |
JerrySzczurak | 20:cf211a3b3d9e | 7368 | VL53L0X_SETPARAMETERFIELD( dev, WrapAroundCheckEnable, |
JerrySzczurak | 20:cf211a3b3d9e | 7369 | wrap_around_check_enable_int ); |
JerrySzczurak | 20:cf211a3b3d9e | 7370 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7371 | |
JerrySzczurak | 20:cf211a3b3d9e | 7372 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7373 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7374 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7375 | |
JerrySzczurak | 20:cf211a3b3d9e | 7376 | VL53L0X_Error VL53L0X::vl53l0x_set_group_param_hold( VL53L0X_DEV dev, uint8_t group_param_hold ) |
JerrySzczurak | 20:cf211a3b3d9e | 7377 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7378 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 7379 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7380 | |
JerrySzczurak | 20:cf211a3b3d9e | 7381 | /* not implemented on VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 7382 | |
JerrySzczurak | 20:cf211a3b3d9e | 7383 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7384 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7385 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7386 | |
JerrySzczurak | 20:cf211a3b3d9e | 7387 | VL53L0X_Error VL53L0X::vl53l0x_set_range_fraction_enable( VL53L0X_DEV dev, uint8_t enable ) |
JerrySzczurak | 20:cf211a3b3d9e | 7388 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7389 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7390 | |
JerrySzczurak | 20:cf211a3b3d9e | 7391 | LOG_FUNCTION_START( "%d", ( int )Enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 7392 | |
JerrySzczurak | 21:627b65069e6d | 7393 | status = vl53l0x_write_byte( dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 7394 | |
JerrySzczurak | 20:cf211a3b3d9e | 7395 | if ( status == VL53L0X_ERROR_NONE ) |
JerrySzczurak | 20:cf211a3b3d9e | 7396 | PALDevDataSet( dev, RangeFractionalEnable, enable ); |
JerrySzczurak | 20:cf211a3b3d9e | 7397 | |
JerrySzczurak | 20:cf211a3b3d9e | 7398 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7399 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7400 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7401 | |
JerrySzczurak | 20:cf211a3b3d9e | 7402 | VL53L0X_Error VL53L0X::vl53l0x_set_reference_spads( VL53L0X_DEV dev, uint32_t count, |
JerrySzczurak | 20:cf211a3b3d9e | 7403 | uint8_t is_aperture_spads ) |
JerrySzczurak | 20:cf211a3b3d9e | 7404 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7405 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7406 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7407 | |
JerrySzczurak | 20:cf211a3b3d9e | 7408 | status = wrapped_vl53l0x_set_reference_spads( dev, count, is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 7409 | |
JerrySzczurak | 20:cf211a3b3d9e | 7410 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7411 | |
JerrySzczurak | 20:cf211a3b3d9e | 7412 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7413 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7414 | |
JerrySzczurak | 20:cf211a3b3d9e | 7415 | VL53L0X_Error VL53L0X::vl53l0x_get_reference_spads( VL53L0X_DEV dev, uint32_t *p_spad_count, |
JerrySzczurak | 20:cf211a3b3d9e | 7416 | uint8_t *p_is_aperture_spads ) |
JerrySzczurak | 20:cf211a3b3d9e | 7417 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7418 | VL53L0X_Error status = VL53L0X_ERROR_NONE; |
JerrySzczurak | 20:cf211a3b3d9e | 7419 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7420 | |
JerrySzczurak | 20:cf211a3b3d9e | 7421 | status = wrapped_vl53l0x_get_reference_spads( dev, p_spad_count, p_is_aperture_spads ); |
JerrySzczurak | 20:cf211a3b3d9e | 7422 | |
JerrySzczurak | 20:cf211a3b3d9e | 7423 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7424 | |
JerrySzczurak | 20:cf211a3b3d9e | 7425 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7426 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7427 | |
JerrySzczurak | 20:cf211a3b3d9e | 7428 | VL53L0X_Error VL53L0X::wrapped_vl53l0x_wait_device_booted( VL53L0X_DEV dev ) |
JerrySzczurak | 20:cf211a3b3d9e | 7429 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7430 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 7431 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7432 | |
JerrySzczurak | 20:cf211a3b3d9e | 7433 | /* not implemented on VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 7434 | |
JerrySzczurak | 20:cf211a3b3d9e | 7435 | LOG_FUNCTION_END( status ); |
JerrySzczurak | 20:cf211a3b3d9e | 7436 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7437 | } |
JerrySzczurak | 20:cf211a3b3d9e | 7438 | |
JerrySzczurak | 20:cf211a3b3d9e | 7439 | VL53L0X_Error VL53L0X::vl53l0x_wait_device_ready_for_new_measurement( VL53L0X_DEV dev, |
JerrySzczurak | 20:cf211a3b3d9e | 7440 | uint32_t max_loop ) |
JerrySzczurak | 20:cf211a3b3d9e | 7441 | { |
JerrySzczurak | 20:cf211a3b3d9e | 7442 | VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED; |
JerrySzczurak | 20:cf211a3b3d9e | 7443 | LOG_FUNCTION_START( "" ); |
JerrySzczurak | 20:cf211a3b3d9e | 7444 | |
JerrySzczurak | 20:cf211a3b3d9e | 7445 | /* not implemented for VL53L0X */ |
JerrySzczurak | 20:cf211a3b3d9e | 7446 | |
JerrySzczurak | 20:cf211a3b3d9e | 7447 | LOG_FUNCTION_END( satus ); |
JerrySzczurak | 20:cf211a3b3d9e | 7448 | return status; |
JerrySzczurak | 20:cf211a3b3d9e | 7449 | } |
johnAlexander | 0:c523920bcc09 | 7450 | /******************************************************************************/ |
johnAlexander | 0:c523920bcc09 | 7451 |