From: Jinkun Jang Date: Fri, 15 Mar 2013 16:18:32 +0000 (+0900) Subject: merge with master X-Git-Tag: submit/tizen_2.1/20130317.042919~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2fc5c5bdcf33ec1d0ae7fa4e07656cf69db1d8ba;p=platform%2Fcore%2Fsystem%2Fsystem-server.git merge with master --- diff --git a/AUTHORS b/AUTHORS index de52fb3..6edd069 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,2 +1,2 @@ Giyeol Ok -Suchang Woo +Taesoo Jun diff --git a/CMakeLists.txt b/CMakeLists.txt index 26b8bf1..8ad3a00 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,8 +22,9 @@ SET(SRCS ss_procmgr.c ss_timemgr.c ss_cpu_handler.c - ss_device_plugin.c) - + ss_vibrator.c + ) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(MOVINAND_FORMAT movi_format.sh) @@ -42,7 +43,7 @@ pkg_check_modules(pkgs REQUIRED dlog syspopup-caller devman - devman_plugin) + device-node) FOREACH(flag ${pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") diff --git a/include/ss_data.h b/include/ss_data.h index 1c860ae..d56aad7 100644 --- a/include/ss_data.h +++ b/include/ss_data.h @@ -50,6 +50,7 @@ enum { #define PREDEF_USB_STORAGE_ADD "usbstorage-add" #define PREDEF_USB_STORAGE_REMOVE "usbstorage-remove" #define PREDEF_INACTIVE "inactive" +#define PREDEF_HAPTIC "haptic" #define OOMADJ_SET "oomadj_set" #define LOW_MEM_ACT "low_mem_act" diff --git a/packaging/system-server.manifest b/packaging/system-server.manifest index f3309c8..fa0d09e 100644 --- a/packaging/system-server.manifest +++ b/packaging/system-server.manifest @@ -1,17 +1,16 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/packaging/system-server.service b/packaging/system-server.service index cc5b2ae..4ce8d4a 100644 --- a/packaging/system-server.service +++ b/packaging/system-server.service @@ -1,10 +1,12 @@ [Unit] Description=Start the system server service +After=vconf-setup.service [Service] # set DISPLAY for usb_setting launching Environment=DISPLAY=:0 ExecStart=/usr/bin/system_server +TimeoutSec=2 [Install] WantedBy=multi-user.target diff --git a/packaging/system-server.spec b/packaging/system-server.spec index 78c7d7d..df0ac47 100755 --- a/packaging/system-server.spec +++ b/packaging/system-server.spec @@ -1,10 +1,10 @@ #sbs-git:slp/pkgs/s/system-server system-server 0.1.51 56e16bca39f96d6c8aed9ed3df2fea9b393801be Name: system-server Summary: System server -Version: 0.1.63 -Release: 1 -Group: framework-system -License: APLv2 +Version: 0.1.65 +Release: 3 +Group: Framework/system +License: Apache License, Version 2.0 Source0: system-server-%{version}.tar.gz Source1: system-server.service Source2: system-server.manifest @@ -20,13 +20,12 @@ BuildRequires: pkgconfig(pmapi) BuildRequires: pkgconfig(edbus) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(syspopup-caller) -BuildRequires: pkgconfig(devman_plugin) BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(svi) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(usbutils) +BuildRequires: pkgconfig(device-node) BuildRequires: gettext -Requires: sys-assert Requires(preun): /usr/bin/systemctl Requires(post): /usr/bin/systemctl Requires(post): /usr/bin/vconftool @@ -74,12 +73,20 @@ vconftool set -t int memory/sysman/sliding_keyboard -1 -i vconftool set -t int memory/sysman/mmc_mount -1 -i vconftool set -t int memory/sysman/mmc_unmount -1 -i vconftool set -t int memory/sysman/mmc_format -1 -i - +vconftool set -t int memory/sysman/mmc_format_progress 0 -i +vconftool set -t int memory/sysman/mmc_err_status 0 -i +vconftool set -t int memory/sysman/power_off 0 -u 5000 -i -f +vconftool set -t int memory/sysman/battery_level_status -1 -i vconftool set -t string memory/private/sysman/added_storage_uevent "" -i vconftool set -t string memory/private/sysman/removed_storage_uevent "" -u 5000 -i vconftool set -t int memory/sysman/hdmi 0 -i +vconftool set -t int memory/sysman/stime_changed 0 -i + +#db type vconf key init +vconftool set -t int db/sysman/mmc_dev_changed 0 -i + heynotitool set power_off_start heynotitool set mmcblk_add @@ -109,12 +116,6 @@ if [ $1 == 1 ]; then systemctl restart system-server.service fi -if [ -f %{_libdir}/rpm-plugins/msm.so ] ; then - find /opt/share/crash -print0 | xargs -0 chsmack -a 'sys-assert::core' - find /opt/share/crash -type d -print0 | xargs -0 chsmack -t -fi - - %preun if [ $1 == 0 ]; then systemctl stop system-server.service diff --git a/ss_cpu_handler.c b/ss_cpu_handler.c index ba9f77d..c88ef9f 100644 --- a/ss_cpu_handler.c +++ b/ss_cpu_handler.c @@ -17,7 +17,7 @@ #include -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_log.h" #include "include/ss_data.h" #include "vconf.h" @@ -236,13 +236,13 @@ static void __set_freq_limit() { int ret; - ret = plugin_intf->OEM_sys_get_cpufreq_cpuinfo_max_freq(&max_cpu_freq_limit); + ret = device_get_property(DEVICE_TYPE_CPU, PROP_CPU_CPUINFO_MAX_FREQ, &max_cpu_freq_limit); if (ret < 0) { PRT_TRACE_ERR("get cpufreq cpuinfo max readerror: %s", strerror(errno)); max_cpu_freq_limit = DEFAULT_MAX_CPU_FREQ; } - ret = plugin_intf->OEM_sys_get_cpufreq_cpuinfo_min_freq(&min_cpu_freq_limit); + ret = device_get_property(DEVICE_TYPE_CPU, PROP_CPU_CPUINFO_MIN_FREQ, &min_cpu_freq_limit); if (ret < 0) { PRT_TRACE_ERR("get cpufreq cpuinfo min readerror: %s", strerror(errno)); min_cpu_freq_limit = DEFAULT_MIN_CPU_FREQ; @@ -406,7 +406,7 @@ static int __write_max_cpu_freq(int freq) { int ret; - ret = plugin_intf->OEM_sys_set_cpufreq_scaling_max_freq(freq); + ret = device_set_property(DEVICE_TYPE_CPU, PROP_CPU_SCALING_MAX_FREQ, freq); if (ret < 0) { PRT_TRACE_ERR("set cpufreq max freq write error: %s", strerror(errno)); return -1; @@ -419,7 +419,7 @@ static int __write_min_cpu_freq(int freq) { int ret; - ret = plugin_intf->OEM_sys_set_cpufreq_scaling_min_freq(freq); + ret = device_set_property(DEVICE_TYPE_CPU, PROP_CPU_SCALING_MIN_FREQ, freq); if (ret < 0) { PRT_TRACE_ERR("set cpufreq min freq write error: %s", strerror(errno)); return -1; diff --git a/ss_device_change_handler.c b/ss_device_change_handler.c index ab0758e..2ef3bc1 100755 --- a/ss_device_change_handler.c +++ b/ss_device_change_handler.c @@ -33,7 +33,7 @@ #include "ss_queue.h" #include "ss_log.h" #include "ss_device_handler.h" -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_noti.h" #include "include/ss_data.h" #include "sys_device_noti/sys_device_noti.h" @@ -72,13 +72,13 @@ static int check_lowbat_charge_device(int bInserted) int bat_state = -1; int ret = -1; if (bInserted == 1) { - if (plugin_intf->OEM_sys_get_battery_charge_now(&val) == 0) { + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_NOW, &val) == 0) { if (val == 1) bChargeDeviceInserted = 1; return 0; } } else if (bInserted == 0) { - if (plugin_intf->OEM_sys_get_battery_charge_now(&val) == 0) { + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_NOW, &val) == 0) { if (val == 0 && bChargeDeviceInserted == 1) { bChargeDeviceInserted = 0; //low bat popup during charging device removing @@ -120,7 +120,8 @@ static void usb_chgdet_cb(struct ss_main_data *ad) ss_lowbat_monitor(NULL); ss_action_entry_call_internal(PREDEF_USBCON, 0); - if (plugin_intf->OEM_sys_get_jack_usb_online(&val)==0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_USB_ONLINE, &val) == 0) { + PRT_TRACE("jack - usb changed %d",val); check_lowbat_charge_device(val); if (val==1) { snprintf(params, sizeof(params), "%d", CB_NOTI_BATT_CHARGE); @@ -144,7 +145,8 @@ static void ta_chgdet_cb(struct ss_main_data *ad) int bat_state = VCONFKEY_SYSMAN_BAT_NORMAL; char params[BUFF_MAX]; - if (plugin_intf->OEM_sys_get_jack_charger_online(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_TA_ONLINE, &val) == 0) { + PRT_TRACE("jack - ta changed %d",val); check_lowbat_charge_device(val); vconf_set_int(VCONFKEY_SYSMAN_CHARGER_STATUS, val); if (val == 0) { @@ -170,8 +172,7 @@ static void earkey_chgdet_cb(struct ss_main_data *ad) { int val; PRT_TRACE("jack - earkey changed\n"); - - if (plugin_intf->OEM_sys_get_jack_earkey_online(&val) == 0) + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_EARKEY_ONLINE, &val) == 0) vconf_set_int(VCONFKEY_SYSMAN_EARJACKKEY, val); } @@ -186,14 +187,15 @@ static void hdmi_chgdet_cb(struct ss_main_data *ad) PRT_TRACE("jack - hdmi changed\n"); int val; pm_change_state(LCD_NORMAL); - if (plugin_intf->OEM_sys_get_hdmi_support(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_HDMI_SUPPORT, &val) == 0) { if (val!=1) { PRT_TRACE_ERR("target is not support HDMI"); vconf_set_int(VCONFKEY_SYSMAN_HDMI, HDMI_NOT_SUPPORTED); return; } } - if (plugin_intf->OEM_sys_get_jack_hdmi_online(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_HDMI_ONLINE, &val) == 0) { + PRT_TRACE("jack - hdmi changed %d",val); vconf_set_int(VCONFKEY_SYSMAN_HDMI,val); if(val == 1) pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0); @@ -208,8 +210,8 @@ static void keyboard_chgdet_cb(struct ss_main_data *ad) int ret = -1; PRT_TRACE("jack - keyboard changed\n"); - ret = plugin_intf->OEM_sys_get_jack_keyboard_online(&val); - if( ret == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_KEYBOARD_ONLINE, &val) == 0) { + PRT_TRACE("jack - keyboard changed %d",val); if(val != 1) val = 0; vconf_set_int(VCONFKEY_SYSMAN_SLIDING_KEYBOARD, val); @@ -255,16 +257,18 @@ static void charge_cb(struct ss_main_data *ad) char params[BUFF_MAX]; static int bat_full_noti = 0; ss_lowbat_monitor(NULL); - if (plugin_intf->OEM_sys_get_battery_health(&val) == 0) { + + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_HEALTH, &val) == 0) { if (val==BATTERY_OVERHEAT || val==BATTERY_COLD) { PRT_TRACE_ERR("Battery health status is not good (%d)", val); ss_action_entry_call_internal(PREDEF_LOWBAT, 1, CHARGE_ERROR_ACT); + return; } } else { PRT_TRACE_ERR("failed to get battery health status"); } - plugin_intf->OEM_sys_get_battery_charge_full(&val); + device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_FULL, &val); if (val==0) { if (bat_full_noti==1) { snprintf(params, sizeof(params), "%d %d", CB_NOTI_BATT_FULL, CB_NOTI_OFF); diff --git a/ss_device_plugin.c b/ss_device_plugin.c deleted file mode 100644 index 6d5f77d..0000000 --- a/ss_device_plugin.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2012 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include - -#include "ss_log.h" -#include "ss_device_plugin.h" - -static void *dlopen_handle; - -int _ss_devman_plugin_init() -{ - char *error; - - dlopen_handle = dlopen(DEVMAN_PLUGIN_PATH, RTLD_NOW); - if (!dlopen_handle) { - PRT_TRACE_ERR("dlopen() failed"); - return -1; - } - - const OEM_sys_devman_plugin_interface *(*get_devman_plugin_interface) (); - get_devman_plugin_interface = dlsym(dlopen_handle, "OEM_sys_get_devman_plugin_interface"); - if ((error = dlerror()) != NULL) { - PRT_TRACE_ERR("dlsym() failed: %s", error); - dlclose(dlopen_handle); - return -1; - } - - plugin_intf = get_devman_plugin_interface(); - if (!plugin_intf) { - PRT_TRACE_ERR("get_devman_plugin_interface() failed"); - dlclose(dlopen_handle); - return -1; - } - - return 0; -} - - -int _ss_devman_plugin_fini() -{ - if (dlopen_handle) { - dlclose(dlopen_handle); - } - - return 0; -} - - diff --git a/ss_log.h b/ss_log.h index 02884e2..db769d0 100644 --- a/ss_log.h +++ b/ss_log.h @@ -27,26 +27,26 @@ #define __LOG(prio, fmt, arg...) \ do { SLOG(prio, LOG_TAG, fmt, ##arg); } while (0) #define __LOGD(prio, fmt, arg...) \ - do { SLOG(prio, LOG_TAG, "[%s:%d] "fmt"\n", __FUNCTION__, __LINE__, ##arg); } while (0) + do { SLOG(prio, LOG_TAG, "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg); } while (0) #define __PRT(prio, fmt, arg...) \ do { fprintf(((D##prio) == DLOG_ERR ? stderr : stdout), fmt"\n", ##arg); } while (0) #define __PRTD(prio, fmt, arg...) \ do { \ fprintf(((D##prio) == DLOG_ERR ? stderr : stdout), \ - "[%s:%d] "fmt"\n", __FILE__, __LINE__, ##arg); \ + "%s: %s(%d) > "fmt"\n", __MODULE__, __func__, __LINE__, ##arg); \ } while (0) #else #include #define __LOG(prio, fmt, arg...) \ do { syslog(prio, fmt, ##arg); } while (0) #define __LOGD(prio, fmt, arg...) \ - do { syslog(prio, "[%s:%d] "fmt"\n", __FUNCTION__, __LINE__, ##arg); } while (0) + do { syslog(prio, "%s: %s(%d) > "fmt"\n", __MODULE__, __func__, __LINE__, ##arg); } while (0) #define __PRT(prio, fmt, arg...) \ do { fprintf(((prio) == LOG_ERR ? stderr : stdout), fmt"\n", ##arg); } while (0) #define __PRTD(prio, fmt, arg...) \ do { \ fprintf(((prio) == LOG_ERR ? stderr : stdout), \ - "[%s:%d] "fmt"\n", __FILE__, __LINE__, ##arg); \ + "%s: %s(%d) > "fmt"\n", __MODULE__, __func__, __LINE__, ##arg); \ } while (0) #endif diff --git a/ss_lowbat_handler.c b/ss_lowbat_handler.c index 2e5dcc9..f6ce0fe 100755 --- a/ss_lowbat_handler.c +++ b/ss_lowbat_handler.c @@ -26,7 +26,7 @@ #include "ss_launch.h" #include "ss_noti.h" #include "ss_queue.h" -#include "ss_device_plugin.h" +#include "device-node.h" #include "include/ss_data.h" #define BAT_MON_INTERVAL 30 @@ -46,15 +46,10 @@ #define LOWBAT_EXEC_PATH PREFIX"/bin/lowbatt-popup" -static int battery_level_table[] = { - 5, /* BATTERY_LEVEL0 */ - 15, /* 1 */ - 25, /* 2 */ - 40, /* 3 */ - 60, /* 4 */ - 80, /* 5 */ - 100, /* 6 */ -}; +#define BATTERY_LEVEL_CHECK_FULL 95 +#define BATTERY_LEVEL_CHECK_HIGH 15 +#define BATTERY_LEVEL_CHECK_LOW 5 +#define BATTERY_LEVEL_CHECK_CRITICAL 1 #define _SYS_LOW_POWER "LOW_POWER" @@ -127,7 +122,7 @@ int ss_lowbat_set_charge_on(int onoff) int ss_lowbat_is_charge_in_now() { int val = 0; - if (0 > plugin_intf->OEM_sys_get_battery_charge_now(&val)) { + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_NOW, &val) < 0) { PRT_TRACE_ERR("fail to read charge now from kernel"); ss_lowbat_set_charge_on(0); return 0; @@ -165,7 +160,7 @@ static int lowbat_process(int bat_percent, void *ad) } if (new_bat_capacity <= BATTERY_REAL_POWER_OFF) { - if (0 > plugin_intf->OEM_sys_get_battery_charge_now(&val)) { + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_NOW, &val) < 0) { PRT_TRACE_ERR("fail to read charge now from kernel"); } PRT_TRACE("charge_now status %d",val); @@ -193,7 +188,9 @@ static int lowbat_process(int bat_percent, void *ad) } else { new_bat_state = BATTERY_NORMAL; if (new_bat_capacity == BATTERY_FULL) { - plugin_intf->OEM_sys_get_battery_charge_full(&bat_full); + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CHARGE_FULL, &bat_full) < 0) { + PRT_TRACE_ERR("fail to read charge full from kernel"); + } if (bat_full == 1) { if (vconf_state != VCONFKEY_SYSMAN_BAT_FULL) ret=vconf_set_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, VCONFKEY_SYSMAN_BAT_FULL); @@ -247,14 +244,45 @@ static int lowbat_read() { int bat_percent; - plugin_intf->OEM_sys_get_battery_capacity(&bat_percent); + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_CAPACITY, &bat_percent) < 0) { + PRT_TRACE_ERR("fail to read power capacity from kernel"); + return -1; + } return bat_percent; } -int ss_lowbat_monitor(void *data) +static void __ss_change_lowbat_level(int bat_percent) +{ + int prev, now; + + if (cur_bat_capacity == bat_percent) + return; + + if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, &prev) < 0) { + PRT_TRACE_ERR("vconf_get_int() failed"); + return; + } + + + if (bat_percent > BATTERY_LEVEL_CHECK_FULL) { + now = VCONFKEY_SYSMAN_BAT_LEVEL_FULL; + } else if (bat_percent > BATTERY_LEVEL_CHECK_HIGH) { + now = VCONFKEY_SYSMAN_BAT_LEVEL_HIGH; + } else if (bat_percent > BATTERY_LEVEL_CHECK_LOW) { + now = VCONFKEY_SYSMAN_BAT_LEVEL_LOW; + } else if (bat_percent > BATTERY_LEVEL_CHECK_CRITICAL) { + now = VCONFKEY_SYSMAN_BAT_LEVEL_CRITICAL; + } else { + now = VCONFKEY_SYSMAN_BAT_LEVEL_EMPTY; + } + + if (prev != now) + vconf_set_int(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, now); +} + +static int __check_lowbat_percent(void) { - struct ss_main_data *ad = (struct ss_main_data *)data; int bat_percent; bat_percent = lowbat_read(); @@ -264,12 +292,21 @@ int ss_lowbat_monitor(void *data) if (bat_err_count > MAX_BATTERY_ERROR) { PRT_TRACE_ERR ("[BATMON] Cannot read battery gage. stop read fuel gage"); - return 0; } - return 1; + return -1; } if (bat_percent > 100) bat_percent = 100; + __ss_change_lowbat_level(bat_percent); + return bat_percent; +} + +int ss_lowbat_monitor(void *data) +{ + struct ss_main_data *ad = (struct ss_main_data *)data; + int bat_percent; + + bat_percent = __check_lowbat_percent(); if (lowbat_process(bat_percent, ad) < 0) ecore_timer_interval_set(lowbat_timer, BAT_MON_INTERVAL_MIN); @@ -296,7 +333,7 @@ static int check_battery() int r; int ret = -1; - if (0 > plugin_intf->OEM_sys_get_battery_present(&ret)) { + if (device_get_property(DEVICE_TYPE_POWER, PROP_POWER_PRESENT, &ret) < 0) { PRT_TRACE_ERR("[BATMON] battery check : %d", ret); } PRT_TRACE("[BATMON] battery check : %d", ret); @@ -311,6 +348,9 @@ int ss_lowbat_init(struct ss_main_data *ad) /* need check battery */ lowbat_timer = ecore_timer_add(BAT_MON_INTERVAL_MIN, ss_lowbat_monitor, ad); + + __check_lowbat_percent(); + ss_lowbat_is_charge_in_now(); vconf_notify_key_changed(VCONFKEY_PM_STATE, (void *)wakeup_cb, NULL); diff --git a/ss_lowmem_handler.c b/ss_lowmem_handler.c index 252e0e4..fb6db58 100644 --- a/ss_lowmem_handler.c +++ b/ss_lowmem_handler.c @@ -25,7 +25,7 @@ #include #include -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_log.h" #include "ss_noti.h" #include "ss_queue.h" @@ -303,12 +303,12 @@ static int lowmem_cb(void *data, Ecore_Fd_Handler * fd_handler) static int set_threshold() { - if (0 > plugin_intf->OEM_sys_set_memnotify_threshold_lv1(MEM_THRESHOLD_LV1)) { + if (device_set_property(DEVICE_TYPE_MEMORY, PROP_MEMORY_THRESHOLD_LV1, MEM_THRESHOLD_LV1) < 0) { PRT_TRACE_ERR("Set memnorify threshold lv1 failed"); return -1; } - if (0 > plugin_intf->OEM_sys_set_memnotify_threshold_lv2(MEM_THRESHOLD_LV2)) { + if (device_set_property(DEVICE_TYPE_MEMORY, PROP_MEMORY_THRESHOLD_LV2, MEM_THRESHOLD_LV2) < 0) { PRT_TRACE_ERR("Set memnorify threshold lv2 failed"); return -1; } @@ -320,7 +320,7 @@ int ss_lowmem_init(struct ss_main_data *ad) { char lowmem_dev_node[PATH_MAX]; - if (0 > plugin_intf->OEM_sys_get_memnotify_node(lowmem_dev_node)) { + if (device_get_property(DEVICE_TYPE_MEMORY, PROP_MEMORY_NODE, lowmem_dev_node) < 0) { PRT_TRACE_ERR("Low memory handler fd init failed"); return -1; } diff --git a/ss_main.c b/ss_main.c index 3721a6e..aceac64 100644 --- a/ss_main.c +++ b/ss_main.c @@ -32,11 +32,14 @@ #include "ss_procmgr.h" #include "ss_timemgr.h" #include "ss_cpu_handler.h" -#include "ss_device_plugin.h" #include "include/ss_data.h" +#define SS_PIDFILE_PATH "/var/run/.system_server.pid" + static void fini(struct ss_main_data *ad) { + // try to remove pid file + unlink(SS_PIDFILE_PATH); } static void init_ad(struct ss_main_data *ad) @@ -57,11 +60,6 @@ static void writepid(char *pidpath) static void system_server_init(struct ss_main_data *ad) { - if (0 > _ss_devman_plugin_init()) { - PRT_TRACE_ERR("Device Manager Plugin Initialize failed"); - exit (-1); - } - ad->sysnoti_fd = ss_sysnoti_init(); if (ss_noti_init() < 0) PRT_TRACE_ERR("init noti error"); @@ -84,8 +82,6 @@ static void system_server_init(struct ss_main_data *ad) ss_bs_init(); } -#define SS_PIDFILE_PATH "/var/run/.system_server.pid" - static int system_main(int argc, char **argv) { struct ss_main_data ad; diff --git a/ss_mmc_handler.c b/ss_mmc_handler.c index 5e7cf61..27ac1c4 100644 --- a/ss_mmc_handler.c +++ b/ss_mmc_handler.c @@ -29,8 +29,11 @@ #define MOVINAND_DEV "/dev/mmcblk0p1" #define FORMAT_MMC PREFIX"/sbin/mkfs.vfat " #define FORMAT_MOVINAND PREFIX"/bin/movi_format.sh" +#define FS_VFAT_MOUNT_OPT "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*" int mmc_status; +int ss_mmc_inserted(void); +static int __umount_fs(void); int get_mmcblk_num() { @@ -50,8 +53,7 @@ int get_mmcblk_num() while ((dir = readdir(dp)) != NULL) { memset(&stat, 0, sizeof(struct stat)); - if (lstat(dir->d_name, &stat) < 0) - continue; + if(lstat(dir->d_name, &stat) < 0) {continue;} if (S_ISDIR(stat.st_mode) || S_ISLNK(stat.st_mode)) { if (strncmp(".", dir->d_name, 1) == 0 || strncmp("..", dir->d_name, 2) == 0) @@ -100,15 +102,18 @@ int get_mmcblk_num() static int ss_mmc_format(keynode_t *key_nodes, void *data) { PRT_TRACE_ERR("mmc format called"); + __umount_fs(); + vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS, VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS_NOW); device_set_property(DEVTYPE_MMC, MMC_PROP_FORMAT, 0); - + vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS, VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS_NONE); + ss_mmc_inserted(); return 0; } int ss_mmc_unmounted(int argc, char **argv) { int option = -1; - + int mmc_err = 0; if (argc < 1) { PRT_TRACE_ERR("Option is wong"); return -1; @@ -119,9 +124,12 @@ int ss_mmc_unmounted(int argc, char **argv) } if (umount2(MMC_MOUNT_POINT, option) != 0) { + mmc_err = errno; PRT_TRACE_ERR("Failed to unmount mmc card\n"); vconf_set_int(VCONFKEY_SYSMAN_MMC_UNMOUNT, VCONFKEY_SYSMAN_MMC_UNMOUNT_FAILED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_ERR_STATUS, + mmc_err); return -1; } @@ -139,96 +147,112 @@ int ss_mmc_init() /* mmc card mount */ ss_mmc_inserted(); - ss_action_entry_add_internal(PREDEF_MOUNT_MMC, ss_mmc_inserted, NULL, - NULL); - ss_action_entry_add_internal(PREDEF_UNMOUNT_MMC, ss_mmc_unmounted, NULL, - NULL); - ss_action_entry_add_internal(PREDEF_FORMAT_MMC, ss_mmc_format, NULL, - NULL); + ss_action_entry_add_internal(PREDEF_MOUNT_MMC, ss_mmc_inserted, NULL, NULL); + ss_action_entry_add_internal(PREDEF_UNMOUNT_MMC, ss_mmc_unmounted, NULL, NULL); + ss_action_entry_add_internal(PREDEF_FORMAT_MMC, ss_mmc_format, NULL, NULL); return 0; } -int ss_mmc_inserted() +static int __mount_fs(char *path, const char *fs_name, const char *mount_data) +{ + int ret, retry = 0; + do { + if ((ret = mount(path, MMC_MOUNT_POINT, fs_name, 0, mount_data)) == 0) { + PRT_TRACE("Mounted mmc card\n"); + return 0; + } + usleep(100000); + } while (ret == -1 && errno == ENOENT && retry++ < 10); + + return errno; +} + +static int __mmc_mount_fs(void) { char buf[NAME_MAX]; - int blk_num, ret, retry = 0; - char opt[NAME_MAX]; - char *popt = opt; - int r = 0; - if (mmc_status == VCONFKEY_SYSMAN_MMC_MOUNTED) { - PRT_DBG("Mmc is already mounted.\n"); - vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, - VCONFKEY_SYSMAN_MMC_MOUNTED); - vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, - VCONFKEY_SYSMAN_MMC_MOUNT_ALREADY); - return -1; - } + char params[NAME_MAX]; + int fd; + int blk_num; if (access(MMC_MOUNT_POINT, R_OK) != 0) { - r = mkdir(MMC_MOUNT_POINT, 0755); - if(r < 0) { + if (mkdir(MMC_MOUNT_POINT, 0755) < 0) { PRT_TRACE_ERR("Make Directory is failed"); - return -1; + return errno; } } - if ((blk_num = get_mmcblk_num()) == -1) { - vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, - VCONFKEY_SYSMAN_MMC_REMOVED); - vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, - VCONFKEY_SYSMAN_MMC_MOUNT_FAILED); - mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED; - return 0; + blk_num = get_mmcblk_num(); + if (blk_num == -1) { + PRT_TRACE_ERR("fail to check mmc block"); + return -1; } - popt = NULL; - - snprintf(buf, sizeof(buf), "%s%d", MMC_DEV, blk_num); - if (mount - (buf, MMC_MOUNT_POINT, "vfat", 0, - "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*") - == 0) { - PRT_DBG("Mounted mmc card\n"); - vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, - VCONFKEY_SYSMAN_MMC_MOUNTED); - vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, - VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED); - mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED; - return 0; + + snprintf(buf, sizeof(buf), "%s%dp1", MMC_DEV, blk_num); + fd = open(buf, O_RDONLY); + if (fd < 0) { + PRT_TRACE_ERR("can't open the '%s': %s", buf, strerror(errno)); + snprintf(buf, sizeof(buf), "%s%d", MMC_DEV, blk_num); } - do { - snprintf(buf, sizeof(buf), "%s%dp1", MMC_DEV, blk_num); - if ((ret = - mount(buf, MMC_MOUNT_POINT, "vfat", 0, - "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*")) - == 0) { - PRT_DBG("Mounted mmc card partition 1(%s)\n", buf); - vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, - VCONFKEY_SYSMAN_MMC_MOUNTED); - vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, - VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED); - mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED; - return 0; - } - usleep(100000); - } while (ret == -1 && errno == ENOENT && retry++ < 10); + close(fd); - vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, - VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED); - vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, - VCONFKEY_SYSMAN_MMC_MOUNT_FAILED); + if (__mount_fs(buf, "vfat", FS_VFAT_MOUNT_OPT) != 0) + return errno; + return 0; +} + +int ss_mmc_inserted(void) +{ + int r = 0; + + if (mmc_status == VCONFKEY_SYSMAN_MMC_MOUNTED) { + PRT_DBG("Mmc is already mounted.\n"); + vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_MOUNTED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, VCONFKEY_SYSMAN_MMC_MOUNT_ALREADY); + + return -1; + } + + r = __mmc_mount_fs(); + if (r == 0) + goto mount_complete; + else if (r == -1) + goto mount_fail; + vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, VCONFKEY_SYSMAN_MMC_MOUNT_FAILED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_ERR_STATUS, errno); mmc_status = VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED; PRT_TRACE_ERR("Failed to mount mmc card\n"); return -1; -} -int ss_mmc_removed() -{ +mount_complete: + vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_MOUNTED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED); + mmc_status = VCONFKEY_SYSMAN_MMC_MOUNTED; + return 0; +mount_fail: vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_REMOVED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_MOUNT, VCONFKEY_SYSMAN_MMC_MOUNT_FAILED); + vconf_set_int(VCONFKEY_SYSMAN_MMC_ERR_STATUS, VCONFKEY_SYSMAN_MMC_EINVAL); + mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED; + return 0; +} - if (umount2(MMC_MOUNT_POINT, MNT_DETACH) != 0) { +static int __umount_fs(void) +{ + int ret; + if ((ret = umount2(MMC_MOUNT_POINT, MNT_DETACH)) != 0) { PRT_TRACE_ERR("Failed to unmount mmc card\n"); } mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED; + return ret; +} + +int ss_mmc_removed() +{ + int mmc_err = 0; + vconf_set_int(VCONFKEY_SYSMAN_MMC_STATUS, VCONFKEY_SYSMAN_MMC_REMOVED); + mmc_err = __umount_fs(); + vconf_set_int(VCONFKEY_SYSMAN_MMC_ERR_STATUS, mmc_err); return 0; } diff --git a/ss_pmon_handler.c b/ss_pmon_handler.c index ffa5aa7..2a5a105 100644 --- a/ss_pmon_handler.c +++ b/ss_pmon_handler.c @@ -22,7 +22,7 @@ #include #include -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_log.h" #include "ss_launch.h" #include "include/ss_data.h" @@ -151,7 +151,7 @@ static int pmon_process(int pid, void *ad) } close(fd); - if (0 > plugin_intf->OEM_sys_set_process_monitor_mp_pnp(new_pid)) { + if ( device_set_property(DEVICE_TYPE_PROCESS, PROP_PROCESS_MP_PNP, new_pid) < 0) { PRT_TRACE_ERR("Write new pid failed"); } PRT_TRACE("[Process MON] %d ", new_pid); @@ -220,8 +220,7 @@ static int pmon_cb(void *data, Ecore_Fd_Handler * fd_handler) int ss_pmon_init(struct ss_main_data *ad) { char pmon_dev_node[PATH_MAX]; - - if (0 > plugin_intf->OEM_sys_get_process_monitor_node(pmon_dev_node)) { + if (device_get_property(DEVICE_TYPE_PROCESS, PROP_PROCESS_NODE, pmon_dev_node) < 0) { PRT_TRACE_ERR("ss_pmon_init get dev node path failed"); return -1; } diff --git a/ss_predefine.c b/ss_predefine.c index f7ac294..6674146 100644 --- a/ss_predefine.c +++ b/ss_predefine.c @@ -35,9 +35,10 @@ #include "ss_launch.h" #include "ss_queue.h" #include "ss_device_handler.h" -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_predefine.h" #include "ss_procmgr.h" +#include "ss_vibrator.h" #include "include/ss_data.h" #define PREDEFINE_SO_DIR PREFIX"/lib/ss_predefine/" @@ -74,11 +75,13 @@ static int lowbat_popup_option = 0; static struct timeval tv_start_poweroff; static void powerdown_ap(TapiHandle *handle, const char *noti_id, void *data, void *user_data); +static void poweroff_control_cb(keynode_t *in_key, struct ss_main_data *ad); static int ss_flags = 0; static Ecore_Timer *poweroff_timer_id = NULL; static TapiHandle *tapi_handle = NULL; +static int power_off = 0; static void make_memps_log(char *file, pid_t pid, char *victim_name) { @@ -130,7 +133,7 @@ static int lowmem_get_victim_pid() pid_t pid; int fd; - if (0 > plugin_intf->OEM_sys_get_memnotify_victim_task(&pid)) { + if (device_get_property(DEVICE_TYPE_MEMORY, PROP_MEMORY_VICTIM_TASK, &pid) < 0) { PRT_TRACE_ERR("Get victim task failed"); return -1; } @@ -195,7 +198,7 @@ int usbcon_def_predefine_action(int argc, char **argv) int ret = -1; int bat_state = VCONFKEY_SYSMAN_BAT_NORMAL; - if (plugin_intf->OEM_sys_get_jack_usb_online(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_USB_ONLINE, &val) == 0) { if (val == 0) { vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS, VCONFKEY_SYSMAN_USB_DISCONNECTED); @@ -222,7 +225,7 @@ int earjackcon_def_predefine_action(int argc, char **argv) int val; PRT_TRACE_EM("earjack_normal predefine action\n"); - if (plugin_intf->OEM_sys_get_jack_earjack_online(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_EARJACK_ONLINE, &val) == 0) { return vconf_set_int(VCONFKEY_SYSMAN_EARJACK, val); } @@ -336,8 +339,8 @@ Eina_Bool powerdown_ap_by_force(void *data) } PRT_TRACE("Power off by force\n"); - kill(-1, SIGTERM); /* give a chance to be terminated for each process */ + power_off = 1; sleep(1); sync(); reboot(RB_POWER_OFF); @@ -375,8 +378,8 @@ static void powerdown_ap(TapiHandle *handle, const char *noti_id, void *data, vo gettimeofday(&now, NULL); } - kill(-1, SIGTERM); /* give a chance to be terminated for each process */ + power_off = 1; sleep(1); sync(); reboot(RB_POWER_OFF); @@ -390,6 +393,7 @@ int poweroff_def_predefine_action(int argc, char **argv) int ret; heynoti_publish(POWEROFF_NOTI_NAME); + vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, (void*)poweroff_control_cb); pm_change_state(LCD_NORMAL); system("/etc/rc.d/rc.shutdown &"); @@ -623,6 +627,7 @@ int flight_mode_def_predefine_action(int argc, char **argv) return 0; } + static void ss_action_entry_load_from_sodir() { DIR *dp; @@ -675,6 +680,21 @@ static void __tel_init_cb(keynode_t *key_nodes,void *data) PRT_TRACE_ERR("tapi is not ready yet"); } } +static void poweroff_control_cb(keynode_t *in_key, struct ss_main_data *ad) +{ + int val; + if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) != 0) + return; + switch (val) { + case VCONFKEY_SYSMAN_POWER_OFF_DIRECT: + ss_action_entry_call_internal(PREDEF_POWEROFF, 0); + break; + case VCONFKEY_SYSMAN_POWER_OFF_POPUP: + ss_action_entry_call_internal(PREDEF_PWROFF_POPUP, 0); + break; + } +} + void ss_predefine_internal_init(void) { @@ -712,9 +732,14 @@ void ss_predefine_internal_init(void) launching_predefine_action, NULL, NULL); ss_action_entry_add_internal(PREDEF_REBOOT, restart_def_predefine_action, NULL, NULL); - ss_action_entry_add_internal(PREDEF_FLIGHT_MODE, flight_mode_def_predefine_action, NULL, NULL); + ss_action_entry_add_internal(PREDEF_HAPTIC, haptic_def_predefine_action, + NULL, NULL); + + if (vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, (void *)poweroff_control_cb, NULL) < 0) { + PRT_TRACE_ERR("Vconf notify key chaneged failed: KEY(%s)", VCONFKEY_SYSMAN_POWER_OFF_STATUS); + } ss_action_entry_load_from_sodir(); /* check and set earjack init status */ diff --git a/ss_ta_handler.c b/ss_ta_handler.c index 5c0faa9..ac1e38a 100644 --- a/ss_ta_handler.c +++ b/ss_ta_handler.c @@ -19,7 +19,7 @@ #include #include -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_log.h" #include "include/ss_data.h" @@ -30,7 +30,7 @@ int ss_ta_init() int val = -1, i = 0, pid; PRT_TRACE("check ta connection"); - if (plugin_intf->OEM_sys_get_jack_charger_online(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_TA_ONLINE, &val) == 0) { if ( val==1 ) { vconf_set_int(VCONFKEY_SYSMAN_CHARGER_STATUS, VCONFKEY_SYSMAN_CHARGER_CONNECTED); diff --git a/ss_timemgr.c b/ss_timemgr.c index 28bd0e5..854319d 100644 --- a/ss_timemgr.c +++ b/ss_timemgr.c @@ -33,12 +33,37 @@ #include #include #include +#include +#ifndef TFD_TIMER_CANCELON_SET +#define TFD_TIMER_CANCELON_SET (1<<1) +#endif +#ifndef O_CLOEXEC +#define O_CLOEXEC 0x2000000 +#endif +#ifndef O_NONBLOCK +#define O_NONBLOCK 0x4000 +#endif + +#ifndef TFD_CLOEXEC +#define TFD_CLOEXEC O_CLOEXEC +#endif + +#ifndef TFD_NONBLOCK +#define TFD_NONBLOCK O_NONBLOCK +#endif static const char default_rtc0[] = "/dev/rtc0"; static const char default_rtc1[] = "/dev/rtc1"; static const char default_localtime[] = "/opt/etc/localtime"; +static const time_t default_time = 2147483645; // max(32bit) -3sec +static Ecore_Fd_Handler *tfdh = NULL; // tfd change noti + +static int tfd_cb(void *data, Ecore_Fd_Handler * fd_handler); +static int timerfd_check_stop(int fd); +static int timerfd_check_start(void); + char *substring(const char *str, size_t begin, size_t len) { if (str == 0 || strlen(str) == 0 || strlen(str) < begin @@ -151,11 +176,83 @@ int set_timezone_action(int argc, char **argv) return ret; } +static int timerfd_check_start(void) +{ + int tfd = -1; + struct itimerspec tmr; + + if ((tfd = timerfd_create(CLOCK_REALTIME,TFD_NONBLOCK|TFD_CLOEXEC)) == -1) { + PRT_TRACE_ERR("error timerfd_create() %d",errno); + tfdh = NULL; + return -1; + } + + tfdh = ecore_main_fd_handler_add(tfd,ECORE_FD_READ,tfd_cb,NULL,NULL,NULL); + if (!tfdh) { + PRT_TRACE_ERR("error ecore_main_fd_handler_add"); + return -1; + } + memset(&tmr, 0, sizeof(tmr)); + tmr.it_value.tv_sec = default_time; + + if (timerfd_settime(tfd,TFD_TIMER_ABSTIME|TFD_TIMER_CANCELON_SET,&tmr,NULL) < 0) { + PRT_TRACE_ERR("error timerfd_settime() %d",errno); + return -1; + } + return 0; +} + +static int timerfd_check_stop(int tfd) +{ + if (tfdh) { + ecore_main_fd_handler_del(tfdh); + tfdh = NULL; + } + if (tfd >=0) { + close(tfd); + tfd = -1; + } + return 0; +} + +static int tfd_cb(void *data, Ecore_Fd_Handler * fd_handler) +{ + int tfd = -1; + u_int64_t ticks; + int ret = -1; + + if (!ecore_main_fd_handler_active_get(fd_handler,ECORE_FD_READ)) { + PRT_TRACE_ERR("error ecore_main_fd_handler_get()"); + return -1; + } + + if((tfd = ecore_main_fd_handler_fd_get(fd_handler)) == -1) { + PRT_TRACE_ERR("error ecore_main_fd_handler_fd_get()"); + return -1; + } + + ret = read(tfd,&ticks,sizeof(ticks)); + + if (ret < 0 && errno == ECANCELED) { + vconf_set_int(VCONFKEY_SYSMAN_STIME, VCONFKEY_SYSMAN_STIME_CHANGED); + timerfd_check_stop(tfd); + PRT_TRACE("NOTIFICATION here"); + timerfd_check_start(); + } else { + PRT_TRACE("unexpected read (err:%d)",errno); + } + return 0; +} + int ss_time_manager_init(void) { ss_action_entry_add_internal(PREDEF_SET_DATETIME, set_datetime_action, NULL, NULL); ss_action_entry_add_internal(PREDEF_SET_TIMEZONE, set_timezone_action, NULL, NULL); + if (timerfd_check_start() == -1) { + PRT_TRACE_ERR("fail system time change detector init"); + return -1; + } return 0; } diff --git a/ss_usb_handler.c b/ss_usb_handler.c index e9508a9..b97c358 100644 --- a/ss_usb_handler.c +++ b/ss_usb_handler.c @@ -20,7 +20,7 @@ #include #include "ss_log.h" -#include "ss_device_plugin.h" +#include "device-node.h" #include "ss_launch.h" #include "include/ss_data.h" @@ -32,7 +32,7 @@ int ss_usb_init() int val = -1, i = 0, pid; PRT_TRACE("check usb connection"); - if (plugin_intf->OEM_sys_get_jack_usb_online(&val) == 0) { + if (device_get_property(DEVICE_TYPE_EXTCON, PROP_EXTCON_USB_ONLINE, &val) == 0) { if (val==1) { vconf_set_int(VCONFKEY_SYSMAN_USB_STATUS, VCONFKEY_SYSMAN_USB_AVAILABLE); diff --git a/ss_vibrator.c b/ss_vibrator.c new file mode 100644 index 0000000..9ea3343 --- /dev/null +++ b/ss_vibrator.c @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include + +#include "ss_log.h" +#include "ss_predefine.h" +#include "include/ss_data.h" + +enum { + PLAY_HAPTIC = 0, + STOP_HAPTIC, + LEVEL_HAPTIC, +}; + +struct haptic_node { + int pid; + int level; + int play; +}; + +static GList *haptic_head; + +static int add_node(struct haptic_node *node) +{ + haptic_head = g_list_append(haptic_head, node); +} + +static int delete_node(struct haptic_node *node) +{ + haptic_head = g_list_remove(haptic_head, node); +} + +static struct haptic_node *find_node(int pid) +{ + GList *elem; + struct haptic_node *node = NULL; + + for (elem = haptic_head; elem; elem = elem->next) { + node = elem->data; + if (node->pid == pid) + break; + } + + return node; +} + +static int haptic_play(int pid) +{ + struct haptic_node *node; + int r; + + node = malloc(sizeof(struct haptic_node)); + if (node == NULL) { + PRT_TRACE_ERR("malloc fail"); + return -1; + } + + node->pid = pid; + node->level = 0; + node->play = 1; + + add_node(node); + + r = device_set_property(DEVICE_TYPE_VIBRATOR, PROP_VIBRATOR_ENABLE, 1); + if (r < 0) { + PRT_TRACE_ERR("set enable fail"); + return -1; + } + + return 0; +} + +static void check_play_state(gpointer data, gpointer user_data) +{ + struct haptic_node *node = (struct haptic_node*)data; + int *play = (int*)user_data; + + *play += node->play; + PRT_TRACE_ERR("node pid : %d, level : %d, play : %d", node->pid, node->level, node->play); +} + +static int haptic_stop(int pid) +{ + struct haptic_node *node; + int play = 0; + int r; + + node = find_node(pid); + if (node == NULL) { + PRT_TRACE_ERR("find_node(%d) fail", pid); + return -1; + } + + node->play = 0; + delete_node(node); + free(node); + + g_list_foreach(haptic_head, check_play_state, &play); + PRT_TRACE_ERR("play state : %d", play); + + if (!play) { + PRT_TRACE_ERR("not playing anymore, will be stop"); + r = device_set_property(DEVICE_TYPE_VIBRATOR, PROP_VIBRATOR_ENABLE, 0); + if (r < 0) { + PRT_TRACE_ERR("set enable fail"); + return -1; + } + } + + return 0; +} + +static void get_current_level(gpointer data, gpointer user_data) +{ + struct haptic_node *node = (struct haptic_node*)data; + int *sum = (int*)user_data; + + PRT_TRACE_ERR("node pid : %d, level : %d, play : %d", node->pid, node->level, node->play); + if (node->play == 1) { + PRT_TRACE_ERR("node->play : %d, sum : %d", node->play, *sum); + *sum += node->level; + } +} + +static int haptic_change_level(int pid, int level) +{ + struct haptic_node *node; + int sum = 0; + int r; + + PRT_TRACE_ERR("pid : %d, level : %d", pid, level); + + node = find_node(pid); + if (node == NULL) { + PRT_TRACE_ERR("find_node(%d) fail", pid); + return -1; + } + + node->level = level; + + g_list_foreach(haptic_head, get_current_level, &sum); + PRT_TRACE_ERR("current sum level : %d", sum); + + r = device_set_property(DEVICE_TYPE_VIBRATOR, PROP_VIBRATOR_LEVEL, sum); + if (r < 0) { + PRT_TRACE_ERR("set level fail"); + return -1; + } + + return 0; +} + +int haptic_def_predefine_action(int argc, char **argv) +{ + int i; + int pid; + int mode; + + PRT_TRACE_ERR("argc : %d", argc); + for (i = 0; i < argc; ++i) + PRT_TRACE_ERR("[%2d] %s", i, argv[i]); + + if (argc != 3) { + PRT_TRACE_ERR("Haptic predefine action failed"); + return -1; + } + + pid = atoi(argv[0]); + mode = atoi(argv[1]); + PRT_TRACE_ERR("pid : %d, mode : %d", pid, mode); + + switch(mode) { + case PLAY_HAPTIC: + haptic_play(pid); + break; + case STOP_HAPTIC: + haptic_stop(pid); + break; + case LEVEL_HAPTIC: + haptic_change_level(pid, atoi(argv[2])); + break; + default: + break; + } + + return 0; +} diff --git a/ss_device_plugin.h b/ss_vibrator.h similarity index 65% rename from ss_device_plugin.h rename to ss_vibrator.h index a9aa5e1..43c98c5 100644 --- a/ss_device_plugin.h +++ b/ss_vibrator.h @@ -15,16 +15,9 @@ */ -#ifndef __SS_DEVICE_PLUGIN_H__ -#define __SS_DEVICE_PLUGIN_H__ +#ifndef __SS_VIBRATOR_H__ +#define __SS_VIBRATOR_H__ -#include "devman_plugin_intf.h" +int haptic_def_predefine_action(int argc, char **argv); -#define DEVMAN_PLUGIN_PATH "/usr/lib/libslp_devman_plugin.so" - -int _ss_devman_plugin_init(void); -int _ss_devman_plugin_fini(void); - -const OEM_sys_devman_plugin_interface *plugin_intf; - -#endif /* __SS_DEVICE_PLUGIN_H__ */ +#endif /* __SS_VIBRATOR_H__ */