summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/LocAdapterBase.cpp4
-rw-r--r--core/LocAdapterBase.h1
-rw-r--r--loc_api/libloc_api_50001/LocEngAdapter.cpp4
-rw-r--r--loc_api/libloc_api_50001/LocEngAdapter.h1
-rw-r--r--loc_api/libloc_api_50001/loc.cpp46
-rw-r--r--loc_api/libloc_api_50001/loc.h2
-rw-r--r--loc_api/libloc_api_50001/loc_eng.cpp49
-rw-r--r--loc_api/libloc_api_50001/loc_eng.h1
-rw-r--r--loc_api/libloc_api_50001/loc_eng_msg.h7
9 files changed, 102 insertions, 13 deletions
diff --git a/core/LocAdapterBase.cpp b/core/LocAdapterBase.cpp
index a65cb31..eea8edd 100644
--- a/core/LocAdapterBase.cpp
+++ b/core/LocAdapterBase.cpp
@@ -128,4 +128,8 @@ DEFAULT_IMPL(false)
bool LocAdapterBase::
requestNiNotify(GpsNiNotification &notify, const void* data)
DEFAULT_IMPL(false)
+
+void LocAdapterBase::
+ shutdown()
+DEFAULT_IMPL()
} // namespace loc_core
diff --git a/core/LocAdapterBase.h b/core/LocAdapterBase.h
index 4e6ff24..02b0987 100644
--- a/core/LocAdapterBase.h
+++ b/core/LocAdapterBase.h
@@ -100,6 +100,7 @@ public:
virtual bool requestNiNotify(GpsNiNotification &notify,
const void* data);
inline virtual bool isInSession() { return false; }
+ virtual void shutdown();
};
} // namespace loc_core
diff --git a/loc_api/libloc_api_50001/LocEngAdapter.cpp b/loc_api/libloc_api_50001/LocEngAdapter.cpp
index 4400081..db9f26c 100644
--- a/loc_api/libloc_api_50001/LocEngAdapter.cpp
+++ b/loc_api/libloc_api_50001/LocEngAdapter.cpp
@@ -53,6 +53,10 @@ void LocInternalAdapter::getZppInt() {
sendMsg(new LocEngGetZpp(mLocEngAdapter));
}
+void LocInternalAdapter::shutdown() {
+ sendMsg(new LocEngShutdown(mLocEngAdapter));
+}
+
LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
void* owner, ContextBase* context,
MsgTask::tCreate tCreator) :
diff --git a/loc_api/libloc_api_50001/LocEngAdapter.h b/loc_api/libloc_api_50001/LocEngAdapter.h
index 2c6e22d..10b81fb 100644
--- a/loc_api/libloc_api_50001/LocEngAdapter.h
+++ b/loc_api/libloc_api_50001/LocEngAdapter.h
@@ -64,6 +64,7 @@ public:
virtual void stopFixInt();
virtual void getZppInt();
virtual void setUlpProxy(UlpProxyBase* ulp);
+ virtual void shutdown();
};
typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp);
diff --git a/loc_api/libloc_api_50001/loc.cpp b/loc_api/libloc_api_50001/loc.cpp
index 8c5ce03..9c447cd 100644
--- a/loc_api/libloc_api_50001/loc.cpp
+++ b/loc_api/libloc_api_50001/loc.cpp
@@ -74,7 +74,7 @@ static int loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence re
uint32_t min_interval, uint32_t preferred_accuracy,
uint32_t preferred_time);
static const void* loc_get_extension(const char* name);
-
+static void loc_close_mdm_node();
// Defines the GpsInterface in gps.h
static const GpsInterface sLocEngInterface =
{
@@ -279,7 +279,8 @@ static int loc_init(GpsCallbacks* callbacks)
callbacks->create_thread_cb, /* create_thread_cb */
NULL, /* location_ext_parser */
NULL, /* sv_ext_parser */
- callbacks->request_utc_time_cb /* request_utc_time_cb */};
+ callbacks->request_utc_time_cb, /* request_utc_time_cb */
+ loc_close_mdm_node /*loc_shutdown_cb*/};
gps_loc_cb = callbacks->location_cb;
gps_sv_cb = callbacks->sv_status_cb;
@@ -334,6 +335,37 @@ err:
}
/*===========================================================================
+FUNCTION loc_close_mdm_node
+
+DESCRIPTION
+ closes mdm_fd which is the modem powerup node obtained in loc_init
+
+DEPENDENCIES
+ None
+
+RETURN VALUE
+ None
+
+SIDE EFFECTS
+ N/A
+
+===========================================================================*/
+static void loc_close_mdm_node()
+{
+ ENTRY_LOG();
+ if (mdm_fd >= 0) {
+ LOC_LOGD("closing the powerup node");
+ close(mdm_fd);
+ mdm_fd = -1;
+ LOC_LOGD("finished closing the powerup node");
+ } else {
+ LOC_LOGD("powerup node has not been opened yet.");
+ }
+
+ EXIT_LOG(%s, VOID_RET);
+}
+
+/*===========================================================================
FUNCTION loc_cleanup
DESCRIPTION
@@ -356,18 +388,10 @@ static void loc_cleanup()
loc_afw_data.adapter->setPowerVote(false);
loc_eng_cleanup(loc_afw_data);
+ loc_close_mdm_node();
gps_loc_cb = NULL;
gps_sv_cb = NULL;
- if (mdm_fd >= 0) {
- LOC_LOGD("closing the powerup node");
- close(mdm_fd);
- mdm_fd = -1;
- LOC_LOGD("finished closing the powerup node");
- } else {
- LOC_LOGD("powerup node has not been opened yet.");
- }
-
EXIT_LOG(%s, VOID_RET);
}
diff --git a/loc_api/libloc_api_50001/loc.h b/loc_api/libloc_api_50001/loc.h
index c959323..7e26827 100644
--- a/loc_api/libloc_api_50001/loc.h
+++ b/loc_api/libloc_api_50001/loc.h
@@ -42,6 +42,7 @@ extern "C" {
typedef void (*loc_location_cb_ext) (UlpLocation* location, void* locExt);
typedef void (*loc_sv_status_cb_ext) (GpsSvStatus* sv_status, void* svExt);
typedef void* (*loc_ext_parser)(void* data);
+typedef void (*loc_shutdown_cb) (void);
typedef struct {
loc_location_cb_ext location_cb;
@@ -55,6 +56,7 @@ typedef struct {
loc_ext_parser location_ext_parser;
loc_ext_parser sv_ext_parser;
gps_request_utc_time request_utc_time_cb;
+ loc_shutdown_cb shutdown_cb;
} LocCallbacks;
#ifdef __cplusplus
diff --git a/loc_api/libloc_api_50001/loc_eng.cpp b/loc_api/libloc_api_50001/loc_eng.cpp
index cb3c496..bddb30d 100644
--- a/loc_api/libloc_api_50001/loc_eng.cpp
+++ b/loc_api/libloc_api_50001/loc_eng.cpp
@@ -187,7 +187,7 @@ static void loc_eng_handle_engine_up(loc_eng_data_s_type &loc_eng_data) ;
static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data);
static int loc_eng_stop_handler(loc_eng_data_s_type &loc_eng_data);
static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data);
-
+static void loc_eng_handle_shutdown(loc_eng_data_s_type &loc_eng_data);
static void deleteAidingData(loc_eng_data_s_type &logEng);
static AgpsStateMachine*
getAgpsStateMachine(loc_eng_data_s_type& logEng, AGpsExtType agpsType);
@@ -327,6 +327,27 @@ void LocEngGetZpp::send() const {
mAdapter->sendMsg(this);
}
+
+LocEngShutdown::LocEngShutdown(LocEngAdapter* adapter) :
+ LocMsg(), mAdapter(adapter)
+{
+ locallog();
+}
+inline void LocEngShutdown::proc() const
+{
+ loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner();
+ LOC_LOGD("%s:%d]: Calling loc_eng_handle_shutdown", __func__, __LINE__);
+ loc_eng_handle_shutdown(*locEng);
+}
+inline void LocEngShutdown::locallog() const
+{
+ LOC_LOGV("LocEngShutdown");
+}
+inline void LocEngShutdown::log() const
+{
+ locallog();
+}
+
// case LOC_ENG_MSG_SET_TIME:
struct LocEngSetTime : public LocMsg {
LocEngAdapter* mAdapter;
@@ -1521,7 +1542,7 @@ int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks,
loc_eng_data.sv_ext_parser = callbacks->sv_ext_parser ?
callbacks->sv_ext_parser : noProc;
loc_eng_data.intermediateFix = gps_conf.INTERMEDIATE_POS;
-
+ loc_eng_data.shutdown_cb = callbacks->shutdown_cb;
// initial states taken care of by the memset above
// loc_eng_data.engine_status -- GPS_STATUS_NONE;
// loc_eng_data.fix_session_status -- GPS_STATUS_NONE;
@@ -2606,3 +2627,27 @@ int loc_eng_read_config(void)
EXIT_LOG(%d, 0);
return 0;
}
+
+/*===========================================================================
+FUNCTION loc_eng_handle_shutdown
+
+DESCRIPTION
+ Calls the shutdown callback function in the loc interface to close
+ the modem node
+
+DEPENDENCIES
+ None
+
+RETURN VALUE
+ 0: success
+
+SIDE EFFECTS
+ N/A
+
+===========================================================================*/
+void loc_eng_handle_shutdown(loc_eng_data_s_type &locEng)
+{
+ ENTRY_LOG();
+ locEng.shutdown_cb();
+ EXIT_LOG(%d, 0);
+}
diff --git a/loc_api/libloc_api_50001/loc_eng.h b/loc_api/libloc_api_50001/loc_eng.h
index e50e4a5..3c5d5a7 100644
--- a/loc_api/libloc_api_50001/loc_eng.h
+++ b/loc_api/libloc_api_50001/loc_eng.h
@@ -133,6 +133,7 @@ typedef struct loc_eng_data_s
loc_ext_parser location_ext_parser;
loc_ext_parser sv_ext_parser;
+ loc_shutdown_cb shutdown_cb;
} loc_eng_data_s_type;
/* GPS.conf support */
diff --git a/loc_api/libloc_api_50001/loc_eng_msg.h b/loc_api/libloc_api_50001/loc_eng_msg.h
index ae962f5..b767dc5 100644
--- a/loc_api/libloc_api_50001/loc_eng_msg.h
+++ b/loc_api/libloc_api_50001/loc_eng_msg.h
@@ -289,6 +289,13 @@ struct LocEngGetZpp : public LocMsg {
void send() const;
};
+struct LocEngShutdown : public LocMsg {
+ LocEngAdapter* mAdapter;
+ LocEngShutdown(LocEngAdapter* adapter);
+ virtual void proc() const;
+ void locallog() const;
+ virtual void log() const;
+};
#ifdef __cplusplus
}
#endif /* __cplusplus */