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
/media/uploads/kenjiArai/f746_fc_1.jpg

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?

UserRevisionLine numberNew 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