This is used for sending Data to receiving mDot

Dependencies:   libmDot-dev-mbed5-deprecated sd-driver ISL29011

Fork of mdot-examples by 3mdeb

Committer:
SDesign2018
Date:
Sat Apr 14 18:20:55 2018 +0000
Revision:
31:79940947df2c
Parent:
30:218c795a8081
SD card functionality isn't working as wanted. Was working before.; Add method to send longitude and latitude floats.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SDesign2018 26:15df8f054d11 1 /*
SDesign2018 30:218c795a8081 2 3/27/2018 mdot version 3.1.0, mbed version 5.7.4
SDesign2018 30:218c795a8081 3 4/14/2018 mdot version 3.1.0, mbed version 5.7.7
SDesign2018 26:15df8f054d11 4 */
SDesign2018 26:15df8f054d11 5
SDesign2018 26:15df8f054d11 6 #include <stdlib.h>
SDesign2018 26:15df8f054d11 7 #include <iostream>
SDesign2018 26:15df8f054d11 8 #include <string.h>
SDesign2018 26:15df8f054d11 9 #include <mbed.h>
SDesign2018 26:15df8f054d11 10 #include "dot_util.h"
SDesign2018 26:15df8f054d11 11 #include "RadioEvent.h"
SDesign2018 26:15df8f054d11 12 #include "itoa.h"
SDesign2018 26:15df8f054d11 13
SDesign2018 26:15df8f054d11 14 #define BUFFER_SIZE 10
SDesign2018 26:15df8f054d11 15
SDesign2018 26:15df8f054d11 16 //note: added GPS functions , variables below (will organize better later ski
SDesign2018 26:15df8f054d11 17 //and gps code in main is noted
SDesign2018 26:15df8f054d11 18
SDesign2018 26:15df8f054d11 19
SDesign2018 26:15df8f054d11 20
SDesign2018 26:15df8f054d11 21 ///-----------------FOR GPS------BELOW----------------------------------
SDesign2018 26:15df8f054d11 22 //
SDesign2018 26:15df8f054d11 23
SDesign2018 26:15df8f054d11 24 #include "MBed_Adafruit_GPS.h"
SDesign2018 26:15df8f054d11 25
SDesign2018 26:15df8f054d11 26
SDesign2018 26:15df8f054d11 27
SDesign2018 26:15df8f054d11 28 // how long are max NMEA lines to parse?
SDesign2018 26:15df8f054d11 29 #define MAXLINELENGTH 120
SDesign2018 26:15df8f054d11 30
SDesign2018 26:15df8f054d11 31 // we double buffer: read one line in and leave one for the main program
SDesign2018 26:15df8f054d11 32 volatile char line1[MAXLINELENGTH];
SDesign2018 26:15df8f054d11 33 volatile char line2[MAXLINELENGTH];
SDesign2018 26:15df8f054d11 34 // our index into filling the current line
SDesign2018 26:15df8f054d11 35 volatile uint16_t lineidx=0;
SDesign2018 26:15df8f054d11 36 // pointers to the double buffers
SDesign2018 26:15df8f054d11 37 volatile char *currentline;
SDesign2018 26:15df8f054d11 38 volatile char *lastline;
SDesign2018 26:15df8f054d11 39 volatile bool recvdflag;
SDesign2018 26:15df8f054d11 40 volatile bool inStandbyMode;
SDesign2018 26:15df8f054d11 41
SDesign2018 26:15df8f054d11 42
SDesign2018 26:15df8f054d11 43
SDesign2018 26:15df8f054d11 44
SDesign2018 26:15df8f054d11 45 bool Adafruit_GPS::parse(char *nmea) {
SDesign2018 26:15df8f054d11 46 // do checksum check
SDesign2018 26:15df8f054d11 47
SDesign2018 26:15df8f054d11 48 // first look if we even have one
SDesign2018 26:15df8f054d11 49 if (nmea[strlen(nmea)-4] == '*') {
SDesign2018 26:15df8f054d11 50 uint16_t sum = parseHex(nmea[strlen(nmea)-3]) * 16;
SDesign2018 26:15df8f054d11 51 sum += parseHex(nmea[strlen(nmea)-2]);
SDesign2018 26:15df8f054d11 52
SDesign2018 26:15df8f054d11 53 // check checksum
SDesign2018 26:15df8f054d11 54 for (uint8_t i=1; i < (strlen(nmea)-4); i++) {
SDesign2018 26:15df8f054d11 55 sum ^= nmea[i];
SDesign2018 26:15df8f054d11 56 }
SDesign2018 26:15df8f054d11 57 if (sum != 0) {
SDesign2018 26:15df8f054d11 58 // bad checksum :(
SDesign2018 26:15df8f054d11 59 //return false;
SDesign2018 26:15df8f054d11 60 }
SDesign2018 26:15df8f054d11 61 }
SDesign2018 26:15df8f054d11 62
SDesign2018 26:15df8f054d11 63 // look for a few common sentences
SDesign2018 26:15df8f054d11 64 if (strstr(nmea, "$GPGGA")) {
SDesign2018 26:15df8f054d11 65 // found GGA
SDesign2018 26:15df8f054d11 66 char *p = nmea;
SDesign2018 26:15df8f054d11 67 // get time
SDesign2018 26:15df8f054d11 68 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 69 float timef = atof(p);
SDesign2018 26:15df8f054d11 70 uint32_t time = timef;
SDesign2018 26:15df8f054d11 71 hour = time / 10000;
SDesign2018 26:15df8f054d11 72 minute = (time % 10000) / 100;
SDesign2018 26:15df8f054d11 73 seconds = (time % 100);
SDesign2018 26:15df8f054d11 74
SDesign2018 26:15df8f054d11 75 milliseconds = fmod((double) timef, 1.0) * 1000;
SDesign2018 26:15df8f054d11 76
SDesign2018 26:15df8f054d11 77 // parse out latitude
SDesign2018 26:15df8f054d11 78 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 79 latitude = atof(p);
SDesign2018 26:15df8f054d11 80
SDesign2018 26:15df8f054d11 81 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 82 if (p[0] == 'N') lat = 'N';
SDesign2018 26:15df8f054d11 83 else if (p[0] == 'S') lat = 'S';
SDesign2018 26:15df8f054d11 84 else if (p[0] == ',') lat = 0;
SDesign2018 26:15df8f054d11 85 else return false;
SDesign2018 26:15df8f054d11 86
SDesign2018 26:15df8f054d11 87 // parse out longitude
SDesign2018 26:15df8f054d11 88 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 89 longitude = atof(p);
SDesign2018 26:15df8f054d11 90
SDesign2018 26:15df8f054d11 91 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 92 if (p[0] == 'W') lon = 'W';
SDesign2018 26:15df8f054d11 93 else if (p[0] == 'E') lon = 'E';
SDesign2018 26:15df8f054d11 94 else if (p[0] == ',') lon = 0;
SDesign2018 26:15df8f054d11 95 else return false;
SDesign2018 26:15df8f054d11 96
SDesign2018 26:15df8f054d11 97 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 98 fixquality = atoi(p);
SDesign2018 26:15df8f054d11 99
SDesign2018 26:15df8f054d11 100 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 101 satellites = atoi(p);
SDesign2018 26:15df8f054d11 102
SDesign2018 26:15df8f054d11 103 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 104 HDOP = atof(p);
SDesign2018 26:15df8f054d11 105
SDesign2018 26:15df8f054d11 106 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 107 altitude = atof(p);
SDesign2018 26:15df8f054d11 108 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 109 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 110 geoidheight = atof(p);
SDesign2018 26:15df8f054d11 111 return true;
SDesign2018 26:15df8f054d11 112 }
SDesign2018 26:15df8f054d11 113 if (strstr(nmea, "$GPRMC")) {
SDesign2018 26:15df8f054d11 114 // found RMC
SDesign2018 26:15df8f054d11 115 char *p = nmea;
SDesign2018 26:15df8f054d11 116
SDesign2018 26:15df8f054d11 117 // get time
SDesign2018 26:15df8f054d11 118 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 119 float timef = atof(p);
SDesign2018 26:15df8f054d11 120 uint32_t time = timef;
SDesign2018 26:15df8f054d11 121 hour = time / 10000;
SDesign2018 26:15df8f054d11 122 minute = (time % 10000) / 100;
SDesign2018 26:15df8f054d11 123 seconds = (time % 100);
SDesign2018 26:15df8f054d11 124
SDesign2018 26:15df8f054d11 125 milliseconds = fmod((double) timef, 1.0) * 1000;
SDesign2018 26:15df8f054d11 126
SDesign2018 26:15df8f054d11 127 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 128 // Serial.println(p);
SDesign2018 26:15df8f054d11 129 if (p[0] == 'A')
SDesign2018 26:15df8f054d11 130 fix = true;
SDesign2018 26:15df8f054d11 131 else if (p[0] == 'V')
SDesign2018 26:15df8f054d11 132 fix = false;
SDesign2018 26:15df8f054d11 133 else
SDesign2018 26:15df8f054d11 134 return false;
SDesign2018 26:15df8f054d11 135
SDesign2018 26:15df8f054d11 136 // parse out latitude
SDesign2018 26:15df8f054d11 137 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 138 latitude = atof(p);
SDesign2018 26:15df8f054d11 139
SDesign2018 26:15df8f054d11 140 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 141 if (p[0] == 'N') lat = 'N';
SDesign2018 26:15df8f054d11 142 else if (p[0] == 'S') lat = 'S';
SDesign2018 26:15df8f054d11 143 else if (p[0] == ',') lat = 0;
SDesign2018 26:15df8f054d11 144 else return false;
SDesign2018 26:15df8f054d11 145
SDesign2018 26:15df8f054d11 146 // parse out longitude
SDesign2018 26:15df8f054d11 147 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 148 longitude = atof(p);
SDesign2018 26:15df8f054d11 149
SDesign2018 26:15df8f054d11 150 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 151 if (p[0] == 'W') lon = 'W';
SDesign2018 26:15df8f054d11 152 else if (p[0] == 'E') lon = 'E';
SDesign2018 26:15df8f054d11 153 else if (p[0] == ',') lon = 0;
SDesign2018 26:15df8f054d11 154 else return false;
SDesign2018 26:15df8f054d11 155
SDesign2018 26:15df8f054d11 156 // speed
SDesign2018 26:15df8f054d11 157 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 158 speed = atof(p);
SDesign2018 26:15df8f054d11 159
SDesign2018 26:15df8f054d11 160 // angle
SDesign2018 26:15df8f054d11 161 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 162 angle = atof(p);
SDesign2018 26:15df8f054d11 163
SDesign2018 26:15df8f054d11 164 p = strchr(p, ',')+1;
SDesign2018 26:15df8f054d11 165 uint32_t fulldate = atof(p);
SDesign2018 26:15df8f054d11 166 day = fulldate / 10000;
SDesign2018 26:15df8f054d11 167 month = (fulldate % 10000) / 100;
SDesign2018 26:15df8f054d11 168 year = (fulldate % 100);
SDesign2018 26:15df8f054d11 169
SDesign2018 26:15df8f054d11 170 // we dont parse the remaining, yet!
SDesign2018 26:15df8f054d11 171 return true;
SDesign2018 26:15df8f054d11 172 }
SDesign2018 26:15df8f054d11 173
SDesign2018 26:15df8f054d11 174 return false;
SDesign2018 26:15df8f054d11 175 }
SDesign2018 26:15df8f054d11 176
SDesign2018 26:15df8f054d11 177 char Adafruit_GPS::read(void) {
SDesign2018 26:15df8f054d11 178 char c = 0;
SDesign2018 26:15df8f054d11 179
SDesign2018 26:15df8f054d11 180 if (paused) return c;
SDesign2018 26:15df8f054d11 181
SDesign2018 26:15df8f054d11 182 if(!gpsSerial->readable()) return c;
SDesign2018 26:15df8f054d11 183 c = gpsSerial->getc();
SDesign2018 26:15df8f054d11 184
SDesign2018 26:15df8f054d11 185 //Serial.print(c);
SDesign2018 26:15df8f054d11 186
SDesign2018 26:15df8f054d11 187 if (c == '$') {
SDesign2018 26:15df8f054d11 188 currentline[lineidx] = 0;
SDesign2018 26:15df8f054d11 189 lineidx = 0;
SDesign2018 26:15df8f054d11 190 }
SDesign2018 26:15df8f054d11 191 if (c == '\n') {
SDesign2018 26:15df8f054d11 192 currentline[lineidx] = 0;
SDesign2018 26:15df8f054d11 193
SDesign2018 26:15df8f054d11 194 if (currentline == line1) {
SDesign2018 26:15df8f054d11 195 currentline = line2;
SDesign2018 26:15df8f054d11 196 lastline = line1;
SDesign2018 26:15df8f054d11 197 } else {
SDesign2018 26:15df8f054d11 198 currentline = line1;
SDesign2018 26:15df8f054d11 199 lastline = line2;
SDesign2018 26:15df8f054d11 200 }
SDesign2018 26:15df8f054d11 201
SDesign2018 26:15df8f054d11 202 lineidx = 0;
SDesign2018 26:15df8f054d11 203 recvdflag = true;
SDesign2018 26:15df8f054d11 204 }
SDesign2018 26:15df8f054d11 205
SDesign2018 26:15df8f054d11 206 currentline[lineidx++] = c;
SDesign2018 26:15df8f054d11 207 if (lineidx >= MAXLINELENGTH)
SDesign2018 26:15df8f054d11 208 lineidx = MAXLINELENGTH-1;
SDesign2018 26:15df8f054d11 209
SDesign2018 26:15df8f054d11 210 return c;
SDesign2018 26:15df8f054d11 211 }
SDesign2018 26:15df8f054d11 212
SDesign2018 26:15df8f054d11 213 Adafruit_GPS::Adafruit_GPS (Serial *ser)
SDesign2018 26:15df8f054d11 214 {
SDesign2018 26:15df8f054d11 215 common_init(); // Set everything to common state, then...
SDesign2018 26:15df8f054d11 216 gpsSerial = ser; // ...override gpsSwSerial with value passed.
SDesign2018 26:15df8f054d11 217 }
SDesign2018 26:15df8f054d11 218
SDesign2018 26:15df8f054d11 219 // Initialization code used by all constructor types
SDesign2018 26:15df8f054d11 220 void Adafruit_GPS::common_init(void) {
SDesign2018 26:15df8f054d11 221 gpsSerial = NULL;
SDesign2018 26:15df8f054d11 222 recvdflag = false;
SDesign2018 26:15df8f054d11 223 paused = false;
SDesign2018 26:15df8f054d11 224 lineidx = 0;
SDesign2018 26:15df8f054d11 225 currentline = line1;
SDesign2018 26:15df8f054d11 226 lastline = line2;
SDesign2018 26:15df8f054d11 227
SDesign2018 26:15df8f054d11 228 hour = minute = seconds = year = month = day =
SDesign2018 26:15df8f054d11 229 fixquality = satellites = 0; // uint8_t
SDesign2018 26:15df8f054d11 230 lat = lon = mag = 0; // char
SDesign2018 26:15df8f054d11 231 fix = false; // bool
SDesign2018 26:15df8f054d11 232 milliseconds = 0; // uint16_t
SDesign2018 26:15df8f054d11 233 latitude = longitude = geoidheight = altitude =
SDesign2018 26:15df8f054d11 234 speed = angle = magvariation = HDOP = 0.0; // float
SDesign2018 26:15df8f054d11 235 }
SDesign2018 26:15df8f054d11 236
SDesign2018 26:15df8f054d11 237 void Adafruit_GPS::begin(int baud)
SDesign2018 26:15df8f054d11 238 {
SDesign2018 26:15df8f054d11 239 gpsSerial->baud(baud);
SDesign2018 26:15df8f054d11 240 wait_ms(10);
SDesign2018 26:15df8f054d11 241 }
SDesign2018 26:15df8f054d11 242
SDesign2018 26:15df8f054d11 243 void Adafruit_GPS::sendCommand(char *str) {
SDesign2018 26:15df8f054d11 244 gpsSerial->printf("%s",str);
SDesign2018 26:15df8f054d11 245 }
SDesign2018 26:15df8f054d11 246
SDesign2018 26:15df8f054d11 247 bool Adafruit_GPS::newNMEAreceived(void) {
SDesign2018 26:15df8f054d11 248 return recvdflag;
SDesign2018 26:15df8f054d11 249 }
SDesign2018 26:15df8f054d11 250
SDesign2018 26:15df8f054d11 251 void Adafruit_GPS::pause(bool p) {
SDesign2018 26:15df8f054d11 252 paused = p;
SDesign2018 26:15df8f054d11 253 }
SDesign2018 26:15df8f054d11 254
SDesign2018 26:15df8f054d11 255 char *Adafruit_GPS::lastNMEA(void) {
SDesign2018 26:15df8f054d11 256 recvdflag = false;
SDesign2018 26:15df8f054d11 257 return (char *)lastline;
SDesign2018 26:15df8f054d11 258 }
SDesign2018 26:15df8f054d11 259
SDesign2018 26:15df8f054d11 260 // read a Hex value and return the decimal equivalent
SDesign2018 26:15df8f054d11 261 uint8_t Adafruit_GPS::parseHex(char c) {
SDesign2018 26:15df8f054d11 262 if (c < '0')
SDesign2018 26:15df8f054d11 263 return 0;
SDesign2018 26:15df8f054d11 264 if (c <= '9')
SDesign2018 26:15df8f054d11 265 return c - '0';
SDesign2018 26:15df8f054d11 266 if (c < 'A')
SDesign2018 26:15df8f054d11 267 return 0;
SDesign2018 26:15df8f054d11 268 if (c <= 'F')
SDesign2018 26:15df8f054d11 269 return (c - 'A')+10;
SDesign2018 26:15df8f054d11 270 }
SDesign2018 26:15df8f054d11 271
SDesign2018 26:15df8f054d11 272 bool Adafruit_GPS::waitForSentence(char *wait4me, uint8_t max) {
SDesign2018 26:15df8f054d11 273 char str[20];
SDesign2018 26:15df8f054d11 274
SDesign2018 26:15df8f054d11 275 uint8_t i=0;
SDesign2018 26:15df8f054d11 276 while (i < max) {
SDesign2018 26:15df8f054d11 277 if (newNMEAreceived()) {
SDesign2018 26:15df8f054d11 278 char *nmea = lastNMEA();
SDesign2018 26:15df8f054d11 279 strncpy(str, nmea, 20);
SDesign2018 26:15df8f054d11 280 str[19] = 0;
SDesign2018 26:15df8f054d11 281 i++;
SDesign2018 26:15df8f054d11 282
SDesign2018 26:15df8f054d11 283 if (strstr(str, wait4me))
SDesign2018 26:15df8f054d11 284 return true;
SDesign2018 26:15df8f054d11 285 }
SDesign2018 26:15df8f054d11 286 }
SDesign2018 26:15df8f054d11 287
SDesign2018 26:15df8f054d11 288 return false;
SDesign2018 26:15df8f054d11 289 }
SDesign2018 26:15df8f054d11 290
SDesign2018 26:15df8f054d11 291 bool Adafruit_GPS::LOCUS_StartLogger(void) {
SDesign2018 26:15df8f054d11 292 sendCommand(PMTK_LOCUS_STARTLOG);
SDesign2018 26:15df8f054d11 293 recvdflag = false;
SDesign2018 26:15df8f054d11 294 return waitForSentence(PMTK_LOCUS_LOGSTARTED);
SDesign2018 26:15df8f054d11 295 }
SDesign2018 26:15df8f054d11 296
SDesign2018 26:15df8f054d11 297 bool Adafruit_GPS::LOCUS_ReadStatus(void) {
SDesign2018 26:15df8f054d11 298 sendCommand(PMTK_LOCUS_QUERY_STATUS);
SDesign2018 26:15df8f054d11 299
SDesign2018 26:15df8f054d11 300 if (! waitForSentence("$PMTKLOG"))
SDesign2018 26:15df8f054d11 301 return false;
SDesign2018 26:15df8f054d11 302
SDesign2018 26:15df8f054d11 303 char *response = lastNMEA();
SDesign2018 26:15df8f054d11 304 uint16_t parsed[10];
SDesign2018 26:15df8f054d11 305 uint8_t i;
SDesign2018 26:15df8f054d11 306
SDesign2018 26:15df8f054d11 307 for (i=0; i<10; i++) parsed[i] = -1;
SDesign2018 26:15df8f054d11 308
SDesign2018 26:15df8f054d11 309 response = strchr(response, ',');
SDesign2018 26:15df8f054d11 310 for (i=0; i<10; i++) {
SDesign2018 26:15df8f054d11 311 if (!response || (response[0] == 0) || (response[0] == '*'))
SDesign2018 26:15df8f054d11 312 break;
SDesign2018 26:15df8f054d11 313 response++;
SDesign2018 26:15df8f054d11 314 parsed[i]=0;
SDesign2018 26:15df8f054d11 315 while ((response[0] != ',') &&
SDesign2018 26:15df8f054d11 316 (response[0] != '*') && (response[0] != 0)) {
SDesign2018 26:15df8f054d11 317 parsed[i] *= 10;
SDesign2018 26:15df8f054d11 318 char c = response[0];
SDesign2018 26:15df8f054d11 319 if (isdigit(c))
SDesign2018 26:15df8f054d11 320 parsed[i] += c - '0';
SDesign2018 26:15df8f054d11 321 else
SDesign2018 26:15df8f054d11 322 parsed[i] = c;
SDesign2018 26:15df8f054d11 323 response++;
SDesign2018 26:15df8f054d11 324 }
SDesign2018 26:15df8f054d11 325 }
SDesign2018 26:15df8f054d11 326 LOCUS_serial = parsed[0];
SDesign2018 26:15df8f054d11 327 LOCUS_type = parsed[1];
SDesign2018 26:15df8f054d11 328 if (isalpha(parsed[2])) {
SDesign2018 26:15df8f054d11 329 parsed[2] = parsed[2] - 'a' + 10;
SDesign2018 26:15df8f054d11 330 }
SDesign2018 26:15df8f054d11 331 LOCUS_mode = parsed[2];
SDesign2018 26:15df8f054d11 332 LOCUS_config = parsed[3];
SDesign2018 26:15df8f054d11 333 LOCUS_interval = parsed[4];
SDesign2018 26:15df8f054d11 334 LOCUS_distance = parsed[5];
SDesign2018 26:15df8f054d11 335 LOCUS_speed = parsed[6];
SDesign2018 26:15df8f054d11 336 LOCUS_status = !parsed[7];
SDesign2018 26:15df8f054d11 337 LOCUS_records = parsed[8];
SDesign2018 26:15df8f054d11 338 LOCUS_percent = parsed[9];
SDesign2018 26:15df8f054d11 339
SDesign2018 26:15df8f054d11 340 return true;
SDesign2018 26:15df8f054d11 341 }
SDesign2018 26:15df8f054d11 342
SDesign2018 26:15df8f054d11 343 // Standby Mode Switches
SDesign2018 26:15df8f054d11 344 bool Adafruit_GPS::standby(void) {
SDesign2018 26:15df8f054d11 345 if (inStandbyMode) {
SDesign2018 26:15df8f054d11 346 return false; // Returns false if already in standby mode, so that you do not wake it up by sending commands to GPS
SDesign2018 26:15df8f054d11 347 }
SDesign2018 26:15df8f054d11 348 else {
SDesign2018 26:15df8f054d11 349 inStandbyMode = true;
SDesign2018 26:15df8f054d11 350 sendCommand(PMTK_STANDBY);
SDesign2018 26:15df8f054d11 351 //return waitForSentence(PMTK_STANDBY_SUCCESS); // don't seem to be fast enough to catch the message, or something else just is not working
SDesign2018 26:15df8f054d11 352 return true;
SDesign2018 26:15df8f054d11 353 }
SDesign2018 26:15df8f054d11 354 }
SDesign2018 26:15df8f054d11 355
SDesign2018 26:15df8f054d11 356 bool Adafruit_GPS::wakeup(void) {
SDesign2018 26:15df8f054d11 357 if (inStandbyMode) {
SDesign2018 26:15df8f054d11 358 inStandbyMode = false;
SDesign2018 26:15df8f054d11 359 sendCommand(""); // send byte to wake it up
SDesign2018 26:15df8f054d11 360 return waitForSentence(PMTK_AWAKE);
SDesign2018 26:15df8f054d11 361 }
SDesign2018 26:15df8f054d11 362 else {
SDesign2018 26:15df8f054d11 363 return false; // Returns false if not in standby mode, nothing to wakeup
SDesign2018 26:15df8f054d11 364 }
SDesign2018 26:15df8f054d11 365 }
SDesign2018 26:15df8f054d11 366
SDesign2018 26:15df8f054d11 367
SDesign2018 26:15df8f054d11 368
SDesign2018 26:15df8f054d11 369
SDesign2018 26:15df8f054d11 370 /////FOR GPS-----------------ABOVE-------------------------------------
SDesign2018 26:15df8f054d11 371
SDesign2018 26:15df8f054d11 372
SDesign2018 30:218c795a8081 373
SDesign2018 30:218c795a8081 374
SDesign2018 30:218c795a8081 375
SDesign2018 30:218c795a8081 376
SDesign2018 30:218c795a8081 377
SDesign2018 30:218c795a8081 378
SDesign2018 30:218c795a8081 379
SDesign2018 30:218c795a8081 380
SDesign2018 30:218c795a8081 381
SDesign2018 30:218c795a8081 382
SDesign2018 30:218c795a8081 383
SDesign2018 30:218c795a8081 384
SDesign2018 26:15df8f054d11 385 /////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 386 // -------------------- DOT LIBRARY REQUIRED ------------------------------//
SDesign2018 26:15df8f054d11 387 // * Because these example programs can be used for both mDot and xDot //
SDesign2018 26:15df8f054d11 388 // devices, the LoRa stack is not included. The libmDot library should //
SDesign2018 26:15df8f054d11 389 // be imported if building for mDot devices. The libxDot library //
SDesign2018 26:15df8f054d11 390 // should be imported if building for xDot devices. //
SDesign2018 26:15df8f054d11 391 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ //
SDesign2018 26:15df8f054d11 392 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ //
SDesign2018 26:15df8f054d11 393 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ //
SDesign2018 26:15df8f054d11 394 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ //
SDesign2018 26:15df8f054d11 395 /////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 396
SDesign2018 26:15df8f054d11 397
SDesign2018 26:15df8f054d11 398 /////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 399 // * these options must match between the two devices in //
SDesign2018 26:15df8f054d11 400 // order for communication to be successful
SDesign2018 26:15df8f054d11 401 //-------------------MDOT variables------------------------//
SDesign2018 26:15df8f054d11 402 /////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 403 static uint8_t network_address[] = { 0x00, 0x11, 0x22, 0x33 };
SDesign2018 26:15df8f054d11 404 static uint8_t network_session_key[] = { 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33 };
SDesign2018 26:15df8f054d11 405 static uint8_t data_session_key[] = { 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00 };
SDesign2018 26:15df8f054d11 406
SDesign2018 26:15df8f054d11 407 mDot* dot = NULL;
SDesign2018 26:15df8f054d11 408 lora::ChannelPlan* plan = NULL;
SDesign2018 26:15df8f054d11 409 //--------------End of MDOT variables-------------------//
SDesign2018 26:15df8f054d11 410
SDesign2018 26:15df8f054d11 411 Serial pc(USBTX, USBRX);
SDesign2018 30:218c795a8081 412 Ticker Periodic;
SDesign2018 26:15df8f054d11 413
SDesign2018 26:15df8f054d11 414 // ADXL372 Slave I2C
SDesign2018 26:15df8f054d11 415 I2C ADXL372(I2C_SDA, I2C_SCL); // (D14,D15) (MISO, CS)
SDesign2018 26:15df8f054d11 416
SDesign2018 26:15df8f054d11 417 // ADT7410 Temperature
SDesign2018 26:15df8f054d11 418 I2C ADT7410(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15)
SDesign2018 26:15df8f054d11 419 InterruptIn ADT7410_Int(D2); // Allow this pin for ADT7410 Interrupt critical temperature notice
SDesign2018 26:15df8f054d11 420
SDesign2018 26:15df8f054d11 421 // DS7505s Temperature
SDesign2018 26:15df8f054d11 422 I2C DS7505(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15)
SDesign2018 26:15df8f054d11 423
SDesign2018 26:15df8f054d11 424 // Create reocurring interrupt function that could be used to periodically take temperatures
SDesign2018 26:15df8f054d11 425 // Not working right now due to some mutex initialize error
SDesign2018 26:15df8f054d11 426 // Suspect that it is due to it having be a RTOS task thing
SDesign2018 26:15df8f054d11 427 // Should probably go back to using an in processor timer interrupt instead of mbed
SDesign2018 26:15df8f054d11 428
SDesign2018 26:15df8f054d11 429 const int ADT7410_Address_7BIT = 0x49; // A0 set HIGH and A1 set LOW
SDesign2018 26:15df8f054d11 430 const int ADT7410_Address_8BIT = ADT7410_Address_7BIT << 1; // Shift 1 bit to left for R/~W bit, and basic I2C format
SDesign2018 26:15df8f054d11 431
SDesign2018 26:15df8f054d11 432 const int ADXL372_Address_7bit = 0x1D; // Address for the I2C if MISO pulled low, 0x53 if pulled high
SDesign2018 26:15df8f054d11 433 const int ADXL372_Address_8bit = ADXL372_Address_7bit << 1; // Same
SDesign2018 26:15df8f054d11 434
SDesign2018 30:218c795a8081 435 const int DS7505s_Address_7bit = 0x48; // A0 set LOR, A1 set LOW, A2 set LOW
SDesign2018 30:218c795a8081 436 const int DS7505s_Address_8bit = DS7505s_Address_7bit << 1; // Same
SDesign2018 30:218c795a8081 437
SDesign2018 30:218c795a8081 438
SDesign2018 30:218c795a8081 439 int regAddress; // Used by all sensors
SDesign2018 26:15df8f054d11 440
SDesign2018 26:15df8f054d11 441 /*
SDesign2018 26:15df8f054d11 442 * Variables used for ADT7410 Temperature
SDesign2018 26:15df8f054d11 443 */
SDesign2018 26:15df8f054d11 444 // Points to the returned char pointer from called functions
SDesign2018 26:15df8f054d11 445 char * rawTempValues; // Could change to uint8_t, same for other char pointers
SDesign2018 26:15df8f054d11 446 uint16_t convertedTempValue; // Data values must be uint16_t for conversion and send prep
SDesign2018 26:15df8f054d11 447 uint16_t temperatureBuffer[BUFFER_SIZE];
SDesign2018 26:15df8f054d11 448
SDesign2018 26:15df8f054d11 449
SDesign2018 26:15df8f054d11 450 /*
SDesign2018 26:15df8f054d11 451 * Variables used for mDot
SDesign2018 26:15df8f054d11 452 */
SDesign2018 30:218c795a8081 453
SDesign2018 30:218c795a8081 454
SDesign2018 26:15df8f054d11 455 uint32_t tx_frequency;
SDesign2018 26:15df8f054d11 456 uint8_t tx_datarate;
SDesign2018 26:15df8f054d11 457 uint8_t tx_power;
SDesign2018 26:15df8f054d11 458 uint8_t frequency_band;
SDesign2018 26:15df8f054d11 459
SDesign2018 26:15df8f054d11 460
SDesign2018 26:15df8f054d11 461
SDesign2018 26:15df8f054d11 462 /*
SDesign2018 26:15df8f054d11 463 * Variables used for ADXL372 Accelerometer
SDesign2018 26:15df8f054d11 464 */
SDesign2018 26:15df8f054d11 465 char *accelValues;
SDesign2018 26:15df8f054d11 466 char Xmsb; // Gets most significant byte
SDesign2018 26:15df8f054d11 467 char Xlsb; // Gets least significant byte
SDesign2018 26:15df8f054d11 468 char Ymsb;
SDesign2018 26:15df8f054d11 469 char Ylsb;
SDesign2018 26:15df8f054d11 470 char Zmsb;
SDesign2018 26:15df8f054d11 471 char Zlsb;
SDesign2018 26:15df8f054d11 472 uint16_t XData;
SDesign2018 26:15df8f054d11 473 uint16_t YData;
SDesign2018 26:15df8f054d11 474 uint16_t ZData;
SDesign2018 26:15df8f054d11 475
SDesign2018 26:15df8f054d11 476 uint16_t XDataInterrupt[BUFFER_SIZE];
SDesign2018 26:15df8f054d11 477 uint16_t YDataInterrupt[BUFFER_SIZE];
SDesign2018 26:15df8f054d11 478 uint16_t ZDataInterrupt[BUFFER_SIZE];
SDesign2018 26:15df8f054d11 479
SDesign2018 26:15df8f054d11 480
SDesign2018 26:15df8f054d11 481
SDesign2018 26:15df8f054d11 482 /*
SDesign2018 26:15df8f054d11 483 * Variables used for interrupt triggers
SDesign2018 26:15df8f054d11 484 */
SDesign2018 26:15df8f054d11 485 bool takeTemperature = false; // Trigger temperature reading
SDesign2018 26:15df8f054d11 486 bool takeAccelerometer = false; // Trigger accelerometer reading
SDesign2018 26:15df8f054d11 487 bool periodicReadingTrigger = false; // Trigger reading both accelerometer and temperature
SDesign2018 26:15df8f054d11 488
SDesign2018 26:15df8f054d11 489 /*
SDesign2018 26:15df8f054d11 490 * Prototype functions
SDesign2018 26:15df8f054d11 491 */
SDesign2018 26:15df8f054d11 492
SDesign2018 26:15df8f054d11 493 char twosComplementConversion(char value);
SDesign2018 26:15df8f054d11 494
SDesign2018 26:15df8f054d11 495 void ADXL372Initialize(void);
SDesign2018 26:15df8f054d11 496 void ADXL372Reset(void);
SDesign2018 26:15df8f054d11 497 void I2CSelfTest(void);
SDesign2018 30:218c795a8081 498 void accelerometerI2CWrite(int hexAddress, int hexData);
SDesign2018 26:15df8f054d11 499 char * accelerometerI2CRead(int hexAddress);
SDesign2018 26:15df8f054d11 500
SDesign2018 26:15df8f054d11 501 void ADT7410Initialize(void);
SDesign2018 26:15df8f054d11 502 void ADT7410Write(unsigned char registerAddress, unsigned char data);
SDesign2018 26:15df8f054d11 503 char * ADT7410Read(int hex);
SDesign2018 26:15df8f054d11 504
SDesign2018 26:15df8f054d11 505
SDesign2018 26:15df8f054d11 506 /*
SDesign2018 26:15df8f054d11 507 * Interrupt functions
SDesign2018 26:15df8f054d11 508 */
SDesign2018 26:15df8f054d11 509 void CriticalTemperatureInterrupt(void){
SDesign2018 26:15df8f054d11 510 takeTemperature = true; // Take temperature because something happened
SDesign2018 26:15df8f054d11 511 }
SDesign2018 26:15df8f054d11 512
SDesign2018 26:15df8f054d11 513 void CriticalAccelerometerInterrupt(void){
SDesign2018 26:15df8f054d11 514 takeAccelerometer = true; // Take accelerometer because something happened
SDesign2018 26:15df8f054d11 515 }
SDesign2018 26:15df8f054d11 516
SDesign2018 26:15df8f054d11 517 void takePeriodicReading(std::vector<uint8_t> tx_data){
SDesign2018 26:15df8f054d11 518 pc.printf("Regular periodic reading \n\r");
SDesign2018 26:15df8f054d11 519 /*
SDesign2018 26:15df8f054d11 520 * Taking accelerometer data
SDesign2018 26:15df8f054d11 521 */
SDesign2018 26:15df8f054d11 522 regAddress = 0x08; // This is the register address for XData
SDesign2018 30:218c795a8081 523 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 26:15df8f054d11 524 Xmsb = *(accelValues + 0);
SDesign2018 26:15df8f054d11 525 Xlsb = *(accelValues + 1);
SDesign2018 26:15df8f054d11 526 Ymsb = *(accelValues + 2);
SDesign2018 26:15df8f054d11 527 Ylsb = *(accelValues + 3);
SDesign2018 26:15df8f054d11 528 Zmsb = *(accelValues + 4);
SDesign2018 26:15df8f054d11 529 Zlsb = *(accelValues + 5);
SDesign2018 26:15df8f054d11 530
SDesign2018 30:218c795a8081 531 XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 26:15df8f054d11 532 YData = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 26:15df8f054d11 533 ZData = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 26:15df8f054d11 534
SDesign2018 30:218c795a8081 535 XData = twosComplementConversion(XData);
SDesign2018 30:218c795a8081 536 YData = twosComplementConversion(YData);
SDesign2018 30:218c795a8081 537 ZData = twosComplementConversion(ZData);
SDesign2018 27:5db200a4d496 538
SDesign2018 26:15df8f054d11 539 /*
SDesign2018 26:15df8f054d11 540 * Taking temperature data
SDesign2018 26:15df8f054d11 541 */
SDesign2018 26:15df8f054d11 542 regAddress = 0x00;
SDesign2018 26:15df8f054d11 543 rawTempValues = ADT7410Read(regAddress);
SDesign2018 26:15df8f054d11 544 convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 26:15df8f054d11 545 // a short int variable(16 bits), remove last 3 bits
SDesign2018 26:15df8f054d11 546 pc.printf("Accelerometer::: ");
SDesign2018 26:15df8f054d11 547 pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XData, YData, ZData);
SDesign2018 26:15df8f054d11 548 pc.printf("Temperature::: ");
SDesign2018 26:15df8f054d11 549 pc.printf("Celsius: 0x%x\n\r", convertedTempValue);
SDesign2018 26:15df8f054d11 550
SDesign2018 26:15df8f054d11 551
SDesign2018 30:218c795a8081 552
SDesign2018 26:15df8f054d11 553 tx_data.push_back((convertedTempValue >> 8) & 0xFF);
SDesign2018 26:15df8f054d11 554 tx_data.push_back(convertedTempValue & 0xFF);
SDesign2018 26:15df8f054d11 555 logInfo("Temperautre: %lu [0x%04X]", convertedTempValue, convertedTempValue);
SDesign2018 26:15df8f054d11 556 send_data(tx_data);
SDesign2018 30:218c795a8081 557 periodicReadingTrigger = false; // Flip back to no trigger
SDesign2018 26:15df8f054d11 558 }
SDesign2018 26:15df8f054d11 559
SDesign2018 26:15df8f054d11 560 void takePeriodicReadingTicker(void){
SDesign2018 26:15df8f054d11 561 periodicReadingTrigger = true;
SDesign2018 26:15df8f054d11 562 }
SDesign2018 26:15df8f054d11 563
SDesign2018 26:15df8f054d11 564 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 565 /* _
SDesign2018 26:15df8f054d11 566 ____ ___ ____ _(_)___
SDesign2018 26:15df8f054d11 567 / __ `__ \/ __ `/ / __ \
SDesign2018 26:15df8f054d11 568 / / / / / / /_/ / / / / /
SDesign2018 26:15df8f054d11 569 /_/ /_/ /_/\__,_/_/_/ /_/
SDesign2018 26:15df8f054d11 570
SDesign2018 26:15df8f054d11 571 *//////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 572 int main(void)
SDesign2018 26:15df8f054d11 573 {
SDesign2018 26:15df8f054d11 574 // Custom event handler for automatically displaying RX data
SDesign2018 26:15df8f054d11 575 //interruptEverything.attach(&interruptReadTemperature, 7.0);
SDesign2018 26:15df8f054d11 576 RadioEvent events;
SDesign2018 26:15df8f054d11 577 // Change baud rate in serial terminal to this value
SDesign2018 26:15df8f054d11 578 pc.baud(115200);
SDesign2018 26:15df8f054d11 579 ADXL372.frequency(300000); // I2C devices are connected to the same clock
SDesign2018 26:15df8f054d11 580 ADT7410.frequency(300000); // Redundant but whatever
SDesign2018 26:15df8f054d11 581 ADT7410_Int.rise(&CriticalTemperatureInterrupt);
SDesign2018 29:0f0a059f023e 582
SDesign2018 26:15df8f054d11 583
SDesign2018 26:15df8f054d11 584 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
SDesign2018 26:15df8f054d11 585
SDesign2018 26:15df8f054d11 586 // Sometimes when calling this, it creates error: type specifier expected
SDesign2018 26:15df8f054d11 587 // Even with identical include files I would get this in another workspace.
SDesign2018 26:15df8f054d11 588 plan = new lora::ChannelPlan_US915();
SDesign2018 26:15df8f054d11 589
SDesign2018 26:15df8f054d11 590 logInfo("Now asserting");
SDesign2018 26:15df8f054d11 591 assert(plan);
SDesign2018 26:15df8f054d11 592
SDesign2018 26:15df8f054d11 593 // Careful when using this. The production ready libmdot-mbed5 has a void constructor
SDesign2018 26:15df8f054d11 594 // Therefore, can only use the libmDot-dev-mbed5 version, for now.
SDesign2018 26:15df8f054d11 595 dot = mDot::getInstance(plan);
SDesign2018 26:15df8f054d11 596 assert(dot);
SDesign2018 26:15df8f054d11 597
SDesign2018 26:15df8f054d11 598 logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
SDesign2018 26:15df8f054d11 599
SDesign2018 26:15df8f054d11 600 // start from a well-known state
SDesign2018 26:15df8f054d11 601 logInfo("defaulting Dot configuration");
SDesign2018 26:15df8f054d11 602 dot->resetConfig();
SDesign2018 26:15df8f054d11 603
SDesign2018 26:15df8f054d11 604 // make sure library logging is turned on
SDesign2018 26:15df8f054d11 605 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
SDesign2018 26:15df8f054d11 606
SDesign2018 26:15df8f054d11 607 // attach the custom events handler
SDesign2018 26:15df8f054d11 608 dot->setEvents(&events);
SDesign2018 26:15df8f054d11 609
SDesign2018 26:15df8f054d11 610 // update configuration if necessary
SDesign2018 26:15df8f054d11 611 if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
SDesign2018 26:15df8f054d11 612 logInfo("changing network join mode to PEER_TO_PEER");
SDesign2018 26:15df8f054d11 613 if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
SDesign2018 26:15df8f054d11 614 logError("failed to set network join mode to PEER_TO_PEER");
SDesign2018 26:15df8f054d11 615 }
SDesign2018 26:15df8f054d11 616 }
SDesign2018 26:15df8f054d11 617
SDesign2018 26:15df8f054d11 618 /*
SDesign2018 26:15df8f054d11 619 * Get the Frequency and then choose transfer frequency, datarate, and power accordingly
SDesign2018 26:15df8f054d11 620 *
SDesign2018 26:15df8f054d11 621 */
SDesign2018 26:15df8f054d11 622 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 623 frequency_band = dot->getFrequencyBand();
SDesign2018 26:15df8f054d11 624 switch (frequency_band) {
SDesign2018 26:15df8f054d11 625 case lora::ChannelPlan::EU868_OLD:
SDesign2018 26:15df8f054d11 626 case lora::ChannelPlan::EU868:
SDesign2018 26:15df8f054d11 627 // 250kHz channels achieve higher throughput
SDesign2018 26:15df8f054d11 628 // DR_6 : SF7 @ 250kHz
SDesign2018 26:15df8f054d11 629 // DR_0 - DR_5 (125kHz channels) available but much slower
SDesign2018 26:15df8f054d11 630 tx_frequency = 869850000;
SDesign2018 26:15df8f054d11 631 tx_datarate = lora::DR_6;
SDesign2018 26:15df8f054d11 632 // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7
SDesign2018 26:15df8f054d11 633 tx_power = 4;
SDesign2018 26:15df8f054d11 634 break;
SDesign2018 26:15df8f054d11 635
SDesign2018 26:15df8f054d11 636 case lora::ChannelPlan::US915_OLD:
SDesign2018 26:15df8f054d11 637 case lora::ChannelPlan::US915:
SDesign2018 26:15df8f054d11 638 case lora::ChannelPlan::AU915_OLD:
SDesign2018 26:15df8f054d11 639 case lora::ChannelPlan::AU915:
SDesign2018 26:15df8f054d11 640 // 500kHz channels achieve highest throughput
SDesign2018 26:15df8f054d11 641 // DR_8 : SF12 @ 500kHz
SDesign2018 26:15df8f054d11 642 // DR_9 : SF11 @ 500kHz
SDesign2018 26:15df8f054d11 643 // DR_10 : SF10 @ 500kHz
SDesign2018 26:15df8f054d11 644 // DR_11 : SF9 @ 500kHz
SDesign2018 26:15df8f054d11 645 // DR_12 : SF8 @ 500kHz
SDesign2018 26:15df8f054d11 646 // DR_13 : SF7 @ 500kHz
SDesign2018 26:15df8f054d11 647 // DR_0 - DR_3 (125kHz channels) available but much slower
SDesign2018 26:15df8f054d11 648 tx_frequency = 915500000;
SDesign2018 26:15df8f054d11 649 tx_datarate = lora::DR_13;
SDesign2018 26:15df8f054d11 650 // 915 bands have no duty cycle restrictions, set tx power to max
SDesign2018 26:15df8f054d11 651 tx_power = 20;
SDesign2018 26:15df8f054d11 652 break;
SDesign2018 26:15df8f054d11 653
SDesign2018 26:15df8f054d11 654 case lora::ChannelPlan::AS923:
SDesign2018 26:15df8f054d11 655 case lora::ChannelPlan::AS923_JAPAN:
SDesign2018 26:15df8f054d11 656 // 250kHz channels achieve higher throughput
SDesign2018 26:15df8f054d11 657 // DR_6 : SF7 @ 250kHz
SDesign2018 26:15df8f054d11 658 // DR_0 - DR_5 (125kHz channels) available but much slower
SDesign2018 26:15df8f054d11 659 tx_frequency = 924800000;
SDesign2018 26:15df8f054d11 660 tx_datarate = lora::DR_6;
SDesign2018 26:15df8f054d11 661 tx_power = 16;
SDesign2018 26:15df8f054d11 662 break;
SDesign2018 26:15df8f054d11 663
SDesign2018 26:15df8f054d11 664 case lora::ChannelPlan::KR920:
SDesign2018 26:15df8f054d11 665 // DR_5 : SF7 @ 125kHz
SDesign2018 26:15df8f054d11 666 tx_frequency = 922700000;
SDesign2018 26:15df8f054d11 667 tx_datarate = lora::DR_5;
SDesign2018 26:15df8f054d11 668 tx_power = 14;
SDesign2018 26:15df8f054d11 669 break;
SDesign2018 26:15df8f054d11 670
SDesign2018 26:15df8f054d11 671 default:
SDesign2018 26:15df8f054d11 672 while (true) {
SDesign2018 26:15df8f054d11 673 logFatal("no known channel plan in use - extra configuration is needed!");
SDesign2018 26:15df8f054d11 674 wait(5);
SDesign2018 26:15df8f054d11 675 }
SDesign2018 26:15df8f054d11 676 break;
SDesign2018 26:15df8f054d11 677 }
SDesign2018 26:15df8f054d11 678 /////////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 679
SDesign2018 26:15df8f054d11 680 // in PEER_TO_PEER mode there is no join request/response transaction
SDesign2018 26:15df8f054d11 681 // as long as both Dots are configured correctly, they should be able to communicate
SDesign2018 26:15df8f054d11 682 update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power);
SDesign2018 26:15df8f054d11 683
SDesign2018 26:15df8f054d11 684 // save changes to configuration
SDesign2018 26:15df8f054d11 685 logInfo("saving configuration");
SDesign2018 26:15df8f054d11 686 if (!dot->saveConfig()) {
SDesign2018 26:15df8f054d11 687 logError("failed to save configuration");
SDesign2018 26:15df8f054d11 688 }
SDesign2018 26:15df8f054d11 689 // Display configuration
SDesign2018 26:15df8f054d11 690 // It's gonna output a lot of information onto the Serial Terminal
SDesign2018 26:15df8f054d11 691 display_config();
SDesign2018 30:218c795a8081 692 // ******************************************GPS
SDesign2018 26:15df8f054d11 693
SDesign2018 30:218c795a8081 694 Serial * gps_Serial;
SDesign2018 30:218c795a8081 695 //Initalize using pa2 and pa3 (D0 and D1 on the mdot) (D0->TX on gps) (D1->RX on gps)
SDesign2018 30:218c795a8081 696 gps_Serial = new Serial(PA_2,PA_3); //serial object for use w/ GPS USING PA_2 and PA_3
SDesign2018 30:218c795a8081 697 Adafruit_GPS myGPS(gps_Serial); //object of Adafruit's GPS class
SDesign2018 30:218c795a8081 698 char c; //when read via Adafruit_GPS::read(), the class returns single character stored here
SDesign2018 30:218c795a8081 699 Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
SDesign2018 30:218c795a8081 700 const int refresh_Time = 2000; //refresh time in ms
SDesign2018 30:218c795a8081 701
SDesign2018 30:218c795a8081 702 myGPS.begin(9600); //sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
SDesign2018 30:218c795a8081 703 //a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
SDesign2018 30:218c795a8081 704
SDesign2018 30:218c795a8081 705 myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //these commands are defined in MBed_Adafruit_GPS.h; a link is provided there for command creation
SDesign2018 30:218c795a8081 706 myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
SDesign2018 30:218c795a8081 707 myGPS.sendCommand(PGCMD_ANTENNA);
SDesign2018 30:218c795a8081 708
SDesign2018 30:218c795a8081 709 pc.printf("Connection established at 115200 baud...\n\r");
SDesign2018 30:218c795a8081 710
SDesign2018 30:218c795a8081 711 wait(1);
SDesign2018 30:218c795a8081 712
SDesign2018 30:218c795a8081 713 refresh_Timer.start(); //starts the clock on the timer
SDesign2018 28:29702434319d 714
SDesign2018 30:218c795a8081 715 while(true){
SDesign2018 30:218c795a8081 716 c = myGPS.read(); //queries the GPS
SDesign2018 30:218c795a8081 717
SDesign2018 30:218c795a8081 718 if (c) { pc.printf("%c", c); } //this line will echo the GPS data if not paused
SDesign2018 30:218c795a8081 719 //check if we recieved a new message from GPS, if so, attempt to parse it,
SDesign2018 30:218c795a8081 720 if ( myGPS.newNMEAreceived() ) {
SDesign2018 30:218c795a8081 721 if ( !myGPS.parse(myGPS.lastNMEA()) ) {
SDesign2018 30:218c795a8081 722 continue;
SDesign2018 30:218c795a8081 723 }
SDesign2018 30:218c795a8081 724 }
SDesign2018 30:218c795a8081 725
SDesign2018 30:218c795a8081 726 //check if enough time has passed to warrant printing GPS info to screen
SDesign2018 30:218c795a8081 727 //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
SDesign2018 30:218c795a8081 728 if (refresh_Timer.read_ms() >= refresh_Time) {
SDesign2018 30:218c795a8081 729 pc.printf("Refresh Timer: %d\n\r", refresh_Timer.read_ms());
SDesign2018 30:218c795a8081 730 refresh_Timer.reset();
SDesign2018 30:218c795a8081 731
SDesign2018 30:218c795a8081 732 pc.printf("Time: %d:%d:%d.%u\n\r", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
SDesign2018 30:218c795a8081 733 pc.printf("Date: %d/%d/20%d\n\r", myGPS.day, myGPS.month, myGPS.year);
SDesign2018 30:218c795a8081 734 pc.printf("Fix: %d\n\r", (int) myGPS.fix);
SDesign2018 30:218c795a8081 735 pc.printf("Quality: %d\n\r", (int) myGPS.fixquality);
SDesign2018 30:218c795a8081 736 if (myGPS.fix) {
SDesign2018 30:218c795a8081 737 pc.printf("Location: %5.2f%c, %5.2f%c\n\r", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
SDesign2018 30:218c795a8081 738 pc.printf("Speed: %5.2f knots\n\r", myGPS.speed);
SDesign2018 30:218c795a8081 739 pc.printf("Angle: %5.2f\n\r", myGPS.angle);
SDesign2018 30:218c795a8081 740 pc.printf("Altitude: %5.2f\n\r", myGPS.altitude);
SDesign2018 30:218c795a8081 741 pc.printf("Satellites: %d\n\r", myGPS.satellites);
SDesign2018 30:218c795a8081 742 }
SDesign2018 30:218c795a8081 743 }
SDesign2018 30:218c795a8081 744 }//end while
SDesign2018 26:15df8f054d11 745
SDesign2018 26:15df8f054d11 746
SDesign2018 30:218c795a8081 747
SDesign2018 30:218c795a8081 748
SDesign2018 30:218c795a8081 749 // ******************************************end GPS
SDesign2018 30:218c795a8081 750
SDesign2018 30:218c795a8081 751
SDesign2018 29:0f0a059f023e 752
SDesign2018 30:218c795a8081 753
SDesign2018 30:218c795a8081 754
SDesign2018 30:218c795a8081 755
SDesign2018 30:218c795a8081 756 //below is acc,temp sensors
SDesign2018 30:218c795a8081 757 ADT7410Initialize();
SDesign2018 30:218c795a8081 758 ADXL372Initialize();
SDesign2018 26:15df8f054d11 759
SDesign2018 30:218c795a8081 760 Periodic.attach(&takePeriodicReadingTicker,5);
SDesign2018 28:29702434319d 761
SDesign2018 26:15df8f054d11 762 while(1){
SDesign2018 26:15df8f054d11 763 // Create a vector of uint8_t elements to be sent later
SDesign2018 26:15df8f054d11 764
SDesign2018 26:15df8f054d11 765 std::vector<uint8_t> tx_data;
SDesign2018 26:15df8f054d11 766
SDesign2018 26:15df8f054d11 767
SDesign2018 30:218c795a8081 768 if(periodicReadingTrigger)
SDesign2018 30:218c795a8081 769 {
SDesign2018 30:218c795a8081 770 takePeriodicReading(tx_data);
SDesign2018 30:218c795a8081 771 }
SDesign2018 26:15df8f054d11 772
SDesign2018 26:15df8f054d11 773 if(takeAccelerometer || takeTemperature){
SDesign2018 26:15df8f054d11 774 pc.printf("INTERRUPTEDDDDDDDD: ");
SDesign2018 26:15df8f054d11 775 if(takeTemperature) pc.printf("Temperature triggered!!!!!!!!!!!!\n\r");
SDesign2018 26:15df8f054d11 776 else if(takeAccelerometer) pc.printf("AccelerometerTriggered!!!!!!!!!!!!!\n\r");
SDesign2018 26:15df8f054d11 777
SDesign2018 30:218c795a8081 778 for(int i = 0; i < BUFFER_SIZE; ++i){
SDesign2018 30:218c795a8081 779 /*
SDesign2018 30:218c795a8081 780 * Taking accelerometer data
SDesign2018 30:218c795a8081 781 */
SDesign2018 30:218c795a8081 782 regAddress = 0x08; // This is the register address for XData
SDesign2018 30:218c795a8081 783 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 30:218c795a8081 784 Xmsb = *(accelValues + 0);
SDesign2018 30:218c795a8081 785 Xlsb = *(accelValues + 1);
SDesign2018 30:218c795a8081 786 Ymsb = *(accelValues + 2);
SDesign2018 30:218c795a8081 787 Ylsb = *(accelValues + 3);
SDesign2018 30:218c795a8081 788 Zmsb = *(accelValues + 4);
SDesign2018 30:218c795a8081 789 Zlsb = *(accelValues + 5);
SDesign2018 30:218c795a8081 790
SDesign2018 30:218c795a8081 791 XDataInterrupt[i] = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 30:218c795a8081 792 YDataInterrupt[i] = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 30:218c795a8081 793 ZDataInterrupt[i] = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 30:218c795a8081 794
SDesign2018 30:218c795a8081 795 XDataInterrupt[i] = twosComplementConversion(XDataInterrupt[i]);
SDesign2018 30:218c795a8081 796 YDataInterrupt[i] = twosComplementConversion(YDataInterrupt[i]);
SDesign2018 30:218c795a8081 797 ZDataInterrupt[i] = twosComplementConversion(ZDataInterrupt[i]);
SDesign2018 30:218c795a8081 798
SDesign2018 30:218c795a8081 799 /*
SDesign2018 30:218c795a8081 800 * Taking temperature data
SDesign2018 30:218c795a8081 801 */
SDesign2018 30:218c795a8081 802 regAddress = 0x00;
SDesign2018 30:218c795a8081 803 rawTempValues = ADT7410Read(regAddress);
SDesign2018 30:218c795a8081 804 temperatureBuffer[i] = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 30:218c795a8081 805 // a short int variable(16 bits), remove last 3 bits
SDesign2018 30:218c795a8081 806 }
SDesign2018 27:5db200a4d496 807
SDesign2018 30:218c795a8081 808 for(int i = 0; i < BUFFER_SIZE; ++i){
SDesign2018 30:218c795a8081 809 pc.printf("Accelerometer::: ");
SDesign2018 30:218c795a8081 810 pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XDataInterrupt[i], YDataInterrupt[i], ZDataInterrupt[i]);
SDesign2018 30:218c795a8081 811 pc.printf("Temperature::: ");
SDesign2018 30:218c795a8081 812 pc.printf("Celsius: 0x%x\n\r", temperatureBuffer[i]);
SDesign2018 30:218c795a8081 813 }
SDesign2018 30:218c795a8081 814 //wait(0.2);
SDesign2018 26:15df8f054d11 815 takeAccelerometer = false; // Flip back to no trigger
SDesign2018 26:15df8f054d11 816 takeTemperature = false; // Flip back to no trigger
SDesign2018 26:15df8f054d11 817
SDesign2018 26:15df8f054d11 818 }
SDesign2018 26:15df8f054d11 819
SDesign2018 26:15df8f054d11 820
SDesign2018 26:15df8f054d11 821
SDesign2018 26:15df8f054d11 822
SDesign2018 30:218c795a8081 823 //wait(1);
SDesign2018 26:15df8f054d11 824 }
SDesign2018 26:15df8f054d11 825
SDesign2018 26:15df8f054d11 826 return 0;
SDesign2018 26:15df8f054d11 827 }
SDesign2018 26:15df8f054d11 828
SDesign2018 26:15df8f054d11 829 /*******************************************************************************
SDesign2018 26:15df8f054d11 830 * Not really used at the moment
SDesign2018 26:15df8f054d11 831 * Not really needed. But keep just in case because I don't want to rewrite it
SDesign2018 26:15df8f054d11 832 ******************************************************************************/
SDesign2018 26:15df8f054d11 833 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 834 char twosComplementConversion(char value)
SDesign2018 26:15df8f054d11 835 {
SDesign2018 26:15df8f054d11 836 /*
SDesign2018 26:15df8f054d11 837 * Go from bit 0 to bit 7 and invert them
SDesign2018 26:15df8f054d11 838 * Then finally add 1
SDesign2018 26:15df8f054d11 839 */
SDesign2018 26:15df8f054d11 840 char mask = value & 0x80;
SDesign2018 26:15df8f054d11 841 if(mask == 0x80){ // Check for sign
SDesign2018 26:15df8f054d11 842 value = ~value + 1;
SDesign2018 26:15df8f054d11 843 return value;
SDesign2018 26:15df8f054d11 844 }
SDesign2018 26:15df8f054d11 845 return value;
SDesign2018 26:15df8f054d11 846 }
SDesign2018 26:15df8f054d11 847 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 848
SDesign2018 26:15df8f054d11 849 /*******************************************************************************
SDesign2018 26:15df8f054d11 850 * Initializes whatever settings you want for the accelerometer
SDesign2018 26:15df8f054d11 851 * Can change it to use the previous I2C write function instead of all this mess
SDesign2018 26:15df8f054d11 852 *
SDesign2018 26:15df8f054d11 853 ******************************************************************************/
SDesign2018 26:15df8f054d11 854 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 855 void ADXL372Initialize(void){
SDesign2018 26:15df8f054d11 856 pc.printf("Initializing ADXL372 accelerometer\n\r");
SDesign2018 30:218c795a8081 857 accelerometerI2CWrite(0x3F, 0x0F); // Enable I2C highspeed,Low Pass, High pass and full bandwidth measurement mode
SDesign2018 26:15df8f054d11 858 accelerometerI2CWrite(0x38, 0x01); // Enable the High pass filter corner 1 at register 0x38
SDesign2018 26:15df8f054d11 859 /* accelerometerI2CWrite(0x24, 0x01); // X used for activity threshold
SDesign2018 26:15df8f054d11 860 accelerometerI2CWrite(0x26, 0x01); // Y used for activity threshold
SDesign2018 26:15df8f054d11 861 accelerometerI2CWrite(0x28, 0x01); // Z used for activity threshold */
SDesign2018 26:15df8f054d11 862 pc.printf("\n\n\r");
SDesign2018 26:15df8f054d11 863 }
SDesign2018 26:15df8f054d11 864 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 865
SDesign2018 26:15df8f054d11 866
SDesign2018 26:15df8f054d11 867 /*******************************************************************************
SDesign2018 26:15df8f054d11 868 * ADT7410 Initializing function
SDesign2018 26:15df8f054d11 869 * Make critical temperature 24 celsius
SDesign2018 26:15df8f054d11 870 * Make CRIT pin active high
SDesign2018 26:15df8f054d11 871 ******************************************************************************/
SDesign2018 26:15df8f054d11 872 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 873 void ADT7410Initialize(void){
SDesign2018 26:15df8f054d11 874 pc.printf("Initializing ADT7410 Temperature\n\r");
SDesign2018 26:15df8f054d11 875 // Make critical temperature be 24 celsius
SDesign2018 26:15df8f054d11 876 ADT7410Write(0x08, 0x01); // MSB of Temperature Crit value
SDesign2018 26:15df8f054d11 877 ADT7410Write(0x09, 0x80); // LSB of Temperature Crit value
SDesign2018 26:15df8f054d11 878
SDesign2018 26:15df8f054d11 879 // Make CRIT pin active high
SDesign2018 30:218c795a8081 880 ADT7410Write(0x03, 0x08); // Turn INT HIGH, works for the interrupt pin
SDesign2018 26:15df8f054d11 881 pc.printf("\n\n\r");
SDesign2018 26:15df8f054d11 882 }
SDesign2018 26:15df8f054d11 883 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 884
SDesign2018 26:15df8f054d11 885 /*******************************************************************************
SDesign2018 26:15df8f054d11 886 * ADXL372 reset function
SDesign2018 26:15df8f054d11 887 * Resets all registers and settings back to default
SDesign2018 26:15df8f054d11 888 * Basically the same as the previous ADXL372 I2C write function
SDesign2018 26:15df8f054d11 889 *
SDesign2018 26:15df8f054d11 890 ******************************************************************************/
SDesign2018 26:15df8f054d11 891 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 892 void ADXL372Reset(void){
SDesign2018 26:15df8f054d11 893 int flag;
SDesign2018 26:15df8f054d11 894 //--------- One full writing cycle for ADXL372 for Z Enable ------------------//
SDesign2018 26:15df8f054d11 895 /* '0' - NAK was received
SDesign2018 26:15df8f054d11 896 * '1' - ACK was received, <---- This good
SDesign2018 26:15df8f054d11 897 * '2' - timeout
SDesign2018 26:15df8f054d11 898 */
SDesign2018 26:15df8f054d11 899 ADXL372.start();
SDesign2018 26:15df8f054d11 900 flag = ADXL372.write(ADXL372_Address_8bit | 0);
SDesign2018 26:15df8f054d11 901 if(flag == 1)
SDesign2018 26:15df8f054d11 902 {
SDesign2018 26:15df8f054d11 903 //pc.printf("Write to I2C address success\n\r");
SDesign2018 26:15df8f054d11 904
SDesign2018 26:15df8f054d11 905 flag = ADXL372.write(0x41);
SDesign2018 26:15df8f054d11 906 if(flag == 1)
SDesign2018 26:15df8f054d11 907 {
SDesign2018 26:15df8f054d11 908 //pc.printf("Write to 0x41 register address success\n\r");
SDesign2018 26:15df8f054d11 909 flag = ADXL372.write(0x52); // Set bit 0
SDesign2018 26:15df8f054d11 910 if(flag == 1)
SDesign2018 26:15df8f054d11 911 {
SDesign2018 26:15df8f054d11 912 pc.printf("Everything has been reset\n\r");
SDesign2018 26:15df8f054d11 913 ADXL372.stop();
SDesign2018 26:15df8f054d11 914 }
SDesign2018 26:15df8f054d11 915 }
SDesign2018 26:15df8f054d11 916 }
SDesign2018 26:15df8f054d11 917 else ADXL372.stop();
SDesign2018 26:15df8f054d11 918 // ---------------- End of writing cycle --------------------------//
SDesign2018 26:15df8f054d11 919 }
SDesign2018 26:15df8f054d11 920 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 921
SDesign2018 26:15df8f054d11 922 /*
SDesign2018 26:15df8f054d11 923 *
SDesign2018 26:15df8f054d11 924 * Self-test to see if the accelerometer is working as intended
SDesign2018 26:15df8f054d11 925 * Wait 300 ms.
SDesign2018 26:15df8f054d11 926 * Check bit 2 for a 1 for success. Bit 1 for completion of self-test.
SDesign2018 26:15df8f054d11 927 * Returns whole register
SDesign2018 26:15df8f054d11 928 */
SDesign2018 26:15df8f054d11 929 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 930 void I2CSelfTest(void){
SDesign2018 26:15df8f054d11 931 char *result;
SDesign2018 26:15df8f054d11 932 uint8_t check;
SDesign2018 26:15df8f054d11 933 accelerometerI2CWrite(0x3F, 0x0F);
SDesign2018 26:15df8f054d11 934 accelerometerI2CWrite(0x40, 0x01);
SDesign2018 26:15df8f054d11 935 wait(0.3);
SDesign2018 26:15df8f054d11 936 result = accelerometerI2CRead(0x40);
SDesign2018 26:15df8f054d11 937 check = result[0];
SDesign2018 26:15df8f054d11 938 if(check & 0x04){
SDesign2018 26:15df8f054d11 939 pc.printf("Passed\n\r");
SDesign2018 26:15df8f054d11 940 }else {pc.printf("FAILED\n\r");}
SDesign2018 26:15df8f054d11 941 }
SDesign2018 26:15df8f054d11 942 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 943
SDesign2018 26:15df8f054d11 944 /*******************************************************************************
SDesign2018 26:15df8f054d11 945 *
SDesign2018 26:15df8f054d11 946 * I2C function for the the ADXL372 accelerometer for a write sequence
SDesign2018 26:15df8f054d11 947 * Param:
SDesign2018 26:15df8f054d11 948 * hexAddress: Pass the hexadecimal value for what register you want
SDesign2018 26:15df8f054d11 949 * hexData: Pass the hexadecimal value for what data you want to send
SDesign2018 26:15df8f054d11 950 * i.e. hexadecimal represenatation of certain bits
SDesign2018 26:15df8f054d11 951 * Returns from mbed library write function
SDesign2018 26:15df8f054d11 952 * 0: NAK was reveived
SDesign2018 26:15df8f054d11 953 * 1: ACK was received <---- Good for us
SDesign2018 26:15df8f054d11 954 * 2: Timeout
SDesign2018 26:15df8f054d11 955 ******************************************************************************/
SDesign2018 26:15df8f054d11 956 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 30:218c795a8081 957 void accelerometerI2CWrite(int hexAddress, int hexData){
SDesign2018 26:15df8f054d11 958
SDesign2018 26:15df8f054d11 959 int flag;
SDesign2018 26:15df8f054d11 960 int registerAddress = hexAddress;
SDesign2018 26:15df8f054d11 961 int data = hexData;
SDesign2018 26:15df8f054d11 962
SDesign2018 26:15df8f054d11 963 ADXL372.start();
SDesign2018 26:15df8f054d11 964 flag = ADXL372.write(ADXL372_Address_8bit);
SDesign2018 26:15df8f054d11 965 if(flag == 1)
SDesign2018 26:15df8f054d11 966 {
SDesign2018 26:15df8f054d11 967 //pc.printf("Write to I2C address success\n\r");
SDesign2018 26:15df8f054d11 968 wait(0.1);
SDesign2018 26:15df8f054d11 969 flag = ADXL372.write(registerAddress);
SDesign2018 26:15df8f054d11 970 if(flag == 1)
SDesign2018 26:15df8f054d11 971 {
SDesign2018 26:15df8f054d11 972 //pc.printf("Write to register 0x%x address success\n\r", registerAddress);
SDesign2018 26:15df8f054d11 973 flag = ADXL372.write(data);
SDesign2018 26:15df8f054d11 974 if(flag == 1)
SDesign2018 26:15df8f054d11 975 {
SDesign2018 26:15df8f054d11 976 pc.printf("Writing data 0x%x to register address 0x%d success\n\r", data, registerAddress);
SDesign2018 26:15df8f054d11 977 ADXL372.stop();
SDesign2018 26:15df8f054d11 978 return;
SDesign2018 26:15df8f054d11 979 }else {ADXL372.stop();}
SDesign2018 26:15df8f054d11 980 }else {ADXL372.stop();}
SDesign2018 26:15df8f054d11 981 }else ADXL372.stop();
SDesign2018 26:15df8f054d11 982
SDesign2018 26:15df8f054d11 983 }
SDesign2018 26:15df8f054d11 984 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 985
SDesign2018 26:15df8f054d11 986 /*******************************************************************************
SDesign2018 26:15df8f054d11 987 * I2C read sequence for the accelerometer
SDesign2018 26:15df8f054d11 988 * Param:
SDesign2018 26:15df8f054d11 989 * hexAddress: pass the hexadecimal representation of desired Register address
SDesign2018 26:15df8f054d11 990 * Return:
SDesign2018 26:15df8f054d11 991 * Char pointer to the array of read data.
SDesign2018 26:15df8f054d11 992 *
SDesign2018 26:15df8f054d11 993 * Right now it works only for the XData, YData, ZData because I wrote it to read
SDesign2018 26:15df8f054d11 994 * 6 bytes(6 registers).
SDesign2018 26:15df8f054d11 995 * Should change it to be 1 byte at a time
SDesign2018 26:15df8f054d11 996 ******************************************************************************/
SDesign2018 26:15df8f054d11 997 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 998 char * accelerometerI2CRead(int hexAddress){
SDesign2018 26:15df8f054d11 999 char accelData[6];
SDesign2018 26:15df8f054d11 1000 char registerAddress[1];
SDesign2018 26:15df8f054d11 1001 registerAddress[0] = hexAddress;
SDesign2018 26:15df8f054d11 1002
SDesign2018 26:15df8f054d11 1003 // Perform mbed's way sending a start bit, then device address[r/~w], and then the register address
SDesign2018 26:15df8f054d11 1004 // Also if it succeeds, continue to the next operation
SDesign2018 26:15df8f054d11 1005 if(ADXL372.write(ADXL372_Address_8bit, registerAddress, 1) == 0){
SDesign2018 26:15df8f054d11 1006
SDesign2018 26:15df8f054d11 1007 // If previous sequence works, get 6 bytes into char array accelData
SDesign2018 26:15df8f054d11 1008 // Char array because it uses 1 byte(8bits)
SDesign2018 26:15df8f054d11 1009 // Should probably change it to uint8_t type
SDesign2018 26:15df8f054d11 1010 if(ADXL372.read(ADXL372_Address_8bit, accelData, 6) == 0){
SDesign2018 26:15df8f054d11 1011 return accelData;
SDesign2018 26:15df8f054d11 1012 }else pc.printf("Failed to read\n\r");
SDesign2018 26:15df8f054d11 1013 }else pc.printf("Failed to write\n\r");
SDesign2018 26:15df8f054d11 1014 return 0; // Only if it fails completely
SDesign2018 26:15df8f054d11 1015 }
SDesign2018 26:15df8f054d11 1016 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 1017
SDesign2018 26:15df8f054d11 1018
SDesign2018 26:15df8f054d11 1019
SDesign2018 26:15df8f054d11 1020
SDesign2018 26:15df8f054d11 1021 /*******************************************************************************
SDesign2018 26:15df8f054d11 1022 * Performs one byte write I2C protocol
SDesign2018 26:15df8f054d11 1023 * PARAM:
SDesign2018 26:15df8f054d11 1024 * registerAddress: register you want access to in device, one byte char hex format
SDesign2018 26:15df8f054d11 1025 * data: one byte data that you want to write to device register
SDesign2018 26:15df8f054d11 1026 * Return results from mbed library function:
SDesign2018 26:15df8f054d11 1027 * 0: failure at writing i2c address
SDesign2018 26:15df8f054d11 1028 * 1: successful write
SDesign2018 26:15df8f054d11 1029 * 2: failure at writing data
SDesign2018 26:15df8f054d11 1030 *
SDesign2018 26:15df8f054d11 1031 ******************************************************************************/
SDesign2018 26:15df8f054d11 1032 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 1033 void ADT7410Write(unsigned char registerAddress, unsigned char data){
SDesign2018 26:15df8f054d11 1034 int flag;
SDesign2018 26:15df8f054d11 1035 ADT7410.start();
SDesign2018 26:15df8f054d11 1036 flag = ADT7410.write(ADT7410_Address_8BIT);
SDesign2018 26:15df8f054d11 1037 if(flag == 1)
SDesign2018 26:15df8f054d11 1038 {
SDesign2018 26:15df8f054d11 1039
SDesign2018 26:15df8f054d11 1040 wait(0.1);
SDesign2018 26:15df8f054d11 1041 flag = ADT7410.write(registerAddress);
SDesign2018 26:15df8f054d11 1042 if(flag == 1)
SDesign2018 26:15df8f054d11 1043 {
SDesign2018 26:15df8f054d11 1044
SDesign2018 26:15df8f054d11 1045 flag = ADT7410.write(data);
SDesign2018 26:15df8f054d11 1046 if(flag == 1)
SDesign2018 26:15df8f054d11 1047 {
SDesign2018 26:15df8f054d11 1048 pc.printf("Writing data 0x%x to register address 0x%x success\n\r", data, registerAddress);
SDesign2018 26:15df8f054d11 1049 ADT7410.stop();
SDesign2018 26:15df8f054d11 1050
SDesign2018 26:15df8f054d11 1051 }else {ADT7410.stop();}
SDesign2018 26:15df8f054d11 1052 }else {ADT7410.stop();}
SDesign2018 26:15df8f054d11 1053 }else ADT7410.stop();
SDesign2018 26:15df8f054d11 1054
SDesign2018 26:15df8f054d11 1055
SDesign2018 26:15df8f054d11 1056 }
SDesign2018 26:15df8f054d11 1057 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 1058
SDesign2018 26:15df8f054d11 1059
SDesign2018 26:15df8f054d11 1060 /*******************************************************************************
SDesign2018 26:15df8f054d11 1061 * I2C Read function for ADT7410 Temperature sensor
SDesign2018 26:15df8f054d11 1062 * Param:
SDesign2018 26:15df8f054d11 1063 * hex: hexadecimal representation for desired register
SDesign2018 26:15df8f054d11 1064 * Return:
SDesign2018 26:15df8f054d11 1065 * Char pointer to the array of data values.
SDesign2018 26:15df8f054d11 1066 * Could also change from a char pointer to a uint8_t pointer.
SDesign2018 26:15df8f054d11 1067 *
SDesign2018 26:15df8f054d11 1068 ******************************************************************************/
SDesign2018 26:15df8f054d11 1069 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 1070 char * ADT7410Read(int hex){
SDesign2018 26:15df8f054d11 1071 //short int convertedVal;
SDesign2018 26:15df8f054d11 1072 char data[2] = {0, 0};
SDesign2018 26:15df8f054d11 1073 char cmd[1];
SDesign2018 26:15df8f054d11 1074 cmd[0] = hex;
SDesign2018 26:15df8f054d11 1075 //pc.printf("Register Addres is: %x \n\r", cmd[0]);
SDesign2018 26:15df8f054d11 1076 if(ADT7410.write(ADT7410_Address_8BIT, cmd,1) == 0){
SDesign2018 26:15df8f054d11 1077 if(ADT7410.read(ADT7410_Address_8BIT, data, 2) == 0){
SDesign2018 26:15df8f054d11 1078
SDesign2018 26:15df8f054d11 1079 return data;
SDesign2018 26:15df8f054d11 1080 //return (data[0] << 8 | data[1])>>3; // Explained here: https://stackoverflow.com/a/141576 SOOO GREAT
SDesign2018 26:15df8f054d11 1081
SDesign2018 26:15df8f054d11 1082 }else {pc.printf("Failed to read \n\r"); return data;}
SDesign2018 26:15df8f054d11 1083 }else {pc.printf("Failed to write \n\r"); return data;}
SDesign2018 26:15df8f054d11 1084
SDesign2018 26:15df8f054d11 1085 }
SDesign2018 26:15df8f054d11 1086 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 26:15df8f054d11 1087