Giyeol Ok <giyeol.ok@samsung.com>\r
-Suchang Woo <suchang.woo@samsung.com>\r
+Taesoo Jun <steve.jun@samsung.com>\r
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)
dlog
syspopup-caller
devman
- devman_plugin)
+ device-node)
FOREACH(flag ${pkgs_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
#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"
<manifest>
- <define>
- <domain name="system-server"/>
- <request>
- <smack request="sys-assert::core" type="rwxat" />
- </request>
- </define>
- <assign>
- <filesystem path="/etc/init.d/system_server.sh" label="_" exec_label="none" />
- <filesystem path="/etc/rc.d/init.d/system_server.sh" label="_" exec_label="none" />
- <filesystem path="/etc/rc.d/rc3.d/S35system-server" label="_" exec_label="none" />
- <filesystem path="/etc/rc.d/rc5.d/S00system-server" label="_" exec_label="none" />
- </assign>
- <request>
- <domain name="system-server"/>
- </request>
+ <define>
+ <domain name="system-server"/>
+ </define>
+ <assign>
+ <filesystem path="/etc/init.d/system_server.sh" label="_" exec_label="none" />
+ <filesystem path="/etc/rc.d/init.d/system_server.sh" label="_" exec_label="none" />
+ <filesystem path="/etc/rc.d/rc3.d/S35system-server" label="_" exec_label="none" />
+ <filesystem path="/etc/rc.d/rc5.d/S00system-server" label="_" exec_label="none" />
+ <filesystem path="/usr/lib/systemd/system/system-server.service" label="_" exec_label="none" />
+ <filesystem path="/usr/lib/systemd/system/multi-user.target.wants/system-server.service" label="_" exec_label="none" />
+ </assign>
+ <request>
+ <domain name="system-server"/>
+ </request>
</manifest>
[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
#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
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
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
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
#include <fcntl.h>
-#include "ss_device_plugin.h"
+#include "device-node.h"
#include "ss_log.h"
#include "include/ss_data.h"
#include "vconf.h"
{
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;
{
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;
{
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;
#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"
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
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);
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) {
{
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);
}
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);
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);
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);
+++ /dev/null
-/*
- * 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 <dlfcn.h>
-#include <unistd.h>
-
-#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;
-}
-
-
#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 <syslog.h>
#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
#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
#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"
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;
}
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);
} 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);
{
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();
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);
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);
/* 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);
#include <sys/stat.h>
#include <sys/shm.h>
-#include "ss_device_plugin.h"
+#include "device-node.h"
#include "ss_log.h"
#include "ss_noti.h"
#include "ss_queue.h"
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;
}
{
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;
}
#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)
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");
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;
#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()
{
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)
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;
}
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;
}
/* 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;
}
#include <sys/types.h>
#include <sys/stat.h>
-#include "ss_device_plugin.h"
+#include "device-node.h"
#include "ss_log.h"
#include "ss_launch.h"
#include "include/ss_data.h"
}
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);
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;
}
#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/"
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)
{
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;
}
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);
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);
}
}
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);
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);
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 &");
return 0;
}
+
static void ss_action_entry_load_from_sodir()
{
DIR *dp;
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)
{
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 */
#include <vconf.h>
#include <sysman.h>
-#include "ss_device_plugin.h"
+#include "device-node.h"
#include "ss_log.h"
#include "include/ss_data.h"
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);
#include <sys/ioctl.h>
#include <linux/rtc.h>
#include <fcntl.h>
+#include <sys/timerfd.h>
+#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
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;
}
#include <sysman.h>
#include "ss_log.h"
-#include "ss_device_plugin.h"
+#include "device-node.h"
#include "ss_launch.h"
#include "include/ss_data.h"
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);
--- /dev/null
+/*
+ * 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 <glib.h>
+#include <device-node.h>
+
+#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;
+}
*/
-#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__ */