The Hiking Pal tracking device firmware. See full description on the detail page: https://www.hackster.io/bowenfeng/hiking-pal-v1-07c02d

Dependencies:   FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Committer:
bowenfeng
Date:
Thu Dec 22 06:31:32 2016 +0000
Revision:
84:0bf8168b690a
Parent:
82:a6c68da2b94a
Child:
85:43d791cd5967
Auto join the first found hiking.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 68:6e311c747045 1 /* ===================================================================
fkellermavnet 68:6e311c747045 2 Copyright © 2016, AVNET Inc.
fkellermavnet 68:6e311c747045 3
fkellermavnet 68:6e311c747045 4 Licensed under the Apache License, Version 2.0 (the "License");
fkellermavnet 68:6e311c747045 5 you may not use this file except in compliance with the License.
fkellermavnet 68:6e311c747045 6 You may obtain a copy of the License at
fkellermavnet 68:6e311c747045 7
fkellermavnet 68:6e311c747045 8 http://www.apache.org/licenses/LICENSE-2.0
fkellermavnet 68:6e311c747045 9
fkellermavnet 68:6e311c747045 10 Unless required by applicable law or agreed to in writing,
fkellermavnet 68:6e311c747045 11 software distributed under the License is distributed on an
fkellermavnet 68:6e311c747045 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
fkellermavnet 68:6e311c747045 13 either express or implied. See the License for the specific
fkellermavnet 68:6e311c747045 14 language governing permissions and limitations under the License.
fkellermavnet 68:6e311c747045 15
fkellermavnet 68:6e311c747045 16 ======================================================================== */
fkellermavnet 68:6e311c747045 17
stefanrousseau 55:3abf9e3f42e6 18 #include "mbed.h"
JMF 0:9d5134074d84 19 #include <cctype>
JMF 0:9d5134074d84 20 #include <string>
JMF 2:0e2ef866af95 21 #include "config_me.h"
stefanrousseau 4:f83bedd9cab4 22 #include "sensors.h"
stefanrousseau 61:f6b93129f954 23 #include "cell_modem.h"
stefanrousseau 11:e6602513730f 24 #include "hardware.h"
stefanrousseau 11:e6602513730f 25
stefanrousseau 61:f6b93129f954 26 I2C i2c(PTC11, PTC10); //SDA, SCL -- define the I2C pins being used
stefanrousseau 56:cb42ff383dab 27 MODSERIAL pc(USBTX, USBRX, 256, 256); // tx, rx with default tx, rx buffer sizes
stefanrousseau 63:90d7c69993cd 28 MODSERIAL mdm(PTD3, PTD2, 4096, 4096);
stefanrousseau 16:17c5916f2d12 29 DigitalOut led_green(LED_GREEN);
stefanrousseau 16:17c5916f2d12 30 DigitalOut led_red(LED_RED);
stefanrousseau 16:17c5916f2d12 31 DigitalOut led_blue(LED_BLUE);
JMF 0:9d5134074d84 32
JMF 0:9d5134074d84 33
stefanrousseau 3:26b3cc155f39 34 //********************************************************************************************************************************************
stefanrousseau 12:7c94ec5069dc 35 //* Create string with sensor readings that can be sent to flow as an HTTP get
stefanrousseau 3:26b3cc155f39 36 //********************************************************************************************************************************************
bowenfeng 84:0bf8168b690a 37 K64F_Sensors_t SENSOR_DATA = {
stefanrousseau 12:7c94ec5069dc 38 .Temperature = "0",
stefanrousseau 12:7c94ec5069dc 39 .Humidity = "0",
stefanrousseau 12:7c94ec5069dc 40 .AccelX = "0",
stefanrousseau 12:7c94ec5069dc 41 .AccelY = "0",
stefanrousseau 12:7c94ec5069dc 42 .AccelZ = "0",
stefanrousseau 12:7c94ec5069dc 43 .MagnetometerX = "0",
stefanrousseau 12:7c94ec5069dc 44 .MagnetometerY = "0",
stefanrousseau 12:7c94ec5069dc 45 .MagnetometerZ = "0",
stefanrousseau 12:7c94ec5069dc 46 .AmbientLightVis = "0",
stefanrousseau 12:7c94ec5069dc 47 .AmbientLightIr = "0",
stefanrousseau 12:7c94ec5069dc 48 .UVindex = "0",
stefanrousseau 12:7c94ec5069dc 49 .Proximity = "0",
stefanrousseau 12:7c94ec5069dc 50 .Temperature_Si7020 = "0",
stefanrousseau 55:3abf9e3f42e6 51 .Humidity_Si7020 = "0",
stefanrousseau 55:3abf9e3f42e6 52 .Virtual_Sensor1 = "0",
stefanrousseau 55:3abf9e3f42e6 53 .Virtual_Sensor2 = "0",
stefanrousseau 55:3abf9e3f42e6 54 .Virtual_Sensor3 = "0",
stefanrousseau 55:3abf9e3f42e6 55 .Virtual_Sensor4 = "0",
stefanrousseau 55:3abf9e3f42e6 56 .Virtual_Sensor5 = "0",
stefanrousseau 55:3abf9e3f42e6 57 .Virtual_Sensor6 = "0",
stefanrousseau 55:3abf9e3f42e6 58 .Virtual_Sensor7 = "0",
stefanrousseau 71:45a5e426df81 59 .Virtual_Sensor8 = "0",
stefanrousseau 72:b500e1507b5f 60 .GPS_Satellites = "0",
stefanrousseau 71:45a5e426df81 61 .GPS_Latitude = "0",
stefanrousseau 71:45a5e426df81 62 .GPS_Longitude = "0",
stefanrousseau 71:45a5e426df81 63 .GPS_Altitude = "0",
stefanrousseau 71:45a5e426df81 64 .GPS_Speed = "0",
stefanrousseau 71:45a5e426df81 65 .GPS_Course = "0"
stefanrousseau 3:26b3cc155f39 66 };
stefanrousseau 12:7c94ec5069dc 67
bowenfeng 84:0bf8168b690a 68 void display_app_firmware_version(void) {
fkellermavnet 77:c65eae5b9958 69 PUTS("\r\n\r\nApp Firmware: Release 1.0 - built: "__DATE__" "__TIME__"\r\n\r\n");
fkellermavnet 77:c65eae5b9958 70 }
fkellermavnet 77:c65eae5b9958 71
bowenfeng 84:0bf8168b690a 72 void GenerateModemString(char * modem_string, long long hid, long long sid) {
bowenfeng 82:a6c68da2b94a 73 sprintf(
bowenfeng 82:a6c68da2b94a 74 modem_string,
bowenfeng 82:a6c68da2b94a 75 "GET %s/hikings/%lld/sessions/%lld/moves?lat=%s&lng=%s HTTP/1.1\r\nHost: %s\r\n\r\n",
bowenfeng 82:a6c68da2b94a 76 FLOW_BASE_URL,
bowenfeng 82:a6c68da2b94a 77 hid,
bowenfeng 82:a6c68da2b94a 78 sid,
bowenfeng 82:a6c68da2b94a 79 SENSOR_DATA.GPS_Latitude,
bowenfeng 82:a6c68da2b94a 80 SENSOR_DATA.GPS_Longitude,
bowenfeng 82:a6c68da2b94a 81 MY_SERVER_URL);
stefanrousseau 3:26b3cc155f39 82 } //GenerateModemString
stefanrousseau 3:26b3cc155f39 83
stefanrousseau 3:26b3cc155f39 84
stefanrousseau 3:26b3cc155f39 85 //Periodic timer
stefanrousseau 3:26b3cc155f39 86 Ticker OneMsTicker;
stefanrousseau 3:26b3cc155f39 87 volatile bool bTimerExpiredFlag = false;
stefanrousseau 3:26b3cc155f39 88 int OneMsTicks = 0;
stefanrousseau 3:26b3cc155f39 89 int iTimer1Interval_ms = 1000;
stefanrousseau 3:26b3cc155f39 90 //********************************************************************************************************************************************
stefanrousseau 3:26b3cc155f39 91 //* Periodic 1ms timer tick
stefanrousseau 3:26b3cc155f39 92 //********************************************************************************************************************************************
bowenfeng 84:0bf8168b690a 93 void OneMsFunction() {
stefanrousseau 3:26b3cc155f39 94 OneMsTicks++;
bowenfeng 84:0bf8168b690a 95 if ((OneMsTicks % iTimer1Interval_ms) == 0) {
stefanrousseau 3:26b3cc155f39 96 bTimerExpiredFlag = true;
stefanrousseau 3:26b3cc155f39 97 }
stefanrousseau 3:26b3cc155f39 98 } //OneMsFunction()
stefanrousseau 3:26b3cc155f39 99
stefanrousseau 16:17c5916f2d12 100 //********************************************************************************************************************************************
stefanrousseau 16:17c5916f2d12 101 //* Set the RGB LED's Color
stefanrousseau 16:17c5916f2d12 102 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
stefanrousseau 16:17c5916f2d12 103 //********************************************************************************************************************************************
bowenfeng 84:0bf8168b690a 104 void SetLedColor(unsigned char ucColor) {
stefanrousseau 16:17c5916f2d12 105 //Note that when an LED is on, you write a 0 to it:
stefanrousseau 16:17c5916f2d12 106 led_red = !(ucColor & 0x1); //bit 0
stefanrousseau 16:17c5916f2d12 107 led_green = !(ucColor & 0x2); //bit 1
stefanrousseau 16:17c5916f2d12 108 led_blue = !(ucColor & 0x4); //bit 2
stefanrousseau 16:17c5916f2d12 109 } //SetLedColor()
stefanrousseau 16:17c5916f2d12 110
stefanrousseau 16:17c5916f2d12 111 //********************************************************************************************************************************************
stefanrousseau 61:f6b93129f954 112 //* Process the JSON response. In this example we are only extracting a LED color.
stefanrousseau 16:17c5916f2d12 113 //********************************************************************************************************************************************
bowenfeng 84:0bf8168b690a 114 bool parse_JSON(char* json_string) {
stefanrousseau 16:17c5916f2d12 115 char* beginquote;
stefanrousseau 16:17c5916f2d12 116 char token[] = "\"LED\":\"";
stefanrousseau 16:17c5916f2d12 117 beginquote = strstr(json_string, token );
stefanrousseau 16:17c5916f2d12 118 if ((beginquote != 0))
stefanrousseau 16:17c5916f2d12 119 {
stefanrousseau 16:17c5916f2d12 120 char cLedColor = beginquote[strlen(token)];
stefanrousseau 64:09004cd610df 121 PRINTF(GRN "LED Found : %c" DEF "\r\n", cLedColor);
stefanrousseau 16:17c5916f2d12 122 switch(cLedColor)
stefanrousseau 16:17c5916f2d12 123 {
stefanrousseau 16:17c5916f2d12 124 case 'O':
stefanrousseau 16:17c5916f2d12 125 { //Off
stefanrousseau 16:17c5916f2d12 126 SetLedColor(0);
stefanrousseau 16:17c5916f2d12 127 break;
stefanrousseau 16:17c5916f2d12 128 }
stefanrousseau 16:17c5916f2d12 129 case 'R':
stefanrousseau 16:17c5916f2d12 130 { //Red
stefanrousseau 16:17c5916f2d12 131 SetLedColor(1);
stefanrousseau 16:17c5916f2d12 132 break;
stefanrousseau 16:17c5916f2d12 133 }
stefanrousseau 16:17c5916f2d12 134 case 'G':
stefanrousseau 16:17c5916f2d12 135 { //Green
stefanrousseau 16:17c5916f2d12 136 SetLedColor(2);
stefanrousseau 16:17c5916f2d12 137 break;
stefanrousseau 16:17c5916f2d12 138 }
stefanrousseau 16:17c5916f2d12 139 case 'Y':
stefanrousseau 16:17c5916f2d12 140 { //Yellow
stefanrousseau 16:17c5916f2d12 141 SetLedColor(3);
stefanrousseau 16:17c5916f2d12 142 break;
stefanrousseau 16:17c5916f2d12 143 }
stefanrousseau 16:17c5916f2d12 144 case 'B':
stefanrousseau 16:17c5916f2d12 145 { //Blue
stefanrousseau 16:17c5916f2d12 146 SetLedColor(4);
stefanrousseau 16:17c5916f2d12 147 break;
stefanrousseau 16:17c5916f2d12 148 }
stefanrousseau 16:17c5916f2d12 149 case 'M':
stefanrousseau 16:17c5916f2d12 150 { //Magenta
stefanrousseau 16:17c5916f2d12 151 SetLedColor(5);
stefanrousseau 16:17c5916f2d12 152 break;
stefanrousseau 16:17c5916f2d12 153 }
stefanrousseau 16:17c5916f2d12 154 case 'T':
stefanrousseau 16:17c5916f2d12 155 { //Turquoise
stefanrousseau 16:17c5916f2d12 156 SetLedColor(6);
stefanrousseau 16:17c5916f2d12 157 break;
stefanrousseau 16:17c5916f2d12 158 }
stefanrousseau 16:17c5916f2d12 159 case 'W':
stefanrousseau 16:17c5916f2d12 160 { //White
stefanrousseau 16:17c5916f2d12 161 SetLedColor(7);
stefanrousseau 16:17c5916f2d12 162 break;
stefanrousseau 16:17c5916f2d12 163 }
stefanrousseau 16:17c5916f2d12 164 default:
stefanrousseau 16:17c5916f2d12 165 {
stefanrousseau 16:17c5916f2d12 166 break;
stefanrousseau 16:17c5916f2d12 167 }
stefanrousseau 16:17c5916f2d12 168 } //switch(cLedColor)
stefanrousseau 16:17c5916f2d12 169 return true;
stefanrousseau 16:17c5916f2d12 170 }
stefanrousseau 16:17c5916f2d12 171 else
stefanrousseau 16:17c5916f2d12 172 {
stefanrousseau 16:17c5916f2d12 173 return false;
stefanrousseau 16:17c5916f2d12 174 }
stefanrousseau 16:17c5916f2d12 175 } //parse_JSON
stefanrousseau 16:17c5916f2d12 176
bowenfeng 84:0bf8168b690a 177 void extract_longlong(const char* s, char v[]) {
bowenfeng 84:0bf8168b690a 178 long long value = strtoll(s, NULL, 0);
bowenfeng 84:0bf8168b690a 179 sprintf(v, "%lld", value);
bowenfeng 84:0bf8168b690a 180 }
bowenfeng 84:0bf8168b690a 181
bowenfeng 84:0bf8168b690a 182 void find_longlong(const char* s, const char* token, char v[]) {
bowenfeng 84:0bf8168b690a 183 const char* tokenBegin = strstr(s, token);
bowenfeng 84:0bf8168b690a 184 if (tokenBegin != 0) {
bowenfeng 84:0bf8168b690a 185 extract_longlong(tokenBegin + strlen(token), v);
bowenfeng 84:0bf8168b690a 186 }
bowenfeng 84:0bf8168b690a 187 }
bowenfeng 84:0bf8168b690a 188
bowenfeng 84:0bf8168b690a 189 void find_first_hiking(char hikingId[]) {
bowenfeng 84:0bf8168b690a 190 char request[512];
bowenfeng 84:0bf8168b690a 191 char response[512];
bowenfeng 84:0bf8168b690a 192 sprintf(request, "GET %s/hikings HTTP/1.1\r\nHost: %s\r\n\r\n", FLOW_BASE_URL, MY_SERVER_URL);
bowenfeng 84:0bf8168b690a 193 if (cell_modem_Sendreceive(&request[0], &response[0])) {
bowenfeng 84:0bf8168b690a 194 find_longlong(response, "\"id\":", hikingId);
bowenfeng 84:0bf8168b690a 195 }
bowenfeng 84:0bf8168b690a 196 }
bowenfeng 84:0bf8168b690a 197
bowenfeng 84:0bf8168b690a 198 void join_hiking(const char* hikingId, const char* name, char sessionId[]) {
bowenfeng 84:0bf8168b690a 199 char request[512];
bowenfeng 84:0bf8168b690a 200 char response[512];
bowenfeng 84:0bf8168b690a 201 sprintf(request, "GET %s/hikings/%s/sessions?name=%s HTTP/1.1\r\nHost: %s\r\n\r\n", FLOW_BASE_URL, hikingId, name, MY_SERVER_URL);
bowenfeng 84:0bf8168b690a 202 if (cell_modem_Sendreceive(&request[0], &response[0])) {
bowenfeng 84:0bf8168b690a 203 find_longlong(response, "\"id\":", sessionId);
bowenfeng 84:0bf8168b690a 204 }
bowenfeng 84:0bf8168b690a 205 }
bowenfeng 84:0bf8168b690a 206
JMF 0:9d5134074d84 207 int main() {
stefanrousseau 61:f6b93129f954 208 static unsigned ledOnce = 0;
stefanrousseau 72:b500e1507b5f 209 //delay so that the debug terminal can open after power-on reset:
fkellermavnet 77:c65eae5b9958 210 wait (5.0);
stefanrousseau 61:f6b93129f954 211 pc.baud(115200);
fkellermavnet 77:c65eae5b9958 212
fkellermavnet 77:c65eae5b9958 213 display_app_firmware_version();
fkellermavnet 77:c65eae5b9958 214
stefanrousseau 64:09004cd610df 215 PRINTF(GRN "Hello World from the Cellular IoT Kit!\r\n\r\n");
JMF 0:9d5134074d84 216
stefanrousseau 61:f6b93129f954 217 //Initialize the I2C sensors that are present
stefanrousseau 11:e6602513730f 218 sensors_init();
stefanrousseau 12:7c94ec5069dc 219 read_sensors();
stefanrousseau 11:e6602513730f 220
stefanrousseau 61:f6b93129f954 221 // Set LED to RED until init finishes
stefanrousseau 61:f6b93129f954 222 SetLedColor(0x1); //Red
JMF 0:9d5134074d84 223 // Initialize the modem
stefanrousseau 64:09004cd610df 224 PRINTF("\r\n");
stefanrousseau 61:f6b93129f954 225 cell_modem_init();
fkellermavnet 77:c65eae5b9958 226 display_wnc_firmware_rev();
fkellermavnet 77:c65eae5b9958 227
stefanrousseau 61:f6b93129f954 228 // Set LED BLUE for partial init
stefanrousseau 61:f6b93129f954 229 SetLedColor(0x4); //Blue
JMF 0:9d5134074d84 230
stefanrousseau 3:26b3cc155f39 231 //Create a 1ms timer tick function:
stefanrousseau 61:f6b93129f954 232 iTimer1Interval_ms = SENSOR_UPDATE_INTERVAL_MS;
stefanrousseau 3:26b3cc155f39 233 OneMsTicker.attach(OneMsFunction, 0.001f) ;
bowenfeng 84:0bf8168b690a 234
bowenfeng 84:0bf8168b690a 235 char hid[20] = {0};
bowenfeng 84:0bf8168b690a 236 char sid[20] = {0};
bowenfeng 84:0bf8168b690a 237 char sessionName[20] = {0};
bowenfeng 84:0bf8168b690a 238
bowenfeng 84:0bf8168b690a 239 sprintf(sessionName, "IoT-kit-%d", rand() % 1000);
bowenfeng 84:0bf8168b690a 240
bowenfeng 84:0bf8168b690a 241 find_first_hiking(hid);
bowenfeng 84:0bf8168b690a 242 PRINTF("Found Hiking ID: ");
bowenfeng 84:0bf8168b690a 243 PRINTF(hid);
bowenfeng 84:0bf8168b690a 244 PRINTF("\r\n");
bowenfeng 84:0bf8168b690a 245
bowenfeng 84:0bf8168b690a 246 join_hiking(hid, sessionName, sid);
bowenfeng 84:0bf8168b690a 247 PRINTF("Allocated Session ID: ");
bowenfeng 84:0bf8168b690a 248 PRINTF(sid);
bowenfeng 84:0bf8168b690a 249 PRINTF("\r\n");
fkellermavnet 26:8d6e7e7cdcae 250
JMF 2:0e2ef866af95 251 // Send and receive data perpetually
JMF 2:0e2ef866af95 252 while(1) {
bowenfeng 84:0bf8168b690a 253 if (bTimerExpiredFlag) {
stefanrousseau 3:26b3cc155f39 254 bTimerExpiredFlag = false;
stefanrousseau 4:f83bedd9cab4 255 read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor
stefanrousseau 3:26b3cc155f39 256 char modem_string[512];
bowenfeng 82:a6c68da2b94a 257 GenerateModemString(&modem_string[0], 1482292398681, 1482293421314);
stefanrousseau 61:f6b93129f954 258 char myJsonResponse[512];
stefanrousseau 61:f6b93129f954 259 if (cell_modem_Sendreceive(&modem_string[0], &myJsonResponse[0]))
fkellermavnet 20:27a4f27254d0 260 {
bowenfeng 82:a6c68da2b94a 261 // if (!ledOnce)
bowenfeng 82:a6c68da2b94a 262 // {
bowenfeng 82:a6c68da2b94a 263 // ledOnce = 1;
bowenfeng 82:a6c68da2b94a 264 // SetLedColor(0x2); //Green
bowenfeng 82:a6c68da2b94a 265 // }
bowenfeng 82:a6c68da2b94a 266 // parse_JSON(&myJsonResponse[0]);
stefanrousseau 16:17c5916f2d12 267 }
stefanrousseau 3:26b3cc155f39 268 } //bTimerExpiredFlag
stefanrousseau 3:26b3cc155f39 269 } //forever loop
JMF 0:9d5134074d84 270 }