sensor: try to record one tuple per one minute to reduce the pedometer DB table size 21/77821/1
authorMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 1 Jul 2016 06:46:33 +0000 (15:46 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 1 Jul 2016 06:46:33 +0000 (15:46 +0900)
Change-Id: I546bb46802bc51b9e0b7dab491638228e1c12003
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
src/sensor/pedometer/PedometerLogger.cpp
src/sensor/pedometer/PedometerLogger.h

index c215d30..d4c820a 100644 (file)
@@ -21,6 +21,8 @@
 #include "../TimeUtil.h"
 #include "PedometerLogger.h"
 
+#define MIN_INTERVAL   60000
+
 using namespace ctx;
 
 PedometerLogger::PedometerLogger() :
@@ -72,61 +74,73 @@ void PedometerLogger::stop()
        __firstEvent = true;
 }
 
+void PedometerLogger::flushCache(bool force)
+{
+       DataRecord record;
+       record.walkSteps = __lastRecord.walkSteps - __baseline.walkSteps;
+       record.runSteps  = __lastRecord.runSteps - __baseline.runSteps;
+       record.distance  = __lastRecord.distance - __baseline.distance;
+       record.calories  = __lastRecord.calories - __baseline.calories;
+
+       if (record.walkSteps + record.runSteps > 0) {
+               char *query = sqlite3_mprintf(
+                               "INSERT INTO " PEDOMETER_RECORD " (" \
+                                       KEY_START_TIME ", " \
+                                       KEY_END_TIME ", " \
+                                       KEY_WALK_STEPS ", " \
+                                       KEY_RUN_STEPS ", " \
+                                       KEY_DISTANCE ", " \
+                                       KEY_CALORIES ") " \
+                                       "VALUES (%llu, %llu, %u, %u, %.3f, %.3f)",
+                               __baseline.timestamp, __lastRecord.timestamp, record.walkSteps, record.runSteps, record.distance, record.calories);
+               executeQuery(query);
+               sqlite3_free(query);
+       }
+
+       __baseline = __lastRecord;
+}
+
 void PedometerLogger::onEvent(sensor_data_t *eventData)
 {
        sensor_pedometer_data_t *pedometerData = reinterpret_cast<sensor_pedometer_data_t*>(eventData);
        uint64_t timestamp = TimeUtil::getTime();
 
        if (__firstEvent) {
-               _D("Baseline event");
                __firstEvent = false;
+               __setRecord(__lastRecord, timestamp, pedometerData);
+               __baseline = __lastRecord;
+
+               _SD("Baseline: %u, %u, %.3f, %.3f",
+                               __baseline.walkSteps, __baseline.runSteps, __baseline.distance, __baseline.calories);
+
        } else if (pedometerData->diffs_count == 0) {
-               _D("Single event");
+               _SD("Single: %.0f, %.0f, %.3f, %.3f",
+                               eventData->values[1], eventData->values[2], eventData->values[3], eventData->values[4]);
                __recordSingle(pedometerData, timestamp);
+
        } else {
-               _D("Batch event");
+               _SD("Batch [%d]: %.0f, %.0f, %.3f, %.3f",
+                               pedometerData->diffs_count,
+                               eventData->values[1], eventData->values[2], eventData->values[3], eventData->values[4]);
                __recordBatch(pedometerData, timestamp);
        }
 
-       __baseline.timestamp = timestamp;
-       __baseline.walkSteps = eventData->values[1];
-       __baseline.runSteps  = eventData->values[2];
-       __baseline.distance  = eventData->values[3];
-       __baseline.calories  = eventData->values[4];
-
-       _D("Baseline: %u, %u, %.3f, %.3f",
-                       __baseline.walkSteps, __baseline.runSteps, __baseline.distance, __baseline.calories);
-
        removeExpired(SUBJ_SENSOR_PEDOMETER, PEDOMETER_RECORD, KEY_END_TIME);
 }
 
 void PedometerLogger::__recordSingle(sensor_pedometer_data_t *eventData, uint64_t timestamp)
 {
-       DataRecord record;
-       record.walkSteps = static_cast<unsigned int>(eventData->values[1]) - __baseline.walkSteps;
-       record.runSteps  = static_cast<unsigned int>(eventData->values[2]) - __baseline.runSteps;
-       record.distance  = eventData->values[3] - __baseline.distance;
-       record.calories  = eventData->values[4] - __baseline.calories;
-
-       IF_FAIL_VOID_TAG(record.walkSteps + record.runSteps > 0, _D, "Skipping zero-count event");
+       if (timestamp - __baseline.timestamp >= MIN_INTERVAL)
+               flushCache();
 
-       char *query = sqlite3_mprintf(
-                       "INSERT INTO " PEDOMETER_RECORD "(" \
-                               KEY_START_TIME ", " \
-                               KEY_END_TIME ", " \
-                               KEY_WALK_STEPS ", " \
-                               KEY_RUN_STEPS ", " \
-                               KEY_DISTANCE ", " \
-                               KEY_CALORIES ") " \
-                               "VALUES (%llu, %llu, %u, %u, %.3f, %.3f)",
-                       __baseline.timestamp, timestamp, record.walkSteps, record.runSteps, record.distance, record.calories);
-       executeQuery(query);
-       sqlite3_free(query);
+       __setRecord(__lastRecord, timestamp, eventData);
 }
 
 void PedometerLogger::__recordBatch(sensor_pedometer_data_t *eventData, uint64_t timestamp)
 {
-       std::string query("INSERT INTO " PEDOMETER_RECORD "(" \
+       flushCache();
+
+       std::string query("INSERT INTO " PEDOMETER_RECORD " (" \
                                KEY_START_TIME ", " \
                                KEY_END_TIME ", " \
                                KEY_WALK_STEPS ", " \
@@ -156,4 +170,16 @@ void PedometerLogger::__recordBatch(sensor_pedometer_data_t *eventData, uint64_t
        IF_FAIL_VOID_TAG(query.at(query.size() - 1) == ')', _D, "No records");
 
        executeQuery(query.c_str());
+
+       __setRecord(__lastRecord, timestamp, eventData);
+       __baseline = __lastRecord;
+}
+
+void PedometerLogger::__setRecord(DataRecord &record, uint64_t timestamp, sensor_pedometer_data_t *eventData)
+{
+       record.timestamp = timestamp;
+       record.walkSteps = static_cast<unsigned int>(eventData->values[1]);
+       record.runSteps  = static_cast<unsigned int>(eventData->values[2]);
+       record.distance  = eventData->values[3];
+       record.calories  = eventData->values[4];
 }
index 57832f9..f4b32f9 100644 (file)
@@ -29,6 +29,7 @@ namespace ctx {
 
                bool start();
                void stop();
+               void flushCache(bool force = false);
 
        protected:
                void onEvent(sensor_data_t *eventData);
@@ -44,9 +45,11 @@ namespace ctx {
 
                void __recordSingle(sensor_pedometer_data_t *eventData, uint64_t timestamp);
                void __recordBatch(sensor_pedometer_data_t *eventData, uint64_t timestamp);
+               void __setRecord(DataRecord &record, uint64_t timestamp, sensor_pedometer_data_t *eventData);
 
                bool __firstEvent;
                DataRecord __baseline;
+               DataRecord __lastRecord;
        };
 }