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