blob: f62df2446f9e2c2bc33a64ebcc800699092e9eb6 [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
wangyouqiang3d09b4d2024-01-04 13:50:51 +08005#define QSER_RESULT_SUCCESS 0
6#define QSER_RESULT_FAIL -1
7
8/**********************************VARIABLE***********************************/
9static bool inited = FALSE;
10static int qser_info_handle_num = 0;
11static uint qser_h_sim = 0x5F6F7F8F;
12gnss_handler_func_t qser_gnss_callback = NULL;
13e_msg_id_t qser_gnss_msg_type = E_MT_LOC_MSG_ID_NMEA_INFO;
14static time_t qser_gnss_time = 0;
15
16
17extern long timezone;
18/**********************************VARIABLE***********************************/
19
20/**********************************FUNC***********************************/
21static time_t qser_get_timestamp(char *time)
22{
23 char tmp_char[4] = {0};
24 struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));
25
26 memset(tmp_time, 0, sizeof(struct tm));
27 memset(tmp_char, 0, sizeof(tmp_char));
28 memcpy(tmp_char, &time[4], 2);
29 tmp_time->tm_sec = atoi(tmp_char);
30 memcpy(tmp_char, &time[2], 2);
31 tmp_time->tm_min = atoi(tmp_char);
32 memcpy(tmp_char, &time[0], 2);
33 tmp_time->tm_hour = atoi(tmp_char);
34 memcpy(tmp_char, &time[6], 2);
35 tmp_time->tm_mday = atoi(tmp_char);
36 memcpy(tmp_char, &time[8], 2);
37 tmp_time->tm_mon = atoi(tmp_char) - 1;
38 memcpy(tmp_char, &time[10], 2);
39 tmp_time->tm_year = 100 + atoi(tmp_char);
40
41 time_t _t = mktime(tmp_time);//按当地时区解析tmp_time
42 //gnss_log("timestamp: %ld\n",_t);
43 tzset(); // 自动设置本地时区
44 _t = _t - timezone;
45 //gnss_log("timestamp: %ld\n",_t);
46
47 free(tmp_time);
48 return _t;
49}
50
51static time_t qser_get_gnss_time_sec(void *data, int data_len)
52{
53 int i = 0, num = 0;
54 char *nmea = (char *)data;
55 char time[15] = {0};
56 char *check_state = NULL;
57
58 //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
59 check_state = strstr(nmea, "RMC");
60 if(check_state != NULL)
61 {
62 for(i = 0; i < data_len; i++)
63 {
64 if(check_state[i] == ',')
65 {
66 num++;
67 i++;
wangyouqiange039fe32024-01-04 16:02:42 +080068 if(num == 1)//get time
wangyouqiang3d09b4d2024-01-04 13:50:51 +080069 {
wangyouqiange039fe32024-01-04 16:02:42 +080070 if(check_state[i] >= '0' && check_state[i] <= '9')
71 {
72 memcpy(time, check_state + i, 6);
73 //LOGE("[qser_gnss] %s.", time);
wangyouqiange039fe32024-01-04 16:02:42 +080074 }
75 else
76 {
77 qser_gnss_time = 0;
78 return qser_gnss_time;
79 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +080080 }
wangyouqiange039fe32024-01-04 16:02:42 +080081 else if(num == 9)//get date
wangyouqiang3d09b4d2024-01-04 13:50:51 +080082 {
wangyouqiange039fe32024-01-04 16:02:42 +080083 if(check_state[i] >= '0' && check_state[i] <= '9')
84 {
85 memcpy(time + 6, check_state + i, 6);
86 //LOGE("[qser_gnss] %s.", time);
87 break;
88 }
89 else
90 {
91 qser_gnss_time = 0;
92 return qser_gnss_time;
93 }
wangyouqiang3d09b4d2024-01-04 13:50:51 +080094 }
wangyouqiange039fe32024-01-04 16:02:42 +080095 else if(num > 9)
wangyouqiang3d09b4d2024-01-04 13:50:51 +080096 {
97 qser_gnss_time = 0;
98 return qser_gnss_time;
99 }
100 }
101 }
102
103 qser_gnss_time = qser_get_timestamp(time);
104 }
105
106 return qser_gnss_time;
107}
108
109static void qser_gnss_msg_cb(void *data, int data_len)
110{
111 if(data == NULL || data_len <= 0)
112 {
113 LOGE("[qser_gnss] data is NULL.");
114 return;
115 }
116
117 if(qser_gnss_callback == NULL)
118 {
119 //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
120 return;
121 }
122
123 if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_NMEA_INFO)
124 {
125 mopen_gnss_nmea_info_t qser_nmea = {0};
126 memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
127 qser_nmea.length = data_len;
128 memcpy(qser_nmea.nmea, (char *)data, data_len);
129 qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
130
131 if(qser_gnss_callback != NULL)
132 {
133 qser_gnss_callback(NULL, qser_gnss_msg_type, (void *)(&qser_nmea), NULL);
134 }
135 }
136 else if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_LOCATION_INFO)
137 {
138 //NOT USE
139 }
140 else
141 {
142 //UNKNOWN
143 }
144}
145/**********************************FUNC***********************************/
146
147/**********************************API***********************************/
b.liu4e243dc2023-11-27 11:20:00 +0800148int qser_Gnss_Init (uint32_t *h_gnss)
liubin281ac462023-07-19 14:22:54 +0800149{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800150 //UNUSED(h_gnss);
151 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800152
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800153 if(!inited)
154 {
155 ret = mbtk_gnss_init();
156 if(ret == MBTK_GNSS_RESULT_SUCCESS)
157 {
158 qser_info_handle_num++;
159 inited = TRUE;
160 }
161 else
162 {
163 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
164 return QSER_RESULT_FAIL;
165 }
166 }
167 else
168 {
169 qser_info_handle_num++;
170 inited = TRUE;
171 }
172 *h_gnss = qser_h_sim;
liubin281ac462023-07-19 14:22:54 +0800173
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800174 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800175}
176
b.liu4e243dc2023-11-27 11:20:00 +0800177int qser_Gnss_Deinit (uint32_t h_gnss)
liubin281ac462023-07-19 14:22:54 +0800178{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800179 //UNUSED(h_gnss);
180 if(h_gnss != qser_h_sim)
181 {
182 LOGE("[qser_gnss] h_sim is error.");
183 return QSER_RESULT_FAIL;
184 }
185
186 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800187
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800188 if(qser_info_handle_num == 1)
189 {
190 ret = mbtk_gnss_deinit();
191 if(ret == MBTK_GNSS_RESULT_SUCCESS)
192 {
193 qser_info_handle_num = 0;
194 inited = FALSE;
195 }
196 else
197 {
198 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
199 return QSER_RESULT_FAIL;
200 }
201 }
202 else
203 {
204 qser_info_handle_num--;
205 }
liubin281ac462023-07-19 14:22:54 +0800206
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800207 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800208}
b.liu5fa9e772023-11-23 18:00:55 +0800209
b.liu4e243dc2023-11-27 11:20:00 +0800210int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
211{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800212 //UNUSED(handler_ptr);
213 //UNUSED(h_gnss);
214 if(h_gnss != qser_h_sim)
215 {
216 LOGE("[qser_gnss] h_sim is error.");
217 return QSER_RESULT_FAIL;
218 }
b.liu4e243dc2023-11-27 11:20:00 +0800219
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800220 if(handler_ptr == NULL)
221 {
222 LOGE("[qser_gnss] handler_ptr is NULL.");
223 return QSER_RESULT_FAIL;
224 }
225 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
226
227 qser_gnss_callback = handler_ptr;
228 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800229}
230
b.liu4e243dc2023-11-27 11:20:00 +0800231int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
232{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800233 //UNUSED(h_gnss);
234 //UNUSED(type);
235 if(h_gnss != qser_h_sim)
236 {
237 LOGE("[qser_gnss] h_sim is error.");
238 return QSER_RESULT_FAIL;
239 }
b.liu4e243dc2023-11-27 11:20:00 +0800240
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800241 qser_gnss_msg_type = type;
b.liu4e243dc2023-11-27 11:20:00 +0800242
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800243 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800244}
245
246int qser_Gnss_Start (uint32_t h_gnss)
247{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800248 //UNUSED(h_gnss);
249 if(h_gnss != qser_h_sim)
250 {
251 LOGE("[qser_gnss] h_sim is error.");
252 return QSER_RESULT_FAIL;
253 }
b.liu4e243dc2023-11-27 11:20:00 +0800254
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800255 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
256
257 ret = mbtk_gnss_add_nmea_out_func(qser_gnss_msg_cb);
258 if(ret != MBTK_GNSS_RESULT_SUCCESS)
259 {
260 LOGE("[qser_gnss] mbtk_gnss_add_nmea_out_func fail.");
261 return QSER_RESULT_FAIL;
262 }
263
264 ret = mbtk_gnss_open();
265 if(ret != MBTK_GNSS_RESULT_SUCCESS)
266 {
267 LOGE("[qser_gnss] mbtk_gnss_open is error.");
268 return QSER_RESULT_FAIL;
269 }
270
271 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800272}
273
274int qser_Gnss_Stop (uint32_t h_gnss)
275{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800276 //UNUSED(h_gnss);
277 if(h_gnss != qser_h_sim)
278 {
279 LOGE("[qser_gnss] h_sim is error.");
280 return QSER_RESULT_FAIL;
281 }
b.liu4e243dc2023-11-27 11:20:00 +0800282
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800283 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
284 ret = mbtk_gnss_close();
285 if(ret != MBTK_GNSS_RESULT_SUCCESS)
286 {
287 LOGE("[qser_gnss] mbtk_gnss_close is error.");
288 return QSER_RESULT_FAIL;
289 }
290
291 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800292}
293
294int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
295{
296 UNUSED(h_gnss);
297 UNUSED(time_info);
298
299 return 0;
300}
301
302int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
303{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800304 //UNUSED(h_gnss);
305 //UNUSED(flags);
306
307 if(h_gnss != qser_h_sim)
308 {
309 LOGE("[qser_gnss] h_sim is error.");
310 return QSER_RESULT_FAIL;
311 }
b.liu4e243dc2023-11-27 11:20:00 +0800312
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800313 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
314 char param_buf[32] = {0};
315 int length = 0;
316
317 switch(flags)
318 {
319 case DELETE_NOTHING:
320 {
321 memcpy(param_buf, "RESET,1", strlen("RESET,1"));
322 break;
323 }
324 case DELETE_EPHEMERIS:
325 case DELETE_ALMANAC:
326 case DELETE_POSITION_TIME:
327 case DELETE_UTC:
328 {
329 memcpy(param_buf, "RESET,2", strlen("RESET,2"));
330 break;
331 }
332 case DELETE_ALL:
333 {
334 memcpy(param_buf, "RESET,3", strlen("RESET,3"));
335 break;
336 }
337 default:
338 {
339 LOGE("[qser_gnss] flags UNKOWN.");
340 return QSER_RESULT_FAIL;
341 }
342 }
343
344 length = strlen(param_buf);
345 ret = mbtk_gnss_param_config(param_buf, length);
346 if(ret != MBTK_GNSS_RESULT_SUCCESS)
347 {
348 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
349 return QSER_RESULT_FAIL;
350 }
351 return QSER_RESULT_SUCCESS;
352}
353
354int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
355{
356 UNUSED(host);
357 UNUSED(id);
358 UNUSED(password);
b.liu4e243dc2023-11-27 11:20:00 +0800359 return 0;
360}
361
362int qser_Gnss_download_tle()
b.liu5fa9e772023-11-23 18:00:55 +0800363{
b.liu5fa9e772023-11-23 18:00:55 +0800364 return 0;
365}
366
b.liu4e243dc2023-11-27 11:20:00 +0800367int qser_Gnss_injectEphemeris(uint32_t h_gnss)
b.liu5fa9e772023-11-23 18:00:55 +0800368{
b.liu4e243dc2023-11-27 11:20:00 +0800369 UNUSED(h_gnss);
b.liu5fa9e772023-11-23 18:00:55 +0800370
b.liu5fa9e772023-11-23 18:00:55 +0800371 return 0;
372}
373
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800374int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
375{
376 //UNUSED(h_gnss);
377 //UNUSED(frequency);
378
379 if(h_gnss != qser_h_sim)
380 {
381 LOGE("[qser_gnss] h_sim is error.");
382 return QSER_RESULT_FAIL;
383 }
384
385 if(frequency != 1 && frequency != 2 && frequency != 5)
386 {
387 LOGE("[qser_gnss] frequency out of range.");
388 return QSER_RESULT_FAIL;
389 }
390
391 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
392 char param_buf[32] = {0};
393 int length = 0;
394 length = snprintf(param_buf, 32, "NAVISYSCFG,7,%d", frequency);
395 ret = mbtk_gnss_param_config(param_buf, length);
396 if(ret != MBTK_GNSS_RESULT_SUCCESS)
397 {
398 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
399 return QSER_RESULT_FAIL;
400 }
401 return QSER_RESULT_SUCCESS;
402}
403/**********************************API***********************************/
404
405