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
};
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);
}
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);
};
#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 {
using common::PlatformResult;
using common::ErrorCode;
+using common::TaskQueue;
HumanActivityMonitorInstance::HumanActivityMonitorInstance() {
using std::placeholders::_1;
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<picojson::object>();
+ response_obj["callbackId"] = args.get("callbackId");
+
+ picojson::value data = picojson::value();
+ PlatformResult result = manager_->GetHumanActivityData(
+ args.get("type").get<std::string>(),
+ &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(
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);
}
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();
}
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) {
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;
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];
// or unofficially values[1] is rri (0 ~ 5000 ms)
float rri = event->values[1];
+
+ (*data)["heartRate"] = picojson::value(static_cast<double>(hr));
+ (*data)["rRInterval"] = picojson::value(static_cast<double>(rri));
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void HumanActivityMonitorManager::OnHrmSensorEvent(
+ sensor_h /*sensor*/, sensor_event_s *event, void *user_data) {
+
HumanActivityMonitorManager* manager =
static_cast<HumanActivityMonitorManager*>(user_data);
}
picojson::value hrm_data = picojson::value(picojson::object());
- picojson::object& hrm_data_o = hrm_data.get<picojson::object>();
-
- hrm_data_o["heartRate"] = picojson::value(static_cast<double>(hr));
- hrm_data_o["rRInterval"] = picojson::value(static_cast<double>(rri));
+ PlatformResult result = ConvertHrmEvent(event,
+ &hrm_data.get<picojson::object>());
+ 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<picojson::object>());
+ if (!result) {
+ return result;
+ }
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
// GPS
PlatformResult HumanActivityMonitorManager::SetGpsListener(
JsonCallback callback) {
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<picojson::array>());
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
} // namespace humanactivitymonitor
} // namespace extension