GPS HAL: send platform power state event to modem

Send platform power state event, suspend/resume/shutdown to modem

Change-Id: I19960f5fb4935de9e4f5513abd95aed6241a2fd9
CRs-fixed: 2527622
This commit is contained in:
Wei Chen 2019-09-13 15:43:27 -07:00
parent 1a16cbc20c
commit 52d928e069
7 changed files with 59 additions and 3 deletions

View file

@ -873,5 +873,7 @@ DEFAULT_IMPL()
void LocApiBase::addToCallQueue(LocApiResponse* /*adapterResponse*/)
DEFAULT_IMPL()
void LocApiBase::updateSystemPowerState(PowerStateType /*powerState*/)
DEFAULT_IMPL()
} // namespace loc_core

View file

@ -312,6 +312,7 @@ public:
void updateEvtMask();
void updateNmeaMask(uint32_t mask);
virtual void updateSystemPowerState(PowerStateType systemPowerState);
};
typedef LocApiBase* (getLocApi_t)(LOC_API_ADAPTER_EVENT_MASK_T exMask,

View file

@ -98,7 +98,8 @@ GnssAdapter::GnssAdapter() :
mIsE911Session(NULL),
mGnssMbSvIdUsedInPosition{},
mGnssMbSvIdUsedInPosAvail(false),
mSupportNfwControl(true)
mSupportNfwControl(true),
mSystemPowerState(POWER_STATE_UNKNOWN)
{
LOC_LOGD("%s]: Constructor %p", __func__, this);
mLocPositionMode.mode = LOC_POSITION_MODE_INVALID;
@ -1997,6 +1998,35 @@ GnssAdapter::blockCPICommand(double latitude, double longitude,
sendMsg(new MsgBlockCPI(mBlockCPIInfo, blockCPIInfo));
}
void
GnssAdapter::updateSystemPowerState(PowerStateType systemPowerState) {
if (POWER_STATE_UNKNOWN != systemPowerState) {
mSystemPowerState = systemPowerState;
mLocApi->updateSystemPowerState(mSystemPowerState);
}
}
void
GnssAdapter::updateSystemPowerStateCommand(PowerStateType systemPowerState) {
LOC_LOGd("power event %d", systemPowerState);
struct MsgUpdatePowerState : public LocMsg {
GnssAdapter& mAdapter;
PowerStateType mSystemPowerState;
inline MsgUpdatePowerState(GnssAdapter& adapter,
PowerStateType systemPowerState) :
LocMsg(),
mAdapter(adapter),
mSystemPowerState(systemPowerState) {}
inline virtual void proc() const {
mAdapter.updateSystemPowerState(mSystemPowerState);
}
};
sendMsg(new MsgUpdatePowerState(*this, systemPowerState));
}
void
GnssAdapter::addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks)
{
@ -2133,9 +2163,10 @@ GnssAdapter::handleEngineUpEvent()
mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
// must be called only after capabilities are known
mAdapter.setConfig();
mAdapter.restartSessions();
mAdapter.gnssSvIdConfigUpdate();
mAdapter.gnssSvTypeConfigUpdate();
mAdapter.updateSystemPowerState(mAdapter.getSystemPowerState());
mAdapter.restartSessions();
for (auto msg: mAdapter.mPendingMsgs) {
mAdapter.sendMsg(msg);
}

View file

@ -187,6 +187,7 @@ class GnssAdapter : public LocAdapterBase {
XtraSystemStatusObserver mXtraObserver;
LocationSystemInfo mLocSystemInfo;
std::vector<GnssSvIdSource> mBlacklistedSvIds;
PowerStateType mSystemPowerState;
/* === Misc ===================================================================== */
BlockCPIInfo mBlockCPIInfo;
@ -413,6 +414,8 @@ public:
return false;
}
void updateSystemPowerState(PowerStateType systemPowerState);
/*======== GNSSDEBUG ================================================================*/
bool getDebugReport(GnssDebugReport& report);
/* get AGC information from system status and fill it */
@ -459,11 +462,14 @@ public:
void reportPowerStateIfChanged();
void savePowerStateCallback(powerStateCallback powerStateCb){ mPowerStateCb = powerStateCb; }
bool getPowerState() { return mPowerOn; }
inline PowerStateType getSystemPowerState() { return mSystemPowerState; }
void setAllowFlpNetworkFixes(uint32_t allow) { mAllowFlpNetworkFixes = allow; }
uint32_t getAllowFlpNetworkFixes() { return mAllowFlpNetworkFixes; }
void setSuplHostServer(const char* server, int port, LocServerType type);
void notifyClientOfCachedLocationSystemInfo(LocationAPI* client,
const LocationCallbacks& callbacks);
void updateSystemPowerStateCommand(PowerStateType systemPowerState);
};
#endif //GNSS_ADAPTER_H

View file

@ -79,6 +79,7 @@ static void odcpiInject(const Location& location);
static void blockCPI(double latitude, double longitude, float accuracy,
int blockDurationMsec, double latLonDiffThreshold);
static void updateBatteryStatus(bool charging);
static void updateSystemPowerState(PowerStateType systemPowerState);
static const GnssInterface gGnssInterface = {
sizeof(GnssInterface),
@ -117,7 +118,8 @@ static const GnssInterface gGnssInterface = {
nfwInit,
getPowerStateChanges,
injectLocationExt,
updateBatteryStatus
updateBatteryStatus,
updateSystemPowerState
};
#ifndef DEBUG_X86
@ -390,3 +392,9 @@ static void updateBatteryStatus(bool charging) {
gGnssAdapter->getSystemStatus()->updatePowerConnectState(charging);
}
}
static void updateSystemPowerState(PowerStateType systemPowerState) {
if (NULL != gGnssAdapter) {
gGnssAdapter->updateSystemPowerStateCommand(systemPowerState);
}
}

View file

@ -88,6 +88,7 @@ struct GnssInterface {
void (*getPowerStateChanges)(void* powerStateCb);
void (*injectLocationExt)(const GnssLocationInfoNotification &locationInfo);
void (*updateBatteryStatus)(bool charging);
void (*updateSystemPowerState)(PowerStateType systemPowerState);
};
struct BatchingInterface {

View file

@ -2223,6 +2223,13 @@ typedef void (*LocAgpsOpenResultCb)(bool isSuccess, AGpsExtType agpsType, const
typedef void (*LocAgpsCloseResultCb)(bool isSuccess, AGpsExtType agpsType, void* userDataPtr);
enum PowerStateType {
POWER_STATE_UNKNOWN = 0,
POWER_STATE_SUSPEND = 1,
POWER_STATE_RESUME = 2,
POWER_STATE_SHUTDOWN = 3
};
/* Shared resources of LocIpc */
#define LOC_IPC_HAL "/dev/socket/location/socket_hal"
#define LOC_IPC_XTRA "/dev/socket/location/xtra/socket_xtra"