4 * Copyright (c) 2011-2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Youngae Kang <youngae.kang@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
7 * Genie Kim <daejins.kim@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
27 #include <sys/types.h>
35 #include "gps_plugin_data_types.h"
36 #include "gps_plugin_intf.h"
37 #include "nmea_logger.h"
38 #include "data_connection.h"
40 #include "gps_plugin_module.h"
41 #include "debug_util.h"
42 #include "last_position.h"
45 #include "nps_plugin_module.h"
46 #include "nps_plugin_intf.h"
50 #include <msg_transport.h>
55 #include <vconf-keys.h>
59 #include <glib-object.h>
60 #if !GLIB_CHECK_VERSION (2, 31, 0)
61 #include <glib/gthread.h>
64 #define REPLAY_MODULE "replay"
66 #define PLATFORM_PATH "/sys/devices/platform"
67 #define BRCM4752_PATH PLATFORM_PATH"/bcm4752"
68 #define BRCM47520_PATH PLATFORM_PATH"/bcm47520"
69 #define BRCM47511_PATH PLATFORM_PATH"/bcm47511"
70 #define BRCM47522_PATH PLATFORM_PATH"/bcm47522"
71 #define CSR_PATH PLATFORM_PATH"/gsd4t"
72 #define QCOM8210_PATH PLATFORM_PATH"/msm8210_gps"
73 #define QCOM8x30_PATH PLATFORM_PATH"/msm8x30_gps"
74 #define QCOM9x15_PATH PLATFORM_PATH"/msm9x15_gps"
75 #define QCOM8974_PATH PLATFORM_PATH"/msm8974_gps"
76 #define QCOM8226_PATH PLATFORM_PATH"/msm8226_gps"
77 #define QCOM8916_PATH PLATFORM_PATH"/msm8916_gps"
79 #define MPS_TO_KMPH 3.6 /* 1 m/s = 3.6 km/h */
81 struct gps_callbacks g_update_cb;
87 } gps_plugin_handler_t;
91 } nps_plugin_handler_t;
94 gps_session_state_t session_state;
96 gboolean logging_enabled;
97 gboolean replay_enabled;
100 pthread_t msg_thread; /* Register SUPL NI cb to msg server Thread */
101 pthread_t popup_thread; /* Register SUPL NI cb to msg server Thread */
102 int msg_thread_status;
105 gps_plugin_handler_t gps_plugin;
107 pos_data_t *pos_data;
108 batch_data_t *batch_data;
110 nmea_data_t *nmea_data;
113 gps_server_t *g_gps_server = NULL;
115 nps_plugin_handler_t g_nps_plugin;
117 static void __nps_plugin_handler_deinit(void)
119 if (g_nps_plugin.handle != NULL) {
120 g_nps_plugin.handle = NULL;
124 static int _gps_server_gps_event_cb(gps_event_info_t *gps_event_info, void *user_data);
126 static void _gps_nmea_changed_cb(keynode_t *key, void *data)
128 gps_server_t *server = (gps_server_t *)data;
130 if (setting_get_int(VCONFKEY_LOCATION_NMEA_LOGGING, &int_val) == FALSE) {
131 LOG_GPS(DBG_ERR, "//ERROR!! get VCONFKEY_LOCATION_NMEA_LOGGING setting");
134 server->logging_enabled = (int_val == 1) ? TRUE : FALSE;
138 static gboolean get_replay_enabled()
143 if (setting_get_int(VCONFKEY_LOCATION_REPLAY_ENABLED, &int_val) == FALSE) {
144 LOG_GPS(DBG_ERR, "//ERROR get VCONFKEY_LOCATION_REPLAY_ENABLED setting");
148 ret = (int_val == 1) ? TRUE : FALSE;
153 static void reload_plugin_module(gps_server_t *server)
156 gps_failure_reason_t ReasonCode = GPS_FAILURE_CAUSE_NORMAL;
158 if (server->replay_enabled == TRUE) {
159 module_name = REPLAY_MODULE;
161 module_name = server->gps_plugin.name;
164 LOG_GPS(DBG_LOW, "replay_enabled:%d, Loading plugin.name: %s", server->replay_enabled, module_name);
166 if (!get_plugin_module()->deinit(&ReasonCode)) {
167 LOG_GPS(DBG_ERR, "Fail to GPS plugin deinit");
169 unload_plugin_module(&server->gps_plugin.handle);
170 if (!load_plugin_module(module_name, &server->gps_plugin.handle)) {
171 LOG_GPS(DBG_ERR, "Fail to load %s plugin", module_name);
173 if (!get_plugin_module()->init(_gps_server_gps_event_cb, (void *)server)) {
174 LOG_GPS(DBG_ERR, "Fail to %s plugin init", module_name);
181 static void _gps_replay_changed_cb(keynode_t *key, void *data)
183 gps_server_t *server = (gps_server_t *)data;
184 server->replay_enabled = get_replay_enabled();
185 reload_plugin_module(server);
190 static int _gps_server_get_gps_state()
194 if (setting_get_int(VCONFKEY_LOCATION_GPS_STATE, &val) == FALSE) {
201 static void _gps_server_set_gps_state(int gps_state)
206 case POSITION_CONNECTED:
207 ret = setting_set_int(VCONFKEY_LOCATION_GPS_STATE, POSITION_CONNECTED);
208 gps_dump_log("GPS state : POSITION_CONNECTED", NULL);
210 case POSITION_SEARCHING:
211 ret = setting_set_int(VCONFKEY_LOCATION_GPS_STATE, POSITION_SEARCHING);
212 gps_dump_log("GPS state : POSITION_SEARCHING", NULL);
215 ret = setting_set_int(VCONFKEY_LOCATION_GPS_STATE, POSITION_OFF);
216 gps_dump_log("GPS state : POSITION_OFF", NULL);
219 ret = setting_set_int(VCONFKEY_LOCATION_GPS_STATE, POSITION_OFF);
224 LOG_GPS(DBG_LOW, "Succeed to set VCONFKEY_LOCATION_GPS_STATE");
226 LOG_GPS(DBG_ERR, "Fail to set VCONF_LOCATION_GPS_STATE");
230 int request_change_pos_update_interval_standalone_gps(unsigned int interval)
232 LOG_GPS(DBG_INFO, "request_change_pos_update_interval_standalone_gps. interval[%u]", interval);
233 gboolean status = TRUE;
234 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
235 gps_server_t *server = g_gps_server;
237 if (server->session_state == GPS_SESSION_STARTING || server->session_state == GPS_SESSION_STARTED) {
238 gps_action_change_interval_data_t gps_change_interval_data;
239 gps_change_interval_data.interval = (int)interval;
240 status = get_plugin_module()->request(GPS_ACTION_CHANGE_INTERVAL, &gps_change_interval_data, &reason_code);
241 LOG_GPS(DBG_INFO, "requested go GPS module done. gps_change_interval_data.interval [%d]", gps_change_interval_data.interval);
243 if (status == FALSE) {
244 LOG_GPS(DBG_ERR, "Main: sending GPS_ACTION_CHANGE_INTERVAL Fail !");
247 LOG_GPS(DBG_INFO, "Main: sending GPS_ACTION_CHANGE_INTERVAL OK !");
253 int request_start_session(int interval)
255 LOG_GPS(DBG_INFO, "GPS start with interval [%d]", interval);
257 gboolean status = TRUE;
258 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
259 gps_server_t *server = g_gps_server;
260 gps_action_start_data_t gps_start_data;
262 if (server->session_state != GPS_SESSION_STOPPED && server->session_state != GPS_SESSION_STOPPING) {
263 LOG_GPS(DBG_WARN, "Main: GPS Session Already Started!");
267 server->session_state = GPS_SESSION_STARTING;
268 LOG_GPS(DBG_LOW, "==GPSSessionState[%d]", server->session_state);
269 gps_start_data.interval = interval;
270 status = get_plugin_module()->request(GPS_ACTION_START_SESSION, &gps_start_data, &reason_code);
272 if (status == FALSE) {
273 LOG_GPS(DBG_ERR, "Main: sending GPS_ACTION_START_SESSION Fail !");
277 LOG_GPS(DBG_INFO, "Main: sending GPS_ACTION_START_SESSION OK !");
279 setting_ignore_key_changed(VCONFKEY_LOCATION_REPLAY_ENABLED, _gps_replay_changed_cb);
284 int request_stop_session()
286 gboolean status = TRUE;
287 gboolean cur_replay_enabled = FALSE;
288 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
289 gps_server_t *server = g_gps_server;
291 LOG_GPS(DBG_LOW, "Main: Stop GPS Session, ==GPSSessionState[%d]", server->session_state);
292 if (server->session_state == GPS_SESSION_STARTED || server->session_state == GPS_SESSION_STARTING) {
293 status = get_plugin_module()->request(GPS_ACTION_STOP_SESSION, NULL, &reason_code);
295 server->session_state = GPS_SESSION_STOPPING;
296 LOG_GPS(DBG_LOW, "==GPSSessionState[%d]", server->session_state);
297 cur_replay_enabled = get_replay_enabled();
298 if (server->replay_enabled != cur_replay_enabled) {
299 server->replay_enabled = cur_replay_enabled;
300 reload_plugin_module(server);
302 setting_notify_key_changed(VCONFKEY_LOCATION_REPLAY_ENABLED, _gps_replay_changed_cb, (void *)server);
304 LOG_GPS(DBG_ERR, "plugin->request to LBS_GPS_STOP_SESSION Failed, reasonCode =%d", reason_code);
307 /* If request is not sent, keep the client registed */
308 LOG_GPS(DBG_LOW, "LBS_GPS_STOP_SESSION is not sent because the GPS state is not started, keep the client registed");
313 int request_start_batch_session(int batch_interval, int batch_period)
315 LOG_GPS(DBG_INFO, "Batch: GPS start with interval[%d]", batch_interval);
317 gboolean status = TRUE;
318 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
319 gps_server_t *server = g_gps_server;
320 gps_action_start_data_t gps_start_data;
322 if (server->session_state != GPS_SESSION_STOPPED && server->session_state != GPS_SESSION_STOPPING) {
323 LOG_GPS(DBG_WARN, "Batch: GPS Session Already Started!");
327 server->session_state = GPS_SESSION_STARTING;
328 LOG_GPS(DBG_LOW, "==GPSSessionState[%d]", server->session_state);
329 gps_start_data.interval = batch_interval;
330 gps_start_data.period = batch_period;
331 status = get_plugin_module()->request(GPS_ACTION_START_BATCH, &gps_start_data, &reason_code);
333 if (status == FALSE) {
334 LOG_GPS(DBG_ERR, "Batch: sending GPS_ACTION_START_SESSION Fail !");
338 LOG_GPS(DBG_INFO, "Batch: sending GPS_ACTION_START_SESSION OK !");
340 setting_ignore_key_changed(VCONFKEY_LOCATION_REPLAY_ENABLED, _gps_replay_changed_cb);
345 int request_stop_batch_session()
347 gboolean status = TRUE;
348 gboolean cur_replay_enabled = FALSE;
349 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
350 gps_server_t *server = g_gps_server;
352 LOG_GPS(DBG_LOW, "Batch: Stop GPS Session, ==GPSSessionState[%d]", server->session_state);
353 if (server->session_state == GPS_SESSION_STARTED || server->session_state == GPS_SESSION_STARTING) {
354 status = get_plugin_module()->request(GPS_ACTION_STOP_BATCH, NULL, &reason_code);
356 server->session_state = GPS_SESSION_STOPPING;
357 LOG_GPS(DBG_LOW, "==GPSSessionState[%d]", server->session_state);
358 cur_replay_enabled = get_replay_enabled();
359 if (server->replay_enabled != cur_replay_enabled) {
360 server->replay_enabled = cur_replay_enabled;
361 reload_plugin_module(server);
363 setting_notify_key_changed(VCONFKEY_LOCATION_REPLAY_ENABLED, _gps_replay_changed_cb, (void *)server);
365 LOG_GPS(DBG_ERR, "plugin->request to LBS_GPS_STOP_SESSION Failed, reasonCode =%d", reason_code);
368 /* If request is not sent, keep the client registed */
369 LOG_GPS(DBG_LOW, " LBS_GPS_STOP_SESSION is not sent because the GPS state is not started, keep the client registed ");
374 int request_add_geofence(int fence_id, double latitude, double longitude, int radius, int last_state, int monitor_states, int notification_responsiveness, int unknown_timer)
376 gboolean status = FALSE;
377 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
378 geofence_action_data_t action_data;
380 action_data.geofence.geofence_id = fence_id;
381 action_data.geofence.latitude = latitude;
382 action_data.geofence.longitude = longitude;
383 action_data.geofence.radius = radius;
384 action_data.last_state = last_state;
385 action_data.monitor_states = monitor_states;
386 /* Default value : temp */
387 action_data.notification_responsiveness_ms = 5000;
388 action_data.unknown_timer_ms = 30000;
389 /*action_data.notification_responsiveness_ms = notification_responsiveness; */
390 /*action_data.unknown_timer_ms = unknown_timer; */
392 LOG_GPS(DBG_LOW, "request_add_geofence with geofence_id [%d]", fence_id);
393 status = get_plugin_module()->request(GPS_ACTION_ADD_GEOFENCE, &action_data, &reason_code);
398 int request_delete_geofence(int fence_id)
400 gboolean status = FALSE;
401 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
403 LOG_GPS(DBG_LOW, "request_delete_geofence with geofence_id [%d]", fence_id);
404 status = get_plugin_module()->request(GPS_ACTION_DELETE_GEOFENCE, &fence_id, &reason_code);
409 int request_pause_geofence(int fence_id)
411 gboolean status = FALSE;
412 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
414 LOG_GPS(DBG_LOW, "request_pause_geofence with geofence_id [%d]", fence_id);
415 status = get_plugin_module()->request(GPS_ACTION_PAUSE_GEOFENCE, &fence_id, &reason_code);
420 int request_resume_geofence(int fence_id, int monitor_states)
422 gboolean status = FALSE;
423 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
424 geofence_action_data_t action_data;
426 action_data.geofence.geofence_id = fence_id;
427 action_data.monitor_states = monitor_states;
429 LOG_GPS(DBG_LOW, "request_resume_geofence with geofence_id [%d]", fence_id);
430 status = get_plugin_module()->request(GPS_ACTION_RESUME_GEOFENCE, &action_data, &reason_code);
435 int request_delete_gps_data()
437 gboolean status = TRUE;
438 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
440 status = get_plugin_module()->request(GPS_ACTION_DELETE_GPS_DATA, NULL, &reason_code);
442 if (status == FALSE) {
443 LOG_GPS(DBG_ERR, "Fail : GPS_ACTION_DELETE_GPS_DATA [%d]", reason_code);
447 LOG_GPS(DBG_LOW, "Success to GPS_ACTION_DELETE_GPS_DATA");
451 int get_nmea_from_server(int *timestamp, char **nmea_data)
453 LOG_GPS(DBG_INFO, "ENTER >>>");
455 gps_server_t *server = g_gps_server;
457 if (server->session_state == GPS_SESSION_STARTING || server->session_state == GPS_SESSION_STARTED) {
458 *timestamp = (int) server->nmea_data->timestamp;
459 *nmea_data = g_strndup(server->nmea_data->data, server->nmea_data->len);
461 LOG_GPS(DBG_LOW, "=== timestmap: %d, nmea_data: %s", *timestamp, *nmea_data);
465 static void _gps_plugin_handler_init(gps_server_t *server, char *module_name)
467 if (module_name == NULL) {
468 LOG_GPS(DBG_ERR, "Fail : module_name is NULL");
472 server->gps_plugin.handle = NULL;
473 server->gps_plugin.name = (char *)malloc(strlen(module_name) + 1);
474 g_return_if_fail(server->gps_plugin.name);
476 g_strlcpy(server->gps_plugin.name, module_name, strlen(module_name) + 1);
479 static void _gps_plugin_handler_deinit(gps_server_t *server)
481 if (server->gps_plugin.handle != NULL) {
482 server->gps_plugin.handle = NULL;
485 if (server->gps_plugin.name != NULL) {
486 free(server->gps_plugin.name);
487 server->gps_plugin.name = NULL;
491 static void _gps_get_nmea_replay_mode(gps_server_t *server)
495 if (setting_get_int(VCONFKEY_LOCATION_NMEA_LOGGING, &int_val) == FALSE) {
496 LOG_GPS(DBG_ERR, "//ERROR!! get VCONFKEY_LOCATION_NMEA_LOGGING setting");
499 server->logging_enabled = (int_val == 1) ? TRUE : FALSE;
501 if (setting_get_int(VCONFKEY_LOCATION_REPLAY_ENABLED, &int_val) == FALSE) {
502 LOG_GPS(DBG_ERR, "//ERROR!! get VCONFKEY_LOCATION_REPLAY_ENABLED setting");
505 server->replay_enabled = (int_val == 1) ? TRUE : FALSE;
508 static void _gps_notify_params(gps_server_t *server)
510 setting_notify_key_changed(VCONFKEY_LOCATION_NMEA_LOGGING, _gps_nmea_changed_cb, (void *)server);
511 setting_notify_key_changed(VCONFKEY_LOCATION_REPLAY_ENABLED, _gps_replay_changed_cb, (void *)server);
514 static void _gps_ignore_params()
516 setting_ignore_key_changed(VCONFKEY_LOCATION_NMEA_LOGGING, _gps_nmea_changed_cb);
517 setting_ignore_key_changed(VCONFKEY_LOCATION_REPLAY_ENABLED, _gps_replay_changed_cb);
520 static void _gps_server_start_event(gps_server_t *server)
522 LOG_GPS(DBG_LOW, "==GPSSessionState [%d] -> [%d]", server->session_state, GPS_SESSION_STARTED);
523 server->session_state = GPS_SESSION_STARTED;
525 if (server->logging_enabled) {
526 LOG_GPS(DBG_LOW, "NMEA STARTED");
530 if (server->pos_data == NULL) {
531 server->pos_data = (pos_data_t *) malloc(sizeof(pos_data_t));
532 if (server->pos_data == NULL) {
533 LOG_GPS(DBG_WARN, "//callback: server->pos_data re-malloc Failed!!");
535 memset(server->pos_data, 0x00, sizeof(pos_data_t));
538 if (server->batch_data == NULL) {
539 server->batch_data = (batch_data_t *) malloc(sizeof(batch_data_t));
540 if (server->batch_data == NULL) {
541 LOG_GPS(DBG_WARN, "//callback: server->batch_data re-malloc Failed!!");
543 memset(server->batch_data, 0x00, sizeof(batch_data_t));
546 if (server->sv_data == NULL) {
547 server->sv_data = (sv_data_t *) malloc(sizeof(sv_data_t));
548 if (server->sv_data == NULL) {
549 LOG_GPS(DBG_WARN, "//callback: server->sv_data re-malloc Failed!!");
551 memset(server->sv_data, 0x00, sizeof(sv_data_t));
554 if (server->nmea_data == NULL) {
555 server->nmea_data = (nmea_data_t *) malloc(sizeof(nmea_data_t));
556 if (server->nmea_data == NULL) {
557 LOG_GPS(DBG_WARN, "//callback: server->nmea_data re-malloc Failed!!");
559 memset(server->nmea_data, 0x00, sizeof(nmea_data_t));
563 _gps_server_set_gps_state(POSITION_SEARCHING);
564 #ifdef _TIZEN_PUBLIC_
565 pm_lock_state(LCD_OFF, STAY_CUR_STATE, 0);
569 static void _gps_server_stop_event(gps_server_t *server)
571 LOG_GPS(DBG_LOW, "==GPSSessionState [%d] -> [%d]", server->session_state, GPS_SESSION_STOPPED);
572 server->session_state = GPS_SESSION_STOPPED;
574 _gps_server_set_gps_state(POSITION_OFF);
575 #ifdef _TIZEN_PUBLIC_
576 pm_unlock_state(LCD_OFF, PM_RESET_TIMER);
579 if (server->logging_enabled) {
580 LOG_GPS(DBG_LOW, "NMEA STOPPED");
585 static void _report_pos_event(gps_server_t *server, gps_event_info_t *gps_event)
587 if (server->pos_data != NULL) {
588 memset(server->pos_data, 0x00, sizeof(pos_data_t)); /* Moved: the address of server->pos_data sometimes returns 0 when stopping GPS */
589 memcpy(server->pos_data, &(gps_event->event_data.pos_ind.pos), sizeof(pos_data_t));
590 /* change m/s to km/h */
591 server->pos_data->speed = server->pos_data->speed * MPS_TO_KMPH;
592 gps_set_position(server->pos_data);
593 g_update_cb.pos_cb(server->pos_data, gps_event->event_data.pos_ind.error, g_user_data);
595 LOG_GPS(DBG_ERR, "server->pos_data is NULL");
599 static void _report_batch_event(gps_server_t *server, gps_event_info_t *gps_event)
601 if (server->batch_data != NULL) {
602 memset(server->batch_data, 0x00, sizeof(batch_data_t));
603 memcpy(server->batch_data, &(gps_event->event_data.batch_ind.batch), sizeof(batch_data_t));
604 g_update_cb.batch_cb(server->batch_data, g_user_data);
606 LOG_GPS(DBG_ERR, "server->batch_data is NULL");
610 static void _report_sv_event(gps_server_t *server, gps_event_info_t *gps_event)
612 if (server->sv_data != NULL) {
613 memset(server->sv_data, 0x00, sizeof(sv_data_t));
614 memcpy(server->sv_data, &(gps_event->event_data.sv_ind.sv), sizeof(sv_data_t));
615 g_update_cb.sv_cb(server->sv_data, g_user_data);
617 LOG_GPS(DBG_ERR, "server->sv_data is NULL");
621 static void _report_nmea_event(gps_server_t *server, gps_event_info_t *gps_event)
623 if (server->nmea_data == NULL) {
624 LOG_GPS(DBG_ERR, "server->nmea_data is NULL");
628 if (server->nmea_data->data) {
629 free(server->nmea_data->data);
630 server->nmea_data->data = NULL;
633 /*LOG_GPS(DBG_LOW, "server->nmea_data->len : [%d]", gps_event->event_data.nmea_ind.nmea.len); */
634 server->nmea_data->len = gps_event->event_data.nmea_ind.nmea.len;
635 server->nmea_data->data = (char *)malloc(server->nmea_data->len);
636 if (server->nmea_data->data == NULL) {
637 LOG_GPS(DBG_ERR, "Fail to malloc of server->nmea_data->data");
640 memset(server->nmea_data->data, 0x00, server->nmea_data->len);
641 memcpy(server->nmea_data->data, gps_event->event_data.nmea_ind.nmea.data, server->nmea_data->len);
642 g_update_cb.nmea_cb(server->nmea_data, g_user_data);
644 if (server->logging_enabled) {
647 nmea_len = gps_event->event_data.nmea_ind.nmea.len;
648 p_nmea_data = gps_event->event_data.nmea_ind.nmea.data;
649 write_nmea_log(p_nmea_data, nmea_len);
653 static int _gps_server_open_data_connection(gps_server_t *server)
655 LOG_GPS(DBG_LOW, "Enter _gps_server_open_data_connection");
659 if (server->dnet_used > 1) {
660 LOG_GPS(DBG_LOW, "dnet_used : count[ %d ]", server->dnet_used);
663 LOG_GPS(DBG_LOW, "First open the data connection");
666 unsigned char result;
668 result = start_pdp_connection();
670 if (result == TRUE) {
671 LOG_GPS(DBG_LOW, "//Open PDP Conn for SUPL Success.");
673 LOG_GPS(DBG_ERR, "//Open PDP Conn for SUPL Fail.");
679 static int _gps_server_close_data_connection(gps_server_t *server)
681 LOG_GPS(DBG_LOW, "Enter _gps_server_close_data_connection");
683 if (server->dnet_used > 0) {
687 if (server->dnet_used != 0) {
688 LOG_GPS(DBG_LOW, "Cannot stop the data connection! [ dnet_used : %d ]", server->dnet_used);
691 LOG_GPS(DBG_LOW, "Close the data connection");
694 unsigned char result;
696 result = stop_pdp_connection();
697 if (result == TRUE) {
698 LOG_GPS(DBG_LOW, "Close PDP Conn for SUPL Success.");
700 LOG_GPS(DBG_ERR, "//Close PDP Conn for SUPL Fail.");
707 static int _gps_server_resolve_dns(char *domain)
709 LOG_GPS(DBG_LOW, "Enter _gps_server_resolve_dns");
711 unsigned char result;
712 gps_failure_reason_t reason_code = GPS_FAILURE_CAUSE_NORMAL;
716 result = query_dns(domain, &ipaddr, &port);
717 if (result == TRUE) {
718 LOG_GPS(DBG_LOW, "Success to resolve domain name [ %s ] / ipaddr [ %u ]", domain, ipaddr);
719 get_plugin_module()->request(GPS_INDI_SUPL_DNSQUERY, (void *)(&ipaddr), &reason_code);
722 LOG_GPS(DBG_ERR, "Fail to resolve domain name [ %s ] / ipaddr [ %u ]", domain, ipaddr);
723 get_plugin_module()->request(GPS_INDI_SUPL_DNSQUERY, (void *)(&ipaddr), &reason_code);
730 static void _gps_server_send_facttest_result(double snr_data, int prn, unsigned short result)
734 static void _report_geofence_transition(int geofence_id, geofence_zone_state_t transition, double latitude, double longitude, double altitude, double speed, double bearing, double hor_accuracy)
736 gps_update_geofence_transition(geofence_id, transition, latitude, longitude, altitude, speed, bearing, hor_accuracy, (void *)g_user_data);
739 static void _report_geofence_service_status(int status)
741 gps_update_geofence_service_status(status, (void *)g_user_data);
744 static void _gps_server_send_geofence_result(geofence_event_e event, int geofence_id, int result)
747 LOG_GPS(DBG_ERR, "result is [%d]", result);
752 case GEOFENCE_ADD_FENCE:
753 LOG_GPS(DBG_LOW, "Geofence ID[%d], Success ADD_GEOFENCE", geofence_id);
755 case GEOFENCE_DELETE_FENCE:
756 LOG_GPS(DBG_LOW, "Geofence ID[%d], Success DELETE_GEOFENCE", geofence_id);
758 case GEOFENCE_PAUSE_FENCE:
759 LOG_GPS(DBG_LOW, "Geofence ID[%d], Success PAUSE_GEOFENCE", geofence_id);
761 case GEOFENCE_RESUME_FENCE:
762 LOG_GPS(DBG_LOW, "Geofence ID[%d], Success RESUME_GEOFENCE", geofence_id);
769 static int _gps_server_gps_event_cb(gps_event_info_t *gps_event_info, void *user_data)
771 /*FUNC_ENTRANCE_SERVER; */
772 gps_server_t *server = (gps_server_t *)user_data;
774 if (gps_event_info == NULL) {
775 LOG_GPS(DBG_WARN, "//NULL pointer variable passed");
779 switch (gps_event_info->event_id) {
780 case GPS_EVENT_START_SESSION:
781 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_START_SESSION :::::::::::::::");
782 if (gps_event_info->event_data.start_session_rsp.error == GPS_ERR_NONE) {
783 _gps_server_start_event(server);
785 LOG_GPS(DBG_ERR, "//Start Session Failed, error : %d",
786 gps_event_info->event_data.start_session_rsp.error);
789 case GPS_EVENT_SET_OPTION: {
790 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_SET_OPTION :::::::::::::::");
791 if (gps_event_info->event_data.set_option_rsp.error != GPS_ERR_NONE) {
792 LOG_GPS(DBG_ERR, "//Set Option Failed, error : %d",
793 gps_event_info->event_data.set_option_rsp.error);
798 case GPS_EVENT_STOP_SESSION:
799 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_STOP_SESSION :::::::::::::::");
800 if (gps_event_info->event_data.stop_session_rsp.error == GPS_ERR_NONE) {
801 _gps_server_close_data_connection(server);
802 _gps_server_stop_event(server);
804 LOG_GPS(DBG_ERR, "//Stop Session Failed, error : %d",
805 gps_event_info->event_data.stop_session_rsp.error);
809 case GPS_EVENT_CHANGE_INTERVAL:
810 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_CHANGE_INTERVAL :::::::::::::::");
811 if (gps_event_info->event_data.change_interval_rsp.error == GPS_ERR_NONE) {
812 LOG_GPS(DBG_LOW, "Change interval success.");
814 LOG_GPS(DBG_ERR, "//Change interval Failed, error : %d",
815 gps_event_info->event_data.change_interval_rsp.error);
818 case GPS_EVENT_REPORT_POSITION:
819 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_POSITION :::::::::::::::");
820 if (gps_event_info->event_data.pos_ind.error == GPS_ERR_NONE) {
821 _report_pos_event(server, gps_event_info);
823 LOG_GPS(DBG_ERR, "GPS_EVENT_POSITION Failed, error : %d", gps_event_info->event_data.pos_ind.error);
826 case GPS_EVENT_REPORT_BATCH:
827 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_BATCH :::::::::::::::");
828 if (gps_event_info->event_data.batch_ind.error == GPS_ERR_NONE) {
829 _report_batch_event(server, gps_event_info);
831 LOG_GPS(DBG_ERR, "GPS_EVENT_BATCH Failed, error : %d", gps_event_info->event_data.batch_ind.error);
834 case GPS_EVENT_REPORT_SATELLITE:
835 if (gps_event_info->event_data.sv_ind.error == GPS_ERR_NONE) {
836 if (gps_event_info->event_data.sv_ind.sv.pos_valid) {
837 if (_gps_server_get_gps_state() != POSITION_CONNECTED)
838 _gps_server_set_gps_state(POSITION_CONNECTED);
840 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_SATELLITE :::::::::::::::");
841 if (_gps_server_get_gps_state() != POSITION_SEARCHING)
842 _gps_server_set_gps_state(POSITION_SEARCHING);
844 _report_sv_event(server, gps_event_info);
846 LOG_GPS(DBG_ERR, "GPS_EVENT_SATELLITE Failed, error : %d", gps_event_info->event_data.sv_ind.error);
849 case GPS_EVENT_REPORT_NMEA:
850 if (_gps_server_get_gps_state() != POSITION_CONNECTED) {
851 /*LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_NMEA :::::::::::::::"); */
854 if (gps_event_info->event_data.nmea_ind.error == GPS_ERR_NONE) {
855 _report_nmea_event(server, gps_event_info);
857 LOG_GPS(DBG_ERR, "GPS_EVENT_NMEA Failed, error : %d", gps_event_info->event_data.nmea_ind.error);
860 case GPS_EVENT_ERR_CAUSE:
862 case GPS_EVENT_AGPS_VERIFICATION_INDI:
864 case GPS_EVENT_GET_IMSI:
866 case GPS_EVENT_GET_REF_LOCATION:
868 case GPS_EVENT_OPEN_DATA_CONNECTION: {
869 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_OPEN_DATA_CONNECTION :::::::::::::::");
870 result = _gps_server_open_data_connection(server);
873 case GPS_EVENT_CLOSE_DATA_CONNECTION: {
874 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_CLOSE_DATA_CONNECTION :::::::::::::::");
875 result = _gps_server_close_data_connection(server);
878 case GPS_EVENT_DNS_LOOKUP_IND:
879 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_DNS_LOOKUP_IND :::::::::::::::");
880 if (gps_event_info->event_data.dns_query_ind.error == GPS_ERR_NONE) {
881 result = _gps_server_resolve_dns(gps_event_info->event_data.dns_query_ind.domain_name);
885 if (result == TRUE) {
886 LOG_GPS(DBG_LOW, "Success to get the DNS Query about [ %s ]",
887 gps_event_info->event_data.dns_query_ind.domain_name);
890 case GPS_EVENT_FACTORY_TEST:
891 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_FACTORY_TEST :::::::::::::::");
892 if (gps_event_info->event_data.factory_test_rsp.error == GPS_ERR_NONE) {
893 LOG_GPS(DBG_LOW, "[LBS server] Response Factory test result success");
894 _gps_server_send_facttest_result(gps_event_info->event_data.factory_test_rsp.snr,
895 gps_event_info->event_data.factory_test_rsp.prn, TRUE);
897 LOG_GPS(DBG_ERR, "//[LBS server] Response Factory test result ERROR");
898 _gps_server_send_facttest_result(gps_event_info->event_data.factory_test_rsp.snr,
899 gps_event_info->event_data.factory_test_rsp.prn, FALSE);
902 case GPS_EVENT_GEOFENCE_TRANSITION:
903 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_GEOFENCE_TRANSITION :::::::::::::::");
904 _report_geofence_transition(gps_event_info->event_data.geofence_transition_ind.geofence_id,
905 gps_event_info->event_data.geofence_transition_ind.state,
906 gps_event_info->event_data.geofence_transition_ind.pos.latitude,
907 gps_event_info->event_data.geofence_transition_ind.pos.longitude,
908 gps_event_info->event_data.geofence_transition_ind.pos.altitude,
909 gps_event_info->event_data.geofence_transition_ind.pos.speed,
910 gps_event_info->event_data.geofence_transition_ind.pos.bearing,
911 gps_event_info->event_data.geofence_transition_ind.pos.hor_accuracy);
913 case GPS_EVENT_GEOFENCE_STATUS:
914 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_GEOFENCE_STATUS :::::::::::::::");
915 _report_geofence_service_status(gps_event_info->event_data.geofence_status_ind.status);
917 case GPS_EVENT_ADD_GEOFENCE:
918 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_ADD_GEOFENCE :::::::::::::::");
919 _gps_server_send_geofence_result(GEOFENCE_ADD_FENCE,
920 gps_event_info->event_data.geofence_event_rsp.geofence_id,
921 gps_event_info->event_data.geofence_event_rsp.error);
923 case GPS_EVENT_DELETE_GEOFENCE:
924 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_DELETE_GEOFENCE :::::::::::::::");
925 _gps_server_send_geofence_result(GEOFENCE_DELETE_FENCE,
926 gps_event_info->event_data.geofence_event_rsp.geofence_id,
927 gps_event_info->event_data.geofence_event_rsp.error);
929 case GPS_EVENT_PAUSE_GEOFENCE:
930 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_PAUSE_GEOFENCE :::::::::::::::");
931 _gps_server_send_geofence_result(GEOFENCE_PAUSE_FENCE,
932 gps_event_info->event_data.geofence_event_rsp.geofence_id,
933 gps_event_info->event_data.geofence_event_rsp.error);
935 case GPS_EVENT_RESUME_GEOFENCE:
936 LOG_GPS(DBG_LOW, "<<::::::::::: GPS_EVENT_RESUME_GEOFENCE :::::::::::::::");
937 _gps_server_send_geofence_result(GEOFENCE_RESUME_FENCE,
938 gps_event_info->event_data.geofence_event_rsp.geofence_id,
939 gps_event_info->event_data.geofence_event_rsp.error);
942 LOG_GPS(DBG_WARN, "//Error: Isettingalid Event Type %d", gps_event_info->event_id);
948 #ifndef _TIZEN_PUBLIC_
949 int request_supl_ni_session(const char *header, const char *body, int size)
951 agps_supl_ni_info_t info;
952 gps_failure_reason_t reason_code;
954 info.msg_body = (char *)body;
955 info.msg_size = size;
958 if (!get_plugin_module()->request(GPS_ACTION_REQUEST_SUPL_NI, &info, &reason_code)) {
959 LOG_GPS(DBG_ERR, "Failed to request SUPL NI (code:%d)", reason_code);
966 static void *request_supl_ni_session(void *data)
968 gps_ni_data_t *ni_data = (gps_ni_data_t *) data;
969 agps_supl_ni_info_t info;
970 gps_failure_reason_t reason_code;
972 info.msg_body = (char *)ni_data->msg_body;
973 info.msg_size = ni_data->msg_size;
976 if (!get_plugin_module()->request(GPS_ACTION_REQUEST_SUPL_NI, &info, &reason_code)) {
977 LOG_GPS(DBG_ERR, "Failed to request SUPL NI (code:%d)", reason_code);
985 static void _gps_supl_networkinit_smscb(msg_handle_t hMsgHandle, msg_struct_t msg, void *user_param)
987 LOG_GPS(DBG_ERR, "_gps_supl_networkinit_smscb is called");
988 gps_server_t *server = (gps_server_t *)user_param;
990 gps_ni_data_t *new_message = NULL;
992 new_message = (gps_ni_data_t *)malloc(sizeof(gps_ni_data_t));
993 memset(new_message, 0x00, sizeof(gps_ni_data_t));
994 msg_get_int_value(msg, MSG_MESSAGE_DATA_SIZE_INT, &new_message->msg_size);
995 msg_get_str_value(msg, MSG_MESSAGE_SMS_DATA_STR, new_message->msg_body, new_message->msg_size);
998 pthread_attr_init(&attr);
999 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1001 if (pthread_create(&server->popup_thread, &attr, request_supl_ni_session, new_message) != 0) {
1002 LOG_GPS(DBG_WARN, "Can not make pthread......");
1006 static void _gps_supl_networkinit_wappushcb(msg_handle_t hMsgHandle, const char *pPushHeader, const char *pPushBody,
1007 int pushBodyLen, void *user_param)
1009 gps_server_t *server = (gps_server_t *)user_param;
1012 LOG_GPS(DBG_ERR, "_gps_supl_networkinit_wappushcb is called");
1014 if (strstr(pPushHeader, "application/vnd.omaloc-supl-init") != NULL) {
1015 str = strstr(pPushHeader, "X-Wap-Application-Id:");
1017 if (strncmp(str + 22, "x-oma-application:ulp.ua", 24) != 0) {
1018 LOG_GPS(DBG_ERR, "Wrong Application-ID");
1023 gps_ni_data_t *new_message = NULL;
1025 new_message = (gps_ni_data_t *) malloc(sizeof(gps_ni_data_t));
1026 new_message->msg_body = (char *)pPushBody;
1027 new_message->msg_size = pushBodyLen;
1029 pthread_attr_t attr;
1030 pthread_attr_init(&attr);
1031 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1033 if (pthread_create(&server->popup_thread, &attr, request_supl_ni_session, new_message) != 0) {
1034 LOG_GPS(DBG_WARN, "Can not make pthread......");
1038 static void *_gps_register_msgfwcb(void *data)
1040 gps_server_t *server = (gps_server_t *)data;
1041 msg_handle_t msgHandle = NULL;
1042 msg_error_t err = MSG_SUCCESS;
1050 ret = vconf_get_bool(VCONFKEY_MSG_SERVER_READY, &setValue);
1053 LOG_GPS(DBG_WARN, "Fail to get VCONFKEY_MSG_SERVER_READY");
1058 LOG_GPS(DBG_LOW, "MSG server is READY!!");
1064 LOG_GPS(DBG_WARN, "Never connect to MSG Server for 300 secs.");
1070 err = msg_open_msg_handle(&msgHandle);
1072 if (err != MSG_SUCCESS) {
1073 LOG_GPS(DBG_WARN, "Fail to MsgOpenMsgHandle. Error type = [ %d ]", err);
1077 err = msg_reg_sms_message_callback(msgHandle, &_gps_supl_networkinit_smscb, 7275, (void *)server);
1079 if (err != MSG_SUCCESS) {
1080 LOG_GPS(DBG_WARN, "Fail to MsgRegSmsMessageCallback. Error type = [ %d ]", err);
1084 err = msg_reg_lbs_message_callback(msgHandle, &_gps_supl_networkinit_wappushcb, (void *)server);
1086 if (err != MSG_SUCCESS) {
1087 LOG_GPS(DBG_WARN, "Fail to MsgRegLBSMessageCallback. Error type = [ %d ]", err);
1091 LOG_GPS(DBG_LOW, "Success to lbs_register_msgfwcb");
1097 void check_plugin_module(char *module_name)
1099 if (get_replay_enabled() == TRUE) {
1100 g_strlcpy(module_name, "replay", strlen("replay") + 1);
1101 LOG_GPS(DBG_LOW, "REPLAY_ENABELD is TRUE");
1102 } else if (access(BRCM4752_PATH, F_OK) == 0 || access(BRCM47520_PATH, F_OK) == 0 ||
1103 access(BRCM47522_PATH, F_OK) == 0) {
1104 g_strlcpy(module_name, "brcm", strlen("brcm") + 1);
1105 } else if (access(BRCM47511_PATH, F_OK) == 0) {
1106 g_strlcpy(module_name, "brcm-legacy", strlen("brcm-legacy") + 1);
1107 } else if (access(CSR_PATH, F_OK) == 0) {
1108 g_strlcpy(module_name, "csr", strlen("csr") + 1);
1109 } else if (access(QCOM8x30_PATH, F_OK) == 0 || access(QCOM9x15_PATH, F_OK) == 0 ||
1110 access(QCOM8974_PATH, F_OK) == 0 || access(QCOM8210_PATH, F_OK) == 0 ||
1111 access(QCOM8226_PATH, F_OK) == 0 || access(QCOM8916_PATH, F_OK) == 0) {
1112 g_strlcpy(module_name, "qcom", strlen("qcom") + 1);
1114 g_strlcpy(module_name, "replay", strlen("replay") + 1);
1117 LOG_GPS(DBG_LOW, "module name : %s", module_name);
1120 static gps_server_t *_initialize_gps_data(void)
1122 g_gps_server = (gps_server_t *) malloc(sizeof(gps_server_t));
1123 if (g_gps_server == NULL) {
1124 LOG_GPS(DBG_ERR, "Failed to alloc g_gps_server");
1127 memset(g_gps_server, 0x00, sizeof(gps_server_t));
1129 g_gps_server->session_state = GPS_SESSION_STOPPED;
1130 g_gps_server->dnet_used = 0;
1131 g_gps_server->logging_enabled = FALSE;
1132 g_gps_server->replay_enabled = FALSE;
1133 #ifdef _TIZEN_PUBLIC_
1134 g_gps_server->msg_thread = 0;
1135 g_gps_server->popup_thread = 0;
1138 memset(&g_gps_server->gps_plugin, 0x00, sizeof(gps_plugin_handler_t));
1140 if (g_gps_server->pos_data == NULL) {
1141 g_gps_server->pos_data = (pos_data_t *) malloc(sizeof(pos_data_t));
1142 if (g_gps_server->pos_data == NULL) {
1143 LOG_GPS(DBG_ERR, "Failed to alloc g_gps_server->pos_data");
1146 memset(g_gps_server->pos_data, 0x00, sizeof(pos_data_t));
1150 if (g_gps_server->batch_data == NULL) {
1151 g_gps_server->batch_data = (batch_data_t *) malloc(sizeof(batch_data_t));
1152 if (g_gps_server->batch_data == NULL) {
1153 LOG_GPS(DBG_ERR, "Failed to alloc g_gps_server->batch_data");
1156 memset(g_gps_server->batch_data, 0x00, sizeof(batch_data_t));
1160 if (g_gps_server->sv_data == NULL) {
1161 g_gps_server->sv_data = (sv_data_t *) malloc(sizeof(sv_data_t));
1162 if (g_gps_server->sv_data == NULL) {
1163 LOG_GPS(DBG_ERR, "Failed to alloc g_gps_server->sv_data");
1166 memset(g_gps_server->sv_data, 0x00, sizeof(sv_data_t));
1170 if (g_gps_server->nmea_data == NULL) {
1171 g_gps_server->nmea_data = (nmea_data_t *) malloc(sizeof(nmea_data_t));
1172 if (g_gps_server->nmea_data == NULL) {
1173 LOG_GPS(DBG_ERR, "Failed to alloc g_gps_server->nmea_data");
1176 memset(g_gps_server->nmea_data, 0x00, sizeof(nmea_data_t));
1180 return g_gps_server;
1183 static void _deinitialize_gps_data(void)
1185 if (g_gps_server->pos_data != NULL) {
1186 free(g_gps_server->pos_data);
1187 g_gps_server->pos_data = NULL;
1190 if (g_gps_server->batch_data != NULL) {
1191 free(g_gps_server->batch_data);
1192 g_gps_server->batch_data = NULL;
1195 if (g_gps_server->sv_data != NULL) {
1196 free(g_gps_server->sv_data);
1197 g_gps_server->sv_data = NULL;
1200 if (g_gps_server->nmea_data != NULL) {
1201 if (g_gps_server->nmea_data->data != NULL) {
1202 free(g_gps_server->nmea_data->data);
1203 g_gps_server->nmea_data->data = NULL;
1205 free(g_gps_server->nmea_data);
1206 g_gps_server->nmea_data = NULL;
1209 if (g_gps_server != NULL) {
1211 g_gps_server = NULL;
1215 int initialize_server(int argc, char **argv)
1217 FUNC_ENTRANCE_SERVER;
1219 gps_server_t *server;
1220 char module_name[16];
1222 server = _initialize_gps_data();
1225 check_plugin_module(module_name);
1226 _gps_plugin_handler_init(server, module_name);
1227 _gps_get_nmea_replay_mode(server);
1228 _gps_notify_params(server);
1230 if (!load_plugin_module(server->gps_plugin.name, &server->gps_plugin.handle)) {
1231 LOG_GPS(DBG_ERR, "Fail to load plugin module.");
1235 if (!get_plugin_module()->init(_gps_server_gps_event_cb, (void *)server)) {
1236 LOG_GPS(DBG_WARN, "Fail to gps module initialization");
1240 #ifdef _TIZEN_PUBLIC_
1241 if (pthread_create(&g_gps_server->msg_thread, NULL, _gps_register_msgfwcb, g_gps_server) != 0) {
1242 LOG_GPS(DBG_WARN, "Can not make pthread......");
1246 LOG_GPS(DBG_LOW, "Initialization-gps is completed.");
1248 if (!nps_load_plugin_module(&g_nps_plugin.handle)) {
1249 LOG_NPS(DBG_ERR, "Fail to load lbs_server_NPS plugin module.");
1250 __nps_plugin_handler_deinit();
1251 return 0; /* TBD: how to deal with this error situation */
1254 LOG_NPS(DBG_LOW, "Initialization-nps is completed.");
1259 int deinitialize_server()
1261 gps_failure_reason_t ReasonCode = GPS_FAILURE_CAUSE_NORMAL;
1263 #ifdef _TIZEN_PUBLIC_
1264 pthread_join(g_gps_server->msg_thread, (void *)&g_gps_server->msg_thread_status);
1267 _gps_ignore_params();
1269 if (!get_plugin_module()->deinit(&ReasonCode)) {
1270 LOG_GPS(DBG_WARN, "Fail to gps module de-initialization");
1272 unload_plugin_module(g_gps_server->gps_plugin.handle);
1274 _gps_plugin_handler_deinit(g_gps_server);
1275 _deinitialize_gps_data();
1277 nps_unload_plugin_module(g_nps_plugin.handle);
1278 __nps_plugin_handler_deinit();
1283 int register_update_callbacks(struct gps_callbacks *gps_callback, void *user_data)
1285 g_update_cb = *gps_callback;
1286 g_user_data = user_data;