blob: 53d653799b6ed59006136ea31021a2b1e251cf12 [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++;
68 if(num == 1 && check_state[i] >= '0' && check_state[i] <= '9')//get time
69 {
70 memcpy(time, check_state + i, 6);
71 LOGE("[qser_gnss] %s.", time);
72 i += 6;
73 }
74 else if(num == 9 && check_state[i] >= '0' && check_state[i] <= '9')//get date
75 {
76 memcpy(time + 6, check_state + i, 6);
77 LOGE("[qser_gnss] %s.", time);
78 break;
79 }
80 else
81 {
82 qser_gnss_time = 0;
83 return qser_gnss_time;
84 }
85 }
86 }
87
88 qser_gnss_time = qser_get_timestamp(time);
89 }
90
91 return qser_gnss_time;
92}
93
94static void qser_gnss_msg_cb(void *data, int data_len)
95{
96 if(data == NULL || data_len <= 0)
97 {
98 LOGE("[qser_gnss] data is NULL.");
99 return;
100 }
101
102 if(qser_gnss_callback == NULL)
103 {
104 //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
105 return;
106 }
107
108 if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_NMEA_INFO)
109 {
110 mopen_gnss_nmea_info_t qser_nmea = {0};
111 memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
112 qser_nmea.length = data_len;
113 memcpy(qser_nmea.nmea, (char *)data, data_len);
114 qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
115
116 if(qser_gnss_callback != NULL)
117 {
118 qser_gnss_callback(NULL, qser_gnss_msg_type, (void *)(&qser_nmea), NULL);
119 }
120 }
121 else if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_LOCATION_INFO)
122 {
123 //NOT USE
124 }
125 else
126 {
127 //UNKNOWN
128 }
129}
130/**********************************FUNC***********************************/
131
132/**********************************API***********************************/
b.liu4e243dc2023-11-27 11:20:00 +0800133int qser_Gnss_Init (uint32_t *h_gnss)
liubin281ac462023-07-19 14:22:54 +0800134{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800135 //UNUSED(h_gnss);
136 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800137
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800138 if(!inited)
139 {
140 ret = mbtk_gnss_init();
141 if(ret == MBTK_GNSS_RESULT_SUCCESS)
142 {
143 qser_info_handle_num++;
144 inited = TRUE;
145 }
146 else
147 {
148 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
149 return QSER_RESULT_FAIL;
150 }
151 }
152 else
153 {
154 qser_info_handle_num++;
155 inited = TRUE;
156 }
157 *h_gnss = qser_h_sim;
liubin281ac462023-07-19 14:22:54 +0800158
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800159 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800160}
161
b.liu4e243dc2023-11-27 11:20:00 +0800162int qser_Gnss_Deinit (uint32_t h_gnss)
liubin281ac462023-07-19 14:22:54 +0800163{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800164 //UNUSED(h_gnss);
165 if(h_gnss != qser_h_sim)
166 {
167 LOGE("[qser_gnss] h_sim is error.");
168 return QSER_RESULT_FAIL;
169 }
170
171 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
liubin281ac462023-07-19 14:22:54 +0800172
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800173 if(qser_info_handle_num == 1)
174 {
175 ret = mbtk_gnss_deinit();
176 if(ret == MBTK_GNSS_RESULT_SUCCESS)
177 {
178 qser_info_handle_num = 0;
179 inited = FALSE;
180 }
181 else
182 {
183 LOGE("[qser_gnss] mbtk_gnss_init() fail.");
184 return QSER_RESULT_FAIL;
185 }
186 }
187 else
188 {
189 qser_info_handle_num--;
190 }
liubin281ac462023-07-19 14:22:54 +0800191
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800192 return QSER_RESULT_SUCCESS;
liubin281ac462023-07-19 14:22:54 +0800193}
b.liu5fa9e772023-11-23 18:00:55 +0800194
b.liu4e243dc2023-11-27 11:20:00 +0800195int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
196{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800197 //UNUSED(handler_ptr);
198 //UNUSED(h_gnss);
199 if(h_gnss != qser_h_sim)
200 {
201 LOGE("[qser_gnss] h_sim is error.");
202 return QSER_RESULT_FAIL;
203 }
b.liu4e243dc2023-11-27 11:20:00 +0800204
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800205 if(handler_ptr == NULL)
206 {
207 LOGE("[qser_gnss] handler_ptr is NULL.");
208 return QSER_RESULT_FAIL;
209 }
210 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
211
212 qser_gnss_callback = handler_ptr;
213 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800214}
215
b.liu4e243dc2023-11-27 11:20:00 +0800216int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
217{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800218 //UNUSED(h_gnss);
219 //UNUSED(type);
220 if(h_gnss != qser_h_sim)
221 {
222 LOGE("[qser_gnss] h_sim is error.");
223 return QSER_RESULT_FAIL;
224 }
b.liu4e243dc2023-11-27 11:20:00 +0800225
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800226 qser_gnss_msg_type = type;
b.liu4e243dc2023-11-27 11:20:00 +0800227
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800228 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800229}
230
231int qser_Gnss_Start (uint32_t h_gnss)
232{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800233 //UNUSED(h_gnss);
234 if(h_gnss != qser_h_sim)
235 {
236 LOGE("[qser_gnss] h_sim is error.");
237 return QSER_RESULT_FAIL;
238 }
b.liu4e243dc2023-11-27 11:20:00 +0800239
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800240 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
241
242 ret = mbtk_gnss_add_nmea_out_func(qser_gnss_msg_cb);
243 if(ret != MBTK_GNSS_RESULT_SUCCESS)
244 {
245 LOGE("[qser_gnss] mbtk_gnss_add_nmea_out_func fail.");
246 return QSER_RESULT_FAIL;
247 }
248
249 ret = mbtk_gnss_open();
250 if(ret != MBTK_GNSS_RESULT_SUCCESS)
251 {
252 LOGE("[qser_gnss] mbtk_gnss_open is error.");
253 return QSER_RESULT_FAIL;
254 }
255
256 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800257}
258
259int qser_Gnss_Stop (uint32_t h_gnss)
260{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800261 //UNUSED(h_gnss);
262 if(h_gnss != qser_h_sim)
263 {
264 LOGE("[qser_gnss] h_sim is error.");
265 return QSER_RESULT_FAIL;
266 }
b.liu4e243dc2023-11-27 11:20:00 +0800267
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800268 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
269 ret = mbtk_gnss_close();
270 if(ret != MBTK_GNSS_RESULT_SUCCESS)
271 {
272 LOGE("[qser_gnss] mbtk_gnss_close is error.");
273 return QSER_RESULT_FAIL;
274 }
275
276 return QSER_RESULT_SUCCESS;
b.liu4e243dc2023-11-27 11:20:00 +0800277}
278
279int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
280{
281 UNUSED(h_gnss);
282 UNUSED(time_info);
283
284 return 0;
285}
286
287int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
288{
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800289 //UNUSED(h_gnss);
290 //UNUSED(flags);
291
292 if(h_gnss != qser_h_sim)
293 {
294 LOGE("[qser_gnss] h_sim is error.");
295 return QSER_RESULT_FAIL;
296 }
b.liu4e243dc2023-11-27 11:20:00 +0800297
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800298 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
299 char param_buf[32] = {0};
300 int length = 0;
301
302 switch(flags)
303 {
304 case DELETE_NOTHING:
305 {
306 memcpy(param_buf, "RESET,1", strlen("RESET,1"));
307 break;
308 }
309 case DELETE_EPHEMERIS:
310 case DELETE_ALMANAC:
311 case DELETE_POSITION_TIME:
312 case DELETE_UTC:
313 {
314 memcpy(param_buf, "RESET,2", strlen("RESET,2"));
315 break;
316 }
317 case DELETE_ALL:
318 {
319 memcpy(param_buf, "RESET,3", strlen("RESET,3"));
320 break;
321 }
322 default:
323 {
324 LOGE("[qser_gnss] flags UNKOWN.");
325 return QSER_RESULT_FAIL;
326 }
327 }
328
329 length = strlen(param_buf);
330 ret = mbtk_gnss_param_config(param_buf, length);
331 if(ret != MBTK_GNSS_RESULT_SUCCESS)
332 {
333 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
334 return QSER_RESULT_FAIL;
335 }
336 return QSER_RESULT_SUCCESS;
337}
338
339int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
340{
341 UNUSED(host);
342 UNUSED(id);
343 UNUSED(password);
b.liu4e243dc2023-11-27 11:20:00 +0800344 return 0;
345}
346
347int qser_Gnss_download_tle()
b.liu5fa9e772023-11-23 18:00:55 +0800348{
b.liu5fa9e772023-11-23 18:00:55 +0800349 return 0;
350}
351
b.liu4e243dc2023-11-27 11:20:00 +0800352int qser_Gnss_injectEphemeris(uint32_t h_gnss)
b.liu5fa9e772023-11-23 18:00:55 +0800353{
b.liu4e243dc2023-11-27 11:20:00 +0800354 UNUSED(h_gnss);
b.liu5fa9e772023-11-23 18:00:55 +0800355
b.liu5fa9e772023-11-23 18:00:55 +0800356 return 0;
357}
358
wangyouqiang3d09b4d2024-01-04 13:50:51 +0800359int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
360{
361 //UNUSED(h_gnss);
362 //UNUSED(frequency);
363
364 if(h_gnss != qser_h_sim)
365 {
366 LOGE("[qser_gnss] h_sim is error.");
367 return QSER_RESULT_FAIL;
368 }
369
370 if(frequency != 1 && frequency != 2 && frequency != 5)
371 {
372 LOGE("[qser_gnss] frequency out of range.");
373 return QSER_RESULT_FAIL;
374 }
375
376 MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
377 char param_buf[32] = {0};
378 int length = 0;
379 length = snprintf(param_buf, 32, "NAVISYSCFG,7,%d", frequency);
380 ret = mbtk_gnss_param_config(param_buf, length);
381 if(ret != MBTK_GNSS_RESULT_SUCCESS)
382 {
383 LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
384 return QSER_RESULT_FAIL;
385 }
386 return QSER_RESULT_SUCCESS;
387}
388/**********************************API***********************************/
389
390