From: Rafal Galka Date: Fri, 15 May 2015 09:25:26 +0000 (+0200) Subject: [HRM] getHumanActivityData X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~8^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8bb4e7800d10deda5c807c1f3f47532719b03e4b;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [HRM] getHumanActivityData Change-Id: I0a2d9332c578169a8662ca82a75d128e1e4019c4 --- diff --git a/src/humanactivitymonitor/humanactivitymonitor_api.js b/src/humanactivitymonitor/humanactivitymonitor_api.js index 75cac484..ab1f1f84 100644 --- a/src/humanactivitymonitor/humanactivitymonitor_api.js +++ b/src/humanactivitymonitor/humanactivitymonitor_api.js @@ -36,17 +36,43 @@ var PedometerStepStatus = { RUNNING: 'RUNNING' }; +function convertActivityData(type, data) { + switch (type) { + case HumanActivityType.PEDOMETER: + // TODO(r.galka) Not Supported in current implementation + return undefined; + case HumanActivityType.WRIST_UP: + return null; + case HumanActivityType.HRM: + return new HumanActivityHRMData(data); + case HumanActivityType.GPS: + var gpsInfo = []; + for (var i = 0, max = data.length; i < max; i++) { + gpsInfo.push(new HumanActivityGPSInfo(data[i])); + } + return new HumanActivityGPSInfoArray(gpsInfo); + } +} function HumanActivityMonitorManager() { } HumanActivityMonitorManager.prototype.getHumanActivityData = function(type, successCallback, errorCallback) { var args = validator_.validateArgs(arguments, [ - {name: 'type', type: types_.ENUM, values: ['PEDOMETER', 'WRIST_UP', 'HRM', 'GPS']}, + {name: 'type', type: types_.ENUM, values: Object.keys(HumanActivityType)}, {name: 'successCallback', type: types_.FUNCTION}, {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true} ]); + if (args.type === HumanActivityType.WRIST_UP) { + throw new WebAPIException(WebAPIException.NOT_SUPPORTED_ERR); + } + + var listenerId ='HumanActivityMonitor_' + args.type; + if (!native_.isListenerSet(listenerId)) { + throw new WebAPIException(WebAPIException.SERVICE_NOT_AVAILABLE_ERR); + } + var data = { type: args.type }; @@ -56,7 +82,9 @@ HumanActivityMonitorManager.prototype.getHumanActivityData = function(type, succ native_.callIfPossible(args.errorCallback, native_.getErrorObject(result)); return; } - native_.callIfPossible(args.successCallback); + + native_.callIfPossible(args.successCallback, + convertActivityData(args.type, native_.getResultObject(result))); }; native_.call('HumanActivityMonitorManager_getHumanActivityData', data, callback); @@ -87,25 +115,7 @@ HumanActivityMonitorManager.prototype.start = function(type, changedCallback) { } var listener = function(result) { - switch (args.type) { - case HumanActivityType.PEDOMETER: - // TODO(r.galka) Not Supported in current implementation - break; - case HumanActivityType.WRIST_UP: - native_.callIfPossible(args.changedCallback, null); - break; - case HumanActivityType.HRM: - native_.callIfPossible(args.changedCallback, new HumanActivityHRMData(result)); - break; - case HumanActivityType.GPS: - var gpsInfo = []; - for (var i = 0, max = result.length; i < max; i++) { - gpsInfo.push(new HumanActivityGPSInfo(result[i])); - } - native_.callIfPossible(args.changedCallback, new HumanActivityGPSInfoArray(gpsInfo)); - break; - } - + native_.callIfPossible(args.changedCallback, convertActivityData(args.type, result)); }; native_.addListener(listenerId, listener); }; diff --git a/src/humanactivitymonitor/humanactivitymonitor_instance.cc b/src/humanactivitymonitor/humanactivitymonitor_instance.cc index fb5d77c7..eea1ca34 100644 --- a/src/humanactivitymonitor/humanactivitymonitor_instance.cc +++ b/src/humanactivitymonitor/humanactivitymonitor_instance.cc @@ -11,6 +11,7 @@ #include "common/picojson.h" #include "common/logger.h" #include "common/platform_result.h" +#include "common/task-queue.h" #include "humanactivitymonitor/humanactivitymonitor_manager.h" namespace extension { @@ -18,6 +19,7 @@ namespace humanactivitymonitor { using common::PlatformResult; using common::ErrorCode; +using common::TaskQueue; HumanActivityMonitorInstance::HumanActivityMonitorInstance() { using std::placeholders::_1; @@ -66,7 +68,36 @@ PlatformResult HumanActivityMonitorInstance::Init() { void HumanActivityMonitorInstance::HumanActivityMonitorManagerGetHumanActivityData( const picojson::value& args, picojson::object& out) { - // TODO(r.galka) implement + CHECK_EXIST(args, "type", out) + + PlatformResult result = Init(); + if (!result) { + ReportError(result, &out); + return; + } + + auto get = [this, args]() -> void { + picojson::value response = picojson::value(picojson::object()); + picojson::object& response_obj = response.get(); + response_obj["callbackId"] = args.get("callbackId"); + + picojson::value data = picojson::value(); + PlatformResult result = manager_->GetHumanActivityData( + args.get("type").get(), + &data); + + if (result) { + ReportSuccess(data, response_obj); + } else { + ReportError(result, &response_obj); + } + + PostMessage(response.serialize().c_str()); + }; + + TaskQueue::GetInstance().Async(get); + + ReportSuccess(out); } void HumanActivityMonitorInstance::HumanActivityMonitorManagerStart( diff --git a/src/humanactivitymonitor/humanactivitymonitor_manager.cc b/src/humanactivitymonitor/humanactivitymonitor_manager.cc index f3fc15db..db09a300 100644 --- a/src/humanactivitymonitor/humanactivitymonitor_manager.cc +++ b/src/humanactivitymonitor/humanactivitymonitor_manager.cc @@ -76,22 +76,18 @@ PlatformResult HumanActivityMonitorManager::SetListener( return result; } - // PEDOMETER if (type == kActivityTypePedometer) { // TODO(r.galka) Not Supported in current implementation. } - // WRIST_UP if (type == kActivityTypeWristUp) { return SetWristUpListener(callback); } - // HRM if (type == kActivityTypeHrm) { return SetHrmListener(callback); } - // GPS if (type == kActivityTypeGps) { return SetGpsListener(callback); } @@ -107,22 +103,18 @@ PlatformResult HumanActivityMonitorManager::UnsetListener( return result; } - // PEDOMETER if (type == kActivityTypePedometer) { // TODO(r.galka) Not Supported in current implementation. } - // WRIST_UP if (type == kActivityTypeWristUp) { return UnsetWristUpListener(); } - // HRM if (type == kActivityTypeHrm) { return UnsetHrmListener(); } - // GPS if (type == kActivityTypeGps) { return UnsetGpsListener(); } @@ -130,6 +122,29 @@ PlatformResult HumanActivityMonitorManager::UnsetListener( return PlatformResult(ErrorCode::UNKNOWN_ERR, "Undefined activity type"); } +PlatformResult HumanActivityMonitorManager::GetHumanActivityData( + const std::string& type, + picojson::value* data) { + + if (type == kActivityTypePedometer) { + // TODO(r.galka) Not Supported in current implementation. + } + + if (type == kActivityTypeWristUp) { + return PlatformResult(ErrorCode::NOT_SUPPORTED_ERR); + } + + if (type == kActivityTypeHrm) { + return GetHrmData(data); + } + + if (type == kActivityTypeGps) { + return GetGpsData(data); + } + + return PlatformResult(ErrorCode::UNKNOWN_ERR, "Undefined activity type"); +} + // WRIST_UP PlatformResult HumanActivityMonitorManager::SetWristUpListener( JsonCallback callback) { @@ -268,8 +283,8 @@ PlatformResult HumanActivityMonitorManager::UnsetHrmListener() { return PlatformResult(ErrorCode::NO_ERROR); } -void HumanActivityMonitorManager::OnHrmSensorEvent( - sensor_h sensor, sensor_event_s *event, void *user_data) { +static PlatformResult ConvertHrmEvent(sensor_event_s* event, + picojson::object* data) { LOGGER(DEBUG) << "Sensor event:"; LOGGER(DEBUG) << " |- accuracy: " << event->accuracy; LOGGER(DEBUG) << " |- timestamp: " << event->timestamp; @@ -277,7 +292,7 @@ void HumanActivityMonitorManager::OnHrmSensorEvent( if (event->value_count < 2) { LOGGER(ERROR) << "To few values of HRM event"; - return; + return PlatformResult(ErrorCode::UNKNOWN_ERR, "To few values of HRM event"); } LOGGER(DEBUG) << " |- values[0]: " << event->values[0]; @@ -290,6 +305,16 @@ void HumanActivityMonitorManager::OnHrmSensorEvent( // or unofficially values[1] is rri (0 ~ 5000 ms) float rri = event->values[1]; + + (*data)["heartRate"] = picojson::value(static_cast(hr)); + (*data)["rRInterval"] = picojson::value(static_cast(rri)); + + return PlatformResult(ErrorCode::NO_ERROR); +} + +void HumanActivityMonitorManager::OnHrmSensorEvent( + sensor_h /*sensor*/, sensor_event_s *event, void *user_data) { + HumanActivityMonitorManager* manager = static_cast(user_data); @@ -299,14 +324,41 @@ void HumanActivityMonitorManager::OnHrmSensorEvent( } picojson::value hrm_data = picojson::value(picojson::object()); - picojson::object& hrm_data_o = hrm_data.get(); - - hrm_data_o["heartRate"] = picojson::value(static_cast(hr)); - hrm_data_o["rRInterval"] = picojson::value(static_cast(rri)); + PlatformResult result = ConvertHrmEvent(event, + &hrm_data.get()); + if (!result) { + LOGGER(ERROR) << "Failed to convert HRM data: " << result.message(); + return; + } manager->hrm_event_callback_(&hrm_data); } +PlatformResult HumanActivityMonitorManager::GetHrmData(picojson::value* data) { + if (!hrm_sensor_listener_) { + return PlatformResult(ErrorCode::SERVICE_NOT_AVAILABLE_ERR); + } + + int ret; + + sensor_event_s event; + ret = sensor_listener_read_data(hrm_sensor_listener_, &event); + if (ret != SENSOR_ERROR_NONE) { + LOGGER(ERROR) << "Failed to get HRM sensor data, error: " << ret; + return PlatformResult(ErrorCode::UNKNOWN_ERR, + "Failed to get HRM sensor data"); + } + + *data = picojson::value(picojson::object()); + PlatformResult result = ConvertHrmEvent(&event, + &data->get()); + if (!result) { + return result; + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + // GPS PlatformResult HumanActivityMonitorManager::SetGpsListener( JsonCallback callback) { @@ -423,5 +475,31 @@ void HumanActivityMonitorManager::OnGpsEvent(int num_of_location, manager->gps_event_callback_(&gps_info); } +PlatformResult HumanActivityMonitorManager::GetGpsData(picojson::value* data) { + if (!location_handle_) { + return PlatformResult(ErrorCode::SERVICE_NOT_AVAILABLE_ERR); + } + + int ret; + double altitude, latitude, longitude, climb, + direction, speed, horizontal, vertical; + location_accuracy_level_e level; + time_t timestamp; + ret = location_manager_get_location(location_handle_, &altitude, &latitude, + &longitude, &climb, &direction, &speed, + &level, &horizontal, &vertical, + ×tamp); + if (ret != LOCATIONS_ERROR_NONE) { + LOGGER(ERROR) << "Failed to get location, error: " << ret; + return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get location"); + } + + *data = picojson::value(picojson::array()); + ConvertGpsEvent(latitude, longitude, altitude, speed, direction, horizontal, + vertical, timestamp, &data->get()); + + return PlatformResult(ErrorCode::NO_ERROR); +} + } // namespace humanactivitymonitor } // namespace extension diff --git a/src/humanactivitymonitor/humanactivitymonitor_manager.h b/src/humanactivitymonitor/humanactivitymonitor_manager.h index 45c1328e..9d1ef662 100644 --- a/src/humanactivitymonitor/humanactivitymonitor_manager.h +++ b/src/humanactivitymonitor/humanactivitymonitor_manager.h @@ -32,14 +32,17 @@ class HumanActivityMonitorManager { virtual ~HumanActivityMonitorManager(); common::PlatformResult Init(); - common::PlatformResult IsSupported(const std::string& type); common::PlatformResult SetListener(const std::string& type, JsonCallback callback); common::PlatformResult UnsetListener(const std::string& type); + common::PlatformResult GetHumanActivityData(const std::string& type, + picojson::value* data); + private: std::map supported_; + common::PlatformResult IsSupported(const std::string& type); // WRIST_UP gesture_h gesture_handle_; @@ -60,6 +63,7 @@ class HumanActivityMonitorManager { static void OnHrmSensorEvent(sensor_h sensor, sensor_event_s *event, void *user_data); + common::PlatformResult GetHrmData(picojson::value* data); // GPS location_manager_h location_handle_; @@ -67,6 +71,7 @@ class HumanActivityMonitorManager { common::PlatformResult SetGpsListener(JsonCallback callback); common::PlatformResult UnsetGpsListener(); static void OnGpsEvent(int num_of_location, void *user_data); + common::PlatformResult GetGpsData(picojson::value* data); }; } // namespace humanactivitymonitor