Rick McConney
/
stripReader
Proximity strip reader
Fork of StarterKit by
main.cpp@44:60008ebffdd4, 2016-10-26 (annotated)
- Committer:
- elmkom
- Date:
- Wed Oct 26 18:40:40 2016 +0000
- Revision:
- 44:60008ebffdd4
- Parent:
- 42:8500f0cb2ea5
- Child:
- 45:fe90f1fcb4e0
Gsma version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JMF | 0:9d5134074d84 | 1 | #include "mbed.h" |
JMF | 0:9d5134074d84 | 2 | #include <cctype> |
JMF | 0:9d5134074d84 | 3 | #include <string> |
JMF | 0:9d5134074d84 | 4 | #include "SerialBuffered.h" |
JMF | 0:9d5134074d84 | 5 | #include "HTS221.h" |
JMF | 2:0e2ef866af95 | 6 | #include "config_me.h" |
stefanrousseau | 4:f83bedd9cab4 | 7 | #include "sensors.h" |
elmkom | 38:532a0d929756 | 8 | #include "Proximity.h" |
elmkom | 42:8500f0cb2ea5 | 9 | #include "Wnc.h" |
JMF | 0:9d5134074d84 | 10 | |
stefanrousseau | 11:e6602513730f | 11 | #include "hardware.h" |
elmkom | 44:60008ebffdd4 | 12 | #include "att160826.h" |
elmkom | 42:8500f0cb2ea5 | 13 | |
elmkom | 42:8500f0cb2ea5 | 14 | extern SerialBuffered mdm; |
elmkom | 42:8500f0cb2ea5 | 15 | Wnc wnc; |
elmkom | 42:8500f0cb2ea5 | 16 | |
stefanrousseau | 11:e6602513730f | 17 | I2C i2c(PTC11, PTC10); //SDA, SCL -- define the I2C pins being used |
elmkom | 44:60008ebffdd4 | 18 | I2C *myi2c; |
elmkom | 41:85a736a9b900 | 19 | |
elmkom | 42:8500f0cb2ea5 | 20 | #define PROXIMITYON 1 |
elmkom | 41:85a736a9b900 | 21 | |
elmkom | 41:85a736a9b900 | 22 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 23 | att160826_data_t strip_data[2]; |
elmkom | 44:60008ebffdd4 | 24 | att160826_data_t last_data[2]; |
elmkom | 44:60008ebffdd4 | 25 | ATT160826 *strips[2]; |
elmkom | 44:60008ebffdd4 | 26 | #elif PROXIMITYON == 2 |
elmkom | 44:60008ebffdd4 | 27 | Proximity proximityStrip[2]; |
elmkom | 41:85a736a9b900 | 28 | #endif |
elmkom | 36:f8d96ff1dd1b | 29 | |
JMF | 0:9d5134074d84 | 30 | // comment out the following line if color is not supported on the terminal |
JMF | 0:9d5134074d84 | 31 | #define USE_COLOR |
JMF | 0:9d5134074d84 | 32 | #ifdef USE_COLOR |
JMF | 0:9d5134074d84 | 33 | #define BLK "\033[30m" |
JMF | 0:9d5134074d84 | 34 | #define RED "\033[31m" |
JMF | 0:9d5134074d84 | 35 | #define GRN "\033[32m" |
JMF | 0:9d5134074d84 | 36 | #define YEL "\033[33m" |
JMF | 0:9d5134074d84 | 37 | #define BLU "\033[34m" |
JMF | 0:9d5134074d84 | 38 | #define MAG "\033[35m" |
JMF | 0:9d5134074d84 | 39 | #define CYN "\033[36m" |
JMF | 0:9d5134074d84 | 40 | #define WHT "\033[37m" |
JMF | 0:9d5134074d84 | 41 | #define DEF "\033[39m" |
JMF | 0:9d5134074d84 | 42 | #else |
JMF | 0:9d5134074d84 | 43 | #define BLK |
JMF | 0:9d5134074d84 | 44 | #define RED |
JMF | 0:9d5134074d84 | 45 | #define GRN |
JMF | 0:9d5134074d84 | 46 | #define YEL |
JMF | 0:9d5134074d84 | 47 | #define BLU |
JMF | 0:9d5134074d84 | 48 | #define MAG |
JMF | 0:9d5134074d84 | 49 | #define CYN |
JMF | 0:9d5134074d84 | 50 | #define WHT |
JMF | 0:9d5134074d84 | 51 | #define DEF |
JMF | 0:9d5134074d84 | 52 | #endif |
JMF | 0:9d5134074d84 | 53 | |
JMF | 0:9d5134074d84 | 54 | #define MDM_DBG_OFF 0 |
JMF | 0:9d5134074d84 | 55 | #define MDM_DBG_AT_CMDS (1 << 0) |
elmkom | 36:f8d96ff1dd1b | 56 | |
elmkom | 44:60008ebffdd4 | 57 | |
elmkom | 44:60008ebffdd4 | 58 | |
elmkom | 36:f8d96ff1dd1b | 59 | |
elmkom | 41:85a736a9b900 | 60 | |
elmkom | 41:85a736a9b900 | 61 | |
elmkom | 42:8500f0cb2ea5 | 62 | |
JMF | 0:9d5134074d84 | 63 | int mdm_dbgmask = MDM_DBG_OFF; |
JMF | 0:9d5134074d84 | 64 | |
JMF | 0:9d5134074d84 | 65 | Serial pc(USBTX, USBRX); |
elmkom | 42:8500f0cb2ea5 | 66 | |
stefanrousseau | 16:17c5916f2d12 | 67 | DigitalOut led_green(LED_GREEN); |
stefanrousseau | 16:17c5916f2d12 | 68 | DigitalOut led_red(LED_RED); |
stefanrousseau | 16:17c5916f2d12 | 69 | DigitalOut led_blue(LED_BLUE); |
JMF | 0:9d5134074d84 | 70 | |
JMF | 0:9d5134074d84 | 71 | |
JMF | 0:9d5134074d84 | 72 | |
elmkom | 41:85a736a9b900 | 73 | |
elmkom | 44:60008ebffdd4 | 74 | |
elmkom | 41:85a736a9b900 | 75 | DigitalIn slot1(PTB3,PullUp); |
elmkom | 41:85a736a9b900 | 76 | DigitalIn slot2(PTB10,PullUp); |
elmkom | 41:85a736a9b900 | 77 | DigitalIn slot3(PTB11,PullUp); |
elmkom | 42:8500f0cb2ea5 | 78 | |
elmkom | 41:85a736a9b900 | 79 | int lastSlot1; |
elmkom | 41:85a736a9b900 | 80 | int lastSlot2; |
elmkom | 41:85a736a9b900 | 81 | int lastSlot3; |
elmkom | 42:8500f0cb2ea5 | 82 | char *iccid; |
JMF | 0:9d5134074d84 | 83 | #define TOUPPER(a) (a) //toupper(a) |
JMF | 0:9d5134074d84 | 84 | |
JMF | 0:9d5134074d84 | 85 | |
JMF | 0:9d5134074d84 | 86 | #define MDM_OK 0 |
JMF | 0:9d5134074d84 | 87 | #define MDM_ERR_TIMEOUT -1 |
JMF | 0:9d5134074d84 | 88 | |
JMF | 0:9d5134074d84 | 89 | #define MAX_AT_RSP_LEN 255 |
elmkom | 38:532a0d929756 | 90 | |
elmkom | 41:85a736a9b900 | 91 | bool toggleLed = false; |
elmkom | 41:85a736a9b900 | 92 | int seqNum; |
elmkom | 36:f8d96ff1dd1b | 93 | |
elmkom | 38:532a0d929756 | 94 | |
elmkom | 36:f8d96ff1dd1b | 95 | //******************************************************************************************************************************************** |
elmkom | 36:f8d96ff1dd1b | 96 | //* Set the RGB LED's Color |
elmkom | 36:f8d96ff1dd1b | 97 | //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) |
elmkom | 36:f8d96ff1dd1b | 98 | //******************************************************************************************************************************************** |
elmkom | 36:f8d96ff1dd1b | 99 | void SetLedColor(unsigned char ucColor) |
elmkom | 35:2e864bae3af0 | 100 | { |
elmkom | 42:8500f0cb2ea5 | 101 | if(wnc.isPowerSaveOn()) |
elmkom | 38:532a0d929756 | 102 | { |
elmkom | 38:532a0d929756 | 103 | led_red = !0; |
elmkom | 38:532a0d929756 | 104 | led_green = !0; |
elmkom | 42:8500f0cb2ea5 | 105 | led_blue = !(ucColor & 0x4); |
elmkom | 38:532a0d929756 | 106 | } |
elmkom | 38:532a0d929756 | 107 | else |
elmkom | 38:532a0d929756 | 108 | { |
elmkom | 38:532a0d929756 | 109 | //Note that when an LED is on, you write a 0 to it: |
elmkom | 38:532a0d929756 | 110 | led_red = !(ucColor & 0x1); //bit 0 |
elmkom | 38:532a0d929756 | 111 | led_green = !(ucColor & 0x2); //bit 1 |
elmkom | 38:532a0d929756 | 112 | led_blue = !(ucColor & 0x4); //bit 2 |
elmkom | 38:532a0d929756 | 113 | } |
elmkom | 36:f8d96ff1dd1b | 114 | } //SetLedColor() |
elmkom | 35:2e864bae3af0 | 115 | |
JMF | 0:9d5134074d84 | 116 | |
elmkom | 36:f8d96ff1dd1b | 117 | void system_reset() |
elmkom | 36:f8d96ff1dd1b | 118 | { |
elmkom | 36:f8d96ff1dd1b | 119 | printf(RED "\n\rSystem resetting..." DEF "\n"); |
elmkom | 36:f8d96ff1dd1b | 120 | NVIC_SystemReset(); |
elmkom | 36:f8d96ff1dd1b | 121 | } |
elmkom | 42:8500f0cb2ea5 | 122 | |
JMF | 2:0e2ef866af95 | 123 | // These are built on the fly |
JMF | 2:0e2ef866af95 | 124 | string MyServerIpAddress; |
JMF | 2:0e2ef866af95 | 125 | string MySocketData; |
JMF | 2:0e2ef866af95 | 126 | |
JMF | 2:0e2ef866af95 | 127 | // These are to be built on the fly |
JMF | 2:0e2ef866af95 | 128 | string my_temp; |
JMF | 2:0e2ef866af95 | 129 | string my_humidity; |
JMF | 2:0e2ef866af95 | 130 | |
JMF | 0:9d5134074d84 | 131 | #define CTOF(x) ((x)*1.8+32) |
JMF | 0:9d5134074d84 | 132 | |
stefanrousseau | 3:26b3cc155f39 | 133 | //******************************************************************************************************************************************** |
stefanrousseau | 12:7c94ec5069dc | 134 | //* Create string with sensor readings that can be sent to flow as an HTTP get |
stefanrousseau | 3:26b3cc155f39 | 135 | //******************************************************************************************************************************************** |
stefanrousseau | 12:7c94ec5069dc | 136 | K64F_Sensors_t SENSOR_DATA = |
stefanrousseau | 3:26b3cc155f39 | 137 | { |
stefanrousseau | 12:7c94ec5069dc | 138 | .Temperature = "0", |
stefanrousseau | 12:7c94ec5069dc | 139 | .Humidity = "0", |
stefanrousseau | 12:7c94ec5069dc | 140 | .AccelX = "0", |
stefanrousseau | 12:7c94ec5069dc | 141 | .AccelY = "0", |
stefanrousseau | 12:7c94ec5069dc | 142 | .AccelZ = "0", |
stefanrousseau | 12:7c94ec5069dc | 143 | .MagnetometerX = "0", |
stefanrousseau | 12:7c94ec5069dc | 144 | .MagnetometerY = "0", |
stefanrousseau | 12:7c94ec5069dc | 145 | .MagnetometerZ = "0", |
stefanrousseau | 12:7c94ec5069dc | 146 | .AmbientLightVis = "0", |
stefanrousseau | 12:7c94ec5069dc | 147 | .AmbientLightIr = "0", |
stefanrousseau | 12:7c94ec5069dc | 148 | .UVindex = "0", |
stefanrousseau | 12:7c94ec5069dc | 149 | .Proximity = "0", |
stefanrousseau | 12:7c94ec5069dc | 150 | .Temperature_Si7020 = "0", |
stefanrousseau | 12:7c94ec5069dc | 151 | .Humidity_Si7020 = "0" |
stefanrousseau | 3:26b3cc155f39 | 152 | }; |
stefanrousseau | 12:7c94ec5069dc | 153 | |
elmkom | 44:60008ebffdd4 | 154 | |
elmkom | 44:60008ebffdd4 | 155 | |
elmkom | 44:60008ebffdd4 | 156 | void GenerateModemString(char * modem_string,int sensor,int strip) |
stefanrousseau | 3:26b3cc155f39 | 157 | { |
elmkom | 41:85a736a9b900 | 158 | switch(sensor) |
stefanrousseau | 12:7c94ec5069dc | 159 | { |
elmkom | 41:85a736a9b900 | 160 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 161 | |
elmkom | 44:60008ebffdd4 | 162 | case PROXIMITY_ONLY: |
elmkom | 44:60008ebffdd4 | 163 | { |
elmkom | 44:60008ebffdd4 | 164 | if(strip == -1) |
elmkom | 44:60008ebffdd4 | 165 | { |
elmkom | 44:60008ebffdd4 | 166 | seqNum++; |
elmkom | 44:60008ebffdd4 | 167 | sprintf(modem_string, "GET %s%s?ver=cat1&strip=%d&serial=%s&seq=%d&psm=%d&T=%d&t=%d %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", strip, iccid, seqNum, wnc.isPowerSaveOn(),wnc.gett3412Timer(),wnc.gett3324Timer(),FLOW_URL_TYPE, MY_SERVER_URL); |
elmkom | 44:60008ebffdd4 | 168 | break; |
elmkom | 44:60008ebffdd4 | 169 | } |
elmkom | 44:60008ebffdd4 | 170 | int stripIndex = 0; |
elmkom | 44:60008ebffdd4 | 171 | if(strip == 3) |
elmkom | 44:60008ebffdd4 | 172 | stripIndex = 1; |
elmkom | 44:60008ebffdd4 | 173 | char data[256]; |
elmkom | 44:60008ebffdd4 | 174 | int i=0; |
elmkom | 44:60008ebffdd4 | 175 | int index = 0; |
elmkom | 44:60008ebffdd4 | 176 | index += sprintf(&data[index],"["); |
elmkom | 44:60008ebffdd4 | 177 | for (i=1; i<SENSORS_PER_STRIP; i++) |
elmkom | 44:60008ebffdd4 | 178 | { |
elmkom | 44:60008ebffdd4 | 179 | short p = last_data[stripIndex].sensor[i].sample.prox; |
elmkom | 44:60008ebffdd4 | 180 | short l = last_data[stripIndex].sensor[i].sample.als_vis; |
elmkom | 44:60008ebffdd4 | 181 | short r = last_data[stripIndex].sensor[i].sample.als_ir; |
elmkom | 44:60008ebffdd4 | 182 | if(i<SENSORS_PER_STRIP-1) |
elmkom | 44:60008ebffdd4 | 183 | index += snprintf(&data[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d},", i,p,l,r); |
elmkom | 44:60008ebffdd4 | 184 | else |
elmkom | 44:60008ebffdd4 | 185 | index += snprintf(&data[index], 128, "{\"s\":%d,\"p\":%d,\"l\":%d,\"r\":%d}]", i,p,l,r); |
elmkom | 44:60008ebffdd4 | 186 | |
elmkom | 44:60008ebffdd4 | 187 | } |
elmkom | 44:60008ebffdd4 | 188 | |
elmkom | 44:60008ebffdd4 | 189 | |
elmkom | 44:60008ebffdd4 | 190 | seqNum++; |
elmkom | 44:60008ebffdd4 | 191 | sprintf(modem_string, "GET %s%s?ver=cat1&strip=%d&serial=%s&seq=%d&psm=%d&T=%d&t=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", strip, iccid, seqNum, wnc.isPowerSaveOn(),wnc.gett3412Timer(),wnc.gett3324Timer(), data, FLOW_URL_TYPE, MY_SERVER_URL); |
elmkom | 44:60008ebffdd4 | 192 | break; |
elmkom | 44:60008ebffdd4 | 193 | } |
elmkom | 44:60008ebffdd4 | 194 | #elif PROXIMITYON == 2 |
elmkom | 38:532a0d929756 | 195 | case PROXIMITY_ONLY: |
elmkom | 35:2e864bae3af0 | 196 | { |
elmkom | 41:85a736a9b900 | 197 | |
elmkom | 44:60008ebffdd4 | 198 | char* data0 = proximityStrip[0].getDataStr(); |
elmkom | 44:60008ebffdd4 | 199 | char* data1 = proximityStrip[1].getDataStr(); |
elmkom | 41:85a736a9b900 | 200 | seqNum++; |
elmkom | 44:60008ebffdd4 | 201 | sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s&data1=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/shelf", iccid, seqNum, data0,data1, FLOW_URL_TYPE, MY_SERVER_URL); |
elmkom | 41:85a736a9b900 | 202 | break; |
elmkom | 41:85a736a9b900 | 203 | } |
elmkom | 41:85a736a9b900 | 204 | #endif |
elmkom | 41:85a736a9b900 | 205 | case SWITCH_ONLY: |
elmkom | 41:85a736a9b900 | 206 | { |
elmkom | 41:85a736a9b900 | 207 | char data[32]; |
elmkom | 41:85a736a9b900 | 208 | sprintf(data,"[{\"p\":%d},{\"p\":%d},{\"p\":%d}]",lastSlot1*26,lastSlot2*26,lastSlot3*26); |
elmkom | 41:85a736a9b900 | 209 | seqNum++; |
elmkom | 42:8500f0cb2ea5 | 210 | sprintf(modem_string, "GET %s%s?serial=%s&seq=%d&data=%s %s%s\r\n\r\n", FLOW_BASE_URL, "/car", iccid, seqNum, data, FLOW_URL_TYPE, MY_SERVER_URL); |
elmkom | 35:2e864bae3af0 | 211 | break; |
elmkom | 35:2e864bae3af0 | 212 | } |
stefanrousseau | 12:7c94ec5069dc | 213 | case TEMP_HUMIDITY_ONLY: |
stefanrousseau | 12:7c94ec5069dc | 214 | { |
stefanrousseau | 12:7c94ec5069dc | 215 | sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, FLOW_URL_TYPE, MY_SERVER_URL); |
stefanrousseau | 12:7c94ec5069dc | 216 | break; |
stefanrousseau | 12:7c94ec5069dc | 217 | } |
stefanrousseau | 12:7c94ec5069dc | 218 | case TEMP_HUMIDITY_ACCELEROMETER: |
stefanrousseau | 12:7c94ec5069dc | 219 | { |
stefanrousseau | 12:7c94ec5069dc | 220 | sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&accelX=%s&accelY=%s&accelZ=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, SENSOR_DATA.AccelX,SENSOR_DATA.AccelY,SENSOR_DATA.AccelZ, FLOW_URL_TYPE, MY_SERVER_URL); |
stefanrousseau | 12:7c94ec5069dc | 221 | break; |
stefanrousseau | 12:7c94ec5069dc | 222 | } |
stefanrousseau | 12:7c94ec5069dc | 223 | case TEMP_HUMIDITY_ACCELEROMETER_PMODSENSORS: |
stefanrousseau | 12:7c94ec5069dc | 224 | { |
stefanrousseau | 12:7c94ec5069dc | 225 | sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&accelX=%s&accelY=%s&accelZ=%s&proximity=%s&light_uv=%s&light_vis=%s&light_ir=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, SENSOR_DATA.AccelX,SENSOR_DATA.AccelY,SENSOR_DATA.AccelZ, SENSOR_DATA.Proximity, SENSOR_DATA.UVindex, SENSOR_DATA.AmbientLightVis, SENSOR_DATA.AmbientLightIr, FLOW_URL_TYPE, MY_SERVER_URL); |
stefanrousseau | 12:7c94ec5069dc | 226 | break; |
stefanrousseau | 12:7c94ec5069dc | 227 | } |
stefanrousseau | 12:7c94ec5069dc | 228 | default: |
stefanrousseau | 12:7c94ec5069dc | 229 | { |
stefanrousseau | 12:7c94ec5069dc | 230 | sprintf(modem_string, "Invalid sensor selected\r\n\r\n"); |
stefanrousseau | 12:7c94ec5069dc | 231 | break; |
stefanrousseau | 12:7c94ec5069dc | 232 | } |
stefanrousseau | 16:17c5916f2d12 | 233 | } //switch(iSensorsToReport) |
stefanrousseau | 3:26b3cc155f39 | 234 | } //GenerateModemString |
stefanrousseau | 3:26b3cc155f39 | 235 | |
stefanrousseau | 3:26b3cc155f39 | 236 | |
stefanrousseau | 16:17c5916f2d12 | 237 | //******************************************************************************************************************************************** |
stefanrousseau | 16:17c5916f2d12 | 238 | //* Process JSON response messages |
stefanrousseau | 16:17c5916f2d12 | 239 | //******************************************************************************************************************************************** |
elmkom | 40:45e4636d20cc | 240 | bool extract_reply(char* search_field, char* found_string) |
stefanrousseau | 16:17c5916f2d12 | 241 | { |
stefanrousseau | 16:17c5916f2d12 | 242 | char* beginquote; |
stefanrousseau | 16:17c5916f2d12 | 243 | char* endquote; |
elmkom | 40:45e4636d20cc | 244 | beginquote = strstr(search_field, "\r\n\r\n"); //start of data |
elmkom | 40:45e4636d20cc | 245 | endquote = strchr(search_field, '\0'); |
stefanrousseau | 16:17c5916f2d12 | 246 | if (beginquote != 0) |
stefanrousseau | 16:17c5916f2d12 | 247 | { |
stefanrousseau | 16:17c5916f2d12 | 248 | uint16_t ifoundlen; |
stefanrousseau | 16:17c5916f2d12 | 249 | if (endquote != 0) |
stefanrousseau | 16:17c5916f2d12 | 250 | { |
stefanrousseau | 16:17c5916f2d12 | 251 | ifoundlen = (uint16_t) (endquote - beginquote) + 1; |
stefanrousseau | 16:17c5916f2d12 | 252 | strncpy(found_string, beginquote, ifoundlen ); |
stefanrousseau | 16:17c5916f2d12 | 253 | found_string[ifoundlen] = 0; //null terminate |
stefanrousseau | 16:17c5916f2d12 | 254 | return true; |
stefanrousseau | 16:17c5916f2d12 | 255 | } |
stefanrousseau | 16:17c5916f2d12 | 256 | } |
elmkom | 40:45e4636d20cc | 257 | |
elmkom | 40:45e4636d20cc | 258 | return false; |
elmkom | 40:45e4636d20cc | 259 | |
elmkom | 40:45e4636d20cc | 260 | } //extract_reply |
stefanrousseau | 16:17c5916f2d12 | 261 | |
elmkom | 40:45e4636d20cc | 262 | |
elmkom | 40:45e4636d20cc | 263 | void parse_reply(char* reply) |
elmkom | 40:45e4636d20cc | 264 | { |
elmkom | 40:45e4636d20cc | 265 | char *tokens[5]; |
elmkom | 40:45e4636d20cc | 266 | int index = 0; |
elmkom | 40:45e4636d20cc | 267 | tokens[index++] = strtok(reply," "); |
elmkom | 40:45e4636d20cc | 268 | while( index < 5 ) |
elmkom | 40:45e4636d20cc | 269 | { |
elmkom | 40:45e4636d20cc | 270 | char* token = strtok(NULL, " "); |
elmkom | 40:45e4636d20cc | 271 | if(token == NULL) break; |
elmkom | 40:45e4636d20cc | 272 | tokens[index++] = token; |
elmkom | 40:45e4636d20cc | 273 | } |
elmkom | 40:45e4636d20cc | 274 | if(strcmp("PSM",tokens[1]) == 0) |
elmkom | 40:45e4636d20cc | 275 | { |
elmkom | 40:45e4636d20cc | 276 | |
elmkom | 40:45e4636d20cc | 277 | int t3412 = atoi(tokens[3]); |
elmkom | 40:45e4636d20cc | 278 | int t3324 = atoi(tokens[4]); |
elmkom | 40:45e4636d20cc | 279 | pc.printf("t3412 %d t3324 %d\r\n",t3412,t3324); |
elmkom | 42:8500f0cb2ea5 | 280 | // setTauTimer(t3412); |
elmkom | 42:8500f0cb2ea5 | 281 | //setActivityTimer(t3324); |
elmkom | 40:45e4636d20cc | 282 | |
elmkom | 40:45e4636d20cc | 283 | if(strcmp("true",tokens[2]) == 0) |
elmkom | 40:45e4636d20cc | 284 | { |
elmkom | 40:45e4636d20cc | 285 | pc.printf("PSM ON\r\n"); |
elmkom | 42:8500f0cb2ea5 | 286 | wnc.setPowerSave(true,t3412,t3324); |
elmkom | 40:45e4636d20cc | 287 | } |
elmkom | 40:45e4636d20cc | 288 | else |
elmkom | 40:45e4636d20cc | 289 | { |
elmkom | 40:45e4636d20cc | 290 | pc.printf("PSM OFF\r\n"); |
elmkom | 42:8500f0cb2ea5 | 291 | wnc.setPowerSave(false,t3412,t3324); |
elmkom | 40:45e4636d20cc | 292 | } |
elmkom | 40:45e4636d20cc | 293 | } |
elmkom | 40:45e4636d20cc | 294 | } |
stefanrousseau | 16:17c5916f2d12 | 295 | |
elmkom | 41:85a736a9b900 | 296 | bool checkSlots() |
elmkom | 41:85a736a9b900 | 297 | { |
elmkom | 41:85a736a9b900 | 298 | bool changed = false; |
elmkom | 41:85a736a9b900 | 299 | int s1 = !slot1; |
elmkom | 41:85a736a9b900 | 300 | int s2 = !slot2; |
elmkom | 41:85a736a9b900 | 301 | int s3 = !slot3; |
elmkom | 41:85a736a9b900 | 302 | if(lastSlot1 != s1 || lastSlot2 != s2 ||lastSlot3 != s3) |
elmkom | 41:85a736a9b900 | 303 | { |
elmkom | 41:85a736a9b900 | 304 | pc.printf("slot 1 %d\r\n",s1); |
elmkom | 41:85a736a9b900 | 305 | pc.printf("slot 2 %d\r\n",s2); |
elmkom | 41:85a736a9b900 | 306 | pc.printf("slot 3 %d\r\n",s3); |
elmkom | 41:85a736a9b900 | 307 | changed = true; |
elmkom | 41:85a736a9b900 | 308 | } |
elmkom | 41:85a736a9b900 | 309 | lastSlot1 = s1; |
elmkom | 41:85a736a9b900 | 310 | lastSlot2 = s2; |
elmkom | 41:85a736a9b900 | 311 | lastSlot3 = s3; |
elmkom | 41:85a736a9b900 | 312 | return changed; |
elmkom | 41:85a736a9b900 | 313 | } |
elmkom | 44:60008ebffdd4 | 314 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 315 | bool scanStrip(int id) |
elmkom | 44:60008ebffdd4 | 316 | { |
elmkom | 44:60008ebffdd4 | 317 | bool stripChanged = false; |
elmkom | 44:60008ebffdd4 | 318 | ATT160826& strip = *strips[id]; |
elmkom | 44:60008ebffdd4 | 319 | att160826_data_t *data = &strip_data[id]; |
elmkom | 44:60008ebffdd4 | 320 | bool ok = strip.scan(data); |
elmkom | 44:60008ebffdd4 | 321 | |
elmkom | 44:60008ebffdd4 | 322 | if(ok) |
elmkom | 44:60008ebffdd4 | 323 | { |
elmkom | 44:60008ebffdd4 | 324 | // printf("%d\r\n",id); |
elmkom | 44:60008ebffdd4 | 325 | for (int i = 1; i < SENSORS_PER_STRIP;i++) { // ignore first sensor it is blocked |
elmkom | 44:60008ebffdd4 | 326 | |
elmkom | 44:60008ebffdd4 | 327 | /* |
elmkom | 44:60008ebffdd4 | 328 | if (strip_data[id].sensor[i].present) { |
elmkom | 44:60008ebffdd4 | 329 | printf(" %3d", strip_data[id].sensor[i].sample.prox); |
elmkom | 44:60008ebffdd4 | 330 | } else { |
elmkom | 44:60008ebffdd4 | 331 | printf(" %3s", "---"); |
elmkom | 44:60008ebffdd4 | 332 | } |
elmkom | 44:60008ebffdd4 | 333 | */ |
elmkom | 44:60008ebffdd4 | 334 | if (strip_data[id].sensor[i].present) { |
elmkom | 44:60008ebffdd4 | 335 | |
elmkom | 44:60008ebffdd4 | 336 | if (abs(last_data[id].sensor[i].sample.prox - strip_data[id].sensor[i].sample.prox) > 50) |
elmkom | 44:60008ebffdd4 | 337 | { |
elmkom | 44:60008ebffdd4 | 338 | stripChanged = true; |
elmkom | 44:60008ebffdd4 | 339 | last_data[id].sensor[i].sample.prox = strip_data[id].sensor[i].sample.prox; |
elmkom | 44:60008ebffdd4 | 340 | last_data[id].sensor[i].sample.als_vis = strip_data[id].sensor[i].sample.als_vis; |
elmkom | 44:60008ebffdd4 | 341 | last_data[id].sensor[i].sample.als_ir = strip_data[id].sensor[i].sample.als_ir; |
elmkom | 44:60008ebffdd4 | 342 | } |
elmkom | 44:60008ebffdd4 | 343 | |
elmkom | 44:60008ebffdd4 | 344 | } |
elmkom | 44:60008ebffdd4 | 345 | } |
elmkom | 44:60008ebffdd4 | 346 | // printf("\r\n"); |
elmkom | 44:60008ebffdd4 | 347 | } |
elmkom | 44:60008ebffdd4 | 348 | else |
elmkom | 44:60008ebffdd4 | 349 | printf("scan of strip %d failed",id); |
elmkom | 44:60008ebffdd4 | 350 | return stripChanged; |
elmkom | 44:60008ebffdd4 | 351 | } |
elmkom | 44:60008ebffdd4 | 352 | #endif |
elmkom | 41:85a736a9b900 | 353 | |
JMF | 0:9d5134074d84 | 354 | int main() { |
elmkom | 36:f8d96ff1dd1b | 355 | |
JMF | 2:0e2ef866af95 | 356 | int i; |
elmkom | 41:85a736a9b900 | 357 | |
JMF | 0:9d5134074d84 | 358 | HTS221 hts221; |
JMF | 0:9d5134074d84 | 359 | pc.baud(115200); |
elmkom | 42:8500f0cb2ea5 | 360 | |
JMF | 0:9d5134074d84 | 361 | void hts221_init(void); |
JMF | 0:9d5134074d84 | 362 | |
fkellermavnet | 20:27a4f27254d0 | 363 | // Set LED to RED until init finishes |
fkellermavnet | 20:27a4f27254d0 | 364 | SetLedColor(0x1); |
fkellermavnet | 20:27a4f27254d0 | 365 | |
JMF | 1:af7a42f7d465 | 366 | pc.printf(BLU "Hello World from AT&T Shape!\r\n\n\r"); |
JMF | 0:9d5134074d84 | 367 | pc.printf(GRN "Initialize the HTS221\n\r"); |
JMF | 0:9d5134074d84 | 368 | |
JMF | 0:9d5134074d84 | 369 | i = hts221.begin(); |
JMF | 0:9d5134074d84 | 370 | if( i ) |
JMF | 0:9d5134074d84 | 371 | pc.printf(BLU "HTS221 Detected! (0x%02X)\n\r",i); |
JMF | 0:9d5134074d84 | 372 | else |
JMF | 0:9d5134074d84 | 373 | pc.printf(RED "HTS221 NOT DETECTED!!\n\r"); |
JMF | 0:9d5134074d84 | 374 | |
JMF | 0:9d5134074d84 | 375 | printf("Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature())); |
JMF | 0:9d5134074d84 | 376 | printf("Humid is: %02d %%\n\r",hts221.readHumidity()); |
elmkom | 35:2e864bae3af0 | 377 | |
stefanrousseau | 11:e6602513730f | 378 | |
JMF | 0:9d5134074d84 | 379 | // Initialize the modem |
JMF | 0:9d5134074d84 | 380 | printf(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n"); |
fkellermavnet | 14:0c353e212296 | 381 | do { |
elmkom | 42:8500f0cb2ea5 | 382 | i=wnc.init(); |
fkellermavnet | 14:0c353e212296 | 383 | if (!i) { |
fkellermavnet | 14:0c353e212296 | 384 | pc.printf(RED "Modem initialization failed!" DEF "\n"); |
fkellermavnet | 14:0c353e212296 | 385 | } |
fkellermavnet | 14:0c353e212296 | 386 | } while (!i); |
JMF | 0:9d5134074d84 | 387 | |
elmkom | 42:8500f0cb2ea5 | 388 | // wnc.setIn(); |
elmkom | 44:60008ebffdd4 | 389 | // wnc.send("AT+CPSMS=0",WNC_WAIT_TIME_MS); |
elmkom | 42:8500f0cb2ea5 | 390 | |
elmkom | 44:60008ebffdd4 | 391 | // wnc.toggleWake(); |
elmkom | 42:8500f0cb2ea5 | 392 | |
elmkom | 41:85a736a9b900 | 393 | |
elmkom | 42:8500f0cb2ea5 | 394 | iccid = wnc.getIccid(); |
elmkom | 42:8500f0cb2ea5 | 395 | printf(GRN "ICCID = %s" DEF "\r\n",iccid); |
elmkom | 42:8500f0cb2ea5 | 396 | |
JMF | 2:0e2ef866af95 | 397 | //Software init |
elmkom | 42:8500f0cb2ea5 | 398 | wnc.startInternet(); |
elmkom | 42:8500f0cb2ea5 | 399 | //wnc.ping("108.244.165.22"); |
stefanrousseau | 3:26b3cc155f39 | 400 | |
fkellermavnet | 20:27a4f27254d0 | 401 | // Set LED BLUE for partial init |
fkellermavnet | 20:27a4f27254d0 | 402 | SetLedColor(0x4); |
elmkom | 44:60008ebffdd4 | 403 | |
elmkom | 44:60008ebffdd4 | 404 | wnc.setPowerSave(true,wnc.gett3412Timer(),wnc.gett3324Timer()); |
elmkom | 41:85a736a9b900 | 405 | |
elmkom | 44:60008ebffdd4 | 406 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 407 | bool stripChanged[2]; |
elmkom | 44:60008ebffdd4 | 408 | myi2c = new I2C(PTE25, PTE24); |
elmkom | 44:60008ebffdd4 | 409 | myi2c->frequency(100000); |
elmkom | 44:60008ebffdd4 | 410 | ATT160826 strip0 (myi2c, 0); |
elmkom | 44:60008ebffdd4 | 411 | ATT160826 strip1 (myi2c, 3); |
elmkom | 44:60008ebffdd4 | 412 | strips[0] = &strip0; |
elmkom | 44:60008ebffdd4 | 413 | strips[1] = &strip1; |
elmkom | 44:60008ebffdd4 | 414 | |
elmkom | 44:60008ebffdd4 | 415 | #elif PROXIMITYON == 2 |
elmkom | 44:60008ebffdd4 | 416 | |
elmkom | 44:60008ebffdd4 | 417 | myi2c = new I2C(PTE25, PTE24); |
elmkom | 44:60008ebffdd4 | 418 | myi2c->frequency(100000); |
elmkom | 44:60008ebffdd4 | 419 | Proximity strip0; |
elmkom | 44:60008ebffdd4 | 420 | Proximity strip1; |
elmkom | 44:60008ebffdd4 | 421 | proximityStrip[0] = strip0; |
elmkom | 44:60008ebffdd4 | 422 | proximityStrip[1] = strip1; |
elmkom | 44:60008ebffdd4 | 423 | proximityStrip[0].init(myi2c, 0x70); |
elmkom | 44:60008ebffdd4 | 424 | proximityStrip[1].init(myi2c, 0x73); |
elmkom | 44:60008ebffdd4 | 425 | proximityStrip[0].on(); |
elmkom | 44:60008ebffdd4 | 426 | proximityStrip[1].on(); |
elmkom | 44:60008ebffdd4 | 427 | |
elmkom | 41:85a736a9b900 | 428 | #endif |
elmkom | 38:532a0d929756 | 429 | |
elmkom | 38:532a0d929756 | 430 | int count = 0; |
JMF | 2:0e2ef866af95 | 431 | // Send and receive data perpetually |
JMF | 2:0e2ef866af95 | 432 | while(1) { |
elmkom | 38:532a0d929756 | 433 | |
elmkom | 42:8500f0cb2ea5 | 434 | wnc.checkPassthrough(); |
elmkom | 38:532a0d929756 | 435 | //sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature())); |
elmkom | 38:532a0d929756 | 436 | //sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity()); |
elmkom | 38:532a0d929756 | 437 | // read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor |
elmkom | 41:85a736a9b900 | 438 | toggleLed = !toggleLed; |
elmkom | 41:85a736a9b900 | 439 | if(toggleLed) |
elmkom | 41:85a736a9b900 | 440 | SetLedColor(0x2); //green |
elmkom | 41:85a736a9b900 | 441 | else |
elmkom | 41:85a736a9b900 | 442 | SetLedColor(0); //off |
elmkom | 41:85a736a9b900 | 443 | |
elmkom | 41:85a736a9b900 | 444 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 445 | |
elmkom | 44:60008ebffdd4 | 446 | if(stripChanged[0] == false) |
elmkom | 44:60008ebffdd4 | 447 | stripChanged[0] = scanStrip(0); |
elmkom | 44:60008ebffdd4 | 448 | if(stripChanged[1] == false) |
elmkom | 44:60008ebffdd4 | 449 | stripChanged[1] = scanStrip(1); |
elmkom | 44:60008ebffdd4 | 450 | |
elmkom | 44:60008ebffdd4 | 451 | #elif PROXIMITYON == 2 |
elmkom | 44:60008ebffdd4 | 452 | |
elmkom | 44:60008ebffdd4 | 453 | printf("scan %d\r\n",count); |
elmkom | 44:60008ebffdd4 | 454 | bool stripChanged = false; |
elmkom | 44:60008ebffdd4 | 455 | proximityStrip[0].scan(); |
elmkom | 44:60008ebffdd4 | 456 | printf("scan0 done %d\r\n",count); |
elmkom | 44:60008ebffdd4 | 457 | proximityStrip[1].scan(); |
elmkom | 44:60008ebffdd4 | 458 | printf("scan1 done %d\r\n",count); |
elmkom | 44:60008ebffdd4 | 459 | stripChanged |= proximityStrip[0].changed(50); |
elmkom | 44:60008ebffdd4 | 460 | printf("scan0 change %d\r\n",stripChanged); |
elmkom | 44:60008ebffdd4 | 461 | stripChanged |= proximityStrip[1].changed(50); |
elmkom | 44:60008ebffdd4 | 462 | printf("scan1 change %d\r\n",stripChanged); |
elmkom | 44:60008ebffdd4 | 463 | |
elmkom | 41:85a736a9b900 | 464 | #else |
elmkom | 41:85a736a9b900 | 465 | bool slotsChanged = checkSlots(); |
elmkom | 41:85a736a9b900 | 466 | #endif |
elmkom | 44:60008ebffdd4 | 467 | |
elmkom | 44:60008ebffdd4 | 468 | char modem_string[512]; |
elmkom | 41:85a736a9b900 | 469 | |
elmkom | 41:85a736a9b900 | 470 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 471 | if(count >= 5*120) |
elmkom | 44:60008ebffdd4 | 472 | { |
elmkom | 44:60008ebffdd4 | 473 | stripChanged[0] = true; |
elmkom | 44:60008ebffdd4 | 474 | stripChanged[1] = true; |
elmkom | 44:60008ebffdd4 | 475 | } |
elmkom | 44:60008ebffdd4 | 476 | |
elmkom | 44:60008ebffdd4 | 477 | if(stripChanged[0] || stripChanged[1]) |
elmkom | 44:60008ebffdd4 | 478 | |
elmkom | 44:60008ebffdd4 | 479 | |
elmkom | 44:60008ebffdd4 | 480 | #elif PROXIMITYON == 2 |
elmkom | 44:60008ebffdd4 | 481 | if(count >= 5*60 || stripChanged ) |
elmkom | 41:85a736a9b900 | 482 | #else |
elmkom | 41:85a736a9b900 | 483 | if(count >= 5*60 || slotsChanged) |
elmkom | 41:85a736a9b900 | 484 | #endif |
elmkom | 38:532a0d929756 | 485 | { |
elmkom | 42:8500f0cb2ea5 | 486 | if(wnc.isPowerSaveOn()) |
elmkom | 42:8500f0cb2ea5 | 487 | { |
elmkom | 42:8500f0cb2ea5 | 488 | wnc.wakeFromPowerSave(); |
elmkom | 42:8500f0cb2ea5 | 489 | //wnc.ping("108.244.165.22"); |
elmkom | 42:8500f0cb2ea5 | 490 | } |
elmkom | 38:532a0d929756 | 491 | count = 0; |
elmkom | 38:532a0d929756 | 492 | SetLedColor(0x04); //blue |
elmkom | 36:f8d96ff1dd1b | 493 | |
elmkom | 44:60008ebffdd4 | 494 | |
elmkom | 41:85a736a9b900 | 495 | |
elmkom | 41:85a736a9b900 | 496 | #if PROXIMITYON == 1 |
elmkom | 44:60008ebffdd4 | 497 | if(stripChanged[0]) |
elmkom | 44:60008ebffdd4 | 498 | { |
elmkom | 44:60008ebffdd4 | 499 | GenerateModemString(&modem_string[0],PROXIMITY_ONLY,0); |
elmkom | 44:60008ebffdd4 | 500 | stripChanged[0] = false; |
elmkom | 44:60008ebffdd4 | 501 | } |
elmkom | 44:60008ebffdd4 | 502 | else if (stripChanged[1]) |
elmkom | 44:60008ebffdd4 | 503 | { |
elmkom | 44:60008ebffdd4 | 504 | GenerateModemString(&modem_string[0],PROXIMITY_ONLY,3); |
elmkom | 44:60008ebffdd4 | 505 | stripChanged[1] = false; |
elmkom | 44:60008ebffdd4 | 506 | } |
elmkom | 44:60008ebffdd4 | 507 | else |
elmkom | 44:60008ebffdd4 | 508 | GenerateModemString(&modem_string[0],PROXIMITY_ONLY,-1); |
elmkom | 44:60008ebffdd4 | 509 | #elif PROXIMITYON == 2 |
elmkom | 44:60008ebffdd4 | 510 | GenerateModemString(&modem_string[0],PROXIMITY_ONLY,0); |
elmkom | 41:85a736a9b900 | 511 | #else |
elmkom | 44:60008ebffdd4 | 512 | GenerateModemString(&modem_string[0],SWITCH_ONLY,0); |
elmkom | 41:85a736a9b900 | 513 | #endif |
elmkom | 41:85a736a9b900 | 514 | |
elmkom | 38:532a0d929756 | 515 | printf(BLU "Sending to modem : %s" DEF "\r\n", modem_string); |
elmkom | 42:8500f0cb2ea5 | 516 | |
elmkom | 44:60008ebffdd4 | 517 | //if(wnc.connect("108.244.165.22",5005)) // node-red |
elmkom | 44:60008ebffdd4 | 518 | if(wnc.connect("52.21.224.249",80)) // shelf |
elmkom | 44:60008ebffdd4 | 519 | //if(wnc.connect("52.33.231.251",80)) // car |
elmkom | 42:8500f0cb2ea5 | 520 | { |
elmkom | 42:8500f0cb2ea5 | 521 | char * reply = wnc.writeSocket(modem_string); |
elmkom | 42:8500f0cb2ea5 | 522 | |
elmkom | 42:8500f0cb2ea5 | 523 | char* mydata; |
elmkom | 42:8500f0cb2ea5 | 524 | int tries = 4; |
elmkom | 42:8500f0cb2ea5 | 525 | while(tries > 0) // wait for reply |
elmkom | 42:8500f0cb2ea5 | 526 | { |
elmkom | 42:8500f0cb2ea5 | 527 | tries--; |
elmkom | 42:8500f0cb2ea5 | 528 | mydata = wnc.readSocket(); |
elmkom | 42:8500f0cb2ea5 | 529 | if (strlen(mydata) > 0) |
elmkom | 42:8500f0cb2ea5 | 530 | break; |
elmkom | 42:8500f0cb2ea5 | 531 | |
elmkom | 44:60008ebffdd4 | 532 | wait(0.5); |
elmkom | 42:8500f0cb2ea5 | 533 | } |
elmkom | 42:8500f0cb2ea5 | 534 | |
elmkom | 42:8500f0cb2ea5 | 535 | if (strlen(mydata) > 0) |
elmkom | 42:8500f0cb2ea5 | 536 | { |
elmkom | 37:ee01f752524a | 537 | |
elmkom | 42:8500f0cb2ea5 | 538 | SetLedColor(0x2); // green |
elmkom | 42:8500f0cb2ea5 | 539 | //only copy on sucessful send |
elmkom | 38:532a0d929756 | 540 | |
elmkom | 42:8500f0cb2ea5 | 541 | printf(BLU "Read back : %s" DEF "\r\n", mydata); |
elmkom | 42:8500f0cb2ea5 | 542 | char datareply[512]; |
elmkom | 42:8500f0cb2ea5 | 543 | if (extract_reply(mydata, datareply)) |
elmkom | 42:8500f0cb2ea5 | 544 | { |
elmkom | 42:8500f0cb2ea5 | 545 | printf(GRN "JSON : %s" DEF "\r\n", datareply); |
elmkom | 42:8500f0cb2ea5 | 546 | parse_reply(datareply); |
elmkom | 42:8500f0cb2ea5 | 547 | } |
elmkom | 42:8500f0cb2ea5 | 548 | SetLedColor(0); // off |
elmkom | 42:8500f0cb2ea5 | 549 | } |
elmkom | 42:8500f0cb2ea5 | 550 | else // no reply reset |
elmkom | 38:532a0d929756 | 551 | { |
elmkom | 42:8500f0cb2ea5 | 552 | SetLedColor(0x1); //red |
elmkom | 42:8500f0cb2ea5 | 553 | system_reset(); |
elmkom | 42:8500f0cb2ea5 | 554 | } |
elmkom | 42:8500f0cb2ea5 | 555 | wnc.disconnect(); |
elmkom | 38:532a0d929756 | 556 | } |
elmkom | 42:8500f0cb2ea5 | 557 | else // failed to connect reset |
elmkom | 38:532a0d929756 | 558 | { |
elmkom | 38:532a0d929756 | 559 | SetLedColor(0x1); //red |
elmkom | 42:8500f0cb2ea5 | 560 | system_reset(); |
elmkom | 42:8500f0cb2ea5 | 561 | } |
elmkom | 42:8500f0cb2ea5 | 562 | if(wnc.isPowerSaveOn()) |
elmkom | 42:8500f0cb2ea5 | 563 | wnc.resumePowerSave(); |
elmkom | 38:532a0d929756 | 564 | } |
elmkom | 38:532a0d929756 | 565 | count++; |
elmkom | 38:532a0d929756 | 566 | wait(0.2); |
stefanrousseau | 3:26b3cc155f39 | 567 | } //forever loop |
JMF | 0:9d5134074d84 | 568 | } |