Demo starter application to connect WiGo to NSP and expose on-board sensors

Dependencies:   NVIC_set_all_priorities cc3000_hostdriver_mbedsocket mbed nsdl_lib TEMT6200 TSI Wi-Go_eCompass_Lib_V3 WiGo_BattCharger

This is the mbed project for the IoT World Hackathon event, June 17th and 18th in Palo Also.

The setup instructions for participants are at the Setup page of this wiki:

http://mbed.org/teams/MBED_DEMOS/code/IoT_World_Hackathon_WiGo_NSP_Demo/wiki/Setup-Guide-for-the-IoT-World-Hackathon

Committer:
michaeljkoster
Date:
Fri Jun 13 18:00:38 2014 +0000
Revision:
0:07581223f90c
Child:
4:727f1aeb717a
Initial files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michaeljkoster 0:07581223f90c 1 /* mbed Microcontroller Library
michaeljkoster 0:07581223f90c 2 * Copyright (c) 2006-2013 ARM Limited
michaeljkoster 0:07581223f90c 3 *
michaeljkoster 0:07581223f90c 4 * Licensed under the Apache License, Version 2.0 (the "License");
michaeljkoster 0:07581223f90c 5 * you may not use this file except in compliance with the License.
michaeljkoster 0:07581223f90c 6 * You may obtain a copy of the License at
michaeljkoster 0:07581223f90c 7 *
michaeljkoster 0:07581223f90c 8 * http://www.apache.org/licenses/LICENSE-2.0
michaeljkoster 0:07581223f90c 9 *
michaeljkoster 0:07581223f90c 10 * Unless required by applicable law or agreed to in writing, software
michaeljkoster 0:07581223f90c 11 * distributed under the License is distributed on an "AS IS" BASIS,
michaeljkoster 0:07581223f90c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
michaeljkoster 0:07581223f90c 13 * See the License for the specific language governing permissions and
michaeljkoster 0:07581223f90c 14 * limitations under the License.
michaeljkoster 0:07581223f90c 15 */
michaeljkoster 0:07581223f90c 16 #include "mbed.h"
michaeljkoster 0:07581223f90c 17 #include "cc3000.h"
michaeljkoster 0:07581223f90c 18 #include "main.h"
michaeljkoster 0:07581223f90c 19 #include "TCPSocketConnection.h"
michaeljkoster 0:07581223f90c 20 #include "TCPSocketServer.h"
michaeljkoster 0:07581223f90c 21 #include "nsdl_support.h"
michaeljkoster 0:07581223f90c 22
michaeljkoster 0:07581223f90c 23 using namespace mbed_cc3000;
michaeljkoster 0:07581223f90c 24
michaeljkoster 0:07581223f90c 25 tUserFS user_info;
michaeljkoster 0:07581223f90c 26
michaeljkoster 0:07581223f90c 27 /* cc3000 module declaration specific for user's board. Check also init() */
michaeljkoster 0:07581223f90c 28 #if (MY_BOARD == WIGO)
michaeljkoster 0:07581223f90c 29
michaeljkoster 0:07581223f90c 30 #include "I2C_busreset.h"
michaeljkoster 0:07581223f90c 31 #include "defLED.h"
michaeljkoster 0:07581223f90c 32 #include "TSISensor.h"
michaeljkoster 0:07581223f90c 33 #include "TEMT6200.h"
michaeljkoster 0:07581223f90c 34 #include "WiGo_BattCharger.h"
michaeljkoster 0:07581223f90c 35 #include "MMA8451Q.h"
michaeljkoster 0:07581223f90c 36 #include "MAG3110.h"
michaeljkoster 0:07581223f90c 37 #include "MPL3115A2.h"
michaeljkoster 0:07581223f90c 38 #include "Wi-Go_eCompass_Lib_V3.h"
michaeljkoster 0:07581223f90c 39 #include "demo.h"
michaeljkoster 0:07581223f90c 40 #include "doTCPIP.h"
michaeljkoster 0:07581223f90c 41 #include "run_exosite.h"
michaeljkoster 0:07581223f90c 42
michaeljkoster 0:07581223f90c 43 #define FCOUNTSPERG 4096.0F // sensor specific: MMA8451 provide 4096 counts / g in 2g mode
michaeljkoster 0:07581223f90c 44 #define FCOUNTSPERUT 10.0F // sensor specific: MAG3110 provide 10 counts / uT
michaeljkoster 0:07581223f90c 45
michaeljkoster 0:07581223f90c 46 #define BATT_0 0.53
michaeljkoster 0:07581223f90c 47 #define BATT_100 0.63
michaeljkoster 0:07581223f90c 48
michaeljkoster 0:07581223f90c 49 DigitalOut ledr (LED_RED);
michaeljkoster 0:07581223f90c 50 DigitalOut ledg (LED_GREEN);
michaeljkoster 0:07581223f90c 51 DigitalOut ledb (LED_BLUE);
michaeljkoster 0:07581223f90c 52 DigitalOut led1 (PTB8);
michaeljkoster 0:07581223f90c 53 DigitalOut led2 (PTB9);
michaeljkoster 0:07581223f90c 54 DigitalOut led3 (PTB10);
michaeljkoster 0:07581223f90c 55
michaeljkoster 0:07581223f90c 56 cc3000 wifi(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5), "", "", NONE, true);
michaeljkoster 0:07581223f90c 57
michaeljkoster 0:07581223f90c 58 TCPSocketConnection socket;
michaeljkoster 0:07581223f90c 59
michaeljkoster 0:07581223f90c 60 Serial pc(USBTX, USBRX);
michaeljkoster 0:07581223f90c 61
michaeljkoster 0:07581223f90c 62 // Slide sensor
michaeljkoster 0:07581223f90c 63 TSISensor tsi;
michaeljkoster 0:07581223f90c 64
michaeljkoster 0:07581223f90c 65 // Systick
michaeljkoster 0:07581223f90c 66 Ticker systick;
michaeljkoster 0:07581223f90c 67
michaeljkoster 0:07581223f90c 68 // Ambient light sensor : PTD5 = enable, PTB0 = analog input
michaeljkoster 0:07581223f90c 69 TEMT6200 ambi(PTD5, PTB0);
michaeljkoster 0:07581223f90c 70
michaeljkoster 0:07581223f90c 71 //Wi-Go battery charger control
michaeljkoster 0:07581223f90c 72 WiGo_BattCharger Batt(CHRG_EN1, CHRG_EN2, CHRG_SNS_EN, CHRG_SNS, CHRG_POK, CHRG_CHG);
michaeljkoster 0:07581223f90c 73
michaeljkoster 0:07581223f90c 74 // Accelerometer
michaeljkoster 0:07581223f90c 75 #define MMA8451_I2C_ADDRESS (0x1d<<1)
michaeljkoster 0:07581223f90c 76 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
michaeljkoster 0:07581223f90c 77
michaeljkoster 0:07581223f90c 78 // Magnetometer
michaeljkoster 0:07581223f90c 79 #define MAG3110_I2C_ADDRESS (0x0e<<1)
michaeljkoster 0:07581223f90c 80 MAG3110 mag(PTE0, PTE1, MAG3110_I2C_ADDRESS);
michaeljkoster 0:07581223f90c 81
michaeljkoster 0:07581223f90c 82 // altimeter-Pressure-Temperature (apt)
michaeljkoster 0:07581223f90c 83 #define MPL3115A2_I2C_ADDRESS (0x60<<1)
michaeljkoster 0:07581223f90c 84 MPL3115A2 apt( PTE0, PTE1, MPL3115A2_I2C_ADDRESS);
michaeljkoster 0:07581223f90c 85
michaeljkoster 0:07581223f90c 86 volatile int secondFlag;
michaeljkoster 0:07581223f90c 87 volatile int HsecondFlag;
michaeljkoster 0:07581223f90c 88 unsigned int seconds;
michaeljkoster 0:07581223f90c 89 unsigned int compass_type;
michaeljkoster 0:07581223f90c 90 unsigned short adc_sample3;
michaeljkoster 0:07581223f90c 91 float fcountperg = 1.0F / FCOUNTSPERG;
michaeljkoster 0:07581223f90c 92 float fcountperut = 1.0F / FCOUNTSPERUT;
michaeljkoster 0:07581223f90c 93 volatile unsigned char newData;
michaeljkoster 0:07581223f90c 94 volatile int server_running;
michaeljkoster 0:07581223f90c 95 axis6_t axis6;
michaeljkoster 0:07581223f90c 96 int do_mDNS = 0;
michaeljkoster 0:07581223f90c 97 //Device name - used for Smart config in order to stop the Smart phone configuration process
michaeljkoster 0:07581223f90c 98 char DevServname[] = "CC3000";
michaeljkoster 0:07581223f90c 99
michaeljkoster 0:07581223f90c 100 void initLEDs(void)
michaeljkoster 0:07581223f90c 101 {
michaeljkoster 0:07581223f90c 102 RED_OFF;
michaeljkoster 0:07581223f90c 103 GREEN_OFF;
michaeljkoster 0:07581223f90c 104 BLUE_OFF;
michaeljkoster 0:07581223f90c 105 LED_D1_OFF;
michaeljkoster 0:07581223f90c 106 LED_D2_OFF;
michaeljkoster 0:07581223f90c 107 LED_D3_OFF;
michaeljkoster 0:07581223f90c 108 }
michaeljkoster 0:07581223f90c 109
michaeljkoster 0:07581223f90c 110 void GreenStop(void)
michaeljkoster 0:07581223f90c 111 {
michaeljkoster 0:07581223f90c 112 RED_OFF; GREEN_OFF; BLUE_OFF;
michaeljkoster 0:07581223f90c 113 while(1)
michaeljkoster 0:07581223f90c 114 {
michaeljkoster 0:07581223f90c 115 GREEN_ON;
michaeljkoster 0:07581223f90c 116 secondFlag = 0;
michaeljkoster 0:07581223f90c 117 while(!secondFlag);
michaeljkoster 0:07581223f90c 118 GREEN_OFF;
michaeljkoster 0:07581223f90c 119 secondFlag = 0;
michaeljkoster 0:07581223f90c 120 while(!secondFlag);
michaeljkoster 0:07581223f90c 121 }
michaeljkoster 0:07581223f90c 122 }
michaeljkoster 0:07581223f90c 123
michaeljkoster 0:07581223f90c 124 void accel_read(void)
michaeljkoster 0:07581223f90c 125 {
michaeljkoster 0:07581223f90c 126 signed short resultx, resulty, resultz;
michaeljkoster 0:07581223f90c 127 if(acc.isDataAvailable())
michaeljkoster 0:07581223f90c 128 {
michaeljkoster 0:07581223f90c 129 resultx = acc.readReg(0x01)<<8;
michaeljkoster 0:07581223f90c 130 resultx |= acc.readReg(0x02);
michaeljkoster 0:07581223f90c 131 resultx = resultx >> 2;
michaeljkoster 0:07581223f90c 132 resulty = acc.readReg(0x03)<<8;
michaeljkoster 0:07581223f90c 133 resulty |= acc.readReg(0x04);
michaeljkoster 0:07581223f90c 134 resulty = resulty >> 2;
michaeljkoster 0:07581223f90c 135 resultz = acc.readReg(0x05)<<8;
michaeljkoster 0:07581223f90c 136 resultz |= acc.readReg(0x06);
michaeljkoster 0:07581223f90c 137 resultz = resultz >> 2;
michaeljkoster 0:07581223f90c 138 if(compass_type == NED_COMPASS)
michaeljkoster 0:07581223f90c 139 {
michaeljkoster 0:07581223f90c 140 axis6.acc_x = resultx;
michaeljkoster 0:07581223f90c 141 axis6.acc_y = -1 * resulty; // multiple by -1 to compensate for PCB layout
michaeljkoster 0:07581223f90c 142 axis6.acc_z = resultz;
michaeljkoster 0:07581223f90c 143 }
michaeljkoster 0:07581223f90c 144 if(compass_type == ANDROID_COMPASS)
michaeljkoster 0:07581223f90c 145 {
michaeljkoster 0:07581223f90c 146 axis6.acc_x = resulty; //
michaeljkoster 0:07581223f90c 147 axis6.acc_y = -1 * resultx;
michaeljkoster 0:07581223f90c 148 axis6.acc_z = resultz;
michaeljkoster 0:07581223f90c 149 }
michaeljkoster 0:07581223f90c 150 if(compass_type == WINDOWS_COMPASS)
michaeljkoster 0:07581223f90c 151 {
michaeljkoster 0:07581223f90c 152 axis6.acc_x = -1 * resulty; //
michaeljkoster 0:07581223f90c 153 axis6.acc_y = resultx;
michaeljkoster 0:07581223f90c 154 axis6.acc_z = resultz;
michaeljkoster 0:07581223f90c 155 }
michaeljkoster 0:07581223f90c 156 axis6.fax = axis6.acc_x;
michaeljkoster 0:07581223f90c 157 axis6.fay = axis6.acc_y;
michaeljkoster 0:07581223f90c 158 axis6.faz = axis6.acc_z;
michaeljkoster 0:07581223f90c 159 axis6.fGax = axis6.fax * fcountperg;
michaeljkoster 0:07581223f90c 160 axis6.fGay = axis6.fay * fcountperg;
michaeljkoster 0:07581223f90c 161 axis6.fGaz = axis6.faz * fcountperg;
michaeljkoster 0:07581223f90c 162 }
michaeljkoster 0:07581223f90c 163 }
michaeljkoster 0:07581223f90c 164
michaeljkoster 0:07581223f90c 165 void readTempAlt(void) // We don't use the fractional data
michaeljkoster 0:07581223f90c 166 {
michaeljkoster 0:07581223f90c 167 unsigned char raw_data[2];
michaeljkoster 0:07581223f90c 168 if(apt.getAltimeterRaw(&raw_data[0]))
michaeljkoster 0:07581223f90c 169 axis6.alt = ((raw_data[0] << 8) | raw_data[1]);
michaeljkoster 0:07581223f90c 170 if(apt.getTemperatureRaw(&raw_data[0]))
michaeljkoster 0:07581223f90c 171 axis6.temp = raw_data[0];
michaeljkoster 0:07581223f90c 172 }
michaeljkoster 0:07581223f90c 173
michaeljkoster 0:07581223f90c 174 void readCompass( void )
michaeljkoster 0:07581223f90c 175 {
michaeljkoster 0:07581223f90c 176 if(mag.isDataAvailable())
michaeljkoster 0:07581223f90c 177 {
michaeljkoster 0:07581223f90c 178 uint8_t mx_msb, my_msb, mz_msb;
michaeljkoster 0:07581223f90c 179 uint8_t mx_lsb, my_lsb, mz_lsb;
michaeljkoster 0:07581223f90c 180
michaeljkoster 0:07581223f90c 181 mx_msb = mag.readReg(0x01);
michaeljkoster 0:07581223f90c 182 mx_lsb = mag.readReg(0x02);
michaeljkoster 0:07581223f90c 183 my_msb = mag.readReg(0x03);
michaeljkoster 0:07581223f90c 184 my_lsb = mag.readReg(0x04);
michaeljkoster 0:07581223f90c 185 mz_msb = mag.readReg(0x05);
michaeljkoster 0:07581223f90c 186 mz_lsb = mag.readReg(0x06);
michaeljkoster 0:07581223f90c 187
michaeljkoster 0:07581223f90c 188 if(compass_type == NED_COMPASS)
michaeljkoster 0:07581223f90c 189 {
michaeljkoster 0:07581223f90c 190 axis6.mag_y = (((mx_msb << 8) | mx_lsb)); // x & y swapped to compensate for PCB layout
michaeljkoster 0:07581223f90c 191 axis6.mag_x = (((my_msb << 8) | my_lsb));
michaeljkoster 0:07581223f90c 192 axis6.mag_z = (((mz_msb << 8) | mz_lsb));
michaeljkoster 0:07581223f90c 193 }
michaeljkoster 0:07581223f90c 194 if(compass_type == ANDROID_COMPASS)
michaeljkoster 0:07581223f90c 195 {
michaeljkoster 0:07581223f90c 196 axis6.mag_x = (((mx_msb << 8) | mx_lsb));
michaeljkoster 0:07581223f90c 197 axis6.mag_y = (((my_msb << 8) | my_lsb));
michaeljkoster 0:07581223f90c 198 axis6.mag_z = -1 * (((mz_msb << 8) | mz_lsb)); // negate to reverse axis of Z to conform to Android coordinate system
michaeljkoster 0:07581223f90c 199 }
michaeljkoster 0:07581223f90c 200 if(compass_type == WINDOWS_COMPASS)
michaeljkoster 0:07581223f90c 201 {
michaeljkoster 0:07581223f90c 202 axis6.mag_x = (((mx_msb << 8) | mx_lsb));
michaeljkoster 0:07581223f90c 203 axis6.mag_y = (((my_msb << 8) | my_lsb));
michaeljkoster 0:07581223f90c 204 axis6.mag_z = -1 * (((mz_msb << 8) | mz_lsb));
michaeljkoster 0:07581223f90c 205 }
michaeljkoster 0:07581223f90c 206 axis6.fmx = axis6.mag_x;
michaeljkoster 0:07581223f90c 207 axis6.fmy = axis6.mag_y;
michaeljkoster 0:07581223f90c 208 axis6.fmz = axis6.mag_z;
michaeljkoster 0:07581223f90c 209 axis6.fUTmx = axis6.fmx * fcountperut;
michaeljkoster 0:07581223f90c 210 axis6.fUTmy = axis6.fmy * fcountperut;
michaeljkoster 0:07581223f90c 211 axis6.fUTmz = axis6.fmz * fcountperut;
michaeljkoster 0:07581223f90c 212 }
michaeljkoster 0:07581223f90c 213 }
michaeljkoster 0:07581223f90c 214
michaeljkoster 0:07581223f90c 215 void axis6Print(void)
michaeljkoster 0:07581223f90c 216 {
michaeljkoster 0:07581223f90c 217 char *compass_points[9] = {"North", "N-East", "East", "S-East", "South", "S-West", "West", "N-West", "North"};
michaeljkoster 0:07581223f90c 218 signed short compass_bearing = (axis6.compass + 23) / 45;
michaeljkoster 0:07581223f90c 219 printf("Compass : Roll=%-d Pitch=%-d Yaw=%-d [%s]\r\n", axis6.roll, axis6.pitch, axis6.yaw, compass_points[compass_bearing]);
michaeljkoster 0:07581223f90c 220 printf("Accel : X= %1.2f, Y= %1.2f, Z= %1.2f\r\n", axis6.fGax, axis6.fGay, axis6.fGaz);
michaeljkoster 0:07581223f90c 221 printf("Magneto : X= %3.1f, Y= %3.1f, Z= %3.1f\r\n\r\n", axis6.fUTmx, axis6.fUTmy, axis6.fUTmz);
michaeljkoster 0:07581223f90c 222 }
michaeljkoster 0:07581223f90c 223
michaeljkoster 0:07581223f90c 224 void set_dir_LED(void)
michaeljkoster 0:07581223f90c 225 {
michaeljkoster 0:07581223f90c 226 RED_OFF; GREEN_OFF; BLUE_OFF;
michaeljkoster 0:07581223f90c 227
michaeljkoster 0:07581223f90c 228 if((axis6.compass >= 353) || (axis6.compass <= 7))
michaeljkoster 0:07581223f90c 229 {
michaeljkoster 0:07581223f90c 230 GREEN_ON;
michaeljkoster 0:07581223f90c 231 }
michaeljkoster 0:07581223f90c 232 else
michaeljkoster 0:07581223f90c 233 {
michaeljkoster 0:07581223f90c 234 GREEN_OFF;
michaeljkoster 0:07581223f90c 235 }
michaeljkoster 0:07581223f90c 236 if(((axis6.compass >= 348) && (axis6.compass <= 357)) || ((axis6.compass >= 3) && (axis6.compass <= 12)))
michaeljkoster 0:07581223f90c 237 {
michaeljkoster 0:07581223f90c 238 BLUE_ON;
michaeljkoster 0:07581223f90c 239 }
michaeljkoster 0:07581223f90c 240 else
michaeljkoster 0:07581223f90c 241 {
michaeljkoster 0:07581223f90c 242 BLUE_OFF;
michaeljkoster 0:07581223f90c 243 }
michaeljkoster 0:07581223f90c 244 if((axis6.compass >= 348) || (axis6.compass <= 12)) return;
michaeljkoster 0:07581223f90c 245 if(((axis6.compass >= 268) && (axis6.compass <= 272)) || ((axis6.compass >= 88) && (axis6.compass <= 92)))
michaeljkoster 0:07581223f90c 246 {
michaeljkoster 0:07581223f90c 247 RED_ON;
michaeljkoster 0:07581223f90c 248 return;
michaeljkoster 0:07581223f90c 249 }
michaeljkoster 0:07581223f90c 250 if((axis6.compass >= 178) && (axis6.compass <= 182))
michaeljkoster 0:07581223f90c 251 {
michaeljkoster 0:07581223f90c 252 BLUE_ON;
michaeljkoster 0:07581223f90c 253 RED_ON;
michaeljkoster 0:07581223f90c 254 return;
michaeljkoster 0:07581223f90c 255 }
michaeljkoster 0:07581223f90c 256 }
michaeljkoster 0:07581223f90c 257
michaeljkoster 0:07581223f90c 258 void SysTick_Handler(void)
michaeljkoster 0:07581223f90c 259 {
michaeljkoster 0:07581223f90c 260 static unsigned int ttt = 1;
michaeljkoster 0:07581223f90c 261 int ts;
michaeljkoster 0:07581223f90c 262 ts = ttt & 0x1;
michaeljkoster 0:07581223f90c 263 if(ts == 0)
michaeljkoster 0:07581223f90c 264 {
michaeljkoster 0:07581223f90c 265 accel_read();
michaeljkoster 0:07581223f90c 266 readCompass();
michaeljkoster 0:07581223f90c 267 }
michaeljkoster 0:07581223f90c 268 if(ts == 1)
michaeljkoster 0:07581223f90c 269 {
michaeljkoster 0:07581223f90c 270 run_eCompass();
michaeljkoster 0:07581223f90c 271 newData = 1; // a general purpose flag for things that need to synch to the ISR
michaeljkoster 0:07581223f90c 272 axis6.timestamp++;
michaeljkoster 0:07581223f90c 273 if(!server_running) set_dir_LED(); // Set the LEDs based on direction when nothing else is usng them
michaeljkoster 0:07581223f90c 274 }
michaeljkoster 0:07581223f90c 275 if(ttt == 50)
michaeljkoster 0:07581223f90c 276 {
michaeljkoster 0:07581223f90c 277 LED_D1_ON;
michaeljkoster 0:07581223f90c 278 if(seconds && (seconds < 15)) calibrate_eCompass();
michaeljkoster 0:07581223f90c 279 readTempAlt();
michaeljkoster 0:07581223f90c 280 axis6.light = ambi.readRaw(); // Light Sensor
michaeljkoster 0:07581223f90c 281 HsecondFlag = 1; // A general purpose flag for things that need to happen every 500ms
michaeljkoster 0:07581223f90c 282 }
michaeljkoster 0:07581223f90c 283 if(ttt >= 100)
michaeljkoster 0:07581223f90c 284 {
michaeljkoster 0:07581223f90c 285 LED_D1_OFF;
michaeljkoster 0:07581223f90c 286 ttt = 1;
michaeljkoster 0:07581223f90c 287 calibrate_eCompass();
michaeljkoster 0:07581223f90c 288 Batt.sense_en(1);
michaeljkoster 0:07581223f90c 289 adc_sample3 = Batt.level();
michaeljkoster 0:07581223f90c 290 Batt.sense_en(0);
michaeljkoster 0:07581223f90c 291 secondFlag = 1; // A general purpose flag for things that need to happen once a second
michaeljkoster 0:07581223f90c 292 HsecondFlag = 1;
michaeljkoster 0:07581223f90c 293 seconds++;
michaeljkoster 0:07581223f90c 294 if(!(seconds & 0x1F)) do_mDNS = 1;
michaeljkoster 0:07581223f90c 295 } else ttt++;
michaeljkoster 0:07581223f90c 296 }
michaeljkoster 0:07581223f90c 297 /*void SysTick_Handler(void)
michaeljkoster 0:07581223f90c 298 {
michaeljkoster 0:07581223f90c 299 static unsigned int ttt = 1;
michaeljkoster 0:07581223f90c 300 int ts;
michaeljkoster 0:07581223f90c 301 ts = ttt & 0x3;
michaeljkoster 0:07581223f90c 302 if(ts == 2) readCompass();
michaeljkoster 0:07581223f90c 303 if(ts == 1) accel_read();
michaeljkoster 0:07581223f90c 304 if(ts == 3)
michaeljkoster 0:07581223f90c 305 {
michaeljkoster 0:07581223f90c 306 run_eCompass();
michaeljkoster 0:07581223f90c 307 newData = 1; // a general purpose flag for things that need to synch to the ISR
michaeljkoster 0:07581223f90c 308 axis6.timestamp++;
michaeljkoster 0:07581223f90c 309 if(!server_running) set_dir_LED(); // Set the LEDs based on direction when nothing else is usng them
michaeljkoster 0:07581223f90c 310 }
michaeljkoster 0:07581223f90c 311 if(ttt == 100)//systick = 0.005 : 100 - systick = 0.025 : 20
michaeljkoster 0:07581223f90c 312 {
michaeljkoster 0:07581223f90c 313 LED_D1_ON;
michaeljkoster 0:07581223f90c 314 if(seconds && (seconds < 15)) calibrate_eCompass();
michaeljkoster 0:07581223f90c 315 readTempAlt();
michaeljkoster 0:07581223f90c 316 axis6.light = ambi.readRaw(); // Light Sensor
michaeljkoster 0:07581223f90c 317 HsecondFlag = 1; // A general purpose flag for things that need to happen every 500ms
michaeljkoster 0:07581223f90c 318 }
michaeljkoster 0:07581223f90c 319 if(ttt >= 200)//systick = 0.005 : 200 - systick = 0.025 : 40
michaeljkoster 0:07581223f90c 320 {
michaeljkoster 0:07581223f90c 321 LED_D1_OFF;
michaeljkoster 0:07581223f90c 322 ttt = 1;
michaeljkoster 0:07581223f90c 323 calibrate_eCompass();
michaeljkoster 0:07581223f90c 324 Batt.sense_en(1);
michaeljkoster 0:07581223f90c 325 adc_sample3 = Batt.level();
michaeljkoster 0:07581223f90c 326 Batt.sense_en(0);
michaeljkoster 0:07581223f90c 327 secondFlag = 1; // A general purpose flag for things that need to happen once a second
michaeljkoster 0:07581223f90c 328 HsecondFlag = 1;
michaeljkoster 0:07581223f90c 329 seconds++;
michaeljkoster 0:07581223f90c 330 if(!(seconds & 0x1F)) do_mDNS = 1;
michaeljkoster 0:07581223f90c 331 } else ttt++;
michaeljkoster 0:07581223f90c 332 }*/
michaeljkoster 0:07581223f90c 333
michaeljkoster 0:07581223f90c 334 #elif (MY_BOARD == WIFI_DIPCORTEX)
michaeljkoster 0:07581223f90c 335 cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37), PIN_INT0_IRQn);
michaeljkoster 0:07581223f90c 336 Serial pc(UART_TX, UART_RX);
michaeljkoster 0:07581223f90c 337 #else
michaeljkoster 0:07581223f90c 338
michaeljkoster 0:07581223f90c 339 #endif
michaeljkoster 0:07581223f90c 340
michaeljkoster 0:07581223f90c 341 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
michaeljkoster 0:07581223f90c 342 const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
michaeljkoster 0:07581223f90c 343 #else
michaeljkoster 0:07581223f90c 344 const uint8_t smartconfigkey = 0;
michaeljkoster 0:07581223f90c 345 #endif
michaeljkoster 0:07581223f90c 346
michaeljkoster 0:07581223f90c 347 /**
michaeljkoster 0:07581223f90c 348 * \brief Print cc3000 information
michaeljkoster 0:07581223f90c 349 * \param none
michaeljkoster 0:07581223f90c 350 * \return none
michaeljkoster 0:07581223f90c 351 */
michaeljkoster 0:07581223f90c 352 void print_cc3000_info() {
michaeljkoster 0:07581223f90c 353 uint8_t myMAC[8];
michaeljkoster 0:07581223f90c 354 uint8_t spVER[5];
michaeljkoster 0:07581223f90c 355 wifi._nvmem.read_sp_version(spVER);
michaeljkoster 0:07581223f90c 356 printf("SP Version (TI) : %d %d %d %d %d\r\n", spVER[0], spVER[1], spVER[2], spVER[3], spVER[4]);
michaeljkoster 0:07581223f90c 357 printf("MAC address + cc3000 info \r\n");
michaeljkoster 0:07581223f90c 358 wifi.get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
michaeljkoster 0:07581223f90c 359 wifi.get_mac_address(myMAC);
michaeljkoster 0:07581223f90c 360 printf(" MAC address %02x:%02x:%02x:%02x:%02x:%02x \r\n \r\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
michaeljkoster 0:07581223f90c 361
michaeljkoster 0:07581223f90c 362 printf(" FTC %i \r\n",user_info.FTC);
michaeljkoster 0:07581223f90c 363 printf(" PP_version %i.%i \r\n",user_info.PP_version[0], user_info.PP_version[1]);
michaeljkoster 0:07581223f90c 364 printf(" SERV_PACK %i.%i \r\n",user_info.SERV_PACK[0], user_info.SERV_PACK[1]);
michaeljkoster 0:07581223f90c 365 printf(" DRV_VER %i.%i.%i \r\n",user_info.DRV_VER[0], user_info.DRV_VER[1], user_info.DRV_VER[2]);
michaeljkoster 0:07581223f90c 366 printf(" FW_VER %i.%i.%i \r\n",user_info.FW_VER[0], user_info.FW_VER[1], user_info.FW_VER[2]);
michaeljkoster 0:07581223f90c 367 }
michaeljkoster 0:07581223f90c 368
michaeljkoster 0:07581223f90c 369 /**
michaeljkoster 0:07581223f90c 370 * \brief Connect to SSID with a timeout
michaeljkoster 0:07581223f90c 371 * \param ssid Name of SSID
michaeljkoster 0:07581223f90c 372 * \param key Password
michaeljkoster 0:07581223f90c 373 * \param sec_mode Security mode
michaeljkoster 0:07581223f90c 374 * \return none
michaeljkoster 0:07581223f90c 375 */
michaeljkoster 0:07581223f90c 376 void connect_to_ssid(char *ssid, char *key, unsigned char sec_mode) {
michaeljkoster 0:07581223f90c 377 printf("Connecting to SSID: %s. Timeout is 10s. \r\n",ssid);
michaeljkoster 0:07581223f90c 378 if (wifi.connect_to_AP((uint8_t *)ssid, (uint8_t *)key, sec_mode) == true) {
michaeljkoster 0:07581223f90c 379 printf(" Connected. \r\n");
michaeljkoster 0:07581223f90c 380 } else {
michaeljkoster 0:07581223f90c 381 printf(" Connection timed-out (error). Please restart. \r\n");
michaeljkoster 0:07581223f90c 382 while(1);
michaeljkoster 0:07581223f90c 383 }
michaeljkoster 0:07581223f90c 384 }
michaeljkoster 0:07581223f90c 385
michaeljkoster 0:07581223f90c 386 /**
michaeljkoster 0:07581223f90c 387 * \brief Connect to SSID without security
michaeljkoster 0:07581223f90c 388 * \param ssid Name of SSID
michaeljkoster 0:07581223f90c 389 * \return none
michaeljkoster 0:07581223f90c 390 */
michaeljkoster 0:07581223f90c 391 void connect_to_ssid(char *ssid) {
michaeljkoster 0:07581223f90c 392 wifi.connect_open((uint8_t *)ssid);
michaeljkoster 0:07581223f90c 393 }
michaeljkoster 0:07581223f90c 394
michaeljkoster 0:07581223f90c 395 /**
michaeljkoster 0:07581223f90c 396 * \brief First time configuration
michaeljkoster 0:07581223f90c 397 * \param none
michaeljkoster 0:07581223f90c 398 * \return none
michaeljkoster 0:07581223f90c 399 */
michaeljkoster 0:07581223f90c 400 void do_FTC(void) {
michaeljkoster 0:07581223f90c 401 printf("Running First Time Configuration \r\n");
michaeljkoster 0:07581223f90c 402 wifi.start_smart_config(smartconfigkey);
michaeljkoster 0:07581223f90c 403 while (wifi.is_dhcp_configured() == false) {
michaeljkoster 0:07581223f90c 404 wait_ms(500);
michaeljkoster 0:07581223f90c 405 printf("Waiting for dhcp to be set. \r\n");
michaeljkoster 0:07581223f90c 406 }
michaeljkoster 0:07581223f90c 407 user_info.FTC = 1;
michaeljkoster 0:07581223f90c 408 wifi.set_user_file_info((uint8_t *)&user_info, sizeof(user_info));
michaeljkoster 0:07581223f90c 409 wifi._wlan.stop();
michaeljkoster 0:07581223f90c 410 printf("FTC finished. \r\n");
michaeljkoster 0:07581223f90c 411 }
michaeljkoster 0:07581223f90c 412
michaeljkoster 0:07581223f90c 413 /**
michaeljkoster 0:07581223f90c 414 * \brief TCP server demo
michaeljkoster 0:07581223f90c 415 * \param none
michaeljkoster 0:07581223f90c 416 * \return int
michaeljkoster 0:07581223f90c 417 */
michaeljkoster 0:07581223f90c 418 int main() {
michaeljkoster 0:07581223f90c 419 int loop;
michaeljkoster 0:07581223f90c 420 int temp;
michaeljkoster 0:07581223f90c 421 unsigned int oldseconds;
michaeljkoster 0:07581223f90c 422
michaeljkoster 0:07581223f90c 423 //Board dependent init
michaeljkoster 0:07581223f90c 424 init();
michaeljkoster 0:07581223f90c 425
michaeljkoster 0:07581223f90c 426 // Initalize global variables
michaeljkoster 0:07581223f90c 427 axis6.packet_id = 1;
michaeljkoster 0:07581223f90c 428 axis6.timestamp = 0;
michaeljkoster 0:07581223f90c 429 axis6.acc_x = 0;
michaeljkoster 0:07581223f90c 430 axis6.acc_y = 0;
michaeljkoster 0:07581223f90c 431 axis6.acc_z = 0;
michaeljkoster 0:07581223f90c 432 axis6.mag_x = 0;
michaeljkoster 0:07581223f90c 433 axis6.mag_y = 0;
michaeljkoster 0:07581223f90c 434 axis6.mag_z = 0;
michaeljkoster 0:07581223f90c 435 axis6.roll = 0;
michaeljkoster 0:07581223f90c 436 axis6.pitch = 0;
michaeljkoster 0:07581223f90c 437 axis6.yaw = 0;
michaeljkoster 0:07581223f90c 438 axis6.compass = 0;
michaeljkoster 0:07581223f90c 439 axis6.alt = 0;
michaeljkoster 0:07581223f90c 440 axis6.temp = 0;
michaeljkoster 0:07581223f90c 441 axis6.light = 0;
michaeljkoster 0:07581223f90c 442 compass_type = ANDROID_COMPASS;
michaeljkoster 0:07581223f90c 443 seconds = 0;
michaeljkoster 0:07581223f90c 444 server_running = 1;
michaeljkoster 0:07581223f90c 445 newData = 0;
michaeljkoster 0:07581223f90c 446 secondFlag = 0;
michaeljkoster 0:07581223f90c 447 HsecondFlag = 0;
michaeljkoster 0:07581223f90c 448 GREEN_ON;
michaeljkoster 0:07581223f90c 449
michaeljkoster 0:07581223f90c 450 // Unlock I2C bus if blocked by a device
michaeljkoster 0:07581223f90c 451 I2C_busreset();
michaeljkoster 0:07581223f90c 452
michaeljkoster 0:07581223f90c 453 pc.baud(115200);
michaeljkoster 0:07581223f90c 454
michaeljkoster 0:07581223f90c 455 // set current to 500mA since we're turning on the Wi-Fi
michaeljkoster 0:07581223f90c 456 Batt.init(CHRG_500MA);
michaeljkoster 0:07581223f90c 457
michaeljkoster 0:07581223f90c 458 //Init LEDs
michaeljkoster 0:07581223f90c 459 initLEDs();
michaeljkoster 0:07581223f90c 460 // Read the Magnetometer a couple of times to initalize
michaeljkoster 0:07581223f90c 461 for(loop=0 ; loop < 5 ; loop++)
michaeljkoster 0:07581223f90c 462 {
michaeljkoster 0:07581223f90c 463 temp = mag.readReg(0x01);
michaeljkoster 0:07581223f90c 464 temp = mag.readReg(0x02);
michaeljkoster 0:07581223f90c 465 temp = mag.readReg(0x03);
michaeljkoster 0:07581223f90c 466 temp = mag.readReg(0x04);
michaeljkoster 0:07581223f90c 467 temp = mag.readReg(0x05);
michaeljkoster 0:07581223f90c 468 temp = mag.readReg(0x06);
michaeljkoster 0:07581223f90c 469 wait_ms(50);
michaeljkoster 0:07581223f90c 470 }
michaeljkoster 0:07581223f90c 471
michaeljkoster 0:07581223f90c 472 init_eCompass();
michaeljkoster 0:07581223f90c 473
michaeljkoster 0:07581223f90c 474 // Start Ticker
michaeljkoster 0:07581223f90c 475 systick.attach(&SysTick_Handler, 0.01);
michaeljkoster 0:07581223f90c 476 // Trigger a WLAN device
michaeljkoster 0:07581223f90c 477 wifi.init();
michaeljkoster 0:07581223f90c 478 //wifi.start(0);
michaeljkoster 0:07581223f90c 479 printf("CC3000 Wi-Go IOT ARM Sensinode demo.\r\n");
michaeljkoster 0:07581223f90c 480 print_cc3000_info();
michaeljkoster 0:07581223f90c 481 server_running = 1;
michaeljkoster 0:07581223f90c 482 newData = 0;
michaeljkoster 0:07581223f90c 483 GREEN_ON;
michaeljkoster 0:07581223f90c 484
michaeljkoster 0:07581223f90c 485 if(!user_info.FTC)
michaeljkoster 0:07581223f90c 486 {
michaeljkoster 0:07581223f90c 487 do_FTC(); // Call First Time Configuration if SmartConfig has not been run
michaeljkoster 0:07581223f90c 488 printf("Please restart your board. \r\n");
michaeljkoster 0:07581223f90c 489 GreenStop();
michaeljkoster 0:07581223f90c 490 }
michaeljkoster 0:07581223f90c 491
michaeljkoster 0:07581223f90c 492 // Wait for slider touch
michaeljkoster 0:07581223f90c 493 printf("\r\nUse the slider to start an application.\r\n");
michaeljkoster 0:07581223f90c 494 printf("Releasing the slider for more than 3 seconds\r\nwill start the chosen application.\r\n");
michaeljkoster 0:07581223f90c 495 printf("Touching the slider within the 3 seconds\r\ntimeframe allows you to re-select an application.\r\n");
michaeljkoster 0:07581223f90c 496 printf("\r\nThe RGB LED indicates the selection:\r\n");
michaeljkoster 0:07581223f90c 497 printf("ORANGE - Erase all profiles.\r\n");
michaeljkoster 0:07581223f90c 498 printf("PURPLE - Force SmartConfig.\r\n");
michaeljkoster 0:07581223f90c 499 printf("BLUE - Webserver displaying live sensor data.\r\n");
michaeljkoster 0:07581223f90c 500 printf("RED - ARM Sensinode LWM2M client.\r\n");
michaeljkoster 0:07581223f90c 501 printf("GREEN - Android sensor fusion app.\r\n");
michaeljkoster 0:07581223f90c 502 while( tsi.readPercentage() == 0 )
michaeljkoster 0:07581223f90c 503 {
michaeljkoster 0:07581223f90c 504 RED_ON;
michaeljkoster 0:07581223f90c 505 wait(0.2);
michaeljkoster 0:07581223f90c 506 RED_OFF;
michaeljkoster 0:07581223f90c 507 wait(0.2);
michaeljkoster 0:07581223f90c 508 }
michaeljkoster 0:07581223f90c 509 RED_OFF;
michaeljkoster 0:07581223f90c 510
michaeljkoster 0:07581223f90c 511 oldseconds = seconds;
michaeljkoster 0:07581223f90c 512 loop = 100;
michaeljkoster 0:07581223f90c 513 temp = 0;
michaeljkoster 0:07581223f90c 514 // Read slider as long as it is touched.
michaeljkoster 0:07581223f90c 515 // If released for more than 3 seconds, exit
michaeljkoster 0:07581223f90c 516 while((loop != 0) || ((seconds - oldseconds) < 3))
michaeljkoster 0:07581223f90c 517 {
michaeljkoster 0:07581223f90c 518 loop = tsi.readPercentage() * 100;
michaeljkoster 0:07581223f90c 519 if(loop != 0)
michaeljkoster 0:07581223f90c 520 {
michaeljkoster 0:07581223f90c 521 oldseconds = seconds;
michaeljkoster 0:07581223f90c 522 temp = loop;
michaeljkoster 0:07581223f90c 523 }
michaeljkoster 0:07581223f90c 524 if(temp > 80)
michaeljkoster 0:07581223f90c 525 {
michaeljkoster 0:07581223f90c 526 RED_ON; GREEN_ON; BLUE_OFF; //Orange
michaeljkoster 0:07581223f90c 527 }
michaeljkoster 0:07581223f90c 528 else if(temp > 60)
michaeljkoster 0:07581223f90c 529 {
michaeljkoster 0:07581223f90c 530 RED_ON; GREEN_OFF; BLUE_ON; //Purple
michaeljkoster 0:07581223f90c 531 }
michaeljkoster 0:07581223f90c 532 else if(temp > 40)
michaeljkoster 0:07581223f90c 533 {
michaeljkoster 0:07581223f90c 534 RED_OFF; GREEN_OFF; BLUE_ON; //Blue
michaeljkoster 0:07581223f90c 535 }
michaeljkoster 0:07581223f90c 536 else if(temp > 20)
michaeljkoster 0:07581223f90c 537 {
michaeljkoster 0:07581223f90c 538 RED_ON; GREEN_OFF; BLUE_OFF; //Red
michaeljkoster 0:07581223f90c 539 }
michaeljkoster 0:07581223f90c 540 else
michaeljkoster 0:07581223f90c 541 {
michaeljkoster 0:07581223f90c 542 RED_OFF; GREEN_ON; BLUE_OFF; //Green
michaeljkoster 0:07581223f90c 543 }
michaeljkoster 0:07581223f90c 544 }
michaeljkoster 0:07581223f90c 545 RED_OFF; GREEN_OFF; BLUE_OFF;
michaeljkoster 0:07581223f90c 546
michaeljkoster 0:07581223f90c 547 // Execute the user selected application
michaeljkoster 0:07581223f90c 548 if(temp > 80) // Erase all profiles
michaeljkoster 0:07581223f90c 549 {
michaeljkoster 0:07581223f90c 550 server_running = 1;
michaeljkoster 0:07581223f90c 551 RED_OFF; GREEN_OFF; BLUE_OFF;
michaeljkoster 0:07581223f90c 552 printf("\r\nErasing all wireless profiles. \r\n");
michaeljkoster 0:07581223f90c 553 wifi.delete_profiles();
michaeljkoster 0:07581223f90c 554 wifi.stop();
michaeljkoster 0:07581223f90c 555 printf("Finished. Please restart your board. \r\n");
michaeljkoster 0:07581223f90c 556 GreenStop();
michaeljkoster 0:07581223f90c 557 }
michaeljkoster 0:07581223f90c 558
michaeljkoster 0:07581223f90c 559 if(temp > 60) // Force SmartConfig
michaeljkoster 0:07581223f90c 560 {
michaeljkoster 0:07581223f90c 561 server_running = 1;
michaeljkoster 0:07581223f90c 562 RED_OFF; GREEN_OFF; BLUE_OFF;
michaeljkoster 0:07581223f90c 563 printf("\r\nStarting Smart Config configuration. \r\n");
michaeljkoster 0:07581223f90c 564 wifi.start_smart_config(smartconfigkey);
michaeljkoster 0:07581223f90c 565 while (wifi.is_dhcp_configured() == false)
michaeljkoster 0:07581223f90c 566 {
michaeljkoster 0:07581223f90c 567 wait_ms(500);
michaeljkoster 0:07581223f90c 568 printf("Waiting for dhcp to be set. \r\n");
michaeljkoster 0:07581223f90c 569 }
michaeljkoster 0:07581223f90c 570 printf("Finished. Please restart your board. \r\n");
michaeljkoster 0:07581223f90c 571 GreenStop();
michaeljkoster 0:07581223f90c 572 }
michaeljkoster 0:07581223f90c 573
michaeljkoster 0:07581223f90c 574 RED_OFF; GREEN_OFF; BLUE_OFF;
michaeljkoster 0:07581223f90c 575
michaeljkoster 0:07581223f90c 576 printf("\r\nAttempting SSID Connection. \r\n");
michaeljkoster 0:07581223f90c 577 if (wifi.connect() == -1) {
michaeljkoster 0:07581223f90c 578 printf("Failed to connect. Please verify connection details and try again. \r\n");
michaeljkoster 0:07581223f90c 579 } else {
michaeljkoster 0:07581223f90c 580 printf("Connected - IP address: %s \r\n",wifi.getIPAddress());
michaeljkoster 0:07581223f90c 581 }
michaeljkoster 0:07581223f90c 582 LED_D3_ON;
michaeljkoster 0:07581223f90c 583
michaeljkoster 0:07581223f90c 584 server_running = 0;
michaeljkoster 0:07581223f90c 585
michaeljkoster 0:07581223f90c 586 // Start the selected application
michaeljkoster 0:07581223f90c 587 if(temp > 40) // Run Webserver
michaeljkoster 0:07581223f90c 588 {
michaeljkoster 0:07581223f90c 589 compass_type = NED_COMPASS;
michaeljkoster 0:07581223f90c 590 init_eCompass();
michaeljkoster 0:07581223f90c 591 seconds = 0;
michaeljkoster 0:07581223f90c 592 demo_wifi_main();
michaeljkoster 0:07581223f90c 593 }
michaeljkoster 0:07581223f90c 594 if(temp > 20) // Sensinode LWM2M client
michaeljkoster 0:07581223f90c 595 {
michaeljkoster 0:07581223f90c 596 compass_type = NED_COMPASS;
michaeljkoster 0:07581223f90c 597 init_eCompass();
michaeljkoster 0:07581223f90c 598 seconds = 0;
michaeljkoster 0:07581223f90c 599 nsdl_run();
michaeljkoster 0:07581223f90c 600 }
michaeljkoster 0:07581223f90c 601 init_eCompass();
michaeljkoster 0:07581223f90c 602 seconds = 0;
michaeljkoster 0:07581223f90c 603 // Run TCP/IP Connection to host - Sensor Fusion App
michaeljkoster 0:07581223f90c 604 runTCPIPserver();
michaeljkoster 0:07581223f90c 605
michaeljkoster 0:07581223f90c 606 }
michaeljkoster 0:07581223f90c 607