blob: 7beb0d16dcb4aff90cca24198a085458f3f0fd66 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include <stdio.h>
2#include <string.h>
3#include <strings.h>
4#include <stdlib.h>
5#include <errno.h>
6#include <fcntl.h>
7#include <signal.h>
8#include <sys/types.h>
9#include <unistd.h>
10#include <pthread.h>
11#include <termios.h>
12#include <time.h>
13#include <sys/ioctl.h>
14#include <dlfcn.h>
15#include <stdint.h>
16#include <stdbool.h>
17
18#include "gsw_gnss.h"
19
20#ifndef LOG_ERR_LEVEL
21#define LOG_ERR_LEVEL 3 /* error conditions */
22#endif
23#ifndef LOG_WARN_LEVEL
24#define LOG_WARN_LEVEL 4 /* warning conditions */
25#endif
26#ifndef LOG_INFO_LEVEL
27#define LOG_INFO_LEVEL 6 /* informational */
28#endif
29#ifndef LOG_DEBUG_LEVEL
30#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
31#endif
32#ifndef LOG_VERBOSE_LEVEL
33#define LOG_VERBOSE_LEVEL 8
34#endif
35
36#define LOGV(fmt, args ...) \
37 do{ \
38 char *file_ptr_1001 = __FILE__; \
39 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
40 char line_1001[10] = {0}; \
41 sprintf(line_1001, "%d", __LINE__); \
42 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
43 if(*ptr_1001 == '/') \
44 break; \
45 ptr_1001--; \
46 } \
47 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
48 } while(0)
49
50#define LOGI(fmt, args...) \
51 do{ \
52 char *file_ptr_1001 = __FILE__; \
53 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
54 char line_1001[10] = {0}; \
55 sprintf(line_1001, "%d", __LINE__); \
56 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
57 if(*ptr_1001 == '/') \
58 break; \
59 ptr_1001--; \
60 } \
61 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
62 } while(0)
63
64#define LOGD(fmt, args...) \
65 do{ \
66 char *file_ptr_1001 = __FILE__; \
67 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
68 char line_1001[10] = {0}; \
69 sprintf(line_1001, "%d", __LINE__); \
70 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
71 if(*ptr_1001 == '/') \
72 break; \
73 ptr_1001--; \
74 } \
75 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
76 } while(0)
77
78#define LOGW(fmt, args...) \
79 do{ \
80 char *file_ptr_1001 = __FILE__; \
81 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
82 char line_1001[10] = {0}; \
83 sprintf(line_1001, "%d", __LINE__); \
84 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
85 if(*ptr_1001 == '/') \
86 break; \
87 ptr_1001--; \
88 } \
89 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
90 } while(0)
91
92#define LOGE(fmt, args...) \
93 do{ \
94 char *file_ptr_1001 = __FILE__; \
95 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
96 char line_1001[10] = {0}; \
97 sprintf(line_1001, "%d", __LINE__); \
98 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
99 if(*ptr_1001 == '/') \
100 break; \
101 ptr_1001--; \
102 } \
103 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
104 } while(0)
105
106
107#define GSW_HAL_SUCCESS 0
108#define GSW_HAL_FAIL -1 //表示失败(通用性)
109#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL
110
111#define MOPEN_GNSS_NMEA_MAX_LENGTH 255 /** NMEA string maximum length. */
112static gsw_gnss_cb *gsw_cb = NULL;
113static bool inited = false;
114static bool strated = false;
115
116typedef void (*mbtk_gnss_callback_func)(uint32_t ind_type, const void* data, uint32_t data_len);
117typedef void (*mbtk_log)(int level, const char *format,...);
118static mbtk_log fun_ptr_log = NULL;
119
120int (*mbtk_gnss_init)(mbtk_gnss_callback_func cb);
121int (*mbtk_gnss_deinit)();
122
123int (*mbtk_gnss_ind_set)(uint32_t ,int);
124int (*mbtk_gnss_open)(int, int);
125int (*mbtk_gnss_close)(int);
126int (*mbtk_gnss_setting)(const char *setting_cmd, int);
127
128int (*mbtk_gnss_eph_download)(int);
129int (*mbtk_gnss_eph_inject)(int);
130
131int gnss_freq = -1;
132GSW_GNSS_MODE_CONFIGURATION gnss_startmode = -1;
133GSW_GNSS_CONF_SWITCH gnss_switch_op = -1;
134void *dlHandle_gnss;
135char *lynqLib_gnss = "/lib/libmbtk_lib.so";
136
137typedef enum
138{
139 E_MT_LOC_MSG_ID_LOCATION_INFO = 1, /**< pv_data = & mopen_location_info_t */
140 E_MT_LOC_MSG_ID_NMEA_INFO = 3, /**< pv_data = & mopen_gnss_nmea_info_t */
141} e_msg_id_t;
142
143typedef struct
144{
145 int64_t timestamp; /**< System Timestamp, marked for when got the nmea data */
146 int length; /**< NMEA string length. */
147 char nmea[MOPEN_GNSS_NMEA_MAX_LENGTH + 1]; /**< NMEA string.*/
148}mopen_gnss_nmea_info_t; /* Message */
149
150typedef struct
151{
152 uint32_t size; /**< Set to the size of mcm_gps_location_t. */
153 int flags; /**< Contains GPS location flags bits. */
154 int position_source; /**< Provider indicator for HYBRID or GPS. */ //功能暂未实现,可不用添加进结构体
155 double latitude; /**< Latitude in degrees. */
156 double longitude; /**< Longitude in degrees. */
157 double altitude; /**< Altitude in meters above the WGS 84 reference ellipsoid. */
158 float speed; /**< Speed in meters per second. */
159 float bearing; /**< Heading in degrees. */ //功能暂未实现,可不用添加进结构体
160 float accuracy; /**< Expected accuracy in meters. */ //功能暂未实现,可不用添加进结构体
161 int64_t timestamp; /**< Timestamp for the location fix in UTC million-second base. */
162 int32_t is_indoor; /**< Location is indoors. */ //功能暂未实现,可不用添加进结构体
163 float floor_number; /**< Indicates the floor number. */
164}mopen_location_info_t;//功能暂未实现,可不用添加进结构体
165
166
167typedef struct {
168 uint32_t flags;
169 double latitude; /**< Latitude in degrees. */
170 double longitude; /**< Longitude in degrees. */
171 double altitude; /**< Altitude in meters above the WGS 84 reference ellipsoid. */
172 float speed; /**< Speed in meters per second. */
173 float bearing; /**< Heading in degrees. */
174 int64_t timestamp; /**< Timestamp for the location fix in UTC million-second base. */
175} mbtk_gnss_location_info_t;
176
177typedef enum{
178 MODE_GPS = 1, /**< GPS only */
179 MODE_BEIDOU, /**< BEIDOU only*/
180 MODE_GPS_BEIDOU, /**< GPS+BEIDOU */
181 MODE_GLONASS, /**< GLONASS only */
182 MODE_GPS_GLONASS, /**< GPS+GLONASS */
183 MODE_GLONASS_BEIDOU, /**< GLONASS+BEIDOU */ /* The type does not support this type */
184 MODE_GPS_GLONASS_BEIDOU, /**< GPS+GLONASS+BEIDOU */ /* The type does not support this type */
185 MODE_GALILEO, /**< GALILEO only */
186 MODE_GPS_GALILEO, /**< GPS+GALILEO */
187 MODE_BEIDOU_GALILEO, /**< BEIDOU+GALILEO */
188 MODE_GPS_BEIDOU_GALILEO, /**< GPS+BEIDOU+GALILEO */
189 MODE_GLONASS_GALILEO, /**< GLONASS+GALILEO */
190 MODE_GPS_GLONASS_GALILEO, /**< GPS+GLONASS+GALILEO */
191 MODE_BEIDOU_GLONASS_GALILEO, /**< BEIDOU+GLONASS+GALILEO */ /* The type does not support this type */
192 MODE_END = -1, /**< init value */
193}GSW_GNSS_MODE_CONFIGURATION_HD;
194
195
196GSW_GNSS_MODE_CONFIGURATION_HD map_gnss_mode(GSW_GNSS_MODE_CONFIGURATION mode)
197{
198 switch (mode)
199 {
200 case GSW_MODE_GPS_GLONASS:
201 return MODE_GPS_GLONASS;
202 case GSW_MODE_GPS_BEIDOU:
203 return MODE_GPS_BEIDOU;
204 case GSW_MODE_GPS_GLONASS_BEIDOU:
205 return MODE_END;
206 case GSW_MODE_GPS:
207 return MODE_GPS;
208 case GSW_MODE_BEIDOU:
209 return MODE_BEIDOU;
210 case GSW_MODE_GLONASS:
211 return MODE_GLONASS;
212 case GSW_MODE_GPS_GLONASS_BEIDOU_GALILEO:
213 return MODE_END;
214 case GSW_MODE_GPS_GALILEO:
215 return MODE_GPS_GALILEO;
216 case GSW_MODE_GPS_GLONASS_GALILEO:
217 return MODE_GPS_GLONASS_GALILEO;
218 case GSW_MODE_GPS_GALILEO_ONLY:
219 return MODE_GALILEO;
220 case GSW_MODE_GPS_GLONASS_BEIDOU_GALILEO_NAVIC:
221 return MODE_END;
222 case GSW_MODE_GNSS_END:
223 return MODE_END;
224 default:
225 return MODE_END;
226 }
227}
228
229int mbtk_gnss_set_VTG()
230{
231 int ret;
232 char param_buf[32] = {0};
233 snprintf(param_buf, 32, "$MSGCFG,2,1000");
234 mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");
235 ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);
236 if(ret != 0)
237 {
238 LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);
239 return GSW_HAL_FAIL;
240 }
241 return GSW_HAL_SUCCESS;
242}
243
244/**
245 * @brief SDK interface to set gnss sampling frequency, support 1Hz、2Hz、5Hz
246 * @param [in] freq
247 * @retval 0: success
248 * @retval other: fail
249 */
250int gsw_gnss_set_freq(int freq)
251{
252 int ret;
253 if (!strated)
254 {
255 gnss_freq = freq;
256 return GSW_HAL_SUCCESS;
257 }
258 char param_buf[32] = {0};
259 snprintf(param_buf, 32, "$FREQCFG,%d", freq);
260 mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");
261 ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);
262 if(ret != 0)
263 {
264 LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);
265 return GSW_HAL_FAIL;
266 }
267 return GSW_HAL_SUCCESS;
268}
269
270/**
271 * @brief SDK interface to set gnss start mode,specific mode refreence GSW_HAL_GNSS_MODE_CONFIGURATION
272 * @param [in] start_mode
273 * @retval 0: success
274 * @retval other: fail
275 */
276int gsw_gnss_set_start_mode(GSW_GNSS_MODE_CONFIGURATION start_mode)
277{
278 int ret;
279 if (!strated)
280 {
281 gnss_startmode = start_mode;
282 return GSW_HAL_SUCCESS;
283 }
284 char param_buf[32] = {0};
285 snprintf(param_buf, 32, "$SYSCFG,%d", map_gnss_mode(start_mode));
286 if(map_gnss_mode(start_mode) == -1)
287 {
288 LOGE("[qser_gnss] mbtk_gnss_start_mode con't support");
289 return GSW_HAL_FAIL;
290 }
291 mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");
292 ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);
293 if(ret != 0)
294 {
295 LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);
296 return GSW_HAL_FAIL;
297 }
298 return GSW_HAL_SUCCESS;
299}
300
301/**
302 * @brief SDK interface to set EPO switch if open or close
303 * @param [in] switch_op
304 * @retval 0: success
305 * @retval other: fail
306 */
307int gsw_gnss_epo_switch(GSW_GNSS_CONF_SWITCH switch_op)
308{
309 int ret;
310 if (!strated)
311 {
312 gnss_switch_op = switch_op;
313 return GSW_HAL_SUCCESS;
314 }
315
316 if(switch_op)
317 {
318 mbtk_gnss_eph_download=(int(*)(int))dlsym(dlHandle_gnss, "mbtk_gnss_eph_download");
319 ret = mbtk_gnss_eph_download(QSER_GNSS_TIMEOUT);
320 if(ret != 0)
321 {
322 LOGE("[qser_gnss] mbtk_gnss_eph_download fail.ret = [%d]", ret);
323 return GSW_HAL_FAIL;
324 }
325 mbtk_gnss_eph_inject=(int(*)(int))dlsym(dlHandle_gnss, "mbtk_gnss_eph_inject");
326 ret = mbtk_gnss_eph_inject(QSER_GNSS_TIMEOUT);
327 if(ret != 0)
328 {
329 LOGE("[qser_gnss] mbtk_gnss_eph_inject fail.ret = [%d]", ret);
330 return GSW_HAL_FAIL;
331 }
332 }
333 return GSW_HAL_SUCCESS;
334}
335
336static void gnss_callback(uint32_t ind_type, const void* data, uint32_t data_len)
337{
338 if(data == NULL || data_len <= 0)
339 {
340 LOGE("[GSW_gnss] data is NULL.");
341 return;
342 }
343
344 if(gsw_cb == NULL)
345 {
346 //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
347 return;
348 }
349
350 if(ind_type == MBTK_GNSS_IND_LOCATION) {
351 if(data_len != sizeof(mbtk_gnss_location_info_t))
352 {
353 LOGE("[GSW_gnss] data size error");
354 return;
355 }
356 GSW_GNSS_LOCATION_EXT_T gsw_location;
357 GSW_GNSS_LOCATION_T gsw_location_t;
358 mbtk_gnss_location_info_t *locl_info = (mbtk_gnss_location_info_t *)data;
359 gsw_location_t.altitude = locl_info->altitude;
360 gsw_location_t.latitude = locl_info->latitude;
361 gsw_location_t.longitude = locl_info->longitude;
362 gsw_location_t.speed = locl_info->speed;
363 gsw_location_t.bearing = locl_info->bearing;
364 gsw_location_t.timestamp = locl_info->timestamp;
365 gsw_location.legacyLocation = gsw_location_t;
366 gsw_cb->gsw_location_cb(&gsw_location);
367 } else if(ind_type == MBTK_GNSS_IND_NMEA) {
368 mopen_gnss_nmea_info_t qser_nmea = {0};
369 memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
370 qser_nmea.length = data_len;
371 memcpy(qser_nmea.nmea, (char *)data, data_len);
372 //qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
373 gsw_cb->gsw_nmea_cb(data,data_len);
374 } else {
375 LOGD("Unknown IND : %d\n", ind_type);
376 }
377}
378
379int gsw_gnss_init(void)
380{
381 int ret;
382 if(!inited)
383 {
384 dlHandle_gnss = dlopen(lynqLib_gnss, RTLD_NOW);
385 fun_ptr_log = (mbtk_log)dlsym(dlHandle_gnss, "mbtk_log");
386 if(fun_ptr_log == NULL || dlHandle_gnss == NULL)
387 {
388 return GSW_HAL_FAIL;
389 }
390 mbtk_gnss_init=(int(*)(mbtk_gnss_callback_func))dlsym(dlHandle_gnss, "mbtk_gnss_init");
391 ret = mbtk_gnss_init(gnss_callback);
392 if(ret == 0)
393 {
394 mbtk_gnss_ind_set=(int(*)(uint32_t ,int))dlsym(dlHandle_gnss, "mbtk_gnss_ind_set");
395 ret = mbtk_gnss_ind_set(MBTK_GNSS_IND_NMEA, QSER_GNSS_TIMEOUT);
396 if(ret == 0)
397 {
398 inited = true;
399 }
400 else
401 {
402 LOGE("[GSW_gnss] init mbtk_gnss_ind_set() fail.ret = [%d]", ret);
403 return GSW_HAL_FAIL;
404 }
405 }
406 else
407 {
408 LOGE("[GSW_gnss] mbtk_gnss_init() fail.ret = [%d]", ret);
409 return GSW_HAL_FAIL;
410 }
411 }
412
413 return GSW_HAL_SUCCESS;
414}
415
416/**
417 * @brief SDK interface to registered callback function
418 * @param [in] callback
419 * @retval 0: success
420 * @retval other: fail
421 */
422int gsw_gnss_reg_cb_group(gsw_gnss_cb callback)
423{
424 if(callback.gsw_location_cb == NULL && callback.gsw_nmea_cb == NULL)
425 {
426 LOGE("[GSW_gnss] handler_ptr is NULL.");
427 return GSW_HAL_FAIL;
428 }
429 if (gsw_cb == NULL)
430 {
431 gsw_cb = (gsw_gnss_cb *)malloc(sizeof(gsw_gnss_cb));
432 if (gsw_cb == NULL)
433 {
434 LOGE("[GSW_gnss] Memory allocation failed.");
435 return GSW_HAL_FAIL;
436 }
437 }
438 gsw_cb->gsw_location_cb = callback.gsw_location_cb;
439 gsw_cb->gsw_nmea_cb = callback.gsw_nmea_cb;
440 return GSW_HAL_SUCCESS;
441}
442/**
443 * @brief SDK interface to start gnss
444 * @param
445 * @retval 0: success
446 * @retval other: fail
447 */
448int gsw_gnss_start(void)
449{
450 int ret;
451 mbtk_gnss_open=(int(*)(int,int))dlsym(dlHandle_gnss, "mbtk_gnss_open");
452 ret = mbtk_gnss_open(255, QSER_GNSS_TIMEOUT);
453 if(ret != 0)
454 {
455 LOGE("[GSW_gnss] mbtk_gnss_open is error.ret = [%d]", ret);
456 return GSW_HAL_FAIL;
457 }
458 strated = true;
459 if (gnss_freq > 0)
460 gsw_gnss_set_freq(gnss_freq);
461 if (gnss_startmode >= 0)
462 gsw_gnss_set_start_mode(gnss_startmode);
463 if (gnss_switch_op > 0)
464 gsw_gnss_epo_switch(gnss_switch_op);
465
466 mbtk_gnss_set_VTG();
467
468 return GSW_HAL_SUCCESS;
469}
470
471/**
472 * @brief SDK interface to stop gnss
473 * @param
474 * @retval 0: success
475 * @retval other: fail
476 */
477int gsw_gnss_stop(void)
478{
479 int ret;
480 mbtk_gnss_close=(int(*)(int))dlsym(dlHandle_gnss, "mbtk_gnss_close");
481 ret = mbtk_gnss_close(QSER_GNSS_TIMEOUT);
482 if(ret != 0)
483 {
484 LOGE("[GSW_gnss] mbtk_gnss_close is error.ret = [%d]", ret);
485 return GSW_HAL_FAIL;
486 }
487 strated = false;
488 return GSW_HAL_SUCCESS;
489}
490
491/**
492 * @brief SDK interface to de initialization gnss
493 * @param
494 * @retval 0: success
495 * @retval other: fail
496 */
497int gsw_gnss_deinit(void)
498{
499 int ret;
500 if(inited)
501 {
502 mbtk_gnss_deinit=(int(*)())dlsym(dlHandle_gnss, "mbtk_gnss_deinit");
503 ret = mbtk_gnss_deinit();
504 if(ret == 0)
505 {
506 inited = false;
507 }
508 else
509 {
510 LOGE("[GSW_gnss] mbtk_gnss_init() fail.ret = [%d]", ret);
511 dlclose(dlHandle_gnss);
512 dlHandle_gnss = NULL;
513 return GSW_HAL_FAIL;
514 }
515 }
516
517 dlclose(dlHandle_gnss);
518 dlHandle_gnss = NULL;
519 gnss_freq = -1;
520 gnss_startmode = -1;
521 gnss_switch_op = -1;
522 return GSW_HAL_SUCCESS;
523}
524
525
526/**
527 * @brief SDK interface to enable XTRA switch
528 * @param [in] state
529 * @retval 0: success
530 * @retval other: fail
531 */
532int gsw_gnss_xtra_is_enable(gsw_xtra_state_e state)
533{
534 return GSW_HAL_SUCCESS;
535}
536
537/**
538 * @brief SDK interface to delete aiding data,delete aiding data for cold start(1-H,2-W,3-C)
539 * @param [in] switch_op
540 * @retval 0: success
541 * @retval other: fail
542 */
543int gsw_gnss_delete_aiding_data(unsigned int flags) /*1-don`t delete == hot_start ; 2-delete EPH == warm start ; 3-delete all == cold start*/
544{
545 int ret;
546 char param_buf[32] = {0};
547 snprintf(param_buf, 32, "$RESET,%u", flags);
548 mbtk_gnss_setting=(int(*)(const char *setting_cmd, int))dlsym(dlHandle_gnss, "mbtk_gnss_setting");
549 ret = mbtk_gnss_setting(param_buf, QSER_GNSS_TIMEOUT);
550 if(ret != 0)
551 {
552 LOGE("[qser_gnss] mbtk_gnss_setting fail.ret = [%d]", ret);
553 return GSW_HAL_FAIL;
554 }
555 return GSW_HAL_SUCCESS;
556}
557
558/**
559 * @brief init and configure gps
560 * @param [in] init_configure
561 * @retval 0: success
562 * @retval other: fail
563 */
564int gsw_gnss_init_configure_gps(gsw_gnss_init_configure_t init_configure)
565{
566 return GSW_HAL_SUCCESS;
567}