From 0e8a2685499bc9caa9a6ec7b55deeb7e341ba21c Mon Sep 17 00:00:00 2001
From: Pawel Andruszkiewicz
Date: Fri, 19 Feb 2016 13:53:25 +0100
Subject: [PATCH] [Sensor] Fixed interval handling in setChangeListener().
Fixes: Sensor_unsetChangeListener
[Verification] TCT pass rate (r31): 100% (43/43/0/0/0)
Change-Id: I35b1c2ab5543dda55f39481d357f7bf62931ccdb
Signed-off-by: Pawel Andruszkiewicz
---
src/sensor/sensor_api.js | 13 ++++----
src/sensor/sensor_service.cc | 57 ++++++++----------------------------
2 files changed, 19 insertions(+), 51 deletions(-)
diff --git a/src/sensor/sensor_api.js b/src/sensor/sensor_api.js
index b34b0769..2b70cc65 100644
--- a/src/sensor/sensor_api.js
+++ b/src/sensor/sensor_api.js
@@ -249,18 +249,17 @@ Sensor.prototype.setChangeListener = function() {
{
name : 'interval',
type: types_.LONG,
- optional: true
+ optional: true,
+ nullable: true
}
]);
- var tmp_interval = args.interval;
- if(tmp_interval === 0) {
- tmp_interval = 100;
- } else {
+
+ var interval = args.interval || 100;
+ if (interval < 10 || interval > 1000) {
throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, 'Interval should be in range [10, 1000] milliseconds.');
}
-
- _sensorListeners[this.sensorType].setListener(args.successCallback, args.interval);
+ _sensorListeners[this.sensorType].setListener(args.successCallback, interval);
};
Sensor.prototype.unsetChangeListener = function() {
diff --git a/src/sensor/sensor_service.cc b/src/sensor/sensor_service.cc
index 8cb5cdd9..5cc056f0 100644
--- a/src/sensor/sensor_service.cc
+++ b/src/sensor/sensor_service.cc
@@ -61,6 +61,7 @@ static std::string GetAccuracyString(int accuracy) {
}
static const std::string kSensorTypeTag = "sensorType";
+static const std::string kInterval = "interval";
static const std::string kListenerId = "listenerId";
static const std::string kSensorChangedListener = "SensorChangedListener";
@@ -168,7 +169,7 @@ class SensorData {
PlatformResult IsSupported(bool* supported);
virtual PlatformResult Start();
virtual PlatformResult Stop();
- virtual PlatformResult SetChangeListener(unsigned int interval = 100);
+ virtual PlatformResult SetChangeListener(unsigned int interval);
virtual PlatformResult UnsetChangeListener();
virtual PlatformResult GetSensorData(picojson::object* data);
@@ -192,8 +193,6 @@ class SensorData {
sensor_event_s previous_event_;
common::optional is_supported_;
SensorInstance& instance_;
- unsigned int interval_; // an interval capping the maximum frequency of callback events.
- // valid values: from 10 to 1000 [milliseconds].
};
SensorData::SensorData(SensorInstance& instance, sensor_type_e type_enum,
@@ -203,8 +202,7 @@ SensorData::SensorData(SensorInstance& instance, sensor_type_e type_enum,
handle_(nullptr),
listener_(nullptr),
previous_event_(),
- instance_(instance),
- interval_(0) {
+ instance_(instance) {
type_to_string_map.insert(std::make_pair(type_enum, name));
string_to_type_map.insert(std::make_pair(name, type_enum));
@@ -318,35 +316,14 @@ bool SensorData::is_supported() {
bool SensorData::UpdateEvent(sensor_event_s* event) {
LoggerD("Entered: %s", type_to_string_map[type()].c_str());
- /*
- bool isThisEventDifferent = false;
-
- if(this->interval_ > 0) {
- // an interval has been specified, so this event should be considered
- // different from the previous one and invoked:
- isThisEventDifferent = true;
- }
- else {
- // an interval has been set to 0, so this event should be invoked iff
- // its payload is different that the one carried by a former event:
- if (comparator_(&previous_event_, event)) {
- // previous and current events are the same -> no update
- } else {
- isThisEventDifferent = true;
- }
- }
- if(isThisEventDifferent) {
+ if (comparator_(&previous_event_, event)) {
+ // previous and current events are the same -> no update
+ return false;
+ } else {
previous_event_ = *event;
+ return true;
}
-
- return isThisEventDifferent;
- */
-
- // since the events' frequency is capped by the interval value (always greater than 0),
- // and the event should be send regardless of whether sensor's value has changed or not,
- // send this event notification without checking any conditions:
- return true;
}
PlatformResult SensorData::Start() {
@@ -398,19 +375,10 @@ PlatformResult SensorData::SetChangeListener(unsigned int interval) {
return res;
}
- // if the user has not provided interval value, apply the default (100 ms):
- if(interval == 0) {
- interval = 100;
- }
-
int ret = sensor_listener_set_event_cb(listener_, interval, SensorCallback, this);
if (SENSOR_ERROR_NONE != ret) {
LoggerE("sensor_listener_set_event_cb : %d", ret);
return GetSensorPlatformResult(ret, "sensor_listener_set_event_cb");
- } else {
- // sensor callback method has been updated correctly,
- // so remember the new settings for callback interval:
- this->interval_ = interval;
}
return PlatformResult(ErrorCode::NO_ERROR);
@@ -464,7 +432,7 @@ class HrmSensorData : public SensorData {
virtual PlatformResult Start();
virtual PlatformResult Stop();
- virtual PlatformResult SetChangeListener(unsigned int interval = 100);
+ virtual PlatformResult SetChangeListener(unsigned int interval);
virtual PlatformResult UnsetChangeListener();
virtual PlatformResult GetSensorData(picojson::object* data);
@@ -546,7 +514,7 @@ PlatformResult HrmSensorData::SetChangeListener(unsigned int interval) {
LoggerD("Entered: %s", type_to_string_map[type()].c_str());
for (const auto& sensor : hrm_sensors_) {
if (sensor.second->is_supported()) {
- auto res = sensor.second.get()->SetChangeListener(interval);
+ auto res = sensor.second->SetChangeListener(interval);
if (!res) {
return res;
}
@@ -687,8 +655,9 @@ void SensorService::SensorSetChangeListener(const picojson::value& args, picojso
LoggerD("Entered");
const std::string type_str =
args.contains(kSensorTypeTag) ? args.get(kSensorTypeTag).get() : "";
- const double interval = args.contains("interval") ? args.get("interval").get() : 100.0;
- LoggerD("input type: %s %f" , type_str.c_str(), interval);
+ const auto interval = args.contains(kInterval) ? args.get(kInterval).get() : 100.0;
+ LoggerD("input type: %s" , type_str.c_str());
+ LoggerD("interval: %f" , interval);
sensor_type_e type_enum = string_to_type_map[type_str];
--
2.34.1