blob: 688f8dc5e3083cf2b07611c4ef22d89c90b2f2cc [file] [log] [blame]
b.liu8f231a12024-05-31 17:55:06 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <pthread.h>
6#include <fcntl.h>
7#include <libubox/ustream.h>
8#include <libubus.h>
9#include <signal.h>
10#include <cutils/properties.h>
11
12#include "mbtk_type.h"
13#include "mbtk_log.h"
14#include "gnss_info.h"
15
16#include "gnss_6228.h"
b.liuf9fbfa12024-06-14 15:53:59 +080017#include "gnss_hd8122.h"
b.liu8f231a12024-05-31 17:55:06 +080018
19#define GNSS_DEBUG 1
b.liud0ba7152024-06-19 14:47:21 +080020#define GNSS_UBUS_ENABLE 1
b.liu8f231a12024-05-31 17:55:06 +080021
22#define GNSS_TAG "MBTK_GNSS"
23#define GNSS_BUFF_SIZE 2048
24#define MBTK_PROP_GNSS_LOG "persist.mbtk.gnss_log_enable"
25#define GNSS_PORT_PTY "/dev/tty_gnss_nmea"
26#define GNSS_PORT_USB_AT "/dev/ttyGS0"
27#define GNSS_PORT_USB_NMEA "/dev/ttymodem0"
28#define GNSS_PORT_UART_AT "/dev/ttyS1"
29
30#ifdef GNSS_DEBUG
31#define GNSS_NMEA_FILE_LOG "/tmp/mbtk_gnss_nmea.log"
32#define GNSS_NMEA_FILE_LOG_MAX 10485760 // 10MB
33
34#define GNSS_FILE_LOG "/tmp/mbtk_gnss.log"
35#define GNSS_FILE_LOG_MAX 10485760 // 10MB
36#endif
37
38gnss_info_t gnss_info;
39
b.liud0ba7152024-06-19 14:47:21 +080040#ifdef MBTK_GNSS_UBUS_ENABLE
b.liu8f231a12024-05-31 17:55:06 +080041struct ubus_context *gnss_ubus_init(void);
b.liu5f950c52024-06-15 20:13:12 +080042#else
43int gnss_ipc_service_start();
44#endif
45
b.liu8f231a12024-05-31 17:55:06 +080046int gnss_init_config(int fd);
47
b.liud0ba7152024-06-19 14:47:21 +080048static char nmea_buff[GNSS_BUFF_SIZE*2] = {0};
49static char data_buff[GNSS_BUFF_SIZE] = {0};
50static uint32 nmea_buff_len = 0;
51static uint32 data_buff_len = 0;
52
b.liu8f231a12024-05-31 17:55:06 +080053static bool nmea_found = FALSE;
54#ifdef GNSS_DEBUG
55static bool nmea_log_enable = FALSE;
56static int nmea_log_fd = -1;
57static int nmea_log_fd_len = 0;
58#endif
59static int gnss_pty_master_fd = -1;
60static int gnss_pty_slave_fd = -1;
61static int gnss_usb_at_port_fd = -1;
62static int gnss_usb_nmea_port_fd = -1;
63static int gnss_uart_at_port_fd = -1;
64static char *gnss_filter_info[] = {"RMC", "VTG", "GGA", "GSA", "GSV", "GLL", "ZDA", "GST", "TXT", "DHV", "DTM", NULL};
65
66static void help()
67{
b.liuf9fbfa12024-06-14 15:53:59 +080068 LOGD("mbtk_gnssd <6228/8122...> <gnss_dev> <0/1>");
b.liu8f231a12024-05-31 17:55:06 +080069}
70
71static int arg_check(int argc, char *argv[])
72{
73 if(argc != 4) {
74 goto check_fail;
75 }
76
b.liuf9fbfa12024-06-14 15:53:59 +080077 // Only support 6228/8122.
78 if(strcmp(argv[1], GNSS_ID_6228) && strcmp(argv[1], GNSS_ID_8122)) {
b.liu8f231a12024-05-31 17:55:06 +080079 goto check_fail;
80 }
81
82 if(access(argv[2], R_OK | W_OK)) {
83 goto check_fail;
84 }
85
86 if(strcmp(argv[3], "0") && strcmp(argv[3], "1")) {
87 goto check_fail;
88 }
89
90 return 0;
91check_fail:
92 help();
93 return -1;
94}
95
96static int gnss_ports_open(uint32 print_port)
97{
98 if(print_port & GNSS_PRINT_PORT_TTY_AT) {
99 if(gnss_pty_open(&gnss_pty_master_fd, &gnss_pty_slave_fd, GNSS_PORT_PTY)) {
100 return -1;
101 }
102 LOGD("Open PTY port success.");
103 }
104
105 if(print_port & GNSS_PRINT_PORT_USB_AT) {
106 if((gnss_usb_at_port_fd = gnss_port_open(GNSS_PORT_USB_AT, O_RDWR | O_NONBLOCK | O_NOCTTY, 115200, FALSE)) <= 0) {
107 return -1;
108 }
109 LOGD("Open USB AT port success.");
110 }
111
112 if(print_port & GNSS_PRINT_PORT_USB_NMEA) {
113 if((gnss_usb_nmea_port_fd = gnss_port_open(GNSS_PORT_USB_NMEA, O_RDWR | O_NONBLOCK | O_NOCTTY, 115200, FALSE)) <= 0) {
114 return -1;
115 }
116 LOGD("Open USB NMEA port success.");
117 }
118
119 if(print_port & GNSS_PRINT_PORT_UART1) {
120 if((gnss_uart_at_port_fd = gnss_port_open(GNSS_PORT_UART_AT, O_RDWR | O_NONBLOCK | O_NOCTTY, 115200, TRUE)) <= 0) {
121 return -1;
122 }
123 LOGD("Open UART AT port success.");
124 }
125
126 return 0;
127}
128
129static int gnss_ports_close()
130{
131 if(gnss_usb_at_port_fd > 0) {
132 close(gnss_usb_at_port_fd);
133 gnss_usb_at_port_fd = -1;
134 }
135
136 if(gnss_usb_nmea_port_fd > 0) {
137 close(gnss_usb_nmea_port_fd);
138 gnss_usb_nmea_port_fd = -1;
139 }
140
141 if(gnss_uart_at_port_fd > 0) {
142 close(gnss_uart_at_port_fd);
143 gnss_uart_at_port_fd = -1;
144 }
145
146 if(gnss_pty_master_fd > 0) {
147 close(gnss_pty_master_fd);
148 gnss_pty_master_fd = -1;
149 }
150
151 if(gnss_pty_slave_fd > 0) {
152 close(gnss_pty_slave_fd);
153 gnss_pty_slave_fd = -1;
154 unlink(GNSS_PORT_PTY);
155 }
156
157 return 0;
158}
159
160static void nmea_print(const char *nmea, int nmea_len)
161{
162#ifdef GNSS_DEBUG
163 if(nmea_log_enable){
164 if(nmea_log_fd_len > GNSS_NMEA_FILE_LOG_MAX) {
165 close(nmea_log_fd);
166 nmea_log_fd = open(GNSS_NMEA_FILE_LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
167 if(nmea_log_fd < 0) {
168 LOGE("Open debug fd fail.");
169 }
170 nmea_log_fd_len = 0;
171 }
172
173 if(nmea_log_fd > 0) {
174 write(nmea_log_fd, nmea, nmea_len);
175 nmea_log_fd_len += nmea_len;
176 }
177 }
178#endif
179
180 if(gnss_usb_at_port_fd > 0) {
181 write(gnss_usb_at_port_fd, nmea, nmea_len);
182 }
183
184 if(gnss_usb_nmea_port_fd > 0) {
185 write(gnss_usb_nmea_port_fd, nmea, nmea_len);
186 }
187
188 if(gnss_uart_at_port_fd > 0) {
189 write(gnss_uart_at_port_fd, nmea, nmea_len);
190 }
191
192 if(gnss_pty_master_fd > 0) {
193 write(gnss_pty_master_fd, nmea, nmea_len);
194 }
195}
196
197static unsigned char nmea_checksum(const char *nmea)
198{
199 const char *p = nmea;
200 unsigned char chs = 0;
201
202 while (*p == '$') // skip '$'
203 p++;
204 while (*p != '*' && *p != 0)
205 chs ^= *p++;
206
207 return chs;
208}
209
210static bool nmea_check(const char *nmea, int nmea_len)
211{
212 char **ptr = gnss_filter_info;
213 while(*ptr) {
214 if(strstr(nmea, *ptr)) {
215 break;
216 }
217 ptr++;
218 }
219
220 if(*ptr == NULL) {
221 LOGD("Unknown NMEA[%d]:%s", nmea_len, nmea);
222 return FALSE;
223 }
224
225 char *checksum_str = strstr(nmea, "*");
226 checksum_str++; // Jump '*'
227 char checksum_buf[3] = {0};
228 snprintf(checksum_buf, 3, "%02x", nmea_checksum(nmea));
229 if(strncasecmp(checksum_buf, checksum_str, 2)) {
230 LOGD("Checksum error[%d](checksum - %s):%s", nmea_len, checksum_buf, nmea);
231 return FALSE;
232 }
233
234 return TRUE;
235}
236
237static void gnss_nmea_process(const char *data, int data_len)
238{
239 char nmea[GNSS_BUFF_SIZE] = {0};
240 memcpy(nmea, data, data_len);
241
242 if(!nmea_check(nmea, data_len)) {
243 gnss_info.gnss_set_cb(nmea, data_len);
244 return;
245 }
246
247#ifdef GNSS_DEBUG
248 if(nmea_log_enable) {
249 LOGD("NMEA[%d]:%s", data_len, nmea);
250 }
251#endif
252
253 nmea_print(nmea, data_len);
254}
255
256#if 0
257static void gnss_cmd_rsp_process(const char *data, int data_len)
258{
259 char rsp[GNSS_BUFF_SIZE] = {0};
260 memcpy(rsp, data, data_len);
261 LOGD("RSP[%d]:%s", data_len, rsp);
262}
263#endif
264
265static bool nmea_char_check(char ch)
266{
267 if(isalnum(ch) || ch == '$' || ch == '\r' || ch == '\n' || ch == '.'
b.liud0ba7152024-06-19 14:47:21 +0800268 || ch == ',' || ch == '*' || ch == '\0' || ch == '/' || ch == '_')
b.liu8f231a12024-05-31 17:55:06 +0800269 return TRUE;
270
271 return FALSE;
272}
273
274static void gnss_data_process(const char *data, int data_len)
275{
276 if(gnss_info.state == GNSS_STATE_OPEN) {
277 LOGD("GNSS_OPEN[%d]:%s", data_len, data);
278 } else if(gnss_info.state == GNSS_STATE_DOWNLOAD) {
279 // LOGD("GNSS_DL[%d]:%s", data_len, data);
280 gnss_info.gnss_dl_read_cb(data, data_len);
281 } else if(gnss_info.state == GNSS_STATE_READY) {
282 int index = 0;
283 while(index < data_len) {
284 if(nmea_found) {
285 if(!nmea_char_check(data[index])) {
b.liud0ba7152024-06-19 14:47:21 +0800286 // Copy nmea_buff to data_buff
287 // Start with '$', but not nmea data, so copy to data_buff.
288 memcpy(data_buff + data_buff_len, nmea_buff, nmea_buff_len);
289 data_buff_len += nmea_buff_len;
290 data_buff[data_buff_len++] = data[index];
291
292 nmea_buff_len = 0;
b.liu8f231a12024-05-31 17:55:06 +0800293 nmea_found = FALSE;
b.liu8f231a12024-05-31 17:55:06 +0800294 continue;
295 }
296
297 if(data[index] != '\0') {
b.liud0ba7152024-06-19 14:47:21 +0800298 nmea_buff[nmea_buff_len++] = data[index];
299 if(nmea_buff[nmea_buff_len - 1] == '\n') {
300 if(data_buff_len > 0) {
301 gnss_info.gnss_set_cb(data_buff, data_buff_len);
302 data_buff_len = 0;
b.liu8f231a12024-05-31 17:55:06 +0800303 }
304
b.liud0ba7152024-06-19 14:47:21 +0800305 if(nmea_buff_len > 6 && nmea_buff[nmea_buff_len - 5] == '*') { // $XXX*YY\r\n
306 gnss_nmea_process(nmea_buff, nmea_buff_len);
307 }
308
309 nmea_buff_len = 0;
b.liu8f231a12024-05-31 17:55:06 +0800310 nmea_found = FALSE;
311 }
312 }
313 } else {
314 if(data[index] == '$') {
b.liud0ba7152024-06-19 14:47:21 +0800315 nmea_buff_len = 0;
b.liu8f231a12024-05-31 17:55:06 +0800316 nmea_found = TRUE;
b.liud0ba7152024-06-19 14:47:21 +0800317 nmea_buff[nmea_buff_len++] = data[index];
318 } else {
319 data_buff[data_buff_len++] = data[index];
b.liu8f231a12024-05-31 17:55:06 +0800320 }
321 }
322 index++;
323 }
324 } else {
325 LOGW("Unknown state : %d", gnss_info.state);
326 }
327}
328
329void* gnss_read_pthread(void* arg)
330{
331 LOGD("gnss_read_pthread enter.");
332 char buffer[GNSS_BUFF_SIZE];
333 int len = 0;
334 int ret = 0;
335 fd_set fdr, fdw;
336 int fd_max = 0;
337
338 FD_ZERO(&fdw);
339 FD_ZERO(&fdr);
340 FD_SET(gnss_info.fd, &fdr);
341 fd_max = (gnss_info.fd > fd_max) ? gnss_info.fd : fd_max;
342 FD_SET(gnss_info.exit_fd[0], &fdr);
343 fd_max = (gnss_info.exit_fd[0] > fd_max) ? gnss_info.exit_fd[0] : fd_max;
b.liud0ba7152024-06-19 14:47:21 +0800344 memset(nmea_buff, 0, sizeof(nmea_buff));
345 memset(data_buff, 0, sizeof(data_buff));
346 nmea_buff_len = 0;
347 data_buff_len = 0;
b.liu8f231a12024-05-31 17:55:06 +0800348#if GNSS_DEBUG
349 int debug_fd = -1;
350 int debug_fd_len = 0;
351 if(nmea_log_enable) {
352 debug_fd = open(GNSS_FILE_LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
353 if(debug_fd < 0) {
354 LOGE("Open debug fd fail.");
355 }
356 nmea_log_fd = open(GNSS_NMEA_FILE_LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
357 if(nmea_log_fd < 0) {
358 LOGE("Open nmea fd fail.");
359 }
360 nmea_log_fd_len = 0;
361 }
362#endif
363
364 while(gnss_info.state >= GNSS_STATE_OPEN) {
365 ret = select(fd_max + 1, &fdr, &fdw, 0, NULL);
366 //LOGD("select - %d", ret);
367 if (ret < 0)
368 {
369 if (errno == EINTR)
370 {
371 continue;
372 }
373 LOGE("select error, errno = %d (%s)", errno, strerror(errno));
374 break;
375 }
376 else if (ret == 0)
377 {
378 LOGE("select ret == 0");
379 break;
380 }
381
382 if (FD_ISSET(gnss_info.fd, &fdr))
383 {
384 memset(buffer, 0, GNSS_BUFF_SIZE);
385 len = read(gnss_info.fd, buffer, GNSS_BUFF_SIZE);
386 if(len > 0) {
387 //log_hex("READ", buffer, len);
388
389#if GNSS_DEBUG
390 if(nmea_log_enable){
391 if(debug_fd_len > GNSS_FILE_LOG_MAX) {
392 close(debug_fd);
393 debug_fd = open(GNSS_FILE_LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
394 if(debug_fd < 0) {
395 LOGE("Open debug fd fail.");
396 }
397 debug_fd_len = 0;
398 }
399
400 if(debug_fd > 0) {
401 write(debug_fd, buffer, len);
402 debug_fd_len += len;
403 }
404 }
405#endif
406
407 gnss_data_process(buffer, len);
408
409 } else if(len ==0 ){
410 LOGE("Read end : len = 0");
411 break;
412 } else {
413 if(EAGAIN == errno) {
414 usleep(50000);
415 continue;
416 } else {
417 LOGD("Read ret = -1 ,errno = %d", errno);
418 break;
419 }
420 }
421 }
422 else if (FD_ISSET(gnss_info.exit_fd[0], &fdr))
423 {
424 memset(buffer, 0, GNSS_BUFF_SIZE);
425 len = read(gnss_info.fd, buffer, GNSS_BUFF_SIZE);
426 if(len > 0) {
427 if(strcmp(buffer, "exit") == 0) {
428 LOGD("Get thread exit message.");
429 break;
430 }
431 }
432 }
433 else
434 {
435 LOGW("Unknown select event.");
436 continue;
437 }
438 }
439
440#if GNSS_DEBUG
441 if(debug_fd > 0) {
442 close(debug_fd);
443 debug_fd = -1;
444 }
445 if(nmea_log_fd > 0) {
446 close(nmea_log_fd);
447 nmea_log_fd = -1;
448 }
449#endif
450
451 gnss_info.state = GNSS_STATE_CLOSE;
452 LOGD("gnss_read_pthread exit.");
453 return NULL;
454}
455
456#if 0
457int gnss_write(int fd, const void *data, int data_len)
458{
459 int count = 0;
460 int len = 0;
461 while(1)
462 {
463 len = write(fd, data + count, data_len - count);
464 if (len > 0)
465 {
466 count += len;
467 }
468 else
469 {
470 LOGE("write() fail,ret = %d,errno = %d", len, errno);
471 break;
472 }
473
474 if (count == data_len)
475 break;
476 }
477
478 return count;
479}
480#else
481int gnss_write(int fd, const void* buf, unsigned int buf_len)
482{
483 size_t size;
484 size_t size_to_wr;
485 ssize_t size_written;
486 if(GNSS_BUFF_SIZE < buf_len)
487 {
488 return -1;
489 }
490 for(size = 0; size < buf_len;)
491 {
492 size_to_wr = buf_len - size;
493 if( size_to_wr > GNSS_BUFF_SIZE)
494 size_to_wr = GNSS_BUFF_SIZE;
495
496 size_written = write(fd, &buf[size], size_to_wr);
497 if (size_written==-1)
498 {
499 return -1;
500 }
501 size += size_written;
502 if(size_written != size_to_wr)
503 {
504 return size;
505 }
506 }
507 // LOGD("SEND %d / %d", size, buf_len);
508 return size;
509}
510#endif
511
512int gnss_init(uint32 print_port)
513{
514 if(gnss_info.state != GNSS_STATE_CLOSE) {
515 LOGW("GNSS not close:%d", gnss_info.state);
516 return 0;
517 }
518
519 int ret = 0;
520
521 gnss_info.fd = gnss_info.gnss_open(gnss_info.dev_name);
522 if(gnss_info.fd <= 0) {
523 LOGE("gnss_open(%s) fail : %d", gnss_info.dev_name, gnss_info.fd);
524 gnss_info.state = GNSS_STATE_CLOSE;
525 return -1;
526 }
527 if(pipe(gnss_info.exit_fd)) {
528 LOGE("pipe() fail[%d].", errno);
529 return -1;
530 }
531 // GNSS is opened.
532 gnss_info.state = GNSS_STATE_OPEN;
533
534 #if 0
535 // Start gnss read thread.
536 pthread_attr_t thread_attr;
537 pthread_attr_init(&thread_attr);
538 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
539 {
540 LOGE("pthread_attr_setdetachstate() fail.");
541 goto main_exit;
542 }
543
544 if(pthread_create(&gnss_info.read_pid, &thread_attr, gnss_read_pthread, NULL))
545#else
546 if(pthread_create(&gnss_info.read_pid, NULL, gnss_read_pthread, NULL))
547#endif
548 {
549 LOGE("pthread_create() fail.");
550 goto exit_with_close;
551 }
552
553 ret = gnss_info.gnss_dev_open();
554 if(ret) {
555 LOGE("gnss_dev_open() fail : %d", ret);
556 goto exit_with_thread_exit;
557 }
558
559 if(gnss_info.auto_dl_fw) {
560 gnss_info.state = GNSS_STATE_DOWNLOAD;
561 ret = gnss_info.gnss_fw_dl(gnss_info.fd);
562 if(ret) {
563 LOGE("gnss_fw_dl() fail : %d", ret);
564 goto exit_with_dev_close;
565 }
566 }
567
568 // GNSS is ready, NMEA can print from uart.
569 gnss_info.state = GNSS_STATE_READY;
570 gnss_info.print_port = print_port;
571
572 LOGD("GNSS open success.");
573
574 return gnss_ports_open(gnss_info.print_port);
575
576exit_with_dev_close:
577 if(gnss_info.gnss_dev_close()) {
578 LOGE("gnss_dev_close() fail.");
579 }
580exit_with_thread_exit:
581 gnss_info.state = GNSS_STATE_CLOSING;
582 // Wait for read thread exit.
583 ret = pthread_join(gnss_info.read_pid, NULL);
584 if(ret){
585 LOGE("pthrad_join fail(%d)",ret);
586 }
587exit_with_close:
588 if(gnss_info.gnss_close(gnss_info.fd)) {
589 LOGE("gnss_close() fail.");
590 }
591 if(gnss_info.exit_fd[0] > 0) {
592 close(gnss_info.exit_fd[0]);
593 gnss_info.exit_fd[0] = -1;
594 }
595 if(gnss_info.exit_fd[1] > 0) {
596 close(gnss_info.exit_fd[1]);
597 gnss_info.exit_fd[1] = -1;
598 }
599 gnss_info.state = GNSS_STATE_CLOSE;
600 return -1;
601}
602
603int gnss_deinit()
604{
605 if(gnss_info.state == GNSS_STATE_CLOSE) {
606 LOGW("GNSS is closed.");
607 return 0;
608 } else if(gnss_info.state == GNSS_STATE_CLOSING) {
609 LOGW("GNSS is closing...");
610 return -1;
611 } else if(gnss_info.state == GNSS_STATE_DOWNLOAD) {
612 LOGW("GNSS is downloading...");
613 return -1;
614 }
615
616 // Wait for read thread exit.
617 if(gnss_info.exit_fd[1] > 0) {
618 write(gnss_info.exit_fd[1], "exit", 4);
619 }
620
621 gnss_info.state = GNSS_STATE_CLOSING;
622 int ret = pthread_join(gnss_info.read_pid, NULL);
623 if(ret){
624 LOGE("pthrad_join fail(%d)",ret);
625 return -1;
626 }
627
628 if(gnss_info.gnss_close(gnss_info.fd)) {
629 LOGE("gnss_close() fail.");
630 return -1;
631 }
632
633 if(gnss_info.gnss_dev_close()) {
634 LOGE("gnss_dev_close() fail.");
635 return -1;
636 }
637
638 if(gnss_ports_close()) {
639 LOGE("gnss_ports_close fail.");
640 return -1;
641 }
642
b.liud0ba7152024-06-19 14:47:21 +0800643 LOGD("gnss_ports_close() complete.");
644
b.liu8f231a12024-05-31 17:55:06 +0800645 gnss_info.fd = -1;
646 if(gnss_info.exit_fd[0] > 0) {
647 close(gnss_info.exit_fd[0]);
648 gnss_info.exit_fd[0] = -1;
649 }
650 if(gnss_info.exit_fd[1] > 0) {
651 close(gnss_info.exit_fd[1]);
652 gnss_info.exit_fd[1] = -1;
653 }
654 gnss_info.state = GNSS_STATE_CLOSE;
655 LOGD("GNSS close success.");
656 return 0;
657}
658
659int gnss_set(const void* buf, unsigned int buf_len, void *cmd_rsp, int cmd_rsp_len)
660{
b.liud0ba7152024-06-19 14:47:21 +0800661 if(buf && buf_len > 0) {
662 if(cmd_rsp && cmd_rsp_len > 0) {
663 memset(cmd_rsp, 0, cmd_rsp_len);
664 }
b.liu8f231a12024-05-31 17:55:06 +0800665 return gnss_info.gnss_set(gnss_info.fd, buf, cmd_rsp, cmd_rsp_len);
666 } else {
667 return -1;
668 }
669}
670
671static void sig_process(int sig)
672{
673 LOGI("I got signal %d\n", sig);
674 if(gnss_deinit()) {
675 LOGE("gnss_deinit() fail, no exist...");
676 return;
677 }
678
679 switch(sig)
680 {
681 case SIGINT: // Ctrl + C
682 {
683 LOGI("Exit by SIGINT.\n");
684 exit(0);
685 }
686 case SIGQUIT: // Ctrl + \ (ÀàËÆ SIGINT £¬µ«Òª²úÉúcoreÎļþ)
687 {
688 LOGI("Exit by SIGQUIT.\n");
689 exit(0);
690 }
691 case SIGTERM:// ĬÈÏkill (ͬ SIGKILL £¬µ« SIGKILL ²»¿É²¶»ñ)
692 {
693 LOGI("Exit by SIGTERM.\n");
694 exit(0);
695 }
696 case SIGTSTP:// Ctrl + Z (ͬ SIGSTOP £¬µ« SIGSTOP ²»¿É²¶»ñ)
697 {
698 LOGI("Exit by SIGTSTP.\n");
699 exit(0);
700 }
701 case SIGSEGV: // Èç¿ÕÖ¸Õë
702 {
703 LOGI("Exit by SIGSEGV.\n");
704 exit(0);
705 }
706 default:
707 {
708 LOGI("Unknown sig:%d\n",sig);
709 break;
710 }
711 }
712}
713
714
715// mbtk_gnssd 6228 /dev/ttyS2 baud 0/1
716int main(int argc, char *argv[])
717{
718 mbtk_log_init("radio", GNSS_TAG);
719
b.liubb590492024-06-13 16:42:08 +0800720#ifdef MBTK_DUMP_SUPPORT
721 mbtk_debug_open(NULL, TRUE);
722#endif
723
b.liu8f231a12024-05-31 17:55:06 +0800724 signal(SIGINT, sig_process);
725 signal(SIGQUIT, sig_process);
726 signal(SIGTERM, sig_process);
727
728 if(arg_check(argc, argv)) {
729 return -1;
730 }
731
732#ifdef GNSS_DEBUG
733 char buff[10];
734 memset(buff, 0, 10);
735 property_get(MBTK_PROP_GNSS_LOG, buff, "");
736 if(strlen(buff) > 0 && atoi(buff) > 0) {
737 nmea_log_enable = TRUE;
738 }
739#endif
740
741 memset(&gnss_info, 0, sizeof(gnss_info_t));
742 memcpy(gnss_info.dev_name, argv[2], strlen(argv[2]));
743 gnss_info.state = GNSS_STATE_CLOSE;
744 if(!strcmp(argv[1], GNSS_ID_6228)) {
745 gnss_info.gnss_id = GNSS_TYPE_6228;
746 gnss_info.auto_open = (bool)atoi(argv[3]);
747 gnss_info.auto_dl_fw = TRUE;
748 gnss_info.gnss_dev_open = gnss_6228_dev_open;
749 gnss_info.gnss_dev_close = gnss_6228_dev_close;
750 gnss_info.gnss_open = gnss_6228_open;
751 gnss_info.gnss_close = gnss_6228_close;
752 gnss_info.gnss_fw_dl = gnss_6228_fw_dl;
753 gnss_info.gnss_dl_read_cb = gnss_6228_dl_read_cb;
754 gnss_info.gnss_set = gnss_6228_set;
755 gnss_info.gnss_set_cb = gnss_6228_set_cb;
b.liuf9fbfa12024-06-14 15:53:59 +0800756 } else if(!strcmp(argv[1], GNSS_ID_8122)) {
757 gnss_info.gnss_id = GNSS_TYPE_8122;
758 gnss_info.auto_open = (bool)atoi(argv[3]);
759 gnss_info.auto_dl_fw = FALSE;
760 gnss_info.gnss_dev_open = gnss_8122_dev_open;
761 gnss_info.gnss_dev_close = gnss_8122_dev_close;
762 gnss_info.gnss_open = gnss_8122_open;
763 gnss_info.gnss_close = gnss_8122_close;
764 gnss_info.gnss_fw_dl = gnss_8122_fw_dl;
765 gnss_info.gnss_dl_read_cb = NULL;
766 gnss_info.gnss_set = gnss_8122_set;
b.liu5f950c52024-06-15 20:13:12 +0800767 gnss_info.gnss_set_cb = gnss_8122_set_cb;
b.liu8f231a12024-05-31 17:55:06 +0800768 } else {
769 LOGE("No support : %s", argv[1]);
770 return -1;
771 }
772
773 LOGD("GNSS : %s, Device: %s", argv[1], gnss_info.dev_name);
774 // Auto open gnss.
775 if(gnss_info.auto_open) {
776 if(gnss_init(0)) { // No print to any port.
777 LOGE("gnss_init() fail.");
778 return -1;
779 }
780 }
781
782 // Init ubus and waitting IPC commands.
b.liud0ba7152024-06-19 14:47:21 +0800783#ifdef MBTK_GNSS_UBUS_ENABLE
b.liu8f231a12024-05-31 17:55:06 +0800784 if(gnss_ubus_init()) {
785 LOGD("main() run...");
786 uloop_run();
787 } else {
788 LOGE("gnss_ubus_init() fail.");
789 }
b.liu5f950c52024-06-15 20:13:12 +0800790#else
791 if(!gnss_ipc_service_start()) {
792 LOGD("main() run...");
793 while(1) {
794 sleep(24 * 60 * 60);
795 }
796 } else {
797 LOGE("gnss_ipc_service_start() fail.");
798 }
799#endif
b.liu8f231a12024-05-31 17:55:06 +0800800
801 LOGD("main() exit.");
802 return 0;
803}