blob: bd910b25cd7acd21f68fef55a06b2dcdd1102620 [file] [log] [blame]
wangyouqiang3d09b4d2024-01-04 13:50:51 +08001#include <time.h>
b.liu4e243dc2023-11-27 11:20:00 +08002#include "lynq_gnss.h"
wangyouqiang3d09b4d2024-01-04 13:50:51 +08003#include "mbtk_gnss_5311.h"
liubin281ac462023-07-19 14:22:54 +08004
wangyouqiang7d66fb12024-01-26 19:19:00 +08005#define QSER_LEN_MAX 128
6
wangyouqiang3d09b4d2024-01-04 13:50:51 +08007#define QSER_RESULT_SUCCESS 0
8#define QSER_RESULT_FAIL -1
9
10/**********************************VARIABLE***********************************/
wangyouqiang7d66fb12024-01-26 19:19:00 +080011typedef struct
12{
13 char host[QSER_LEN_MAX];
14 char id[QSER_LEN_MAX];
15 char passwd[QSER_LEN_MAX];
16}qser_gnss_info;
17
wangyouqiang3d09b4d2024-01-04 13:50:51 +080018static bool inited = FALSE;
19static int qser_info_handle_num = 0;
20static uint qser_h_sim = 0x5F6F7F8F;
21gnss_handler_func_t qser_gnss_callback = NULL;
22e_msg_id_t qser_gnss_msg_type = E_MT_LOC_MSG_ID_NMEA_INFO;
23static time_t qser_gnss_time = 0;
wangyouqiang7d66fb12024-01-26 19:19:00 +080024qser_gnss_info qser_agps_info_save = {0};
wangyouqiang3d09b4d2024-01-04 13:50:51 +080025
26
27extern long timezone;
28/**********************************VARIABLE***********************************/
29
30/**********************************FUNC***********************************/
31static time_t qser_get_timestamp(char *time)
32{
33 char tmp_char[4] = {0};
34 struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));
35
36 memset(tmp_time, 0, sizeof(struct tm));
37 memset(tmp_char, 0, sizeof(tmp_char));
38 memcpy(tmp_char, &time[4], 2);
39 tmp_time->tm_sec = atoi(tmp_char);
40 memcpy(tmp_char, &time[2], 2);
41 tmp_time->tm_min = atoi(tmp_char);
42 memcpy(tmp_char, &time[0], 2);
43 tmp_time->tm_hour = atoi(tmp_char);
44 memcpy(tmp_char, &time[6], 2);
45 tmp_time->tm_mday = atoi(tmp_char);
46 memcpy(tmp_char, &time[8], 2);
47 tmp_time->tm_mon = atoi(tmp_char) - 1;
48 memcpy(tmp_char, &time[10], 2);
49 tmp_time->tm_year = 100 + atoi(tmp_char);
50
51 time_t _t = mktime(tmp_time);//按当地时区解析tmp_time
52 //gnss_log("timestamp: %ld\n",_t);
53 tzset(); // 自动设置本地时区
54 _t = _t - timezone;
55 //gnss_log("timestamp: %ld\n",_t);
56
57 free(tmp_time);
58 return _t;
59}
60
61static time_t qser_get_gnss_time_sec(void *data, int data_len)
62{
63 int i = 0, num = 0;
64 char *nmea = (char *)data;
65 char time[15] = {0};
66 char *check_state = NULL;
67
68 //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
69 check_state = strstr(nmea, "RMC");
70 if(check_state != NULL)
71 {
72 for(i = 0; i < data_len; i++)
73 {
74 if(check_state[i] == ',')
75 {
76 num++;
77 i++;
wangyouqiange039fe32024-01-04 16:02:42 +080078 if(num == 1)//get time
wangyouqiang3d09b4d2024-01-04 13:50:51 +080079 {
wangyouqiange039fe32024-01-04 16:02:42 +080080 if(check_state[i] >= '0' && check_state[i] <= '9')
81 {
82 memcpy(time, check_state + i, 6);
83 //LOGE("[qser_gnss] %s.", time);
wangyouqiange039fe32024-01-04 16:02:42 +080084 }
85 else
86 {
87 qser_gnss_time = 0;
88 return qser_gnss_time;
89 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +080090 }
wangyouqiange039fe32024-01-04 16:02:42 +080091 else if(num == 9)//get date
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 + 6, check_state + i, 6);
96 //LOGE("[qser_gnss] %s.", time);
97 break;
98 }
99 else
100 {
101 qser_gnss_time = 0;
102 return qser_gnss_time;
103 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800104 }
wangyouqiange039fe32024-01-04 16:02:42 +0800105 else if(num > 9)
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800106 {
107 qser_gnss_time = 0;
108 return qser_gnss_time;
109 }
110 }
111 }
112
113 qser_gnss_time = qser_get_timestamp(time);
114 }
115
116 return qser_gnss_time;
117}
118
119static void qser_gnss_msg_cb(void *data, int data_len)
120{
121 if(data == NULL || data_len <= 0)
122 {
123 LOGE("[qser_gnss] data is NULL.");
124 return;
125 }
126
127 if(qser_gnss_callback == NULL)
128 {
129 //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
130 return;
131 }
132
133 if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_NMEA_INFO)
134 {
135 mopen_gnss_nmea_info_t qser_nmea = {0};
136 memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
137 qser_nmea.length = data_len;
138 memcpy(qser_nmea.nmea, (char *)data, data_len);
139 qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
140
141 if(qser_gnss_callback != NULL)
142 {
143 qser_gnss_callback(NULL, qser_gnss_msg_type, (void *)(&qser_nmea), NULL);
144 }
145 }
146 else if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_LOCATION_INFO)
147 {
148 //NOT USE
149 }
150 else
151 {
152 //UNKNOWN
153 }
154}
155/**********************************FUNC***********************************/
156
157/**********************************API***********************************/
b.liu4e243dc2023-11-27 11:20:00 +0800158int qser_Gnss_Init (uint32_t *h_gnss)
liubin281ac462023-07-19 14:22:54 +0800159{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800160 //UNUSED(h_gnss);
161 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800162
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800163 if(!inited)
164 {
165 ret = mbtk_gnss_init();
166 if(ret == MBTK_GNSS_RESULT_SUCCESS)
167 {
168 qser_info_handle_num++;
169 inited = TRUE;
170 }
171 else
172 {
173 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
174 return QSER_RESULT_FAIL;
175 }
176 }
177 else
178 {
179 qser_info_handle_num++;
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800180 }
181 *h_gnss = qser_h_sim;
liubin281ac462023-07-19 14:22:54 +0800182
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800183 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800184}
185
b.liu4e243dc2023-11-27 11:20:00 +0800186int qser_Gnss_Deinit (uint32_t h_gnss)
liubin281ac462023-07-19 14:22:54 +0800187{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800188 //UNUSED(h_gnss);
189 if(h_gnss != qser_h_sim)
190 {
191 LOGE("[qser_gnss] h_sim is error.");
192 return QSER_RESULT_FAIL;
193 }
194
195 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800196
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800197 if(qser_info_handle_num == 1)
198 {
199 ret = mbtk_gnss_deinit();
200 if(ret == MBTK_GNSS_RESULT_SUCCESS)
201 {
202 qser_info_handle_num = 0;
203 inited = FALSE;
204 }
205 else
206 {
207 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
208 return QSER_RESULT_FAIL;
209 }
210 }
211 else
212 {
213 qser_info_handle_num--;
214 }
liubin281ac462023-07-19 14:22:54 +0800215
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800216 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800217}
b.liu5fa9e772023-11-23 18:00:55 +0800218
b.liu4e243dc2023-11-27 11:20:00 +0800219int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
220{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800221 //UNUSED(handler_ptr);
222 //UNUSED(h_gnss);
223 if(h_gnss != qser_h_sim)
224 {
225 LOGE("[qser_gnss] h_sim is error.");
226 return QSER_RESULT_FAIL;
227 }
b.liu4e243dc2023-11-27 11:20:00 +0800228
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800229 if(handler_ptr == NULL)
230 {
231 LOGE("[qser_gnss] handler_ptr is NULL.");
232 return QSER_RESULT_FAIL;
233 }
234 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
235
236 qser_gnss_callback = handler_ptr;
237 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800238}
239
b.liu4e243dc2023-11-27 11:20:00 +0800240int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
241{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800242 //UNUSED(h_gnss);
243 //UNUSED(type);
244 if(h_gnss != qser_h_sim)
245 {
246 LOGE("[qser_gnss] h_sim is error.");
247 return QSER_RESULT_FAIL;
248 }
b.liu4e243dc2023-11-27 11:20:00 +0800249
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800250 qser_gnss_msg_type = type;
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800251 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800252}
253
254int qser_Gnss_Start (uint32_t h_gnss)
255{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800256 //UNUSED(h_gnss);
257 if(h_gnss != qser_h_sim)
258 {
259 LOGE("[qser_gnss] h_sim is error.");
260 return QSER_RESULT_FAIL;
261 }
b.liu4e243dc2023-11-27 11:20:00 +0800262
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800263 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
wangyouqiang7d66fb12024-01-26 19:19:00 +0800264
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800265 ret = mbtk_gnss_add_nmea_out_func(qser_gnss_msg_cb);
266 if(ret != MBTK_GNSS_RESULT_SUCCESS)
267 {
268 LOGE("[qser_gnss] mbtk_gnss_add_nmea_out_func fail.");
269 return QSER_RESULT_FAIL;
270 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800271 ret = mbtk_gnss_open();
272 if(ret != MBTK_GNSS_RESULT_SUCCESS)
273 {
274 LOGE("[qser_gnss] mbtk_gnss_open is error.");
275 return QSER_RESULT_FAIL;
276 }
277
278 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800279}
280
281int qser_Gnss_Stop (uint32_t h_gnss)
282{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800283 //UNUSED(h_gnss);
284 if(h_gnss != qser_h_sim)
285 {
286 LOGE("[qser_gnss] h_sim is error.");
287 return QSER_RESULT_FAIL;
288 }
b.liu4e243dc2023-11-27 11:20:00 +0800289
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800290 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
291 ret = mbtk_gnss_close();
292 if(ret != MBTK_GNSS_RESULT_SUCCESS)
293 {
294 LOGE("[qser_gnss] mbtk_gnss_close is error.");
295 return QSER_RESULT_FAIL;
296 }
297
298 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800299}
300
301int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
302{
303 UNUSED(h_gnss);
304 UNUSED(time_info);
305
306 return 0;
307}
308
309int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
310{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800311 //UNUSED(h_gnss);
312 //UNUSED(flags);
313
314 if(h_gnss != qser_h_sim)
315 {
316 LOGE("[qser_gnss] h_sim is error.");
317 return QSER_RESULT_FAIL;
318 }
b.liu4e243dc2023-11-27 11:20:00 +0800319
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800320 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
321 char param_buf[32] = {0};
322 int length = 0;
323
324 switch(flags)
325 {
326 case DELETE_NOTHING:
327 {
328 memcpy(param_buf, "RESET,1", strlen("RESET,1"));
329 break;
330 }
331 case DELETE_EPHEMERIS:
332 case DELETE_ALMANAC:
333 case DELETE_POSITION_TIME:
334 case DELETE_UTC:
335 {
336 memcpy(param_buf, "RESET,2", strlen("RESET,2"));
337 break;
338 }
339 case DELETE_ALL:
340 {
341 memcpy(param_buf, "RESET,3", strlen("RESET,3"));
342 break;
343 }
344 default:
345 {
346 LOGE("[qser_gnss] flags UNKOWN.");
347 return QSER_RESULT_FAIL;
348 }
349 }
350
351 length = strlen(param_buf);
352 ret = mbtk_gnss_param_config(param_buf, length);
353 if(ret != MBTK_GNSS_RESULT_SUCCESS)
354 {
355 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
356 return QSER_RESULT_FAIL;
357 }
358 return QSER_RESULT_SUCCESS;
359}
360
361int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
362{
wangyouqiang7d66fb12024-01-26 19:19:00 +0800363 //UNUSED(host);
364 //UNUSED(id);
365 //UNUSED(password);
366
367 if(host != NULL)
368 {
369 memcpy(qser_agps_info_save.host, host, QSER_LEN_MAX);
370 }
371
372 if(id != NULL)
373 {
374 memcpy(qser_agps_info_save.id, id, QSER_LEN_MAX);
375 }
376
377 if(password != NULL)
378 {
379 memcpy(qser_agps_info_save.passwd, password, QSER_LEN_MAX);
380 }
381 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800382}
383
384int qser_Gnss_download_tle()
b.liu5fa9e772023-11-23 18:00:55 +0800385{
wangyouqiang7d66fb12024-01-26 19:19:00 +0800386 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
387 char host[128] = {0};
388 ret = mbtk_gnss_5311_download_tle(host, 0);
389 if(ret != MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS)
390 {
391 LOGE("[qser_gnss] mbtk_gnss_5311_download_tle is error.");
392 return QSER_RESULT_FAIL;
393 }
394 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800395}
396
b.liu4e243dc2023-11-27 11:20:00 +0800397int qser_Gnss_injectEphemeris(uint32_t h_gnss)
b.liu5fa9e772023-11-23 18:00:55 +0800398{
wangyouqiang7d66fb12024-01-26 19:19:00 +0800399 //UNUSED(h_gnss);
b.liu5fa9e772023-11-23 18:00:55 +0800400
wangyouqiang7d66fb12024-01-26 19:19:00 +0800401 if(h_gnss != qser_h_sim)
402 {
403 LOGE("[qser_gnss] h_sim is error.");
404 return QSER_RESULT_FAIL;
405 }
406
407 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
408 ret = mbtk_gnss_injectEphemeris();
409 if(ret != MBTK_GNSS_RESULT_SEND_SUCCESS)
410 {
411 LOGE("[qser_gnss] mbtk_gnss_injectEphemeris is error.");
412 return QSER_RESULT_FAIL;
413 }
414 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800415}
416
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800417int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
418{
419 //UNUSED(h_gnss);
420 //UNUSED(frequency);
421
422 if(h_gnss != qser_h_sim)
423 {
424 LOGE("[qser_gnss] h_sim is error.");
425 return QSER_RESULT_FAIL;
426 }
427
428 if(frequency != 1 && frequency != 2 && frequency != 5)
429 {
430 LOGE("[qser_gnss] frequency out of range.");
431 return QSER_RESULT_FAIL;
432 }
433
434 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
435 char param_buf[32] = {0};
436 int length = 0;
437 length = snprintf(param_buf, 32, "NAVISYSCFG,7,%d", frequency);
438 ret = mbtk_gnss_param_config(param_buf, length);
439 if(ret != MBTK_GNSS_RESULT_SUCCESS)
440 {
441 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
442 return QSER_RESULT_FAIL;
443 }
444 return QSER_RESULT_SUCCESS;
445}
446/**********************************API***********************************/
447
448