Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions packages/sensors_plus/tizen/src/device_sensor.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "device_sensor.h"

#include "log.h"

namespace {

sensor_type_e ToTizenSensorType(const SensorType &sensor_type) {
switch (sensor_type) {
case SensorType::kAccelerometer:
return SENSOR_ACCELEROMETER;
case SensorType::kGyroscope:
return SENSOR_GYROSCOPE;
case SensorType::kUserAccel:
default:
return SENSOR_LINEAR_ACCELERATION;
}
}

} // namespace

DeviceSensor::DeviceSensor(SensorType sensor_type)
: sensor_type_(sensor_type) {}

DeviceSensor::~DeviceSensor() {
if (is_listening_) {
StopListen();
}

if (listener_) {
sensor_destroy_listener(listener_);
listener_ = nullptr;
}
}

bool DeviceSensor::StartListen(SensorEventCallback callback) {
if (is_listening_) {
LOG_WARN("Already listening.");
last_error_ = SENSOR_ERROR_OPERATION_FAILED;
return false;
}

sensor_h sensor;
int ret = sensor_get_default_sensor(ToTizenSensorType(sensor_type_), &sensor);
if (ret != SENSOR_ERROR_NONE) {
LOG_ERROR("Failed to get default sensor: %s", get_error_message(ret));
last_error_ = ret;
return false;
}

ret = sensor_create_listener(sensor, &listener_);
if (ret != SENSOR_ERROR_NONE) {
LOG_ERROR("Failed to create listener: %s", get_error_message(ret));
last_error_ = ret;
return false;
}

ret = sensor_listener_set_event_cb(
listener_, 60,
[](sensor_h sensor, sensor_event_s *event, void *user_data) {
auto *self = static_cast<DeviceSensor *>(user_data);
SensorEvent sensor_event;
for (int i = 0; i < event->value_count; i++) {
sensor_event.push_back(event->values[i]);
}
self->callback_(sensor_event);
},
this);
if (ret != SENSOR_ERROR_NONE) {
LOG_ERROR("Failed to set event callback: %s", get_error_message(ret));
last_error_ = ret;
return false;
}

ret = sensor_listener_start(listener_);
if (ret != SENSOR_ERROR_NONE) {
LOG_ERROR("Failed to start listener: %s", get_error_message(ret));
last_error_ = ret;
return false;
}

callback_ = callback;
is_listening_ = true;

return true;
}

void DeviceSensor::StopListen() {
if (!is_listening_) {
LOG_WARN("Already canceled.");
return;
}

int ret = sensor_listener_stop(listener_);
if (ret != SENSOR_ERROR_NONE) {
LOG_ERROR("Failed to stop listener: %s", get_error_message(ret));
last_error_ = ret;
return;
}

is_listening_ = false;

ret = sensor_listener_unset_event_cb(listener_);
if (ret != SENSOR_ERROR_NONE) {
LOG_ERROR("Failed to unset event callback: %s", get_error_message(ret));
last_error_ = ret;
return;
}
}
42 changes: 42 additions & 0 deletions packages/sensors_plus/tizen/src/device_sensor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Copyright 2022 Samsung Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_PLUGIN_DEVICE_SENSOR_H_
#define FLUTTER_PLUGIN_DEVICE_SENSOR_H_

#include <sensor.h>
#include <tizen.h>

#include <functional>
#include <string>
#include <vector>

enum class SensorType { kAccelerometer, kGyroscope, kUserAccel };

typedef std::vector<double> SensorEvent;
typedef std::function<void(SensorEvent)> SensorEventCallback;

class DeviceSensor {
public:
DeviceSensor(SensorType sensor_type);
~DeviceSensor();

int GetLastError() { return last_error_; }

std::string GetLastErrorString() { return get_error_message(last_error_); }

bool StartListen(SensorEventCallback callback);

void StopListen();

private:
SensorType sensor_type_;
sensor_listener_h listener_ = nullptr;
bool is_listening_ = false;
int last_error_ = TIZEN_ERROR_NONE;

SensorEventCallback callback_ = nullptr;
};

#endif // FLUTTER_PLUGIN_DEVICE_SENSOR_H_
Loading