Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FileManager GPSGms6 SDFileSystem mbed
Fork of 2545_SD_Card by
GPSGms6.cpp@4:aa7ac2ac6913, 2016-05-09 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
