sensor: re-sample pressure data and perform lazy insertions to reduce DB overhead
[platform/core/context/context-provider.git] / src / sensor / pressure / PressureLogger.cpp
index e301165..8cdc547 100644 (file)
 #include <SensorRecorderTypes.h>
 #include "../TypesInternal.h"
 #include "../ClientInfo.h"
+#include "../TimeUtil.h"
 #include "PressureLogger.h"
 
-#define INSERTION_THRESHOLD    20000
 #define SAMPLING_INTERVAL      60000
 #define BATCH_LATENCY          INT_MAX
-#define MAX_QUERY_LENGTH       1000
+
+#define RESAMPLING_INTERVAL    20000
+#define CACHE_LIMIT                    20
 
 using namespace ctx;
 
@@ -48,52 +50,62 @@ PressureLogger::PressureLogger()
 
 PressureLogger::~PressureLogger()
 {
+       stop();
 }
 
 bool PressureLogger::start()
 {
-       if (SensorProxy::isRunning())
-               return true;
-
+       IF_FAIL_RETURN_TAG(!isRunning(), true, _D, "Started already");
        _I(GREEN("Start to record"));
 
-       __lastInsertionTime = getTime();
+       __lastEventTime = 0;
+       __cacheCount = 0;
        __resetInsertionQuery();
 
-       return SensorProxy::start();
+       return listen();
 }
 
 void PressureLogger::stop()
 {
+       IF_FAIL_VOID_TAG(isRunning(), _D, "Stopped already");
        _I(GREEN("Stop recording"));
 
-       SensorProxy::stop();
+       unlisten();
+       flushCache(true);
+}
+
+void PressureLogger::flushCache(bool force)
+{
+       IF_FAIL_VOID(force || __cacheCount > CACHE_LIMIT);
+
+       __insertionQuery.resize(__insertionQuery.size() - 1);
+       if (__insertionQuery.at(__insertionQuery.size() - 1) == ')')
+               executeQuery(__insertionQuery.c_str());
+
+       __cacheCount = 0;
+       __resetInsertionQuery();
 }
 
 void PressureLogger::onEvent(sensor_data_t *eventData)
 {
-       uint64_t receivedTime = getTime();
-       __record(eventData, receivedTime);
+       uint64_t eventTime = TimeUtil::getTime(eventData->timestamp);
+       __record(eventData->values[0], eventTime);
        removeExpired(SUBJ_SENSOR_PRESSURE, PRESSURE_RECORD, KEY_UNIV_TIME);
 }
 
-void PressureLogger::__record(sensor_data_t *eventData, uint64_t receivedTime)
+void PressureLogger::__record(float pressure, uint64_t eventTime)
 {
+       IF_FAIL_VOID(eventTime - __lastEventTime >= RESAMPLING_INTERVAL);
+
        char buffer[64];
-       g_snprintf(buffer, sizeof(buffer), "(%llu, %.5f),",
-                       getTime(eventData->timestamp), eventData->values[0]);
+       g_snprintf(buffer, sizeof(buffer), "(%llu, %.5f),", eventTime, pressure);
+       _D("[%u] %s", __cacheCount, buffer);
 
        __insertionQuery += buffer;
+       __lastEventTime = eventTime;
+       ++__cacheCount;
 
-       if (receivedTime - __lastInsertionTime < INSERTION_THRESHOLD && __insertionQuery.size() < MAX_QUERY_LENGTH)
-               return;
-
-       __insertionQuery.resize(__insertionQuery.size() - 1);
-       if (__insertionQuery.at(__insertionQuery.size() - 1) == ')')
-               executeQuery(__insertionQuery.c_str());
-
-       __lastInsertionTime = receivedTime;
-       __resetInsertionQuery();
+       flushCache();
 }
 
 void PressureLogger::__resetInsertionQuery()