diff --git a/core/LocAdapterBase.cpp b/core/LocAdapterBase.cpp index a65cb310..eea8eddf 100644 --- a/core/LocAdapterBase.cpp +++ b/core/LocAdapterBase.cpp @@ -128,4 +128,8 @@ DEFAULT_IMPL(false) bool LocAdapterBase:: requestNiNotify(GpsNiNotification ¬ify, 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 4e6ff24b..02b09877 100644 --- a/core/LocAdapterBase.h +++ b/core/LocAdapterBase.h @@ -100,6 +100,7 @@ public: virtual bool requestNiNotify(GpsNiNotification ¬ify, 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 44000816..db9f26c2 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 2c6e22d5..10b81fb1 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 8c5ce033..9c447cde 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; @@ -333,6 +334,37 @@ err: return retVal; } +/*=========================================================================== +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 @@ -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 c9593235..7e268273 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 cb3c4961..bddb30db 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 e50e4a58..3c5d5a7d 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 ae962f55..b767dc5f 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 */