gpr
Dependencies: MbedJSONValue QEI
main.cpp@12:19b1755d34e9, 2022-09-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |