2 * @copyright Copyright (c) 2017-2020 TOYOTA MOTOR CORPORATION.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * @file MDev_Gps_Nmea.cpp
20 /*---------------------------------------------------------------------------*/
23 #include "MDev_Gps_Nmea.h"
24 #include "positioning_common.h"
25 #include "MDev_Gps_API.h"
26 #include "MDev_Gps_Main.h"
27 #include "MDev_GpsRecv.h"
28 #include "MDev_Gps_Common.h"
29 #include "MDev_GpsRollOver.h"
31 /*---------------------------------------------------------------------------*/
33 #define ROLOVR_GPSWEEKCOR_NG 0xFF /* WEEK COMP. CORRECT CORRECTOR INVALUE */
34 #define TMT_TGET_INI_INTERVAL (100) /* GPS time compensation interval immediately after startup (value with 10[msec] as 1) */
35 #define TMT_DISCONTINUITY_TIME_TOUT_SEQ (0x5051) /* Sequence number of GPS time acquisition timeout based on date/time discontinuity */
37 /*---------------------------------------------------------------------------*/
40 static TG_GPS_RCVDATA g_st_gpscycle_data;
41 u_int8 g_gps_week_cor_cnt = ROLOVR_GPSWEEKCOR_NG;
43 extern uint8_t g_gpstime_raw_tdsts;
45 const TG_GPS_CMD_ANA_TBL kGpsCmdAnaTblUblox[MDEV_GPSCMDANATBLNMEA_MAX] = {
46 /* Sentences Maximum length Receiving type Presence of notification Receive Format */
48 {{GPS_CMD_NMEA_RMC}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_RMC }, /* RMC information */
49 {{GPS_CMD_NMEA_VTG}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_VTG }, /* VTG information */
50 {{GPS_CMD_NMEA_GGA}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GGA }, /* GGA information */
51 {{GPS_CMD_NMEA_GSA}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GSA }, /* GSA information */
52 {{GPS_CMD_NMEA_GSV_1}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GSV1 }, /* GSV information1 */
53 {{GPS_CMD_NMEA_GSV_2}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GSV2 }, /* GSV information2 */
54 {{GPS_CMD_NMEA_GSV_3}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GSV3 }, /* GSV information3 */
55 {{GPS_CMD_NMEA_GSV_4}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GSV4 }, /* GSV information4 */
56 {{GPS_CMD_NMEA_GSV_5}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GSV5 }, /* GSV information5 */
57 {{GPS_CMD_NMEA_GLL}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GLL }, /* GLL information */
58 {{GPS_CMD_NMEA_GST}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_GST }, /* GST information */
60 {{0xB5, 0x62, 0x0A, 0x04}, GPS_NMEA_MAX_SZ, RCV_RESP, TRUE, GPS_FORMAT_MON_VER }, /* MON-VER */
61 {{0xB5, 0x62, 0x0B, 0x01}, GPS_NMEA_MAX_SZ, RCV_RESP, TRUE, GPS_FORMAT_AID_INI }, /* AID-INI */
62 {{0xB5, 0x62, 0x05 }, GPS_NMEA_MAX_SZ, RCV_RESP, TRUE, GPS_FORMAT_ACK_ACKNACK }, /* ACK-ACKNACK */
63 {{0xB5, 0x62, 0x01, 0x21}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_NAV_TIMEUTC }, /* NAV-TIMEUTC */
64 {{0xB5, 0x62, 0x01, 0x22}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_NAV_CLOCK }, /* NAV-CLOCK */
65 {{0xB5, 0x62, 0x02, 0x23}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_RXM_RTC5 }, /* RXM-RTC5 */
66 {{0xB5, 0x62, 0x01, 0x30}, GPS_NMEA_MAX_SZ, RCV_CYCLE, TRUE, GPS_FORMAT_NAV_SVINFO }, /* NAV-SVINFO */
67 {{0xB5, 0x62, 0x06, 0x23}, GPS_NMEA_MAX_SZ, RCV_RESP, TRUE, GPS_FORMAT_CFG_NAVX5 }, /* CFG-NAVX5 */
68 {{ENDMARK}, 0, 0, FALSE, GPS_FORMAT_MIN } /* Table termination */
71 /*---------------------------------------------------------------------------*/
75 * Time Calculation Process Considering Rollover
82 static BOOL DevCalcRollOverTime(TG_TIM_ROLOVR_YMD* base_ymd, TG_TIM_ROLOVR_YMD* conv_ymd) {
84 static u_int16 year_old = 0;
85 static u_int16 confirm_cnt = 0;
86 u_int8 gps_week_corr = g_gps_week_cor_cnt;
88 if (gps_week_corr == ROLOVR_GPSWEEKCOR_NG) {
92 if (year_old > base_ymd->year) {
94 if (confirm_cnt >= 10) {
96 year_old = base_ymd->year;
97 g_gps_week_cor_cnt = ROLOVR_GPSWEEKCOR_NG;
98 /* Starting the GPS time acquisition timer (1 second timer) based on date/time discontinuity */
99 _pb_ReqTimerStart(PNO_CLK_GPS, TMT_DISCONTINUITY_TIME_TOUT_SEQ, TIMER_TYPE_USN, TMT_TGET_INI_INTERVAL);
104 year_old = base_ymd->year;
107 /* Calculate time for rollover */
108 GPSRollOverConvTime(base_ymd, conv_ymd, gps_week_corr);
112 /******************************************************************************************************/
117 * NMEA data notification
119 void DevGpsSndCycleDataNmea(void) {
120 /* Notifying vehicle sensor of NMEA */
122 MDEV_GPS_NMEA st_nmea;
123 TG_GPS_NMEA_INFO st_gps_nmea_info;
124 RET_API l_ret = RET_NORMAL;
126 u_int8 uc_nmea_data[GPS_NMEA_MAX_SZ];
127 u_int32 ul_strlen = 0;
128 u_int16 us_offset = sizeof(TG_GPS_NMEA_INFO);
130 memset(&st_nmea, 0x00, sizeof(st_nmea) ); /* QAC 3200 */
131 memset(&st_gps_nmea_info, 0x00, sizeof(st_gps_nmea_info) ); /* QAC 3200 */
132 memset(uc_nmea_data, 0x00, sizeof(uc_nmea_data) ); /* QAC 3200 */
134 /* Get received NMEA data from storage area(GGA) */
135 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_GGA);
138 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GGA; /* Receive flag */
139 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
141 if (ul_strlen > GPS_NMEA_MAX_SZ) {
142 ul_strlen = GPS_NMEA_MAX_SZ;
145 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
146 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
147 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GGA].uc_size = (u_int8)ul_strlen;
148 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GGA].us_offset = us_offset;
149 us_offset += (u_int16)ul_strlen;
153 /* Get received NMEA data from storage area(GLL) */
154 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_GLL);
157 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GLL; /* Receive flag */
158 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
160 if (ul_strlen > GPS_NMEA_MAX_SZ) {
161 ul_strlen = GPS_NMEA_MAX_SZ;
164 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
165 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
166 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GLL].uc_size = (u_int8)ul_strlen;
167 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GLL].us_offset = us_offset;
168 us_offset += (u_int16)ul_strlen;
172 /* Get received NMEA data from storage area(GSA) */
173 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_GSA);
176 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GSA1; /* Receive flag */
177 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
178 if (ul_strlen > GPS_NMEA_MAX_SZ) {
179 ul_strlen = GPS_NMEA_MAX_SZ;
182 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
183 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
184 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSA1].uc_size = (u_int8)ul_strlen;
185 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSA1].us_offset = us_offset;
186 us_offset += (u_int16)ul_strlen;
190 /* Get received NMEA data from storage area(GST) */
191 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_GST);
194 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GST; /* Receive flag */
195 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
196 if (ul_strlen > GPS_NMEA_MAX_SZ) {
197 ul_strlen = GPS_NMEA_MAX_SZ;
200 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
201 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
202 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GST].uc_size = (u_int8)ul_strlen;
203 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GST].us_offset = us_offset;
204 us_offset += (u_int16)ul_strlen;
208 /* Get received NMEA data from storage area(RMC) */
209 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_RMC);
212 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_RMC; /* Receive flag */
213 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
214 if (ul_strlen > GPS_NMEA_MAX_SZ) {
215 ul_strlen = GPS_NMEA_MAX_SZ;
218 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
219 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
220 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_RMC].uc_size = (u_int8)ul_strlen;
221 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_RMC].us_offset = us_offset;
222 us_offset += (u_int16)ul_strlen;
226 /* Get received NMEA data from storage area(VTG) */
227 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_VTG);
230 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_VTG; /* Receive flag */
231 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
232 if (ul_strlen > GPS_NMEA_MAX_SZ) {
233 ul_strlen = GPS_NMEA_MAX_SZ;
236 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
237 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
238 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_VTG].uc_size = (u_int8)ul_strlen;
239 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_VTG].us_offset = us_offset;
240 us_offset += (u_int16)ul_strlen;
244 /* Get received NMEA data from storage area(GSV1) */
245 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_GSV1);
248 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GSV1; /* Receive flag */
249 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
250 if (ul_strlen > GPS_NMEA_MAX_SZ) {
251 ul_strlen = GPS_NMEA_MAX_SZ;
254 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
255 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
256 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV1].uc_size = (u_int8)ul_strlen;
257 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV1].us_offset = us_offset;
258 us_offset += (u_int16)ul_strlen;
262 /* Get received NMEA data from storage area(GSV2) */
263 b_get = DevGpsCycleDataGetNmea( uc_nmea_data, sizeof(uc_nmea_data), GPS_NMEA_INDEX_GSV2 );
266 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GSV2; /* Receive flag */
267 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
268 if (ul_strlen > GPS_NMEA_MAX_SZ) {
269 ul_strlen = GPS_NMEA_MAX_SZ;
272 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
273 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen); /* Data storage */
274 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV2].uc_size = (u_int8)ul_strlen;
275 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV2].us_offset = us_offset;
276 us_offset += (u_int16)ul_strlen;
280 /* Get received NMEA data from storage area(GSV3) */
281 b_get = DevGpsCycleDataGetNmea( uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_GSV3 );
284 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GSV3; /* Receive flag */
285 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
286 if (ul_strlen > GPS_NMEA_MAX_SZ) {
287 ul_strlen = GPS_NMEA_MAX_SZ;
290 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
291 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen);
292 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV3].uc_size = static_cast<u_int8>(ul_strlen);
293 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV3].us_offset = us_offset;
294 us_offset += (u_int16)ul_strlen;
298 /* Get received NMEA data from storage area(GSV4) */
299 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data), GPS_NMEA_INDEX_GSV4);
302 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GSV4; /* Receive flag */
303 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
304 if (ul_strlen > GPS_NMEA_MAX_SZ) {
305 ul_strlen = GPS_NMEA_MAX_SZ;
308 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
309 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen);
310 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV4].uc_size = static_cast<u_int8>(ul_strlen);
311 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV4].us_offset = us_offset;
312 us_offset += (u_int16)ul_strlen;
316 /* Get received NMEA data from storage area(GSV5) */
317 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data), GPS_NMEA_INDEX_GSV5);
320 st_gps_nmea_info.ul_rcvsts |= POS_SNS_GPS_NMEA_GSV5; /* Receive flag */
321 ul_strlen = strlen(reinterpret_cast<const char *>(uc_nmea_data)); /* QAC 310 */
322 if (ul_strlen > GPS_NMEA_MAX_SZ) {
323 ul_strlen = GPS_NMEA_MAX_SZ;
326 if ((us_offset + ul_strlen) < SENSOR_MSG_VSINFO_DSIZE) {
327 (void)memcpy(&(st_nmea.uc_nmea_data[us_offset]), uc_nmea_data, ul_strlen);
328 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV5].uc_size = static_cast<u_int8>(ul_strlen);
329 st_gps_nmea_info.st_nmea_sentence_info[POS_SNS_GPS_NMEA_SNO_GSV5].us_offset = us_offset;
330 us_offset += (u_int16)ul_strlen;
334 if (0 != st_gps_nmea_info.ul_rcvsts) {
336 (void)memcpy(&(st_nmea.uc_nmea_data[0]), &st_gps_nmea_info, sizeof(st_gps_nmea_info));
338 /* Provided to vehicle sensor */
339 l_ret = SendNmeaGps(&st_nmea);
341 if (RET_NORMAL != l_ret) {
342 POSITIONING_LOG("SendNmeaGps SndMsg Error\n");
345 /* Do not provide to vehicle sensor when data acquisition fails or no data */
353 * Analysis of the received command
355 void DevGpsRcvCyclCmd(void) {
357 TG_GPS_OUTPUT_FORMAT e_format = GPS_FORMAT_MIN;
359 TG_GPS_RCV_DATA st_rcv_data; /* Pointer to the received message */
360 (void)memcpy(&st_rcv_data, &(g_gps_msg_rcvr.msgdat[0]), sizeof(st_rcv_data) ); /* QAC 3200 */
362 /* Analysis of received commands */
363 i_ret = JudgeFormatGpsCommon(reinterpret_cast<u_char*>(&(st_rcv_data.bygps_data[0])),
364 static_cast<u_int32>(st_rcv_data.bydata_len),
367 if (i_ret == GPSRET_SNDCMD) {
368 /* For NMEA formats */
369 if ((e_format == GPS_FORMAT_RMC) ||
370 (e_format == GPS_FORMAT_VTG) ||
371 (e_format == GPS_FORMAT_GGA) ||
372 (e_format == GPS_FORMAT_GSA) ||
373 (e_format == GPS_FORMAT_GSV1) ||
374 (e_format == GPS_FORMAT_GSV2) ||
375 (e_format == GPS_FORMAT_GSV3) ||
376 (e_format == GPS_FORMAT_GSV4) ||
377 (e_format == GPS_FORMAT_GSV5) ||
378 (e_format == GPS_FORMAT_GLL) ||
379 (e_format == GPS_FORMAT_GST)) {
380 /* NMEA reception process */
381 RcvCyclCmdNmeaGpsCommon(&(st_rcv_data.bygps_data[0]), (u_int32)st_rcv_data.bydata_len, e_format);
382 } else if ((e_format == GPS_FORMAT_MON_VER) ||
383 (e_format == GPS_FORMAT_AID_INI) ||
384 (e_format == GPS_FORMAT_ACK_ACKNACK) ||
385 (e_format == GPS_FORMAT_NAV_TIMEUTC) ||
386 (e_format == GPS_FORMAT_NAV_CLOCK) ||
387 (e_format == GPS_FORMAT_RXM_RTC5) ||
388 (e_format == GPS_FORMAT_NAV_SVINFO)) {
389 /* UBX reception process */
390 RcvCyclCmdExtGpsCommon(&(st_rcv_data.bygps_data[0]), (u_int32)st_rcv_data.bydata_len, e_format);
392 POSITIONING_LOG("Forbidden ERROR!![e_format=%d]", (int)e_format);
394 } else if (i_ret == GPSRET_CMDERR) {
395 /* Receive command error */
397 /* Discard previously received data */
398 DevGpsCycleDataClear();
399 /* Initialize receive format */
400 g_rcv_format = GPS_FORMAT_MIN;
409 * Check of the received command
411 void DevGpsCmdEventCheckNmea(void) {
413 TG_GPS_RCV_DATA st_rcv_data;
414 u_char* pub_rcv_data = NULL;
415 BOOL brk_flg = FALSE;
417 memset(&st_rcv_data, 0, sizeof(TG_GPS_RCV_DATA));
418 memcpy( &st_rcv_data, &(g_gps_msg_rcvr.msgdat[0]), sizeof(TG_GPS_RCV_DATA) );
419 pub_rcv_data = reinterpret_cast<u_char*>(&(st_rcv_data.bygps_data[0]));
421 /* Analysis of received commands */
422 for (ul_cnt = 0; ul_cnt < (u_int32)GPSCMDANATBL_MAX; ul_cnt++) {
423 /* End-of-table decision */
424 if (CheckFrontStringPartGpsCommon(reinterpret_cast<const u_char*>(ENDMARK),
425 reinterpret_cast<const u_char*>(kGpsCmdAnaTbl[ul_cnt].c_sentence)) == RET_NORMAL ) {
428 /* Data error is set to Event ID. */
429 g_gps_mngr.event = (u_int32)NG;
432 } else if (CheckFrontStringPartGpsCommon(pub_rcv_data, kGpsCmdAnaTbl[ul_cnt].c_sentence) == RET_NORMAL) {
433 /* Reception type determination */
435 /* Using $GPRMC in responses to resets */
436 if ((g_gps_mngr.sts == GPS_STS_SENT) &&
437 (g_gps_mngr.resp_cmd == GPS_FORMAT_RMC) &&
438 (kGpsCmdAnaTbl[ul_cnt].e_rcv_format == GPS_FORMAT_RMC)) {
439 POSITIONING_LOG("Received response ($GPRMC) form GPS device.\n");
441 /** Response command */
442 g_gps_mngr.event = GPS_EVT_RECVRSPDAT;
444 /** Receive format setting */
445 g_gps_mngr.rcv_cmd = kGpsCmdAnaTbl[ul_cnt].e_rcv_format;
446 } else if (kGpsCmdAnaTbl[ul_cnt].ul_rcv_kind == RCV_CYCLE) {
447 /* Cyclic receive command */
448 g_gps_mngr.event = GPS_EVT_RECVCYCLDAT;
450 /* Receive format setting */
451 g_gps_mngr.rcv_cmd = kGpsCmdAnaTbl[ul_cnt].e_rcv_format;
452 } else if (kGpsCmdAnaTbl[ul_cnt].ul_rcv_kind == RCV_RESP) {
453 /** Response command */
454 g_gps_mngr.event = GPS_EVT_RECVRSPDAT;
456 /** Receive format setting */
457 g_gps_mngr.rcv_cmd = kGpsCmdAnaTbl[ul_cnt].e_rcv_format;
459 /* Undefined value */
460 /* Data error is set to Event ID. */
461 g_gps_mngr.event = (u_int32)NG;
467 if (brk_flg == TRUE) {
477 * Get GPS reception status
479 * By analyzing the last received GSA-sentence and using the satellite-number as the Satellite number
480 * Determines the reception status based on whether or not notification has been made, and returns it.
482 * @param[in] no_sv Satellite number
484 * @return NAVIINFO_DIAG_GPS_RCV_STS_NOTUSEFIX - Positioning not used
485 * NAVIIFNO_DIAG_GPS_RCV_STS_USEFIX - Positioning use
487 u_int8 DevGpsGetGpsRcvSts(u_int8 sv) {
488 u_int8 rcv_sts = NAVIINFO_DIAG_GPS_RCV_STS_TRACHING; /* Tracking in progress */
489 u_int8 uc_nmea_data[GPS_NMEA_MAX_SZ];
494 /* Get received NMEA data from storage area(GSA) */
495 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data), GPS_NMEA_INDEX_GSA);
498 for (i = 0; i < GPS_NMEA_NUM_GSA_SV; i++) {
499 /* Get satellite number */
500 uc_no = (uint8_t)GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSA_SV + (u_int8)(1 * i), uc_nmea_data);
503 rcv_sts = NAVIINFO_DIAG_GPS_RCV_STS_USEFIX; /* Positioning use */
514 * GPS information analysis
516 * Analyzing received NMEA sentences
517 * @param[out] navilocinfo Navigation information
519 void DevGpsAnalyzeNmea(NAVIINFO_ALL* navilocinfo) {
520 u_int8 uc_nmea_data[GPS_NMEA_MAX_SZ];
521 int32 no_sv = 0; /* number of Satellites in View */
523 char utc_time[12]; /* hhmmss.sss */
524 char _date[6]; /* ddmmyy */
525 char _status = 0; /* 'V' or 'A' */
526 char indicator; /* 'N' or 'S' or 'E' or 'W' */
527 char work[8]; /* Work buffer for converting String data */
529 uint8_t fixsts = NAVIINFO_DIAG_GPS_FIX_STS_NON;
531 BOOL bvalid_lon = FALSE;
532 BOOL bvalid_lat = FALSE;
534 TG_TIM_ROLOVR_YMD base_ymd;
535 TG_TIM_ROLOVR_YMD conv_ymd;
537 u_int8 _tdsts = g_gpstime_raw_tdsts;
539 GpsSatelliteInfo st_visible_satellite_list[GPS_MAX_NUM_VISIBLE_SATELLITES]; /* Visible satellite list */
540 GpsSatelliteInfo st_tmp_buf;
546 SENSORLOCATION_LONLATINFO_DAT st_lonlat;
547 SENSORLOCATION_ALTITUDEINFO_DAT st_altitude;
548 SENSORMOTION_HEADINGINFO_DAT st_heading;
549 // MDEV_GPS_RTC st_rtc;
550 SENSOR_MSG_GPSTIME st_gps_time;
551 SENSORMOTION_SPEEDINFO_DAT st_speed;
553 memset(&st_lonlat, 0x00, sizeof(SENSORLOCATION_LONLATINFO_DAT));
554 memset(&st_altitude, 0x00, sizeof(SENSORLOCATION_ALTITUDEINFO_DAT));
555 memset(&st_heading, 0x00, sizeof(SENSORMOTION_HEADINGINFO_DAT));
556 // memset(&st_rtc, 0x00, sizeof(MDEV_GPS_RTC));
557 memset(&st_gps_time, 0x00, sizeof(SENSOR_MSG_GPSTIME));
558 memset(&st_speed, 0x00, sizeof(SENSORMOTION_SPEEDINFO_DAT));
560 /* Satellite signal strength list initialization */
561 (void)memset(st_visible_satellite_list, 0x00, sizeof(GpsSatelliteInfo) * GPS_MAX_NUM_VISIBLE_SATELLITES);
563 /* Get received NMEA data from storage area(GSA) */
564 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data), GPS_NMEA_INDEX_GSA);
567 fixsts = static_cast<uint8_t>(GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSA_FS, uc_nmea_data));
570 /* Get received NMEA data from storage area(RMC) */
571 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data) , GPS_NMEA_INDEX_RMC);
574 navilocinfo->stDiagGps.stFix.stWgs84.lLat =
575 GetLonLatFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_LATITUDE, uc_nmea_data, &bvalid_lat); /* GPS location information and latitude */
577 GetStringFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_NS, uc_nmea_data, &indicator, sizeof(indicator));
579 if (indicator != GPS_NMEA_RMC_IND_NORTH) {
580 navilocinfo->stDiagGps.stFix.stWgs84.lLat *= -1;
583 POSITIONING_LOG("lLat = %d", navilocinfo->stDiagGps.stFix.stWgs84.lLat);
585 navilocinfo->stDiagGps.stFix.stWgs84.lLon =
586 GetLonLatFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_LONGITUDE, uc_nmea_data, &bvalid_lon); /* GPS position information and longitude */
588 GetStringFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_EW, uc_nmea_data, &indicator, sizeof(indicator));
590 if (indicator != GPS_NMEA_RMC_IND_EAST) {
591 navilocinfo->stDiagGps.stFix.stWgs84.lLon *= -1;
594 st_lonlat.Longitude = navilocinfo->stDiagGps.stFix.stWgs84.lLon;
595 st_lonlat.Latitude = navilocinfo->stDiagGps.stFix.stWgs84.lLat;
597 POSITIONING_LOG("lLon = %d", navilocinfo->stDiagGps.stFix.stWgs84.lLon);
599 /* Get Date information */
600 (void)GetStringFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_DATE, uc_nmea_data, _date, 6);
601 (void)memset(&base_ymd, 0, sizeof(base_ymd)); /* QAC 3200 */
602 (void)memset(&conv_ymd, 0, sizeof(conv_ymd)); /* QAC 3200 */
603 (void)memset(work, 0, sizeof(work)); /* QAC 3200 */
605 (void)strncpy(work, &_date[4], 2); /* QAC 3200 */
606 base_ymd.year = (u_int16)(2000 + atoi(work)); /* YEAR */
608 st_gps_time.utc.year = (uint8_t)atoi(work);
610 (void)strncpy(work, &_date[2], 2); /* QAC 3200 */
611 base_ymd.month = (u_int16)(atoi(work)); /* MONTH */
613 st_gps_time.utc.month = (uint8_t)atoi(work);
615 (void)strncpy(work, &_date[0], 2); /* QAC 3200 */
616 base_ymd.day = (u_int16)(atoi(work)); /* DAY */
618 st_gps_time.utc.date = (uint8_t)atoi(work);
620 POSITIONING_LOG("year = %d", base_ymd.year);
621 POSITIONING_LOG("month = %d", base_ymd.month);
622 POSITIONING_LOG("date = %d", base_ymd.day);
624 /* UTC time information acquisition */
625 (void)GetStringFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_UTC, uc_nmea_data, utc_time, 12);
627 (void)strncpy(work, &utc_time[0], 2); /* QAC 3200 */
628 navilocinfo->stNaviGps.utc.hour = (uint8_t)atoi(work); /* HOUR */
630 st_gps_time.utc.hour = navilocinfo->stNaviGps.utc.hour;
631 POSITIONING_LOG("hour = %d", navilocinfo->stNaviGps.utc.hour);
633 (void)strncpy(work, &utc_time[2], 2); /* QAC 3200 */
634 navilocinfo->stNaviGps.utc.minute = (uint8_t)atoi(work); /* MINUTE */
636 st_gps_time.utc.minute = navilocinfo->stNaviGps.utc.minute;
637 POSITIONING_LOG("minute = %d", navilocinfo->stNaviGps.utc.minute);
639 (void)strncpy(work, &utc_time[4], 2); /* QAC 3200 */
640 navilocinfo->stNaviGps.utc.second = (uint8_t)atoi(work); /* SECOND */
642 st_gps_time.utc.second = navilocinfo->stNaviGps.utc.second;
643 POSITIONING_LOG("second = %d", navilocinfo->stNaviGps.utc.second);
645 /* Compass information acquisition */
646 navilocinfo->stNaviGps.heading =
647 GetHeadingFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_COG, uc_nmea_data, &bvalid);
649 st_heading.Heading = navilocinfo->stNaviGps.heading;
650 POSITIONING_LOG("heading = %u", navilocinfo->stNaviGps.heading);
652 st_speed.Speed = GetSpeedFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_SPEED, uc_nmea_data, &bvalid);
654 /* Fix Status/Time Status Calculation */
655 (void)GetStringFromNmeaGpsCommon(GPS_NMEA_FNO_RMC_STATUS, uc_nmea_data, &_status, sizeof(_status));
657 if ((_status == GPS_NMEA_RMC_STS_VALID) && (bvalid_lat == TRUE) && (bvalid_lon == TRUE)) {
658 /* Fix status information */
660 case GPS_NMEA_GSA_FIX_STS_NON:
661 navilocinfo->stDiagGps.stFix.ucFixSts = NAVIINFO_DIAG_GPS_FIX_STS_NON;
663 case GPS_NMEA_GSA_FIX_STS_2D:
664 navilocinfo->stDiagGps.stFix.ucFixSts = NAVIINFO_DIAG_GPS_FIX_STS_2D;
666 case GPS_NMEA_GSA_FIX_STS_3D:
667 navilocinfo->stDiagGps.stFix.ucFixSts = NAVIINFO_DIAG_GPS_FIX_STS_3D;
670 POSITIONING_LOG("GSA Nav Mode Error [fixsts:%d]", fixsts);
674 if (_tdsts == POS_TIMESTS_OK) {
675 roll_over_sts = DevCalcRollOverTime(&base_ymd, &conv_ymd);
676 navilocinfo->stNaviGps.utc.year = conv_ymd.year; /* year (after conversion) */
677 navilocinfo->stNaviGps.utc.month = (u_int8)(conv_ymd.month); /* month (after conversion) */
678 navilocinfo->stNaviGps.utc.date = (u_int8)(conv_ymd.day); /* dat (after conversion) */
679 if (roll_over_sts == FALSE) {
680 navilocinfo->stNaviGps.tdsts = POS_TIMESTS_NG;
681 /* Reserve[0] is time setting information: anomaly time, but can be calculated by rolling over. */
682 navilocinfo->stNaviGps.reserve[0] = GPS_TIME_ROLOVR;
684 /* When the location information is normal, the time information is also judged to be normal. */
685 navilocinfo->stNaviGps.tdsts = POS_TIMESTS_OK; /* Time calibration completed */
686 /* Reserve[0] is time setting information: Use time status received from GPS device. */
687 navilocinfo->stNaviGps.reserve[0] = GPS_TIME_RX;
690 navilocinfo->stNaviGps.tdsts = POS_TIMESTS_NG; /* Time uncalibrated */
691 /* Reserve[0] is time setting information: Use time status received from GPS device. */
692 navilocinfo->stNaviGps.reserve[0] = GPS_TIME_RX;
693 navilocinfo->stNaviGps.utc.year = base_ymd.year; /* year(after conversion) */
694 navilocinfo->stNaviGps.utc.month = (u_int8)(base_ymd.month); /* month (after conversion) */
695 navilocinfo->stNaviGps.utc.date = (u_int8)(base_ymd.day); /* day (after conversion) */
698 if (bvalid != TRUE) {
699 /* Invalid value if measurement orientation is invalid. */
700 navilocinfo->stNaviGps.heading = GPS_HEADING_INVALID_VAL;
701 // POSITIONING_LOG("RMC Heading[cog] Invalid");
704 /* Fix status information: Non-position fix is set regardless of FS of GSA. */
705 navilocinfo->stDiagGps.stFix.ucFixSts = NAVIINFO_DIAG_GPS_FIX_STS_NON;
706 /* If the location information is invalid, the time information is also judged to be invalid. */
707 /* Time not calibrated after receiver reset (time entry or master reset or CSF activation) */
708 navilocinfo->stNaviGps.tdsts = POS_TIMESTS_NG;
709 /* Reserve[0] is time setting information: Use time status received from GPS device. */
710 navilocinfo->stNaviGps.reserve[0] = GPS_TIME_RX;
711 navilocinfo->stNaviGps.utc.year = base_ymd.year; /* year (after conversion) */
712 navilocinfo->stNaviGps.utc.month = (u_int8)(base_ymd.month); /* month (after conversion) */
713 navilocinfo->stNaviGps.utc.date = (u_int8)(base_ymd.day); /* day (after conversion) */
714 // POSITIONING_LOG("RMC Invalid[status:%d, bvalidLat:%d, bvalidLon:%d]", _status, bvalid_lat, bvalid_lon);
717 // POSITIONING_LOG("year(Fix) = %d", navilocinfo->stNaviGps.utc.year);
718 // POSITIONING_LOG("month(Fix) = %d", navilocinfo->stNaviGps.utc.month);
719 // POSITIONING_LOG("date(Fix) = %d", navilocinfo->stNaviGps.utc.date);
720 // POSITIONING_LOG("tdsts = %d", navilocinfo->stNaviGps.tdsts);
723 /* Get received NMEA data from storage area(GGA) */
724 b_get = DevGpsCycleDataGetNmea(uc_nmea_data, sizeof(uc_nmea_data), GPS_NMEA_INDEX_GGA);
727 /* Data status acquisition */
728 fixsts_gga = (uint8_t)GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GGA_FS, uc_nmea_data);
730 /* Altitude information acquisition */
731 if (((fixsts == GPS_NMEA_GSA_FIX_STS_2D) ||
732 (fixsts == GPS_NMEA_GSA_FIX_STS_3D)) &&
733 ((fixsts_gga == GPS_NMEA_GGA_FIX_STATUS_GPS) ||
734 (fixsts_gga == GPS_NMEA_GGA_FIX_STATUS_DGPS) ||
735 (fixsts_gga == GPS_NMEA_GGA_FIX_STATUS_DR))) {
736 navilocinfo->stNaviGps.altitude =
737 GetAltitudeFromNmeaGpsCommon(GPS_NMEA_FNO_GGA_MSL, uc_nmea_data, &bvalid);
739 if (bvalid != TRUE) {
740 /* If the location information is invalid, set an invalid value. */
741 navilocinfo->stNaviGps.altitude = GPS_ALTITUDE_INVALID_VAL;
742 // POSITIONING_LOG("GGA Altitude[msl] Invalid");
745 /* If the location information is invalid, set an invalid value. */
746 navilocinfo->stNaviGps.altitude = GPS_ALTITUDE_INVALID_VAL;
747 // POSITIONING_LOG("GGA Invalid[fixsts:%d, fixstsGGA:%d]", fixsts, fixsts_gga);
750 st_altitude.Altitude = navilocinfo->stNaviGps.altitude;
751 // POSITIONING_LOG("altitude = %d", navilocinfo->stNaviGps.altitude);
754 DevGpsCnvLonLatNavi(&st_lonlat, navilocinfo->stDiagGps.stFix.ucFixSts, navilocinfo->stDiagGps.stFix.stWgs84.lLon,
755 navilocinfo->stDiagGps.stFix.stWgs84.lLat);
757 DevGpsCnvAltitudeNavi(&st_altitude, navilocinfo->stDiagGps.stFix.ucFixSts, navilocinfo->stNaviGps.altitude);
759 DevGpsCnvHeadingNavi(&st_heading, navilocinfo->stDiagGps.stFix.ucFixSts, navilocinfo->stNaviGps.heading);
761 SendCustomGps(&st_gps_time, &st_lonlat, &st_altitude, &st_heading, &navilocinfo->stDiagGps);
762 // For test todo don't needed
763 // SendTimeGps(&st_rtc);
764 // SendSpeedGps(&st_speed, 0);
766 /* Create visual satellite information list from GSV1~GSV5 and GSV */
767 for (i = 0; i < 5; i++) {
768 /* Get received NMEA data from storage area */
769 b_get = DevGpsCycleDataGetNmea( uc_nmea_data, sizeof(uc_nmea_data),
770 (ENUM_GPS_NMEA_INDEX)(GPS_NMEA_INDEX_GSV1 + i));
773 /* Get number of Satellites in View */
774 no_sv = GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSV_NOSV, uc_nmea_data);
776 for (j = 0; j < GPS_NMEA_NUM_GSV_SINFO; j++) {
777 if (__offset >= no_sv) {
781 st_visible_satellite_list[__offset].sv = static_cast<uint8_t>(
782 GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSV_SV + (u_int8)(4 * j), uc_nmea_data)); /* Satellite information_No */
783 st_visible_satellite_list[__offset].elv = static_cast<uint8_t>(
784 GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSV_ELV + (u_int8)(4 * j), uc_nmea_data)); /* Satellite information_elevation */
785 st_visible_satellite_list[__offset].az = static_cast<uint16_t>(
786 GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSV_AZ + (u_int8)(4 * j), uc_nmea_data)); /* Satellite Information_Azimuth */
787 st_visible_satellite_list[__offset].cno = static_cast<uint8_t>(
788 GetIntegerFromNmeaGpsCommon(GPS_NMEA_FNO_GSV_CNO + (u_int8)(4 * j), uc_nmea_data)); /* Satellite information_level */
789 st_visible_satellite_list[__offset].sts = DevGpsGetGpsRcvSts(st_visible_satellite_list[__offset].sv);
791 /* Sort in ascending order of status (priority to use fix) and received signal strength */
792 for (k = __offset; k > 0; k--) {
793 if (((st_visible_satellite_list[k].sts == NAVIINFO_DIAG_GPS_RCV_STS_USEFIX) &&
794 (st_visible_satellite_list[k - 1].sts == NAVIINFO_DIAG_GPS_RCV_STS_TRACHING)) ||
795 ((st_visible_satellite_list[k - 1].sts == st_visible_satellite_list[k].sts) &&
796 (st_visible_satellite_list[k].cno > st_visible_satellite_list[k - 1].cno))) {
797 (void)memcpy(&st_tmp_buf, &st_visible_satellite_list[k], sizeof(GpsSatelliteInfo));
798 (void)memcpy(&st_visible_satellite_list[k], &st_visible_satellite_list[k - 1], sizeof(GpsSatelliteInfo));
799 (void)memcpy(&st_visible_satellite_list[k - 1], &st_tmp_buf, sizeof(GpsSatelliteInfo));
813 /****************************************************************************
814 @brief DevGpsCycleDataClear<BR>
815 Cyclic data storage area clear processing
816 @outline Clear the cyclic data storage area
821 *******************************************************************************/
822 void DevGpsCycleDataClear(void) {
825 /* Sensor counter, reception flag initialization */
826 g_st_gpscycle_data.uc_sns_cnt = 0;
828 for (i = 0; i < GPS_NMEA_INDEX_MAX; i++) {
829 g_st_gpscycle_data.st_nmea_data.uc_rcv_flag[i] = GPS_CYCLECMD_NOTRCV;
832 g_st_gpscycle_data.st_binary_data.uc_rcv_flag = GPS_CYCLECMD_NOTRCV;
833 g_st_gpscycle_data.st_fullbin_data.uc_rcv_flag = GPS_CYCLECMD_NOTRCV;
836 /******************************************************************************
837 @brief DEV_Gps_CycleData_SetNmea<BR>
838 NMEA data setting process
839 @outline Set NMEA data in cyclic data storage area
840 @param[in] u_int8* : p_data ... NMEA data to be set
841 @param[in] u_int32 : ul_length ... Data length
842 @param[in] ENUM_GPS_NMEA_INDEX: e_format ... Sentence identification
846 *******************************************************************************/
847 void DevGpsCycleDataSetNmea(const u_int8* p_data, u_int32 ul_length, ENUM_GPS_NMEA_INDEX e_format) {
848 u_int32 ul_copy_sz = 0;
850 /** Anomaly detection */
851 if (e_format >= GPS_NMEA_INDEX_MAX) {
852 POSITIONING_LOG("# GpsCommCtl_API # Set NMEA Sentence ERROR ! \r\n");
854 /** Storage size determination */
855 if (GPS_NMEA_MAX_SZ < ul_length) {
856 ul_copy_sz = GPS_NMEA_MAX_SZ;
857 POSITIONING_LOG("# GpsCommCtl_API # Set NMEA Cmd Size ERROR ! \r\n");
859 ul_copy_sz = ul_length;
863 g_st_gpscycle_data.st_nmea_data.uc_rcv_flag[e_format] = GPS_CYCLECMD_RCV;
864 memset(&(g_st_gpscycle_data.st_nmea_data.st_nmea[e_format].uc_data[0]), 0x00, GPS_NMEA_MAX_SZ);
865 memcpy(&(g_st_gpscycle_data.st_nmea_data.st_nmea[e_format].uc_data[0]), p_data, ul_copy_sz);
871 /******************************************************************************
872 @brief DevGpsCycleDataGetNmea<BR>
873 NMEA data setting process
874 @outline Set NMEA data in cyclic data storage area
875 @param[in] u_int32 : ul_buf_size ... Storage destination buffer size
876 @param[in] ENUM_GPS_NMEA_INDEX: e_format ... Sentence identification
877 @param[out] u_int8* : p_data ... Storage destination buffer pointer
879 @retval TRUE : Data present
880 @retval FALSE : No data
881 *******************************************************************************/
882 BOOL DevGpsCycleDataGetNmea(u_int8 *p_data, u_int32 ul_buf_size, ENUM_GPS_NMEA_INDEX e_format) {
885 /** Determining whether data exists in the cyclic data area */
886 if (GPS_CYCLECMD_RCV == g_st_gpscycle_data.st_nmea_data.uc_rcv_flag[e_format]) {
887 if (GPS_NMEA_MAX_SZ <= ul_buf_size) {
888 /** Copy to storage destination buffer */
889 memcpy(p_data, &(g_st_gpscycle_data.st_nmea_data.st_nmea[e_format].uc_data[0]), GPS_NMEA_MAX_SZ);
891 /** Storage destination buffer size is small */
904 * Setting of the check sum
906 * @param[in] buffer Pointer of data
907 * @param[in] length length of data
909 void DevGpsSetChkSum(u_int8* buffer, u_int32 length) {
914 if (buffer != NULL) {
915 for (i = 2; i < (length - 2); i++) {
916 ck_a = ck_a + buffer[i];
921 buffer[length - 2] = ck_a;
922 buffer[length - 1] = ck_b;
927 /*---------------------------------------------------------------------------*/