typedef struct {
int listener_id;
- void* cb;
- bool is_events_cb;
- sensor_accuracy_changed_cb_t acc_cb;
sensor_info *sensor;
+ void* cb;
char* data;
size_t data_size;
void *user_data;
} callback_info_s;
+typedef GSourceFunc callback_dispatcher_t;
+
static sensor::sensor_manager manager;
static std::unordered_map<int, sensor::sensor_listener *> listeners;
static cmutex lock;
-static gboolean callback_dispatcher(gpointer data)
+static gboolean sensor_events_callback_dispatcher(gpointer data)
{
int event_type = 0;
callback_info_s *info = (callback_info_s *)data;
event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
- if (info->is_events_cb) {
- size_t element_size = sizeof(sensor_data_t);
- size_t count = info->data_size / element_size;
- sensor_data_t *events[count];
- char* p = (char*)info->data;
- for (size_t i = 0 ; i < count; ++i) {
- events[i] = (sensor_data_t *)(p + i * element_size);
- }
- ((sensor_events_cb_t)info->cb)(info->sensor, event_type, events, count, info->user_data);
- } else {
- ((sensor_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, info->user_data);
+ size_t element_size = sizeof(sensor_data_t);
+ size_t count = info->data_size / element_size;
+ sensor_data_t *events[count];
+ char* p = (char*)info->data;
+ for (size_t i = 0 ; i < count; ++i) {
+ events[i] = (sensor_data_t *)(p + i * element_size);
}
+ ((sensor_events_cb_t)info->cb)(info->sensor, event_type, events, count, info->user_data);
+ }
+
+ delete [] info->data;
+ delete info;
+ return FALSE;
+}
+
+static gboolean sensor_event_callback_dispatcher(gpointer data)
+{
+ int event_type = 0;
+ callback_info_s *info = (callback_info_s *)data;
+
+ AUTOLOCK(lock);
+
+ if (info->sensor)
+ event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
+
+ if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
+ ((sensor_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, info->user_data);
}
delete [] info->data;
return FALSE;
}
-static gboolean accuracy_callback_dispatcher(gpointer data)
+static gboolean sensor_accuracy_changed_callback_dispatcher(gpointer data)
{
callback_info_s *info = (callback_info_s *)data;
AUTOLOCK(lock);
- if (info->acc_cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
+ if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
sensor_data_t * data = (sensor_data_t *)info->data;
- info->acc_cb(info->sensor, data->timestamp, data->accuracy, info->user_data);
+ ((sensor_accuracy_changed_cb_t)info->cb)(info->sensor, data->timestamp, data->accuracy, info->user_data);
}
delete [] info->data;
return FALSE;
}
-class sensor_event_handler : public ipc::channel_handler
+class sensor_listener_handler : public ipc::channel_handler
{
public:
- sensor_event_handler(int id, sensor_t sensor, void* cb, bool is_events_cb, void *user_data)
+ sensor_listener_handler(int id, sensor_t sensor, void* cb, void *user_data, callback_dispatcher_t dispatcher)
: m_listener_id(id)
, m_sensor(reinterpret_cast<sensor_info *>(sensor))
, m_cb(cb)
, m_user_data(user_data)
- , m_is_events_cb(is_events_cb)
+ , m_dispatcher(dispatcher)
{}
void connected(ipc::channel *ch) {}
info->data = data;
info->data_size = size;
info->user_data = m_user_data;
- info->is_events_cb = m_is_events_cb;
- g_idle_add(callback_dispatcher, info);
+ g_idle_add(m_dispatcher, info);
}
void read_complete(ipc::channel *ch) {}
sensor_info *m_sensor;
void* m_cb;
void *m_user_data;
- bool m_is_events_cb;
-};
-
-class sensor_accuracy_handler : public ipc::channel_handler
-{
-public:
- sensor_accuracy_handler(int id, sensor_t sensor, sensor_accuracy_changed_cb_t cb, void *user_data)
- : m_listener_id(id)
- , m_sensor(reinterpret_cast<sensor_info *>(sensor))
- , m_cb(cb)
- , m_user_data(user_data)
- {}
-
- void connected(ipc::channel *ch) {}
- void disconnected(ipc::channel *ch) {}
- void read(ipc::channel *ch, ipc::message &msg)
- {
- callback_info_s *info;
- char *data = new(std::nothrow) char[msg.size()];
-
- memcpy(data, msg.body(), msg.size());
-
- info = new(std::nothrow) callback_info_s();
- info->listener_id = m_listener_id;
- info->acc_cb = m_cb;
- info->sensor = m_sensor;
- info->data = data;
- info->user_data = m_user_data;
-
- g_idle_add(accuracy_callback_dispatcher, info);
- }
-
- void read_complete(ipc::channel *ch) {}
- void error_caught(ipc::channel *ch, int error) {}
-
-private:
- int m_listener_id;
- sensor_info *m_sensor;
- sensor_accuracy_changed_cb_t m_cb;
- void *m_user_data;
+ callback_dispatcher_t m_dispatcher;
};
/*
sensor::sensor_listener *listener;
int prev_interval;
int prev_max_batch_latency;
- sensor_event_handler *handler;
+ sensor_listener_handler *handler;
AUTOLOCK(lock);
return false;
}
- handler = new(std::nothrow) sensor_event_handler(handle, listener->get_sensor(), cb, is_events_callback, user_data);
+ if (is_events_callback) {
+ handler = new(std::nothrow)sensor_listener_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_events_callback_dispatcher);
+ } else {
+ handler = new(std::nothrow)sensor_listener_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_event_callback_dispatcher);
+ }
+
if (!handler) {
listener->set_max_batch_latency(prev_max_batch_latency);
listener->set_interval(prev_interval);
API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
{
sensor::sensor_listener *listener;
- sensor_accuracy_handler *handler;
+ sensor_listener_handler *handler;
AUTOLOCK(lock);
listener = it->second;
- handler = new(std::nothrow) sensor_accuracy_handler(handle, listener->get_sensor(), cb, user_data);
+ handler = new(std::nothrow) sensor_listener_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_accuracy_changed_callback_dispatcher);
retvm_if(!handler, false, "Failed to allocate memory");
listener->set_accuracy_handler(handler);
return true;
}
+API bool sensord_register_attribute_int_changed_cb(int handle, sensor_attribute_int_changed_cb_t cb, void *user_data)
+{
+ // TODO
+ return false;
+}
+
+API bool sensord_unregister_attribute_int_changed_cb(int handle)
+{
+ // TODO
+ return false;
+}
+
+API bool sensord_register_attribute_str_changed_cb(int handle, sensor_attribute_str_changed_cb_t cb, void *user_data)
+{
+ // TODO
+ return false;
+}
+
+API bool sensord_unregister_attribute_str_changed_cb(int handle)
+{
+ // TODO
+ return false;
+}
+
API bool sensord_start(int handle, int option)
{
sensor::sensor_listener *listener;
return true;
}
+
+void sensor_attribute_int_changed_callback(sensor_t sensor, int attribute, int value, void *data)
+{
+ _I("[ATTRIBUTE INT CHANGED] attribute : %d, value : %d\n", attribute, value);
+}
+
+TESTCASE(skip_sensor_listener, register_attribute_int_changed)
+{
+ int err;
+ bool ret;
+ int handle;
+ sensor_t sensor;
+
+ called = false;
+
+ err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
+ ASSERT_EQ(err, 0);
+
+ handle = sensord_connect(sensor);
+ ASSERT_EQ(err, 0);
+
+ ret = sensord_register_attribute_int_changed_cb(handle, sensor_attribute_int_changed_callback, NULL);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_start(handle, 0);
+ ASSERT_TRUE(ret);
+
+ mainloop::run();
+
+ ret = sensord_stop(handle);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_unregister_attribute_int_changed_cb(handle);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_disconnect(handle);
+ ASSERT_TRUE(ret);
+
+ return true;
+}
+
+static int attribute = 1; // 1 is SENSOR_ATTRIBUTE_AXIS_ORIENTATION of sensor_attribute_e in sensor.h
+static int attribute_value = 0;
+
+static gboolean change_attribute_int(gpointer gdata)
+{
+ int *handle = reinterpret_cast<int *>(gdata);
+
+ sensord_set_attribute_int(*handle, attribute, attribute_value);
+
+ _N("[ SET ATTRIBUTE INT ] attribute %d, value : %d\n", attribute, attribute_value);
+
+ g_timeout_add_seconds(1, change_attribute_int, handle);
+
+ attribute_value ? attribute_value = 0 : attribute_value = 1;
+
+ return FALSE;
+}
+
+TESTCASE(skip_sensor_listener, attribute_int_changer)
+{
+ int err;
+ bool ret;
+ int handle;
+ sensor_t sensor;
+
+ called = false;
+
+ err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
+ ASSERT_EQ(err, 0);
+
+ handle = sensord_connect(sensor);
+ ASSERT_EQ(err, 0);
+
+ ret = sensord_start(handle, 0);
+ ASSERT_TRUE(ret);
+
+ g_timeout_add_seconds(1, change_attribute_int, &handle);
+ mainloop::run();
+
+ ret = sensord_stop(handle);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_disconnect(handle);
+ ASSERT_TRUE(ret);
+
+ return true;
+}
+
+void sensor_attribute_str_changed_callback(sensor_t sensor, int attribute, const char *value, int len, void *data)
+{
+ _I("[ATTRIBUTE STR CHANGED] attribute : %d, value : %s, len : %d\n", attribute, value, len);
+}
+
+TESTCASE(skip_sensor_listener, register_attribute_str_changed)
+{
+ int err;
+ bool ret;
+ int handle;
+ sensor_t sensor;
+
+ called = false;
+
+ err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
+ ASSERT_EQ(err, 0);
+
+ handle = sensord_connect(sensor);
+ ASSERT_EQ(err, 0);
+
+ ret = sensord_register_attribute_str_changed_cb(handle, sensor_attribute_str_changed_callback, NULL);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_start(handle, 0);
+ ASSERT_TRUE(ret);
+
+ mainloop::run();
+
+ ret = sensord_stop(handle);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_unregister_attribute_int_changed_cb(handle);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_disconnect(handle);
+ ASSERT_TRUE(ret);
+
+ return true;
+}
+
+static const char *attribute_value_str1 = "test_str_1";
+static const char *attribute_value_str2 = "test_str_2";
+static const char *attribute_value_str = attribute_value_str1;
+
+static gboolean change_attribute_str(gpointer gdata)
+{
+ int *handle = reinterpret_cast<int *>(gdata);
+ int len = strlen(attribute_value_str);
+ sensord_set_attribute_str(*handle, attribute, attribute_value_str, len);
+
+ _N("[ SET ATTRIBUTE STR ] attribute %d, value : %s, len : %d\n", attribute, attribute_value_str, len);
+
+ g_timeout_add_seconds(1, change_attribute_str, handle);
+
+ if (attribute_value_str == attribute_value_str1) {
+ attribute_value_str = attribute_value_str2;
+ } else {
+ attribute_value_str = attribute_value_str1;
+ }
+
+ return FALSE;
+}
+
+TESTCASE(skip_sensor_listener, attribute_str_changer)
+{
+ int err;
+ bool ret;
+ int handle;
+ sensor_t sensor;
+
+ called = false;
+
+ err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor);
+ ASSERT_EQ(err, 0);
+
+ handle = sensord_connect(sensor);
+ ASSERT_EQ(err, 0);
+
+ ret = sensord_start(handle, 0);
+ ASSERT_TRUE(ret);
+
+ g_timeout_add_seconds(1, change_attribute_str, &handle);
+ mainloop::run();
+
+ ret = sensord_stop(handle);
+ ASSERT_TRUE(ret);
+
+ ret = sensord_disconnect(handle);
+ ASSERT_TRUE(ret);
+
+ return true;
+}
\ No newline at end of file