Kenji Arai / VL53L0X_simple

Dependents:   Check_VL53L0X_simple_with_three_ToF Check_VL53L0X_simple_ToF_Sensor Check_VL53L0X_simple_with_three_ToF Check_VL53L0X_simple_ToF_Sensor ... more

Fork of VL53L0X by ST

Committer:
kenjiArai
Date:
Tue Feb 06 10:35:18 2018 +0000
Revision:
8:ac14de4512e8
Parent:
7:174594acca0d
Child:
9:b9907dc1e9f9
modified for multi VL53L0X control

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:a1a69d32f310 1 /*******************************************************************************
nikapov 0:a1a69d32f310 2 Copyright © 2016, STMicroelectronics International N.V.
nikapov 0:a1a69d32f310 3 All rights reserved.
nikapov 0:a1a69d32f310 4
nikapov 0:a1a69d32f310 5 Redistribution and use in source and binary forms, with or without
nikapov 0:a1a69d32f310 6 modification, are permitted provided that the following conditions are met:
nikapov 0:a1a69d32f310 7 * Redistributions of source code must retain the above copyright
nikapov 0:a1a69d32f310 8 notice, this list of conditions and the following disclaimer.
nikapov 0:a1a69d32f310 9 * Redistributions in binary form must reproduce the above copyright
nikapov 0:a1a69d32f310 10 notice, this list of conditions and the following disclaimer in the
nikapov 0:a1a69d32f310 11 documentation and/or other materials provided with the distribution.
nikapov 0:a1a69d32f310 12 * Neither the name of STMicroelectronics nor the
nikapov 0:a1a69d32f310 13 names of its contributors may be used to endorse or promote products
nikapov 0:a1a69d32f310 14 derived from this software without specific prior written permission.
nikapov 0:a1a69d32f310 15
nikapov 0:a1a69d32f310 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
nikapov 0:a1a69d32f310 17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
nikapov 0:a1a69d32f310 18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
nikapov 0:a1a69d32f310 19 NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
nikapov 0:a1a69d32f310 20 IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
nikapov 0:a1a69d32f310 21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
nikapov 0:a1a69d32f310 22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
nikapov 0:a1a69d32f310 23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
nikapov 0:a1a69d32f310 24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
nikapov 0:a1a69d32f310 25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
nikapov 0:a1a69d32f310 26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nikapov 0:a1a69d32f310 27 *****************************************************************************/
nikapov 0:a1a69d32f310 28
nikapov 0:a1a69d32f310 29 #ifndef __VL53L0X_CLASS_H
nikapov 0:a1a69d32f310 30 #define __VL53L0X_CLASS_H
nikapov 0:a1a69d32f310 31
kenjiArai 7:174594acca0d 32 //------- Feburary 6th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 5:ac6604b75d50 33 //ORIGINAL=1 does NOT mean anything but just keep original source code as it is!
kenjiArai 5:ac6604b75d50 34 //You can NOT compile with ORIGINAL=1 !!
kenjiArai 5:ac6604b75d50 35 #define ORIGINAL 0 // Just keep = 0
kenjiArai 5:ac6604b75d50 36 #define USE_I2C_2V8
kenjiArai 5:ac6604b75d50 37 //------------------------------------------------------------------------------
nikapov 0:a1a69d32f310 38
kenjiArai 5:ac6604b75d50 39 #if ORIGINAL
nikapov 0:a1a69d32f310 40 #ifdef _MSC_VER
nikapov 0:a1a69d32f310 41 # ifdef VL53L0X_API_EXPORTS
nikapov 0:a1a69d32f310 42 # define VL53L0X_API __declspec(dllexport)
nikapov 0:a1a69d32f310 43 # else
nikapov 0:a1a69d32f310 44 # define VL53L0X_API
nikapov 0:a1a69d32f310 45 # endif
nikapov 0:a1a69d32f310 46 #else
nikapov 0:a1a69d32f310 47 # define VL53L0X_API
nikapov 0:a1a69d32f310 48 #endif
kenjiArai 5:ac6604b75d50 49 #endif
nikapov 0:a1a69d32f310 50
nikapov 0:a1a69d32f310 51 /* Includes ------------------------------------------------------------------*/
nikapov 0:a1a69d32f310 52 #include "mbed.h"
kenjiArai 5:ac6604b75d50 53 #if ORIGINAL
nikapov 0:a1a69d32f310 54 #include "RangeSensor.h"
nikapov 0:a1a69d32f310 55 #include "DevI2C.h"
nikapov 0:a1a69d32f310 56 #include "PinNames.h"
kenjiArai 5:ac6604b75d50 57 #endif
nikapov 0:a1a69d32f310 58 #include "VL53L0X_def.h"
nikapov 0:a1a69d32f310 59 #include "VL53L0X_platform.h"
kenjiArai 5:ac6604b75d50 60 #if ORIGINAL
nikapov 0:a1a69d32f310 61 #include "Stmpe1600.h"
kenjiArai 5:ac6604b75d50 62 #endif
nikapov 0:a1a69d32f310 63
kenjiArai 5:ac6604b75d50 64 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 65 //------- Feburary 4th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 5:ac6604b75d50 66 // moved to following header file
kenjiArai 5:ac6604b75d50 67 #include "VL53L0X_1st.h"
kenjiArai 5:ac6604b75d50 68 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 69 #endif
nikapov 0:a1a69d32f310 70
nikapov 0:a1a69d32f310 71 /* sensor operating modes */
nikapov 0:a1a69d32f310 72 typedef enum {
nikapov 0:a1a69d32f310 73 range_single_shot_polling = 1,
nikapov 0:a1a69d32f310 74 range_continuous_polling,
nikapov 0:a1a69d32f310 75 range_continuous_interrupt,
nikapov 0:a1a69d32f310 76 range_continuous_polling_low_threshold,
nikapov 0:a1a69d32f310 77 range_continuous_polling_high_threshold,
nikapov 0:a1a69d32f310 78 range_continuous_polling_out_of_window,
nikapov 0:a1a69d32f310 79 range_continuous_interrupt_low_threshold,
nikapov 0:a1a69d32f310 80 range_continuous_interrupt_high_threshold,
nikapov 0:a1a69d32f310 81 range_continuous_interrupt_out_of_window,
nikapov 0:a1a69d32f310 82 } OperatingMode;
nikapov 0:a1a69d32f310 83
kenjiArai 5:ac6604b75d50 84 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 85 /* sensor range profiles */
kenjiArai 5:ac6604b75d50 86 typedef enum {
kenjiArai 5:ac6604b75d50 87 range_long_distance_33ms_200cm = 1,
kenjiArai 5:ac6604b75d50 88 range_hi_accurate_200ms_120cm,
kenjiArai 5:ac6604b75d50 89 range_hi_speed_20ms_120cm,
kenjiArai 5:ac6604b75d50 90 } RangeProfile;
kenjiArai 5:ac6604b75d50 91 #endif
kenjiArai 5:ac6604b75d50 92
nikapov 0:a1a69d32f310 93 /** default device address */
kenjiArai 5:ac6604b75d50 94 #if ORIGINAL
nikapov 1:834986cdde0a 95 #define VL53L0X_DEFAULT_ADDRESS 0x52 /* (8-bit) */
kenjiArai 5:ac6604b75d50 96 #else
kenjiArai 5:ac6604b75d50 97 // No other choice
kenjiArai 5:ac6604b75d50 98 #define VL53L0X_DEFAULT_ADDRESS 0x52 // 8-bit(0x53/Read & 0x52?Write) 0x29(7bit)
kenjiArai 5:ac6604b75d50 99 #endif
kenjiArai 5:ac6604b75d50 100
kenjiArai 5:ac6604b75d50 101 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 102 #if (MBED_MAJOR_VERSION == 2)
kenjiArai 5:ac6604b75d50 103 #define WAIT_MS(x) wait_ms(x)
kenjiArai 5:ac6604b75d50 104 #define VL53L0X_OsDelay(...) wait_ms(2)
kenjiArai 5:ac6604b75d50 105 #elif (MBED_MAJOR_VERSION == 5)
kenjiArai 5:ac6604b75d50 106 #define WAIT_MS(x) Thread::wait(x)
kenjiArai 5:ac6604b75d50 107 #define VL53L0X_OsDelay(...) Thread::wait(2)
kenjiArai 5:ac6604b75d50 108 #else
kenjiArai 5:ac6604b75d50 109 #warning "I cannot control wait_ms()!!"
kenjiArai 5:ac6604b75d50 110 #endif
kenjiArai 5:ac6604b75d50 111 #endif // !ORIGINAL
kenjiArai 5:ac6604b75d50 112
kenjiArai 5:ac6604b75d50 113 #if !ORIGINAL
kenjiArai 6:083fbed585c5 114
kenjiArai 5:ac6604b75d50 115 //--------------- Simple debug -------------------------------------------------
kenjiArai 5:ac6604b75d50 116 //extern DigitalOut myled;
kenjiArai 5:ac6604b75d50 117 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 118
kenjiArai 5:ac6604b75d50 119 /** Interface for STMicronics VL53L0X
kenjiArai 5:ac6604b75d50 120 * World smallest Time-of-Flight (ToF) ranging sensor
kenjiArai 5:ac6604b75d50 121 *
kenjiArai 5:ac6604b75d50 122 * @code
kenjiArai 5:ac6604b75d50 123 * #include "mbed.h"
kenjiArai 5:ac6604b75d50 124 *
kenjiArai 5:ac6604b75d50 125 * // I2C Communication
kenjiArai 5:ac6604b75d50 126 * VL53L0X sensor(I2C_SDA, I2C_SCL, D8); // SDA, SCL & XSHUT
kenjiArai 5:ac6604b75d50 127 * // If you connected I2C line not only this device but also other devices,
kenjiArai 5:ac6604b75d50 128 * // you need to declare following method.
kenjiArai 5:ac6604b75d50 129 * I2C i2c(I2C_SDA, I2C_SCL);
kenjiArai 5:ac6604b75d50 130 * VL53L0X sensor(i2c, D8); // I2C, XSHUT
kenjiArai 5:ac6604b75d50 131 *
kenjiArai 5:ac6604b75d50 132 * int main()
kenjiArai 5:ac6604b75d50 133 * {
kenjiArai 5:ac6604b75d50 134 * int status = VL53L0X_ERROR_NONE;
kenjiArai 5:ac6604b75d50 135 * uint32_t data;
kenjiArai 5:ac6604b75d50 136 *
kenjiArai 8:ac14de4512e8 137 * status = sensor.init_sensor(0x33<<1U); //new addres(not equal others)
kenjiArai 5:ac6604b75d50 138 * status = sensor.set_mode(range_long_distance_33ms_200cm);
kenjiArai 5:ac6604b75d50 139 * //status = sensor.set_mode(range_hi_accurate_200ms_120cm);
kenjiArai 5:ac6604b75d50 140 * //status = sensor.set_mode(range_hi_speed_20ms_120cm);
kenjiArai 5:ac6604b75d50 141 * while (true) {
kenjiArai 5:ac6604b75d50 142 * status = sensor.get_distance(&data);
kenjiArai 5:ac6604b75d50 143 * if (status == VL53L0X_ERROR_NONE) {
kenjiArai 5:ac6604b75d50 144 * printf("%5d\r\n", data);
kenjiArai 5:ac6604b75d50 145 * } else {
kenjiArai 5:ac6604b75d50 146 * printf("error\r\n");
kenjiArai 5:ac6604b75d50 147 * }
kenjiArai 5:ac6604b75d50 148 * }
kenjiArai 5:ac6604b75d50 149 * }
kenjiArai 5:ac6604b75d50 150 * @endcode
kenjiArai 5:ac6604b75d50 151 */
nikapov 0:a1a69d32f310 152
kenjiArai 6:083fbed585c5 153
nikapov 0:a1a69d32f310 154 /* Classes -------------------------------------------------------------------*/
nikapov 0:a1a69d32f310 155 /** Class representing a VL53L0 sensor component
nikapov 0:a1a69d32f310 156 */
kenjiArai 5:ac6604b75d50 157 class VL53L0X
nikapov 0:a1a69d32f310 158 {
nikapov 0:a1a69d32f310 159 public:
nikapov 0:a1a69d32f310 160 /** Constructor
nikapov 0:a1a69d32f310 161 * @param[in] &i2c device I2C to be used for communication
kenjiArai 7:174594acca0d 162 * @param[in] pin Mbed DigitalInOut PinName to be used for XSHUT
kenjiArai 5:ac6604b75d50 163 * @param[in] &pin_gpio1 pin Mbed InterruptIn PinName
kenjiArai 5:ac6604b75d50 164 * to be used as component GPIO_1 INT
nikapov 0:a1a69d32f310 165 */
kenjiArai 5:ac6604b75d50 166 VL53L0X(I2C& i2c, PinName xshut, PinName pin_gpio1) : _i2c(i2c),
kenjiArai 5:ac6604b75d50 167 _gpio0(xshut)
nikapov 0:a1a69d32f310 168 {
nikapov 0:a1a69d32f310 169 if (pin_gpio1 != NC) {
nikapov 0:a1a69d32f310 170 _gpio1Int = new InterruptIn(pin_gpio1);
nikapov 0:a1a69d32f310 171 } else {
nikapov 0:a1a69d32f310 172 _gpio1Int = NULL;
nikapov 0:a1a69d32f310 173 }
kenjiArai 5:ac6604b75d50 174 preparation();
nikapov 0:a1a69d32f310 175 }
nikapov 0:a1a69d32f310 176
kenjiArai 5:ac6604b75d50 177 /** Constructor 2 (another simple way)
kenjiArai 5:ac6604b75d50 178 * @param[in] Pin for I2C SDA & SDL
kenjiArai 7:174594acca0d 179 * @param[in] pin Mbed DigitalInOut PinName to be used for XSHUT
nikapov 0:a1a69d32f310 180 */
kenjiArai 5:ac6604b75d50 181 VL53L0X(PinName p_sda, PinName p_scl, PinName xshut)
kenjiArai 5:ac6604b75d50 182 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p), _gpio0(xshut) {
kenjiArai 5:ac6604b75d50 183 _gpio1Int = NULL;
kenjiArai 5:ac6604b75d50 184 preparation();
kenjiArai 5:ac6604b75d50 185 }
kenjiArai 5:ac6604b75d50 186
kenjiArai 5:ac6604b75d50 187 /** Constructor 3 (another simple way)
kenjiArai 5:ac6604b75d50 188 * @param[in] &i2c device I2C to be used for communication
kenjiArai 7:174594acca0d 189 * @param[in] pin Mbed DigitalInOut PinName to be used for XSHUT
kenjiArai 5:ac6604b75d50 190 */
kenjiArai 5:ac6604b75d50 191 VL53L0X(I2C& p_i2c, PinName xshut) : _i2c(p_i2c), _gpio0(xshut) {
kenjiArai 5:ac6604b75d50 192 _gpio1Int = NULL;
kenjiArai 5:ac6604b75d50 193 preparation();
nikapov 0:a1a69d32f310 194 }
nikapov 0:a1a69d32f310 195
nikapov 0:a1a69d32f310 196 /** Destructor
nikapov 0:a1a69d32f310 197 */
nikapov 0:a1a69d32f310 198 virtual ~VL53L0X()
nikapov 0:a1a69d32f310 199 {
nikapov 0:a1a69d32f310 200 if (_gpio1Int != NULL) {
nikapov 0:a1a69d32f310 201 delete _gpio1Int;
nikapov 0:a1a69d32f310 202 }
nikapov 0:a1a69d32f310 203 }
kenjiArai 5:ac6604b75d50 204 #else
kenjiArai 5:ac6604b75d50 205 #warning "please recover original constractor form VL53L0X_header_original.txt"
kenjiArai 5:ac6604b75d50 206 #endif
nikapov 0:a1a69d32f310 207
nikapov 0:a1a69d32f310 208 /*** Interface Methods ***/
nikapov 0:a1a69d32f310 209 /*** High level API ***/
kenjiArai 5:ac6604b75d50 210 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 211 /**
kenjiArai 5:ac6604b75d50 212 * @brief initialize
kenjiArai 5:ac6604b75d50 213 * @return void
kenjiArai 5:ac6604b75d50 214 */
kenjiArai 5:ac6604b75d50 215 /* turns on the sensor */
kenjiArai 5:ac6604b75d50 216 void preparation(void)
kenjiArai 5:ac6604b75d50 217 {
kenjiArai 5:ac6604b75d50 218 _my_device.I2cDevAddr = VL53L0X_DEFAULT_ADDRESS;
kenjiArai 5:ac6604b75d50 219 _my_device.comms_type = 1; // VL53L0X_COMMS_I2C
kenjiArai 5:ac6604b75d50 220 _my_device.comms_speed_khz = 400;
kenjiArai 5:ac6604b75d50 221 _device = &_my_device;
kenjiArai 7:174594acca0d 222 _range_mode = range_long_distance_33ms_200cm;
kenjiArai 7:174594acca0d 223 VL53L0X_off();
kenjiArai 5:ac6604b75d50 224 }
kenjiArai 5:ac6604b75d50 225 #endif
kenjiArai 5:ac6604b75d50 226
nikapov 0:a1a69d32f310 227 /**
nikapov 0:a1a69d32f310 228 * @brief PowerOn the sensor
nikapov 0:a1a69d32f310 229 * @return void
nikapov 0:a1a69d32f310 230 */
nikapov 0:a1a69d32f310 231 /* turns on the sensor */
nikapov 0:a1a69d32f310 232 void VL53L0X_on(void)
nikapov 0:a1a69d32f310 233 {
kenjiArai 5:ac6604b75d50 234 #if ORIGINAL
nikapov 0:a1a69d32f310 235 if (_gpio0) {
nikapov 0:a1a69d32f310 236 *_gpio0 = 1;
nikapov 0:a1a69d32f310 237 } else {
nikapov 0:a1a69d32f310 238 if (_expgpio0) {
Davidroid 2:d07edeaff6f1 239 *_expgpio0 = 1;
Davidroid 2:d07edeaff6f1 240 }
Davidroid 2:d07edeaff6f1 241 }
nikapov 0:a1a69d32f310 242 wait_ms(10);
kenjiArai 5:ac6604b75d50 243 #else
kenjiArai 5:ac6604b75d50 244 _gpio0.output();
kenjiArai 5:ac6604b75d50 245 _gpio0 = 1;
kenjiArai 5:ac6604b75d50 246 _gpio0.input();
kenjiArai 5:ac6604b75d50 247 WAIT_MS(1);
kenjiArai 5:ac6604b75d50 248 #endif
nikapov 0:a1a69d32f310 249 }
nikapov 0:a1a69d32f310 250
nikapov 0:a1a69d32f310 251 /**
nikapov 0:a1a69d32f310 252 * @brief PowerOff the sensor
nikapov 0:a1a69d32f310 253 * @return void
nikapov 0:a1a69d32f310 254 */
nikapov 0:a1a69d32f310 255 /* turns off the sensor */
nikapov 0:a1a69d32f310 256 void VL53L0X_off(void)
nikapov 0:a1a69d32f310 257 {
kenjiArai 5:ac6604b75d50 258 #if ORIGINAL
nikapov 0:a1a69d32f310 259 if (_gpio0) {
nikapov 0:a1a69d32f310 260 *_gpio0 = 0;
nikapov 0:a1a69d32f310 261 } else {
nikapov 0:a1a69d32f310 262 if (_expgpio0) {
Davidroid 2:d07edeaff6f1 263 *_expgpio0 = 0;
Davidroid 2:d07edeaff6f1 264 }
Davidroid 2:d07edeaff6f1 265 }
nikapov 0:a1a69d32f310 266 wait_ms(10);
kenjiArai 5:ac6604b75d50 267 #else
kenjiArai 5:ac6604b75d50 268 _gpio0 = 0;
kenjiArai 5:ac6604b75d50 269 _gpio0.output();
kenjiArai 5:ac6604b75d50 270 WAIT_MS(10);
kenjiArai 5:ac6604b75d50 271 #endif
nikapov 0:a1a69d32f310 272 }
Davidroid 2:d07edeaff6f1 273
nikapov 0:a1a69d32f310 274 /**
nikapov 0:a1a69d32f310 275 * @brief Initialize the sensor with default values
kenjiArai 7:174594acca0d 276 * @param[in] new I2C address
nikapov 0:a1a69d32f310 277 * @return "0" on success
nikapov 0:a1a69d32f310 278 */
nikapov 0:a1a69d32f310 279 int init_sensor(uint8_t new_addr);
nikapov 0:a1a69d32f310 280
kenjiArai 7:174594acca0d 281 #if !ORIGINAL
nikapov 0:a1a69d32f310 282 /**
kenjiArai 5:ac6604b75d50 283 * @brief Start the measure by single shot operating mode
kenjiArai 5:ac6604b75d50 284 * @param[in] operating mode
kenjiArai 5:ac6604b75d50 285 * @return "0" on success
nikapov 0:a1a69d32f310 286 */
kenjiArai 5:ac6604b75d50 287 int set_mode(RangeProfile range_mode) {
kenjiArai 5:ac6604b75d50 288 _range_mode = range_mode;
kenjiArai 5:ac6604b75d50 289 return start_measurement(range_single_shot_polling, NULL);
nikapov 0:a1a69d32f310 290 }
nikapov 0:a1a69d32f310 291
nikapov 0:a1a69d32f310 292 /**
nikapov 0:a1a69d32f310 293 * @brief Get ranging result and only that
nikapov 0:a1a69d32f310 294 *
nikapov 0:a1a69d32f310 295 * @par Function Description
kenjiArai 5:ac6604b75d50 296 * Unlike @a VL53L0X_get_ranging_measurement_data()
kenjiArai 5:ac6604b75d50 297 * this function only retrieves the range in millimeter \n
nikapov 0:a1a69d32f310 298 * It does any required up-scale translation\n
nikapov 0:a1a69d32f310 299 * It can be called after success status polling or in interrupt mode \n
nikapov 0:a1a69d32f310 300 * @warning these function is not doing wrap around filtering \n
nikapov 0:a1a69d32f310 301 * This function doesn't perform any data ready check!
nikapov 0:a1a69d32f310 302 *
nikapov 0:a1a69d32f310 303 * @param p_data Pointer to range distance
nikapov 0:a1a69d32f310 304 * @return "0" on success
nikapov 0:a1a69d32f310 305 */
nikapov 0:a1a69d32f310 306 virtual int get_distance(uint32_t *p_data)
nikapov 0:a1a69d32f310 307 {
nikapov 0:a1a69d32f310 308 int status = 0;
nikapov 0:a1a69d32f310 309 VL53L0X_RangingMeasurementData_t p_ranging_measurement_data;
nikapov 0:a1a69d32f310 310
kenjiArai 5:ac6604b75d50 311 #if ORIGINAL
nikapov 0:a1a69d32f310 312 status = start_measurement(range_single_shot_polling, NULL);
kenjiArai 5:ac6604b75d50 313 #else
kenjiArai 5:ac6604b75d50 314 status = VL53L0X_start_measurement(_device);
kenjiArai 5:ac6604b75d50 315 #endif
nikapov 0:a1a69d32f310 316 if (!status) {
kenjiArai 5:ac6604b75d50 317 status = get_measurement(range_single_shot_polling,
kenjiArai 5:ac6604b75d50 318 &p_ranging_measurement_data);
nikapov 0:a1a69d32f310 319 }
nikapov 0:a1a69d32f310 320 if (p_ranging_measurement_data.RangeStatus == 0) {
nikapov 0:a1a69d32f310 321 // we have a valid range.
nikapov 0:a1a69d32f310 322 *p_data = p_ranging_measurement_data.RangeMilliMeter;
nikapov 0:a1a69d32f310 323 } else {
nikapov 0:a1a69d32f310 324 *p_data = 0;
nikapov 0:a1a69d32f310 325 status = VL53L0X_ERROR_RANGE_ERROR;
nikapov 0:a1a69d32f310 326 }
nikapov 0:a1a69d32f310 327 stop_measurement(range_single_shot_polling);
nikapov 0:a1a69d32f310 328 return status;
nikapov 0:a1a69d32f310 329 }
kenjiArai 5:ac6604b75d50 330 #endif
nikapov 0:a1a69d32f310 331
kenjiArai 5:ac6604b75d50 332 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 333 //------- Feburary 4th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 5:ac6604b75d50 334 // moved to following header file
kenjiArai 5:ac6604b75d50 335 #include "VL53L0X_2nd.h"
kenjiArai 5:ac6604b75d50 336 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 337 #else
kenjiArai 5:ac6604b75d50 338 #warning "please recover original functions form VL53L0X_2nd.h"
kenjiArai 5:ac6604b75d50 339 #endif
kenjiArai 5:ac6604b75d50 340
kenjiArai 5:ac6604b75d50 341 private:
nikapov 0:a1a69d32f310 342
kenjiArai 5:ac6604b75d50 343 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 344 //------- Feburary 4th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 5:ac6604b75d50 345 // moved to following header file
kenjiArai 5:ac6604b75d50 346 #include "VL53L0X_3rd.h"
kenjiArai 5:ac6604b75d50 347 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 348 #else
kenjiArai 5:ac6604b75d50 349 #warning "please recover original functions form VL53L0X_3rd.h"
kenjiArai 5:ac6604b75d50 350 #endif
kenjiArai 5:ac6604b75d50 351 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 352 static const unsigned int TEMP_BUF_SIZE = 32;
nikapov 0:a1a69d32f310 353
kenjiArai 5:ac6604b75d50 354 int i2c_write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr,
kenjiArai 5:ac6604b75d50 355 uint16_t NumByteToWrite) {
kenjiArai 5:ac6604b75d50 356 int ret;
kenjiArai 5:ac6604b75d50 357 uint8_t tmp[TEMP_BUF_SIZE];
kenjiArai 5:ac6604b75d50 358
kenjiArai 5:ac6604b75d50 359 if(NumByteToWrite >= TEMP_BUF_SIZE) return -2;
kenjiArai 5:ac6604b75d50 360 /* First, send device address. Then, send data and STOP condition */
kenjiArai 5:ac6604b75d50 361 tmp[0] = RegisterAddr;
kenjiArai 5:ac6604b75d50 362 memcpy(tmp+1, pBuffer, NumByteToWrite);
kenjiArai 5:ac6604b75d50 363 ret = _i2c.write(DeviceAddr, (const char*)tmp, NumByteToWrite+1, false);
kenjiArai 5:ac6604b75d50 364 if(ret) return -1;
kenjiArai 5:ac6604b75d50 365 return 0;
nikapov 0:a1a69d32f310 366 }
nikapov 0:a1a69d32f310 367
kenjiArai 5:ac6604b75d50 368 int i2c_read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr,
kenjiArai 5:ac6604b75d50 369 uint16_t NumByteToRead) {
kenjiArai 5:ac6604b75d50 370 int ret;
nikapov 0:a1a69d32f310 371
kenjiArai 5:ac6604b75d50 372 //--debug--
kenjiArai 5:ac6604b75d50 373 //myled = 1;
kenjiArai 5:ac6604b75d50 374 /* Send device address, with no STOP condition */
kenjiArai 5:ac6604b75d50 375 ret = _i2c.write(DeviceAddr, (const char*)&RegisterAddr, 1, true);
kenjiArai 5:ac6604b75d50 376 //--debug--
kenjiArai 5:ac6604b75d50 377 //myled = 0;
kenjiArai 5:ac6604b75d50 378 if(!ret) {
kenjiArai 5:ac6604b75d50 379 /* Read data, with STOP condition */
kenjiArai 5:ac6604b75d50 380 ret = _i2c.read(DeviceAddr, (char*)pBuffer, NumByteToRead, false);
nikapov 0:a1a69d32f310 381 }
kenjiArai 5:ac6604b75d50 382 if(ret) return -1;
kenjiArai 5:ac6604b75d50 383 return 0;
nikapov 0:a1a69d32f310 384 }
kenjiArai 5:ac6604b75d50 385 #endif
nikapov 0:a1a69d32f310 386
nikapov 0:a1a69d32f310 387 VL53L0X_DeviceInfo_t _device_info;
nikapov 0:a1a69d32f310 388
kenjiArai 5:ac6604b75d50 389 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 390 RangeProfile _range_mode;
kenjiArai 5:ac6604b75d50 391 #endif
kenjiArai 5:ac6604b75d50 392
kenjiArai 5:ac6604b75d50 393 #if ORIGINAL
nikapov 0:a1a69d32f310 394 /* IO Device */
nikapov 0:a1a69d32f310 395 DevI2C *_dev_i2c;
nikapov 0:a1a69d32f310 396 /* Digital out pin */
nikapov 0:a1a69d32f310 397 DigitalOut *_gpio0;
nikapov 0:a1a69d32f310 398 /* GPIO expander */
nikapov 0:a1a69d32f310 399 Stmpe1600DigiOut *_expgpio0;
kenjiArai 5:ac6604b75d50 400 #else
kenjiArai 5:ac6604b75d50 401 /* IO Device */
kenjiArai 5:ac6604b75d50 402 I2C *_i2c_p;
kenjiArai 5:ac6604b75d50 403 I2C &_i2c;
kenjiArai 5:ac6604b75d50 404 /* Digital in and out pin */
kenjiArai 5:ac6604b75d50 405 DigitalInOut _gpio0;
kenjiArai 5:ac6604b75d50 406 #endif
nikapov 0:a1a69d32f310 407 /* Measure detection IRQ */
nikapov 0:a1a69d32f310 408 InterruptIn *_gpio1Int;
nikapov 0:a1a69d32f310 409 /* Device data */
nikapov 0:a1a69d32f310 410 VL53L0X_Dev_t _my_device;
nikapov 0:a1a69d32f310 411 VL53L0X_DEV _device;
nikapov 0:a1a69d32f310 412 };
nikapov 0:a1a69d32f310 413
nikapov 0:a1a69d32f310 414 #endif /* _VL53L0X_CLASS_H_ */