blob: cf9af27d2e641295da0ff2f4410e8b7f785a9c28 [file] [log] [blame]
b.liue77ac3a2024-07-17 17:36:57 +08001/*
2* mbtk_gnss.c
3*
4* MBTK GNSS API source.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/7/11 LiuBin Initial version
14
15******************************************************************************/
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <errno.h>
20#include <pthread.h>
21#include <sys/socket.h>
22#include <sys/un.h>
23#include <netinet/in.h>
24#include <fcntl.h>
25#include <sys/epoll.h>
yq.wang1ddd1fd2024-07-25 23:00:14 -070026#include <time.h>
b.liue77ac3a2024-07-17 17:36:57 +080027
28#include "mbtk_gnss_inter.h"
29#include "mbtk_log.h"
30#include "mbtk_utils.h"
31
32#define GNSS_BUFF_SIZE 2048
33
34static int gnss_cli_fd = -1;
35static pthread_t read_thread_id;
36static int exit_fd[2] = {-1};
37static mbtk_gnss_callback_func gnss_cb = NULL;
38static bool gnss_busy = FALSE;
39static pthread_cond_t gnss_cond;
40static pthread_mutex_t gnss_mutex;
41static gnss_err_enum gnss_result;
42
yq.wang1ddd1fd2024-07-25 23:00:14 -070043#if 1//MBTK_GNSS_LOCATION_INFO
44static mbtk_gnss_location_info_t locl_info;
45
46extern long timezone;
47#endif
48
b.liue77ac3a2024-07-17 17:36:57 +080049static int sock_read(int fd, uint8 *msg, int data_len)
50{
51 memset(msg, 0, data_len);
52 int len = 0;
53
54 int read_len = 0;
55 while(1)
56 {
57 len = read(fd, msg + read_len, data_len - read_len);
58 if(len > 0)
59 {
60 read_len += len;
61 }
62 else if(len == 0)
63 {
64 LOGE("read() end.");
65 break;
66 }
67 else
68 {
69 if(EAGAIN == errno)
70 {
b.liu42f558e2024-07-18 14:06:49 +080071 LOGV("Read end, lenght = %d", read_len);
b.liue77ac3a2024-07-17 17:36:57 +080072 }
73 else
74 {
75 LOGE("read() error[%d].", errno);
76 }
77 break;
78 }
79 }
80
81 if(read_len > 0)
82 {
83 // log_hex("DATA_RECV", msg, read_len);
84 return read_len;
85 }
86 else
87 {
88 return -1;
89 }
90}
91
92static int sock_write(int fd, uint8 *msg, int data_len)
93{
94 int len = 0;
95 int write_len = 0;
96 while(write_len < data_len)
97 {
98 len = write(fd, msg + write_len, data_len - write_len);
99 if(len > 0)
100 {
101 write_len += len;
102 }
103 else if(len == 0)
104 {
105 LOGE("write() end.");
106 break;
107 }
108 else
109 {
110 LOGE("write() error[%d].", errno);
111 break;
112 }
113 }
114
115 if(write_len > 0)
116 {
yq.wang9dd771b2024-09-13 23:38:40 -0700117 //log_hex("DATA_SEND", msg, write_len);
b.liue77ac3a2024-07-17 17:36:57 +0800118 return write_len;
119 }
120 else
121 {
122 return -1;
123 }
124}
125
126static void gnss_timer_cb(int signo)
127{
128 if(gnss_busy) {
129 pthread_mutex_lock(&gnss_mutex);
130 pthread_cond_signal(&gnss_cond);
131 pthread_mutex_unlock(&gnss_mutex);
132 gnss_result = GNSS_ERR_TIMEOUT;
133 }
134 return;
135}
136
yq.wang1ddd1fd2024-07-25 23:00:14 -0700137#if 1//MBTK_GNSS_LOCATION_INFO
138static int strstr_n(const char *s1, const char *s2)
139{
140 int n;
141 int strlen = 0;
142
143 if(*s2)
144 {
145 while(*s1)
146 {
147 for(n = 0; *(s1+n) == *(s2 + n); n++)
148 {
149 if(!*(s2 + n + 1))
150 {
151 strlen++;
152 return strlen;
153 }
154 }
155 s1++;
156 strlen++;
157 }
158 return 0;
159 }
160
161 return 0;
162}
163
164static int str2int( const char* head, const char* end )
165{
166 int result = 0;
167 int len = end - head;
168
169 for(; len > 0; len--, head++)
170 {
171 int c;
172 if (head >= end)
173 {
174 goto Fail;
175 }
176
177 c = *head - '0';
178 if ((unsigned)c >= 10)
179 {
180 goto Fail;
181 }
182 result = result * 10 + c;
183 }
184 return result;
185Fail:
186 return -1;
187}
188
189static double str2float( const char* head, const char* end )
190{
191 int len = end - head;
192 char temp[16];
193
194 if(len >= (int)sizeof(temp))
195 {
196 return 0;
197 }
198
199 memcpy( temp, head, len );
200 temp[len] = 0;
201 return strtod(temp, NULL);
202}
203
204static mbtk_token nmea_tokenizer_get(mbtk_nmeatokenizer* t, int index)
205{
206 mbtk_token tok;
207 static const char* dummy = "";
208
209 if (index < 0 || index >= t->count)
210 {
211 tok.head = tok.end = dummy;
212 }
213 else
214 {
215 tok = t->tokens[index];
216 }
217 return tok;
218}
219
220static int nmea_tokenizer_init(mbtk_nmeatokenizer* t, const char* head, const char* end, int param_num)
221{
222 int count = 0;
223 const char* p = head;
224 const char* q = end;
225 const char* tmp = NULL;
226 // the initial '$' is optional
227 if (p < q && p[0] == '$')
228 {
229 p += 1;
230 }
231 else
232 {
233 return -1;
234 }
235
236 //find '*',del '*25\r\n'
237 // get rid of checksum at the end of the sentecne
238 if (q >= p + 5 && q[-5] == '*')
239 {
240 q -= 5;
241 }
242 else
243 {
244 return -1;
245 }
246
b.liubcf86c92024-08-19 19:48:28 +0800247 while (p <= q)
yq.wang1ddd1fd2024-07-25 23:00:14 -0700248 {
249 tmp = memchr(p, ',', q-p);
250 if (tmp == NULL)
251 {
252 tmp = q;
253 }
254 // if (q > p) {
255 // q >= p include empty token: ,,
256 if (tmp >= p)
257 {
258 if (count < MAX_NMEA_TOKENS)
259 {
260 t->tokens[count].head = p;
261 t->tokens[count].end = tmp;
262 count += 1;
263 }
264 }
b.liubcf86c92024-08-19 19:48:28 +0800265
yq.wang1ddd1fd2024-07-25 23:00:14 -0700266 if (tmp <= q)
267 {
268 tmp += 1;
269 }
270
271 p = tmp;
272 }
273
274 if(count != param_num)
275 {
276 LOGD("count [%d], param_num [%d]", count, param_num);
277 return -1;
278 }
279
280 t->count = count;
281 return count;
282}
283
284static int nmea_update_date_time(mbtk_gnss_location_info_t* locl_info, mbtk_token date, mbtk_token time)
285{
286 char tmp_char[4] = {0};
287 struct tm tmp_time;
288
289 memset(&tmp_time, 0x0, sizeof(struct tm));
290 if (date.head + 6 > date.end)
291 {
292 LOGD("date get fail");
293 return -1;
294 }
295
296 memcpy(tmp_char, date.head, 2);
297 tmp_time.tm_mday = atoi(tmp_char);
298 memcpy(tmp_char, date.head + 2, 2);
299 tmp_time.tm_mon = atoi(tmp_char) - 1;
300 memcpy(tmp_char, date.head + 4, 2);
301 tmp_time.tm_year = 100 + atoi(tmp_char);
302
303 if (time.head + 6 > time.end)
304 {
305 LOGD("time get fail");
306 return -1;
307 }
308
309 memcpy(tmp_char, time.head, 2);
310 tmp_time.tm_hour = atoi(tmp_char);
311 memcpy(tmp_char, time.head + 2, 2);
312 tmp_time.tm_min = atoi(tmp_char);
313 memcpy(tmp_char, time.head + 4, 2);
314 tmp_time.tm_sec = atoi(tmp_char);
315 tmp_time.tm_isdst = -1;
b.liubcf86c92024-08-19 19:48:28 +0800316
yq.wang1ddd1fd2024-07-25 23:00:14 -0700317#if MBTK_GNSS_LOG_ENABLED
b.liubcf86c92024-08-19 19:48:28 +0800318 LOGD("data:%d-%d-%d %d:%d:%d", tmp_time.tm_year + 1900,
yq.wang1ddd1fd2024-07-25 23:00:14 -0700319 tmp_time.tm_mon,
320 tmp_time.tm_mday,
321 tmp_time.tm_hour,
322 tmp_time.tm_min,
323 tmp_time.tm_sec);
324#endif
325
326 time_t _t = mktime(&tmp_time);//parse location tmp_time
327#if MBTK_GNSS_LOG_ENABLED
328 LOGD("time: %ld", _t);
329#endif
330 tzset(); // auto set tz
331 _t = _t - timezone;
332 locl_info->timestamp = (int64_t)_t;
333#if MBTK_GNSS_LOG_ENABLED
334 LOGD("timestamp: %ld, %ld", locl_info->timestamp, timezone);
335#endif
336 return 0;
337}
338
339static int nmea_update_bearing(mbtk_gnss_location_info_t* locl_info, mbtk_token bearing)
340{
341 mbtk_token tok = bearing;
342
343 if (tok.head >= tok.end)
344 {
345 LOGD("bearing get fail");
346 return -1;
347 }
348
349 locl_info->bearing = str2float(tok.head, tok.end);
350 return 0;
351}
352
353static int nmea_update_speed(mbtk_gnss_location_info_t* locl_info, mbtk_token speed)
354{
355 mbtk_token tok = speed;
356
357 if (tok.head >= tok.end)
358 {
359 LOGD("speed get fail");
360 return -1;
361 }
362
363 locl_info->speed = str2float(tok.head, tok.end);
364 return 0;
365}
366
367static int nmea_update_latlong(mbtk_gnss_location_info_t* locl_info, mbtk_token latitude, mbtk_token longitude)
368{
369 double lat, lon;
370 mbtk_token tok;
371 tok = latitude;
372 if (tok.head + 6 > tok.end)
373 {
374 LOGD("latitude get fail");
375 return -1;
376 }
377 locl_info->latitude = str2float(tok.head, tok.end);
378
379 tok = longitude;
b.liubcf86c92024-08-19 19:48:28 +0800380 if (tok.head + 6 > tok.end)
yq.wang1ddd1fd2024-07-25 23:00:14 -0700381 {
382 LOGD("longitude get fail");
383 return -1;
384 }
385 locl_info->longitude = str2float(tok.head, tok.end);
386 return 0;
387}
388
389static int nmea_update_altitude(mbtk_gnss_location_info_t* locl_info, mbtk_token altitude)
390{
391 mbtk_token tok = altitude;
392
393 if (tok.head >= tok.end)
394 {
395 LOGD("altitude get fail");
396 return -1;
397 }
398
399 locl_info->altitude = str2float(tok.head, tok.end);
400 return 0;
401}
402
403static int ind_nmea_parse(const char *data, int data_len, mbtk_gnss_location_info_t* locl_info)
404{
405 int ret;
406 mbtk_nmeatokenizer tzer = {0};
407 if(strstr_n(data + 3, "RMC"))
408 {
409#if MBTK_GNSS_LOG_ENABLED
410 LOGD("ind data_len: [%d] data: %s", data_len, data);
411#endif
412 ret = nmea_tokenizer_init(&tzer, data, data + data_len, NMEA_RMC_PARAM_NUM);
413 if(ret < 0)
414 {
415 LOGD("nmea_tokenizer_init fail");
416 return -1;
417 }
418
419 mbtk_token tok_time = nmea_tokenizer_get(&tzer,1);
420 mbtk_token tok_fixStatus = nmea_tokenizer_get(&tzer,2);
421 mbtk_token tok_speed = nmea_tokenizer_get(&tzer,7);
422 mbtk_token tok_bearing = nmea_tokenizer_get(&tzer,8);
423 mbtk_token tok_date = nmea_tokenizer_get(&tzer,9);
424
425 if(tok_fixStatus.head[0] == 'A')
426 {
427 ret = nmea_update_date_time(locl_info, tok_date, tok_time);
428 if(ret < 0)
429 {
430 LOGD("nmea_update_date_time fail");
431 return -1;
432 }
433 locl_info->flags |= GNSS_LOCATION_HAS_TIMESTAMP;
434
435 ret = nmea_update_bearing(locl_info, tok_bearing);
436 if(ret < 0)
437 {
438 LOGD("nmea_update_bearing fail");
439 return -1;
440 }
441 locl_info->flags |= GNSS_LOCATION_HAS_BEARING;
442
443 ret = nmea_update_speed(locl_info, tok_speed);
444 if(ret < 0)
445 {
446 LOGD("nmea_update_speed fail");
447 return -1;
448 }
449 locl_info->flags |= GNSS_LOCATION_HAS_SPEED;
450 }
451 }
452 else if(strstr_n(data + 3, "GGA"))
453 {
454#if MBTK_GNSS_LOG_ENABLED
455 LOGD("ind data_len: [%d] data: %s", data_len, data);
456#endif
457 ret = nmea_tokenizer_init(&tzer, data, data + data_len, NMEA_GGA_PARAM_NUM);
458 if(ret < 0)
459 {
460 LOGD("nmea_tokenizer_init fail");
461 return -1;
462 }
463
464 mbtk_token tok_latitude = nmea_tokenizer_get(&tzer,2);
465 mbtk_token tok_longitude = nmea_tokenizer_get(&tzer,4);
466 mbtk_token tok_isPix = nmea_tokenizer_get(&tzer,6);
467 mbtk_token tok_altitude = nmea_tokenizer_get(&tzer,9);
468
469 if(tok_isPix.head[0] > '0' && tok_isPix.head[0] < '9')
470 {
471 ret = nmea_update_latlong(locl_info, tok_latitude, tok_longitude);
472 if(ret < 0)
473 {
474 LOGD("nmea_update_latlong fail");
475 return -1;
476 }
477 locl_info->flags |= GNSS_LOCATION_HAS_LAT_LONG;
b.liubcf86c92024-08-19 19:48:28 +0800478
yq.wang1ddd1fd2024-07-25 23:00:14 -0700479 ret = nmea_update_altitude(locl_info, tok_altitude);
480 if(ret < 0)
481 {
482 LOGD("nmea_update_altitude fail");
483 return -1;
484 }
485 locl_info->flags |= GNSS_LOCATION_HAS_ALTITUDE;
486 }
487 }
488 else
489 {
490#if MBTK_GNSS_LOG_ENABLED
491 LOGD("ind data_len: [%d] data: %s", data_len, data);
492#endif
493 }
494 return 0;
495}
496#endif
497
498
b.liue77ac3a2024-07-17 17:36:57 +0800499static void gnss_rsp_process(const char *data, int data_len)
500{
501 int index = 0;
502 char buff[GNSS_BUFF_SIZE];
503 int buff_len = 0;
yq.wang1ddd1fd2024-07-25 23:00:14 -0700504 int ret = 0;
505 int tag_len = 0;
b.liue77ac3a2024-07-17 17:36:57 +0800506 while(index < data_len) {
507 if(data[index] == MBTK_IND_START_FLAG) {
508 memset(buff, 0, sizeof(buff));
509 buff_len = 0;
510 } else if(data[index] == MBTK_IND_END_FLAG) {
511 buff[buff_len] = '\0';
b.liue77ac3a2024-07-17 17:36:57 +0800512 if(memcmp(MBTK_IND_LOCATION_TAG, buff, strlen(MBTK_IND_LOCATION_TAG)) == 0) {
513 if(gnss_cb) {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700514#if 1//MBTK_GNSS_LOCATION_INFO
515 tag_len = strlen(MBTK_IND_LOCATION_TAG);
516 ret = ind_nmea_parse(buff + tag_len, buff_len - tag_len, &locl_info);
517#if MBTK_GNSS_LOG_ENABLED
518 LOGD("gnss_cb: [%p], locl_info.flags [%d]", gnss_cb, locl_info.flags);
519#endif
520 if(locl_info.flags == GNSS_LOCATION_HAS_ALL) {
521 gnss_cb(MBTK_GNSS_IND_LOCATION, &locl_info, sizeof(mbtk_gnss_location_info_t));
522 locl_info.flags = 0;
523 }
524#endif
b.liue77ac3a2024-07-17 17:36:57 +0800525 }
526 } else if(memcmp(MBTK_IND_NMEA_TAG, buff, strlen(MBTK_IND_NMEA_TAG)) == 0) {
527 if(gnss_cb) {
yq.wang1ddd1fd2024-07-25 23:00:14 -0700528 tag_len = strlen(MBTK_IND_NMEA_TAG);
529 gnss_cb(MBTK_GNSS_IND_NMEA, buff + tag_len, buff_len - tag_len);
b.liue77ac3a2024-07-17 17:36:57 +0800530 }
531 } else {
b.liu42f558e2024-07-18 14:06:49 +0800532 LOGD("RSP[len - %d] : %s", buff_len, buff);
b.liue77ac3a2024-07-17 17:36:57 +0800533 if(gnss_busy) {
b.liu42f558e2024-07-18 14:06:49 +0800534 // XXXXXX:<result>
535 char *ptr = strstr(buff, ":");
536 if(ptr) {
537 gnss_result = atoi(ptr + 1);
538 }
b.liue77ac3a2024-07-17 17:36:57 +0800539 pthread_mutex_lock(&gnss_mutex);
540 pthread_cond_signal(&gnss_cond);
541 pthread_mutex_unlock(&gnss_mutex);
542 }
543 }
544 } else {
545 buff[buff_len++] = data[index];
546 }
547 index++;
548 }
549}
550
551static void* gnss_read_run(void* arg)
552{
553 int epoll_fd = epoll_create(5);
554 if(epoll_fd < 0)
555 {
556 LOGE("epoll_create() fail[%d].", errno);
557 return NULL;
558 }
559
560 uint32 event = EPOLLIN | EPOLLET;
561 struct epoll_event ev_cli, ev_exit;
562 ev_cli.data.fd = gnss_cli_fd;
563 ev_cli.events = event; //EPOLLIN | EPOLLERR | EPOLLET;
564 epoll_ctl(epoll_fd,EPOLL_CTL_ADD,gnss_cli_fd,&ev_cli);
565
566 ev_exit.data.fd = exit_fd[0];
567 ev_exit.events = event; //EPOLLIN | EPOLLERR | EPOLLET;
568 epoll_ctl(epoll_fd,EPOLL_CTL_ADD,exit_fd[0],&ev_exit);
569
570 int nready = -1;
571 struct epoll_event epoll_events[EPOLL_LISTEN_MAX];
572 while(1)
573 {
574 nready = epoll_wait(epoll_fd, epoll_events, EPOLL_LISTEN_MAX, -1);
575 if(nready > 0)
576 {
577 int i;
578 for(i = 0; i < nready; i++)
579 {
b.liu42f558e2024-07-18 14:06:49 +0800580 LOGV("fd[%d] event = %x",epoll_events[i].data.fd, epoll_events[i].events);
b.liue77ac3a2024-07-17 17:36:57 +0800581 if(epoll_events[i].events & EPOLLHUP) // Closed by server.
582 {
583
584 }
585 else if(epoll_events[i].events & EPOLLIN)
586 {
587 if(gnss_cli_fd == epoll_events[i].data.fd) // Server data arrive.
588 {
589 char buff[GNSS_BUFF_SIZE + 1];
590 int len = sock_read(gnss_cli_fd, buff, GNSS_BUFF_SIZE);
591 if(len > 0) {
592 gnss_rsp_process(buff, len);
593 }
594 }
595 else if(exit_fd[0] == epoll_events[i].data.fd) //
596 {
597 char buff[100] = {0};
598 int len = read(exit_fd[0], buff, 100);
599 if(len > 0) {
600 LOGI("CMD : %s", buff);
601 if(strcmp(buff, "EXIT") == 0) {
602 goto read_thread_exit;
603 } else {
604 LOGD("Unkonw cmd : %s", buff);
605 }
606 } else {
607 LOGE("sock_read() fail.");
608 }
609 }
610 else
611 {
612 LOGW("Unknown socket : %d", epoll_events[i].data.fd);
613 }
614 }
615 else
616 {
617 LOGW("Unknown event : %x", epoll_events[i].events);
618 }
619 }
620 }
621 else
622 {
623 LOGW("epoll_wait() fail[%d].", errno);
624 }
625 }
626
627read_thread_exit:
628 LOGD("info_read thread exit.");
629 return NULL;
630}
631
632gnss_err_enum mbtk_gnss_init(mbtk_gnss_callback_func cb)
633{
634 if(gnss_cli_fd > 0) {
635 LOGW("GNSS client has inited.");
636 return GNSS_ERR_OK;
637 }
638
639 gnss_cli_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
640 if(gnss_cli_fd < 0)
641 {
642 LOGE("socket() fail[%d].", errno);
643 goto error;
644 }
645
646 // Set O_NONBLOCK
647 int flags = fcntl(gnss_cli_fd, F_GETFL, 0);
648 if (flags < 0)
649 {
650 LOGE("Get flags error:%d", errno);
651 goto error;
652 }
653 flags |= O_NONBLOCK;
654 if (fcntl(gnss_cli_fd, F_SETFL, flags) < 0)
655 {
656 LOGE("Set flags error:%d", errno);
657 goto error;
658 }
659
660 struct sockaddr_un cli_addr;
661 memset(&cli_addr, 0, sizeof(cli_addr));
662 cli_addr.sun_family = AF_LOCAL;
663 strcpy(cli_addr.sun_path, SOCK_GNSS_PATH);
664 if(connect(gnss_cli_fd, (struct sockaddr *)&cli_addr, sizeof(cli_addr)))
665 {
666 LOGE("connect() fail[%d].", errno);
667 goto error;
668 }
669
670 if(pipe(exit_fd)) {
671 LOGE("pipe() fail[%d].", errno);
672 goto error;
673 }
674
675 if(pthread_create(&read_thread_id, NULL, gnss_read_run, NULL))
676 {
677 LOGE("pthread_create() fail.");
678 goto error;
679 }
680 pthread_mutex_init(&gnss_mutex, NULL);
681 pthread_cond_init(&gnss_cond, NULL);
682 gnss_cb = cb;
683 return GNSS_ERR_OK;
684
685error:
686 if(gnss_cli_fd > 0) {
687 close(gnss_cli_fd);
688 gnss_cli_fd = -1;
689 }
690 if(exit_fd[0] > 0) {
691 close(exit_fd[0]);
692 exit_fd[0] = -1;
693 }
694 if(exit_fd[1] > 0) {
695 close(exit_fd[1]);
696 exit_fd[1] = -1;
697 }
698
699 return GNSS_ERR_UNKNOWN;
700}
701
702gnss_err_enum mbtk_gnss_deinit()
703{
704 if(gnss_cli_fd < 0) {
705 LOGW("GNSS client not inited.");
706 return GNSS_ERR_UNKNOWN;
707 }
708
709 if(gnss_busy) {
710 LOGE("BUSY");
711 return GNSS_ERR_BUSY;
712 }
713
714 if(exit_fd[1] > 0) {
715 write(exit_fd[1], "EXIT", 4);
716 }
717
718 int ret = pthread_join(read_thread_id, NULL);
719 if(ret){
720 LOGE("pthrad_join fail(%d)",ret);
721 return GNSS_ERR_UNKNOWN;
722 }
723
724 close(gnss_cli_fd);
725 gnss_cli_fd = -1;
726 close(exit_fd[0]);
727 exit_fd[0] = -1;
728 close(exit_fd[1]);
729 exit_fd[1] = -1;
730 gnss_cb = NULL;
731 gnss_busy = FALSE;
732 pthread_mutex_destroy(&gnss_mutex);
733 pthread_cond_destroy(&gnss_cond);
734
735 return GNSS_ERR_OK;
736}
737
b.liuc223a942024-07-18 15:44:12 +0800738/*===========================================================================
739FUNCTION mbtk_gnss_open
740
741DESCRIPTION:
742 Open/Close GNSS.
743
744PARAMETERS:
745 type [IN]: How to turn on or off GNSS,The available values are as follows:
746 0 : Close GNSS;
747 1-15 : Open GNSS with NMEA print;
748 (GNSS_PRINT_PORT_UART1 / GNSS_PRINT_PORT_USB_NMEA / GNSS_PRINT_PORT_USB_AT / GNSS_PRINT_PORT_TTY_AT)
749 Other : Open GNSS without print NMEA
750 timeout [IN]: Timeout with second.
751
752RETURN VALUE:
753 gnss_err_enum
754
755===========================================================================*/
b.liue77ac3a2024-07-17 17:36:57 +0800756gnss_err_enum mbtk_gnss_open(int type, int timeout)
757{
758 if(gnss_cli_fd < 0) {
759 LOGW("GNSS client not inited.");
760 return GNSS_ERR_UNKNOWN;
761 }
762
763 if(gnss_busy) {
764 LOGE("BUSY");
765 return GNSS_ERR_BUSY;
766 } else {
767 gnss_result = GNSS_ERR_OK;
768 gnss_busy = TRUE;
769 if(timeout > 0) {
770 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
771 }
772
773 // gnss_init:x
774 char cmd[32] = {0};
775 snprintf(cmd, sizeof(cmd), "gnss_init:%d", type);
776 sock_write(gnss_cli_fd, cmd, strlen(cmd));
777
778 pthread_mutex_lock(&gnss_mutex);
779 pthread_cond_wait(&gnss_cond, &gnss_mutex);
780 pthread_mutex_unlock(&gnss_mutex);
781
782 gnss_busy = FALSE;
783
784 return gnss_result;
785 }
786}
787
788gnss_err_enum mbtk_gnss_close(int timeout)
789{
790 if(gnss_cli_fd < 0) {
791 LOGW("GNSS client not inited.");
792 return GNSS_ERR_UNKNOWN;
793 }
794
795 if(gnss_busy) {
796 LOGE("BUSY");
797 return GNSS_ERR_BUSY;
798 } else {
799 gnss_result = GNSS_ERR_OK;
800 gnss_busy = TRUE;
801 if(timeout > 0) {
802 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
803 }
804
805 // gnss_deinit
806 char *cmd = "gnss_deinit";
807 sock_write(gnss_cli_fd, cmd, strlen(cmd));
808
809 pthread_mutex_lock(&gnss_mutex);
810 pthread_cond_wait(&gnss_cond, &gnss_mutex);
811 pthread_mutex_unlock(&gnss_mutex);
812
813 gnss_busy = FALSE;
814
815 return gnss_result;
816 }
817}
818
819
820gnss_err_enum mbtk_gnss_setting(const char *setting_cmd, int timeout)
821{
822 if(gnss_cli_fd < 0) {
823 LOGW("GNSS client not inited.");
824 return GNSS_ERR_UNKNOWN;
825 }
826
827 if(gnss_busy) {
828 LOGE("BUSY");
829 return GNSS_ERR_BUSY;
830 } else {
831 gnss_result = GNSS_ERR_OK;
832 gnss_busy = TRUE;
833 if(timeout > 0) {
834 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
835 }
836
837 // gnss_setting:cmd
yq.wang9dd771b2024-09-13 23:38:40 -0700838 char cmd[1024] = {0};
b.liue77ac3a2024-07-17 17:36:57 +0800839 snprintf(cmd, sizeof(cmd), "gnss_setting:%s", setting_cmd);
840 sock_write(gnss_cli_fd, cmd, strlen(cmd));
841
842 pthread_mutex_lock(&gnss_mutex);
843 pthread_cond_wait(&gnss_cond, &gnss_mutex);
844 pthread_mutex_unlock(&gnss_mutex);
845
846 gnss_busy = FALSE;
847
848 return gnss_result;
849 }
850}
851
852gnss_err_enum mbtk_gnss_dl(const char *fw_path, int timeout)
853{
854 if(gnss_cli_fd < 0) {
855 LOGW("GNSS client not inited.");
856 return GNSS_ERR_UNKNOWN;
857 }
858
859 if(gnss_busy) {
860 LOGE("BUSY");
861 return GNSS_ERR_BUSY;
862 } else {
863 gnss_result = GNSS_ERR_OK;
864 gnss_busy = TRUE;
865 if(timeout > 0) {
866 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
867 }
868
869 // gnss_dl:fw_name
870 char cmd[32] = {0};
871 snprintf(cmd, sizeof(cmd), "gnss_dl:%s", fw_path);
872 sock_write(gnss_cli_fd, cmd, strlen(cmd));
873
874 pthread_mutex_lock(&gnss_mutex);
875 pthread_cond_wait(&gnss_cond, &gnss_mutex);
876 pthread_mutex_unlock(&gnss_mutex);
877
878 gnss_busy = FALSE;
879
880 return gnss_result;
881 }
882}
883
b.liuc223a942024-07-18 15:44:12 +0800884/**
885* Set GNSS data callback.
886*
887* gnss_ind : MBTK_GNSS_IND_LOCATION / MBTK_GNSS_IND_NMEA
888* timeout : Timeout with second.
889*
890*/
b.liue77ac3a2024-07-17 17:36:57 +0800891gnss_err_enum mbtk_gnss_ind_set(uint32 gnss_ind, int timeout)
892{
893 if(gnss_cli_fd < 0) {
894 LOGW("GNSS client not inited.");
895 return GNSS_ERR_UNKNOWN;
896 }
897
898 if(gnss_busy) {
899 LOGE("BUSY");
900 return GNSS_ERR_BUSY;
901 } else {
902 gnss_result = GNSS_ERR_OK;
903 gnss_busy = TRUE;
904 if(timeout > 0) {
905 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
906 }
907
908 // gnss_ind:ind_type
909 char cmd[32] = {0};
910 snprintf(cmd, sizeof(cmd), "gnss_ind:%d", gnss_ind);
911 sock_write(gnss_cli_fd, cmd, strlen(cmd));
912
913 pthread_mutex_lock(&gnss_mutex);
914 pthread_cond_wait(&gnss_cond, &gnss_mutex);
915 pthread_mutex_unlock(&gnss_mutex);
916
917 gnss_busy = FALSE;
918
919 return gnss_result;
920 }
921}
922
yq.wang9dd771b2024-09-13 23:38:40 -0700923gnss_err_enum mbtk_gnss_eph_download(int timeout)
924{
925 if(gnss_cli_fd < 0) {
926 LOGW("GNSS client not inited.");
927 return GNSS_ERR_UNKNOWN;
928 }
929
930 if(gnss_busy) {
931 LOGE("BUSY");
932 return GNSS_ERR_BUSY;
933 } else {
934 gnss_result = GNSS_ERR_OK;
935 gnss_busy = TRUE;
936 if(timeout > 0) {
937 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
938 }
939
940 // gnss_agnss_get:<eph_data>,<alam_flag>
941 char cmd[32] = {0};
942 snprintf(cmd, sizeof(cmd), "gnss_agnss_get:%d,0", (int)GNSS_EPH_CFG);
943 sock_write(gnss_cli_fd, cmd, strlen(cmd));
944
945 pthread_mutex_lock(&gnss_mutex);
946 pthread_cond_wait(&gnss_cond, &gnss_mutex);
947 pthread_mutex_unlock(&gnss_mutex);
948
949 gnss_busy = FALSE;
950
951 return gnss_result;
952 }
953}
954
955gnss_err_enum mbtk_gnss_eph_inject(int timeout)
956{
957 if(gnss_cli_fd < 0) {
958 LOGW("GNSS client not inited.");
959 return GNSS_ERR_UNKNOWN;
960 }
961
962 if(gnss_busy) {
963 LOGE("BUSY");
964 return GNSS_ERR_BUSY;
965 } else {
966 gnss_result = GNSS_ERR_OK;
967 gnss_busy = TRUE;
968 if(timeout > 0) {
969 mbtk_timer_set(gnss_timer_cb, timeout * 1000);
970 }
971
972 // gnss_agnss_set
973 char cmd[32] = {0};
974 snprintf(cmd, sizeof(cmd), "gnss_agnss_set");
975 sock_write(gnss_cli_fd, cmd, strlen(cmd));
976
977 pthread_mutex_lock(&gnss_mutex);
978 pthread_cond_wait(&gnss_cond, &gnss_mutex);
979 pthread_mutex_unlock(&gnss_mutex);
980
981 gnss_busy = FALSE;
982
983 return gnss_result;
984 }
985}
986
b.liubcf86c92024-08-19 19:48:28 +0800987void mbtk_gnss_lib_info_print()
988{
989 MBTK_SOURCE_INFO_PRINT("mbtk_gnss_lib");
990}
991