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@1:f911149acd35, 2016-05-06 (annotated)
- 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?
| 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 | 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 | } |
