blob: 51e586a8a44714b01c88b3088ba2f32734a352a1 [file] [log] [blame]
wangyouqiang3d09b4d2024-01-04 13:50:51 +08001#include <time.h>
wangyouqiang75b6cfd2024-05-31 14:25:45 +08002#include <pthread.h>
3
b.liu4e243dc2023-11-27 11:20:00 +08004#include "lynq_gnss.h"
wangyouqiang3d09b4d2024-01-04 13:50:51 +08005#include "mbtk_gnss_5311.h"
liubin281ac462023-07-19 14:22:54 +08006
wangyouqiang7d66fb12024-01-26 19:19:00 +08007#define QSER_LEN_MAX 128
8
wangyouqiang3d09b4d2024-01-04 13:50:51 +08009#define QSER_RESULT_SUCCESS 0
10#define QSER_RESULT_FAIL -1
11
12/**********************************VARIABLE***********************************/
wangyouqiang7d66fb12024-01-26 19:19:00 +080013typedef struct
14{
15 char host[QSER_LEN_MAX];
16 char id[QSER_LEN_MAX];
17 char passwd[QSER_LEN_MAX];
18}qser_gnss_info;
19
wangyouqiang3d09b4d2024-01-04 13:50:51 +080020static bool inited = FALSE;
21static int qser_info_handle_num = 0;
wangyouqiang75b6cfd2024-05-31 14:25:45 +080022static uint32_t qser_h_sim = 0x5F6F7F8F;
wangyouqiang3d09b4d2024-01-04 13:50:51 +080023gnss_handler_func_t qser_gnss_callback = NULL;
24e_msg_id_t qser_gnss_msg_type = E_MT_LOC_MSG_ID_NMEA_INFO;
25static time_t qser_gnss_time = 0;
wangyouqiang7d66fb12024-01-26 19:19:00 +080026qser_gnss_info qser_agps_info_save = {0};
wangyouqiang75b6cfd2024-05-31 14:25:45 +080027gnss_async_func_t qser_gnss_async_callback = NULL;
wangyouqiang3d09b4d2024-01-04 13:50:51 +080028
29extern long timezone;
30/**********************************VARIABLE***********************************/
31
32/**********************************FUNC***********************************/
wangyouqiang75b6cfd2024-05-31 14:25:45 +080033static void qser_gnss_async_set_cb(gnss_async_func_t cb)
34{
35 qser_gnss_async_callback = cb;
36}
37
38static gnss_async_func_t qser_gnss_async_get_cb(void)
39{
40 return qser_gnss_async_callback;
41}
42
43
wangyouqiang3d09b4d2024-01-04 13:50:51 +080044static time_t qser_get_timestamp(char *time)
45{
46 char tmp_char[4] = {0};
47 struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));
48
49 memset(tmp_time, 0, sizeof(struct tm));
50 memset(tmp_char, 0, sizeof(tmp_char));
51 memcpy(tmp_char, &time[4], 2);
52 tmp_time->tm_sec = atoi(tmp_char);
53 memcpy(tmp_char, &time[2], 2);
54 tmp_time->tm_min = atoi(tmp_char);
55 memcpy(tmp_char, &time[0], 2);
56 tmp_time->tm_hour = atoi(tmp_char);
57 memcpy(tmp_char, &time[6], 2);
58 tmp_time->tm_mday = atoi(tmp_char);
59 memcpy(tmp_char, &time[8], 2);
60 tmp_time->tm_mon = atoi(tmp_char) - 1;
61 memcpy(tmp_char, &time[10], 2);
62 tmp_time->tm_year = 100 + atoi(tmp_char);
63
64 time_t _t = mktime(tmp_time);//按当地时区解析tmp_time
65 //gnss_log("timestamp: %ld\n",_t);
66 tzset(); // 自动设置本地时区
67 _t = _t - timezone;
68 //gnss_log("timestamp: %ld\n",_t);
69
70 free(tmp_time);
71 return _t;
72}
73
74static time_t qser_get_gnss_time_sec(void *data, int data_len)
75{
76 int i = 0, num = 0;
77 char *nmea = (char *)data;
78 char time[15] = {0};
79 char *check_state = NULL;
80
81 //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
82 check_state = strstr(nmea, "RMC");
83 if(check_state != NULL)
84 {
85 for(i = 0; i < data_len; i++)
86 {
87 if(check_state[i] == ',')
88 {
89 num++;
90 i++;
wangyouqiange039fe32024-01-04 16:02:42 +080091 if(num == 1)//get time
wangyouqiang3d09b4d2024-01-04 13:50:51 +080092 {
wangyouqiange039fe32024-01-04 16:02:42 +080093 if(check_state[i] >= '0' && check_state[i] <= '9')
94 {
95 memcpy(time, check_state + i, 6);
96 //LOGE("[qser_gnss] %s.", time);
wangyouqiange039fe32024-01-04 16:02:42 +080097 }
98 else
99 {
100 qser_gnss_time = 0;
101 return qser_gnss_time;
102 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800103 }
wangyouqiange039fe32024-01-04 16:02:42 +0800104 else if(num == 9)//get date
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800105 {
wangyouqiange039fe32024-01-04 16:02:42 +0800106 if(check_state[i] >= '0' && check_state[i] <= '9')
107 {
108 memcpy(time + 6, check_state + i, 6);
109 //LOGE("[qser_gnss] %s.", time);
110 break;
111 }
112 else
113 {
114 qser_gnss_time = 0;
115 return qser_gnss_time;
116 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800117 }
wangyouqiange039fe32024-01-04 16:02:42 +0800118 else if(num > 9)
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800119 {
120 qser_gnss_time = 0;
121 return qser_gnss_time;
122 }
123 }
124 }
125
126 qser_gnss_time = qser_get_timestamp(time);
127 }
128
129 return qser_gnss_time;
130}
131
132static void qser_gnss_msg_cb(void *data, int data_len)
133{
134 if(data == NULL || data_len <= 0)
135 {
136 LOGE("[qser_gnss] data is NULL.");
137 return;
138 }
139
140 if(qser_gnss_callback == NULL)
141 {
142 //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
143 return;
144 }
145
146 if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_NMEA_INFO)
147 {
148 mopen_gnss_nmea_info_t qser_nmea = {0};
149 memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
150 qser_nmea.length = data_len;
151 memcpy(qser_nmea.nmea, (char *)data, data_len);
152 qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
153
154 if(qser_gnss_callback != NULL)
155 {
156 qser_gnss_callback(NULL, qser_gnss_msg_type, (void *)(&qser_nmea), NULL);
157 }
158 }
159 else if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_LOCATION_INFO)
160 {
161 //NOT USE
162 }
163 else
164 {
165 //UNKNOWN
166 }
167}
wangyouqiang75b6cfd2024-05-31 14:25:45 +0800168
169static void* gnss_async_thread(void* arg)
170{
171 qser_gnss_error_e state = QSER_GNSS_ERROR_SUCCESS;
172 gnss_async_func_t cb = qser_gnss_async_get_cb();
173 int ret = qser_Gnss_Start(qser_h_sim);
174 if(ret != QSER_RESULT_SUCCESS)
175 {
176 LOGE("[qser_gnss] gnss_async_thread() fail.");
177 state = QSER_GNSS_ERROR_FAIL;
178 }
179
180 if(cb != NULL)
181 {
182 cb(state);
183 }
184 return NULL;
185}
186
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800187/**********************************FUNC***********************************/
188
189/**********************************API***********************************/
b.liu4e243dc2023-11-27 11:20:00 +0800190int qser_Gnss_Init (uint32_t *h_gnss)
liubin281ac462023-07-19 14:22:54 +0800191{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800192 //UNUSED(h_gnss);
193 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800194
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800195 if(!inited)
196 {
197 ret = mbtk_gnss_init();
198 if(ret == MBTK_GNSS_RESULT_SUCCESS)
199 {
200 qser_info_handle_num++;
201 inited = TRUE;
202 }
203 else
204 {
205 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
206 return QSER_RESULT_FAIL;
207 }
208 }
209 else
210 {
211 qser_info_handle_num++;
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800212 }
213 *h_gnss = qser_h_sim;
liubin281ac462023-07-19 14:22:54 +0800214
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800215 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800216}
217
b.liu4e243dc2023-11-27 11:20:00 +0800218int qser_Gnss_Deinit (uint32_t h_gnss)
liubin281ac462023-07-19 14:22:54 +0800219{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800220 //UNUSED(h_gnss);
221 if(h_gnss != qser_h_sim)
222 {
223 LOGE("[qser_gnss] h_sim is error.");
224 return QSER_RESULT_FAIL;
225 }
226
227 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800228
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800229 if(qser_info_handle_num == 1)
230 {
231 ret = mbtk_gnss_deinit();
232 if(ret == MBTK_GNSS_RESULT_SUCCESS)
233 {
234 qser_info_handle_num = 0;
235 inited = FALSE;
236 }
237 else
238 {
239 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
240 return QSER_RESULT_FAIL;
241 }
242 }
243 else
244 {
245 qser_info_handle_num--;
246 }
liubin281ac462023-07-19 14:22:54 +0800247
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800248 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800249}
b.liu5fa9e772023-11-23 18:00:55 +0800250
b.liu4e243dc2023-11-27 11:20:00 +0800251int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
252{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800253 //UNUSED(handler_ptr);
254 //UNUSED(h_gnss);
255 if(h_gnss != qser_h_sim)
256 {
257 LOGE("[qser_gnss] h_sim is error.");
258 return QSER_RESULT_FAIL;
259 }
b.liu4e243dc2023-11-27 11:20:00 +0800260
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800261 if(handler_ptr == NULL)
262 {
263 LOGE("[qser_gnss] handler_ptr is NULL.");
264 return QSER_RESULT_FAIL;
265 }
266 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
267
268 qser_gnss_callback = handler_ptr;
269 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800270}
271
b.liu4e243dc2023-11-27 11:20:00 +0800272int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
273{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800274 //UNUSED(h_gnss);
275 //UNUSED(type);
276 if(h_gnss != qser_h_sim)
277 {
278 LOGE("[qser_gnss] h_sim is error.");
279 return QSER_RESULT_FAIL;
280 }
b.liu4e243dc2023-11-27 11:20:00 +0800281
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800282 qser_gnss_msg_type = type;
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800283 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800284}
285
wangyouqiang75b6cfd2024-05-31 14:25:45 +0800286int qser_Gnss_Set_Async_Callback(gnss_async_func_t cb)
287{
288 qser_gnss_async_set_cb(cb);
289 return QSER_RESULT_SUCCESS;
290}
291
b.liu4e243dc2023-11-27 11:20:00 +0800292int qser_Gnss_Start (uint32_t h_gnss)
293{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800294 //UNUSED(h_gnss);
295 if(h_gnss != qser_h_sim)
296 {
297 LOGE("[qser_gnss] h_sim is error.");
298 return QSER_RESULT_FAIL;
299 }
b.liu4e243dc2023-11-27 11:20:00 +0800300
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800301 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
wangyouqiang7d66fb12024-01-26 19:19:00 +0800302
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800303 ret = mbtk_gnss_add_nmea_out_func(qser_gnss_msg_cb);
304 if(ret != MBTK_GNSS_RESULT_SUCCESS)
305 {
306 LOGE("[qser_gnss] mbtk_gnss_add_nmea_out_func fail.");
307 return QSER_RESULT_FAIL;
308 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800309 ret = mbtk_gnss_open();
310 if(ret != MBTK_GNSS_RESULT_SUCCESS)
311 {
312 LOGE("[qser_gnss] mbtk_gnss_open is error.");
313 return QSER_RESULT_FAIL;
314 }
315
316 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800317}
318
wangyouqiang75b6cfd2024-05-31 14:25:45 +0800319int qser_Gnss_Start_Async(uint32_t h_gnss)
320{
321 //UNUSED(h_gnss);
322 if(h_gnss != qser_h_sim)
323 {
324 LOGE("[qser_gnss] h_sim is error.");
325 return QSER_RESULT_FAIL;
326 }
327
328 pthread_attr_t thread_attr;
329 pthread_t gnss_thread_id;
330 pthread_attr_init(&thread_attr);
331 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
332 {
333 LOGE("[qser_gnss] pthread_attr_setdetachstate() fail.");
334 return QSER_RESULT_FAIL;
335 }
336
337 //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
338 if(pthread_create(&gnss_thread_id, &thread_attr, gnss_async_thread, NULL))
339 {
340 LOGE("[qser_gnss] pthread_create() fail.");
341 return QSER_RESULT_FAIL;
342 }
343 pthread_attr_destroy(&thread_attr);
344
345 return QSER_RESULT_SUCCESS;
346}
347
348
b.liu4e243dc2023-11-27 11:20:00 +0800349int qser_Gnss_Stop (uint32_t h_gnss)
350{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800351 //UNUSED(h_gnss);
352 if(h_gnss != qser_h_sim)
353 {
354 LOGE("[qser_gnss] h_sim is error.");
355 return QSER_RESULT_FAIL;
356 }
b.liu4e243dc2023-11-27 11:20:00 +0800357
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800358 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
359 ret = mbtk_gnss_close();
360 if(ret != MBTK_GNSS_RESULT_SUCCESS)
361 {
362 LOGE("[qser_gnss] mbtk_gnss_close is error.");
363 return QSER_RESULT_FAIL;
364 }
365
366 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800367}
368
369int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
370{
371 UNUSED(h_gnss);
372 UNUSED(time_info);
373
374 return 0;
375}
376
377int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
378{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800379 //UNUSED(h_gnss);
380 //UNUSED(flags);
381
382 if(h_gnss != qser_h_sim)
383 {
384 LOGE("[qser_gnss] h_sim is error.");
385 return QSER_RESULT_FAIL;
386 }
b.liu4e243dc2023-11-27 11:20:00 +0800387
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800388 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
389 char param_buf[32] = {0};
390 int length = 0;
391
392 switch(flags)
393 {
394 case DELETE_NOTHING:
395 {
396 memcpy(param_buf, "RESET,1", strlen("RESET,1"));
397 break;
398 }
399 case DELETE_EPHEMERIS:
400 case DELETE_ALMANAC:
401 case DELETE_POSITION_TIME:
402 case DELETE_UTC:
403 {
404 memcpy(param_buf, "RESET,2", strlen("RESET,2"));
405 break;
406 }
407 case DELETE_ALL:
408 {
409 memcpy(param_buf, "RESET,3", strlen("RESET,3"));
410 break;
411 }
412 default:
413 {
414 LOGE("[qser_gnss] flags UNKOWN.");
415 return QSER_RESULT_FAIL;
416 }
417 }
418
419 length = strlen(param_buf);
420 ret = mbtk_gnss_param_config(param_buf, length);
421 if(ret != MBTK_GNSS_RESULT_SUCCESS)
422 {
423 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
424 return QSER_RESULT_FAIL;
425 }
426 return QSER_RESULT_SUCCESS;
427}
428
429int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
430{
wangyouqiang7d66fb12024-01-26 19:19:00 +0800431 //UNUSED(host);
432 //UNUSED(id);
433 //UNUSED(password);
434
435 if(host != NULL)
436 {
437 memcpy(qser_agps_info_save.host, host, QSER_LEN_MAX);
438 }
439
440 if(id != NULL)
441 {
442 memcpy(qser_agps_info_save.id, id, QSER_LEN_MAX);
443 }
444
445 if(password != NULL)
446 {
447 memcpy(qser_agps_info_save.passwd, password, QSER_LEN_MAX);
448 }
449 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800450}
451
452int qser_Gnss_download_tle()
b.liu5fa9e772023-11-23 18:00:55 +0800453{
wangyouqiang7d66fb12024-01-26 19:19:00 +0800454 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
455 char host[128] = {0};
456 ret = mbtk_gnss_5311_download_tle(host, 0);
457 if(ret != MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS)
458 {
459 LOGE("[qser_gnss] mbtk_gnss_5311_download_tle is error.");
460 return QSER_RESULT_FAIL;
461 }
462 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800463}
464
b.liu4e243dc2023-11-27 11:20:00 +0800465int qser_Gnss_injectEphemeris(uint32_t h_gnss)
b.liu5fa9e772023-11-23 18:00:55 +0800466{
wangyouqiang7d66fb12024-01-26 19:19:00 +0800467 //UNUSED(h_gnss);
b.liu5fa9e772023-11-23 18:00:55 +0800468
wangyouqiang7d66fb12024-01-26 19:19:00 +0800469 if(h_gnss != qser_h_sim)
470 {
471 LOGE("[qser_gnss] h_sim is error.");
472 return QSER_RESULT_FAIL;
473 }
474
475 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
476 ret = mbtk_gnss_injectEphemeris();
477 if(ret != MBTK_GNSS_RESULT_SEND_SUCCESS)
478 {
479 LOGE("[qser_gnss] mbtk_gnss_injectEphemeris is error.");
480 return QSER_RESULT_FAIL;
481 }
482 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800483}
484
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800485int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
486{
487 //UNUSED(h_gnss);
488 //UNUSED(frequency);
489
490 if(h_gnss != qser_h_sim)
491 {
492 LOGE("[qser_gnss] h_sim is error.");
493 return QSER_RESULT_FAIL;
494 }
495
496 if(frequency != 1 && frequency != 2 && frequency != 5)
497 {
498 LOGE("[qser_gnss] frequency out of range.");
499 return QSER_RESULT_FAIL;
500 }
501
502 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
503 char param_buf[32] = {0};
504 int length = 0;
505 length = snprintf(param_buf, 32, "NAVISYSCFG,7,%d", frequency);
506 ret = mbtk_gnss_param_config(param_buf, length);
507 if(ret != MBTK_GNSS_RESULT_SUCCESS)
508 {
509 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
510 return QSER_RESULT_FAIL;
511 }
512 return QSER_RESULT_SUCCESS;
513}
514/**********************************API***********************************/
515
516