}
};
-SensorListener.prototype.setListener = function (successCallback) {
+SensorListener.prototype.setListener = function (successCallback, interval) {
if (!this.callback) {
//call platform only if there was no listener registered
- var result = native_.callSync('Sensor_setChangeListener', {'sensorType' : this.sensorType});
+ var result = native_.callSync('Sensor_setChangeListener', {'sensorType' : this.sensorType, 'interval' : interval});
if (native_.isFailure(result)) {
throw native_.getErrorObject(result);
}
{
name : 'successCallback',
type: types_.FUNCTION
+ },
+ {
+ name : 'interval',
+ type: types_.LONG,
+ optional: true
}
]);
+ var tmp_interval = args.interval;
+ if(tmp_interval === 0) {
+ tmp_interval = 100;
+ } else {
+ throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, 'Interval should be in range [10, 1000] milliseconds.');
+ }
+
- _sensorListeners[this.sensorType].setListener(args.successCallback);
+ _sensorListeners[this.sensorType].setListener(args.successCallback, args.interval);
};
Sensor.prototype.unsetChangeListener = function() {
PlatformResult IsSupported(bool* supported);
virtual PlatformResult Start();
virtual PlatformResult Stop();
- virtual PlatformResult SetChangeListener();
+ virtual PlatformResult SetChangeListener(unsigned int interval = 100);
virtual PlatformResult UnsetChangeListener();
virtual PlatformResult GetSensorData(picojson::object* data);
sensor_event_s previous_event_;
common::optional<bool> is_supported_;
SensorInstance& instance_;
+ unsigned int interval_; // an interval capping the maximum frequency of callback events.
+ // 0 means that the events are uncapped and will be called on value change.
+ // a value in [10, 1000] will result in invoking sensor's callback method
+ // every 10 ... 1000 milliseconds, regardless of whether its value has been
+ // changed or not. Any other interval value is considered invalid.
};
SensorData::SensorData(SensorInstance& instance, sensor_type_e type_enum,
handle_(nullptr),
listener_(nullptr),
previous_event_(),
- instance_(instance) {
+ instance_(instance),
+ interval_(0) {
type_to_string_map.insert(std::make_pair(type_enum, name));
string_to_type_map.insert(std::make_pair(name, type_enum));
bool SensorData::UpdateEvent(sensor_event_s* event) {
LoggerD("Entered: %s", type_to_string_map[type()].c_str());
- if (comparator_(&previous_event_, event)) {
- // previous and current events are the same -> no update
- return false;
- } else {
+ 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) {
previous_event_ = *event;
- return true;
}
+
+ return isThisEventDifferent;
}
PlatformResult SensorData::Start() {
return PlatformResult(ErrorCode::NO_ERROR);
}
-PlatformResult SensorData::SetChangeListener() {
+PlatformResult SensorData::SetChangeListener(unsigned int interval) {
LoggerD("Entered: %s", type_to_string_map[type()].c_str());
auto res = CheckInitialization();
return res;
}
- int ret = sensor_listener_set_event_cb(listener_, 100, SensorCallback, this);
+ 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);
virtual PlatformResult Start();
virtual PlatformResult Stop();
- virtual PlatformResult SetChangeListener();
+ virtual PlatformResult SetChangeListener(unsigned int interval = 100);
virtual PlatformResult UnsetChangeListener();
virtual PlatformResult GetSensorData(picojson::object* data);
return CallMember(&SensorData::Stop);
}
-PlatformResult HrmSensorData::SetChangeListener() {
+PlatformResult HrmSensorData::SetChangeListener(unsigned int interval) {
LoggerD("Entered: %s", type_to_string_map[type()].c_str());
- return CallMember(&SensorData::SetChangeListener);
+ for (const auto& sensor : hrm_sensors_) {
+ if (sensor.second->is_supported()) {
+ auto res = sensor.second.get()->SetChangeListener(interval);
+ if (!res) {
+ return res;
+ }
+ }
+ }
+
+ return PlatformResult(ErrorCode::NO_ERROR);
}
PlatformResult HrmSensorData::UnsetChangeListener() {
LoggerD("Entered");
const std::string type_str =
args.contains(kSensorTypeTag) ? args.get(kSensorTypeTag).get<std::string>() : "";
- LoggerD("input type: %s" , type_str.c_str());
+ const double interval = args.contains("interval") ? args.get("interval").get<double>() : 0.0;
+ LoggerD("input type: %s %f" , type_str.c_str(), interval);
sensor_type_e type_enum = string_to_type_map[type_str];
return;
}
- PlatformResult res = sensor_data->SetChangeListener();
+ PlatformResult res = sensor_data->SetChangeListener(static_cast<unsigned int>(interval));
if (!res) {
LogAndReportError(res, &out, ("Failed to set change listener for sensor: %s", type_str.c_str()));
} else {