diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/accel_sim_processor.cpp | 1058 |
1 files changed, 1058 insertions, 0 deletions
diff --git a/src/accel_sim_processor.cpp b/src/accel_sim_processor.cpp new file mode 100644 index 0000000..0329770 --- /dev/null +++ b/src/accel_sim_processor.cpp @@ -0,0 +1,1058 @@ +/* + * emulator-plugin-accel-proc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * SooYoung Ha <yoosah.ha@samsnung.com> + * Sungmin Ha <sungmin82.ha@samsung.com> + * DongKyun Yun <dk77.yun@samsung.com> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> +#include <dlfcn.h> +#include <pthread.h> +#include <string.h> +#include <sys/un.h> +#include <netinet/in.h> +#include <math.h> +#include <sys/select.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <linux/input.h> + + +#include <common.h> +#include <cobject_type.h> +#include <clist.h> +#include <cmutex.h> +#include <cmodule.h> +#include <csync.h> +#include <cworker.h> +#include <cpacket.h> +#include <csock.h> +#include <sf_common.h> + +#include <csensor_module.h> +#include <cfilter_module.h> +#include <cprocessor_module.h> +#include <accel_sim_processor.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> + +#include <vconf.h> + +#define DEBUG +#define SRV_IP "10.0.2.2" +#define RADIAN_VALUE 57.29747 +#define GRAVITY_VALUE 0.0098 +#define BINARY_TO_GRAVITY 0.001 +#define LOW_FILTER_ALPHA 0.8 +#define LOW_FILTER_ALPHA_R 0.2 + +const char *accel_sim_processor::LCD_TYPE_NODE = "/sys/class/graphics/fb0/virtual_size"; + +const char *accel_sim_processor::LCD_TYPE_KEY = "memory/private/sensor/lcd_type"; + +accel_sim_processor::accel_sim_processor() +: m_sensor(NULL) +, m_filter(NULL) +, m_x(-1) +, m_y(-1) +, m_z(-1) +, m_gravity_x(-1) +, m_gravity_y(-1) +, m_gravity_z(-1) +, m_event(0) +, m_new_event(0) +, m_version(1) +, m_id(0x04BE) +, m_acc_theta(-1) +, m_acc_pitch(-1) +, m_client(0) +#ifdef SIMULATOR +, m_handle_simul_node(-1) +, m_run_state(-1) +#endif +, m_work_err_count(0) +, m_ms_unit_upscale_value(100000) +, m_ms_unit_upscale_x(-1) +, m_ms_unit_upscale_y(-1) +, m_ms_unit_upscale_z(-1) +, m_rotation_cb_client(0) +, m_data_report_cb_client(0) +, m_orientation_report_cb_client(0) +, m_linear_acceleration_report_cb_client(0) +, m_gravity_report_cb_client(0) +{ + m_name = strdup("accel_sim_processor"); + m_rotation_cb_key = strdup("memory/private/sensor/10001"); + if ((!m_name) ||(!m_rotation_cb_key) ) { + free(m_name); + free(m_rotation_cb_key); + throw ENOMEM; + } + + m_lcd_type = check_lcd_type(); + +#ifdef SIMULATOR + FD_ZERO(&m_readfds); + FD_ZERO(&m_writefds); + FD_ZERO(&m_exceptfds); + FD_ZERO(&m_standby_fds); +#endif + +#ifdef HWREV_CHECK + if (check_hw_node() != 1 ) { + free(m_name); + free(m_rotation_cb_key); + throw ENXIO; + } +#endif + + cprocessor_module::set_main(working, stopped, this); +} + + + +accel_sim_processor::~accel_sim_processor() +{ + free(m_name); + free(m_rotation_cb_key); + +#ifdef SIMULATOR + if ( m_run_state != -1 ) { + m_run_state = -1; + usleep(100000); + } + if (m_handle_simul_node != -1) { + FD_CLR(m_handle_simul_node, &m_readfds); + close(m_handle_simul_node); + } +#endif +} + + + +bool accel_sim_processor::add_input(csensor_module *sensor) +{ + m_sensor = sensor; + return true; +} + + + +bool accel_sim_processor::add_input(cfilter_module *filter) +{ + m_filter = filter; + return true; +} + + + +const char *accel_sim_processor::name(void) +{ + return m_name; +} + + + +int accel_sim_processor::id(void) +{ + return m_id; +} + + + +int accel_sim_processor::version(void) +{ + return m_version; +} + + + +bool accel_sim_processor::update_name(char *name) +{ + char *new_name; + new_name = strdup(name); + if (!new_name) { + DbgPrint("No memory\n"); + return false; + } + + free(m_name); + m_name = new_name; + return true; +} + + + +bool accel_sim_processor::update_id(int id) +{ + m_id = id; + return true; +} + + + +bool accel_sim_processor::update_version(int version) +{ + m_version = version; + return true; +} + + + +cprocessor_module *accel_sim_processor::create_new(void) +{ +#ifdef USE_ONLY_ONE_MODULE + return (cprocessor_module*)this; +#else + accel_sim_processor *inst = NULL; + bool bstate = false; + + try { + inst = new accel_sim_processor; + } catch (...) { + ERR("No Memory\n"); + return NULL; + } + + bstate = cmodule::add_to_list((cmodule *)inst); + if ( !bstate ) { + ERR("Creat and add_to_list fail"); + return NULL; + } + + return (cprocessor_module*)inst; +#endif +} + + + +void accel_sim_processor::destroy(cprocessor_module *module) +{ + bool bstate = false; + + bstate = cmodule::del_from_list((cmodule *)module); + + if ( !bstate ) { + ERR("Destory and del_from_list fail"); + delete (accel_sim_processor *)module; + return ; + } +} + + + +void *accel_sim_processor::stopped(void *inst) +{ + + accel_sim_processor *processor = (accel_sim_processor*)inst; + + if (!processor) { + ERR("There is no processor module instance at accel_sim_processor (%s)\n", __FUNCTION__ ); + return (void*)NULL; + } + + processor->wakeup_all_client(); + + DBG(">>>>>>>>Wait signal %lx , %s\n", pthread_self(), processor->m_name); + processor->m_sync.wait(); + + DBG(">>>>>>>>>Signal received %lx, %s\n", pthread_self(), processor->m_name); + return (void*)NULL; +} + + + +void *accel_sim_processor::working(void *inst) +{ + unsigned long event; + unsigned long status_event; + long new_event = -1; + int state; + +#ifdef SIMULATOR + int fd_count = -1; + int poll_handle = -1; + + fd_set writefds; + fd_set exceptfds; + fd_set standby_fds; + struct timeval select_time; +#else + cfilter_module *filter; + long x; + long y; + long z; + double norm_z; + double atan_value; + int acc_theta , acc_pitch; +#endif + + struct sockaddr_in si_other; +// int s; // for socket, but not be used now + int i, slen=sizeof(si_other); + char buf[16]; + FILE* fd; + char fbuf[16]; + int port; + fd = fopen("/opt/home/sdb_port.txt", "r"); + if(!fd) + port = 3581; + else + { + fgets(fbuf, 16, fd); + fclose(fd); + port = atoi(fbuf) + 3; + } + + memset(buf, '\0', sizeof(buf)); + + /* socket doesn't be used now + if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) + ERR("socket error! (%s)\n", __FUNCTION__ ); + */ + + memset((char *) &si_other, 0, sizeof(si_other)); + si_other.sin_family = AF_INET; + si_other.sin_port = htons(port); + if (inet_aton(SRV_IP, &si_other.sin_addr)==0) { + fprintf(stderr, "inet_aton() failed\n"); + } + + accel_sim_processor *processor = (accel_sim_processor*)inst; + if (!processor) { + ERR("There is no processor module instance at accel (%s)\n", __FUNCTION__ ); + return (void*)cworker::STOPPED; + } + +#ifdef TARGET + DBG("Gathering data\n"); + if (!processor->m_sensor && !processor->m_filter) { + ERR("Sensor or filter is not added\n"); + return (void*)cworker::STOPPED; + } + + //! Implementation dependent + filter = (cfilter_module*)processor->m_filter; + + DBG("Invoke is_data_ready\n"); + + if (filter->is_data_ready(true) == false) { + ERR("Data ready has failed\n"); + processor->m_work_err_count++; +// if ( processor->m_work_err_count > 10 ) { +// ERR("Too many error counted stop processor"); +// return (void*)cworker::STOPPED; +// } + return (void*)cworker::STARTED; + } + + DBG("Data is ready now\n"); + + x = filter->value("x") * -1; + y = filter->value("y") * -1; + z = filter->value("z") * -1; + + DBG("Read %ld %ld %ld\n", x, y, z); + DBG("Prev-Read %ld %ld %ld\n", processor->m_x, processor->m_y, processor->m_z); + + atan_value = atan2(x, y); + acc_theta = (int)(atan_value * (180.0/M_PI) + 360)%360; + + if ( z > 1024 ) { + norm_z = 1.0; + } + else if ( z < -1024 ) { + norm_z = -1.0; + } + else { + norm_z = ((double)z)/1024; + } + acc_pitch = (int)( acos(norm_z) *(180.0/M_PI)); +#endif + + event = 0; + status_event = 0; + +#ifdef SIMULATOR + + if (processor->m_run_state != 1) { + ERR("Not run_flag setted"); + return (void*)cworker::STOPPED; + } + + poll_handle = processor->m_handle_simul_node; + + if ( poll_handle != -1 ) { + writefds = processor->m_writefds; + exceptfds = processor->m_exceptfds; + standby_fds = processor->m_readfds; + + select_time.tv_sec = 0; + select_time.tv_usec = 100000; + + fd_count = select(poll_handle+1, &standby_fds, &writefds, &exceptfds, &select_time); + + } else { + ERR("Invaild simul_node handle , handle : %d", poll_handle); + return (void*)cworker::STOPPED; + } + + if (FD_ISSET(poll_handle, &standby_fds)) { + struct input_event simul_event; + DbgPrint("Simulator device detection!"); + if(fd_count>0) + { + DbgPrint("FD_COUNT = %d",fd_count); + + state = read(poll_handle, &simul_event, sizeof(simul_event)); + if(state>0) + { + switch(simul_event.code) + { + case SIMUL_ROTATE_0: + status_event = (PORTRAIT_TOP|HEAD_CENTER); +// if (!(processor->m_event & (PORTRAIT_TOP|HEAD_CENTER))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_0) { + event = (PORTRAIT_TOP|HEAD_CENTER); + new_event = ROTATION_HEAD_ROTATE_0; + } + break; + case SIMUL_ROTATE_90: + status_event = (LANDSCAPE|HEAD_LEFT); +// if (!(processor->m_event & (LANDSCAPE|HEAD_LEFT))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_90) { + event = (LANDSCAPE|HEAD_LEFT); + new_event =ROTATION_HEAD_ROTATE_90; + } + break; + case SIMUL_ROTATE_180: + status_event = (PORTRAIT_BTM|HEAD_CENTER); +// if (!(processor->m_event & (PORTRAIT_BTM|HEAD_CENTER))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_180) { + event = (PORTRAIT_BTM|HEAD_CENTER); + new_event =ROTATION_HEAD_ROTATE_180; + } + break; + case SIMUL_ROTATE_270: + status_event = (LANDSCAPE|HEAD_RIGHT); +// if (!(processor->m_event & (LANDSCAPE|HEAD_RIGHT))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_270) { + event = (LANDSCAPE|HEAD_RIGHT); + new_event =ROTATION_HEAD_ROTATE_270; + } + break; + default: + break; + } + } + else + { + DbgPrint("error read fail , state = %d",state); + } + +// FD_CLR(poll_handle, &standby_fds); + } + + } +#endif + + +#ifdef TARGET + if( (acc_pitch>PITCH_MIN) && (acc_pitch<PITCH_MAX) ) { + if ((acc_theta >= 330 && acc_theta <=359) || (acc_theta >=0 && acc_theta <=30)) + { + status_event = (PORTRAIT_TOP|HEAD_CENTER); + if(processor->m_event != status_event) + { + event = (PORTRAIT_TOP|HEAD_CENTER); + new_event = ROTATION_HEAD_ROTATE_0; + } +// if (!(processor->m_event & (PORTRAIT_TOP|HEAD_CENTER))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_0) { + event = (PORTRAIT_TOP|HEAD_CENTER); + new_event = ROTATION_HEAD_ROTATE_0; + + // sprintf(buf, "2\n%d\n", 0); + // if(sendto(s, buf, sizeof(buf), 0, (struct sockaddr*)&si_other, slen) == -1) + // ERR("sendto error!\n"); + } + + } + else if(acc_theta >= 60 && acc_theta <=120) + { + status_event = (LANDSCAPE|HEAD_LEFT); + if(processor->m_event != status_event) + { + event = (LANDSCAPE|HEAD_LEFT); + new_event =ROTATION_HEAD_ROTATE_90; + } +// if (!(processor->m_event & (LANDSCAPE|HEAD_LEFT))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_90) { + event = (LANDSCAPE|HEAD_LEFT); + new_event =ROTATION_HEAD_ROTATE_90; + + // sprintf(buf, "2\n%d\n", 90); + // if(sendto(s, buf, sizeof(buf), 0, (struct sockaddr*)&si_other, slen) == -1) + // ERR("sendto error!\n"); + } + } + else if(acc_theta >=150 && acc_theta <= 210) + { + status_event = (PORTRAIT_BTM|HEAD_CENTER); + if(processor->m_event != status_event) + { + event = (PORTRAIT_BTM|HEAD_CENTER); + new_event = ROTATION_HEAD_ROTATE_180; + } +// if (!(processor->m_event & (PORTRAIT_BTM|HEAD_CENTER))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_180) { + event = (PORTRAIT_BTM|HEAD_CENTER); + new_event = ROTATION_HEAD_ROTATE_180; + + // sprintf(buf, "2\n%d\n", 180); + // if(sendto(s, buf, sizeof(buf), 0, (struct sockaddr*)&si_other, slen) == -1) + // ERR("sendto error!\n"); + } + + } + else if(acc_theta >=240 && acc_theta <= 300) + { + status_event = (LANDSCAPE|HEAD_RIGHT); + if(processor->m_event != status_event) + { + event = (LANDSCAPE|HEAD_RIGHT); + new_event =ROTATION_HEAD_ROTATE_270; + } +// if (!(processor->m_event & (LANDSCAPE|HEAD_RIGHT))) { + if ((processor->m_new_event) != ROTATION_HEAD_ROTATE_270) { + event = (LANDSCAPE|HEAD_RIGHT); + new_event =ROTATION_HEAD_ROTATE_270; + + // sprintf(buf, "2\n%d\n", 270); + // if(sendto(s, buf, sizeof(buf), 0, (struct sockaddr*)&si_other, slen) == -1) + // ERR("sendto error!\n"); + } + + } + + } +// close(s); + + DBG("check event_value :%lu, status_event : %lu , acc_pitch : %d , acc_theta : %d \n",event , status_event ,acc_pitch , acc_theta ); + + processor->m_x = x; + processor->m_y = y; + processor->m_z = z; + processor->m_acc_theta = acc_theta ; + processor->m_acc_pitch = acc_pitch ; + + processor->m_ms_unit_upscale_x = ((double)x * 0.004 * (9.81))*processor->m_ms_unit_upscale_value; + processor->m_ms_unit_upscale_y = ((double)y * 0.004 * (9.81))*processor->m_ms_unit_upscale_value; + processor->m_ms_unit_upscale_z = ((double)z * 0.004 * (9.81))*processor->m_ms_unit_upscale_value; +#endif + + if (event) + { + processor->m_event = status_event; + processor->m_new_event = new_event; + if ( processor->m_rotation_cb_client > 0 ) { + DBG("event changed , set new event at key : %s , value : %d \n", processor->m_rotation_cb_key , (int)(processor->m_new_event)); + if ( processor->m_rotation_cb_key ) { + state = vconf_set_int(processor->m_rotation_cb_key, (int)(processor->m_new_event)); + if (state < 0 ) { + ERR("Fail vconf_set_int at key : %s , value : %d\n",processor->m_rotation_cb_key, (int)(processor->m_new_event)); + } + } + } + } + else + { + DBG("No event changed\n"); + } + + processor->wakeup_all_client(); + + //! TODO: How can I get the polling interval? + //! TODO: When we get a polling interval, try read data in that interval :D + return (void*)cworker::STARTED; +} + + + +long accel_sim_processor::value(char *port) +{ + if (!strcasecmp(port, "acc_cod_x")) { + return m_x; + } else if (!strcasecmp(port, "acc_cod_y")) { + return m_y; + } else if (!strcasecmp(port, "acc_cod_z")) { + return m_z; + } else if (!strcasecmp(port, "acc_theta")) { + return m_acc_theta; + } else if (!strcasecmp(port, "acc_pitch")) { + return m_acc_pitch; + } else if (!strcasecmp(port, "acc_state")) { + return m_event; + } + + return -1; +} + + + +long accel_sim_processor::value(int id) +{ + if (id == 0) { + return m_x; + } else if (id == 1) { + return m_y; + } else if (id == 2) { + return m_z; + } else if (id == 10) { + return m_acc_theta; + } else if (id == 11) { + return m_acc_pitch; + } else if (id == 12) { + return m_new_event; + } else if (id == 13) { + return m_ms_unit_upscale_value; + } else if (id == 14) { + return m_ms_unit_upscale_x; + } else if (id == 15) { + return m_ms_unit_upscale_y; + } else if (id == 16) { + return m_ms_unit_upscale_z; + } + + return -1; +} + + + +bool accel_sim_processor::start(void) +{ + bool ret; + + m_client ++; + if (m_client > 1) { + DBG("%s processor fake starting\n",m_name); + return true; + } + + DBG("%s processor real starting\n",m_name); + +#ifdef SIMULATOR + m_handle_simul_node = open(SIMUL_NODE,O_RDONLY); + if (m_handle_simul_node<0) { + DbgPrint("Acceletor handle open fail for SIMULATOR(handle:%d) \n",m_handle_simul_node); + return false; + } + + FD_SET(m_handle_simul_node, &m_readfds); + m_run_state =1; +#endif + //! Before starting the processor module, + //! We have to enable sensor + ret = m_sensor ? m_sensor->start() : true; + if ( ret != true ) { + ERR("m_sensor start fail\n"); + return false; + } + + ret = m_filter ? m_filter->start() : true; + if ( ret != true ) { + ERR("m_filter start fail\n"); + return false; + } + + ret = cprocessor_module::start(); + + if (ret == true) { + DBG("Signal send %s\n", m_name); + m_sync.send_event(); + DBG("Signal sent\n"); + } + + return ret; +} + + + +bool accel_sim_processor::stop(void) +{ + bool ret; + + m_client --; + if (m_client > 0) { + DBG("%s processor fake Stopping\n",m_name); + return true; + } + + DBG("%s processor real Stopping\n",m_name); + + m_client = 0; + + ret = cprocessor_module::stop(); + if ( ret != true ) { + ERR("cprocessor_module::stop()\n"); + return false; + } + +#ifdef SIMULATOR + int state = -1; + + m_run_state = -1; + + usleep(100000); + + FD_CLR(m_handle_simul_node, &m_readfds); + + state = close(m_handle_simul_node); + if ( state < 0 ) { + DbgPrint("Acceletor handle close fail for SIMULATOR(state:%d) \n",state); + return false; + } + +#endif + + ret = m_filter ? m_filter->stop() : true; + if ( ret != true ) { + ERR("m_filter stop fail\n"); + return false; + } + + ret = m_sensor ? m_sensor->stop() : true; + if ( ret != true ) { + ERR("m_sensor stop fail\n"); + return false; + } + + + return ret; +} + +bool accel_sim_processor::add_callback_func(cmd_reg_t * param) +{ + char dummy_key[MAX_KEY_LEN]; + + if ( param->type != REG_ADD ) { + ERR("invaild cmd type !!"); + return false; + } + + switch ( param->event_type ) { + case ACCELEROMETER_EVENT_ROTATION_CHECK: + if ( (m_rotation_cb_client < 1) || ( !m_rotation_cb_key ) ) { + memset(dummy_key,'\0',MAX_KEY_LEN); + snprintf(dummy_key,(MAX_KEY_LEN-1),"%s%x",DEFAULT_SENSOR_KEY_PREFIX,param->event_type); + if (m_rotation_cb_key) { + free (m_rotation_cb_key); + m_rotation_cb_key = NULL; + } + m_rotation_cb_key = strdup(dummy_key); + if ( !m_rotation_cb_key ) { + ERR("Err No memory for event key , evt_type : %x",param->event_type); + return false; + } + } + m_rotation_cb_client++; + + break; + case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME: + m_data_report_cb_client++; + break; + case ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME: + m_orientation_report_cb_client++; + break; + case ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME: + m_linear_acceleration_report_cb_client++; + break; + case ACCELEROMETER_EVENT_GRAVITY_DATA_REPORT_ON_TIME: + m_gravity_report_cb_client++; + break; + default: + ERR("invaild event type !!"); + return false; + } + + return true; +} + + +bool accel_sim_processor::remove_callback_func(cmd_reg_t * param) +{ + if ( param->type != REG_DEL ) { + ERR("invaild cmd type !!"); + return false; + } + + switch ( param->event_type ) { + case ACCELEROMETER_EVENT_ROTATION_CHECK: + if ( m_rotation_cb_client == 0 ) { + ERR("There is no registed client !!"); + return false; + } + m_rotation_cb_client--; + if ( (m_rotation_cb_client == 0) && (m_rotation_cb_key!=NULL) ) { + free (m_rotation_cb_key); + m_rotation_cb_key = NULL; + } + + break; + case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME: + m_data_report_cb_client--; + break; + case ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME: + if(m_orientation_report_cb_client > 0) + m_orientation_report_cb_client--; + break; + case ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME: + if(m_linear_acceleration_report_cb_client > 0) + m_linear_acceleration_report_cb_client--; + break; + case ACCELEROMETER_EVENT_GRAVITY_DATA_REPORT_ON_TIME: + if(m_gravity_report_cb_client > 0) + m_gravity_report_cb_client--; + break; + default: + ERR("invaild event type !!"); + return false; + } + + return true; +} + +bool accel_sim_processor::check_callback_event(cmd_reg_t *param) +{ + if ( param->type != REG_CHK ) { + ERR("invaild cmd type !!"); + return false; + } + + switch ( param->event_type ) { + case ACCELEROMETER_EVENT_ROTATION_CHECK: + case ACCELEROMETER_EVENT_RAW_DATA_REPORT_ON_TIME: + case ACCELEROMETER_EVENT_ORIENTATION_DATA_REPORT_ON_TIME: + case ACCELEROMETER_EVENT_LINEAR_ACCELERATION_DATA_REPORT_ON_TIME: + case ACCELEROMETER_EVENT_GRAVITY_DATA_REPORT_ON_TIME: + DBG("event check ok\n"); + break; + + default: + ERR("invaild event type !!"); + return false; + } + + return true; +} + +long accel_sim_processor::set_cmd(int type , int property , long input_value) +{ + return -1; +} + +int accel_sim_processor::get_property(unsigned int property_level , void *property_data ) +{ + int result = -1; + base_property_struct *return_property; + return_property = (base_property_struct *)property_data; + + if (m_sensor) { + result = m_sensor->get_property(ACCELEROMETER_BASE_DATA_SET , return_property); + if(result == 0) + { + if(property_level == ACCELEROMETER_BASE_DATA_SET) + { + return result; + } + else if(property_level == ACCELEROMETER_ORIENTATION_DATA_SET) + { + return_property->sensor_unit_idx = IDX_UNIT_DEGREE; + return_property->sensor_min_range = -180; + return_property->sensor_max_range = 360; + return_property->sensor_resolution = 1; + } + else if(property_level == ACCELEROMETER_LINEAR_ACCELERATION_DATA_SET) + { + return_property->sensor_unit_idx = IDX_UNIT_METRE_PER_SECOND_SQUARED; + return_property->sensor_min_range = -20.0; + return_property->sensor_max_range = 20.0; + return_property->sensor_resolution = 0.1; + } + else if(property_level == ACCELEROMETER_GRAVITY_DATA_SET) + { + return_property->sensor_unit_idx = IDX_UNIT_METRE_PER_SECOND_SQUARED; + return_property->sensor_min_range = -2.0; + return_property->sensor_max_range = 2.0; + return_property->sensor_resolution = 0.01; + } + else + { + ERR("cannot get_property from sensor\n"); + return -1; + } + return result; + } + } else { + ERR("no m_sensor , cannot get_property from sensor\n"); + } + return -1; +} + +int accel_sim_processor::get_struct_value(unsigned int struct_type , void *struct_values) +{ + int state; + base_data_struct sensor_struct_data; + base_data_struct *return_struct_data = NULL; + + state = m_filter ? m_filter->get_struct_value(ACCELEROMETER_BASE_DATA_SET , &sensor_struct_data) : -1; + if (state<0) { + ERR("Error , m_filter get struct_data fail\n"); + return -1; + } + + if ( struct_type == ACCELEROMETER_BASE_DATA_SET ) { + return_struct_data = (base_data_struct *)struct_values; + return_struct_data->data_accuracy = sensor_struct_data.data_accuracy; + return_struct_data->data_unit_idx = IDX_UNIT_METRE_PER_SECOND_SQUARED; + return_struct_data->values_num = 3; + return_struct_data->values[0] = sensor_struct_data.values[0]; + return_struct_data->values[1] = sensor_struct_data.values[1]; + return_struct_data->values[2] = sensor_struct_data.values[2]; + } else if ( struct_type == ACCELEROMETER_ORIENTATION_DATA_SET ) { + return_struct_data = (base_data_struct *)struct_values; + return_struct_data->data_accuracy = sensor_struct_data.data_accuracy; + return_struct_data->data_unit_idx = IDX_UNIT_DEGREE; + return_struct_data->values_num = 3; + return_struct_data->values[0] = (int)(atan2(sensor_struct_data.values[0], sensor_struct_data.values[1]) * RADIAN_VALUE + 180) % 360; + return_struct_data->values[1] = (int)(atan2(sensor_struct_data.values[1], sensor_struct_data.values[2]) * RADIAN_VALUE ) % 180; + return_struct_data->values[2] = (int)(atan2(sensor_struct_data.values[0], sensor_struct_data.values[2]) * RADIAN_VALUE ) % 180; + + if(return_struct_data->values[2] > 90) + return_struct_data->values[2] = 180 - return_struct_data->values[2]; + else if (return_struct_data->values[2] < -90) + return_struct_data->values[2] = -180 - return_struct_data->values[2]; + } else if (struct_type == ACCELEROMETER_LINEAR_ACCELERATION_DATA_SET) { + return_struct_data = (base_data_struct *)struct_values; + return_struct_data->data_accuracy = sensor_struct_data.data_accuracy; + return_struct_data->data_unit_idx = IDX_UNIT_METRE_PER_SECOND_SQUARED; + return_struct_data->values_num = 3; + m_gravity_x = (LOW_FILTER_ALPHA * m_gravity_x) + (LOW_FILTER_ALPHA_R * sensor_struct_data.values[0]); + m_gravity_y = (LOW_FILTER_ALPHA * m_gravity_y) + (LOW_FILTER_ALPHA_R * sensor_struct_data.values[1]); + m_gravity_z = (LOW_FILTER_ALPHA * m_gravity_z) + (LOW_FILTER_ALPHA_R * sensor_struct_data.values[2]); + return_struct_data->values[0] = (sensor_struct_data.values[0] - m_gravity_x); + return_struct_data->values[1] = (sensor_struct_data.values[1] - m_gravity_y); + return_struct_data->values[2] = (sensor_struct_data.values[2] - m_gravity_z); + } else if (struct_type == ACCELEROMETER_GRAVITY_DATA_SET) { + return_struct_data = (base_data_struct *)struct_values; + return_struct_data->data_accuracy = sensor_struct_data.data_accuracy; + return_struct_data->data_unit_idx = IDX_UNIT_METRE_PER_SECOND_SQUARED; + return_struct_data->values_num = 3; + return_struct_data->values[0] = sensor_struct_data.values[0] / GRAVITY_VALUE * BINARY_TO_GRAVITY; + return_struct_data->values[1] = sensor_struct_data.values[1] / GRAVITY_VALUE * BINARY_TO_GRAVITY; + return_struct_data->values[2] = sensor_struct_data.values[2] / GRAVITY_VALUE * BINARY_TO_GRAVITY; + } else { + ERR("does not support stuct_type\n"); + return -1; + } + + return 0; +} + +int accel_sim_processor::check_lcd_type(void) +{ + int type=0; + + return type; +} + +int accel_sim_processor::check_hw_node(void) +{ + int i; + char name_node[256]; + char hw_name[50]; + FILE *fp; + const char* orig_name = "accel_sim"; + int find_node; + + for(i=0;i<10;i++) { + find_node = 0; + snprintf(name_node,sizeof(name_node),"/sys/devices/virtual/sensor/accel/name"); + + fp = fopen(name_node, "r"); + if (!fp) { + DBG("Failed to open a sys_node or there is no node : %s\n",name_node); + break; + } + + if ( fscanf(fp, "%s", hw_name) < 0) { + fclose(fp); + ERR("Failed to collect data\n"); + return -1; + } + fclose(fp); + + if (!strcasecmp(hw_name, orig_name )) { + find_node =1; + break; + } + + } + + return find_node; +} + + +cmodule *module_init(void *win, void *egl) +{ + accel_sim_processor *inst; + + try { + inst = new accel_sim_processor(); + } catch (int ErrNo) { + ERR("accel_sim_processor class create fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo)); + return NULL; + } + + return (cmodule*)inst; +} + + + +void module_exit(cmodule *inst) +{ + accel_sim_processor *sample = (accel_sim_processor*)inst; + delete sample; +} + + + +//! End of a file |