[Sensor] Fixing DefaultEventComparator 61/142361/6
authorSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Mon, 21 Aug 2017 09:35:52 +0000 (11:35 +0200)
committerPiotr Kosko <p.kosko@samsung.com>
Mon, 21 Aug 2017 10:19:38 +0000 (10:19 +0000)
Comparator DefaultEventComparator should iterate through
all received values. It should NOT compare timestamps.
The amount of received values depend on the type of used
sensor. The sensor_value_count_ values are taken from
Native Sensor's Guides.

[Verification] Code compiles. TCT (TW1) passed 100%.

Change-Id: I60d5af338a7feea2dd4fb40cdff0f6bd03f8d650
Signed-off-by: Szymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
src/sensor/sensor_service.cc

index 88f68b202bcb4c5861cd34f6409ddba97cf1e8c4..71a3ab25c8f5131f2364aff85c73b28391c2e292 100755 (executable)
@@ -175,21 +175,27 @@ PlatformResult GetSensorPlatformResult(const int error_code, const std::string &
   }
 }
 
-bool MagneticEventComparator(sensor_event_s* l, sensor_event_s* r) {
-  return (l->values[0] == r->values[0] &&
-          l->values[1] == r->values[1] &&
-          l->values[2] == r->values[2] &&
-          l->accuracy == r->accuracy);
+bool DefaultEventComparator(sensor_event_s* l, sensor_event_s* r, const unsigned int value_count) {
+  for (unsigned int i = 0; i < value_count; ++i) {
+    if (l->values[i] != r->values[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool MagneticEventComparator(sensor_event_s* l, sensor_event_s* r, const unsigned int value_count) {
+  return DefaultEventComparator(l, r, value_count) ? l->accuracy == r->accuracy : false;
 }
 
 } // namespace
 
 class SensorData {
  public:
-  typedef bool (*EventComparator)(sensor_event_s* l, sensor_event_s* r);
+  typedef bool (*EventComparator)(sensor_event_s* l, sensor_event_s* r, const unsigned int value_count);
 
   SensorData(SensorInstance& instance, sensor_type_e type_enum,
-             const std::string& name, EventComparator comparator =
+             const std::string& name, const unsigned int sensor_value_count, EventComparator comparator =
                  DefaultEventComparator);
   virtual ~SensorData();
 
@@ -213,10 +219,10 @@ class SensorData {
 
  private:
   static void SensorCallback(sensor_h sensor, sensor_event_s* event, void* user_data);
-  static bool DefaultEventComparator(sensor_event_s* l, sensor_event_s* r);
 
   sensor_type_e type_enum_;
   EventComparator comparator_;
+  const unsigned int sensor_value_count_;
   sensor_h handle_;
   sensor_listener_h listener_;
   sensor_event_s previous_event_;
@@ -226,9 +232,11 @@ class SensorData {
 };
 
 SensorData::SensorData(SensorInstance& instance, sensor_type_e type_enum,
-                       const std::string& name, EventComparator comparator)
+                       const std::string& name, const unsigned int sensor_value_count,
+                       EventComparator comparator)
     : type_enum_(type_enum),
       comparator_(comparator),
+      sensor_value_count_(sensor_value_count),
       handle_(nullptr),
       listener_(nullptr),
       previous_event_(),
@@ -270,10 +278,6 @@ void SensorData::SensorCallback(sensor_h sensor, sensor_event_s* event, void* us
   Instance::PostMessage(&that->instance_, result.serialize().c_str());
 }
 
-bool SensorData::DefaultEventComparator(sensor_event_s* l, sensor_event_s* r) {
-  return (l->timestamp == r->timestamp);
-}
-
 PlatformResult SensorData::CheckInitialization() {
   LoggerD("Entered: %s", type_to_string_map[type()].c_str());
 
@@ -348,7 +352,7 @@ bool SensorData::is_supported() {
 bool SensorData::UpdateEvent(sensor_event_s* event) {
   LoggerD("Entered: %s", type_to_string_map[type()].c_str());
 
-  if (comparator_(&previous_event_, event)) {
+  if (comparator_(&previous_event_, event, sensor_value_count_)) {
     // previous and current events are the same -> no update
     return false;
   } else {
@@ -662,11 +666,12 @@ class HrmSensorData : public SensorData {
 };
 
 HrmSensorData::HrmSensorData(SensorInstance& instance)
-    : SensorData(instance, SENSOR_CUSTOM, "HRM_RAW") {
+    : SensorData(instance, SENSOR_CUSTOM, "HRM_RAW", 1) {
   LoggerD("Entered: %s", type_to_string_map[type()].c_str());
-  AddSensor(new SensorData(instance, SENSOR_HRM_LED_IR, "LED_IR"));
-  AddSensor(new SensorData(instance, SENSOR_HRM_LED_RED, "LED_RED"));
-  AddSensor(new SensorData(instance, SENSOR_HRM_LED_GREEN, "LED_GREEN"));
+  // For amount of retrieved values from sensors please refer to native guides.
+  AddSensor(new SensorData(instance, SENSOR_HRM_LED_IR, "LED_IR", 1));
+  AddSensor(new SensorData(instance, SENSOR_HRM_LED_RED, "LED_RED", 1));
+  AddSensor(new SensorData(instance, SENSOR_HRM_LED_GREEN, "LED_GREEN", 1));
 }
 
 HrmSensorData::~HrmSensorData() {
@@ -812,16 +817,17 @@ SensorService::SensorService(SensorInstance& instance)
     : instance_(instance) {
   LoggerD("Entered");
 
-  AddSensor(new SensorData(instance, SENSOR_LIGHT, "LIGHT"));
-  AddSensor(new SensorData(instance, SENSOR_MAGNETIC, "MAGNETIC", MagneticEventComparator));
-  AddSensor(new SensorData(instance, SENSOR_PRESSURE, "PRESSURE"));
-  AddSensor(new SensorData(instance, SENSOR_PROXIMITY, "PROXIMITY"));
-  AddSensor(new SensorData(instance, SENSOR_ULTRAVIOLET, "ULTRAVIOLET"));
+  // For amount of retrieved values from sensors please refer to native guides.
+  AddSensor(new SensorData(instance, SENSOR_LIGHT, "LIGHT", 1));
+  AddSensor(new SensorData(instance, SENSOR_MAGNETIC, "MAGNETIC", 3, MagneticEventComparator));
+  AddSensor(new SensorData(instance, SENSOR_PRESSURE, "PRESSURE", 1));
+  AddSensor(new SensorData(instance, SENSOR_PROXIMITY, "PROXIMITY", 1));
+  AddSensor(new SensorData(instance, SENSOR_ULTRAVIOLET, "ULTRAVIOLET", 1));
   AddSensor(new HrmSensorData(instance));
-  AddSensor(new SensorData(instance, SENSOR_GRAVITY, "GRAVITY"));
-  AddSensor(new SensorData(instance, SENSOR_GYROSCOPE, "GYROSCOPE"));
-  AddSensor(new SensorData(instance, SENSOR_GYROSCOPE_ROTATION_VECTOR, "GYROSCOPE_ROTATION_VECTOR"));
-  AddSensor(new SensorData(instance, SENSOR_LINEAR_ACCELERATION, "LINEAR_ACCELERATION"));
+  AddSensor(new SensorData(instance, SENSOR_GRAVITY, "GRAVITY", 3));
+  AddSensor(new SensorData(instance, SENSOR_GYROSCOPE, "GYROSCOPE", 3));
+  AddSensor(new SensorData(instance, SENSOR_GYROSCOPE_ROTATION_VECTOR, "GYROSCOPE_ROTATION_VECTOR", 4));
+  AddSensor(new SensorData(instance, SENSOR_LINEAR_ACCELERATION, "LINEAR_ACCELERATION", 3));
 }
 
 SensorService::~SensorService() {