John Alexander / Mbed OS VL53L3CX_Shield_1Sensor_Interrupt_MbOS6x

Dependencies:   X_NUCLEO_53L3A2

Committer:
johnAlexander
Date:
Fri May 07 14:41:08 2021 +0000
Revision:
4:360dc34c3769
Parent:
3:42c96c9c627b
Child:
5:92a861d48253
Small code reformat.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesmn 0:c77591fc308d 1 /*
johnAlexander 4:360dc34c3769 2 * This VL53L3 Expansion board test application performs range measurements
johnAlexander 4:360dc34c3769 3 * using the onboard embedded centre sensor, in singleshot, polling mode.
johnAlexander 4:360dc34c3769 4 * Measured ranges are ouput on the Serial Port, running at 115200 baud.
johnAlexander 4:360dc34c3769 5 *
johnAlexander 4:360dc34c3769 6 * The User Blue button stops the current measurement and entire program,
johnAlexander 4:360dc34c3769 7 * releasing all resources.
charlesmn 0:c77591fc308d 8 *
johnAlexander 4:360dc34c3769 9 * The Reset button can be used to restart the program.
charlesmn 0:c77591fc308d 10 *
johnAlexander 4:360dc34c3769 11 * *** Note :
johnAlexander 4:360dc34c3769 12 * Default Mbed build system settings disable print floating-point support.
johnAlexander 4:360dc34c3769 13 * Offline builds can enable this, again.
johnAlexander 4:360dc34c3769 14 * https://github.com/ARMmbed/mbed-os/blob/master/platform/source/minimal-printf/README.md
johnAlexander 4:360dc34c3769 15 * .\mbed-os\platform\mbed_lib.json
johnAlexander 4:360dc34c3769 16 *
charlesmn 0:c77591fc308d 17 */
charlesmn 0:c77591fc308d 18
charlesmn 0:c77591fc308d 19 #include <stdio.h>
johnAlexander 3:42c96c9c627b 20 #include <time.h>
charlesmn 0:c77591fc308d 21
charlesmn 0:c77591fc308d 22 #include "mbed.h"
johnAlexander 4:360dc34c3769 23
johnAlexander 3:42c96c9c627b 24 #include "XNucleo53L3A2.h"
charlesmn 2:86876e590f28 25 #include "vl53L3_I2c.h"
charlesmn 0:c77591fc308d 26
charlesmn 0:c77591fc308d 27
charlesmn 2:86876e590f28 28 #define I2C_SDA D14
charlesmn 2:86876e590f28 29 #define I2C_SCL D15
charlesmn 0:c77591fc308d 30
charlesmn 0:c77591fc308d 31 #define MEASUREMENTTIMING 55
charlesmn 0:c77591fc308d 32
johnAlexander 3:42c96c9c627b 33 static XNucleo53L3A2 *board=NULL;
johnAlexander 3:42c96c9c627b 34 #if (MBED_VERSION > 60300)
johnAlexander 3:42c96c9c627b 35 UnbufferedSerial pc(USBTX, USBRX);
johnAlexander 3:42c96c9c627b 36 extern "C" void wait_ms(int ms);
johnAlexander 3:42c96c9c627b 37 #else
johnAlexander 3:42c96c9c627b 38 Serial pc(SERIAL_TX, SERIAL_RX);
johnAlexander 3:42c96c9c627b 39 #endif
charlesmn 0:c77591fc308d 40
charlesmn 0:c77591fc308d 41 static int int_centre_result = 0;
charlesmn 0:c77591fc308d 42 static int int_left_result = 0;
charlesmn 0:c77591fc308d 43 static int int_right_result = 0;
charlesmn 0:c77591fc308d 44
charlesmn 0:c77591fc308d 45
charlesmn 0:c77591fc308d 46 class WaitForMeasurement {
johnAlexander 4:360dc34c3769 47
charlesmn 0:c77591fc308d 48 public:
charlesmn 0:c77591fc308d 49
charlesmn 0:c77591fc308d 50
charlesmn 0:c77591fc308d 51 // this class services the interrupts from the ToF sensors.
charlesmn 0:c77591fc308d 52 // There is a limited amount you can do in an interrupt routine; printfs,mutexes break them among other things.
charlesmn 0:c77591fc308d 53 // We keep things simple by only raising a flag so all the real work is done outside the interrupt.
charlesmn 0:c77591fc308d 54 // This is designed around MBED V2 which doesn't have the RTOS features that would make this work nicely e.g. semaphores/queues.
charlesmn 0:c77591fc308d 55 WaitForMeasurement(): _interrupt(A1)
charlesmn 0:c77591fc308d 56 {
charlesmn 0:c77591fc308d 57 }
charlesmn 0:c77591fc308d 58
charlesmn 0:c77591fc308d 59
charlesmn 0:c77591fc308d 60 // constructor - Sensor is not used and can be removed
charlesmn 0:c77591fc308d 61 WaitForMeasurement(PinName pin,VL53LX_DEV Dev) : _interrupt(pin) // create the InterruptIn on the pin specified to Counter
charlesmn 0:c77591fc308d 62 {
charlesmn 0:c77591fc308d 63 Devlocal = Dev;
charlesmn 0:c77591fc308d 64 _interrupt.rise(callback(this, &WaitForMeasurement::got_interrupt)); // attach increment function of this counter instance
charlesmn 0:c77591fc308d 65
charlesmn 0:c77591fc308d 66 }
charlesmn 0:c77591fc308d 67
charlesmn 0:c77591fc308d 68 void process_right_interrupt()
charlesmn 0:c77591fc308d 69 {
charlesmn 0:c77591fc308d 70 printf("processing right interrupt\n");
charlesmn 0:c77591fc308d 71 }
charlesmn 0:c77591fc308d 72
charlesmn 0:c77591fc308d 73 // function is called every time an interupt is seen. A flag is raised which allows the main routine to service the interupt.
charlesmn 0:c77591fc308d 74 void got_interrupt()
charlesmn 0:c77591fc308d 75 {
charlesmn 0:c77591fc308d 76 _count++;
charlesmn 0:c77591fc308d 77
charlesmn 0:c77591fc308d 78 if (Devlocal->I2cDevAddr == NEW_SENSOR_CENTRE_ADDRESS)
charlesmn 0:c77591fc308d 79 int_centre_result = 1; //flag to main that interrupt happened
charlesmn 0:c77591fc308d 80 if (Devlocal->I2cDevAddr == NEW_SENSOR_LEFT_ADDRESS)
charlesmn 0:c77591fc308d 81 int_left_result = 1; //flag to main that interrupt happened
charlesmn 0:c77591fc308d 82 if (Devlocal->I2cDevAddr == NEW_SENSOR_RIGHT_ADDRESS)
charlesmn 0:c77591fc308d 83 int_right_result = 1; //flag to main that interrupt happened
charlesmn 0:c77591fc308d 84 }
charlesmn 0:c77591fc308d 85
charlesmn 0:c77591fc308d 86
charlesmn 0:c77591fc308d 87 //destructor
charlesmn 0:c77591fc308d 88 ~WaitForMeasurement()
charlesmn 0:c77591fc308d 89 {
charlesmn 0:c77591fc308d 90 printf("destruction \n");
charlesmn 0:c77591fc308d 91 }
charlesmn 0:c77591fc308d 92
charlesmn 0:c77591fc308d 93 private:
johnAlexander 4:360dc34c3769 94
charlesmn 0:c77591fc308d 95 InterruptIn _interrupt;
charlesmn 0:c77591fc308d 96 volatile int _count;
charlesmn 0:c77591fc308d 97 VL53LX_DEV Devlocal;
johnAlexander 4:360dc34c3769 98 int status;
charlesmn 0:c77591fc308d 99 };
charlesmn 0:c77591fc308d 100
charlesmn 0:c77591fc308d 101
charlesmn 0:c77591fc308d 102
charlesmn 0:c77591fc308d 103 VL53LX_Dev_t devCentre;
charlesmn 0:c77591fc308d 104 VL53LX_Dev_t devLeft;
charlesmn 0:c77591fc308d 105 VL53LX_Dev_t devRight;
charlesmn 0:c77591fc308d 106 VL53LX_DEV Dev = &devCentre;
charlesmn 0:c77591fc308d 107
charlesmn 0:c77591fc308d 108
charlesmn 0:c77591fc308d 109
charlesmn 0:c77591fc308d 110
charlesmn 0:c77591fc308d 111
charlesmn 0:c77591fc308d 112 /*=================================== Main ==================================
charlesmn 0:c77591fc308d 113 =============================================================================*/
charlesmn 0:c77591fc308d 114 int main()
charlesmn 0:c77591fc308d 115 {
charlesmn 0:c77591fc308d 116 int status;
johnAlexander 3:42c96c9c627b 117 VL53L3 * Sensor;
charlesmn 0:c77591fc308d 118 uint16_t wordData;
charlesmn 0:c77591fc308d 119 uint8_t ToFSensor = 1; // 0=Left, 1=Center(default), 2=Right
charlesmn 0:c77591fc308d 120
charlesmn 0:c77591fc308d 121
charlesmn 0:c77591fc308d 122 WaitForMeasurement* int2;
charlesmn 0:c77591fc308d 123 WaitForMeasurement* int1;
charlesmn 0:c77591fc308d 124 WaitForMeasurement* int3;
charlesmn 0:c77591fc308d 125
charlesmn 0:c77591fc308d 126 pc.baud(115200); // baud rate is important as printf statements take a lot of time
charlesmn 0:c77591fc308d 127
charlesmn 0:c77591fc308d 128 printf("Hello world!\r\n");
charlesmn 0:c77591fc308d 129
charlesmn 2:86876e590f28 130 vl53L3_DevI2C *dev_I2C = new vl53L3_DevI2C(I2C_SDA, I2C_SCL);
charlesmn 0:c77591fc308d 131
charlesmn 0:c77591fc308d 132 /* creates the 53L1A1 expansion board singleton obj */
johnAlexander 3:42c96c9c627b 133 board = XNucleo53L3A2::instance(dev_I2C, A2, D8, D2);
charlesmn 0:c77591fc308d 134 printf("board created!\r\n");
charlesmn 0:c77591fc308d 135
charlesmn 0:c77591fc308d 136 /* init the 53L1A1 expansion board with default values */
charlesmn 0:c77591fc308d 137 status = board->init_board();
charlesmn 0:c77591fc308d 138 if (status) {
charlesmn 0:c77591fc308d 139 printf("Failed to init board!\r\n");
charlesmn 0:c77591fc308d 140 return 0;
charlesmn 0:c77591fc308d 141 }
charlesmn 0:c77591fc308d 142
charlesmn 0:c77591fc308d 143
charlesmn 0:c77591fc308d 144 printf("board initiated! - %d\r\n", status);
charlesmn 0:c77591fc308d 145
charlesmn 0:c77591fc308d 146 for (ToFSensor=0;ToFSensor<3;ToFSensor++){
charlesmn 0:c77591fc308d 147 wait_ms(15);
charlesmn 0:c77591fc308d 148 switch(ToFSensor){
charlesmn 0:c77591fc308d 149 case 0:
charlesmn 0:c77591fc308d 150 if (board->sensor_centre== NULL ) continue;
charlesmn 0:c77591fc308d 151 Dev=&devCentre;
charlesmn 0:c77591fc308d 152 Sensor=board->sensor_centre;
charlesmn 0:c77591fc308d 153 Dev->I2cDevAddr = NEW_SENSOR_CENTRE_ADDRESS;
charlesmn 0:c77591fc308d 154 printf("configuring centre channel \n");
charlesmn 0:c77591fc308d 155 break;
charlesmn 0:c77591fc308d 156 case 1:
charlesmn 0:c77591fc308d 157 if (board->sensor_left== NULL ) continue;
charlesmn 0:c77591fc308d 158 Dev=&devLeft;
charlesmn 0:c77591fc308d 159 Sensor=board->sensor_left;
charlesmn 0:c77591fc308d 160 Dev->I2cDevAddr = NEW_SENSOR_LEFT_ADDRESS;
charlesmn 0:c77591fc308d 161 printf("configuring left channel \n");
charlesmn 0:c77591fc308d 162 break;
charlesmn 0:c77591fc308d 163 case 2:
charlesmn 0:c77591fc308d 164 if (board->sensor_right== NULL ) continue;
charlesmn 0:c77591fc308d 165 Dev=&devRight;
charlesmn 0:c77591fc308d 166 Sensor=board->sensor_right;
charlesmn 0:c77591fc308d 167 Dev->I2cDevAddr = NEW_SENSOR_RIGHT_ADDRESS;
charlesmn 0:c77591fc308d 168 printf("configuring right channel \n");
charlesmn 0:c77591fc308d 169 break;
charlesmn 0:c77591fc308d 170 default:
charlesmn 0:c77591fc308d 171 printf(" error in switch, invalid ToF sensor \n");
charlesmn 0:c77591fc308d 172 }
charlesmn 0:c77591fc308d 173
charlesmn 0:c77591fc308d 174 // configure the sensors
charlesmn 0:c77591fc308d 175 Dev->comms_speed_khz = 400;
charlesmn 0:c77591fc308d 176
charlesmn 0:c77591fc308d 177 Dev->comms_type = 1;
charlesmn 0:c77591fc308d 178
charlesmn 0:c77591fc308d 179 Sensor->VL53LX_RdWord(Dev, 0x01, &wordData);
charlesmn 0:c77591fc308d 180 printf("VL53L1X: %02X %d\n\r", wordData,Dev->I2cDevAddr);
charlesmn 0:c77591fc308d 181 /* Device Initialization and setting */
charlesmn 0:c77591fc308d 182
charlesmn 0:c77591fc308d 183 status = Sensor->VL53LX_DataInit();
charlesmn 0:c77591fc308d 184 status = Sensor->VL53LX_SetDistanceMode(VL53LX_DISTANCEMODE_LONG);
charlesmn 0:c77591fc308d 185 status = Sensor->VL53LX_SetMeasurementTimingBudgetMicroSeconds( MEASUREMENTTIMING * 1000);
charlesmn 0:c77591fc308d 186 status = Sensor->VL53LX_SmudgeCorrectionEnable(VL53LX_SMUDGE_CORRECTION_SINGLE);
charlesmn 0:c77591fc308d 187 status = Sensor->VL53LX_SetXTalkCompensationEnable(1);
charlesmn 0:c77591fc308d 188
charlesmn 0:c77591fc308d 189
charlesmn 0:c77591fc308d 190 }
charlesmn 0:c77591fc308d 191
charlesmn 0:c77591fc308d 192 if (board->sensor_centre!= NULL )
charlesmn 0:c77591fc308d 193 {
charlesmn 0:c77591fc308d 194 printf("starting interrupt centre\n");
charlesmn 0:c77591fc308d 195 Sensor=board->sensor_centre;
charlesmn 0:c77591fc308d 196 devCentre.I2cDevAddr = NEW_SENSOR_CENTRE_ADDRESS;
charlesmn 0:c77591fc308d 197 int1 = new WaitForMeasurement(A2,&devCentre);
charlesmn 0:c77591fc308d 198 status = Sensor->VL53LX_StartMeasurement();
charlesmn 0:c77591fc308d 199 printf("VL53L1_StartMeasurement %d \n",status);
charlesmn 0:c77591fc308d 200 status = board->sensor_centre->VL53LX_ClearInterruptAndStartMeasurement();
charlesmn 0:c77591fc308d 201 }
charlesmn 0:c77591fc308d 202
charlesmn 0:c77591fc308d 203
charlesmn 0:c77591fc308d 204 if (board->sensor_left!= NULL )
charlesmn 0:c77591fc308d 205 {
charlesmn 0:c77591fc308d 206 printf("starting interrupt left\n");
charlesmn 0:c77591fc308d 207 Sensor=board->sensor_left;
charlesmn 0:c77591fc308d 208 devLeft.I2cDevAddr = NEW_SENSOR_LEFT_ADDRESS;
charlesmn 0:c77591fc308d 209 int2 = new WaitForMeasurement(D8,&devLeft);
charlesmn 0:c77591fc308d 210 status = Sensor->VL53LX_StartMeasurement();
charlesmn 0:c77591fc308d 211 printf("VL53L1_StartMeasurement %d \n",status);
charlesmn 0:c77591fc308d 212 status = board->sensor_left->VL53LX_ClearInterruptAndStartMeasurement();
charlesmn 0:c77591fc308d 213 }
charlesmn 0:c77591fc308d 214
charlesmn 0:c77591fc308d 215 if (board->sensor_right!= NULL )
charlesmn 0:c77591fc308d 216 {
charlesmn 0:c77591fc308d 217 printf("starting interrupt right\n");
charlesmn 0:c77591fc308d 218 Sensor=board->sensor_right;
charlesmn 0:c77591fc308d 219 devRight.I2cDevAddr = NEW_SENSOR_RIGHT_ADDRESS;
charlesmn 0:c77591fc308d 220 int3 = new WaitForMeasurement(D2,&devRight);
charlesmn 0:c77591fc308d 221 status = Sensor->VL53LX_StartMeasurement();
charlesmn 0:c77591fc308d 222 printf("VL53L1_StartMeasurement %d \n",status);
charlesmn 0:c77591fc308d 223 status = board->sensor_right->VL53LX_ClearInterruptAndStartMeasurement();
charlesmn 0:c77591fc308d 224 }
charlesmn 0:c77591fc308d 225
charlesmn 0:c77591fc308d 226
charlesmn 0:c77591fc308d 227 // loop waiting for interrupts to happen. This is signaled by int_centre_result,int_left_result or int_right_result
charlesmn 0:c77591fc308d 228 // being non zero. The are set back to zero when processing is completed
charlesmn 0:c77591fc308d 229 while (1)
charlesmn 0:c77591fc308d 230 {
charlesmn 0:c77591fc308d 231
charlesmn 0:c77591fc308d 232 VL53LX_MultiRangingData_t MultiRangingData;
johnAlexander 4:360dc34c3769 233 VL53LX_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
charlesmn 0:c77591fc308d 234
johnAlexander 4:360dc34c3769 235 wait_ms(10);
johnAlexander 4:360dc34c3769 236
charlesmn 0:c77591fc308d 237 if (int_centre_result != 0)
charlesmn 0:c77591fc308d 238 {
charlesmn 0:c77591fc308d 239 int_centre_result = 0;
charlesmn 0:c77591fc308d 240 status = board->sensor_centre->VL53LX_GetMultiRangingData( pMultiRangingData);
charlesmn 0:c77591fc308d 241 int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
charlesmn 0:c77591fc308d 242 if (( no_of_object_found < 10 ) && ( no_of_object_found != 0 ))
charlesmn 0:c77591fc308d 243 {
charlesmn 0:c77591fc308d 244 for(int j=0;j<no_of_object_found;j++){
charlesmn 0:c77591fc308d 245 if (pMultiRangingData->RangeData[j].RangeStatus == 0)
charlesmn 0:c77591fc308d 246 {
charlesmn 0:c77591fc308d 247 printf("centre\t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
johnAlexander 4:360dc34c3769 248 pMultiRangingData->RangeData[j].RangeStatus,
johnAlexander 4:360dc34c3769 249 pMultiRangingData->RangeData[j].RangeMilliMeter,
johnAlexander 4:360dc34c3769 250 (pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65535.0),
johnAlexander 4:360dc34c3769 251 (pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65535.0));
charlesmn 0:c77591fc308d 252 }
charlesmn 0:c77591fc308d 253 }
charlesmn 0:c77591fc308d 254 }
charlesmn 0:c77591fc308d 255 int_centre_result = 0;
johnAlexander 4:360dc34c3769 256 wait_ms( MEASUREMENTTIMING );
charlesmn 0:c77591fc308d 257 status = board->sensor_centre->VL53LX_ClearInterruptAndStartMeasurement();
charlesmn 0:c77591fc308d 258 }
charlesmn 0:c77591fc308d 259
charlesmn 0:c77591fc308d 260
charlesmn 0:c77591fc308d 261 if (int_left_result != 0)
charlesmn 0:c77591fc308d 262 {
charlesmn 0:c77591fc308d 263 int_left_result = 0;
charlesmn 0:c77591fc308d 264 status = board->sensor_left->VL53LX_GetMultiRangingData( pMultiRangingData);
charlesmn 0:c77591fc308d 265 if ( status == 0)
charlesmn 0:c77591fc308d 266 {
charlesmn 0:c77591fc308d 267 int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
charlesmn 0:c77591fc308d 268 if (( no_of_object_found < 10 ) && ( no_of_object_found != 0 ))
charlesmn 0:c77591fc308d 269 {
charlesmn 0:c77591fc308d 270 for(int j=0;j<no_of_object_found;j++){
charlesmn 0:c77591fc308d 271 if (pMultiRangingData->RangeData[j].RangeStatus == 0)
charlesmn 0:c77591fc308d 272 {
charlesmn 0:c77591fc308d 273 printf("left \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
johnAlexander 4:360dc34c3769 274 pMultiRangingData->RangeData[j].RangeStatus,
johnAlexander 4:360dc34c3769 275 pMultiRangingData->RangeData[j].RangeMilliMeter,
johnAlexander 4:360dc34c3769 276 (pMultiRangingData->RangeData[j].SignalRateRtnMegaCps / 65535.0),
johnAlexander 4:360dc34c3769 277 (pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps / 65535.0) );
charlesmn 0:c77591fc308d 278 }
charlesmn 0:c77591fc308d 279 }
charlesmn 0:c77591fc308d 280 }
charlesmn 0:c77591fc308d 281 }
johnAlexander 4:360dc34c3769 282 wait_ms( MEASUREMENTTIMING );
charlesmn 0:c77591fc308d 283 status = board->sensor_left->VL53LX_ClearInterruptAndStartMeasurement();
charlesmn 0:c77591fc308d 284 }
charlesmn 0:c77591fc308d 285
charlesmn 0:c77591fc308d 286
charlesmn 0:c77591fc308d 287 if (int_right_result != 0)
charlesmn 0:c77591fc308d 288 {
charlesmn 0:c77591fc308d 289 // clear interrupt flag
charlesmn 0:c77591fc308d 290 int_right_result = 0;
charlesmn 0:c77591fc308d 291 status = board->sensor_right->VL53LX_GetMultiRangingData( pMultiRangingData);
charlesmn 0:c77591fc308d 292 if ( status == 0)
charlesmn 0:c77591fc308d 293 {
charlesmn 0:c77591fc308d 294 // if valid result print it
charlesmn 0:c77591fc308d 295 int no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
charlesmn 0:c77591fc308d 296 if (( no_of_object_found < 10 ) && ( no_of_object_found != 0 ))
charlesmn 0:c77591fc308d 297 {
charlesmn 0:c77591fc308d 298 for(int j=0;j<no_of_object_found;j++){
charlesmn 0:c77591fc308d 299 if (pMultiRangingData->RangeData[j].RangeStatus == 0)
charlesmn 0:c77591fc308d 300 {
charlesmn 0:c77591fc308d 301 printf("right \t status=%d, \t D=%5dmm, \t Signal=%2.2f Mcps, \t Ambient=%2.2f Mcps \n",
johnAlexander 4:360dc34c3769 302 pMultiRangingData->RangeData[j].RangeStatus,
johnAlexander 4:360dc34c3769 303 pMultiRangingData->RangeData[j].RangeMilliMeter,
johnAlexander 4:360dc34c3769 304 (pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65535.0),
johnAlexander 4:360dc34c3769 305 (pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65535.0) );
charlesmn 0:c77591fc308d 306 }
charlesmn 0:c77591fc308d 307 }
charlesmn 0:c77591fc308d 308 }
charlesmn 0:c77591fc308d 309 }
johnAlexander 4:360dc34c3769 310 wait_ms( MEASUREMENTTIMING );
charlesmn 0:c77591fc308d 311 // clear theinterrupt and wait for another result
charlesmn 0:c77591fc308d 312 status = board->sensor_right->VL53LX_ClearInterruptAndStartMeasurement();
charlesmn 0:c77591fc308d 313
charlesmn 0:c77591fc308d 314 }
charlesmn 0:c77591fc308d 315 }
charlesmn 0:c77591fc308d 316 printf("terminated");
charlesmn 0:c77591fc308d 317 }
johnAlexander 3:42c96c9c627b 318
johnAlexander 3:42c96c9c627b 319 #if (MBED_VERSION > 60300)
johnAlexander 3:42c96c9c627b 320 extern "C" void wait_ms(int ms)
johnAlexander 3:42c96c9c627b 321 {
johnAlexander 3:42c96c9c627b 322 thread_sleep_for(ms);
johnAlexander 3:42c96c9c627b 323 }
johnAlexander 3:42c96c9c627b 324 #endif
charlesmn 0:c77591fc308d 325