Lucy Luz / Mbed 2 deprecated RwSDCard_Xml_GPS

Dependencies:   FileManager GPSGms6 SDFileSystem mbed

Fork of 2545_SD_Card by Craig Evans

Committer:
Lucyjungz
Date:
Fri May 06 19:30:02 2016 +0000
Revision:
1:f911149acd35
Child:
4:aa7ac2ac6913
Initial Commit

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 1:f911149acd35 43 }
Lucyjungz 1:f911149acd35 44 else{
Lucyjungz 1:f911149acd35 45 unsigned int idx;
Lucyjungz 1:f911149acd35 46 for(idx = 0;idx < section_size;idx++)
Lucyjungz 1:f911149acd35 47 {
Lucyjungz 1:f911149acd35 48 ret_value[idx] = buf[buf_index + idx];
Lucyjungz 1:f911149acd35 49 }
Lucyjungz 1:f911149acd35 50
Lucyjungz 1:f911149acd35 51 }
Lucyjungz 1:f911149acd35 52 return status;
Lucyjungz 1:f911149acd35 53
Lucyjungz 1:f911149acd35 54 }
Lucyjungz 1:f911149acd35 55 static void GPS_ProcessGpsData(char * buf, unsigned int size){
Lucyjungz 1:f911149acd35 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 1:f911149acd35 60 for(index = 0; index < size;index++)
Lucyjungz 1:f911149acd35 61 {
Lucyjungz 1:f911149acd35 62 if (state == GPS_Process_Start)
Lucyjungz 1:f911149acd35 63 {
Lucyjungz 1:f911149acd35 64 if (buf[index] == '$')
Lucyjungz 1:f911149acd35 65 {
Lucyjungz 1:f911149acd35 66 state = GPS_Process_Header;
Lucyjungz 1:f911149acd35 67 }
Lucyjungz 1:f911149acd35 68 else
Lucyjungz 1:f911149acd35 69 {
Lucyjungz 1:f911149acd35 70 continue;
Lucyjungz 1:f911149acd35 71 }
Lucyjungz 1:f911149acd35 72 }
Lucyjungz 1:f911149acd35 73 else if (state == GPS_Process_Header)
Lucyjungz 1:f911149acd35 74 {
Lucyjungz 1:f911149acd35 75 if (index < (size - HEADER_SIZE))
Lucyjungz 1:f911149acd35 76 {
Lucyjungz 1:f911149acd35 77 if (buf[index] == 'G' &&
Lucyjungz 1:f911149acd35 78 buf[index+1] == 'P' &&
Lucyjungz 1:f911149acd35 79 buf[index+2] == 'R' &&
Lucyjungz 1:f911149acd35 80 buf[index+3] == 'M' &&
Lucyjungz 1:f911149acd35 81 buf[index+4] == 'C'
Lucyjungz 1:f911149acd35 82 ){
Lucyjungz 1:f911149acd35 83 unsigned int h_index;
Lucyjungz 1:f911149acd35 84 for(h_index = 0;h_index < HEADER_SIZE;h_index++)
Lucyjungz 1:f911149acd35 85 {
Lucyjungz 1:f911149acd35 86 m_gprmc.header[h_index] = buf[index + h_index];
Lucyjungz 1:f911149acd35 87 }
Lucyjungz 1:f911149acd35 88 index += HEADER_SIZE;
Lucyjungz 1:f911149acd35 89 state = GPS_Process_Time;
Lucyjungz 1:f911149acd35 90 }
Lucyjungz 1:f911149acd35 91 }
Lucyjungz 1:f911149acd35 92 else
Lucyjungz 1:f911149acd35 93 {
Lucyjungz 1:f911149acd35 94 break;
Lucyjungz 1:f911149acd35 95 }
Lucyjungz 1:f911149acd35 96
Lucyjungz 1:f911149acd35 97 }
Lucyjungz 1:f911149acd35 98 else
Lucyjungz 1:f911149acd35 99 {
Lucyjungz 1:f911149acd35 100 status = GPS_ProcessGprmcSection(state, buf ,index, size, GET_GPRMC_SECTION_SIZE(state), GET_GPRMC_VARIABLE_ADDR(state));
Lucyjungz 1:f911149acd35 101 adv_index = GET_GPRMC_SECTION_SIZE(state);
Lucyjungz 1:f911149acd35 102 state = GET_GPRMC_NEXT_STATE(state) ;
Lucyjungz 1:f911149acd35 103 }
Lucyjungz 1:f911149acd35 104
Lucyjungz 1:f911149acd35 105
Lucyjungz 1:f911149acd35 106 if (status == GPS_Status_NotEnough || state == GPS_Process_Complete)
Lucyjungz 1:f911149acd35 107 {
Lucyjungz 1:f911149acd35 108 break;
Lucyjungz 1:f911149acd35 109 }
Lucyjungz 1:f911149acd35 110 else if (status == GPS_Status_Valid)
Lucyjungz 1:f911149acd35 111 {
Lucyjungz 1:f911149acd35 112 index += adv_index;
Lucyjungz 1:f911149acd35 113 }
Lucyjungz 1:f911149acd35 114 }
Lucyjungz 1:f911149acd35 115
Lucyjungz 1:f911149acd35 116 if (m_gprmc.indicator[0] == (char)'A' &&
Lucyjungz 1:f911149acd35 117 m_gprmc.indicator[0] == (char)'D' &&
Lucyjungz 1:f911149acd35 118 m_gprmc.indicator[0] == (char)'E'
Lucyjungz 1:f911149acd35 119 )
Lucyjungz 1:f911149acd35 120 {
Lucyjungz 1:f911149acd35 121 m_available= true;
Lucyjungz 1:f911149acd35 122 memcpy(&m_valid_gprmc, &m_gprmc , sizeof(m_gprmc));
Lucyjungz 1:f911149acd35 123 }
Lucyjungz 1:f911149acd35 124 }
Lucyjungz 1:f911149acd35 125
Lucyjungz 1:f911149acd35 126
Lucyjungz 1:f911149acd35 127 void complete_callback() {
Lucyjungz 1:f911149acd35 128 GPS_ProcessGpsData(m_RxBuf, RX_BUF_SIZE);
Lucyjungz 1:f911149acd35 129
Lucyjungz 1:f911149acd35 130 }
Lucyjungz 1:f911149acd35 131 void byte_callback() {
Lucyjungz 1:f911149acd35 132 // Note: you need to actually read from the serial to clear the RX interrupt
Lucyjungz 1:f911149acd35 133 //printf("%c", gps.getc());
Lucyjungz 1:f911149acd35 134 m_RxBuf[m_index] = serial_gps.getc();
Lucyjungz 1:f911149acd35 135 //printf("%c", m_RxBuf[m_index]);
Lucyjungz 1:f911149acd35 136 m_index++;
Lucyjungz 1:f911149acd35 137 if (m_index == RX_BUF_SIZE)
Lucyjungz 1:f911149acd35 138 {
Lucyjungz 1:f911149acd35 139 m_index = 0;
Lucyjungz 1:f911149acd35 140 complete_callback();
Lucyjungz 1:f911149acd35 141 }
Lucyjungz 1:f911149acd35 142 // myled = !myled;
Lucyjungz 1:f911149acd35 143 }
Lucyjungz 1:f911149acd35 144 GPSGms6::GPSGms6()
Lucyjungz 1:f911149acd35 145 {
Lucyjungz 1:f911149acd35 146
Lucyjungz 1:f911149acd35 147 m_index = 0;
Lucyjungz 1:f911149acd35 148 m_available = false;
Lucyjungz 1:f911149acd35 149
Lucyjungz 1:f911149acd35 150 serial_gps.baud(9600);
Lucyjungz 1:f911149acd35 151 serial_gps.attach(&byte_callback);
Lucyjungz 1:f911149acd35 152 }
Lucyjungz 1:f911149acd35 153 GPRMC_Data_TypeDef GPSGms6::latestGPRMC()
Lucyjungz 1:f911149acd35 154 {
Lucyjungz 1:f911149acd35 155 return (m_gprmc);
Lucyjungz 1:f911149acd35 156 }
Lucyjungz 1:f911149acd35 157 GPRMC_Data_TypeDef GPSGms6::validGPRMC()
Lucyjungz 1:f911149acd35 158 {
Lucyjungz 1:f911149acd35 159 m_available = false;
Lucyjungz 1:f911149acd35 160 return (m_valid_gprmc);
Lucyjungz 1:f911149acd35 161 }
Lucyjungz 1:f911149acd35 162 bool GPSGms6::available()
Lucyjungz 1:f911149acd35 163 {
Lucyjungz 1:f911149acd35 164 return (m_available);
Lucyjungz 1:f911149acd35 165 }