Lucy Luz / Mbed 2 deprecated RwSDCard_Xml_GPS

Dependencies:   FileManager GPSGms6 SDFileSystem mbed

Fork of 2545_SD_Card by Craig Evans

Committer:
Lucyjungz
Date:
Mon May 09 11:38:22 2016 +0000
Revision:
9:4d0c81290638
Parent:
6:a05ec997c496
GPS support return in tm struct

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Lucyjungz 1:f911149acd35 1 #include "mbed.h"
Lucyjungz 1:f911149acd35 2 #include "GPSGms6.h"
Lucyjungz 1:f911149acd35 3 #include <string>
Lucyjungz 1:f911149acd35 4
Lucyjungz 1:f911149acd35 5 #define GET_GPRMC_SECTION_SIZE(state) (unsigned int)gprms_tbl[state].size
Lucyjungz 1:f911149acd35 6 #define GET_GPRMC_VARIABLE_ADDR(state) gprms_tbl[state].p_val
Lucyjungz 1:f911149acd35 7 #define GET_GPRMC_NEXT_STATE(state) (GPS_ProcessState)gprms_tbl[state+1].state
Lucyjungz 1:f911149acd35 8
Lucyjungz 1:f911149acd35 9
Lucyjungz 1:f911149acd35 10 GPRMC_Data_TypeDef m_gprmc;
Lucyjungz 1:f911149acd35 11 GPRMC_Data_TypeDef m_valid_gprmc;
Lucyjungz 1:f911149acd35 12 char m_RxBuf[RX_BUF_SIZE];
Lucyjungz 1:f911149acd35 13 bool m_available;
Lucyjungz 1:f911149acd35 14 int m_index;
Lucyjungz 1:f911149acd35 15 Serial serial_gps(PA_9, PA_10);
Lucyjungz 6:a05ec997c496 16 GPRMC_Tbl_TypeDef gprms_tbl[] = {
Lucyjungz 6:a05ec997c496 17 // index , section size , variable
Lucyjungz 6:a05ec997c496 18 {GPS_Process_Start , INVALID_VALUE ,(char *)INVALID_VALUE},
Lucyjungz 6:a05ec997c496 19 {GPS_Process_Header , HEADER_SIZE , m_gprmc.header},
Lucyjungz 6:a05ec997c496 20 {GPS_Process_Time , GPRMC_TIME_SIZE , m_gprmc.time},
Lucyjungz 6:a05ec997c496 21 {GPS_Process_Status , GPRMC_STATUS_SIZE , m_gprmc.status},
Lucyjungz 6:a05ec997c496 22 {GPS_Process_Latitude , GPRMC_LATITUDE_SIZE , m_gprmc.latitude},
Lucyjungz 6:a05ec997c496 23 {GPS_Process_Latitude_hemis , GPRMC_LATITUDE_HEMI_SIZE , m_gprmc.latitude_hemi},
Lucyjungz 6:a05ec997c496 24 {GPS_Process_Longitude , GPRMC_LONGITUDE_SIZE , m_gprmc.longitude},
Lucyjungz 6:a05ec997c496 25 {GPS_Process_Longitude_hemis , GPRMC_LONGITUDE_HEMI_SIZE , m_gprmc.longitude_hemi},
Lucyjungz 6:a05ec997c496 26 {GPS_Process_Speed , GPRMC_SPEED_SIZE , m_gprmc.speed},
Lucyjungz 6:a05ec997c496 27 {GPS_Process_Course , GPRMC_COURSE_SIZE , m_gprmc.course},
Lucyjungz 6:a05ec997c496 28 {GPS_Process_Date , GPRMC_DATE_SIZE , m_gprmc.date},
Lucyjungz 6:a05ec997c496 29 {GPS_Process_Magnetic , GPRMC_MAGNETIC_SIZE , m_gprmc.magnetic},
Lucyjungz 6:a05ec997c496 30 {GPS_Process_Magnetic_Dir , GPRMC_MAGNETIC_DIR_SIZE , m_gprmc.magnetic_dir},
Lucyjungz 6:a05ec997c496 31 {GPS_Process_Indicator , GPRMC_INDICATOR_SIZE , m_gprmc.indicator},
Lucyjungz 6:a05ec997c496 32 {GPS_Process_Complete ,INVALID_VALUE ,(char *)INVALID_VALUE}
Lucyjungz 6:a05ec997c496 33
Lucyjungz 6:a05ec997c496 34 };
Lucyjungz 6:a05ec997c496 35 static GPS_ProcessStatus GPS_ProcessGprmcSection(GPS_ProcessState state,char * buf , unsigned int buf_index,unsigned int buf_size, unsigned int section_size, char * ret_value)
Lucyjungz 1:f911149acd35 36 {
Lucyjungz 1:f911149acd35 37 GPS_ProcessStatus status = GPS_Status_Valid;
Lucyjungz 6:a05ec997c496 38 if (buf_index >= (buf_size - section_size)) {
Lucyjungz 1:f911149acd35 39 status = GPS_Status_NotEnough;
Lucyjungz 6:a05ec997c496 40 } else if (buf[buf_index] == ',') {
Lucyjungz 1:f911149acd35 41 status = GPS_Status_Empty;
Lucyjungz 4:aa7ac2ac6913 42 memset(ret_value,' ', section_size);
Lucyjungz 6:a05ec997c496 43 } else {
Lucyjungz 1:f911149acd35 44 unsigned int idx;
Lucyjungz 4:aa7ac2ac6913 45 // printf("\r\n state = %d =",state);
Lucyjungz 6:a05ec997c496 46 for(idx = 0; idx < section_size; idx++) {
Lucyjungz 1:f911149acd35 47 ret_value[idx] = buf[buf_index + idx];
Lucyjungz 1:f911149acd35 48 }
Lucyjungz 1:f911149acd35 49
Lucyjungz 1:f911149acd35 50 }
Lucyjungz 1:f911149acd35 51 return status;
Lucyjungz 6:a05ec997c496 52
Lucyjungz 1:f911149acd35 53 }
Lucyjungz 6:a05ec997c496 54 static void GPS_ProcessGpsData(char * buf, unsigned int size)
Lucyjungz 6:a05ec997c496 55 {
Lucyjungz 6:a05ec997c496 56 unsigned int index;
Lucyjungz 1:f911149acd35 57 unsigned int adv_index = 0;
Lucyjungz 1:f911149acd35 58 GPS_ProcessStatus status = GPS_Status_Valid;
Lucyjungz 1:f911149acd35 59 GPS_ProcessState state = GPS_Process_Start;
Lucyjungz 6:a05ec997c496 60 for(index = 0; index < size; index++) {
Lucyjungz 6:a05ec997c496 61 if (state == GPS_Process_Start) {
Lucyjungz 6:a05ec997c496 62 if (buf[index] == '$') {
Lucyjungz 1:f911149acd35 63 state = GPS_Process_Header;
Lucyjungz 6:a05ec997c496 64 } else {
Lucyjungz 1:f911149acd35 65 continue;
Lucyjungz 1:f911149acd35 66 }
Lucyjungz 6:a05ec997c496 67 } else if (state == GPS_Process_Header) {
Lucyjungz 6:a05ec997c496 68 if (index < (size - HEADER_SIZE)) {
Lucyjungz 6:a05ec997c496 69 if (buf[index] == 'G' &&
Lucyjungz 6:a05ec997c496 70 buf[index+1] == 'P' &&
Lucyjungz 6:a05ec997c496 71 buf[index+2] == 'R' &&
Lucyjungz 6:a05ec997c496 72 buf[index+3] == 'M' &&
Lucyjungz 1:f911149acd35 73 buf[index+4] == 'C'
Lucyjungz 6:a05ec997c496 74 ) {
Lucyjungz 1:f911149acd35 75 unsigned int h_index;
Lucyjungz 6:a05ec997c496 76 for(h_index = 0; h_index < HEADER_SIZE; h_index++) {
Lucyjungz 1:f911149acd35 77 m_gprmc.header[h_index] = buf[index + h_index];
Lucyjungz 1:f911149acd35 78 }
Lucyjungz 1:f911149acd35 79 index += HEADER_SIZE;
Lucyjungz 1:f911149acd35 80 state = GPS_Process_Time;
Lucyjungz 1:f911149acd35 81 }
Lucyjungz 6:a05ec997c496 82 } else {
Lucyjungz 1:f911149acd35 83 break;
Lucyjungz 1:f911149acd35 84 }
Lucyjungz 6:a05ec997c496 85
Lucyjungz 6:a05ec997c496 86 } else {
Lucyjungz 1:f911149acd35 87 status = GPS_ProcessGprmcSection(state, buf ,index, size, GET_GPRMC_SECTION_SIZE(state), GET_GPRMC_VARIABLE_ADDR(state));
Lucyjungz 1:f911149acd35 88 adv_index = GET_GPRMC_SECTION_SIZE(state);
Lucyjungz 1:f911149acd35 89 state = GET_GPRMC_NEXT_STATE(state) ;
Lucyjungz 1:f911149acd35 90 }
Lucyjungz 1:f911149acd35 91
Lucyjungz 6:a05ec997c496 92
Lucyjungz 6:a05ec997c496 93 if (status == GPS_Status_NotEnough || state == GPS_Process_Complete) {
Lucyjungz 1:f911149acd35 94 break;
Lucyjungz 6:a05ec997c496 95 } else if (status == GPS_Status_Valid) {
Lucyjungz 1:f911149acd35 96 index += adv_index;
Lucyjungz 1:f911149acd35 97 }
Lucyjungz 1:f911149acd35 98 }
Lucyjungz 6:a05ec997c496 99
Lucyjungz 6:a05ec997c496 100 if (m_gprmc.indicator[0] == (char)'A' &&
Lucyjungz 1:f911149acd35 101 m_gprmc.indicator[0] == (char)'D' &&
Lucyjungz 6:a05ec997c496 102 m_gprmc.indicator[0] == (char)'E'
Lucyjungz 6:a05ec997c496 103 ) {
Lucyjungz 1:f911149acd35 104 m_available= true;
Lucyjungz 1:f911149acd35 105 memcpy(&m_valid_gprmc, &m_gprmc , sizeof(m_gprmc));
Lucyjungz 1:f911149acd35 106 }
Lucyjungz 1:f911149acd35 107 }
Lucyjungz 1:f911149acd35 108
Lucyjungz 1:f911149acd35 109
Lucyjungz 6:a05ec997c496 110 void complete_callback()
Lucyjungz 6:a05ec997c496 111 {
Lucyjungz 6:a05ec997c496 112 GPS_ProcessGpsData(m_RxBuf, RX_BUF_SIZE);
Lucyjungz 1:f911149acd35 113
Lucyjungz 1:f911149acd35 114 }
Lucyjungz 6:a05ec997c496 115 void byte_callback()
Lucyjungz 6:a05ec997c496 116 {
Lucyjungz 1:f911149acd35 117 // Note: you need to actually read from the serial to clear the RX interrupt
Lucyjungz 1:f911149acd35 118 //printf("%c", gps.getc());
Lucyjungz 1:f911149acd35 119 m_RxBuf[m_index] = serial_gps.getc();
Lucyjungz 1:f911149acd35 120 //printf("%c", m_RxBuf[m_index]);
Lucyjungz 1:f911149acd35 121 m_index++;
Lucyjungz 6:a05ec997c496 122 if (m_index == RX_BUF_SIZE) {
Lucyjungz 1:f911149acd35 123 m_index = 0;
Lucyjungz 1:f911149acd35 124 complete_callback();
Lucyjungz 1:f911149acd35 125 }
Lucyjungz 1:f911149acd35 126 // myled = !myled;
Lucyjungz 1:f911149acd35 127 }
Lucyjungz 1:f911149acd35 128 GPSGms6::GPSGms6()
Lucyjungz 1:f911149acd35 129 {
Lucyjungz 6:a05ec997c496 130
Lucyjungz 1:f911149acd35 131 m_index = 0;
Lucyjungz 1:f911149acd35 132 m_available = false;
Lucyjungz 6:a05ec997c496 133
Lucyjungz 1:f911149acd35 134 serial_gps.baud(9600);
Lucyjungz 6:a05ec997c496 135
Lucyjungz 4:aa7ac2ac6913 136 }
Lucyjungz 4:aa7ac2ac6913 137 void GPSGms6::start_GPS()
Lucyjungz 4:aa7ac2ac6913 138 {
Lucyjungz 1:f911149acd35 139 serial_gps.attach(&byte_callback);
Lucyjungz 1:f911149acd35 140 }
Lucyjungz 1:f911149acd35 141 GPRMC_Data_TypeDef GPSGms6::latestGPRMC()
Lucyjungz 1:f911149acd35 142 {
Lucyjungz 1:f911149acd35 143 return (m_gprmc);
Lucyjungz 1:f911149acd35 144 }
Lucyjungz 1:f911149acd35 145 GPRMC_Data_TypeDef GPSGms6::validGPRMC()
Lucyjungz 1:f911149acd35 146 {
Lucyjungz 1:f911149acd35 147 m_available = false;
Lucyjungz 1:f911149acd35 148 return (m_valid_gprmc);
Lucyjungz 1:f911149acd35 149 }
Lucyjungz 1:f911149acd35 150 bool GPSGms6::available()
Lucyjungz 1:f911149acd35 151 {
Lucyjungz 1:f911149acd35 152 return (m_available);
Lucyjungz 9:4d0c81290638 153 }
Lucyjungz 9:4d0c81290638 154 tm GPSGms6::UTCTime()
Lucyjungz 9:4d0c81290638 155 {
Lucyjungz 9:4d0c81290638 156 struct tm t;
Lucyjungz 9:4d0c81290638 157 if (m_gprmc.date[0] != ' ' && m_gprmc.time[0] != ' ' )
Lucyjungz 9:4d0c81290638 158 {
Lucyjungz 9:4d0c81290638 159 char str[3];
Lucyjungz 9:4d0c81290638 160
Lucyjungz 9:4d0c81290638 161 memcpy( str, &m_gprmc.time[4], 2 );
Lucyjungz 9:4d0c81290638 162 t.tm_sec = atoi(str);
Lucyjungz 9:4d0c81290638 163 memcpy( str, &m_gprmc.time[2], 2 );
Lucyjungz 9:4d0c81290638 164 t.tm_min = atoi(str);
Lucyjungz 9:4d0c81290638 165 memcpy( str, &m_gprmc.time[0], 2 );
Lucyjungz 9:4d0c81290638 166 t.tm_hour = atoi(str);
Lucyjungz 9:4d0c81290638 167
Lucyjungz 9:4d0c81290638 168 memcpy( str, &m_gprmc.date[0], 2 );
Lucyjungz 9:4d0c81290638 169 t.tm_mday = atoi(str);
Lucyjungz 9:4d0c81290638 170
Lucyjungz 9:4d0c81290638 171 memcpy( str, &m_gprmc.date[2], 2 );
Lucyjungz 9:4d0c81290638 172 t.tm_mon = atoi(str);
Lucyjungz 9:4d0c81290638 173
Lucyjungz 9:4d0c81290638 174 memcpy( str, &m_gprmc.date[4], 2 );
Lucyjungz 9:4d0c81290638 175 t.tm_year = atoi(str);
Lucyjungz 9:4d0c81290638 176 }
Lucyjungz 9:4d0c81290638 177 return (t);
Lucyjungz 1:f911149acd35 178 }