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@9:4d0c81290638, 2016-05-09 (annotated)
- 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?
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 | 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 | } |