Sample Program for Maker Faire Tokyo 2017
Dependencies: X_NUCLEO_6180XA1 mbed
Fork of HelloWorld_6180XA1 by
main.cpp@27:2afb9baf718f, 2015-11-05 (annotated)
- 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?
User | Revision | Line number | New 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 |