137 lines
6.2 KiB
C
137 lines
6.2 KiB
C
|
/* Copyright (c) 2013-2019, 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 GEOFENCE_ADAPTER_H
|
||
|
#define GEOFENCE_ADAPTER_H
|
||
|
|
||
|
#include <LocAdapterBase.h>
|
||
|
#include <LocContext.h>
|
||
|
#include <LocationAPI.h>
|
||
|
#include <map>
|
||
|
|
||
|
using namespace loc_core;
|
||
|
|
||
|
#define COPY_IF_NOT_NULL(dest, src, len) do { \
|
||
|
if (NULL!=dest && NULL!=src) { \
|
||
|
for (size_t i=0; i<len; ++i) { \
|
||
|
dest[i] = src[i]; \
|
||
|
} \
|
||
|
} \
|
||
|
} while (0)
|
||
|
|
||
|
typedef struct GeofenceKey {
|
||
|
LocationAPI* client;
|
||
|
uint32_t id;
|
||
|
inline GeofenceKey() :
|
||
|
client(NULL), id(0) {}
|
||
|
inline GeofenceKey(LocationAPI* _client, uint32_t _id) :
|
||
|
client(_client), id(_id) {}
|
||
|
} GeofenceKey;
|
||
|
inline bool operator <(GeofenceKey const& left, GeofenceKey const& right) {
|
||
|
return left.id < right.id || (left.id == right.id && left.client < right.client);
|
||
|
}
|
||
|
inline bool operator ==(GeofenceKey const& left, GeofenceKey const& right) {
|
||
|
return left.id == right.id && left.client == right.client;
|
||
|
}
|
||
|
inline bool operator !=(GeofenceKey const& left, GeofenceKey const& right) {
|
||
|
return left.id != right.id || left.client != right.client;
|
||
|
}
|
||
|
typedef struct {
|
||
|
GeofenceKey key;
|
||
|
GeofenceBreachTypeMask breachMask;
|
||
|
uint32_t responsiveness;
|
||
|
uint32_t dwellTime;
|
||
|
double latitude;
|
||
|
double longitude;
|
||
|
double radius;
|
||
|
bool paused;
|
||
|
} GeofenceObject;
|
||
|
typedef std::map<uint32_t, GeofenceObject> GeofencesMap; //map of hwId to GeofenceObject
|
||
|
typedef std::map<GeofenceKey, uint32_t> GeofenceIdMap; //map of GeofenceKey to hwId
|
||
|
|
||
|
class GeofenceAdapter : public LocAdapterBase {
|
||
|
|
||
|
/* ==== GEOFENCES ====================================================================== */
|
||
|
GeofencesMap mGeofences; //map hwId to GeofenceObject
|
||
|
GeofenceIdMap mGeofenceIds; //map of GeofenceKey to hwId
|
||
|
|
||
|
protected:
|
||
|
|
||
|
/* ==== CLIENT ========================================================================= */
|
||
|
virtual void updateClientsEventMask();
|
||
|
virtual void stopClientSessions(LocationAPI* client);
|
||
|
|
||
|
public:
|
||
|
|
||
|
GeofenceAdapter();
|
||
|
virtual ~GeofenceAdapter() {}
|
||
|
|
||
|
/* ==== SSR ============================================================================ */
|
||
|
/* ======== EVENTS ====(Called from QMI Thread)========================================= */
|
||
|
virtual void handleEngineUpEvent();
|
||
|
/* ======== UTILITIES ================================================================== */
|
||
|
void restartGeofences();
|
||
|
|
||
|
/* ==== GEOFENCES ====================================================================== */
|
||
|
/* ======== COMMANDS ====(Called from Client Thread)==================================== */
|
||
|
uint32_t* addGeofencesCommand(LocationAPI* client, size_t count,
|
||
|
GeofenceOption* options, GeofenceInfo* info);
|
||
|
void removeGeofencesCommand(LocationAPI* client, size_t count, uint32_t* ids);
|
||
|
void pauseGeofencesCommand(LocationAPI* client, size_t count, uint32_t* ids);
|
||
|
void resumeGeofencesCommand(LocationAPI* client, size_t count, uint32_t* ids);
|
||
|
void modifyGeofencesCommand(LocationAPI* client, size_t count, uint32_t* ids,
|
||
|
GeofenceOption* options);
|
||
|
/* ======== RESPONSES ================================================================== */
|
||
|
void reportResponse(LocationAPI* client, size_t count, LocationError* errs, uint32_t* ids);
|
||
|
/* ======== UTILITIES ================================================================== */
|
||
|
void saveGeofenceItem(LocationAPI* client,
|
||
|
uint32_t clientId,
|
||
|
uint32_t hwId,
|
||
|
const GeofenceOption& options,
|
||
|
const GeofenceInfo& info);
|
||
|
void removeGeofenceItem(uint32_t hwId);
|
||
|
void pauseGeofenceItem(uint32_t hwId);
|
||
|
void resumeGeofenceItem(uint32_t hwId);
|
||
|
void modifyGeofenceItem(uint32_t hwId, const GeofenceOption& options);
|
||
|
LocationError getHwIdFromClient(LocationAPI* client, uint32_t clientId, uint32_t& hwId);
|
||
|
LocationError getGeofenceKeyFromHwId(uint32_t hwId, GeofenceKey& key);
|
||
|
void dump();
|
||
|
|
||
|
/* ==== REPORTS ======================================================================== */
|
||
|
/* ======== EVENTS ====(Called from QMI Thread)========================================= */
|
||
|
void geofenceBreachEvent(size_t count, uint32_t* hwIds, Location& location,
|
||
|
GeofenceBreachType breachType, uint64_t timestamp);
|
||
|
void geofenceStatusEvent(GeofenceStatusAvailable available);
|
||
|
/* ======== UTILITIES ================================================================== */
|
||
|
void geofenceBreach(size_t count, uint32_t* hwIds, const Location& location,
|
||
|
GeofenceBreachType breachType, uint64_t timestamp);
|
||
|
void geofenceStatus(GeofenceStatusAvailable available);
|
||
|
};
|
||
|
|
||
|
#endif /* GEOFENCE_ADAPTER_H */
|