blob: 85322e39c10d9a700d42170ce18036b3679df446 [file] [log] [blame]
b.liud440f9f2025-04-18 10:44:31 +08001/*-----------------------------------------------------------------------------------------------*/
2/**
3 @file ql_gnss.c
4 @brief SIM service API
5*/
6/*-----------------------------------------------------------------------------------------------*/
7
8/*-------------------------------------------------------------------------------------------------
9 Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
10 mobiletek Wireless Solution Proprietary and Confidential.
11-------------------------------------------------------------------------------------------------*/
12
13/*-------------------------------------------------------------------------------------------------
14 EDIT HISTORY
15 This section contains comments describing changes made to the file.
16 Notice that changes are listed in reverse chronological order.
17 $Header: $
18 when who what, where, why
19 -------- --------- -----------------------------------------------------------------
20 20241022 yq.wang Created .
21-------------------------------------------------------------------------------------------------*/
22#include <stdint.h>
23#include <stdio.h>
24#include <stdlib.h>
25#include <unistd.h>
26#include <time.h>
27
28#include "ql_type.h"
29#include "ql_gnss.h"
30#include "mbtk_type.h"
31#include "mbtk_gnss.h"
32#include "mbtk_log.h"
33
34/*----------------------------------------------DEFINE-------------------------------------------*/
35#define QL_GNSS_LOGE LOGE
36#define QL_GNSS_LOGD LOGD
37
38#define QL_GNSS_TIMEOUT 5
39#define QL_GNSS_NMEA_SIZE_MAX 128
40#define QL_GNSS_AGPS_URL_SIZE_MAX 128
41
42#define QL_AGNSS_DOWNLOAD_TIMEPUT 60
43#define QL_AGNSS_INJECT_TIMEOUT 20
44
45#define QL_AGNSS_URL_PATH "http://uagnss.allystar.com:80/ephemeris/"
46
47#define QL_AGNSS_EPH_GPS "HD_GPS.hdb"
48#define QL_AGNSS_EPH_BDS "HD_BDS.hdb"
49#define QL_AGNSS_EPH_GLO "HD_GLO.hdb"
50#define QL_AGNSS_EPH_GAL "HD_GAL.hdb"
51#define QL_AGNSS_EPH_QZS "HD_QZS.hdb"
52#define QL_AGNSS_EPH_GPS_BDS "HD_GPS_BDS.hdb"
53#define QL_AGNSS_EPH_GPS_GLO "HD_GPS_GLO.hdb"
54#define QL_AGNSS_EPH_GPS_GAL "HD_GPS_GAL.hdb"
55#define QL_AGNSS_EPH_GPS_QZSS "HD_GPS_QZSS.hdb"
56
57/*----------------------------------------------DEFINE-------------------------------------------*/
58
59/*----------------------------------------------ENUM---------------------------------------------*/
60typedef enum {
61 QL_GNSS_INIT_STOP = 0,
62 QL_GNSS_INIT_START,
63}ql_gnss_init_enum;
64
65/*----------------------------------------------ENUM---------------------------------------------*/
66
67/*----------------------------------------------STRUCT-------------------------------------------*/
68typedef struct {
69 ql_gnss_init_enum status;
70 ql_gnss_ind_cb_f ind_cb;
71 ql_gnss_error_cb_f server_cb;
72 time_t timestamp;
73}ql_gnss_info_handle_t;
74
75/*----------------------------------------------STRUCT-------------------------------------------*/
76
77/*----------------------------------------------GLOBAL VARIABLE----------------------------------*/
78extern long timezone;
79
80/*----------------------------------------------GLOBAL VARIABLE----------------------------------*/
81
82/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
83static ql_gnss_info_handle_t* gnss_handle = NULL;
84
85/*----------------------------------------------GLOBAL STATIC VARIABLE---------------------------*/
86
87/*----------------------------------------------GNSS FUNCTION-------------------------------------*/
88static time_t ql_get_timestamp(char *time)
89{
90 char tmp_char[4] = {0};
91 struct tm tmp_time;
92
93 memset(&tmp_time, 0, sizeof(struct tm));
94 memset(tmp_char, 0, sizeof(tmp_char));
95 memcpy(tmp_char, &time[4], 2);
96 tmp_time.tm_sec = atoi(tmp_char);
97
98 memcpy(tmp_char, &time[2], 2);
99 tmp_time.tm_min = atoi(tmp_char);
100
101 memcpy(tmp_char, &time[0], 2);
102 tmp_time.tm_hour = atoi(tmp_char);
103
104 memcpy(tmp_char, &time[6], 2);
105 tmp_time.tm_mday = atoi(tmp_char);
106
107 memcpy(tmp_char, &time[8], 2);
108 tmp_time.tm_mon = atoi(tmp_char) - 1;
109
110 memcpy(tmp_char, &time[10], 2);
111 tmp_time.tm_year = 100 + atoi(tmp_char);
112
113 time_t _t = mktime(&tmp_time);
114 tzset();
115 _t = _t - timezone;
116
117 return _t;
118}
119
120static time_t ql_get_gnss_time_sec(char *data, int data_len)
121{
122// int i = 0, num = 0;
123 char* previous_p = data;
124 char* current_p = NULL;
125 int current_get_num = 0;
126 char time[15] = {0};
127
128 //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
129
130 do
131 {
132 current_p = strchr(previous_p, ',');
133 if(current_p != NULL)
134 {
135 current_get_num++;
136 if(current_get_num == 2)
137 {
138 if(previous_p != current_p)
139 {
140 memcpy(time, previous_p, 6);
141 //QL_GNSS_LOGE("[%s] time:%s.", __func__, time);
142 }
143 else
144 {
145 gnss_handle->timestamp = 0;
146 return 0;
147 }
148 }
149
150 if(current_get_num == 10)
151 {
152 if(previous_p != current_p)
153 {
154 memcpy(time + 6, previous_p, 6);
155 //QL_GNSS_LOGE("[%s] date + time:%s.", __func__, time);
156 break;
157 }
158 else
159 {
160 gnss_handle->timestamp = 0;
161 return 0;
162 }
163 }
164
165 if(current_p + 1 <= data + data_len)
166 {
167 previous_p = current_p + 1;
168 }
169 else
170 {
171 QL_GNSS_LOGE("[%s] data out of range.", __func__);
172 gnss_handle->timestamp = 0;
173 return 0;
174 }
175 }
176 }while(current_p != NULL);
177
178 gnss_handle->timestamp = ql_get_timestamp(time);
179
180 return gnss_handle->timestamp;
181}
182
183static void ql_gnss_callback(uint32 ind_type, const void* data, uint32 data_len)
184{
185 if(data == NULL || data_len <= 0)
186 {
187 QL_GNSS_LOGE("[%s] data is NULL.", __func__);
188 return;
189 }
190
191 if(gnss_handle->ind_cb != NULL)
192 {
193 if(ind_type == MBTK_GNSS_IND_NMEA)
194 {
195 nmea_srv_ind_msg nmea_msg = {0};
196 memset(&nmea_msg, 0x0, sizeof(nmea_srv_ind_msg));
197 nmea_msg.msg_id = QL_GNSS_NMEA_MSG;
198 if(data_len <= QL_GNSS_NMEA_SIZE_MAX)
199 {
200 memcpy(nmea_msg.nmea_sentence, (const char *)data, data_len);
201 }
202 else
203 {
204 QL_GNSS_LOGE("[%s] data too long. %s", __func__, (char*)data);
205 return;
206 }
207
208 if(NULL != strstr((char*)data, "RMC"))
209 {
210 nmea_msg.time = ql_get_gnss_time_sec(nmea_msg.nmea_sentence, data_len);
211 }
212 else
213 {
214 nmea_msg.time = gnss_handle->timestamp;
215 }
216
217 gnss_handle->ind_cb((void*)&nmea_msg);
218 }
219 else
220 {
221 QL_GNSS_LOGE("[%s] Unknown IND : %d.", __func__, ind_type);
222 }
223 }
224
225}
226
227/*----------------------------------------------GNSS FUNCTION-------------------------------------*/
228
229/*-----------------------------------------------------------------------------------------------*/
230/**
231 @brief Initialize the gnss client
232 @return
233 QL_ERR_OK - successful
234 QL_ERR_INVALID_ARG - as defined
235 QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
236 Other - error code defined by ql_type.h
237 */
238/*-----------------------------------------------------------------------------------------------*/
239int ql_gnss_init(void)
240{
241 if(NULL == gnss_handle)
242 {
243 gnss_handle = (ql_gnss_info_handle_t*)malloc(sizeof(ql_gnss_info_handle_t));
244 if(NULL == gnss_handle)
245 {
246 QL_GNSS_LOGE("[%s] gnss handle malloc fail.", __func__);
247 return QL_ERR_FAILED;
248 }
249
250 gnss_err_enum ret = mbtk_gnss_init(ql_gnss_callback);
251 if(ret == GNSS_ERR_OK)
252 {
253 gnss_handle->status = QL_GNSS_INIT_STOP;
254 ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_NMEA, QL_GNSS_TIMEOUT);
255 if(ret != GNSS_ERR_OK)
256 {
257 QL_GNSS_LOGE("[%s] gnss ind set fail.[%d]", __func__, ret);
258 goto error_2;
259 }
260 }
261 else
262 {
263 QL_GNSS_LOGE("[%s] gnss init fail.[%d]", __func__, ret);
264 goto error_1;
265 }
266
267 gnss_handle->ind_cb = NULL;
268 gnss_handle->server_cb = NULL;
269 gnss_handle->timestamp = 0;
270 }
271
272 return QL_ERR_OK;
273error_2:
274 if(gnss_handle->status == QL_GNSS_INIT_START)
275 {
276 mbtk_gnss_deinit();
277 gnss_handle->status = QL_GNSS_INIT_STOP;
278 }
279error_1:
280 if(gnss_handle)
281 {
282 free(gnss_handle);
283 gnss_handle = NULL;
284 }
285 return QL_ERR_FAILED;
286}
287
288/*-----------------------------------------------------------------------------------------------*/
289/**
290 @brief Deinitialize the gnss client
291 @return
292 QL_ERR_OK - successful
293 Other - error code defined by ql_type.h
294 */
295/*-----------------------------------------------------------------------------------------------*/
296int ql_gnss_deinit(void)
297{
298 if(NULL == gnss_handle)
299 {
300 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
301 return QL_ERR_NOT_INIT;
302 }
303
304 gnss_handle->timestamp = 0;
305 gnss_handle->server_cb = NULL;
306 gnss_handle->ind_cb = NULL;
307
308 gnss_err_enum ret = mbtk_gnss_deinit();
309 if(ret == GNSS_ERR_OK)
310 {
311 gnss_handle->status = QL_GNSS_INIT_STOP;
312 }
313 else
314 {
315 QL_GNSS_LOGE("[%s] gnss init fail.[%d]", __func__, ret);
316 return QL_ERR_FAILED;
317 }
318
319 free(gnss_handle);
320 gnss_handle = NULL;
321
322 return QL_ERR_OK;
323}
324
325/*-----------------------------------------------------------------------------------------------*/
326/**
327 @brief Start gnss
328 @return
329 QL_ERR_OK - successful
330 QL_ERR_NOT_INIT - uninitialized
331 QL_ERR_SERVICE_NOT_READY - service is not ready
332 QL_ERR_INVALID_ARG - Invalid arguments
333 Other - error code defined by ql_type.h
334 */
335/*-----------------------------------------------------------------------------------------------*/
336int ql_gnss_start(void)
337{
338 if(NULL == gnss_handle)
339 {
340 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
341 return QL_ERR_NOT_INIT;
342 }
343
344 gnss_err_enum ret = GNSS_ERR_UNKNOWN;
345 ret = mbtk_gnss_open(255, QL_GNSS_TIMEOUT);
346 if(ret != GNSS_ERR_OK)
347 {
348 LOGE("[%s] gnss open fail.[%d]", __func__, ret);
349 return QL_ERR_FAILED;
350 }
351
352 gnss_handle->status = QL_GNSS_INIT_START;
353
354 return QL_ERR_OK;
355}
356
357/*-----------------------------------------------------------------------------------------------*/
358/**
359 @brief Stop gnss
360 @return
361 QL_ERR_OK - successful
362 QL_ERR_NOT_INIT - uninitialized
363 QL_ERR_SERVICE_NOT_READY - service is not ready
364 QL_ERR_INVALID_ARG - Invalid arguments
365 Other - error code defined by ql_type.h
366 */
367/*-----------------------------------------------------------------------------------------------*/
368int ql_gnss_stop(void)
369{
370 if(NULL == gnss_handle)
371 {
372 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
373 return QL_ERR_NOT_INIT;
374 }
375
376 gnss_err_enum ret = GNSS_ERR_UNKNOWN;
377 ret = mbtk_gnss_close(QL_GNSS_TIMEOUT);
378 if(ret != GNSS_ERR_OK)
379 {
380 LOGE("[%s] gnss close fail.[%d]", ret);
381 return QL_ERR_FAILED;
382 }
383
384 gnss_handle->status = QL_GNSS_INIT_STOP;
385
386 return QL_ERR_OK;
387}
388
389/*-----------------------------------------------------------------------------------------------*/
390/**
391 @brief Set gnss start mode
392 @param[in] mask Gnss start mode
393 @return
394 QL_ERR_OK - successful
395 QL_ERR_NOT_INIT - uninitialized
396 QL_ERR_SERVICE_NOT_READY - service is not ready
397 QL_ERR_INVALID_ARG - Invalid arguments
398 Other - error code defined by ql_type.h
399 */
400/*-----------------------------------------------------------------------------------------------*/
401int ql_gnss_set_start_mode(QL_GNSS_START_MODE_E mask)
402{
403 if(NULL == gnss_handle)
404 {
405 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
406 return QL_ERR_NOT_INIT;
407 }
408
409 gnss_err_enum ret = GNSS_ERR_UNKNOWN;
410 char param_buf[32] = {0};
411// int length = 0;
412 int mode = 0;
413
414 if(mask == QL_GNSS_COLD_START)
415 {
416 mode = 3;
417 }
418 else if(mask == QL_GNSS_WARM_START)
419 {
420 mode = 2;
421 }
422 else if(mask == QL_GNSS_HOT_START)
423 {
424 mode = 1;
425 }
426 else
427 {
428 QL_GNSS_LOGE("[%s] mask error.", __func__);
429 return QL_ERR_INVALID_ARG;
430 }
431
432 snprintf(param_buf, 32, "$RESET,%d", mode);
433 ret = mbtk_gnss_setting(param_buf, QL_GNSS_TIMEOUT);
434 if(ret != GNSS_ERR_OK)
435 {
436 LOGE("[%s] gnss setting fail.[%d]", __func__);
437 return QL_ERR_FAILED;
438 }
439
440 return QL_ERR_OK;
441}
442
443/*-----------------------------------------------------------------------------------------------*/
444/**
445 @brief Get gnss nmea
446 @param[in] nmea_str
447 @return
448 QL_ERR_OK - successful
449 QL_ERR_NOT_INIT - uninitialized
450 QL_ERR_SERVICE_NOT_READY - service is not ready
451 QL_ERR_INVALID_ARG - Invalid arguments
452 Other - error code defined by ql_type.h
453 */
454/*-----------------------------------------------------------------------------------------------*/
455int ql_gnss_qgpsgnmea(nmeasrc_sentences *nmea_str)
456{
457 UNUSED(nmea_str);
458
459 if(NULL == gnss_handle)
460 {
461 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
462 return QL_ERR_NOT_INIT;
463 }
464
465 return QL_ERR_OK;
466}
467
468/*-----------------------------------------------------------------------------------------------*/
469/**
470 @brief Set gnss qgpscfg
471 @param[in] enable
472 @param[in] str
473 @param[in] len
474 @return
475 QL_ERR_OK - successful
476 QL_ERR_NOT_INIT - uninitialized
477 QL_ERR_SERVICE_NOT_READY - service is not ready
478 QL_ERR_INVALID_ARG - Invalid arguments
479 Other - error code defined by ql_type.h
480 */
481/*-----------------------------------------------------------------------------------------------*/
482int ql_gnss_set_qgpscfg(uint32_t enable, char *str, uint32_t len)
483{
484 UNUSED(enable);
485 UNUSED(str);
486 UNUSED(len);
487
488 if(NULL == gnss_handle)
489 {
490 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
491 return QL_ERR_NOT_INIT;
492 }
493
494 return QL_ERR_OK;
495}
496
497/*-----------------------------------------------------------------------------------------------*/
498/**
499 @brief Get engine state
500 @param[out] state on/ff
501 @return
502 QL_ERR_OK - successful
503 QL_ERR_NOT_INIT - uninitialized
504 QL_ERR_SERVICE_NOT_READY - service is not ready
505 QL_ERR_INVALID_ARG - Invalid arguments
506 Other - error code defined by ql_type.h
507 */
508/*-----------------------------------------------------------------------------------------------*/
509int ql_gnss_get_engine_state(QL_GNSS_ENGINE_STATE_E *state)
510{
511 UNUSED(state);
512
513 if(NULL == gnss_handle)
514 {
515 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
516 return QL_ERR_NOT_INIT;
517 }
518
519 return QL_ERR_OK;
520}
521
522/*-----------------------------------------------------------------------------------------------*/
523/**
524 @brief Set Constellation .
525 @param[in] mask GPS/GLO/BDS/GAL/QZSS/SBAS
526 @return
527 QL_ERR_OK - successful
528 QL_ERR_NOT_INIT - uninitialized
529 QL_ERR_SERVICE_NOT_READY - service is not ready
530 QL_ERR_INVALID_ARG - Invalid arguments
531 Other - error code defined by ql_type.h
532 */
533/*-----------------------------------------------------------------------------------------------*/
534int ql_gnss_set_constellation(QL_GNSS_CONSTELLATION_MASK_E mask)
535{
536 UNUSED(mask);
537
538 if(NULL == gnss_handle)
539 {
540 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
541 return QL_ERR_NOT_INIT;
542 }
543
544 return QL_ERR_OK;
545}
546
547/*-----------------------------------------------------------------------------------------------*/
548/**
549 @brief Get Constellation
550 @param[out] mask GPS/GLO/BDS/GAL/QZSS/SBAS
551 @return
552 QL_ERR_OK - successful
553 QL_ERR_NOT_INIT - uninitialized
554 QL_ERR_SERVICE_NOT_READY - service is not ready
555 QL_ERR_INVALID_ARG - Invalid arguments
556 Other - error code defined by ql_type.h
557 */
558/*-----------------------------------------------------------------------------------------------*/
559int ql_gnss_get_constellation(QL_GNSS_CONSTELLATION_MASK_E *mask)
560{
561 UNUSED(mask);
562
563 if(NULL == gnss_handle)
564 {
565 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
566 return QL_ERR_NOT_INIT;
567 }
568
569 return QL_ERR_OK;
570}
571
572/*-----------------------------------------------------------------------------------------------*/
573/**
574 @brief Set nmea type
575 @param[in] mask type
576 @return
577 QL_ERR_OK - successful
578 QL_ERR_NOT_INIT - uninitialized
579 QL_ERR_SERVICE_NOT_READY - service is not ready
580 QL_ERR_INVALID_ARG - Invalid arguments
581 Other - error code defined by ql_type.h
582 */
583/*-----------------------------------------------------------------------------------------------*/
584int ql_gnss_set_nmea_type(uint32_t mask)
585{
586 UNUSED(mask);
587
588 if(NULL == gnss_handle)
589 {
590 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
591 return QL_ERR_NOT_INIT;
592 }
593
594 return QL_ERR_OK;
595}
596
597/*-----------------------------------------------------------------------------------------------*/
598/**
599 @brief Get nmea version
600 @param[out] version nmea version
601 @return
602 QL_ERR_OK - successful
603 QL_ERR_NOT_INIT - uninitialized
604 QL_ERR_SERVICE_NOT_READY - service is not ready
605 QL_ERR_INVALID_ARG - Invalid arguments
606 Other - error code defined by ql_type.h
607 */
608/*-----------------------------------------------------------------------------------------------*/
609int ql_gnss_get_nmea_version(QL_GNSS_NMEA_VERSION_ID_E *version)
610{
611 UNUSED(version);
612
613 if(NULL == gnss_handle)
614 {
615 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
616 return QL_ERR_NOT_INIT;
617 }
618
619 return QL_ERR_OK;
620}
621
622/*-----------------------------------------------------------------------------------------------*/
623/**
624 @brief Set nmea version
625 @param[in] version nmea version
626 @return
627 QL_ERR_OK - successful
628 QL_ERR_NOT_INIT - uninitialized
629 QL_ERR_SERVICE_NOT_READY - service is not ready
630 QL_ERR_INVALID_ARG - Invalid arguments
631 Other - error code defined by ql_type.h
632 */
633/*-----------------------------------------------------------------------------------------------*/
634int ql_gnss_set_nmea_version(QL_GNSS_NMEA_VERSION_ID_E version)
635{
636 UNUSED(version);
637
638 if(NULL == gnss_handle)
639 {
640 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
641 return QL_ERR_NOT_INIT;
642 }
643
644 return QL_ERR_OK;
645}
646
647/*-----------------------------------------------------------------------------------------------*/
648/**
649 @brief Set gnss agnss mode
650 @param[in] mask Gnss agnss mode
651 @return
652 QL_ERR_OK - successful
653 QL_ERR_NOT_INIT - uninitialized
654 QL_ERR_SERVICE_NOT_READY - service is not ready
655 QL_ERR_INVALID_ARG - Invalid arguments
656 Other - error code defined by ql_type.h
657 */
658/*-----------------------------------------------------------------------------------------------*/
659int ql_gnss_set_agnss_mode(uint32_t mask)
660{
661 if(NULL == gnss_handle)
662 {
663 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
664 return QL_ERR_NOT_INIT;
665 }
666
667 char eph_file[32] = {0};
668 gnss_err_enum ret = GNSS_ERR_UNKNOWN;
669 char write_buff[512] = {0};
670// int write_length = 0;
671
672 if((mask & QL_GNSS_EPH_DATA_GPS) == mask)
673 {
674 memcpy(eph_file, QL_AGNSS_EPH_GPS, strlen(QL_AGNSS_EPH_GPS));
675 }
676 else if((mask & QL_GNSS_EPH_DATA_BDS) == mask)
677 {
678 memcpy(eph_file, QL_AGNSS_EPH_BDS, strlen(QL_AGNSS_EPH_BDS));
679 }
680 else if((mask & QL_GNSS_EPH_DATA_GLO) == mask)
681 {
682 memcpy(eph_file, QL_AGNSS_EPH_GLO, strlen(QL_AGNSS_EPH_GLO));
683 }
684 else if((mask & QL_GNSS_EPH_DATA_GAL) == mask)
685 {
686 memcpy(eph_file, QL_AGNSS_EPH_GAL, strlen(QL_AGNSS_EPH_GAL));
687 }
688 else if((mask & QL_GNSS_EPH_DATA_QZSS) == mask)
689 {
690 memcpy(eph_file, QL_AGNSS_EPH_QZS, strlen(QL_AGNSS_EPH_QZS));
691 }
692 else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_BDS)) == mask)
693 {
694 memcpy(eph_file, QL_AGNSS_EPH_GPS_BDS, strlen(QL_AGNSS_EPH_GPS_BDS));
695 }
696 else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_GLO)) == mask)
697 {
698 memcpy(eph_file, QL_AGNSS_EPH_GPS_GLO, strlen(QL_AGNSS_EPH_GPS_GLO));
699 }
700 else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_GAL)) == mask)
701 {
702 memcpy(eph_file, QL_AGNSS_EPH_GPS_GAL, strlen(QL_AGNSS_EPH_GPS_GAL));
703 }
704 else if((mask & (QL_GNSS_EPH_DATA_GPS | QL_GNSS_EPH_DATA_QZSS)) == mask)
705 {
706 memcpy(eph_file, QL_AGNSS_EPH_GPS_QZSS, strlen(QL_AGNSS_EPH_GPS_QZSS));
707 }
708 else
709 {
710 QL_GNSS_LOGE("[%s] unknown mask.", __func__);
711 return QL_ERR_INVALID_ARG;
712 }
713
714 snprintf(write_buff, 512, "$AGPSCFG,%s%s,NULL,NULL", QL_AGNSS_URL_PATH, eph_file);
715 ret = mbtk_gnss_setting(write_buff, QL_GNSS_TIMEOUT);
716 if(ret != GNSS_ERR_OK)
717 {
718 LOGE("[%s] gnss setting fail.[%d]", __func__, ret);
719 return QL_ERR_FAILED;
720 }
721 return QL_ERR_OK;
722}
723
724/*-----------------------------------------------------------------------------------------------*/
725/**
726 @brief Inject agnss data
727 @param[in] data agnss data
728 @return
729 QL_ERR_OK - successful
730 QL_ERR_NOT_INIT - uninitialized
731 QL_ERR_SERVICE_NOT_READY - service is not ready
732 QL_ERR_INVALID_ARG - Invalid arguments
733 Other - error code defined by ql_type.h
734 */
735/*-----------------------------------------------------------------------------------------------*/
736int ql_gnss_inject_agnss_data(void)
737{
738 if(NULL == gnss_handle)
739 {
740 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
741 return QL_ERR_NOT_INIT;
742 }
743
744 gnss_err_enum ret = GNSS_ERR_UNKNOWN;
745 ret = mbtk_gnss_eph_download(QL_AGNSS_DOWNLOAD_TIMEPUT);
746 if(ret != GNSS_ERR_OK)
747 {
748 LOGE("[%s] gnss eph download fail.[%d]", __func__, ret);
749 return QL_ERR_FAILED;
750 }
751
752 ret = mbtk_gnss_eph_inject(QL_AGNSS_INJECT_TIMEOUT);
753 if(ret != GNSS_ERR_OK)
754 {
755 LOGE("[%s] gnss eph inject fail.[%d]", __func__, ret);
756 return QL_ERR_FAILED;
757 }
758
759 return QL_ERR_OK;
760}
761
762/*-----------------------------------------------------------------------------------------------*/
763/**
764 @brief Inject UTC time to GNSS Engine.
765 @param[in] timestamp ,unit: ms
766 @return Whether to successfully Start Gnss
767 @retval QL_ERR_OK successful
768 @retval QL_ERR_FAILED Start Gnss Failed
769 @retval Other error code defined by ql_gnss.h
770 */
771/*-----------------------------------------------------------------------------------------------*/
772int ql_gnss_inject_utc_time(uint64_t timestamp)
773{
774 UNUSED(timestamp);
775
776 if(NULL == gnss_handle)
777 {
778 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
779 return QL_ERR_NOT_INIT;
780 }
781
782 return QL_ERR_OK;
783}
784
785/*-----------------------------------------------------------------------------------------------*/
786/**
787 @brief Set gnss suspend
788 @return
789 QL_ERR_OK - successful
790 QL_ERR_NOT_INIT - uninitialized
791 QL_ERR_SERVICE_NOT_READY - service is not ready
792 QL_ERR_INVALID_ARG - Invalid arguments
793 Other - error code defined by ql_type.h
794 */
795/*-----------------------------------------------------------------------------------------------*/
796int ql_gnss_suspend(void)
797{
798 if(NULL == gnss_handle)
799 {
800 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
801 return QL_ERR_NOT_INIT;
802 }
803
804 return QL_ERR_OK;
805}
806
807/*-----------------------------------------------------------------------------------------------*/
808/**
809 @brief Set gnss resume
810 @return
811 QL_ERR_OK - successful
812 QL_ERR_NOT_INIT - uninitialized
813 QL_ERR_SERVICE_NOT_READY - service is not ready
814 QL_ERR_INVALID_ARG - Invalid arguments
815 Other - error code defined by ql_type.h
816 */
817/*-----------------------------------------------------------------------------------------------*/
818int ql_gnss_resume(void)
819{
820 if(NULL == gnss_handle)
821 {
822 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
823 return QL_ERR_NOT_INIT;
824 }
825
826 return QL_ERR_OK;
827}
828
829
830
831
832/*-----------------------------------------------------------------------------------------------*/
833/**
834 @brief Register gnss callback
835 @param[in] cb
836 @return
837 QL_ERR_OK - successful
838 QL_ERR_NOT_INIT - uninitialized
839 QL_ERR_SERVICE_NOT_READY - service is not ready
840 QL_ERR_INVALID_ARG - Invalid arguments
841 Other - error code defined by ql_type.h
842 */
843/*-----------------------------------------------------------------------------------------------*/
844int ql_gnss_set_ind_cb(ql_gnss_ind_cb_f cb)
845{
846 if(NULL == gnss_handle)
847 {
848 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
849 return QL_ERR_NOT_INIT;
850 }
851
852 gnss_handle->ind_cb = cb;
853
854 return QL_ERR_OK;
855}
856
857/*-----------------------------------------------------------------------------------------------*/
858/**
859 @brief Registration server error callback. Currently, only if the server exits abnormally,
860 the callback function will be executed, and the error code is QL_ERR_ABORTED;
861 @param[in] cb Callback function
862 @return
863 QL_ERR_OK - successful
864 Other - error code defined by ql_type.h
865 */
866/*-----------------------------------------------------------------------------------------------*/
867int ql_gnss_set_service_error_cb(ql_gnss_error_cb_f cb)
868{
869 if(NULL == gnss_handle)
870 {
871 QL_GNSS_LOGE("[%s] gnss handle not init.", __func__);
872 return QL_ERR_NOT_INIT;
873 }
874
875 gnss_handle->server_cb = cb;
876
877 return QL_ERR_OK;
878}
879