aboutsummaryrefslogblamecommitdiff
path: root/gps/geofence/GeofenceAdapter.h
blob: 38f4823018aeb00f9175fe2903c68371303bbff3 (plain) (tree)







































































































































                                                                                               
/* 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 */