[Sensor] Added method to get sensors data.
authorTomasz Marciniak <t.marciniak@samsung.com>
Fri, 13 Feb 2015 07:59:56 +0000 (08:59 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Mon, 16 Feb 2015 10:53:26 +0000 (19:53 +0900)
[Verification] Code compiles without errors.
Data for specific sensors are successfully received.

Change-Id: Id94cd6e013d955a7a736c018202962612c1a7a99
Signed-off-by: Tomasz Marciniak <t.marciniak@samsung.com>
src/sensor/sensor_api.js
src/sensor/sensor_instance.cc
src/sensor/sensor_instance.h
src/sensor/sensor_service.cc
src/sensor/sensor_service.h

index 1d0d04661b2ccd8cc00f80535ae33da0db0fc8ad..6b54a5bb25adf9f2ea0a74dc52fc55046855dbc9 100644 (file)
@@ -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/////////////////////////////////////////////////////
index 7e0a4a0547ce8829557511c7cf056ed5e96a9953..6914c3d58718bd08c6bedbdcd71977dd6f3d93ff 100644 (file)
@@ -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
index de4aa364203b1f8e1722c5ebdef9f5c62eb890f1..ffeda725308f0800f7d9fb963d7b9c760ed39f57 100644 (file)
@@ -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
index 4999c350003b318b56eeda1c236d36e169fb6ed6..87754d5e91a9872e2b95af5ae5b4d66cc37b21d0 100644 (file)
@@ -40,6 +40,22 @@ static std::map<std::string, sensor_type_e> string_to_type_map = {
     {"PROXIMITY", SENSOR_PROXIMITY},
     {"ULTRAVIOLET", SENSOR_ULTRAVIOLET}
 };
+
+static std::string GetAccuracyString(int accuracy) {
+  LoggerD("Entered");
+  switch (static_cast<sensor_data_accuracy_e>(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<int>(args.get("callbackId").get<double>());
+  sensor_type_e sensor_type = string_to_type_map[args.get("type").get<std::string>()];
+
+  auto get_data = [this, sensor_type](const std::shared_ptr<picojson::value>& 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<picojson::object>()));
+      return;
+    }
+
+    picojson::object& object = result->get<picojson::object>();
+    switch (sensor_type) {
+      case SENSOR_LIGHT: {
+        object["lightLevel"] = picojson::value(static_cast<double>(sensor_event.values[0]));
+        break;
+      }
+      case SENSOR_MAGNETIC: {
+        object["x"] = picojson::value(static_cast<double>(sensor_event.values[0]));
+        object["y"] = picojson::value(static_cast<double>(sensor_event.values[1]));
+        object["z"] = picojson::value(static_cast<double>(sensor_event.values[2]));
+        object["accuracy"] = picojson::value(GetAccuracyString(sensor_event.accuracy));
+        break;
+      }
+      case SENSOR_PRESSURE: {
+        object["pressure"] = picojson::value(static_cast<double>(sensor_event.values[0]));
+        break;
+      }
+      case SENSOR_PROXIMITY: {
+        int state = static_cast<int>(sensor_event.values[0]);
+        object["proximityState"] = picojson::value(state ? "NEAR" : "FAR");
+        break;
+      }
+      case SENSOR_ULTRAVIOLET: {
+        object["ultravioletLevel"] = picojson::value(static_cast<double>(sensor_event.values[0]));
+        break;
+      }
+      default: {
+        ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unsupported type"),
+                    &(result->get<picojson::object>()));
+        return;
+      }
+    }
+
+    ReportSuccess(object);
+  };
+
+  auto get_data_result = [callback_id](const std::shared_ptr<picojson::value>& result) {
+    result->get<picojson::object>()["callbackId"] = picojson::value{static_cast<double>(callback_id)};
+
+    SensorInstance::GetInstance().PostMessage(result->serialize().c_str());
+  };
+
+  TaskQueue::GetInstance().Queue<picojson::value>(
+      get_data,
+      get_data_result,
+      std::shared_ptr<picojson::value>{new picojson::value{picojson::object()}});
+
+  ReportSuccess(out);
+}
+
 } // namespace sensor
 } // namespace extension
index 12868ce8523c6ce7ba2d5a161970dc8293de5dcc..a33d3ab22bcfcb751848e6bea0db6b00565ca737 100644 (file)
@@ -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();