Sweep a servo according to Proximity sensor measure

Dependencies:   Servo X_NUCLEO_6180XA1 mbed

Fork of HelloWorld_6180XA1 by ST

Committer:
gallonm
Date:
Thu Nov 05 17:34:29 2015 +0100
Revision:
27:2afb9baf718f
Parent:
26:e19e6cb2e6bb
Child:
30:c8efec21544f
Updated main.cpp by introducing CheckSlider, StartPrintMessage, StopPrintMessage
and Bye functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gallonm 0:83c628a58feb 1 #include "mbed.h"
gallonm 8:4c05f7a5bb60 2 #include "x_nucleo_6180xa1.h"
gallonm 4:ccd62fd7e137 3 #include <string.h>
gallonm 4:ccd62fd7e137 4 #include <stdlib.h>
gallonm 4:ccd62fd7e137 5 #include <stdio.h>
gallonm 8:4c05f7a5bb60 6 #include <assert.h>
gallonm 8:4c05f7a5bb60 7
gallonm 20:b2e0b41a0e6b 8 /* This test application performs a range measurement and an als measurement.
gallonm 20:b2e0b41a0e6b 9 Display select slider allow to switch the measurement type; previuos
gallonm 20:b2e0b41a0e6b 10 measurement is stopped and a new measurement is started.
gallonm 20:b2e0b41a0e6b 11 User button allows to stop current measurement and the entire program.
gallonm 20:b2e0b41a0e6b 12 Reset button is used to restart the program. */
gallonm 20:b2e0b41a0e6b 13
gallonm 14:946e62f44f4f 14 /* Polling operating modes don`t require callback function that handles IRQ
gallonm 14:946e62f44f4f 15 Callback functions are used only for measure that require interrupt */
gallonm 14:946e62f44f4f 16
gallonm 20:b2e0b41a0e6b 17 /* GetMeasurement is asynchronous! It returns NOT_READY if the measurement value
gallonm 20:b2e0b41a0e6b 18 is not ready to be read from the corresponding register. So you need to wait
gallonm 20:b2e0b41a0e6b 19 for the result to be ready */
gallonm 20:b2e0b41a0e6b 20
gallonm 5:fa65d931bd96 21 #define VL6180X_I2C_SDA I2C_SDA
gallonm 5:fa65d931bd96 22 #define VL6180X_I2C_SCL I2C_SCL
gallonm 5:fa65d931bd96 23
gallonm 19:394c9a4a3046 24 #define RANGE 0
gallonm 19:394c9a4a3046 25 #define ALS 1
gallonm 10:5319abadb31e 26
gallonm 14:946e62f44f4f 27 /* timer and digital out pin used for debugging */
gallonm 14:946e62f44f4f 28 //Timer timer;
gallonm 14:946e62f44f4f 29 //int start, end;
gallonm 14:946e62f44f4f 30 //DigitalOut pin(PA_15);
gallonm 5:fa65d931bd96 31
gallonm 27:2afb9baf718f 32 static X_NUCLEO_6180XA1 *board=NULL;
gallonm 19:394c9a4a3046 33 MeasureData_t data_sensor_top;
gallonm 27:2afb9baf718f 34 OperatingMode operating_mode, prev_operating_mode;
gallonm 11:657dbe7bf245 35
gallonm 15:b94bc967fecd 36 /* flags that handle interrupt request */
gallonm 19:394c9a4a3046 37 bool flag_sensor_top=false, flag_stop_measure=false;
gallonm 15:b94bc967fecd 38
gallonm 19:394c9a4a3046 39 /* callback function of the sensor_top */
gallonm 15:b94bc967fecd 40 void SensorTopIRQ(void)
gallonm 9:1d0e839edee8 41 {
gallonm 11:657dbe7bf245 42 flag_sensor_top=true;
gallonm 14:946e62f44f4f 43 board->sensor_top->DisableInterruptMeasureDetectionIRQ();
gallonm 9:1d0e839edee8 44 }
gallonm 9:1d0e839edee8 45
gallonm 19:394c9a4a3046 46 /* callback function of the user button to stop program */
gallonm 15:b94bc967fecd 47 void StopMeasureIRQ(void)
gallonm 15:b94bc967fecd 48 {
gallonm 15:b94bc967fecd 49 flag_stop_measure=true;
gallonm 15:b94bc967fecd 50 }
gallonm 14:946e62f44f4f 51
gallonm 19:394c9a4a3046 52 void DisplayRefresh(OperatingMode op_mode)
gallonm 27:2afb9baf718f 53 {
gallonm 25:2c4710283e02 54 char str[5];
gallonm 19:394c9a4a3046 55
gallonm 19:394c9a4a3046 56 if(op_mode==range_continuous_interrupt)
gallonm 19:394c9a4a3046 57 {
gallonm 19:394c9a4a3046 58 if(data_sensor_top.range_mm!=0xFFFFFFFF)
gallonm 19:394c9a4a3046 59 {
gallonm 19:394c9a4a3046 60 sprintf(str,"%d",data_sensor_top.range_mm);
gallonm 19:394c9a4a3046 61 board->display->DisplayString(str, strlen(str));
gallonm 19:394c9a4a3046 62 }
gallonm 24:018a59122fe3 63 else
gallonm 22:bb440c864489 64 {
gallonm 25:2c4710283e02 65 sprintf(str,"%s","----");
gallonm 22:bb440c864489 66 board->display->DisplayString(str, strlen(str));
gallonm 24:018a59122fe3 67 }
gallonm 19:394c9a4a3046 68 }
gallonm 19:394c9a4a3046 69 else if(op_mode==als_continuous_interrupt)
gallonm 19:394c9a4a3046 70 {
gallonm 19:394c9a4a3046 71 if(data_sensor_top.lux!=0xFFFFFFFF)
gallonm 19:394c9a4a3046 72 {
gallonm 19:394c9a4a3046 73 sprintf(str,"%d",data_sensor_top.lux);
gallonm 19:394c9a4a3046 74 board->display->DisplayString(str, strlen(str));
gallonm 19:394c9a4a3046 75 }
gallonm 24:018a59122fe3 76 else
gallonm 22:bb440c864489 77 {
gallonm 25:2c4710283e02 78 sprintf(str,"%s","----");
gallonm 22:bb440c864489 79 board->display->DisplayString(str, strlen(str));
gallonm 24:018a59122fe3 80 }
gallonm 19:394c9a4a3046 81 }
gallonm 19:394c9a4a3046 82 }
gallonm 19:394c9a4a3046 83
gallonm 27:2afb9baf718f 84 OperatingMode CheckSlider(int measure)
gallonm 27:2afb9baf718f 85 {
gallonm 27:2afb9baf718f 86 if(measure==RANGE)
gallonm 27:2afb9baf718f 87 return range_continuous_interrupt;
gallonm 27:2afb9baf718f 88 else if(measure==ALS)
gallonm 27:2afb9baf718f 89 return als_continuous_interrupt;
gallonm 27:2afb9baf718f 90 }
gallonm 27:2afb9baf718f 91
gallonm 27:2afb9baf718f 92 void StartPrintMessage(OperatingMode op_mode)
gallonm 27:2afb9baf718f 93 {
gallonm 27:2afb9baf718f 94 if(op_mode==range_continuous_interrupt)
gallonm 27:2afb9baf718f 95 printf("\nStarted range continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 96 else if(prev_operating_mode==als_continuous_interrupt)
gallonm 27:2afb9baf718f 97 printf("\nStarted als continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 98 }
gallonm 27:2afb9baf718f 99
gallonm 27:2afb9baf718f 100 void StopPrintMessage(OperatingMode op_mode)
gallonm 27:2afb9baf718f 101 {
gallonm 27:2afb9baf718f 102 if(op_mode==range_continuous_interrupt)
gallonm 27:2afb9baf718f 103 printf("Stopped range continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 104 else if(prev_operating_mode==als_continuous_interrupt)
gallonm 27:2afb9baf718f 105 printf("Stopped als continuous interrupt measure\n\r");
gallonm 27:2afb9baf718f 106 }
gallonm 27:2afb9baf718f 107
gallonm 27:2afb9baf718f 108 void Bye()
gallonm 27:2afb9baf718f 109 {
gallonm 27:2afb9baf718f 110 int i;
gallonm 27:2afb9baf718f 111 char str[5];
gallonm 27:2afb9baf718f 112
gallonm 27:2afb9baf718f 113 for(i=0;i<200;i++)
gallonm 27:2afb9baf718f 114 {
gallonm 27:2afb9baf718f 115 sprintf(str,"%s","BYE");
gallonm 27:2afb9baf718f 116 board->display->DisplayString(str, strlen(str));
gallonm 27:2afb9baf718f 117 }
gallonm 27:2afb9baf718f 118 }
gallonm 27:2afb9baf718f 119
gallonm 4:ccd62fd7e137 120 int main()
gallonm 5:fa65d931bd96 121 {
gallonm 27:2afb9baf718f 122 DevI2C device_i2c(VL6180X_I2C_SDA, VL6180X_I2C_SCL);
gallonm 27:2afb9baf718f 123 board=X_NUCLEO_6180XA1::Instance(&device_i2c);
gallonm 19:394c9a4a3046 124 /* user button used to stop measurements in interrupt mode */
gallonm 19:394c9a4a3046 125 InterruptIn stop_button(USER_BUTTON);
gallonm 19:394c9a4a3046 126 STMPE1600DigiIn measure_type(device_i2c, GPIO_11);
gallonm 26:e19e6cb2e6bb 127 int status, measure;
gallonm 19:394c9a4a3046 128
gallonm 24:018a59122fe3 129 //device_i2c.frequency(400000); //change i2c frequncy from 100kHz to 400kHz
gallonm 19:394c9a4a3046 130 pc.baud(115200); //change the printf baudrate
gallonm 14:946e62f44f4f 131
gallonm 10:5319abadb31e 132 status=board->InitBoard();
gallonm 14:946e62f44f4f 133 if(status)
gallonm 27:2afb9baf718f 134 printf("Failed to init board!\n\r");
gallonm 19:394c9a4a3046 135
gallonm 15:b94bc967fecd 136 stop_button.rise(&StopMeasureIRQ);
gallonm 19:394c9a4a3046 137 measure=measure_type;
gallonm 27:2afb9baf718f 138 operating_mode=CheckSlider(measure);
gallonm 20:b2e0b41a0e6b 139 status=board->sensor_top->StartMeasurement(operating_mode, SensorTopIRQ, NULL, NULL);
gallonm 14:946e62f44f4f 140 if(!status)
gallonm 14:946e62f44f4f 141 {
gallonm 27:2afb9baf718f 142 prev_operating_mode=operating_mode;
gallonm 27:2afb9baf718f 143 StartPrintMessage(operating_mode);
gallonm 14:946e62f44f4f 144 while(1)
gallonm 14:946e62f44f4f 145 {
gallonm 14:946e62f44f4f 146 if(flag_sensor_top)
gallonm 14:946e62f44f4f 147 {
gallonm 14:946e62f44f4f 148 flag_sensor_top=false;
gallonm 19:394c9a4a3046 149 status=board->sensor_top->HandleIRQ(operating_mode, &data_sensor_top);
gallonm 22:bb440c864489 150 DisplayRefresh(operating_mode);
gallonm 14:946e62f44f4f 151 }
gallonm 15:b94bc967fecd 152 if(flag_stop_measure)
gallonm 19:394c9a4a3046 153 {
gallonm 19:394c9a4a3046 154 status=board->sensor_top->StopMeasurement(prev_operating_mode);
gallonm 27:2afb9baf718f 155 if(!status)
gallonm 27:2afb9baf718f 156 StopPrintMessage(prev_operating_mode);
gallonm 19:394c9a4a3046 157 printf("\nProgram stopped!\n\n\r");
gallonm 19:394c9a4a3046 158 break;
gallonm 19:394c9a4a3046 159 }
gallonm 19:394c9a4a3046 160 measure=measure_type;
gallonm 27:2afb9baf718f 161 operating_mode=CheckSlider(measure);
gallonm 19:394c9a4a3046 162 if(operating_mode!=prev_operating_mode)
gallonm 14:946e62f44f4f 163 {
gallonm 19:394c9a4a3046 164 DisplayRefresh(prev_operating_mode);
gallonm 19:394c9a4a3046 165 status=board->sensor_top->StopMeasurement(prev_operating_mode);
gallonm 27:2afb9baf718f 166 if(!status)
gallonm 27:2afb9baf718f 167 StopPrintMessage(prev_operating_mode);
gallonm 19:394c9a4a3046 168 prev_operating_mode=operating_mode;
gallonm 20:b2e0b41a0e6b 169 status=board->sensor_top->StartMeasurement(operating_mode, SensorTopIRQ, NULL, NULL);
gallonm 27:2afb9baf718f 170 if(!status)
gallonm 27:2afb9baf718f 171 StartPrintMessage(operating_mode);
gallonm 19:394c9a4a3046 172 }
gallonm 19:394c9a4a3046 173 else
gallonm 19:394c9a4a3046 174 DisplayRefresh(operating_mode);
gallonm 14:946e62f44f4f 175 }
gallonm 14:946e62f44f4f 176 }
gallonm 27:2afb9baf718f 177 Bye();
gallonm 10:5319abadb31e 178
gallonm 20:b2e0b41a0e6b 179 delete board;
gallonm 4:ccd62fd7e137 180 }
gallonm 5:fa65d931bd96 181