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/

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?

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