typedef struct {
int listener_id;
- sensor_cb_t cb;
+ void* cb;
+ bool is_events_cb;
sensor_accuracy_changed_cb_t acc_cb;
sensor_info *sensor;
- sensor_data_t *data;
+ char* data;
+ size_t data_size;
void *user_data;
} callback_info_s;
if (info->sensor)
event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
- if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end())
- info->cb(info->sensor, event_type, info->data, info->user_data);
+ 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);
+ }
+ }
delete [] info->data;
delete info;
AUTOLOCK(lock);
- if (info->acc_cb && info->sensor && listeners.find(info->listener_id) != listeners.end())
- info->acc_cb(info->sensor, info->data->timestamp, info->data->accuracy, info->user_data);
+ if (info->acc_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);
+ }
delete [] info->data;
delete info;
class sensor_event_handler : public ipc::channel_handler
{
public:
- sensor_event_handler(int id, sensor_t sensor, sensor_cb_t cb, void *user_data)
+ sensor_event_handler(int id, sensor_t sensor, void* cb, bool is_events_cb, void *user_data)
: 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)
{}
void connected(ipc::channel *ch) {}
void read(ipc::channel *ch, ipc::message &msg)
{
callback_info_s *info;
- sensor_data_t *data = (sensor_data_t *) new(std::nothrow) char[msg.size()];
+ auto size = msg.size();
+ char *data = new(std::nothrow) char[size];
- memcpy(data, msg.body(), msg.size());
+ memcpy(data, msg.body(), size);
info = new(std::nothrow) callback_info_s();
info->listener_id = m_listener_id;
info->cb = m_cb;
info->sensor = m_sensor;
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);
}
private:
int m_listener_id;
sensor_info *m_sensor;
- sensor_cb_t m_cb;
+ void* m_cb;
void *m_user_data;
+ bool m_is_events_cb;
};
class sensor_accuracy_handler : public ipc::channel_handler
void read(ipc::channel *ch, ipc::message &msg)
{
callback_info_s *info;
- sensor_data_t *data = (sensor_data_t *) new(std::nothrow) char[msg.size()];
+ char *data = new(std::nothrow) char[msg.size()];
memcpy(data, msg.body(), msg.size());
return true;
}
-API bool sensord_register_event(int handle, unsigned int event_type,
- unsigned int interval, unsigned int max_batch_latency, sensor_cb_t cb, void *user_data)
+static inline bool sensord_register_event_impl(int handle, unsigned int event_type,
+ unsigned int interval, unsigned int max_batch_latency, void* cb, bool is_events_callback, void *user_data)
{
sensor::sensor_listener *listener;
int prev_interval;
return false;
}
- handler = new(std::nothrow) sensor_event_handler(handle, listener->get_sensor(), cb, user_data);
+ handler = new(std::nothrow) sensor_event_handler(handle, listener->get_sensor(), cb, is_events_callback, user_data);
if (!handler) {
listener->set_max_batch_latency(prev_max_batch_latency);
listener->set_interval(prev_interval);
return true;
}
-API bool sensord_unregister_event(int handle, unsigned int event_type)
+API bool sensord_register_event(int handle, unsigned int event_type,
+ unsigned int interval, unsigned int max_batch_latency, sensor_cb_t cb, void *user_data)
+{
+ return sensord_register_event_impl(handle, event_type, interval, max_batch_latency, (void*)cb, false, user_data);
+}
+
+static inline bool sensord_unregister_event_imple(int handle)
{
sensor::sensor_listener *listener;
return true;
}
+API bool sensord_unregister_event(int handle, unsigned int event_type)
+{
+ return sensord_unregister_event_imple(handle);
+}
+
+API bool sensord_register_events(int handle, unsigned int event_type, unsigned int max_batch_latency, sensor_events_cb_t cb, void *user_data)
+{
+ return sensord_register_event_impl(handle, event_type, 0, max_batch_latency, (void*)cb, true, user_data);
+}
+
+API bool sensord_unregister_events(int handle, unsigned int event_type)
+{
+ return sensord_unregister_event_imple(handle);
+}
+
API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
{
sensor::sensor_listener *listener;
sensor_provider *p = static_cast<sensor_provider *>(provider);
/* TODO: synchronous call is enough? */
- return p->publish(&data, sizeof(data));
+ return p->publish(data);
}
+API int sensord_provider_publish_events(sensord_provider_h provider, sensor_data_t events[], int count)
+{
+ retvm_if(!provider, -EINVAL, "Invalid paramter");
+
+ sensor_provider *p = static_cast<sensor_provider *>(provider);
+
+ return p->publish(events, count);
+};
+
/* deperecated */
API sensor_t sensord_get_sensor(sensor_type_t type)
{
return true;
}
-static std::unordered_map<int, sensord_provider_h> external_providers;
-static int provider_id = 0;
-
-typedef struct external_cb_info_s {
- int id;
- sensor_external_command_cb_t cb;
- void *user_data;
-} external_cb_info_s;
-
-static void external_attr_cb(sensord_provider_h provider, int attribute, const char *data, int cnt, void *user_data)
-{
- external_cb_info_s *info = (external_cb_info_s *)user_data;
-
- if (info->cb)
- info->cb(info->id, data, cnt, info->user_data);
-}
-
/* deprecated */
API int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data)
{