Frequency Counter. User interface are used DISCO-F746NG GUI with touch panel.
Dependencies: BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG RingBuffer TS_DISCO_F746NG fc_GPS1PPS_f746_f4xx mbed
Please refer following.
/users/kenjiArai/notebook/frequency-counters/
GPS_rcvr/GPSrcvr.cpp@0:52c5dc2b2b68, 2016-11-19 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Nov 19 05:32:06 2016 +0000
- Revision:
- 0:52c5dc2b2b68
Frequency Counter. User interface are used DISCO-F746NG GUI with touch panel.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:52c5dc2b2b68 | 1 | /* |
kenjiArai | 0:52c5dc2b2b68 | 2 | * mbed Application program / GPS receiver control and 1PPS output |
kenjiArai | 0:52c5dc2b2b68 | 3 | * |
kenjiArai | 0:52c5dc2b2b68 | 4 | * Copyright (c) 2004,'09,'10,'16 Kenji Arai / JH1PJL |
kenjiArai | 0:52c5dc2b2b68 | 5 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:52c5dc2b2b68 | 6 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:52c5dc2b2b68 | 7 | * Created: March 28th, 2004 Kenji Arai |
kenjiArai | 0:52c5dc2b2b68 | 8 | * updated: July 25th, 2009 for PIC24USB |
kenjiArai | 0:52c5dc2b2b68 | 9 | * updated: January 16th, 2010 change to GPS-GM318 |
kenjiArai | 0:52c5dc2b2b68 | 10 | * updated: April 24th, 2010 for mbed / NXP LPC1768 |
kenjiArai | 0:52c5dc2b2b68 | 11 | * Revised: Nomeber 13th, 2016 |
kenjiArai | 0:52c5dc2b2b68 | 12 | */ |
kenjiArai | 0:52c5dc2b2b68 | 13 | |
kenjiArai | 0:52c5dc2b2b68 | 14 | // Include -------------------------------------------------------------------- |
kenjiArai | 0:52c5dc2b2b68 | 15 | #include <string.h> |
kenjiArai | 0:52c5dc2b2b68 | 16 | #include "mbed.h" |
kenjiArai | 0:52c5dc2b2b68 | 17 | #include "GPSrcvr.h" |
kenjiArai | 0:52c5dc2b2b68 | 18 | #if defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 0:52c5dc2b2b68 | 19 | #include "iSerial.h" |
kenjiArai | 0:52c5dc2b2b68 | 20 | #elif defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 21 | #include "RingBuffer.h" |
kenjiArai | 0:52c5dc2b2b68 | 22 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 23 | |
kenjiArai | 0:52c5dc2b2b68 | 24 | // Definition ----------------------------------------------------------------- |
kenjiArai | 0:52c5dc2b2b68 | 25 | //#define USE_DEBUG |
kenjiArai | 0:52c5dc2b2b68 | 26 | |
kenjiArai | 0:52c5dc2b2b68 | 27 | #ifdef USE_DEBUG |
kenjiArai | 0:52c5dc2b2b68 | 28 | #define U_DEBUGBAUD(x) pc.baud(x) |
kenjiArai | 0:52c5dc2b2b68 | 29 | #define U_DEBUG(...) pc.printf(__VA_ARGS__) |
kenjiArai | 0:52c5dc2b2b68 | 30 | #define DBG(c) pc.putc(c) |
kenjiArai | 0:52c5dc2b2b68 | 31 | #else |
kenjiArai | 0:52c5dc2b2b68 | 32 | #define U_DEBUGBAUD(x) {;} |
kenjiArai | 0:52c5dc2b2b68 | 33 | #define U_DEBUG(...) {;} |
kenjiArai | 0:52c5dc2b2b68 | 34 | #define DBG(c) {;} |
kenjiArai | 0:52c5dc2b2b68 | 35 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 36 | |
kenjiArai | 0:52c5dc2b2b68 | 37 | #define GSP_BUF_B (128 * 3) |
kenjiArai | 0:52c5dc2b2b68 | 38 | #define GPS_BUF_S (128 * 2) |
kenjiArai | 0:52c5dc2b2b68 | 39 | |
kenjiArai | 0:52c5dc2b2b68 | 40 | // Object --------------------------------------------------------------------- |
kenjiArai | 0:52c5dc2b2b68 | 41 | #if defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 0:52c5dc2b2b68 | 42 | DigitalIn gps_rx(PC_7); // for checking GPS RX line |
kenjiArai | 0:52c5dc2b2b68 | 43 | iSerial gps(NC, PC_7, 0, 1024); // GPS Data receive |
kenjiArai | 0:52c5dc2b2b68 | 44 | #error "This is only on DISCO-F746NG!!" |
kenjiArai | 0:52c5dc2b2b68 | 45 | #elif defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 46 | RingBuffer rxbuf(1024); // can receive all information every one sec |
kenjiArai | 0:52c5dc2b2b68 | 47 | DigitalIn gps_rx(PF_6); // for checking GPS RX line |
kenjiArai | 0:52c5dc2b2b68 | 48 | Serial gps(NC, PF_6); // GPS Data receive |
kenjiArai | 0:52c5dc2b2b68 | 49 | #else |
kenjiArai | 0:52c5dc2b2b68 | 50 | #error "Target is only Nucleo-F411RE(F446RE) or DISCO-F746NG!!!" |
kenjiArai | 0:52c5dc2b2b68 | 51 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 52 | |
kenjiArai | 0:52c5dc2b2b68 | 53 | extern Serial pc; |
kenjiArai | 0:52c5dc2b2b68 | 54 | |
kenjiArai | 0:52c5dc2b2b68 | 55 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 0:52c5dc2b2b68 | 56 | bool gps_is_okay_flag; |
kenjiArai | 0:52c5dc2b2b68 | 57 | uint8_t gps_ready; |
kenjiArai | 0:52c5dc2b2b68 | 58 | uint8_t gps_status; |
kenjiArai | 0:52c5dc2b2b68 | 59 | uint8_t gps_rmc_ready; |
kenjiArai | 0:52c5dc2b2b68 | 60 | char GPS_Buffer[GSP_BUF_B]; //GPS data buffer |
kenjiArai | 0:52c5dc2b2b68 | 61 | char MsgBuf_RMC[GPS_BUF_S]; |
kenjiArai | 0:52c5dc2b2b68 | 62 | char MsgBuf_GSA[GPS_BUF_S]; |
kenjiArai | 0:52c5dc2b2b68 | 63 | char MsgBuf_GGA[GPS_BUF_S]; |
kenjiArai | 0:52c5dc2b2b68 | 64 | |
kenjiArai | 0:52c5dc2b2b68 | 65 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 0:52c5dc2b2b68 | 66 | uint8_t check_gps_3d(void); |
kenjiArai | 0:52c5dc2b2b68 | 67 | uint8_t check_gps_ready(void); |
kenjiArai | 0:52c5dc2b2b68 | 68 | void get_time_and_date(struct tm *pt); |
kenjiArai | 0:52c5dc2b2b68 | 69 | void getline_gps(void); |
kenjiArai | 0:52c5dc2b2b68 | 70 | void gps_data_rcv(void); |
kenjiArai | 0:52c5dc2b2b68 | 71 | #if defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 72 | void iGPSrcv_initialize(void); |
kenjiArai | 0:52c5dc2b2b68 | 73 | int iGPS_readable(void); |
kenjiArai | 0:52c5dc2b2b68 | 74 | int iGPS_getc(void); |
kenjiArai | 0:52c5dc2b2b68 | 75 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 76 | |
kenjiArai | 0:52c5dc2b2b68 | 77 | //////////////////////////////////////////////////////////////////////////////// |
kenjiArai | 0:52c5dc2b2b68 | 78 | // Receive GPS data using Interrupt handler |
kenjiArai | 0:52c5dc2b2b68 | 79 | // |
kenjiArai | 0:52c5dc2b2b68 | 80 | // !!! Takes urgent and dirty solution by due to IRQ restriction |
kenjiArai | 0:52c5dc2b2b68 | 81 | // on mbed library (reason is unknown as of today) |
kenjiArai | 0:52c5dc2b2b68 | 82 | // reference source file:stm32f746xx.h |
kenjiArai | 0:52c5dc2b2b68 | 83 | // under /mbed-dev/targets/cmsis/TARGET_STM/TARGET_NUCLEO_F746ZG |
kenjiArai | 0:52c5dc2b2b68 | 84 | //////////////////////////////////////////////////////////////////////////////// |
kenjiArai | 0:52c5dc2b2b68 | 85 | #if defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 86 | |
kenjiArai | 0:52c5dc2b2b68 | 87 | // ------ Interrupt Function ------ |
kenjiArai | 0:52c5dc2b2b68 | 88 | void rx_handler(void) |
kenjiArai | 0:52c5dc2b2b68 | 89 | { |
kenjiArai | 0:52c5dc2b2b68 | 90 | uint32_t reg = UART7->ISR; |
kenjiArai | 0:52c5dc2b2b68 | 91 | if (reg && USART_ISR_RXNE){ // data is ready to read |
kenjiArai | 0:52c5dc2b2b68 | 92 | UART7->ISR &= ~(USART_ISR_RXNE + USART_ISR_PE + USART_ISR_FE |
kenjiArai | 0:52c5dc2b2b68 | 93 | + USART_ISR_NE + USART_ISR_ORE); |
kenjiArai | 0:52c5dc2b2b68 | 94 | rxbuf.save((unsigned char)UART7->RDR); |
kenjiArai | 0:52c5dc2b2b68 | 95 | } |
kenjiArai | 0:52c5dc2b2b68 | 96 | } |
kenjiArai | 0:52c5dc2b2b68 | 97 | |
kenjiArai | 0:52c5dc2b2b68 | 98 | void iGPSrcv_initialize(void) |
kenjiArai | 0:52c5dc2b2b68 | 99 | { |
kenjiArai | 0:52c5dc2b2b68 | 100 | __disable_irq(); |
kenjiArai | 0:52c5dc2b2b68 | 101 | UART7->CR1 &= ~(USART_CR1_TE + USART_CR1_TCIE + USART_CR1_TXEIE |
kenjiArai | 0:52c5dc2b2b68 | 102 | + USART_CR1_PEIE + USART_CR1_IDLEIE); |
kenjiArai | 0:52c5dc2b2b68 | 103 | UART7->CR1 |= (USART_CR1_RXNEIE + USART_CR1_RE + USART_CR1_UE); |
kenjiArai | 0:52c5dc2b2b68 | 104 | NVIC_SetVector(UART7_IRQn, (uint32_t)rx_handler); |
kenjiArai | 0:52c5dc2b2b68 | 105 | NVIC_ClearPendingIRQ(UART7_IRQn); |
kenjiArai | 0:52c5dc2b2b68 | 106 | NVIC_EnableIRQ(UART7_IRQn); |
kenjiArai | 0:52c5dc2b2b68 | 107 | __enable_irq(); |
kenjiArai | 0:52c5dc2b2b68 | 108 | #if 0 |
kenjiArai | 0:52c5dc2b2b68 | 109 | printf("UART7->CR1 0x%08x:0x%08x\r\n", &UART7->CR1, UART7->CR1); |
kenjiArai | 0:52c5dc2b2b68 | 110 | printf("UART7->CR2 0x%08x:0x%08x\r\n", &UART7->CR2, UART7->CR2); |
kenjiArai | 0:52c5dc2b2b68 | 111 | printf("UART7->CR3 0x%08x:0x%08x\r\n", &UART7->CR3, UART7->CR3); |
kenjiArai | 0:52c5dc2b2b68 | 112 | printf("UART7->BRR 0x%08x:0x%08x\r\n", &UART7->BRR, UART7->BRR); |
kenjiArai | 0:52c5dc2b2b68 | 113 | printf("UART7->GTPR 0x%08x:0x%08x\r\n", &UART7->GTPR, UART7->GTPR); |
kenjiArai | 0:52c5dc2b2b68 | 114 | printf("UART7->RTOR 0x%08x:0x%08x\r\n", &UART7->RTOR, UART7->RTOR); |
kenjiArai | 0:52c5dc2b2b68 | 115 | printf("UART7->RQR 0x%08x:0x%08x\r\n", &UART7->RQR, UART7->RQR); |
kenjiArai | 0:52c5dc2b2b68 | 116 | printf("UART7->ISR 0x%08x:0x%08x\r\n", &UART7->ISR, UART7->ISR); |
kenjiArai | 0:52c5dc2b2b68 | 117 | printf("UART7->ICR 0x%08x:0x%08x\r\n", &UART7->ICR, UART7->ICR); |
kenjiArai | 0:52c5dc2b2b68 | 118 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 119 | } |
kenjiArai | 0:52c5dc2b2b68 | 120 | |
kenjiArai | 0:52c5dc2b2b68 | 121 | int iGPS_readable(void) |
kenjiArai | 0:52c5dc2b2b68 | 122 | { |
kenjiArai | 0:52c5dc2b2b68 | 123 | return rxbuf.check(); |
kenjiArai | 0:52c5dc2b2b68 | 124 | } |
kenjiArai | 0:52c5dc2b2b68 | 125 | |
kenjiArai | 0:52c5dc2b2b68 | 126 | int iGPS_getc(void) |
kenjiArai | 0:52c5dc2b2b68 | 127 | { |
kenjiArai | 0:52c5dc2b2b68 | 128 | while(!rxbuf.check()){;} // wait receiving a character |
kenjiArai | 0:52c5dc2b2b68 | 129 | return rxbuf.read(); |
kenjiArai | 0:52c5dc2b2b68 | 130 | } |
kenjiArai | 0:52c5dc2b2b68 | 131 | |
kenjiArai | 0:52c5dc2b2b68 | 132 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 133 | |
kenjiArai | 0:52c5dc2b2b68 | 134 | //////////////////////////////////////////////////////////////////////////////// |
kenjiArai | 0:52c5dc2b2b68 | 135 | // Parse GPS data |
kenjiArai | 0:52c5dc2b2b68 | 136 | // Module Type: u-blux7 NEO-7M |
kenjiArai | 0:52c5dc2b2b68 | 137 | //////////////////////////////////////////////////////////////////////////////// |
kenjiArai | 0:52c5dc2b2b68 | 138 | // Get RMC & GAA data |
kenjiArai | 0:52c5dc2b2b68 | 139 | void gps_data_rcv(void) |
kenjiArai | 0:52c5dc2b2b68 | 140 | { |
kenjiArai | 0:52c5dc2b2b68 | 141 | int8_t i; |
kenjiArai | 0:52c5dc2b2b68 | 142 | time_t old_ave_sec[2]; |
kenjiArai | 0:52c5dc2b2b68 | 143 | uint32_t diff = 0; |
kenjiArai | 0:52c5dc2b2b68 | 144 | time_t seconds; |
kenjiArai | 0:52c5dc2b2b68 | 145 | struct tm t_gps; |
kenjiArai | 0:52c5dc2b2b68 | 146 | |
kenjiArai | 0:52c5dc2b2b68 | 147 | seconds = time(NULL); |
kenjiArai | 0:52c5dc2b2b68 | 148 | U_DEBUG("\r\nCurrent Time: %s\r\n", ctime(&seconds)); |
kenjiArai | 0:52c5dc2b2b68 | 149 | old_ave_sec[0] = 0; |
kenjiArai | 0:52c5dc2b2b68 | 150 | old_ave_sec[1] = 0; |
kenjiArai | 0:52c5dc2b2b68 | 151 | // Wait long interval (every 1sec) |
kenjiArai | 0:52c5dc2b2b68 | 152 | for (uint32_t i = 0; i < 100000; i++){ |
kenjiArai | 0:52c5dc2b2b68 | 153 | if (gps_rx == 0){ |
kenjiArai | 0:52c5dc2b2b68 | 154 | i = 0; |
kenjiArai | 0:52c5dc2b2b68 | 155 | } |
kenjiArai | 0:52c5dc2b2b68 | 156 | } |
kenjiArai | 0:52c5dc2b2b68 | 157 | U_DEBUG("GPS line is Hi\r\n"); |
kenjiArai | 0:52c5dc2b2b68 | 158 | #if defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 159 | // Clear GPS RX line errors(over run) |
kenjiArai | 0:52c5dc2b2b68 | 160 | UART7->ICR = 0; |
kenjiArai | 0:52c5dc2b2b68 | 161 | UART7->CR1 = 0; |
kenjiArai | 0:52c5dc2b2b68 | 162 | UART7->CR1 = 5; |
kenjiArai | 0:52c5dc2b2b68 | 163 | iGPSrcv_initialize(); |
kenjiArai | 0:52c5dc2b2b68 | 164 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 165 | U_DEBUG("Start GPS!!"); |
kenjiArai | 0:52c5dc2b2b68 | 166 | while(true) { |
kenjiArai | 0:52c5dc2b2b68 | 167 | getline_gps(); // Get GPS data from UART |
kenjiArai | 0:52c5dc2b2b68 | 168 | if (strncmp(GPS_Buffer, "$GPRMC",6) == 0) { |
kenjiArai | 0:52c5dc2b2b68 | 169 | for (i=0; GPS_Buffer[i] != 0; i++) {// Copy msg to RMC buffer |
kenjiArai | 0:52c5dc2b2b68 | 170 | MsgBuf_RMC[i] = GPS_Buffer[i]; |
kenjiArai | 0:52c5dc2b2b68 | 171 | } |
kenjiArai | 0:52c5dc2b2b68 | 172 | MsgBuf_RMC[i+1] = 0; |
kenjiArai | 0:52c5dc2b2b68 | 173 | DBG('2'); |
kenjiArai | 0:52c5dc2b2b68 | 174 | if (gps_ready == 3) { |
kenjiArai | 0:52c5dc2b2b68 | 175 | DBG('3'); |
kenjiArai | 0:52c5dc2b2b68 | 176 | get_time_and_date(&t_gps); |
kenjiArai | 0:52c5dc2b2b68 | 177 | seconds = mktime(&t_gps); |
kenjiArai | 0:52c5dc2b2b68 | 178 | if (old_ave_sec[0] == 0){ |
kenjiArai | 0:52c5dc2b2b68 | 179 | old_ave_sec[0] = seconds; |
kenjiArai | 0:52c5dc2b2b68 | 180 | } else if (old_ave_sec[1] == 0){ |
kenjiArai | 0:52c5dc2b2b68 | 181 | old_ave_sec[1] = seconds; |
kenjiArai | 0:52c5dc2b2b68 | 182 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 183 | if (old_ave_sec[0] >= old_ave_sec[1]){ |
kenjiArai | 0:52c5dc2b2b68 | 184 | diff = old_ave_sec[0] - old_ave_sec[1]; |
kenjiArai | 0:52c5dc2b2b68 | 185 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 186 | diff = old_ave_sec[1] - old_ave_sec[0]; |
kenjiArai | 0:52c5dc2b2b68 | 187 | } |
kenjiArai | 0:52c5dc2b2b68 | 188 | if (diff > 100 ){ |
kenjiArai | 0:52c5dc2b2b68 | 189 | old_ave_sec[0] = seconds; |
kenjiArai | 0:52c5dc2b2b68 | 190 | old_ave_sec[1] = 0; |
kenjiArai | 0:52c5dc2b2b68 | 191 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 192 | if (old_ave_sec[0] > old_ave_sec[1]){ |
kenjiArai | 0:52c5dc2b2b68 | 193 | diff = seconds - old_ave_sec[0]; |
kenjiArai | 0:52c5dc2b2b68 | 194 | if (diff < 100){ |
kenjiArai | 0:52c5dc2b2b68 | 195 | old_ave_sec[1] = seconds; |
kenjiArai | 0:52c5dc2b2b68 | 196 | } |
kenjiArai | 0:52c5dc2b2b68 | 197 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 198 | diff = seconds - old_ave_sec[1]; |
kenjiArai | 0:52c5dc2b2b68 | 199 | if (diff < 100){ |
kenjiArai | 0:52c5dc2b2b68 | 200 | old_ave_sec[0] = seconds; |
kenjiArai | 0:52c5dc2b2b68 | 201 | } |
kenjiArai | 0:52c5dc2b2b68 | 202 | } |
kenjiArai | 0:52c5dc2b2b68 | 203 | set_time(seconds); |
kenjiArai | 0:52c5dc2b2b68 | 204 | DBG('4'); |
kenjiArai | 0:52c5dc2b2b68 | 205 | return; |
kenjiArai | 0:52c5dc2b2b68 | 206 | } |
kenjiArai | 0:52c5dc2b2b68 | 207 | } |
kenjiArai | 0:52c5dc2b2b68 | 208 | } |
kenjiArai | 0:52c5dc2b2b68 | 209 | } else if (strncmp(GPS_Buffer, "$GPGSA",6) == 0) { |
kenjiArai | 0:52c5dc2b2b68 | 210 | for (i=0; GPS_Buffer[i] != 0; i++) {// Copy msg to GSA buffer |
kenjiArai | 0:52c5dc2b2b68 | 211 | MsgBuf_GSA[i] = GPS_Buffer[i]; |
kenjiArai | 0:52c5dc2b2b68 | 212 | } |
kenjiArai | 0:52c5dc2b2b68 | 213 | MsgBuf_GSA[i+1] = 0; |
kenjiArai | 0:52c5dc2b2b68 | 214 | gps_ready = check_gps_3d(); |
kenjiArai | 0:52c5dc2b2b68 | 215 | DBG('x'); |
kenjiArai | 0:52c5dc2b2b68 | 216 | } else if (strncmp(GPS_Buffer, "$GPGGA",6) == 0) { |
kenjiArai | 0:52c5dc2b2b68 | 217 | for (i=0; GPS_Buffer[i] != 0; i++) {// Copy msg to GGA buffer |
kenjiArai | 0:52c5dc2b2b68 | 218 | MsgBuf_GGA[i] = GPS_Buffer[i]; |
kenjiArai | 0:52c5dc2b2b68 | 219 | } |
kenjiArai | 0:52c5dc2b2b68 | 220 | MsgBuf_GGA[i+1] = 0; |
kenjiArai | 0:52c5dc2b2b68 | 221 | gps_status = check_gps_ready(); |
kenjiArai | 0:52c5dc2b2b68 | 222 | DBG('1'); |
kenjiArai | 0:52c5dc2b2b68 | 223 | } |
kenjiArai | 0:52c5dc2b2b68 | 224 | } |
kenjiArai | 0:52c5dc2b2b68 | 225 | } |
kenjiArai | 0:52c5dc2b2b68 | 226 | |
kenjiArai | 0:52c5dc2b2b68 | 227 | bool check_gps_is_okay() |
kenjiArai | 0:52c5dc2b2b68 | 228 | { |
kenjiArai | 0:52c5dc2b2b68 | 229 | return gps_is_okay_flag; |
kenjiArai | 0:52c5dc2b2b68 | 230 | } |
kenjiArai | 0:52c5dc2b2b68 | 231 | |
kenjiArai | 0:52c5dc2b2b68 | 232 | // Get line of data from GPS |
kenjiArai | 0:52c5dc2b2b68 | 233 | void getline_gps(void) |
kenjiArai | 0:52c5dc2b2b68 | 234 | { |
kenjiArai | 0:52c5dc2b2b68 | 235 | char *p = GPS_Buffer; |
kenjiArai | 0:52c5dc2b2b68 | 236 | |
kenjiArai | 0:52c5dc2b2b68 | 237 | #if defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 0:52c5dc2b2b68 | 238 | while (gps.getc() != '$'){;} |
kenjiArai | 0:52c5dc2b2b68 | 239 | #elif defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 240 | while (iGPS_getc() != '$'){;} |
kenjiArai | 0:52c5dc2b2b68 | 241 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 242 | *p++ = '$'; |
kenjiArai | 0:52c5dc2b2b68 | 243 | #if 0 |
kenjiArai | 0:52c5dc2b2b68 | 244 | U_DEBUG("\r\n"); |
kenjiArai | 0:52c5dc2b2b68 | 245 | #else |
kenjiArai | 0:52c5dc2b2b68 | 246 | pc.printf("\r\n"); |
kenjiArai | 0:52c5dc2b2b68 | 247 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 248 | for (char i= 0;i < 150;i++){ |
kenjiArai | 0:52c5dc2b2b68 | 249 | #if defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 0:52c5dc2b2b68 | 250 | *p = gps.getc(); |
kenjiArai | 0:52c5dc2b2b68 | 251 | #elif defined(TARGET_STM32F746NG) |
kenjiArai | 0:52c5dc2b2b68 | 252 | *p = iGPS_getc(); |
kenjiArai | 0:52c5dc2b2b68 | 253 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 254 | #if 0 |
kenjiArai | 0:52c5dc2b2b68 | 255 | DBG(*p); |
kenjiArai | 0:52c5dc2b2b68 | 256 | #else |
kenjiArai | 0:52c5dc2b2b68 | 257 | pc.putc(*p); |
kenjiArai | 0:52c5dc2b2b68 | 258 | #endif |
kenjiArai | 0:52c5dc2b2b68 | 259 | if (*p == '\r'){ |
kenjiArai | 0:52c5dc2b2b68 | 260 | *++p = '\n'; |
kenjiArai | 0:52c5dc2b2b68 | 261 | *++p = 0; |
kenjiArai | 0:52c5dc2b2b68 | 262 | *++p = 0; |
kenjiArai | 0:52c5dc2b2b68 | 263 | U_DEBUG("Get one GPS data\r\n"); |
kenjiArai | 0:52c5dc2b2b68 | 264 | return; |
kenjiArai | 0:52c5dc2b2b68 | 265 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 266 | p++; |
kenjiArai | 0:52c5dc2b2b68 | 267 | } |
kenjiArai | 0:52c5dc2b2b68 | 268 | } |
kenjiArai | 0:52c5dc2b2b68 | 269 | *++p = 0; |
kenjiArai | 0:52c5dc2b2b68 | 270 | *++p = 0; |
kenjiArai | 0:52c5dc2b2b68 | 271 | } |
kenjiArai | 0:52c5dc2b2b68 | 272 | |
kenjiArai | 0:52c5dc2b2b68 | 273 | // ASCII to hex |
kenjiArai | 0:52c5dc2b2b68 | 274 | uint8_t hex(char c){ |
kenjiArai | 0:52c5dc2b2b68 | 275 | if(c<= '/') return( ERR ); |
kenjiArai | 0:52c5dc2b2b68 | 276 | if(((c -= '0')<= 9 || 10 <= ( c -= 'A' - '0' - 10)) && c <= 15) { |
kenjiArai | 0:52c5dc2b2b68 | 277 | return((uint8_t)c); |
kenjiArai | 0:52c5dc2b2b68 | 278 | } |
kenjiArai | 0:52c5dc2b2b68 | 279 | return(ERR); |
kenjiArai | 0:52c5dc2b2b68 | 280 | } |
kenjiArai | 0:52c5dc2b2b68 | 281 | |
kenjiArai | 0:52c5dc2b2b68 | 282 | // Search next ',' (comma) |
kenjiArai | 0:52c5dc2b2b68 | 283 | char *next_comma( char *p ){ |
kenjiArai | 0:52c5dc2b2b68 | 284 | while (1) { |
kenjiArai | 0:52c5dc2b2b68 | 285 | if ( *p== ',' ) { |
kenjiArai | 0:52c5dc2b2b68 | 286 | return ++p; |
kenjiArai | 0:52c5dc2b2b68 | 287 | } else if ( *p == 0 ) { |
kenjiArai | 0:52c5dc2b2b68 | 288 | return (char*)-1; |
kenjiArai | 0:52c5dc2b2b68 | 289 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 290 | p++; |
kenjiArai | 0:52c5dc2b2b68 | 291 | } |
kenjiArai | 0:52c5dc2b2b68 | 292 | } |
kenjiArai | 0:52c5dc2b2b68 | 293 | } |
kenjiArai | 0:52c5dc2b2b68 | 294 | |
kenjiArai | 0:52c5dc2b2b68 | 295 | // 2 digits ASCII char to one byte hex |
kenjiArai | 0:52c5dc2b2b68 | 296 | unsigned char change_acii_hex( char*p ){ |
kenjiArai | 0:52c5dc2b2b68 | 297 | unsigned char c; |
kenjiArai | 0:52c5dc2b2b68 | 298 | |
kenjiArai | 0:52c5dc2b2b68 | 299 | c = hex(*p++); /* No concern ERR condition! */ |
kenjiArai | 0:52c5dc2b2b68 | 300 | c = (c * 10) + hex(*p++); |
kenjiArai | 0:52c5dc2b2b68 | 301 | return c; |
kenjiArai | 0:52c5dc2b2b68 | 302 | } |
kenjiArai | 0:52c5dc2b2b68 | 303 | |
kenjiArai | 0:52c5dc2b2b68 | 304 | // Skip number of comma |
kenjiArai | 0:52c5dc2b2b68 | 305 | char *num_of_comma( char *p, int8_t n ){ |
kenjiArai | 0:52c5dc2b2b68 | 306 | for (; n> 0; n--) { |
kenjiArai | 0:52c5dc2b2b68 | 307 | if ( (p = next_comma(p)) == (char*) -1 ) { |
kenjiArai | 0:52c5dc2b2b68 | 308 | return (char*)-1; |
kenjiArai | 0:52c5dc2b2b68 | 309 | } |
kenjiArai | 0:52c5dc2b2b68 | 310 | } |
kenjiArai | 0:52c5dc2b2b68 | 311 | return p; |
kenjiArai | 0:52c5dc2b2b68 | 312 | } |
kenjiArai | 0:52c5dc2b2b68 | 313 | |
kenjiArai | 0:52c5dc2b2b68 | 314 | // Get GPS status (1=Not fix, 2=2D, 3=3D) |
kenjiArai | 0:52c5dc2b2b68 | 315 | uint8_t check_gps_3d(void){ |
kenjiArai | 0:52c5dc2b2b68 | 316 | char *p; |
kenjiArai | 0:52c5dc2b2b68 | 317 | uint8_t x; |
kenjiArai | 0:52c5dc2b2b68 | 318 | uint8_t d; |
kenjiArai | 0:52c5dc2b2b68 | 319 | |
kenjiArai | 0:52c5dc2b2b68 | 320 | // pick-up time |
kenjiArai | 0:52c5dc2b2b68 | 321 | p = MsgBuf_GSA; |
kenjiArai | 0:52c5dc2b2b68 | 322 | p = num_of_comma(p,1); // skip ',' |
kenjiArai | 0:52c5dc2b2b68 | 323 | // reach to "Position Fix Indicator" |
kenjiArai | 0:52c5dc2b2b68 | 324 | if (*p == 'A') { |
kenjiArai | 0:52c5dc2b2b68 | 325 | ++p; //',' |
kenjiArai | 0:52c5dc2b2b68 | 326 | ++p; // 1 or 2 or 3 |
kenjiArai | 0:52c5dc2b2b68 | 327 | d = hex(*p++); |
kenjiArai | 0:52c5dc2b2b68 | 328 | if (d != ERR) { |
kenjiArai | 0:52c5dc2b2b68 | 329 | x = d; |
kenjiArai | 0:52c5dc2b2b68 | 330 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 331 | x = 1; |
kenjiArai | 0:52c5dc2b2b68 | 332 | } |
kenjiArai | 0:52c5dc2b2b68 | 333 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 334 | x = 1; |
kenjiArai | 0:52c5dc2b2b68 | 335 | } |
kenjiArai | 0:52c5dc2b2b68 | 336 | return x; |
kenjiArai | 0:52c5dc2b2b68 | 337 | } |
kenjiArai | 0:52c5dc2b2b68 | 338 | |
kenjiArai | 0:52c5dc2b2b68 | 339 | // Get GPS status and number of satelites |
kenjiArai | 0:52c5dc2b2b68 | 340 | uint8_t check_gps_ready(void){ |
kenjiArai | 0:52c5dc2b2b68 | 341 | char *p; |
kenjiArai | 0:52c5dc2b2b68 | 342 | uint8_t x; |
kenjiArai | 0:52c5dc2b2b68 | 343 | uint8_t d; |
kenjiArai | 0:52c5dc2b2b68 | 344 | |
kenjiArai | 0:52c5dc2b2b68 | 345 | // pick-up time |
kenjiArai | 0:52c5dc2b2b68 | 346 | p = MsgBuf_GGA; |
kenjiArai | 0:52c5dc2b2b68 | 347 | p = num_of_comma(p,6); // skip ',' |
kenjiArai | 0:52c5dc2b2b68 | 348 | // reach to "Position Fix Indicator" |
kenjiArai | 0:52c5dc2b2b68 | 349 | if (*p == '1' || *p == '2') { |
kenjiArai | 0:52c5dc2b2b68 | 350 | ++p; //',' |
kenjiArai | 0:52c5dc2b2b68 | 351 | ++p; // Number |
kenjiArai | 0:52c5dc2b2b68 | 352 | d = hex(*p++); |
kenjiArai | 0:52c5dc2b2b68 | 353 | if (d != ERR) { |
kenjiArai | 0:52c5dc2b2b68 | 354 | x = d * 10; |
kenjiArai | 0:52c5dc2b2b68 | 355 | x += (uint32_t)hex(*p++); |
kenjiArai | 0:52c5dc2b2b68 | 356 | if (*p != ',') { |
kenjiArai | 0:52c5dc2b2b68 | 357 | x = 0; |
kenjiArai | 0:52c5dc2b2b68 | 358 | } |
kenjiArai | 0:52c5dc2b2b68 | 359 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 360 | x = 0; |
kenjiArai | 0:52c5dc2b2b68 | 361 | } |
kenjiArai | 0:52c5dc2b2b68 | 362 | } else { |
kenjiArai | 0:52c5dc2b2b68 | 363 | x = 0; |
kenjiArai | 0:52c5dc2b2b68 | 364 | } |
kenjiArai | 0:52c5dc2b2b68 | 365 | return x; |
kenjiArai | 0:52c5dc2b2b68 | 366 | } |
kenjiArai | 0:52c5dc2b2b68 | 367 | |
kenjiArai | 0:52c5dc2b2b68 | 368 | // Get time(UTC) from GPS data |
kenjiArai | 0:52c5dc2b2b68 | 369 | void get_time_and_date(struct tm *pt){ |
kenjiArai | 0:52c5dc2b2b68 | 370 | char *p; |
kenjiArai | 0:52c5dc2b2b68 | 371 | |
kenjiArai | 0:52c5dc2b2b68 | 372 | p = MsgBuf_RMC; |
kenjiArai | 0:52c5dc2b2b68 | 373 | p = num_of_comma(p,1); /* skip one ',' */ |
kenjiArai | 0:52c5dc2b2b68 | 374 | pt->tm_hour = change_acii_hex(p); |
kenjiArai | 0:52c5dc2b2b68 | 375 | p += 2; |
kenjiArai | 0:52c5dc2b2b68 | 376 | pt->tm_min = change_acii_hex(p); |
kenjiArai | 0:52c5dc2b2b68 | 377 | p += 2; |
kenjiArai | 0:52c5dc2b2b68 | 378 | pt->tm_sec = change_acii_hex(p); |
kenjiArai | 0:52c5dc2b2b68 | 379 | p = MsgBuf_RMC; |
kenjiArai | 0:52c5dc2b2b68 | 380 | p = num_of_comma(p,9); /* skip one ',' */ |
kenjiArai | 0:52c5dc2b2b68 | 381 | pt->tm_mday = change_acii_hex(p); |
kenjiArai | 0:52c5dc2b2b68 | 382 | p += 2; |
kenjiArai | 0:52c5dc2b2b68 | 383 | pt->tm_mon = change_acii_hex(p) - 1; |
kenjiArai | 0:52c5dc2b2b68 | 384 | p += 2; |
kenjiArai | 0:52c5dc2b2b68 | 385 | pt->tm_year = change_acii_hex(p) + 100; |
kenjiArai | 0:52c5dc2b2b68 | 386 | } |