SGCMarkus 64ab05b033 sm8250-common: import location from LA.UM.9.12.r1-13500.01-SMxx50.QSSI12.0
Change-Id: If93ba9b50dc3bb07a4ba81694187e99f58dd172c
2022-03-23 22:23:56 +01:00

240 lines
8.5 KiB
C++

/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef LOCATIONCLIENTAPIIMPL_H
#define LOCATIONCLIENTAPIIMPL_H
#include <mutex>
#include <loc_pla.h>
#include <LocIpc.h>
#include <LocationDataTypes.h>
#include <ILocationAPI.h>
#include <LocationClientApi.h>
#include <MsgTask.h>
#include <LocationApiMsg.h>
#include <LocationApiPbMsgConv.h>
#include <LCAReportLoggerUtil.h>
#ifdef NO_UNORDERED_SET_OR_MAP
#include <set>
#include <map>
#else
#include <unordered_set>
#include <unordered_map>
#endif
using namespace std;
using namespace loc_util;
namespace location_client
{
enum ReportCbEnumType {
REPORT_CB_TYPE_NONE = 0,
/** cb for GNSS info, including location, sv info, nmea and
* etc */
REPORT_CB_GNSS_INFO = 1,
/** cb for GNSS info, including location, sv info, nmea and
* etc and also for location of other engines running in the
* system */
REPORT_CB_ENGINE_INFO = 2,
};
struct ClientCallbacks {
CapabilitiesCb capabilitycb;
ResponseCb responsecb;
CollectiveResponseCb collectivecb;
LocationCb locationcb;
BatchingCb batchingcb;
GeofenceBreachCb gfbreachcb;
GnssReportCbs gnssreportcbs;
EngineReportCbs engreportcbs;
};
typedef std::function<void(
uint32_t response
)> PingTestCb;
class GeofenceImpl: public std::enable_shared_from_this<GeofenceImpl> {
uint32_t mId;
Geofence mGeofence;
static uint32_t nextId();
static mutex mGfMutex;
public:
GeofenceImpl(Geofence* geofence) : mId(nextId()), mGeofence(*geofence) {
}
void bindGeofence(Geofence* geofence) {
geofence->mGeofenceImpl = shared_from_this();
}
inline uint32_t getClientId() { return mId; }
};
class IpcListener;
class LocationClientApiImpl : public ILocationAPI {
friend IpcListener;
public:
LocationClientApiImpl(CapabilitiesCb capabitiescb);
void destroy();
// Tracking
virtual void updateCallbacks(LocationCallbacks&) override;
virtual uint32_t startTracking(TrackingOptions&) override;
virtual void stopTracking(uint32_t id) override;
virtual void updateTrackingOptions(uint32_t id, TrackingOptions&) override;
//Batching
virtual uint32_t startBatching(BatchingOptions&) override;
virtual void stopBatching(uint32_t id) override;
virtual void updateBatchingOptions(uint32_t id, BatchingOptions&) override;
virtual void getBatchedLocations(uint32_t id, size_t count) override;
//Geofence
virtual uint32_t* addGeofences(size_t count, GeofenceOption*,
GeofenceInfo*) override;
virtual void removeGeofences(size_t count, uint32_t* ids) override;
virtual void modifyGeofences(size_t count, uint32_t* ids,
GeofenceOption* options) override;
virtual void pauseGeofences(size_t count, uint32_t* ids) override;
virtual void resumeGeofences(size_t count, uint32_t* ids) override;
//GNSS
virtual void gnssNiResponse(uint32_t id, GnssNiResponse response) override;
// other interface
void updateNetworkAvailability(bool available);
void updateCallbackFunctions(const ClientCallbacks&,
ReportCbEnumType reportCbType = REPORT_CB_TYPE_NONE);
void getGnssEnergyConsumed(GnssEnergyConsumedCb gnssEnergyConsumedCallback,
ResponseCb responseCallback);
void updateLocationSystemInfoListener(LocationSystemInfoCb locSystemInfoCallback,
ResponseCb responseCallback);
void diagLogGnssLocation(const GnssLocation &gnssLocation);
inline LocationCapabilitiesMask getCapabilities() {return mCapsMask;}
bool checkGeofenceMap(size_t count, uint32_t* ids);
void addGeofenceMap(uint32_t id, Geofence& geofence);
void eraseGeofenceMap(size_t count, uint32_t* ids);
std::vector<uint32_t> mLastAddedClientIds;
std::unordered_map<uint32_t, Geofence> mGeofenceMap; //clientId --> Geofence object
// convenient methods
inline bool sendMessage(const uint8_t* data, uint32_t length) const {
return (mIpcSender != nullptr) && LocIpc::send(*mIpcSender, data, length);
}
void pingTest(PingTestCb pingTestCallback);
inline uint16_t getYearOfHw() {return mYearOfHw;}
void invokePositionSessionResponseCb(LocationResponse responseCode);
void getSingleTerrestrialPos(uint32_t timeoutMsec, TerrestrialTechMask techMask,
float horQoS, LocationCb terrestrialPositionCallback,
ResponseCb responseCallback);
private:
~LocationClientApiImpl();
void capabilitesCallback(ELocMsgID msgId, const void* msgData);
void updateTrackingOptionsSync(LocationClientApiImpl* pImpl, TrackingOptions& option);
// protobuf conversion util class
LocationApiPbMsgConv mPbufMsgConv;
// internal session parameter
static uint32_t mClientIdGenerator;
static mutex mMutex;
uint32_t mClientId;
uint32_t mSessionId;
uint32_t mBatchingId;
bool mHalRegistered;
// For client on different processor, socket name will start with
// defined constant of SOCKET_TO_EXTERANL_AP_LOCATION_CLIENT_BASE.
// For client on same processor, socket name will start with
// SOCKET_LOC_CLIENT_DIR + LOC_CLIENT_NAME_PREFIX.
char mSocketName[MAX_SOCKET_PATHNAME_LENGTH];
// for client on a different processor, 0 is invalid
uint32_t mInstanceId;
LocationCallbacksMask mCallbacksMask;
LocationOptions mLocationOptions;
BatchingOptions mBatchingOptions;
LocationCapabilitiesMask mCapsMask;
//Year of HW information, 0 is invalid
uint16_t mYearOfHw;
bool mPositionSessionResponseCbPending;
// callbacks
CapabilitiesCb mCapabilitiesCb;
ResponseCb mResponseCb;
CollectiveResponseCb mCollectiveResCb;
LocationCb mLocationCb;
BatchingCb mBatchingCb;
GeofenceBreachCb mGfBreachCb;
PingTestCb mPingTestCb;
// location callbacks
GnssLocationCb mGnssLocationCb;
EngineLocationsCb mEngLocationsCb;
// other GNSS related callback
GnssSvCb mGnssSvCb;
GnssNmeaCb mGnssNmeaCb;
GnssDataCb mGnssDataCb;
GnssMeasurementsCb mGnssMeasurementsCb;
GnssEnergyConsumedCb mGnssEnergyConsumedInfoCb;
ResponseCb mGnssEnergyConsumedResponseCb;
LocationSystemInfoCb mLocationSysInfoCb;
ResponseCb mLocationSysInfoResponseCb;
// Terrestrial fix callback
LocationCb mSingleTerrestrialPosCb;
ResponseCb mSingleTerrestrialPosRespCb;
MsgTask mMsgTask;
LocIpc mIpc;
shared_ptr<LocIpcSender> mIpcSender;
LCAReportLoggerUtil mLogger;
};
} // namespace location_client
#endif /* LOCATIONCLIENTAPIIMPL_H */