From: Tomasz Marciniak Date: Fri, 13 Feb 2015 07:59:56 +0000 (+0100) Subject: [Sensor] Added method to get sensors data. X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~433 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=56129a5a7fa6a651994ea66a174d3690b3f4bfd3;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Sensor] Added method to get sensors data. [Verification] Code compiles without errors. Data for specific sensors are successfully received. Change-Id: Id94cd6e013d955a7a736c018202962612c1a7a99 Signed-off-by: Tomasz Marciniak --- diff --git a/src/sensor/sensor_api.js b/src/sensor/sensor_api.js index 1d0d0466..6b54a5bb 100644 --- a/src/sensor/sensor_api.js +++ b/src/sensor/sensor_api.js @@ -182,17 +182,27 @@ LightSensor.prototype.getLightSensorData = function() { nullable : true } ]); - native_.call('LightSensor_getData', {}, - function(result) { + + if (!_startedSensors[this.sensorType]) { + setTimeout(function() { + if (!T_.isNullOrUndefined(args.errorCallback)) { + args.errorCallback(new tizen.WebAPIException( + tizen.WebAPIException.SERVICE_NOT_AVAILABLE_ERR, + 'Service is not available.')); + } + }, 0); + } else { + native_.call('Sensor_getData', { type : this.sensorType }, + function(result) { if (native_.isFailure(result)) { if(!T_.isNullOrUndefined(args.errorCallback)) { args.errorCallback(native_.getErrorObject(result)); } } else { - args.successCallback(); + args.successCallback(new SensorLightData(result)); } - } - ); + }); + } }; //// MagneticSensor @@ -217,17 +227,27 @@ MagneticSensor.prototype.getMagneticSensorData = function() { nullable : true } ]); - native_.call('MagneticSensor_getData', {}, - function(result) { + + if (!_startedSensors[this.sensorType]) { + setTimeout(function() { + if (!T_.isNullOrUndefined(args.errorCallback)) { + args.errorCallback(new tizen.WebAPIException( + tizen.WebAPIException.SERVICE_NOT_AVAILABLE_ERR, + 'Service is not available.')); + } + }, 0); + } else { + native_.call('Sensor_getData', { type : this.sensorType }, + function(result) { if (native_.isFailure(result)) { if(!T_.isNullOrUndefined(args.errorCallback)) { args.errorCallback(native_.getErrorObject(result)); } } else { - args.successCallback(); + args.successCallback(new SensorMagneticData(result)); } - } - ); + }); + } }; //// PressureSensor @@ -252,17 +272,27 @@ PressureSensor.prototype.getPressureSensorData = function() { nullable : true } ]); - native_.call('PressureSensor_getData', {}, - function(result) { + + if (!_startedSensors[this.sensorType]) { + setTimeout(function() { + if (!T_.isNullOrUndefined(args.errorCallback)) { + args.errorCallback(new tizen.WebAPIException( + tizen.WebAPIException.SERVICE_NOT_AVAILABLE_ERR, + 'Service is not available.')); + } + }, 0); + } else { + native_.call('Sensor_getData', { type : this.sensorType }, + function(result) { if (native_.isFailure(result)) { if(!T_.isNullOrUndefined(args.errorCallback)) { args.errorCallback(native_.getErrorObject(result)); } } else { - args.successCallback(); + args.successCallback(new SensorPressureData(result)); } - } - ); + }); + } }; //// ProximitySensor @@ -287,17 +317,27 @@ ProximitySensor.prototype.getProximitySensorData = function() { nullable : true } ]); - native_.call('ProximitySensor_getData', {}, - function(result) { + + if (!_startedSensors[this.sensorType]) { + setTimeout(function() { + if (!T_.isNullOrUndefined(args.errorCallback)) { + args.errorCallback(new tizen.WebAPIException( + tizen.WebAPIException.SERVICE_NOT_AVAILABLE_ERR, + 'Service is not available.')); + } + }, 0); + } else { + native_.call('Sensor_getData', { type : this.sensorType }, + function(result) { if (native_.isFailure(result)) { if(!T_.isNullOrUndefined(args.errorCallback)) { args.errorCallback(native_.getErrorObject(result)); } } else { - args.successCallback(); + args.successCallback(new SensorProximityData(result)); } - } - ); + }); + } }; //// UltravioletSensor @@ -322,17 +362,27 @@ UltravioletSensor.prototype.getUltravioletSensorData = function() { nullable : true } ]); - native_.call('UltravioletSensor_getData', {}, - function(result) { + + if (!_startedSensors[this.sensorType]) { + setTimeout(function() { + if (!T_.isNullOrUndefined(args.errorCallback)) { + args.errorCallback(new tizen.WebAPIException( + tizen.WebAPIException.SERVICE_NOT_AVAILABLE_ERR, + 'Service is not available.')); + } + }, 0); + } else { + native_.call('Sensor_getData', { type : this.sensorType }, + function(result) { if (native_.isFailure(result)) { if(!T_.isNullOrUndefined(args.errorCallback)) { args.errorCallback(native_.getErrorObject(result)); } } else { - args.successCallback(); + args.successCallback(new SensorUltravioletData(result)); } - } - ); + }); + } }; ////////////////////// Sensor Data classes///////////////////////////////////////////////////// diff --git a/src/sensor/sensor_instance.cc b/src/sensor/sensor_instance.cc index 7e0a4a05..6914c3d5 100644 --- a/src/sensor/sensor_instance.cc +++ b/src/sensor/sensor_instance.cc @@ -31,12 +31,7 @@ SensorInstance::SensorInstance() { #define REGISTER_ASYNC(c,x) \ RegisterHandler(c, std::bind(&SensorInstance::x, this, _1, _2)); REGISTER_ASYNC("Sensor_start", SensorStart); - REGISTER_ASYNC("LightSensor_getData", LightSensorGetData); - REGISTER_ASYNC("MagneticSensor_getData", MagneticSensorGetData); - REGISTER_ASYNC("PressureSensor_getData", PressureSensorGetData); - REGISTER_ASYNC("ProximitySensor_getData", ProximitySensorGetData); - REGISTER_ASYNC("UltravioletSensor_getData", UltravioletSensorGetData); - + REGISTER_ASYNC("Sensor_getData", SensorGetData); #undef REGISTER_ASYNC } @@ -68,29 +63,10 @@ void SensorInstance::SensorStart(const picojson::value& args, picojson::object& SensorService::GetInstance()->SensorStart(args, out); } -void SensorInstance::LightSensorGetData(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - //empty stub -} - -void SensorInstance::MagneticSensorGetData(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - //empty stub -} - -void SensorInstance::PressureSensorGetData(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - //empty stub -} - -void SensorInstance::ProximitySensorGetData(const picojson::value& args, picojson::object& out) { +void SensorInstance::SensorGetData(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); - //empty stub -} -void SensorInstance::UltravioletSensorGetData(const picojson::value& args, picojson::object& out) { - LoggerD("Entered"); - //empty stub + SensorService::GetInstance()->GetSensorData(args, out); } } // namespace sensor diff --git a/src/sensor/sensor_instance.h b/src/sensor/sensor_instance.h index de4aa364..ffeda725 100644 --- a/src/sensor/sensor_instance.h +++ b/src/sensor/sensor_instance.h @@ -23,11 +23,7 @@ class SensorInstance : public common::ParsedInstance { void SensorSetChangeListener(const picojson::value& args, picojson::object& out); void SensorUnsetChangeListener(const picojson::value& args, picojson::object& out); void SensorStart(const picojson::value& args, picojson::object& out); - void LightSensorGetData(const picojson::value& args, picojson::object& out); - void MagneticSensorGetData(const picojson::value& args, picojson::object& out); - void PressureSensorGetData(const picojson::value& args, picojson::object& out); - void ProximitySensorGetData(const picojson::value& args, picojson::object& out); - void UltravioletSensorGetData(const picojson::value& args, picojson::object& out); + void SensorGetData(const picojson::value& args, picojson::object& out); }; } // namespace sensor diff --git a/src/sensor/sensor_service.cc b/src/sensor/sensor_service.cc index 4999c350..87754d5e 100644 --- a/src/sensor/sensor_service.cc +++ b/src/sensor/sensor_service.cc @@ -40,6 +40,22 @@ static std::map string_to_type_map = { {"PROXIMITY", SENSOR_PROXIMITY}, {"ULTRAVIOLET", SENSOR_ULTRAVIOLET} }; + +static std::string GetAccuracyString(int accuracy) { + LoggerD("Entered"); + switch (static_cast(accuracy)) { + case SENSOR_DATA_ACCURACY_BAD: + return "ACCURACY_BAD"; + case SENSOR_DATA_ACCURACY_NORMAL: + return "ACCURACY_NORMAL"; + case SENSOR_DATA_ACCURACY_GOOD: + return "ACCURACY_GOOD"; + case SENSOR_DATA_ACCURACY_VERYGOOD: + return "ACCURACY_VERYGOOD"; + default: + return "ACCURACY_UNDEFINED"; + } +} } SensorService::SensorService() { @@ -328,5 +344,75 @@ CallbackPtr SensorService::GetCallbackFunction(sensor_type_e type_enum) { } } +void SensorService::GetSensorData(const picojson::value& args, picojson::object& out) { + LoggerD("Entered"); + + CHECK_EXIST(args, "callbackId", out); + CHECK_EXIST(args, "type", out); + + int callback_id = static_cast(args.get("callbackId").get()); + sensor_type_e sensor_type = string_to_type_map[args.get("type").get()]; + + auto get_data = [this, sensor_type](const std::shared_ptr& result) { + sensor_event_s sensor_event; + SensorData* sensor = this->GetSensorStruct(sensor_type); + int ret = sensor_listener_read_data(sensor->listener, &sensor_event); + + if (SENSOR_ERROR_NONE != ret) { + ReportError(GetSensorPlatformResult(ret, type_to_string_map[sensor_type]), + &(result->get())); + return; + } + + picojson::object& object = result->get(); + switch (sensor_type) { + case SENSOR_LIGHT: { + object["lightLevel"] = picojson::value(static_cast(sensor_event.values[0])); + break; + } + case SENSOR_MAGNETIC: { + object["x"] = picojson::value(static_cast(sensor_event.values[0])); + object["y"] = picojson::value(static_cast(sensor_event.values[1])); + object["z"] = picojson::value(static_cast(sensor_event.values[2])); + object["accuracy"] = picojson::value(GetAccuracyString(sensor_event.accuracy)); + break; + } + case SENSOR_PRESSURE: { + object["pressure"] = picojson::value(static_cast(sensor_event.values[0])); + break; + } + case SENSOR_PROXIMITY: { + int state = static_cast(sensor_event.values[0]); + object["proximityState"] = picojson::value(state ? "NEAR" : "FAR"); + break; + } + case SENSOR_ULTRAVIOLET: { + object["ultravioletLevel"] = picojson::value(static_cast(sensor_event.values[0])); + break; + } + default: { + ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unsupported type"), + &(result->get())); + return; + } + } + + ReportSuccess(object); + }; + + auto get_data_result = [callback_id](const std::shared_ptr& result) { + result->get()["callbackId"] = picojson::value{static_cast(callback_id)}; + + SensorInstance::GetInstance().PostMessage(result->serialize().c_str()); + }; + + TaskQueue::GetInstance().Queue( + get_data, + get_data_result, + std::shared_ptr{new picojson::value{picojson::object()}}); + + ReportSuccess(out); +} + } // namespace sensor } // namespace extension diff --git a/src/sensor/sensor_service.h b/src/sensor/sensor_service.h index 12868ce8..a33d3ab2 100644 --- a/src/sensor/sensor_service.h +++ b/src/sensor/sensor_service.h @@ -28,6 +28,7 @@ class SensorService { void SensorStop(const picojson::value& args, picojson::object& out); void SensorSetChangeListener(const picojson::value& args, picojson::object& out); void SensorUnsetChangeListener(const picojson::value& args, picojson::object& out); + void GetSensorData(const picojson::value& args, picojson::object& out); private: SensorService();