gpr

Dependencies:   MbedJSONValue QEI

Committer:
aldyduino
Date:
Thu Sep 01 13:39:23 2022 +0000
Revision:
12:19b1755d34e9
Parent:
10:dc33cd3f4eb9
Child:
13:40cf48007328
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
aldyduino 12:19b1755d34e9 2 #include "stdio.h"
aldyduino 12:19b1755d34e9 3 #include "MbedJSONValue.h"
aldyduino 12:19b1755d34e9 4 #include "string.h"
aldyduino 12:19b1755d34e9 5 #include "stdint.h"
aldyduino 12:19b1755d34e9 6 #include <cstdlib>
aldyduino 12:19b1755d34e9 7 #define NUM_FIELDS 3
aldyduino 12:19b1755d34e9 8 #define MAX_BUFFER 150
aldyduino 12:19b1755d34e9 9
geky 7:8d9919175929 10 Thread thread;
aldyduino 12:19b1755d34e9 11
aldyduino 12:19b1755d34e9 12 Serial pc(USBTX,USBRX);
aldyduino 12:19b1755d34e9 13 AnalogOut DataDAC(p18);
aldyduino 12:19b1755d34e9 14 Serial gps(p13, p14);
aldyduino 12:19b1755d34e9 15
aldyduino 12:19b1755d34e9 16 char eDataBuffer[500];
aldyduino 12:19b1755d34e9 17 int i = 0;
aldyduino 12:19b1755d34e9 18 int h_time,m_time,s_time;
aldyduino 12:19b1755d34e9 19 char testStringBuffer[MAX_BUFFER]={0};
aldyduino 12:19b1755d34e9 20 bool stringComplete = false;
aldyduino 12:19b1755d34e9 21 int len = 0;
aldyduino 12:19b1755d34e9 22 //number of comma seperated values in the data...TODO does this remain constant?
aldyduino 12:19b1755d34e9 23 float latitude, longitude, timefix, speed, altitude;
aldyduino 12:19b1755d34e9 24 char ns, ew;
aldyduino 12:19b1755d34e9 25 void Init();
aldyduino 12:19b1755d34e9 26 void parseGPS(char *cmd, int n);
aldyduino 12:19b1755d34e9 27 void parseTime (float timeval);
aldyduino 12:19b1755d34e9 28 void baca_gps();
emilmont 1:491820ee784d 29
aldyduino 12:19b1755d34e9 30
aldyduino 12:19b1755d34e9 31 void clearBuffer(char* buffer , int len){
aldyduino 12:19b1755d34e9 32 for (int i =0; i<len ; i++){
aldyduino 12:19b1755d34e9 33 buffer[i] = '\0';
emilmont 1:491820ee784d 34 }
emilmont 1:491820ee784d 35 }
aldyduino 12:19b1755d34e9 36
aldyduino 12:19b1755d34e9 37 void onSerialInput() {
aldyduino 12:19b1755d34e9 38 if(pc.readable()){
aldyduino 12:19b1755d34e9 39 char inChar = pc.getc();
aldyduino 12:19b1755d34e9 40 //pc.printf("%c",inChar);
aldyduino 12:19b1755d34e9 41 testStringBuffer[len] = inChar;
aldyduino 12:19b1755d34e9 42 len++;
aldyduino 12:19b1755d34e9 43 if (inChar == '\n') {
aldyduino 12:19b1755d34e9 44 pc.printf("%s",testStringBuffer);
aldyduino 12:19b1755d34e9 45 stringComplete = true;
aldyduino 12:19b1755d34e9 46 len = 0;
aldyduino 12:19b1755d34e9 47 }
aldyduino 12:19b1755d34e9 48 }
aldyduino 12:19b1755d34e9 49 }
aldyduino 12:19b1755d34e9 50 void Init()
aldyduino 12:19b1755d34e9 51 {
aldyduino 12:19b1755d34e9 52 gps.baud(9600);
aldyduino 12:19b1755d34e9 53 pc.baud(115200);
aldyduino 12:19b1755d34e9 54 pc.attach(&onSerialInput);
aldyduino 12:19b1755d34e9 55 baca_gps();
aldyduino 12:19b1755d34e9 56 pc.printf("Init OK\n");
aldyduino 12:19b1755d34e9 57 }
aldyduino 12:19b1755d34e9 58
aldyduino 12:19b1755d34e9 59 void parseTime (float timeval)
aldyduino 12:19b1755d34e9 60 {
aldyduino 12:19b1755d34e9 61 //format utc time to beijing time,add 8 time zone
aldyduino 12:19b1755d34e9 62 float time = timeval + 80000.00f;
aldyduino 12:19b1755d34e9 63 h_time = int(time) / 10000;
aldyduino 12:19b1755d34e9 64 m_time = (int(time) % 10000) / 100;
aldyduino 12:19b1755d34e9 65 s_time = int(time) % 100;
aldyduino 12:19b1755d34e9 66 }
aldyduino 12:19b1755d34e9 67
aldyduino 12:19b1755d34e9 68
aldyduino 12:19b1755d34e9 69 /*
aldyduino 12:19b1755d34e9 70 * NMEA sentences: https://www.gpsinformation.org/dale/nmea.htm#nmea
aldyduino 12:19b1755d34e9 71 * http://navspark.mybigcommerce.com/content/NMEA_Format_v0.1.pdf
aldyduino 12:19b1755d34e9 72 */
aldyduino 12:19b1755d34e9 73 void parseGPS(char *cmd, int n)
aldyduino 12:19b1755d34e9 74 {
aldyduino 12:19b1755d34e9 75 char tf, status;
aldyduino 12:19b1755d34e9 76 int fq, nst, fix, date; // fix quality, Number of satellites being tracked, 3D fix
aldyduino 12:19b1755d34e9 77
aldyduino 12:19b1755d34e9 78
aldyduino 12:19b1755d34e9 79 // Global Positioning System Fix Data
aldyduino 12:19b1755d34e9 80 if(strncmp(cmd,"$GPGGA", 6) == 0)
aldyduino 12:19b1755d34e9 81 {
aldyduino 12:19b1755d34e9 82 sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
aldyduino 12:19b1755d34e9 83 //pc.printf("Latitude: %f %c, Longitude: %f %c \n", latitude, ns, longitude, ew);
aldyduino 12:19b1755d34e9 84
aldyduino 12:19b1755d34e9 85
aldyduino 12:19b1755d34e9 86 }
emilmont 1:491820ee784d 87
aldyduino 12:19b1755d34e9 88 // Satellite status
aldyduino 12:19b1755d34e9 89 else if(strncmp(cmd,"$GPGSA", 6) == 0)
aldyduino 12:19b1755d34e9 90 {
aldyduino 12:19b1755d34e9 91 sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
aldyduino 12:19b1755d34e9 92 // pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
aldyduino 12:19b1755d34e9 93 }
aldyduino 12:19b1755d34e9 94
aldyduino 12:19b1755d34e9 95 // Geographic position, Latitude and Longitude
aldyduino 12:19b1755d34e9 96 else if(strncmp(cmd,"$GPGLL", 6) == 0)
aldyduino 12:19b1755d34e9 97 {
aldyduino 12:19b1755d34e9 98 sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
aldyduino 12:19b1755d34e9 99 //pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c\n", latitude, ns, longitude, ew);
aldyduino 12:19b1755d34e9 100 }
aldyduino 12:19b1755d34e9 101
aldyduino 12:19b1755d34e9 102 // Geographic position, Latitude and Longitude
aldyduino 12:19b1755d34e9 103 else if(strncmp(cmd,"$GPRMC", 6) == 0)
aldyduino 12:19b1755d34e9 104 {
aldyduino 12:19b1755d34e9 105 sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
aldyduino 12:19b1755d34e9 106 //pc.printf("GPRMC Latitude: %f %c, Longitude: %f %c\n", latitude, ns, longitude, ew);
aldyduino 12:19b1755d34e9 107 }
aldyduino 12:19b1755d34e9 108
aldyduino 12:19b1755d34e9 109 //
aldyduino 12:19b1755d34e9 110 else if(strncmp(cmd,"$GNVTG", 6) == 0)
aldyduino 12:19b1755d34e9 111 {
aldyduino 12:19b1755d34e9 112 // pc.printf("its a Vector Track message.\n");
aldyduino 12:19b1755d34e9 113 }
aldyduino 12:19b1755d34e9 114
aldyduino 12:19b1755d34e9 115 else if(strncmp(cmd,"$GNGGA", 6) == 0)
aldyduino 12:19b1755d34e9 116 {
aldyduino 12:19b1755d34e9 117 sscanf(cmd, "$GNGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
aldyduino 12:19b1755d34e9 118 //pc.printf("GNGGA Latitude: %f %c, Longitude: %f %c \n", latitude, ns, longitude, ew);
aldyduino 12:19b1755d34e9 119 parseTime(timefix);
aldyduino 12:19b1755d34e9 120 // pc.printf("Time: %d:%d:%d\n", h_time, m_time, s_time);
aldyduino 12:19b1755d34e9 121 }
aldyduino 12:19b1755d34e9 122
aldyduino 12:19b1755d34e9 123 else if(strncmp(cmd,"$GNGSA", 6) == 0)
aldyduino 12:19b1755d34e9 124 {
aldyduino 12:19b1755d34e9 125 sscanf(cmd, "$GNGSA,%c,%d,%d", &tf, &fix, &nst);
aldyduino 12:19b1755d34e9 126 //pc.printf("GNGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
aldyduino 12:19b1755d34e9 127 }
aldyduino 12:19b1755d34e9 128
aldyduino 12:19b1755d34e9 129 else if(strncmp(cmd,"$GPGSV", 6) == 0)
aldyduino 12:19b1755d34e9 130 {
aldyduino 12:19b1755d34e9 131 // pc.printf("its a Satellite details message.\n");
aldyduino 12:19b1755d34e9 132 }
aldyduino 12:19b1755d34e9 133
aldyduino 12:19b1755d34e9 134 else if(strncmp(cmd,"$GNGLL", 6) == 0)
aldyduino 12:19b1755d34e9 135 {
aldyduino 12:19b1755d34e9 136 sscanf(cmd, "$GNGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
aldyduino 12:19b1755d34e9 137 //pc.printf("GNGLL Latitude: %f %c, Longitude: %f %c \n", latitude, ns, longitude, ew);
aldyduino 12:19b1755d34e9 138 }
aldyduino 12:19b1755d34e9 139
aldyduino 12:19b1755d34e9 140 else
aldyduino 12:19b1755d34e9 141 {
aldyduino 12:19b1755d34e9 142 // pc.printf("Unknown message type\n");
emilmont 1:491820ee784d 143 }
emilmont 1:491820ee784d 144 }
aldyduino 12:19b1755d34e9 145
aldyduino 12:19b1755d34e9 146 char e;
aldyduino 12:19b1755d34e9 147 void baca_gps()
aldyduino 12:19b1755d34e9 148 {
aldyduino 12:19b1755d34e9 149 while(gps.readable())
aldyduino 12:19b1755d34e9 150 {
aldyduino 12:19b1755d34e9 151
aldyduino 12:19b1755d34e9 152 if(gps.getc() == '$'); // wait a $
aldyduino 12:19b1755d34e9 153 {
aldyduino 12:19b1755d34e9 154 for(int i=0; i<sizeof(eDataBuffer); i++)
aldyduino 12:19b1755d34e9 155 {
aldyduino 12:19b1755d34e9 156 e = gps.getc();
aldyduino 12:19b1755d34e9 157 if( e == '\r' )
aldyduino 12:19b1755d34e9 158 {
aldyduino 12:19b1755d34e9 159 pc.printf("%s\n", eDataBuffer);
aldyduino 12:19b1755d34e9 160 parseGPS(eDataBuffer, i);
aldyduino 12:19b1755d34e9 161 i = sizeof(eDataBuffer);
aldyduino 12:19b1755d34e9 162 }
aldyduino 12:19b1755d34e9 163 else
aldyduino 12:19b1755d34e9 164 {
aldyduino 12:19b1755d34e9 165 eDataBuffer[i] = e;
aldyduino 12:19b1755d34e9 166
aldyduino 12:19b1755d34e9 167 }
aldyduino 12:19b1755d34e9 168 }
aldyduino 12:19b1755d34e9 169 }
aldyduino 12:19b1755d34e9 170 }
aldyduino 12:19b1755d34e9 171
aldyduino 12:19b1755d34e9 172 }
aldyduino 12:19b1755d34e9 173
aldyduino 12:19b1755d34e9 174 //int main(int argc, char* argv[])
aldyduino 12:19b1755d34e9 175 #define TOTAL_DATA 100
aldyduino 12:19b1755d34e9 176 bool threadFlag = false;
aldyduino 12:19b1755d34e9 177 MbedJSONValue threadDAC;
aldyduino 12:19b1755d34e9 178 void DAC_Thread(){
aldyduino 12:19b1755d34e9 179 int periode;
aldyduino 12:19b1755d34e9 180 double DAC_Value;
aldyduino 12:19b1755d34e9 181 int counterDAC = 0;
aldyduino 12:19b1755d34e9 182 while (true) {
aldyduino 12:19b1755d34e9 183 if (threadFlag){
aldyduino 12:19b1755d34e9 184 periode = threadDAC["periode"].get<int>();
aldyduino 12:19b1755d34e9 185 DAC_Value= threadDAC["value"][counterDAC].get<double>();
aldyduino 12:19b1755d34e9 186 DataDAC = DAC_Value;
aldyduino 12:19b1755d34e9 187 pc.printf("DAC: %f \n",DAC_Value);
aldyduino 12:19b1755d34e9 188 wait(periode/TOTAL_DATA);
aldyduino 12:19b1755d34e9 189 counterDAC++;
aldyduino 12:19b1755d34e9 190 if(counterDAC>=TOTAL_DATA){
aldyduino 12:19b1755d34e9 191 counterDAC = 0;
aldyduino 12:19b1755d34e9 192 }
aldyduino 12:19b1755d34e9 193 }
aldyduino 12:19b1755d34e9 194 else {
aldyduino 12:19b1755d34e9 195 DataDAC = 0;
aldyduino 12:19b1755d34e9 196 counterDAC = 0;
aldyduino 12:19b1755d34e9 197 }
aldyduino 12:19b1755d34e9 198
aldyduino 12:19b1755d34e9 199 }
aldyduino 12:19b1755d34e9 200 }
aldyduino 12:19b1755d34e9 201 int main()
aldyduino 12:19b1755d34e9 202 {
aldyduino 12:19b1755d34e9 203 //float e[5]={0};
aldyduino 12:19b1755d34e9 204 Init();
aldyduino 12:19b1755d34e9 205 MbedJSONValue json;
aldyduino 12:19b1755d34e9 206 MbedJSONValue jsonGPS;
aldyduino 12:19b1755d34e9 207 thread.start(DAC_Thread);
aldyduino 12:19b1755d34e9 208 std::string buffer;
aldyduino 12:19b1755d34e9 209
aldyduino 12:19b1755d34e9 210 while(1){
aldyduino 12:19b1755d34e9 211
aldyduino 12:19b1755d34e9 212 if (stringComplete){
aldyduino 12:19b1755d34e9 213 parse(json,testStringBuffer);
aldyduino 12:19b1755d34e9 214 if (json.hasMember("type")){
aldyduino 12:19b1755d34e9 215 if (json["type"].get<std::string>() == "DAC"){
aldyduino 12:19b1755d34e9 216 threadDAC = json;
aldyduino 12:19b1755d34e9 217 threadFlag = true;
aldyduino 12:19b1755d34e9 218 }
aldyduino 12:19b1755d34e9 219 else if(json["type"].get<std::string>() == "STOP"){
aldyduino 12:19b1755d34e9 220 threadFlag = false;
aldyduino 12:19b1755d34e9 221 }
aldyduino 12:19b1755d34e9 222 else if(json["type"].get<std::string>() == "GPS"){
aldyduino 12:19b1755d34e9 223 jsonGPS["type"] = "GPS";
aldyduino 12:19b1755d34e9 224 jsonGPS["lat"] = latitude;
aldyduino 12:19b1755d34e9 225 jsonGPS["ns"] = ns;
aldyduino 12:19b1755d34e9 226 jsonGPS["long"] = longitude;
aldyduino 12:19b1755d34e9 227 jsonGPS["ew"] = ew;
aldyduino 12:19b1755d34e9 228 buffer = jsonGPS.serialize();
aldyduino 12:19b1755d34e9 229 pc.printf("%s\n",buffer.c_str());
aldyduino 12:19b1755d34e9 230 //pc.printf("Latitude: %f %c, Longitude: %f %c \n", latitude, ns, longitude, ew);
aldyduino 12:19b1755d34e9 231
aldyduino 12:19b1755d34e9 232 }
aldyduino 12:19b1755d34e9 233
aldyduino 12:19b1755d34e9 234 else {
aldyduino 12:19b1755d34e9 235 pc.printf("Type is not available\n");
aldyduino 12:19b1755d34e9 236 }
aldyduino 12:19b1755d34e9 237 stringComplete = false;
aldyduino 12:19b1755d34e9 238 clearBuffer(testStringBuffer,MAX_BUFFER);
aldyduino 12:19b1755d34e9 239 }
aldyduino 12:19b1755d34e9 240 else{
aldyduino 12:19b1755d34e9 241 pc.printf("Unknown JSON Message \n");
aldyduino 12:19b1755d34e9 242 stringComplete = false;
aldyduino 12:19b1755d34e9 243 clearBuffer(testStringBuffer,MAX_BUFFER);
aldyduino 12:19b1755d34e9 244 }
aldyduino 12:19b1755d34e9 245
aldyduino 12:19b1755d34e9 246
aldyduino 12:19b1755d34e9 247 }
aldyduino 12:19b1755d34e9 248 //wait(1);
aldyduino 12:19b1755d34e9 249 //return 0;
aldyduino 12:19b1755d34e9 250
aldyduino 12:19b1755d34e9 251 }
aldyduino 12:19b1755d34e9 252 }