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 08:59:23 2016 +0000
Revision:
4:aa7ac2ac6913
Parent:
1:f911149acd35
Child:
6:a05ec997c496
read variable list from another xml file

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