4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JuHyun Kim <jh8212.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 #include <sys/types.h>
27 #include <sys/socket.h>
28 #include <netinet/in.h>
42 #include <cobject_type.h>
53 #include <sf_common.h>
63 #define EXTAPI __attribute__((visibility("default")))
66 #define MAX_BIND_SLOT 16
67 #define MAX_CB_SLOT_PER_BIND 16
68 #define MAX_CB_BIND_SLOT 64
69 #define MAX_EVENT_LIST 19
74 #define MAX_CHANNEL_NAME_LEN 50
75 #define BASE_GATHERING_INTERVAL 100
77 #define ACCEL_SENSOR_BASE_CHANNEL_NAME "accel_datastream"
78 #define GEOMAG_SENSOR_BASE_CHANNEL_NAME "geomag_datastream"
79 #define LIGHT_SENSOR_BASE_CHANNEL_NAME "lumin_datastream"
80 #define PROXI_SENSOR_BASE_CHANNEL_NAME "proxi_datastream"
81 #define MOTION_ENGINE_BASE_CHANNEL_NAME "motion_datastream"
82 #define GYRO_SENSOR_BASE_CHANNEL_NAME "gyro_datastream"
83 #define BAROMETER_SENSOR_BASE_CHANNEL_NAME "barometer_datastream"
84 #define FUSION_SENSOR_BASE_CHANNEL_NAME "fusion_datastream"
87 #define ROTATION_90 90
88 #define ROTATION_180 180
89 #define ROTATION_270 270
90 #define ROTATION_360 360
91 #define ROTATION_THD 45
93 #define RADIAN_VALUE (57.2957)
94 #define XY_POSITIVE_THD 2.0
95 #define XY_NEGATIVE_THD -2.0
97 #define ON_TIME_REQUEST_COUNTER 1
99 #define VCONF_SF_SERVER_POWER_OFF "memory/private/sensor/poweroff"
101 const char *STR_SF_CLIENT_IPC_SOCKET = "/tmp/sf_socket";
104 static int g_system_off_cb_ct = 0;
106 enum _sensor_current_state {
107 SENSOR_STATE_UNKNOWN = -1,
108 SENSOR_STATE_STOPPED = 0,
109 SENSOR_STATE_STARTED = 1,
110 SENSOR_STATE_PAUSED = 2
113 enum _sensor_wakeup_state {
114 SENSOR_WAKEUP_UNKNOWN = -1,
115 SENSOR_WAKEUP_UNSETTED = 0,
116 SENSOR_WAKEUP_SETTED = 1,
119 enum _sensor_poweroff_state {
120 SENSOR_POWEROFF_UNKNOWN = -1,
121 SENSOR_POWEROFF_AWAKEN = 1,
124 struct sf_bind_table_t {
126 sensor_type_t sensor_type;
127 int cb_event_max_num; /*limit by MAX_BIND_PER_CB_SLOT*/
128 int cb_slot_num[MAX_CB_SLOT_PER_BIND];
135 struct cb_bind_table_t {
136 char call_back_key[MAX_KEY_LEN];
138 void (*sensor_callback_func_t)(unsigned int, sensor_event_data_t *, void *);
139 unsigned int cb_event_type;
143 unsigned int request_count;
144 unsigned int request_data_id;
145 void *collected_data;
146 unsigned int current_collected_idx;
149 guint gsource_interval;
153 static struct rotation_event rotation_mode[] =
155 { ROTATION_UNKNOWN, { ROTATION_UNKNOWN, ROTATION_UNKNOWN }},
156 { ROTATION_EVENT_90, { ROTATION_LANDSCAPE_LEFT, ROTATION_PORTRAIT_BTM }},
157 { ROTATION_EVENT_0, { ROTATION_PORTRAIT_TOP, ROTATION_LANDSCAPE_LEFT }},
158 { ROTATION_EVENT_180, { ROTATION_PORTRAIT_BTM, ROTATION_LANDSCAPE_RIGHT }},
159 { ROTATION_EVENT_270, { ROTATION_LANDSCAPE_RIGHT, ROTATION_PORTRAIT_TOP }},
162 struct event_counter_t {
163 const unsigned int event_type;
164 unsigned int event_counter;
165 unsigned int cb_list[MAX_BIND_SLOT];
168 static event_counter_t g_event_list[MAX_EVENT_LIST] = {
169 { ACCELEROMETER_EVENT_ROTATION_CHECK, 0, {0, }},
170 { ACCELEROMETER_EVENT_CALIBRATION_NEEDED, 0, {0, }},
171 { ACCELEROMETER_EVENT_SET_HORIZON, 0, {0, }},
172 { ACCELEROMETER_EVENT_SET_WAKEUP, 0, {0, }},
173 { GEOMAGNETIC_EVENT_CALIBRATION_NEEDED, 0, {0, }},
174 { PROXIMITY_EVENT_CHANGE_STATE, 0, {0, }},
175 { LIGHT_EVENT_CHANGE_LEVEL, 0, {0, }},
176 { MOTION_ENGINE_EVENT_SNAP, 0, {0, }},
177 { MOTION_ENGINE_EVENT_SHAKE, 0, {0, }},
178 { MOTION_ENGINE_EVENT_DOUBLETAP, 0, {0, }},
179 { MOTION_ENGINE_EVENT_PANNING, 0, {0, }},
180 { MOTION_ENGINE_EVENT_TOP_TO_BOTTOM, 0, {0, }},
181 { MOTION_ENGINE_EVENT_DIRECT_CALL, 0, {0, }},
182 { MOTION_ENGINE_EVENT_TILT_TO_UNLOCK, 0, {0, }},
183 { MOTION_ENGINE_EVENT_LOCK_EXECUTE_CAMERA, 0, {0, }},
184 { MOTION_ENGINE_EVENT_SMART_ALERT , 0, {0, }},
185 { MOTION_ENGINE_EVENT_TILT , 0, {0, }},
186 { MOTION_ENGINE_EVENT_PANNING_BROWSE , 0, {0, }},
187 { MOTION_ENGINE_EVENT_NO_MOVE , 0, {0, }},
190 static sf_bind_table_t g_bind_table[MAX_BIND_SLOT];
192 static cb_bind_table_t g_cb_table[MAX_CB_BIND_SLOT];
194 static gboolean sensor_timeout_handler(gpointer data);
196 inline static void add_cb_number(int list_slot, unsigned int cb_number)
198 if(list_slot < 0 || list_slot > MAX_EVENT_LIST - 1)
202 const unsigned int EVENT_COUNTER = g_event_list[list_slot].event_counter;
204 for(i = 0 ; i < EVENT_COUNTER ; i++) {
205 if(g_event_list[list_slot].cb_list[i] == cb_number){
210 if(EVENT_COUNTER < MAX_BIND_SLOT) {
211 g_event_list[list_slot].event_counter++;
212 g_event_list[list_slot].cb_list[EVENT_COUNTER] = cb_number;
219 inline static void del_cb_number(int list_slot, unsigned int cb_number)
221 if(list_slot < 0 || list_slot > MAX_EVENT_LIST - 1)
224 unsigned int i = 0, j = 0;
225 const unsigned int EVENT_COUNTER = g_event_list[list_slot].event_counter;
227 for(i = 0 ; i < EVENT_COUNTER ; i++){
228 if(g_event_list[list_slot].cb_list[i] == cb_number){
229 for(j = i ; j < EVENT_COUNTER - 1; j++){
230 g_event_list[list_slot].cb_list[j] = g_event_list[list_slot].cb_list[j+1];
232 g_event_list[list_slot].cb_list[EVENT_COUNTER - 1] = 0;
233 g_event_list[list_slot].event_counter--;
238 DBG("cb number [%d] is not registered\n", cb_number);
242 inline static void del_cb_by_event_type(unsigned int event_type, unsigned int cb_number)
246 for(list_slot = 0 ; list_slot < MAX_EVENT_LIST ; list_slot++)
247 if(g_event_list[list_slot].event_type == event_type)
250 del_cb_number(list_slot, cb_number);
254 inline static int acquire_handle(void)
258 for (i = 0; i < MAX_BIND_SLOT; i ++) {
259 if (g_bind_table[i].ipc == NULL) break;
267 inline static int cb_acquire_handle(void)
271 for (i = 0; i < MAX_CB_BIND_SLOT; i ++) {
272 if (g_cb_table[i].sensor_callback_func_t == NULL) break;
280 inline static void release_handle(int i)
285 delete g_bind_table[i].ipc;
286 g_bind_table[i].ipc = NULL;
287 g_bind_table[i].sensor_type = UNKNOWN_SENSOR;
289 g_bind_table[i].my_handle = -1;
290 g_bind_table[i].sensor_state = SENSOR_STATE_UNKNOWN;
291 g_bind_table[i].wakeup_state = SENSOR_WAKEUP_UNKNOWN;
292 g_bind_table[i].sensor_option = SENSOR_OPTION_DEFAULT;
294 for (j=0; j<g_bind_table[i].cb_event_max_num; j++) {
295 if ( (j<MAX_CB_SLOT_PER_BIND) && (g_bind_table[i].cb_slot_num[j] > -1) ) {
296 del_cb_by_event_type(g_cb_table[g_bind_table[i].cb_slot_num[j]].cb_event_type, g_bind_table[i].cb_slot_num[j]);
297 g_cb_table[g_bind_table[i].cb_slot_num[j]].client_data= NULL;
298 g_cb_table[g_bind_table[i].cb_slot_num[j]].sensor_callback_func_t = NULL;
299 g_cb_table[g_bind_table[i].cb_slot_num[j]].cb_event_type = 0x00;
300 g_cb_table[g_bind_table[i].cb_slot_num[j]].my_cb_handle = -1;
301 g_bind_table[i].cb_slot_num[j] = -1;
305 g_bind_table[i].cb_event_max_num = 0;
311 inline static void cb_release_handle(int i)
314 g_cb_table[i].client_data= NULL;
315 g_cb_table[i].sensor_callback_func_t = NULL;
316 g_cb_table[i].cb_event_type = 0x00;
317 g_cb_table[i].my_cb_handle = -1;
318 g_cb_table[i].my_sf_handle = -1;
320 g_cb_table[i].request_count = 0;
321 g_cb_table[i].request_data_id = 0;
323 if ( g_cb_table[i].collected_data )
325 free (g_cb_table[i].collected_data);
326 g_cb_table[i].collected_data = NULL;
329 g_cb_table[i].collected_data = NULL;
330 g_cb_table[i].current_collected_idx = 0;
332 g_cb_table[i].source = NULL;
333 g_cb_table[i].gsource_interval = 0;
334 g_cb_table[i].gID = 0;
339 void power_off_cb(keynode_t *node, void *data)
342 int handle = -1, j = -1;
345 if(vconf_keynode_get_type(node) != VCONF_TYPE_INT)
347 ERR("Errer invailed keytype");
351 val = vconf_keynode_get_int(node);
355 case SENSOR_POWEROFF_AWAKEN:
356 for(handle = 0 ; handle < MAX_BIND_SLOT ; handle++)
358 if(g_bind_table[handle].ipc != NULL)
360 state = sf_stop(handle);
364 ERR("Cannot stop handle [%d]",handle);
369 DBG("LCD OFF and sensor handle [%d] stopped",handle);
372 for(j = 0 ; j < g_bind_table[handle].cb_event_max_num ; j++)
374 if((j<MAX_CB_SLOT_PER_BIND) && (g_bind_table[handle].cb_slot_num[j] > -1))
376 state = sf_unregister_event(handle ,g_cb_table[g_bind_table[handle].cb_slot_num[j]].cb_event_type);
379 ERR("cannot unregster_event for event [%x], handle [%d]",g_cb_table[g_bind_table[handle].cb_slot_num[j]].cb_event_type, handle);
383 sf_disconnect(handle);
395 void lcd_off_cb(keynode_t *node, void *data)
400 if(vconf_keynode_get_type(node) != VCONF_TYPE_INT)
402 ERR("Errer invailed keytype");
406 val = vconf_keynode_get_int(node);
410 case VCONFKEY_PM_STATE_LCDOFF: // LCD OFF
411 for(i = 0 ; i < MAX_BIND_SLOT ; i++)
413 if((g_bind_table[i].wakeup_state != SENSOR_WAKEUP_SETTED && g_bind_table[i].sensor_option != SENSOR_OPTION_ALWAYS_ON ) && g_bind_table[i].ipc != NULL)
415 if(g_bind_table[i].sensor_state == SENSOR_STATE_STARTED)
419 ERR("Cannot stop handle [%d]",i);
423 g_bind_table[i].sensor_state = SENSOR_STATE_PAUSED;
425 for(j = 0; j < g_bind_table[i].cb_event_max_num; j++)
427 if(g_cb_table[g_bind_table[i].cb_slot_num[j]].cb_event_type != 0)
428 DBG("LCD OFF stopped event_type [%x]",g_cb_table[g_bind_table[i].cb_slot_num[j]].cb_event_type);
429 if(g_cb_table[g_bind_table[i].cb_slot_num[j]].collected_data != NULL)
431 g_source_destroy(g_cb_table[g_bind_table[i].cb_slot_num[j]].source);
432 g_source_unref(g_cb_table[g_bind_table[i].cb_slot_num[j]].source);
433 g_cb_table[g_bind_table[i].cb_slot_num[j]].source = NULL;
439 DBG("LCD OFF and sensor handle [%d] stopped",i);
444 case VCONFKEY_PM_STATE_NORMAL: // LCD ON
445 for(i = 0 ; i < MAX_BIND_SLOT ; i++)
447 if(g_bind_table[i].sensor_state == SENSOR_STATE_PAUSED)
449 if(sf_start(i,g_bind_table[i].sensor_option) < 0)
451 ERR("Cannot start handle [%d]",i);
455 for(j = 0; j < g_bind_table[i].cb_event_max_num; j++)
457 if(g_cb_table[g_bind_table[i].cb_slot_num[j]].cb_event_type != 0)
458 DBG("LCD ON started event_type [%x]",g_cb_table[g_bind_table[i].cb_slot_num[j]].cb_event_type);
459 if(g_cb_table[g_bind_table[i].cb_slot_num[j]].collected_data != NULL)
461 g_cb_table[g_bind_table[i].cb_slot_num[j]].source = g_timeout_source_new(g_cb_table[g_bind_table[i].cb_slot_num[j]].gsource_interval);
462 g_source_set_callback(g_cb_table[g_bind_table[i].cb_slot_num[j]].source, sensor_timeout_handler, (gpointer)&g_cb_table[g_bind_table[i].cb_slot_num[j]].my_cb_handle,NULL);
463 g_cb_table[g_bind_table[i].cb_slot_num[j]].gID = g_source_attach(g_cb_table[g_bind_table[i].cb_slot_num[j]].source, NULL);
467 DBG("LCD ON and sensor handle [%d] started",i);
477 int system_off_set(void)
480 if(g_system_off_cb_ct == 0)
482 result = vconf_notify_key_changed(VCONFKEY_PM_STATE, lcd_off_cb, NULL);
485 ERR("cannot setting lcd_off_set_cb");
488 result = vconf_notify_key_changed(VCONF_SF_SERVER_POWER_OFF, power_off_cb, NULL);
491 ERR("cannot setting power_off_set_cb");
494 g_system_off_cb_ct++;
496 else if (g_system_off_cb_ct > 0)
498 g_system_off_cb_ct++;
502 ERR("g_system_off_cb_ct is negative");
506 DBG("system_off_set success");
510 int system_off_unset(void)
513 if(g_system_off_cb_ct == 1)
515 result = vconf_ignore_key_changed(VCONFKEY_PM_STATE, lcd_off_cb);
518 ERR("cannot setting lcd_off_set_cb");
521 result = vconf_ignore_key_changed(VCONF_SF_SERVER_POWER_OFF, power_off_cb);
524 ERR("cannot setting power_off_set_cb");
527 g_system_off_cb_ct = 0;
529 else if (g_system_off_cb_ct > 1)
531 g_system_off_cb_ct--;
535 ERR("g_system_off_cb_ct is negative");
538 DBG("system_off_unset success");
544 void lcd_off_set_wake_up(keynode_t *node, void *data)
548 state = sf_set_property(ACCELEROMETER_SENSOR, ACCELEROMETER_PROPERTY_SET_WAKEUP, WAKEUP_SET);
552 ERR("ACCELEROMETER_PROPERTY_SET_WAKEUP fail");
557 static void sensor_changed_cb(keynode_t *node, void *data)
559 signed long event_number = (signed long)(data);
563 sensor_event_data_t cb_data;
564 sensor_panning_data_t panning_data;
572 if (vconf_keynode_get_type(node) != VCONF_TYPE_INT )
574 ERR("Err invaild key_type , incomming key_type : %d , key_name : %s , key_value : %d", vconf_keynode_get_type(node), vconf_keynode_get_name(node),vconf_keynode_get_int(node));
578 val = vconf_keynode_get_int(node);
580 for( i = 0 ; i < g_event_list[event_number].event_counter ; i++)
582 cb_number = g_event_list[event_number].cb_list[i];
584 if(g_bind_table[g_cb_table[cb_number].my_sf_handle].sensor_state == SENSOR_STATE_STARTED)
586 if (g_cb_table[cb_number].sensor_callback_func_t)
588 if(g_cb_table[cb_number].cb_event_type == MOTION_ENGINE_EVENT_PANNING || g_cb_table[cb_number].cb_event_type == MOTION_ENGINE_EVENT_TILT || g_cb_table[cb_number].cb_event_type == MOTION_ENGINE_EVENT_PANNING_BROWSE)
592 panning_data.x = (short)(val >> 16);
593 panning_data.y = (short)(val & 0x0000FFFF);
594 cb_data.event_data_size = sizeof(sensor_panning_data_t);
595 cb_data.event_data = (void *)&panning_data;
596 g_cb_table[cb_number].sensor_callback_func_t(g_cb_table[cb_number].cb_event_type,&cb_data, g_cb_table[cb_number].client_data);
603 ERR("vconf_keynode_get_int fail for key : %s , handle_num : %d ,get_value : %d\n",g_cb_table[cb_number].call_back_key,cb_number , val);
607 switch (g_cb_table[cb_number].cb_event_type) {
608 case ACCELEROMETER_EVENT_SET_WAKEUP :
610 case ACCELEROMETER_EVENT_ROTATION_CHECK :
612 case ACCELEROMETER_EVENT_SET_HORIZON :
614 case GEOMAGNETIC_EVENT_CALIBRATION_NEEDED :
616 case LIGHT_EVENT_CHANGE_LEVEL :
618 case PROXIMITY_EVENT_CHANGE_STATE:
620 case MOTION_ENGINE_EVENT_SNAP:
622 case MOTION_ENGINE_EVENT_SHAKE:
624 case MOTION_ENGINE_EVENT_DOUBLETAP:
626 case MOTION_ENGINE_EVENT_TOP_TO_BOTTOM:
628 case MOTION_ENGINE_EVENT_DIRECT_CALL:
630 case MOTION_ENGINE_EVENT_TILT_TO_UNLOCK:
632 case MOTION_ENGINE_EVENT_LOCK_EXECUTE_CAMERA:
634 case MOTION_ENGINE_EVENT_SMART_ALERT:
636 case MOTION_ENGINE_EVENT_NO_MOVE:
637 cb_data.event_data_size = sizeof(val);
638 cb_data.event_data = (void *)&val;
639 g_cb_table[cb_number].sensor_callback_func_t(g_cb_table[cb_number].cb_event_type, &cb_data , g_cb_table[cb_number].client_data);
642 ERR("Undefined cb_event_type");
650 ERR("Empty Callback func in event : %x\n",g_cb_table[cb_number].cb_event_type);
655 ERR("Sensor doesn't start for event : %x",g_cb_table[cb_number].cb_event_type);
661 static gboolean sensor_timeout_handler(gpointer data)
663 int *cb_handle = (int*)(data);
665 sensor_event_data_t cb_data;
667 if ( g_bind_table[g_cb_table[*cb_handle].my_sf_handle].sensor_state != SENSOR_STATE_STARTED ) {
671 if (g_cb_table[*cb_handle].sensor_callback_func_t) {
673 if ( ((g_cb_table[*cb_handle].request_data_id & 0xFFFF) > 0) && ((g_cb_table[*cb_handle].request_data_id & 0xFFFF) < 10) ) {
674 sensor_data_t *base_data_values;
675 base_data_values =(sensor_data_t *)g_cb_table[*cb_handle].collected_data;
677 if ( !base_data_values ) {
678 ERR("ERR get saved_gather_data stuct fail in sensor_timeout_handler \n");
681 state = sf_get_data(g_cb_table[*cb_handle].my_sf_handle, g_cb_table[*cb_handle].request_data_id, base_data_values);
684 ERR("ERR sensor_get_struct_data fail in sensor_timeout_handler : %d\n",state);
688 cb_data.event_data_size = sizeof (sensor_data_t);
689 cb_data.event_data = g_cb_table[*cb_handle].collected_data;
691 g_cb_table[*cb_handle].sensor_callback_func_t( g_cb_table[*cb_handle].cb_event_type , &cb_data , g_cb_table[*cb_handle].client_data);
695 ERR("Does not support data_type");
701 ERR("Empty Callback func in cb_handle : %d\n", *cb_handle);
707 ///////////////////////////////////for internal ///////////////////////////////////
708 static int server_get_properties(int handle , unsigned int data_id, void *property_data)
713 packet = new cpacket(sizeof(cmd_return_property_t) + sizeof(base_property_struct)+ 4);
714 } catch (int ErrNo) {
715 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
719 cmd_get_property_t *cmd_payload;
721 INFO("server_get_properties called with handle : %d \n", handle);
723 ERR("Invalid handle\n");
729 cmd_payload = (cmd_get_property_t*)packet->data();
731 ERR("cannot find memory for send packet->data");
737 packet->set_version(PROTOCOL_VERSION);
738 packet->set_cmd(CMD_GET_PROPERTY);
739 packet->set_payload_size(sizeof(cmd_get_property_t));
742 cmd_payload->get_level = data_id;
744 cmd_payload->get_level = ((unsigned int)g_bind_table[handle].sensor_type<<16) | 0x0001;
748 INFO("Send CMD_GET_PROPERTY command\n");
749 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
750 ERR("Faield to send a packet\n");
751 release_handle(handle);
757 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
758 ERR("Faield to receive a packet\n");
759 release_handle(handle);
765 if (packet->payload_size()) {
766 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
767 ERR("Faield to receive a packet\n");
768 release_handle(handle);
774 if (packet->cmd() == CMD_GET_PROPERTY) {
775 cmd_return_property_t *return_payload;
776 return_payload = (cmd_return_property_t*)packet->data();
777 if (return_payload->state < 0) {
778 ERR("sever get property fail , return state : %d\n",return_payload->state);
783 base_property_struct *base_return_property;
784 base_return_property = (base_property_struct *)return_payload->property_struct;
788 sensor_data_properties_t *return_properties;
789 return_properties = (sensor_data_properties_t *)property_data;
790 return_properties->sensor_unit_idx = base_return_property->sensor_unit_idx ;
791 return_properties->sensor_min_range= base_return_property->sensor_min_range;
792 return_properties->sensor_max_range= base_return_property->sensor_max_range;
793 return_properties->sensor_resolution = base_return_property->sensor_resolution;
797 sensor_properties_t *return_properties;
798 return_properties = (sensor_properties_t *)property_data;
799 return_properties->sensor_unit_idx = base_return_property->sensor_unit_idx ;
800 return_properties->sensor_min_range= base_return_property->sensor_min_range;
801 return_properties->sensor_max_range= base_return_property->sensor_max_range;
802 return_properties->sensor_resolution = base_return_property->sensor_resolution;
803 memset(return_properties->sensor_name, '\0', sizeof(return_properties->sensor_name));
804 memset(return_properties->sensor_vendor, '\0', sizeof(return_properties->sensor_vendor));
805 strncpy(return_properties->sensor_name, base_return_property->sensor_name, strlen(base_return_property->sensor_name));
806 strncpy(return_properties->sensor_vendor, base_return_property->sensor_vendor, strlen(base_return_property->sensor_vendor));
810 ERR("unexpected server cmd\n");
822 static int server_set_property(int handle , unsigned int property_id, long value )
826 packet = new cpacket(sizeof(cmd_set_value_t) + 4);
827 } catch (int ErrNo) {
828 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
831 cmd_set_value_t *cmd_payload;
832 INFO("server_set_property called with handle : %d \n", handle);
834 ERR("Invalid handle\n");
840 cmd_payload = (cmd_set_value_t*)packet->data();
842 ERR("cannot find memory for send packet->data");
848 packet->set_version(PROTOCOL_VERSION);
849 packet->set_cmd(CMD_SET_VALUE);
850 packet->set_payload_size(sizeof(cmd_set_value_t));
852 cmd_payload->sensor_type = g_bind_table[handle].sensor_type;
853 cmd_payload->property = property_id;
854 cmd_payload->value = value;
857 INFO("Send CMD_SET_VALUE command\n");
858 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
859 ERR("Faield to send a packet\n");
860 release_handle(handle);
866 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
867 ERR("Faield to receive a packet\n");
868 release_handle(handle);
874 if (packet->payload_size()) {
875 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
876 ERR("Faield to receive a packet\n");
877 release_handle(handle);
883 if (packet->cmd() == CMD_DONE) {
885 payload = (cmd_done_t*)packet->data();
887 if (payload->value == -1) {
888 ERR("cannot support input property\n");
894 ERR("unexpected server cmd\n");
905 ///////////////////////////////////for external ///////////////////////////////////
907 EXTAPI int sf_is_sensor_event_available ( sensor_type_t desired_sensor_type , unsigned int desired_event_type )
912 packet = new cpacket(sizeof(cmd_reg_t)+4);
913 } catch (int ErrNo) {
914 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
919 handle = sf_connect(desired_sensor_type);
926 if ( desired_event_type != 0 ) {
928 payload = (cmd_reg_t*)packet->data();
930 ERR("cannot find memory for send packet->data");
936 packet->set_version(PROTOCOL_VERSION);
937 packet->set_cmd(CMD_REG);
938 packet->set_payload_size(sizeof(cmd_reg_t));
939 payload->type = REG_CHK;
940 payload->event_type = desired_event_type;
942 INFO("Send CMD_REG command\n");
943 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
944 ERR("Faield to send a packet\n");
945 release_handle(handle);
951 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
952 ERR("Faield to receive a packet\n");
953 release_handle(handle);
959 if (packet->payload_size()) {
960 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
961 ERR("Faield to receive a packet\n");
962 release_handle(handle);
968 if (packet->cmd() == CMD_DONE) {
970 payload = (cmd_done_t*)packet->data();
971 if (payload->value == -1) {
972 ERR("sever check fail\n");
978 ERR("unexpected server cmd\n");
987 sf_disconnect(handle);
993 EXTAPI int sf_get_data_properties(unsigned int data_id, sensor_data_properties_t *return_data_properties)
998 retvm_if( (!return_data_properties ) , -1 , "Invalid return properties pointer : %p", return_data_properties);
1001 handle = sf_connect((sensor_type_t)(data_id >> 16));
1003 ERR("Sensor connet fail !! for : %x \n", (data_id >> 16));
1006 state = server_get_properties( handle , data_id, return_data_properties );
1008 ERR("server_get_properties fail , state : %d \n",state);
1010 sf_disconnect(handle);
1016 EXTAPI int sf_get_properties(sensor_type_t sensor_type, sensor_properties_t *return_properties)
1021 retvm_if( (!return_properties ) , -1 , "Invalid return properties pointer : %p", return_properties);
1023 handle = sf_connect(sensor_type);
1025 ERR("Sensor connet fail !! for : %x \n", sensor_type);
1028 state = server_get_properties( handle , 0, return_properties );
1030 ERR("server_get_properties fail , state : %d \n",state);
1032 sf_disconnect(handle);
1039 EXTAPI int sf_set_property(sensor_type_t sensor_type, unsigned int property_id, long value)
1044 handle = sf_connect(sensor_type);
1046 ERR("Sensor connet fail !! for : %x \n", sensor_type);
1049 state = server_set_property( handle , property_id, value );
1051 ERR("server_set_property fail , state : %d \n",state);
1053 sf_disconnect(handle);
1060 EXTAPI int sf_connect(sensor_type_t sensor_type)
1065 packet = new cpacket(sizeof(cmd_hello_t)+MAX_CHANNEL_NAME_LEN+4);
1066 } catch (int ErrNo) {
1067 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1070 cmd_hello_t *payload;
1071 cmd_done_t *return_payload;
1074 size_t channel_name_length;
1076 const char *sf_channel_name = NULL;
1080 INFO("Sensor_attach_channel from pid : %d , to sensor_type : %x",cpid ,sensor_type);
1082 i = acquire_handle();
1083 if (i == MAX_BIND_SLOT) {
1084 ERR("MAX_BIND_SLOT, Too many slot required");
1090 INFO("Empty slot : %d\n", i);
1092 switch (sensor_type) {
1093 case ACCELEROMETER_SENSOR :
1094 sf_channel_name = (char *)ACCEL_SENSOR_BASE_CHANNEL_NAME;
1095 g_bind_table[i].cb_event_max_num = 8;
1098 case GEOMAGNETIC_SENSOR :
1099 sf_channel_name = (char *)GEOMAG_SENSOR_BASE_CHANNEL_NAME;
1100 g_bind_table[i].cb_event_max_num = 3;
1104 sf_channel_name = (char *)LIGHT_SENSOR_BASE_CHANNEL_NAME;
1105 g_bind_table[i].cb_event_max_num = 3;
1108 case PROXIMITY_SENSOR:
1109 sf_channel_name = (char *)PROXI_SENSOR_BASE_CHANNEL_NAME;
1110 g_bind_table[i].cb_event_max_num = 3;
1114 sf_channel_name = (char *)MOTION_ENGINE_BASE_CHANNEL_NAME;
1115 g_bind_table[i].cb_event_max_num = 12;
1118 case GYROSCOPE_SENSOR:
1119 sf_channel_name = (char *)GYRO_SENSOR_BASE_CHANNEL_NAME;
1120 g_bind_table[i].cb_event_max_num = 1;
1123 case THERMOMETER_SENSOR:
1125 case BAROMETER_SENSOR:
1126 sf_channel_name = (char *)BAROMETER_SENSOR_BASE_CHANNEL_NAME;
1127 g_bind_table[i].cb_event_max_num = 3;
1130 sf_channel_name = (char *)FUSION_SENSOR_BASE_CHANNEL_NAME;
1131 g_bind_table[i].cb_event_max_num = 3;
1134 case UNKNOWN_SENSOR:
1136 ERR("Undefined sensor_type");
1144 g_bind_table[i].sensor_type = sensor_type ;
1145 g_bind_table[i].my_handle = i;
1146 g_bind_table[i].sensor_state = SENSOR_STATE_STOPPED;
1147 g_bind_table[i].wakeup_state = SENSOR_WAKEUP_UNSETTED;
1148 g_bind_table[i].sensor_option = SENSOR_OPTION_DEFAULT;
1150 for(j = 0 ; j < g_bind_table[i].cb_event_max_num ; j++)
1151 g_bind_table[i].cb_slot_num[j] = -1;
1154 g_bind_table[i].ipc = new csock( (char *)STR_SF_CLIENT_IPC_SOCKET, csock::SOCK_TCP|csock::SOCK_IPC|csock::SOCK_WORKER, 0, 0);
1162 if (g_bind_table[i].ipc && g_bind_table[i].ipc->connect_to_server() == false) {
1163 delete g_bind_table[i].ipc;
1164 g_bind_table[i].ipc = NULL;
1172 INFO("Connected to server\n");
1173 payload = (cmd_hello_t*)packet->data();
1175 ERR("cannot find memory for send packet->data");
1182 if (!sf_channel_name ) {
1183 ERR("cannot find matched-sensor name!!!");
1189 channel_name_length = strlen(sf_channel_name);
1190 if ( channel_name_length > MAX_CHANNEL_NAME_LEN ) {
1191 ERR("error, channel_name_length too long !!!");
1199 packet->set_version(PROTOCOL_VERSION);
1200 packet->set_cmd(CMD_HELLO);
1201 packet->set_payload_size(sizeof(cmd_hello_t) + channel_name_length);
1202 strcpy(payload->name, sf_channel_name);
1204 if (g_bind_table[i].ipc && g_bind_table[i].ipc->send(packet->packet(), packet->size()) == false) {
1205 ERR("Failed to send a hello packet\n");
1212 INFO("Wait for recv a reply packet\n");
1213 if (g_bind_table[i].ipc && g_bind_table[i].ipc->recv(packet->packet(), packet->header_size()) == false) {
1220 if (packet->payload_size()) {
1221 if (g_bind_table[i].ipc && g_bind_table[i].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
1229 return_payload = (cmd_done_t*)packet->data();
1230 if (!return_payload) {
1231 ERR("cannot find memory for return packet->data");
1237 if ( return_payload->value < 0) {
1238 ERR("There is no sensor \n");
1246 INFO("Connected sensor type : %x , handle : %d \n", sensor_type , i);
1251 EXTAPI int sf_disconnect(int handle)
1254 cmd_byebye_t *payload;
1256 retvm_if( handle > MAX_BIND_SLOT - 1 , -1 , "Incorrect handle");
1257 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sensor_detach_channel fail , invalid handle value : %d",handle);
1260 packet = new cpacket(sizeof(cmd_byebye_t)+4);
1261 } catch (int ErrNo) {
1262 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1266 INFO("Detach, so remove %d from the table\n", handle);
1268 payload = (cmd_byebye_t*)packet->data();
1270 ERR("cannot find memory for send packet->data");
1276 packet->set_version(PROTOCOL_VERSION);
1277 packet->set_cmd(CMD_BYEBYE);
1278 packet->set_payload_size(sizeof(cmd_byebye_t));
1280 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
1281 ERR("Failed to send, but delete handle\n");
1286 INFO("Recv a reply packet\n");
1287 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
1288 ERR("Send to reply packet fail\n");
1293 if (packet->payload_size()) {
1294 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
1295 ERR("Failed to recv packet\n");
1301 release_handle(handle);
1308 EXTAPI int sf_start(int handle , int option)
1311 cmd_start_t *payload;
1315 retvm_if( handle > MAX_BIND_SLOT - 1, -1 , "Incorrect handle");
1316 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sensor_start fail , invalid handle value : %d",handle);
1317 retvm_if( option < 0 , -1 , "sensor_start fail , invalid option value : %d",option);
1318 retvm_if( g_bind_table[handle].sensor_state == SENSOR_STATE_STARTED , 0 , "sensor already started");
1321 packet = new cpacket(sizeof(cmd_start_t)+4);
1322 } catch (int ErrNo) {
1323 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1327 if(option != SENSOR_OPTION_ALWAYS_ON)
1329 if(vconf_get_int(VCONFKEY_PM_STATE, &lcd_state) == 0)
1331 if(lcd_state == VCONFKEY_PM_STATE_LCDOFF)
1333 g_bind_table[handle].sensor_state = SENSOR_STATE_PAUSED;
1334 DBG("SENSOR_STATE_PAUSED(LCD OFF)");
1341 DBG("vconf_get_int Error lcd_state = [%d]",lcd_state);
1346 DBG("sensor start (SENSOR_OPTION_ALWAYS_ON)");
1349 INFO("Sensor S/F Started\n");
1351 payload = (cmd_start_t*)packet->data();
1353 ERR("cannot find memory for send packet->data");
1359 packet->set_version(PROTOCOL_VERSION);
1360 packet->set_cmd(CMD_START);
1361 packet->set_payload_size(sizeof(cmd_start_t));
1362 payload->option = option;
1364 INFO("Send CMD_START command\n");
1365 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
1366 ERR("Faield to send a packet\n");
1367 release_handle(handle);
1373 INFO("Recv a reply packet\n");
1375 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
1376 ERR("Send to reply packet fail\n");
1382 DBG("packet received\n");
1383 if (packet->payload_size()) {
1384 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
1390 if (packet->cmd() == CMD_DONE) {
1391 cmd_done_t *payload;
1392 payload = (cmd_done_t*)packet->data();
1393 if (payload->value < 0) {
1394 ERR("Error from sensor server [-1 or -2 : socket error, -3 : stopped by sensor plugin] value = [%d]\n", payload->value);
1397 return payload->value;
1400 ERR("unexpected server cmd\n");
1407 g_bind_table[handle].sensor_state = SENSOR_STATE_STARTED;
1408 g_bind_table[handle].sensor_option = option;
1415 EXTAPI int sf_stop(int handle)
1418 cmd_stop_t *payload;
1420 retvm_if( handle > MAX_BIND_SLOT - 1, -1 , "Incorrect handle");
1421 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sensor_stop fail , invalid handle value : %d",handle);
1422 retvm_if( (g_bind_table[handle].sensor_state == SENSOR_STATE_STOPPED) || (g_bind_table[handle].sensor_state == SENSOR_STATE_PAUSED) , 0 , "sensor already stopped");
1425 packet = new cpacket(sizeof(cmd_stop_t)+4);
1426 } catch (int ErrNo) {
1427 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1431 INFO("Sensor S/F Stopped handle = [%d]\n", handle);
1433 payload = (cmd_stop_t*)packet->data();
1435 ERR("cannot find memory for send packet->data");
1441 packet->set_version(PROTOCOL_VERSION);
1442 packet->set_cmd(CMD_STOP);
1443 packet->set_payload_size(sizeof(cmd_stop_t));
1445 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
1446 ERR("Failed to send a packet\n");
1447 release_handle(handle);
1453 g_bind_table[handle].sensor_state = SENSOR_STATE_STOPPED;
1460 EXTAPI int sf_register_event(int handle , unsigned int event_type , event_condition_t *event_condition , sensor_callback_func_t cb , void *cb_data )
1465 int avail_cb_slot_idx = -1;
1467 int collect_data_flag = 0;
1469 retvm_if( handle > MAX_BIND_SLOT - 1 , -1 , "Incorrect handle");
1470 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sensor_register_cb fail , invalid handle value : %d",handle);
1473 packet = new cpacket(sizeof(cmd_reg_t)+4);
1474 } catch (int ErrNo) {
1475 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1479 payload = (cmd_reg_t*)packet->data();
1481 ERR("cannot find memory for send packet->data");
1487 DBG("Current handle's(%d) cb_event_max_num : %d\n", handle , g_bind_table[handle].cb_event_max_num);
1489 for ( i=0 ; i<g_bind_table[handle].cb_event_max_num ; i++ ) {
1490 if ( ((event_type&0xFFFF)>>i) == 0x0001) {
1491 if ( (g_bind_table[handle].cb_slot_num[i] == -1) ||(!(g_cb_table[ g_bind_table[handle].cb_slot_num[i] ].sensor_callback_func_t)) ) {
1492 DBG("Find available slot in g_bind_table for cb\n");
1493 avail_cb_slot_idx = i;
1499 if (avail_cb_slot_idx < 0 ) {
1500 ERR("Find cb_slot fail, There is already callback function!!\n");
1506 i = cb_acquire_handle();
1507 if (i == MAX_CB_BIND_SLOT) {
1508 ERR("MAX_BIND_SLOT, Too many slot required");
1513 INFO("Empty cb_slot : %d\n", i);
1515 g_cb_table[i].my_cb_handle = i;
1516 g_cb_table[i].my_sf_handle = handle;
1518 INFO("Sensor S/F register cb\n");
1520 packet->set_version(PROTOCOL_VERSION);
1521 packet->set_cmd(CMD_REG);
1522 packet->set_payload_size(sizeof(cmd_reg_t));
1523 payload->type = REG_ADD;
1524 payload->event_type = event_type;
1526 if(!event_condition)
1527 payload->interval = BASE_GATHERING_INTERVAL;
1528 else if((event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0 ))
1529 payload->interval = event_condition->cond_value1;
1531 payload->interval = BASE_GATHERING_INTERVAL;
1534 INFO("Send CMD_REG command with reg_type : %x , event_typ : %x\n",payload->type , payload->event_type );
1535 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
1536 ERR("Faield to send a packet\n");
1537 cb_release_handle(i);
1538 release_handle(handle);
1544 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
1545 ERR("Faield to receive a packet\n");
1546 cb_release_handle(i);
1547 release_handle(handle);
1553 if (packet->payload_size()) {
1554 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
1555 ERR("Faield to receive a packet\n");
1556 cb_release_handle(i);
1557 release_handle(handle);
1563 if (packet->cmd() == CMD_DONE) {
1564 cmd_done_t *payload;
1565 payload = (cmd_done_t*)packet->data();
1566 if (payload->value == -1) {
1567 ERR("server register fail\n");
1568 cb_release_handle(i);
1574 ERR("unexpected server cmd\n");
1575 cb_release_handle(i);
1582 memset(g_cb_table[i].call_back_key,'\0',MAX_KEY_LEN);
1583 snprintf(g_cb_table[i].call_back_key,(MAX_KEY_LEN-1),"%s%x",DEFAULT_SENSOR_KEY_PREFIX, event_type);
1585 g_cb_table[i].cb_event_type = event_type;
1586 g_cb_table[i].client_data = cb_data;
1587 g_cb_table[i].sensor_callback_func_t = cb;
1589 switch (event_type ) {
1590 case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
1592 case GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME:
1594 case PROXIMITY_EVENT_STATE_REPORT_ON_TIME:
1596 case GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME:
1598 case BAROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
1600 case LIGHT_EVENT_LEVEL_DATA_REPORT_ON_TIME:
1602 case FUSION_SENSOR_EVENT_RAW_DATA_REPORT_ON_TIME:
1603 collect_data_flag = 1;
1604 g_cb_table[i].request_data_id = (event_type & (0xFFFF<<16)) |0x0001;
1606 case LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME:
1608 case GEOMAGNETIC_EVENT_ATTITUDE_DATA_REPORT_ON_TIME:
1610 case ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME:
1612 case BAROMETER_EVENT_TEMPERATURE_DATA_REPORT_ON_TIME:
1614 case PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME:
1616 case FUSION_ROTATION_VECTOR_EVENT_DATA_REPORT_ON_TIME:
1617 collect_data_flag = 1;
1618 g_cb_table[i].request_data_id = (event_type & (0xFFFF<<16)) |0x0002;
1620 case ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME:
1622 case FUSION_ROTATION_MATRIX_EVENT_DATA_REPORT_ON_TIME:
1624 case BAROMETER_EVENT_ALTITUDE_DATA_REPORT_ON_TIME:
1625 collect_data_flag = 1;
1626 g_cb_table[i].request_data_id = (event_type & (0xFFFF<<16)) |0x0004;
1628 case ACCELEROMETER_EVENT_GRAVITY_DATA_REPORT_ON_TIME:
1629 collect_data_flag = 1;
1630 g_cb_table[i].request_data_id = (event_type & (0xFFFF<<16)) |0x0008;
1633 collect_data_flag = 0;
1636 INFO("key : %s(p:%p), cb_handle value : %d\n", g_cb_table[i].call_back_key ,g_cb_table[i].call_back_key, i );
1638 if ( collect_data_flag ) {
1639 sensor_data_t *collected_data_set;
1641 collected_data_set = new sensor_data_t [ON_TIME_REQUEST_COUNTER];
1642 if ( !collected_data_set ) {
1643 ERR("memory allocation fail for gathering datas\n");
1644 cb_release_handle(i);
1649 g_cb_table[i].collected_data = (void *)collected_data_set;
1650 g_cb_table[i].current_collected_idx = 0;
1652 if (!event_condition) {
1653 g_cb_table[i].gsource_interval = BASE_GATHERING_INTERVAL;
1655 if ( (event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0 ) ) {
1656 g_cb_table[i].gsource_interval = (guint)event_condition->cond_value1;
1658 ERR("Invaild input_condition interval , input_interval : %f\n", event_condition->cond_value1);
1659 cb_release_handle(i);
1667 if ( g_cb_table[i].gsource_interval != 0 ) {
1668 g_cb_table[i].source = g_timeout_source_new(g_cb_table[i].gsource_interval);
1670 ERR("Error , gsource_interval value : %u",g_cb_table[i].gsource_interval);
1671 cb_release_handle(i);
1676 g_source_set_callback (g_cb_table[i].source, sensor_timeout_handler, (gpointer)&g_cb_table[i].my_cb_handle,NULL);
1677 g_cb_table[i].gID = g_source_attach (g_cb_table[i].source, NULL);
1680 g_cb_table[i].request_count = 0;
1681 g_cb_table[i].request_data_id = 0;
1682 g_cb_table[i].collected_data = NULL;
1683 g_cb_table[i].gsource_interval = BASE_GATHERING_INTERVAL;
1685 for(j = 0 ; j < MAX_EVENT_LIST ; j++){
1686 if(g_event_list[j].event_type == event_type) {
1687 if(g_event_list[j].event_counter < 1){
1688 if(vconf_notify_key_changed(g_cb_table[i].call_back_key,sensor_changed_cb,(void*)(j)) == 0 ) {
1689 DBG("vconf_add_chaged_cb success for key : %s , my_cb_handle value : %d\n", g_cb_table[i].call_back_key, g_cb_table[i].my_cb_handle);
1691 DBG("vconf_add_chaged_cb fail for key : %s , my_cb_handle value : %d\n", g_cb_table[i].call_back_key, g_cb_table[i].my_cb_handle);
1692 cb_release_handle(i);
1698 DBG("vconf_add_changed_cb is already registered for key : %s, my_cb_handle value : %d\n", g_cb_table[i].call_back_key, g_cb_table[i].my_cb_handle);
1700 add_cb_number(j, i);
1706 g_bind_table[handle].cb_slot_num[avail_cb_slot_idx] = i;
1713 EXTAPI int sf_unregister_event(int handle, unsigned int event_type)
1718 int find_cb_handle =-1;
1721 int collect_data_flag = 0;
1723 retvm_if( handle > MAX_BIND_SLOT - 1, -1 , "Incorrect handle");
1724 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sensor_unregister_cb fail , invalid handle value : %d",handle);
1727 packet = new cpacket(sizeof(cmd_reg_t)+4);
1728 } catch (int ErrNo) {
1729 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1733 payload = (cmd_reg_t*)packet->data();
1735 ERR("cannot find memory for send packet->data");
1741 for ( i=0 ; i<g_bind_table[handle].cb_event_max_num ; i++ ) {
1742 if ( g_bind_table[handle].cb_slot_num[i] != -1 ) {
1744 if ( event_type == g_cb_table[ g_bind_table[handle].cb_slot_num[i] ].cb_event_type) {
1745 find_cb_handle = g_bind_table[handle].cb_slot_num[i];
1751 if (find_cb_handle < 0) {
1752 ERR("Err , Cannot find cb_slot_num!! for event : %x\n", event_type );
1759 INFO("Sensor S/F unregister cb\n");
1761 packet->set_version(PROTOCOL_VERSION);
1762 packet->set_cmd(CMD_REG);
1763 packet->set_payload_size(sizeof(cmd_reg_t));
1764 payload->type = REG_DEL;
1765 payload->event_type = event_type;
1766 payload->interval = g_cb_table[find_cb_handle].gsource_interval;
1768 switch (event_type ) {
1769 case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
1771 case ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME:
1773 case ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME :
1775 case GEOMAGNETIC_EVENT_ATTITUDE_DATA_REPORT_ON_TIME:
1777 case PROXIMITY_EVENT_STATE_REPORT_ON_TIME:
1779 case GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME:
1781 case BAROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
1783 case BAROMETER_EVENT_TEMPERATURE_DATA_REPORT_ON_TIME:
1785 case BAROMETER_EVENT_ALTITUDE_DATA_REPORT_ON_TIME:
1787 case LIGHT_EVENT_LEVEL_DATA_REPORT_ON_TIME:
1789 case GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME:
1791 case LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME:
1793 case PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME:
1795 case FUSION_SENSOR_EVENT_RAW_DATA_REPORT_ON_TIME:
1797 case FUSION_ROTATION_VECTOR_EVENT_DATA_REPORT_ON_TIME:
1799 case FUSION_ROTATION_MATRIX_EVENT_DATA_REPORT_ON_TIME:
1801 case ACCELEROMETER_EVENT_GRAVITY_DATA_REPORT_ON_TIME:
1802 collect_data_flag = 1;
1806 INFO("Send CMD_REG command\n");
1807 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
1808 ERR("Faield to send a packet\n");
1809 release_handle(handle);
1815 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
1816 ERR("Failed to recv packet_header\n");
1817 release_handle(handle);
1823 if (packet->payload_size()) {
1824 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
1825 ERR("Failed to recv packet\n");
1826 release_handle(handle);
1833 if ( collect_data_flag ) {
1834 if(g_cb_table[find_cb_handle].source)
1836 g_source_destroy(g_cb_table[find_cb_handle].source);
1837 g_source_unref(g_cb_table[find_cb_handle].source);
1839 g_cb_table[find_cb_handle].request_count = 0;
1840 g_cb_table[find_cb_handle].request_data_id = 0;
1841 g_cb_table[find_cb_handle].gsource_interval = 0;
1843 for(j = 0 ; j < MAX_EVENT_LIST ; j++){
1844 if(g_event_list[j].event_type == event_type){
1845 if(g_event_list[j].event_counter <= 1){
1846 state = vconf_ignore_key_changed(g_cb_table[find_cb_handle].call_back_key, sensor_changed_cb);
1848 ERR("Failed to del callback using by vconf_del_changed_cb for key : %s\n",g_cb_table[find_cb_handle].call_back_key);
1853 DBG("del callback using by vconf success [%s] handle = [%d]",g_cb_table[find_cb_handle].call_back_key, find_cb_handle);
1858 del_cb_number(j,find_cb_handle);
1863 cb_release_handle(find_cb_handle);
1864 g_bind_table[handle].cb_slot_num[i] = -1;
1871 EXTAPI int sf_get_data(int handle , unsigned int data_id , sensor_data_t* values)
1874 cmd_get_data_t *payload;
1875 cmd_get_struct_t *return_payload;
1880 retvm_if( (!values) , -1 , "sf_get_data fail , invalid get_values pointer %p", values);
1881 retvm_if( ( (data_id & 0xFFFF) < 1) || ( (data_id & 0xFFFF) > 0xFFF), -1 , "sf_get_data fail , invalid data_id %d", data_id);
1882 retvm_if( handle > MAX_BIND_SLOT - 1 , -1 , "Incorrect handle");
1883 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sf_get_data fail , invalid handle value : %d",handle);
1886 packet = new cpacket(sizeof(cmd_get_struct_t)+sizeof(base_data_struct)+4);
1887 } catch (int ErrNo) {
1888 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
1892 if(g_bind_table[handle].sensor_state != SENSOR_STATE_STARTED)
1894 ERR("sensor framewoker doesn't started");
1895 values->data_accuracy = SENSOR_ACCURACY_UNDEFINED;
1896 values->data_unit_idx = SENSOR_UNDEFINED_UNIT;
1897 values->time_stamp = 0;
1898 values->values_num = 0;
1904 payload = (cmd_get_data_t*)packet->data();
1906 ERR("cannot find memory for send packet->data");
1912 packet->set_version(PROTOCOL_VERSION);
1913 packet->set_cmd(CMD_GET_STRUCT);
1914 packet->set_payload_size(sizeof(cmd_get_data_t));
1915 payload->data_id = data_id;
1917 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
1918 release_handle(handle);
1924 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
1925 release_handle(handle);
1931 if (packet->payload_size()) {
1932 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
1933 release_handle(handle);
1940 return_payload = (cmd_get_struct_t*)packet->data();
1941 if (!return_payload) {
1942 ERR("cannot find memory for return packet->data");
1948 if ( return_payload->state < 0 ) {
1949 ERR("get values fail from server \n");
1950 values->data_accuracy = SENSOR_ACCURACY_UNDEFINED;
1951 values->data_unit_idx = SENSOR_UNDEFINED_UNIT;
1952 values->time_stamp = 0;
1953 values->values_num = 0;
1959 base_data_struct *base_return_data;
1960 base_return_data = (base_data_struct *)return_payload->data_struct;
1962 gettimeofday(&sv, NULL);
1963 values->time_stamp = MICROSECONDS(sv);
1965 values->data_accuracy = base_return_data->data_accuracy;
1966 values->data_unit_idx = base_return_data->data_unit_idx;
1967 values->values_num = base_return_data->values_num;
1968 for ( i = 0 ; i < base_return_data->values_num ; i++ ) {
1969 values->values[i] = base_return_data->values[i];
1970 // DBG("client , get_data_value , [%d] : %f \n", i , values->values[i]);
1978 EXTAPI int sf_check_rotation( unsigned long *curr_state)
1983 double atan_value = 0, norm_z = 0;
1984 int acc_theta = 0 , acc_pitch = 0;
1988 sensor_data_t base_data_values;
1990 retvm_if( curr_state==NULL , -1 , "sf_check_rotation fail , invalid curr_state");
1992 *curr_state = ROTATION_UNKNOWN;
1994 INFO("Sensor_attach_channel from pid : %d",getpid());
1996 handle = sf_connect( ACCELEROMETER_SENSOR);
1999 ERR("sensor attach fail\n");
2003 state = sf_start(handle, 0);
2006 ERR("sf_start fail\n");
2010 state = sf_get_data(handle, ACCELEROMETER_BASE_DATA_SET, &base_data_values);
2013 ERR("sf_get_data fail\n");
2017 state = sf_stop(handle);
2020 ERR("sf_stop fail\n");
2024 state = sf_disconnect(handle);
2027 ERR("sf_disconnect fail\n");
2031 if((base_data_values.values[0] > XY_POSITIVE_THD || base_data_values.values[0] < XY_NEGATIVE_THD) || (base_data_values.values[1] > XY_POSITIVE_THD || base_data_values.values[1] < XY_NEGATIVE_THD))
2033 atan_value = atan2((base_data_values.values[0]),(base_data_values.values[1]));
2034 acc_theta = ((int)(atan_value * (RADIAN_VALUE) + 360))%360;
2036 raw_z = (double)(base_data_values.values[2]) / 9.8;
2038 if ( raw_z > 1.0 ) {
2041 else if ( raw_z < -1.0 ) {
2047 acc_pitch = (int)( acos(norm_z) *(RADIAN_VALUE));
2050 INFO( "cal value [acc_theta] : %d , [acc_pitch] : %d\n",acc_theta ,acc_pitch);
2052 if( (acc_pitch>PITCH_MIN) && (acc_pitch<PITCH_MAX) ) {
2053 if ((acc_theta >= ROTATION_360 - ROTATION_THD && acc_theta <= ROTATION_360 ) || (acc_theta >= ROTATION_0 && acc_theta < ROTATION_0 + ROTATION_THD))
2055 *curr_state = rotation_mode[ROTATION_EVENT_0].rm[lcd_type];
2057 else if(acc_theta >= ROTATION_90 - ROTATION_THD && acc_theta < ROTATION_90 + ROTATION_THD)
2059 *curr_state = rotation_mode[ROTATION_EVENT_90].rm[lcd_type];
2061 else if(acc_theta >= ROTATION_180 - ROTATION_THD && acc_theta < ROTATION_180 + ROTATION_THD)
2063 *curr_state = rotation_mode[ROTATION_EVENT_180].rm[lcd_type];
2065 else if(acc_theta >= ROTATION_270 - ROTATION_THD && acc_theta < ROTATION_270 + ROTATION_THD)
2067 *curr_state = rotation_mode[ROTATION_EVENT_270].rm[lcd_type];
2070 ERR("Wrong acc_theta : %d , cannot detect current state of ACCEL_SENSOR",acc_theta);
2071 *curr_state = rotation_mode[ROTATION_UNKNOWN].rm[lcd_type];
2074 INFO("Cannot detect current state of ACCEL_SENSOR");
2075 *curr_state = rotation_mode[ROTATION_UNKNOWN].rm[lcd_type];
2083 EXTAPI int sf_set_wakeup(sensor_type_t sensor_type)
2087 if(sf_is_wakeup_supported(sensor_type) < 0)
2089 ERR("Cannot support wake up");
2093 for(i = 0 ; i < MAX_BIND_SLOT ; i++)
2095 if(g_bind_table[i].sensor_type == sensor_type)
2097 g_bind_table[i].wakeup_state = SENSOR_WAKEUP_SETTED;
2101 vconf_notify_key_changed(VCONFKEY_PM_STATE, lcd_off_set_wake_up, NULL);
2106 EXTAPI int sf_unset_wakeup(sensor_type_t sensor_type)
2111 if(sf_is_wakeup_supported(sensor_type) < 0)
2113 ERR("Cannot support wake up");
2117 if(sensor_type == ACCELEROMETER_SENSOR)
2119 state = sf_set_property(sensor_type, ACCELEROMETER_PROPERTY_SET_WAKEUP, WAKEUP_UNSET);
2122 ERR("set wakeup fail");
2128 ERR("Cannot support wakeup");
2132 for(i = 0 ; i < MAX_BIND_SLOT ; i++)
2134 if(g_bind_table[i].sensor_type == sensor_type)
2136 g_bind_table[i].wakeup_state = SENSOR_WAKEUP_UNSETTED;
2140 vconf_ignore_key_changed(VCONFKEY_PM_STATE, lcd_off_set_wake_up);
2145 EXTAPI int sf_is_wakeup_supported(sensor_type_t sensor_type)
2147 if(sensor_type == ACCELEROMETER_SENSOR)
2148 return sf_set_property(sensor_type, ACCELEROMETER_PROPERTY_CHECK_WAKEUP_SUPPORTED, WAKEUP_SET);
2151 ERR("Cannot support wakeup");
2156 EXTAPI int sf_is_wakeup_enabled(sensor_type_t sensor_type)
2158 if(sensor_type == ACCELEROMETER_SENSOR)
2159 return sf_set_property(sensor_type,ACCELEROMETER_PROPERTY_CHECK_WAKEUP_STATUS,0);
2162 ERR("Cannot support wakeup");
2167 EXTAPI int sf_change_event_condition(int handle, unsigned int event_type, event_condition_t *event_condition)
2171 int sensor_state = SENSOR_STATE_UNKNOWN;
2175 retvm_if( handle > MAX_BIND_SLOT - 1 , -1 , "Incorrect handle");
2176 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sf_change_event_condition fail , invalid handle value : %d",handle);
2179 packet = new cpacket(sizeof(cmd_reg_t) + 4);
2180 } catch (int ErrNo) {
2181 ERR("packet creation fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
2185 switch (event_type ) {
2186 case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
2188 case ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME:
2190 case ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME :
2192 case GEOMAGNETIC_EVENT_ATTITUDE_DATA_REPORT_ON_TIME:
2194 case PROXIMITY_EVENT_STATE_REPORT_ON_TIME:
2196 case GYROSCOPE_EVENT_RAW_DATA_REPORT_ON_TIME:
2198 case BAROMETER_EVENT_RAW_DATA_REPORT_ON_TIME:
2200 case BAROMETER_EVENT_TEMPERATURE_DATA_REPORT_ON_TIME:
2202 case BAROMETER_EVENT_ALTITUDE_DATA_REPORT_ON_TIME:
2204 case LIGHT_EVENT_LEVEL_DATA_REPORT_ON_TIME:
2206 case GEOMAGNETIC_EVENT_RAW_DATA_REPORT_ON_TIME:
2208 case LIGHT_EVENT_LUX_DATA_REPORT_ON_TIME:
2210 case PROXIMITY_EVENT_DISTANCE_DATA_REPORT_ON_TIME:
2212 case FUSION_SENSOR_EVENT_RAW_DATA_REPORT_ON_TIME:
2214 case FUSION_ROTATION_VECTOR_EVENT_DATA_REPORT_ON_TIME:
2216 case FUSION_ROTATION_MATRIX_EVENT_DATA_REPORT_ON_TIME:
2219 ERR("Cannot support this API");
2224 for(i = 0 ; i < MAX_CB_SLOT_PER_BIND ; i++)
2226 if(g_cb_table[g_bind_table[handle].cb_slot_num[i]].cb_event_type == event_type)
2228 if(!event_condition)
2230 if(g_cb_table[g_bind_table[handle].cb_slot_num[i]].gsource_interval == (guint)BASE_GATHERING_INTERVAL)
2232 ERR("same interval");
2239 if(g_cb_table[g_bind_table[handle].cb_slot_num[i]].gsource_interval == (guint)event_condition->cond_value1)
2241 ERR("same interval");
2247 DBG("find callback number [%d]",i);
2252 if(i == MAX_CB_SLOT_PER_BIND)
2254 ERR("cannot find event_type [%x] in handle [%d]", event_type, handle);
2259 sensor_state = g_bind_table[handle].sensor_state;
2260 g_bind_table[handle].sensor_state = SENSOR_STATE_STOPPED;
2262 payload = (cmd_reg_t*)packet->data();
2264 ERR("cannot find memory for send packet->data");
2266 g_bind_table[handle].sensor_state = SENSOR_STATE_STARTED;
2271 packet->set_version(PROTOCOL_VERSION);
2272 packet->set_cmd(CMD_REG);
2273 packet->set_payload_size(sizeof(cmd_reg_t));
2274 payload->type = REG_ADD;
2275 payload->event_type = event_type;
2277 if(!event_condition)
2278 payload->interval = BASE_GATHERING_INTERVAL;
2279 else if((event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0 ))
2280 payload->interval = event_condition->cond_value1;
2282 payload->interval = BASE_GATHERING_INTERVAL;
2285 INFO("Send CMD_REG command with reg_type : %x , event_type : %x\n",payload->type , payload->event_type );
2286 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->send(packet->packet(), packet->size()) == false) {
2287 ERR("Faield to send a packet\n");
2289 g_bind_table[handle].sensor_state = sensor_state;
2294 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv(packet->packet(), packet->header_size()) == false) {
2295 ERR("Faield to receive a packet\n");
2297 g_bind_table[handle].sensor_state = sensor_state;
2302 if (packet->payload_size()) {
2303 if (g_bind_table[handle].ipc && g_bind_table[handle].ipc->recv((char*)packet->packet() + packet->header_size(), packet->payload_size()) == false) {
2304 ERR("Faield to receive a packet\n");
2306 g_bind_table[handle].sensor_state = sensor_state;
2311 if (packet->cmd() == CMD_DONE) {
2312 cmd_done_t *payload;
2313 payload = (cmd_done_t*)packet->data();
2314 if (payload->value == -1) {
2315 ERR("server register fail\n");
2317 g_bind_table[handle].sensor_state = sensor_state;
2322 ERR("unexpected server cmd\n");
2324 g_bind_table[handle].sensor_state = sensor_state;
2330 if(g_cb_table[i].source != NULL)
2332 g_source_destroy(g_cb_table[i].source);
2333 g_source_unref(g_cb_table[i].source);
2336 g_cb_table[i].gsource_interval = (guint)payload->interval;
2337 g_cb_table[i].source = g_timeout_source_new(g_cb_table[i].gsource_interval);
2338 g_source_set_callback (g_cb_table[i].source, sensor_timeout_handler, (gpointer)&g_cb_table[i].my_cb_handle,NULL);
2339 g_cb_table[i].gID = g_source_attach (g_cb_table[i].source, NULL);
2341 g_bind_table[handle].sensor_state = sensor_state;
2347 int sf_change_sensor_option(int handle, int option)
2349 retvm_if( handle > MAX_BIND_SLOT - 1 , -1 , "Incorrect handle");
2350 retvm_if( (g_bind_table[handle].ipc == NULL) ||(handle < 0) , -1 , "sensor_start fail , invalid handle value : %d",handle);
2351 retvm_if( option < 0 || option > 1, -1 , "sensor_start fail , invalid option value : %d",option);
2353 g_bind_table[handle].sensor_option = option;
2355 if(g_bind_table[handle].sensor_state == SENSOR_STATE_PAUSED)
2357 if( sf_start(handle, option) < 0)
2359 ERR("sensor start fail");