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:
Sun Feb 04 02:27:01 2018 +0000
Revision:
5:ac6604b75d50
Parent:
4:d25c4fa216af
Child:
6:083fbed585c5
deleted X-NUCLEO-53L0A1 board related files and just use a VL53L0X chip as a ToF sensor

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 5:ac6604b75d50 32 //------- Feburary 4th, 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 5:ac6604b75d50 114 //--------------- Simple debug -------------------------------------------------
kenjiArai 5:ac6604b75d50 115 //extern DigitalOut myled;
kenjiArai 5:ac6604b75d50 116 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 117
kenjiArai 5:ac6604b75d50 118 /** Interface for STMicronics VL53L0X
kenjiArai 5:ac6604b75d50 119 * World smallest Time-of-Flight (ToF) ranging sensor
kenjiArai 5:ac6604b75d50 120 *
kenjiArai 5:ac6604b75d50 121 * @code
kenjiArai 5:ac6604b75d50 122 * #include "mbed.h"
kenjiArai 5:ac6604b75d50 123 *
kenjiArai 5:ac6604b75d50 124 * // I2C Communication
kenjiArai 5:ac6604b75d50 125 * VL53L0X sensor(I2C_SDA, I2C_SCL, D8); // SDA, SCL & XSHUT
kenjiArai 5:ac6604b75d50 126 * // If you connected I2C line not only this device but also other devices,
kenjiArai 5:ac6604b75d50 127 * // you need to declare following method.
kenjiArai 5:ac6604b75d50 128 * I2C i2c(I2C_SDA, I2C_SCL);
kenjiArai 5:ac6604b75d50 129 * VL53L0X sensor(i2c, D8); // I2C, XSHUT
kenjiArai 5:ac6604b75d50 130 *
kenjiArai 5:ac6604b75d50 131 * int main()
kenjiArai 5:ac6604b75d50 132 * {
kenjiArai 5:ac6604b75d50 133 * int status = VL53L0X_ERROR_NONE;
kenjiArai 5:ac6604b75d50 134 * uint32_t data;
kenjiArai 5:ac6604b75d50 135 *
kenjiArai 5:ac6604b75d50 136 * status = sensor.set_mode(range_long_distance_33ms_200cm);
kenjiArai 5:ac6604b75d50 137 * //status = sensor.set_mode(range_hi_accurate_200ms_120cm);
kenjiArai 5:ac6604b75d50 138 * //status = sensor.set_mode(range_hi_speed_20ms_120cm);
kenjiArai 5:ac6604b75d50 139 * while (true) {
kenjiArai 5:ac6604b75d50 140 * status = sensor.get_distance(&data);
kenjiArai 5:ac6604b75d50 141 * if (status == VL53L0X_ERROR_NONE) {
kenjiArai 5:ac6604b75d50 142 * printf("%5d\r\n", data);
kenjiArai 5:ac6604b75d50 143 * } else {
kenjiArai 5:ac6604b75d50 144 * printf("error\r\n");
kenjiArai 5:ac6604b75d50 145 * }
kenjiArai 5:ac6604b75d50 146 * }
kenjiArai 5:ac6604b75d50 147 * }
kenjiArai 5:ac6604b75d50 148 * @endcode
kenjiArai 5:ac6604b75d50 149 */
nikapov 0:a1a69d32f310 150
nikapov 0:a1a69d32f310 151 /* Classes -------------------------------------------------------------------*/
nikapov 0:a1a69d32f310 152 /** Class representing a VL53L0 sensor component
nikapov 0:a1a69d32f310 153 */
kenjiArai 5:ac6604b75d50 154 class VL53L0X
nikapov 0:a1a69d32f310 155 {
nikapov 0:a1a69d32f310 156 public:
nikapov 0:a1a69d32f310 157 /** Constructor
nikapov 0:a1a69d32f310 158 * @param[in] &i2c device I2C to be used for communication
kenjiArai 5:ac6604b75d50 159 * @param[in] &pin_gpio1 pin Mbed InterruptIn PinName
kenjiArai 5:ac6604b75d50 160 * to be used as component GPIO_1 INT
nikapov 0:a1a69d32f310 161 */
kenjiArai 5:ac6604b75d50 162 VL53L0X(I2C& i2c, PinName xshut, PinName pin_gpio1) : _i2c(i2c),
kenjiArai 5:ac6604b75d50 163 _gpio0(xshut)
nikapov 0:a1a69d32f310 164 {
nikapov 0:a1a69d32f310 165 if (pin_gpio1 != NC) {
nikapov 0:a1a69d32f310 166 _gpio1Int = new InterruptIn(pin_gpio1);
nikapov 0:a1a69d32f310 167 } else {
nikapov 0:a1a69d32f310 168 _gpio1Int = NULL;
nikapov 0:a1a69d32f310 169 }
kenjiArai 5:ac6604b75d50 170 preparation();
kenjiArai 5:ac6604b75d50 171 init_sensor(VL53L0X_DEFAULT_ADDRESS);
nikapov 0:a1a69d32f310 172 }
nikapov 0:a1a69d32f310 173
kenjiArai 5:ac6604b75d50 174 /** Constructor 2 (another simple way)
kenjiArai 5:ac6604b75d50 175 * @param[in] Pin for I2C SDA & SDL
kenjiArai 5:ac6604b75d50 176 * @param[in] pin Mbed DigitalOut PinName to be used for XSHUT
nikapov 0:a1a69d32f310 177 */
kenjiArai 5:ac6604b75d50 178 VL53L0X(PinName p_sda, PinName p_scl, PinName xshut)
kenjiArai 5:ac6604b75d50 179 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p), _gpio0(xshut) {
kenjiArai 5:ac6604b75d50 180 _gpio1Int = NULL;
kenjiArai 5:ac6604b75d50 181 preparation();
kenjiArai 5:ac6604b75d50 182 init_sensor(VL53L0X_DEFAULT_ADDRESS);
kenjiArai 5:ac6604b75d50 183 }
kenjiArai 5:ac6604b75d50 184
kenjiArai 5:ac6604b75d50 185 /** Constructor 3 (another simple way)
kenjiArai 5:ac6604b75d50 186 * @param[in] &i2c device I2C to be used for communication
kenjiArai 5:ac6604b75d50 187 * @param[in] pin Mbed DigitalOut PinName to be used for XSHUT
kenjiArai 5:ac6604b75d50 188 */
kenjiArai 5:ac6604b75d50 189 VL53L0X(I2C& p_i2c, PinName xshut) : _i2c(p_i2c), _gpio0(xshut) {
kenjiArai 5:ac6604b75d50 190 _gpio1Int = NULL;
kenjiArai 5:ac6604b75d50 191 preparation();
kenjiArai 5:ac6604b75d50 192 init_sensor(VL53L0X_DEFAULT_ADDRESS);
nikapov 0:a1a69d32f310 193 }
nikapov 0:a1a69d32f310 194
nikapov 0:a1a69d32f310 195 /** Destructor
nikapov 0:a1a69d32f310 196 */
nikapov 0:a1a69d32f310 197 virtual ~VL53L0X()
nikapov 0:a1a69d32f310 198 {
nikapov 0:a1a69d32f310 199 if (_gpio1Int != NULL) {
nikapov 0:a1a69d32f310 200 delete _gpio1Int;
nikapov 0:a1a69d32f310 201 }
nikapov 0:a1a69d32f310 202 }
kenjiArai 5:ac6604b75d50 203 #else
kenjiArai 5:ac6604b75d50 204 #warning "please recover original constractor form VL53L0X_header_original.txt"
kenjiArai 5:ac6604b75d50 205 #endif
nikapov 0:a1a69d32f310 206
nikapov 0:a1a69d32f310 207 /*** Interface Methods ***/
nikapov 0:a1a69d32f310 208 /*** High level API ***/
kenjiArai 5:ac6604b75d50 209 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 210 /**
kenjiArai 5:ac6604b75d50 211 * @brief initialize
kenjiArai 5:ac6604b75d50 212 * @return void
kenjiArai 5:ac6604b75d50 213 */
kenjiArai 5:ac6604b75d50 214 /* turns on the sensor */
kenjiArai 5:ac6604b75d50 215 void preparation(void)
kenjiArai 5:ac6604b75d50 216 {
kenjiArai 5:ac6604b75d50 217 _my_device.I2cDevAddr = VL53L0X_DEFAULT_ADDRESS;
kenjiArai 5:ac6604b75d50 218 _my_device.comms_type = 1; // VL53L0X_COMMS_I2C
kenjiArai 5:ac6604b75d50 219 _my_device.comms_speed_khz = 400;
kenjiArai 5:ac6604b75d50 220 _device = &_my_device;
kenjiArai 5:ac6604b75d50 221 _gpio0 = 0;
kenjiArai 5:ac6604b75d50 222 _gpio0.output();
kenjiArai 5:ac6604b75d50 223 }
kenjiArai 5:ac6604b75d50 224 #endif
kenjiArai 5:ac6604b75d50 225
nikapov 0:a1a69d32f310 226 /**
nikapov 0:a1a69d32f310 227 * @brief PowerOn the sensor
nikapov 0:a1a69d32f310 228 * @return void
nikapov 0:a1a69d32f310 229 */
nikapov 0:a1a69d32f310 230 /* turns on the sensor */
nikapov 0:a1a69d32f310 231 void VL53L0X_on(void)
nikapov 0:a1a69d32f310 232 {
kenjiArai 5:ac6604b75d50 233 #if ORIGINAL
nikapov 0:a1a69d32f310 234 if (_gpio0) {
nikapov 0:a1a69d32f310 235 *_gpio0 = 1;
nikapov 0:a1a69d32f310 236 } else {
nikapov 0:a1a69d32f310 237 if (_expgpio0) {
Davidroid 2:d07edeaff6f1 238 *_expgpio0 = 1;
Davidroid 2:d07edeaff6f1 239 }
Davidroid 2:d07edeaff6f1 240 }
nikapov 0:a1a69d32f310 241 wait_ms(10);
kenjiArai 5:ac6604b75d50 242 #else
kenjiArai 5:ac6604b75d50 243 _gpio0.output();
kenjiArai 5:ac6604b75d50 244 _gpio0 = 1;
kenjiArai 5:ac6604b75d50 245 _gpio0.input();
kenjiArai 5:ac6604b75d50 246 WAIT_MS(1);
kenjiArai 5:ac6604b75d50 247 #endif
nikapov 0:a1a69d32f310 248 }
nikapov 0:a1a69d32f310 249
nikapov 0:a1a69d32f310 250 /**
nikapov 0:a1a69d32f310 251 * @brief PowerOff the sensor
nikapov 0:a1a69d32f310 252 * @return void
nikapov 0:a1a69d32f310 253 */
nikapov 0:a1a69d32f310 254 /* turns off the sensor */
nikapov 0:a1a69d32f310 255 void VL53L0X_off(void)
nikapov 0:a1a69d32f310 256 {
kenjiArai 5:ac6604b75d50 257 #if ORIGINAL
nikapov 0:a1a69d32f310 258 if (_gpio0) {
nikapov 0:a1a69d32f310 259 *_gpio0 = 0;
nikapov 0:a1a69d32f310 260 } else {
nikapov 0:a1a69d32f310 261 if (_expgpio0) {
Davidroid 2:d07edeaff6f1 262 *_expgpio0 = 0;
Davidroid 2:d07edeaff6f1 263 }
Davidroid 2:d07edeaff6f1 264 }
nikapov 0:a1a69d32f310 265 wait_ms(10);
kenjiArai 5:ac6604b75d50 266 #else
kenjiArai 5:ac6604b75d50 267 _gpio0 = 0;
kenjiArai 5:ac6604b75d50 268 _gpio0.output();
kenjiArai 5:ac6604b75d50 269 WAIT_MS(10);
kenjiArai 5:ac6604b75d50 270 #endif
nikapov 0:a1a69d32f310 271 }
Davidroid 2:d07edeaff6f1 272
nikapov 0:a1a69d32f310 273 /**
nikapov 0:a1a69d32f310 274 * @brief Initialize the sensor with default values
nikapov 0:a1a69d32f310 275 * @return "0" on success
nikapov 0:a1a69d32f310 276 */
nikapov 0:a1a69d32f310 277 int init_sensor(uint8_t new_addr);
nikapov 0:a1a69d32f310 278
nikapov 0:a1a69d32f310 279
nikapov 0:a1a69d32f310 280 /**
kenjiArai 5:ac6604b75d50 281 * @brief Start the measure by single shot operating mode
kenjiArai 5:ac6604b75d50 282 * @param[in] operating mode
kenjiArai 5:ac6604b75d50 283 * @return "0" on success
nikapov 0:a1a69d32f310 284 */
kenjiArai 5:ac6604b75d50 285 int set_mode(RangeProfile range_mode) {
kenjiArai 5:ac6604b75d50 286 _range_mode = range_mode;
kenjiArai 5:ac6604b75d50 287 return start_measurement(range_single_shot_polling, NULL);
nikapov 0:a1a69d32f310 288 }
nikapov 0:a1a69d32f310 289
kenjiArai 5:ac6604b75d50 290 #if !ORIGINAL
nikapov 0:a1a69d32f310 291 /**
nikapov 0:a1a69d32f310 292 * @brief Get ranging result and only that
nikapov 0:a1a69d32f310 293 *
nikapov 0:a1a69d32f310 294 * @par Function Description
kenjiArai 5:ac6604b75d50 295 * Unlike @a VL53L0X_get_ranging_measurement_data()
kenjiArai 5:ac6604b75d50 296 * this function only retrieves the range in millimeter \n
nikapov 0:a1a69d32f310 297 * It does any required up-scale translation\n
nikapov 0:a1a69d32f310 298 * It can be called after success status polling or in interrupt mode \n
nikapov 0:a1a69d32f310 299 * @warning these function is not doing wrap around filtering \n
nikapov 0:a1a69d32f310 300 * This function doesn't perform any data ready check!
nikapov 0:a1a69d32f310 301 *
nikapov 0:a1a69d32f310 302 * @param p_data Pointer to range distance
nikapov 0:a1a69d32f310 303 * @return "0" on success
nikapov 0:a1a69d32f310 304 */
nikapov 0:a1a69d32f310 305 virtual int get_distance(uint32_t *p_data)
nikapov 0:a1a69d32f310 306 {
nikapov 0:a1a69d32f310 307 int status = 0;
nikapov 0:a1a69d32f310 308 VL53L0X_RangingMeasurementData_t p_ranging_measurement_data;
nikapov 0:a1a69d32f310 309
kenjiArai 5:ac6604b75d50 310 #if ORIGINAL
nikapov 0:a1a69d32f310 311 status = start_measurement(range_single_shot_polling, NULL);
kenjiArai 5:ac6604b75d50 312 #else
kenjiArai 5:ac6604b75d50 313 status = VL53L0X_start_measurement(_device);
kenjiArai 5:ac6604b75d50 314 #endif
nikapov 0:a1a69d32f310 315 if (!status) {
kenjiArai 5:ac6604b75d50 316 status = get_measurement(range_single_shot_polling,
kenjiArai 5:ac6604b75d50 317 &p_ranging_measurement_data);
nikapov 0:a1a69d32f310 318 }
nikapov 0:a1a69d32f310 319 if (p_ranging_measurement_data.RangeStatus == 0) {
nikapov 0:a1a69d32f310 320 // we have a valid range.
nikapov 0:a1a69d32f310 321 *p_data = p_ranging_measurement_data.RangeMilliMeter;
nikapov 0:a1a69d32f310 322 } else {
nikapov 0:a1a69d32f310 323 *p_data = 0;
nikapov 0:a1a69d32f310 324 status = VL53L0X_ERROR_RANGE_ERROR;
nikapov 0:a1a69d32f310 325 }
nikapov 0:a1a69d32f310 326 stop_measurement(range_single_shot_polling);
nikapov 0:a1a69d32f310 327 return status;
nikapov 0:a1a69d32f310 328 }
kenjiArai 5:ac6604b75d50 329 #endif
nikapov 0:a1a69d32f310 330
kenjiArai 5:ac6604b75d50 331 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 332 //------- Feburary 4th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 5:ac6604b75d50 333 // moved to following header file
kenjiArai 5:ac6604b75d50 334 #include "VL53L0X_2nd.h"
kenjiArai 5:ac6604b75d50 335 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 336 #else
kenjiArai 5:ac6604b75d50 337 #warning "please recover original functions form VL53L0X_2nd.h"
kenjiArai 5:ac6604b75d50 338 #endif
kenjiArai 5:ac6604b75d50 339
kenjiArai 5:ac6604b75d50 340 private:
nikapov 0:a1a69d32f310 341
kenjiArai 5:ac6604b75d50 342 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 343 //------- Feburary 4th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 5:ac6604b75d50 344 // moved to following header file
kenjiArai 5:ac6604b75d50 345 #include "VL53L0X_3rd.h"
kenjiArai 5:ac6604b75d50 346 //------------------------------------------------------------------------------
kenjiArai 5:ac6604b75d50 347 #else
kenjiArai 5:ac6604b75d50 348 #warning "please recover original functions form VL53L0X_3rd.h"
kenjiArai 5:ac6604b75d50 349 #endif
kenjiArai 5:ac6604b75d50 350 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 351 static const unsigned int TEMP_BUF_SIZE = 32;
nikapov 0:a1a69d32f310 352
kenjiArai 5:ac6604b75d50 353 int i2c_write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr,
kenjiArai 5:ac6604b75d50 354 uint16_t NumByteToWrite) {
kenjiArai 5:ac6604b75d50 355 int ret;
kenjiArai 5:ac6604b75d50 356 uint8_t tmp[TEMP_BUF_SIZE];
kenjiArai 5:ac6604b75d50 357
kenjiArai 5:ac6604b75d50 358 if(NumByteToWrite >= TEMP_BUF_SIZE) return -2;
kenjiArai 5:ac6604b75d50 359 /* First, send device address. Then, send data and STOP condition */
kenjiArai 5:ac6604b75d50 360 tmp[0] = RegisterAddr;
kenjiArai 5:ac6604b75d50 361 memcpy(tmp+1, pBuffer, NumByteToWrite);
kenjiArai 5:ac6604b75d50 362 ret = _i2c.write(DeviceAddr, (const char*)tmp, NumByteToWrite+1, false);
kenjiArai 5:ac6604b75d50 363 if(ret) return -1;
kenjiArai 5:ac6604b75d50 364 return 0;
nikapov 0:a1a69d32f310 365 }
nikapov 0:a1a69d32f310 366
kenjiArai 5:ac6604b75d50 367 int i2c_read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr,
kenjiArai 5:ac6604b75d50 368 uint16_t NumByteToRead) {
kenjiArai 5:ac6604b75d50 369 int ret;
nikapov 0:a1a69d32f310 370
kenjiArai 5:ac6604b75d50 371 //--debug--
kenjiArai 5:ac6604b75d50 372 //myled = 1;
kenjiArai 5:ac6604b75d50 373 /* Send device address, with no STOP condition */
kenjiArai 5:ac6604b75d50 374 ret = _i2c.write(DeviceAddr, (const char*)&RegisterAddr, 1, true);
kenjiArai 5:ac6604b75d50 375 //--debug--
kenjiArai 5:ac6604b75d50 376 //myled = 0;
kenjiArai 5:ac6604b75d50 377 if(!ret) {
kenjiArai 5:ac6604b75d50 378 /* Read data, with STOP condition */
kenjiArai 5:ac6604b75d50 379 ret = _i2c.read(DeviceAddr, (char*)pBuffer, NumByteToRead, false);
nikapov 0:a1a69d32f310 380 }
kenjiArai 5:ac6604b75d50 381 if(ret) return -1;
kenjiArai 5:ac6604b75d50 382 return 0;
nikapov 0:a1a69d32f310 383 }
kenjiArai 5:ac6604b75d50 384 #endif
nikapov 0:a1a69d32f310 385
nikapov 0:a1a69d32f310 386 VL53L0X_DeviceInfo_t _device_info;
nikapov 0:a1a69d32f310 387
kenjiArai 5:ac6604b75d50 388 #if !ORIGINAL
kenjiArai 5:ac6604b75d50 389 RangeProfile _range_mode;
kenjiArai 5:ac6604b75d50 390 #endif
kenjiArai 5:ac6604b75d50 391
kenjiArai 5:ac6604b75d50 392 #if ORIGINAL
nikapov 0:a1a69d32f310 393 /* IO Device */
nikapov 0:a1a69d32f310 394 DevI2C *_dev_i2c;
nikapov 0:a1a69d32f310 395 /* Digital out pin */
nikapov 0:a1a69d32f310 396 DigitalOut *_gpio0;
nikapov 0:a1a69d32f310 397 /* GPIO expander */
nikapov 0:a1a69d32f310 398 Stmpe1600DigiOut *_expgpio0;
kenjiArai 5:ac6604b75d50 399 #else
kenjiArai 5:ac6604b75d50 400 /* IO Device */
kenjiArai 5:ac6604b75d50 401 I2C *_i2c_p;
kenjiArai 5:ac6604b75d50 402 I2C &_i2c;
kenjiArai 5:ac6604b75d50 403 /* Digital in and out pin */
kenjiArai 5:ac6604b75d50 404 DigitalInOut _gpio0;
kenjiArai 5:ac6604b75d50 405 #endif
nikapov 0:a1a69d32f310 406 /* Measure detection IRQ */
nikapov 0:a1a69d32f310 407 InterruptIn *_gpio1Int;
nikapov 0:a1a69d32f310 408 /* Device data */
nikapov 0:a1a69d32f310 409 VL53L0X_Dev_t _my_device;
nikapov 0:a1a69d32f310 410 VL53L0X_DEV _device;
nikapov 0:a1a69d32f310 411 };
nikapov 0:a1a69d32f310 412
nikapov 0:a1a69d32f310 413
nikapov 0:a1a69d32f310 414 #endif /* _VL53L0X_CLASS_H_ */