e tempget module - mode to using threads instead of tempget binary

this should reduce mem usage by a sub binary and aso solve the sub
shell kill issue too nd still keep the polling of system status out of
the mainloop and keep it unblocked.
This commit is contained in:
Carsten Haitzler 2016-11-30 17:06:45 +09:00
parent 8934ada4d8
commit a94ba7cbfd
7 changed files with 752 additions and 932 deletions

View File

@ -22,14 +22,7 @@ if HAVE_EEZE
src_modules_temperature_module_la_SOURCES += src/modules/temperature/e_mod_udev.c
endif
src_modules_temperature_tempgetdir = $(temperaturepkgdir)
src_modules_temperature_tempget_PROGRAMS = src/modules/temperature/tempget
src_modules_temperature_tempget_CPPFLAGS = $(MOD_CPPFLAGS)
src_modules_temperature_tempget_LDADD = $(MOD_LIBS)
src_modules_temperature_tempget_SOURCES = src/modules/temperature/tempget.c
PHONIES += temperature install-temperature
temperature: $(temperaturepkg_LTLIBRARIES) $(temperature_DATA) $(src_modules_temperature_tempget_PROGRAMS)
install-temperature: install-temperatureDATA install-temperaturepkgLTLIBRARIES install-src_modules_temperature_tempgetPROGRAMS
temperature: $(temperaturepkg_LTLIBRARIES) $(temperature_DATA)
install-temperature: install-temperatureDATA install-temperaturepkgLTLIBRARIES
endif

View File

@ -37,6 +37,50 @@ static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dia
static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static void _cb_display_changed(void *data, Evas_Object *obj EINA_UNUSED);
static Eina_List *
temperature_get_bus_files(const char *bus)
{
Eina_List *result;
Eina_List *therms;
char path[PATH_MAX];
char busdir[PATH_MAX];
char *name;
result = NULL;
snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
/* Look through all the devices for the given bus. */
therms = ecore_file_ls(busdir);
EINA_LIST_FREE(therms, name)
{
Eina_List *files;
char *file;
/* Search each device for temp*_input, these should be
* temperature devices. */
snprintf(path, sizeof(path), "%s/%s", busdir, name);
files = ecore_file_ls(path);
EINA_LIST_FREE(files, file)
{
if ((!strncmp("temp", file, 4)) &&
(!strcmp("_input", &file[strlen(file) - 6])))
{
char *f;
snprintf(path, sizeof(path),
"%s/%s/%s", busdir, name, file);
f = strdup(path);
if (f) result = eina_list_append(result, f);
}
free(file);
}
free(name);
}
return result;
}
void
config_temperature_module(Config_Face *inst)
{

View File

@ -83,7 +83,7 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
o = edje_object_add(gc->evas);
e_theme_edje_object_set(o, "base/theme/modules/temperature",
"e/modules/temperature/main");
"e/modules/temperature/main");
gcc = e_gadcon_client_new(gc, name, id, style, o);
gcc->data = inst;
@ -92,37 +92,13 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
inst->o_temp = o;
inst->module = temperature_config->module;
inst->have_temp = EINA_FALSE;
#ifdef HAVE_EEZE
if (inst->backend == TEMPGET)
{
inst->tempget_data_handler =
ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
_temperature_cb_exe_data, inst);
inst->tempget_del_handler =
ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
_temperature_cb_exe_del, inst);
}
else
{
eeze_init();
inst->temp_poller =
ecore_poller_add(ECORE_POLLER_CORE, inst->poll_interval,
temperature_udev_update_poll, inst);
temperature_udev_update(inst);
}
#else
inst->tempget_data_handler =
ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
_temperature_cb_exe_data, inst);
inst->tempget_del_handler =
ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
_temperature_cb_exe_del, inst);
#ifdef HAVE_EEEZ_UDEV
eeze_init();
#endif
temperature_face_update_config(inst);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
_temperature_face_cb_mouse_down, inst);
_temperature_face_cb_mouse_down, inst);
return gcc;
}
@ -133,25 +109,7 @@ _gc_shutdown(E_Gadcon_Client *gcc)
inst = gcc->data;
if (inst->tempget_exe)
{
ecore_exe_kill(inst->tempget_exe);
ecore_exe_free(inst->tempget_exe);
inst->tempget_exe = NULL;
}
if (inst->tempget_data_handler)
{
ecore_event_handler_del(inst->tempget_data_handler);
inst->tempget_data_handler = NULL;
}
if (inst->tempget_del_handler)
{
ecore_event_handler_del(inst->tempget_del_handler);
inst->tempget_del_handler = NULL;
}
#ifdef HAVE_EEEZ_UDEV
if (inst->temp_poller)
ecore_poller_del(inst->temp_poller);
eeze_shutdown();
#endif
if (inst->o_temp) evas_object_del(inst->o_temp);
@ -181,7 +139,7 @@ _gc_icon(const E_Gadcon_Client_Class *client_class EINA_UNUSED, Evas *evas)
o = edje_object_add(evas);
snprintf(buf, sizeof(buf), "%s/e-module-temperature.edj",
e_module_dir_get(temperature_config->module));
e_module_dir_get(temperature_config->module));
edje_object_file_set(o, buf, "icon");
return o;
}
@ -242,7 +200,7 @@ _temperature_face_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *ob
}
}
void
static void
_temperature_face_level_set(Config_Face *inst, double level)
{
Edje_Message_Float msg;
@ -269,17 +227,9 @@ _temperature_face_shutdown(const Eina_Hash *hash EINA_UNUSED, const void *key EI
Config_Face *inst;
inst = hdata;
if (inst->th) ecore_thread_cancel(inst->th);
if (inst->sensor_name) eina_stringshare_del(inst->sensor_name);
if (inst->id) eina_stringshare_del(inst->id);
#ifdef HAVE_EEZE
if (inst->tempdevs)
{
const char *s;
EINA_LIST_FREE(inst->tempdevs, s)
eina_stringshare_del(s);
}
#endif
E_FREE(inst);
return EINA_TRUE;
}
@ -298,113 +248,105 @@ _temperature_face_id_max(const Eina_Hash *hash EINA_UNUSED, const void *key, voi
return EINA_TRUE;
}
void
temperature_face_update_config(Config_Face *inst)
static void
_temprature_check_main(void *data, Ecore_Thread *th)
{
char buf[8192];
Tempthread *tth = data;
int ptemp = -500, temp;
if (inst->tempget_exe)
for (;;)
{
ecore_exe_kill(inst->tempget_exe);
ecore_exe_free(inst->tempget_exe);
inst->tempget_exe = NULL;
}
if (ecore_thread_check(th)) break;
temp = -999;
#ifdef HAVE_EEZE
if (inst->backend == TEMPGET)
{
if (inst->temp_poller)
{
ecore_poller_del(inst->temp_poller);
inst->temp_poller = NULL;
}
if (!inst->tempget_exe)
{
snprintf(buf, sizeof(buf),
"exec %s/%s/tempget %i \"%s\" %i",
e_module_dir_get(temperature_config->module), MODULE_ARCH,
inst->sensor_type,
(inst->sensor_name ? inst->sensor_name : "(null)"),
inst->poll_interval);
inst->tempget_exe =
ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_READ |
ECORE_EXE_PIPE_READ_LINE_BUFFERED |
ECORE_EXE_NOT_LEADER |
ECORE_EXE_TERM_WITH_PARENT, inst);
}
}
else if (inst->backend == UDEV)
{
/*avoid creating a new poller if possible*/
if (inst->temp_poller)
ecore_poller_poller_interval_set(inst->temp_poller,
inst->poll_interval);
else
{
inst->temp_poller =
ecore_poller_add(ECORE_POLLER_CORE, inst->poll_interval,
temperature_udev_update_poll, inst);
}
}
#else
if (!inst->tempget_exe)
{
snprintf(buf, sizeof(buf),
"%s/%s/tempget %i \"%s\" %i",
e_module_dir_get(temperature_config->module), MODULE_ARCH,
inst->sensor_type,
(inst->sensor_name ? inst->sensor_name : "(null)"),
inst->poll_interval);
inst->tempget_exe =
ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_READ |
ECORE_EXE_PIPE_READ_LINE_BUFFERED |
ECORE_EXE_NOT_LEADER |
ECORE_EXE_TERM_WITH_PARENT, inst);
}
if (tth->udev) temp = temperature_udev_get(tth);
else
#endif
temp = temperature_tempget_get(tth);
if (ptemp != temp) ecore_thread_feedback(th, (void *)((long)temp));
ptemp = temp;
usleep((1000000.0 / 8.0) * (double)tth->poll_interval);
if (ecore_thread_check(th)) break;
}
}
Eina_List *
temperature_get_bus_files(const char *bus)
static void
_temprature_check_notify(void *data, Ecore_Thread *th, void *msg)
{
Eina_List *result;
Eina_List *therms;
char path[PATH_MAX];
char busdir[PATH_MAX];
char *name;
Tempthread *tth = data;
Config_Face *inst = tth->inst;
int temp = (int)((long)msg);
char buf[64];
result = NULL;
snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
/* Look through all the devices for the given bus. */
therms = ecore_file_ls(busdir);
EINA_LIST_FREE(therms, name)
if (th != inst->th) return;
if (temp != -999)
{
Eina_List *files;
char *file;
if (inst->units == FAHRENHEIT) temp = (temp * 9.0 / 5.0) + 32;
/* Search each device for temp*_input, these should be
* temperature devices. */
snprintf(path, sizeof(path), "%s/%s", busdir, name);
files = ecore_file_ls(path);
EINA_LIST_FREE(files, file)
if (!inst->have_temp)
{
if ((!strncmp("temp", file, 4)) &&
(!strcmp("_input", &file[strlen(file) - 6])))
{
char *f;
snprintf(path, sizeof(path),
"%s/%s/%s", busdir, name, file);
f = strdup(path);
if (f) result = eina_list_append(result, f);
}
free(file);
/* enable therm object */
edje_object_signal_emit(inst->o_temp, "e,state,known", "");
inst->have_temp = EINA_TRUE;
}
free(name);
if (inst->units == FAHRENHEIT)
snprintf(buf, sizeof(buf), "%i°F", temp);
else
snprintf(buf, sizeof(buf), "%i°C", temp);
_temperature_face_level_set(inst,
(double)(temp - inst->low) /
(double)(inst->high - inst->low));
edje_object_part_text_set(inst->o_temp, "e.text.reading", buf);
}
return result;
else
{
if (inst->have_temp)
{
/* disable therm object */
edje_object_signal_emit(inst->o_temp, "e,state,unknown", "");
edje_object_part_text_set(inst->o_temp, "e.text.reading", "N/A");
_temperature_face_level_set(inst, 0.5);
inst->have_temp = EINA_FALSE;
}
}
}
static void
_temprature_check_done(void *data, Ecore_Thread *th)
{
Tempthread *tth = data;
const char *s;
eina_stringshare_del(tth->sensor_name);
eina_stringshare_del(tth->sensor_path);
EINA_LIST_FREE(tth->tempdevs, s) eina_stringshare_del(s);
free(tth->extn);
free(tth);
}
void
temperature_face_update_config(Config_Face *inst)
{
Tempthread *tth;
if (inst->th) ecore_thread_cancel(inst->th);
tth = calloc(1, sizeof(Tempthread));
tth->poll_interval = inst->poll_interval;
#ifdef HAVE_EEZE
if (inst->backend != TEMPGET) tth->udev = EINA_TRUE;
#endif
tth->sensor_type = inst->sensor_type;
tth->inst = inst;
if (inst->sensor_name)
tth->sensor_name = eina_stringshare_add(inst->sensor_name);
inst->th = ecore_thread_feedback_run(_temprature_check_main,
_temprature_check_notify,
_temprature_check_done,
_temprature_check_done,
tth, EINA_TRUE);
}
/* module setup */

View File

@ -26,6 +26,7 @@ typedef enum _Sensor_Type
typedef struct _Config Config;
typedef struct _Config_Face Config_Face;
typedef struct _Tempthread Tempthread;
typedef enum _Unit
{
@ -33,36 +34,43 @@ typedef enum _Unit
FAHRENHEIT
} Unit;
struct _Tempthread
{
Config_Face *inst;
int poll_interval;
Sensor_Type sensor_type;
const char *sensor_name;
const char *sensor_path;
void *extn;
#ifdef HAVE_EEZE
Eina_List *tempdevs;
Eina_Bool udev : 1;
#endif
Eina_Bool initted : 1;
};
struct _Config_Face
{
const char *id;
/* saved * loaded config values */
int poll_interval;
int low, high;
#ifdef HAVE_EEZE
Eina_List *tempdevs;
int backend;
Ecore_Poller *temp_poller;
#endif
int sensor_type;
const char *sensor_name;
Unit units;
/* config state */
E_Gadcon_Client *gcc;
Evas_Object *o_temp;
#ifdef HAVE_EEZE
int backend;
#endif
E_Module *module;
E_Config_Dialog *config_dialog;
E_Menu *menu;
Ecore_Exe *tempget_exe;
Ecore_Event_Handler *tempget_data_handler;
Ecore_Event_Handler *tempget_del_handler;
Ecore_Thread *th;
Eina_Bool have_temp:1;
#if defined (__FreeBSD__) || defined (__OpenBSD__)
int mib[5];
#endif
};
struct _Config
@ -80,8 +88,7 @@ typedef enum _Backend
UDEV
} Backend;
Eina_Bool temperature_udev_update_poll(void *data);
void temperature_udev_update(void *data);
int temperature_udev_get(Tempthread *tth);
#endif
E_API extern E_Module_Api e_modapi;
@ -90,12 +97,10 @@ E_API void *e_modapi_init(E_Module *m);
E_API int e_modapi_shutdown(E_Module *m);
E_API int e_modapi_save(E_Module *m);
Eina_Bool _temperature_cb_exe_data(void *data, int type, void *event);
Eina_Bool _temperature_cb_exe_del(void *data, int type, void *event);
void _temperature_face_level_set(Config_Face *inst, double level);
void config_temperature_module(Config_Face *inst);
void temperature_face_update_config(Config_Face *inst);
Eina_List *temperature_get_bus_files(const char* bus);
int temperature_tempget_get(Tempthread *tth);
/**
* @addtogroup Optional_Gadgets

View File

@ -1,76 +1,580 @@
#include "e.h"
#include "e_mod_main.h"
Eina_Bool
_temperature_cb_exe_data(void *data, EINA_UNUSED int type, void *event)
#if defined (__FreeBSD__) || defined(__DragonFly__)
# include <sys/types.h>
# include <sys/sysctl.h>
# include <errno.h>
#endif
#ifdef __OpenBSD__
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/sensors.h>
#include <errno.h>
#include <err.h>
#endif
typedef struct
{
#if defined (__FreeBSD__) || defined(__DragonFly__) || defined (__OpenBSD__)
int mib[CTL_MAXNAME];
#endif
#if defined (__FreeBSD__) || defined(__DragonFly__)
unsigned int miblen;
#endif
int dummy;
} Extn;
#if defined (__FreeBSD__) || defined(__DragonFly__)
static const char *sources[] =
{
"hw.acpi.thermal.tz0.temperature",
"dev.cpu.0.temperature",
"dev.aibs.0.temp.0",
"dev.lm75.0.temperature",
NULL
};
#endif
Eina_List *
temperature_get_bus_files(const char *bus)
{
Eina_List *result;
Eina_List *therms;
char path[PATH_MAX];
char busdir[PATH_MAX];
char *name;
result = NULL;
snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
/* Look through all the devices for the given bus. */
therms = ecore_file_ls(busdir);
EINA_LIST_FREE(therms, name)
{
Eina_List *files;
char *file;
/* Search each device for temp*_input, these should be
* temperature devices. */
snprintf(path, sizeof(path), "%s/%s", busdir, name);
files = ecore_file_ls(path);
EINA_LIST_FREE(files, file)
{
if ((!strncmp("temp", file, 4)) &&
(!strcmp("_input", &file[strlen(file) - 6])))
{
char *f;
snprintf(path, sizeof(path),
"%s/%s/%s", busdir, name, file);
f = strdup(path);
if (f) result = eina_list_append(result, f);
}
free(file);
}
free(name);
}
return result;
}
#ifdef __OpenBSD__
static struct sensor snsr;
static size_t slen = sizeof(snsr);
#endif
static void
init(Tempthread *tth)
{
Eina_List *therms;
char path[512];
#ifdef __OpenBSD__
int dev, numt;
struct sensordev snsrdev;
c size_t sdlen = sizeof(snsrdev);
#endif
#if defined (__FreeBSD__) || defined(__DragonFly__)
unsigned i;
size_t len;
int rc;
#endif
Extn *extn;
if (tth->initted) return;
tth->initted = EINA_TRUE;
extn = calloc(1, sizeof(Extn));
tth->extn = extn;
if ((!tth->sensor_type) ||
((!tth->sensor_name) ||
(tth->sensor_name[0] == 0)))
{
eina_stringshare_del(tth->sensor_name);
tth->sensor_name = NULL;
eina_stringshare_del(tth->sensor_path);
tth->sensor_path = NULL;
#if defined (__FreeBSD__) || defined(__DragonFly__)
for (i = 0; sources[i]; i++)
{
rc = sysctlbyname(sources[i], NULL, NULL, NULL, 0);
if (rc == 0)
{
tth->sensor_type = SENSOR_TYPE_FREEBSD;
tth->sensor_name = eina_stringshare_add(sources[i]);
break;
}
}
#elif __OpenBSD__
extn->mib[0] = CTL_HW;
extn->mib[1] = HW_SENSORS;
for (dev = 0;; dev++)
{
extn->mib[2] = dev;
if (sysctl(extn->mib, 3, &snsrdev, &sdlen, NULL, 0) == -1)
{
if (errno == ENOENT) /* no further sensors */
break;
else
continue;
}
if (strcmp(snsrdev.xname, "cpu0") == 0)
{
sensor_type = SENSOR_TYPE_OPENBSD;
sensor_name = strdup("cpu0");
break;
}
else if (strcmp(snsrdev.xname, "km0") == 0)
{
sensor_type = SENSOR_TYPE_OPENBSD;
sensor_name = strdup("km0");
break;
}
}
#else
therms = ecore_file_ls("/proc/acpi/thermal_zone");
if (therms)
{
char *name;
name = eina_list_data_get(therms);
tth->sensor_type = SENSOR_TYPE_LINUX_ACPI;
tth->sensor_name = eina_stringshare_add(name);
eina_list_free(therms);
}
else
{
eina_list_free(therms);
therms = ecore_file_ls("/sys/class/thermal");
if (therms)
{
char *name;
Eina_List *l;
EINA_LIST_FOREACH(therms, l, name)
{
if (!strncmp(name, "thermal", 7))
{
tth->sensor_type = SENSOR_TYPE_LINUX_SYS;
tth->sensor_name = eina_stringshare_add(name);
eina_list_free(therms);
therms = NULL;
break;
}
}
if (therms) eina_list_free(therms);
}
if (therms)
{
if (ecore_file_exists("/proc/omnibook/temperature"))
{
tth->sensor_type = SENSOR_TYPE_OMNIBOOK;
tth->sensor_name = eina_stringshare_add("dummy");
}
else if (ecore_file_exists("/sys/devices/temperatures/sensor1_temperature"))
{
tth->sensor_type = SENSOR_TYPE_LINUX_PBOOK;
tth->sensor_name = eina_stringshare_add("dummy");
}
else if (ecore_file_exists("/sys/devices/temperatures/cpu_temperature"))
{
tth->sensor_type = SENSOR_TYPE_LINUX_MACMINI;
tth->sensor_name = eina_stringshare_add("dummy");
}
else if (ecore_file_exists("/sys/devices/platform/coretemp.0/temp1_input"))
{
tth->sensor_type = SENSOR_TYPE_LINUX_INTELCORETEMP;
tth->sensor_name = eina_stringshare_add("dummy");
}
else if (ecore_file_exists("/sys/devices/platform/thinkpad_hwmon/temp1_input"))
{
tth->sensor_type = SENSOR_TYPE_LINUX_THINKPAD;
tth->sensor_name = eina_stringshare_add("dummy");
}
else
{
// try the i2c bus
therms = temperature_get_bus_files("i2c");
if (therms)
{
char *name;
if ((name = eina_list_data_get(therms)))
{
if (ecore_file_exists(name))
{
int len;
snprintf(path, sizeof(path),
"%s", ecore_file_file_get(name));
len = strlen(path);
if (len > 6) path[len - 6] = '\0';
tth->sensor_type = SENSOR_TYPE_LINUX_I2C;
tth->sensor_path = eina_stringshare_add(name);
tth->sensor_name = eina_stringshare_add(path);
}
}
eina_list_free(therms);
}
if (!tth->sensor_path)
{
// try the pci bus
therms = temperature_get_bus_files("pci");
if (therms)
{
char *name;
if ((name = eina_list_data_get(therms)))
{
if (ecore_file_exists(name))
{
int len;
snprintf(path, sizeof(path),
"%s", ecore_file_file_get(name));
len = strlen(path);
if (len > 6) path[len - 6] = '\0';
tth->sensor_type = SENSOR_TYPE_LINUX_PCI;
tth->sensor_path = eina_stringshare_add(name);
eina_stringshare_del(tth->sensor_name);
tth->sensor_name = eina_stringshare_add(path);
}
}
eina_list_free(therms);
}
}
}
}
}
#endif
}
if ((tth->sensor_type) && (tth->sensor_name) && (!tth->sensor_path))
{
char *name;
switch (tth->sensor_type)
{
case SENSOR_TYPE_NONE:
break;
case SENSOR_TYPE_FREEBSD:
#if defined (__FreeBSD__) || defined(__DragonFly__)
len = sizeof(extn->mib) / sizeof(extn->mib[0]);
rc = sysctlnametomib(tth->sensor_name, extn->mib, &len);
if (rc == 0)
{
extn->miblen = len;
tth->sensor_path = eina_stringshare_add(tth->sensor_name);
}
#endif
break;
case SENSOR_TYPE_OPENBSD:
#ifdef __OpenBSD__
for (numt = 0; numt < snsrdev.maxnumt[SENSOR_TEMP]; numt++)
{
extn->mib[4] = numt;
slen = sizeof(snsr);
if (sysctl(extn->mib, 5, &snsr, &slen, NULL, 0) == -1)
continue;
if (slen > 0 && (snsr.flags & SENSOR_FINVALID) == 0)
{
break;
}
}
#endif
break;
case SENSOR_TYPE_OMNIBOOK:
tth->sensor_path = eina_stringshare_add("/proc/omnibook/temperature");
break;
case SENSOR_TYPE_LINUX_MACMINI:
tth->sensor_path = eina_stringshare_add("/sys/devices/temperatures/cpu_temperature");
break;
case SENSOR_TYPE_LINUX_PBOOK:
tth->sensor_path = eina_stringshare_add("/sys/devices/temperatures/sensor1_temperature");
break;
case SENSOR_TYPE_LINUX_INTELCORETEMP:
tth->sensor_path = eina_stringshare_add("/sys/devices/platform/coretemp.0/temp1_input");
break;
case SENSOR_TYPE_LINUX_THINKPAD:
tth->sensor_path = eina_stringshare_add("/sys/devices/platform/thinkpad_hwmon/temp1_input");
break;
case SENSOR_TYPE_LINUX_I2C:
therms = ecore_file_ls("/sys/bus/i2c/devices");
EINA_LIST_FREE(therms, name)
{
snprintf(path, sizeof(path),
"/sys/bus/i2c/devices/%s/%s_input",
name, tth->sensor_name);
if (ecore_file_exists(path))
{
tth->sensor_path = eina_stringshare_add(path);
/* We really only care about the first
* one for the default. */
break;
}
free(name);
}
break;
case SENSOR_TYPE_LINUX_PCI:
therms = ecore_file_ls("/sys/bus/pci/devices");
EINA_LIST_FREE(therms, name)
{
snprintf(path, sizeof(path),
"/sys/bus/pci/devices/%s/%s_input",
name, tth->sensor_name);
if (ecore_file_exists(path))
{
tth->sensor_path = eina_stringshare_add(path);
/* We really only care about the first
* one for the default. */
break;
}
free(name);
}
break;
case SENSOR_TYPE_LINUX_ACPI:
snprintf(path, sizeof(path),
"/proc/acpi/thermal_zone/%s/temperature",
tth->sensor_name);
tth->sensor_path = eina_stringshare_add(path);
break;
case SENSOR_TYPE_LINUX_SYS:
snprintf(path, sizeof(path),
"/sys/class/thermal/%s/temp", tth->sensor_name);
tth->sensor_path = eina_stringshare_add(path);
break;
default:
break;
}
}
}
static int
check(Tempthread *tth)
{
FILE *f = NULL;
int ret = 0;
int temp = 0;
char buf[512];
#if defined (__FreeBSD__) || defined(__DragonFly__)
size_t len;
size_t ftemp = 0;
#endif
#if defined (__FreeBSD__) || defined(__DragonFly__) || defined (__OpenBSD__)
Extn *extn = tth->extn;
#endif
/* TODO: Make standard parser. Seems to be two types of temperature string:
* - Somename: <temp> C
* - <temp>
*/
switch (tth->sensor_type)
{
case SENSOR_TYPE_NONE:
/* TODO: Slow down poller? */
break;
case SENSOR_TYPE_FREEBSD:
#if defined (__FreeBSD__) || defined(__DragonFly__)
len = sizeof(ftemp);
if (sysctl(extn->mib, extn->miblen, &ftemp, &len, NULL, 0) == 0)
{
temp = (ftemp - 2732) / 10;
ret = 1;
}
else
goto error;
#endif
break;
case SENSOR_TYPE_OPENBSD:
#ifdef __OpenBSD__
if (sysctl(extn->mib, 5, &snsr, &slen, NULL, 0) != -1)
{
temp = (snsr.value - 273150000) / 1000000.0;
ret = 1;
}
else
goto error;
#endif
break;
case SENSOR_TYPE_OMNIBOOK:
f = fopen(tth->sensor_path, "r");
if (f)
{
char dummy[4096];
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
if (sscanf(buf, "%s %s %i", dummy, dummy, &temp) == 3)
ret = 1;
else
goto error;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_MACMINI:
case SENSOR_TYPE_LINUX_PBOOK:
f = fopen(tth->sensor_path, "rb");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
if (sscanf(buf, "%i", &temp) == 1)
ret = 1;
else
goto error;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_INTELCORETEMP:
case SENSOR_TYPE_LINUX_I2C:
case SENSOR_TYPE_LINUX_THINKPAD:
f = fopen(tth->sensor_path, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
/* actually read the temp */
if (sscanf(buf, "%i", &temp) == 1)
ret = 1;
else
goto error;
/* Hack for temp */
temp = temp / 1000;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_PCI:
f = fopen(tth->sensor_path, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
/* actually read the temp */
if (sscanf(buf, "%i", &temp) == 1)
ret = 1;
else
goto error;
/* Hack for temp */
temp = temp / 1000;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_ACPI:
f = fopen(tth->sensor_path, "r");
if (f)
{
char *p, *q;
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
p = strchr(buf, ':');
if (p)
{
p++;
while (*p == ' ')
p++;
q = strchr(p, ' ');
if (q) *q = 0;
temp = atoi(p);
ret = 1;
}
else
goto error;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_SYS:
f = fopen(tth->sensor_path, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
temp = atoi(buf);
temp /= 1000;
ret = 1;
}
else
goto error;
break;
default:
break;
}
if (ret) return temp;
return -999;
error:
if (f) fclose(f);
tth->sensor_type = SENSOR_TYPE_NONE;
eina_stringshare_del(tth->sensor_name);
tth->sensor_name = NULL;
eina_stringshare_del(tth->sensor_path);
tth->sensor_path = NULL;
return -999;
}
int
temperature_tempget_get(Tempthread *tth)
{
Ecore_Exe_Event_Data *ev;
Config_Face *inst;
int temp;
ev = event;
inst = data;
if ((!inst->tempget_exe) || (ev->exe != inst->tempget_exe)) return ECORE_CALLBACK_PASS_ON;
temp = -999;
if ((ev->lines) && (ev->lines[0].line))
{
int i;
for (i = 0; ev->lines[i].line; i++)
{
if (!strcmp(ev->lines[i].line, "ERROR"))
temp = -999;
else
temp = atoi(ev->lines[i].line);
}
}
if (temp != -999)
{
char buf[256];
if (inst->units == FAHRENHEIT)
temp = (temp * 9.0 / 5.0) + 32;
if (!inst->have_temp)
{
/* enable therm object */
edje_object_signal_emit(inst->o_temp, "e,state,known", "");
inst->have_temp = EINA_TRUE;
}
if (inst->units == FAHRENHEIT)
snprintf(buf, sizeof(buf), "%i°F", temp);
else
snprintf(buf, sizeof(buf), "%i°C", temp);
_temperature_face_level_set(inst,
(double)(temp - inst->low) /
(double)(inst->high - inst->low));
edje_object_part_text_set(inst->o_temp, "e.text.reading", buf);
}
else
{
if (inst->have_temp)
{
/* disable therm object */
edje_object_signal_emit(inst->o_temp, "e,state,unknown", "");
edje_object_part_text_set(inst->o_temp, "e.text.reading", "N/A");
_temperature_face_level_set(inst, 0.5);
inst->have_temp = EINA_FALSE;
}
}
return ECORE_CALLBACK_DONE;
}
Eina_Bool
_temperature_cb_exe_del(void *data, EINA_UNUSED int type, void *event)
{
Ecore_Exe_Event_Del *ev;
Config_Face *inst;
ev = event;
inst = data;
if ((!inst->tempget_exe) || (ev->exe != inst->tempget_exe)) return ECORE_CALLBACK_PASS_ON;
inst->tempget_exe = NULL;
return ECORE_CALLBACK_DONE;
init(tth);
temp = check(tth);
return temp;
}

View File

@ -1,33 +1,26 @@
#include "e.h"
#include "e_mod_main.h"
Eina_Bool
temperature_udev_update_poll(void *data)
int
temperature_udev_get(Tempthread *tth)
{
temperature_udev_update(data);
return ECORE_CALLBACK_RENEW;
}
void
temperature_udev_update(void *data)
{
Config_Face *inst;
Eina_List *l;
double cur, temp, cpus = 0;
double cur, temp;
char *syspath;
const char *test;
char buf[256];
int x, y;
int x, y, cpus = 0;
inst = data;
temp = -999;
if (!inst->tempdevs)
inst->tempdevs = eeze_udev_find_by_type(EEZE_UDEV_TYPE_IS_IT_HOT_OR_IS_IT_COLD_SENSOR, NULL);
if (eina_list_count(inst->tempdevs))
if (!tth->tempdevs)
tth->tempdevs =
eeze_udev_find_by_type(EEZE_UDEV_TYPE_IS_IT_HOT_OR_IS_IT_COLD_SENSOR,
NULL);
if (tth->tempdevs)
{
temp = 0;
EINA_LIST_FOREACH(inst->tempdevs, l, syspath)
EINA_LIST_FOREACH(tth->tempdevs, l, syspath)
{
for (x = 1, y = 0; x < 15; x++)
{
@ -36,50 +29,23 @@ temperature_udev_update(void *data)
if ((test = eeze_udev_syspath_get_sysattr(syspath, buf)))
{
y = 0;
cur = strtod(test, NULL);
cur = atoi(test);
if (cur > 0)
{
temp += (cur / 1000); /* udev reports temp in (celsius * 1000) for some reason */
/* udev reports temp in (celsius * 1000) */
temp += (cur / 1000);
cpus++;
}
}
/* keep checking for temp sensors until we get 2 in a row that don't exist */
/* keep checking for sensors until 2 in a row don't exist */
else y++;
}
}
temp /= cpus;
}
if (temp != -999)
{
if (inst->units == FAHRENHEIT)
temp = (temp * 9.0 / 5.0) + 32;
if (!inst->have_temp)
if (cpus > 0)
{
/* enable therm object */
edje_object_signal_emit(inst->o_temp, "e,state,known", "");
inst->have_temp = EINA_TRUE;
}
if (inst->units == FAHRENHEIT)
snprintf(buf, sizeof(buf), "%3.0f°F", temp);
else
snprintf(buf, sizeof(buf), "%3.0f°C", temp);
_temperature_face_level_set(inst,
(double)(temp - inst->low) /
(double)(inst->high - inst->low));
edje_object_part_text_set(inst->o_temp, "e.text.reading", buf);
}
else
{
if (inst->have_temp)
{
/* disable therm object */
edje_object_signal_emit(inst->o_temp, "e,state,unknown", "");
edje_object_part_text_set(inst->o_temp, "e.text.reading", "N/A");
_temperature_face_level_set(inst, 0.5);
inst->have_temp = EINA_FALSE;
temp /= (double)cpus;
return temp;
}
}
return -999;
}

View File

@ -1,634 +0,0 @@
#include "e.h"
#if defined (__FreeBSD__) || defined(__DragonFly__)
# include <sys/types.h>
# include <sys/sysctl.h>
# include <errno.h>
#endif
#ifdef __OpenBSD__
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/sensors.h>
#include <errno.h>
#include <err.h>
#endif
#include "e_mod_main.h"
static int sensor_type = SENSOR_TYPE_NONE;
static char *sensor_name = NULL;
static int poll_interval = 32;
static int cur_poll_interval = 32;
static char *sensor_path = NULL;
#if defined (__FreeBSD__) || defined(__DragonFly__) || defined (__OpenBSD__)
static int mib[CTL_MAXNAME];
#endif
#if defined (__FreeBSD__) || defined(__DragonFly__)
static unsigned miblen;
static const char *sources[] =
{
"hw.acpi.thermal.tz0.temperature",
"dev.cpu.0.temperature",
"dev.aibs.0.temp.0",
"dev.lm75.0.temperature",
NULL
};
#endif
#ifdef __OpenBSD__
static int dev, numt;
static struct sensordev snsrdev;
static size_t sdlen = sizeof(snsrdev);
static struct sensor snsr;
static size_t slen = sizeof(snsr);
#endif
static Ecore_Poller *poller = NULL;
static int ptemp = 0;
static void init(void);
static int check(void);
static Eina_Bool poll_cb(void *data);
Eina_List *
temperature_get_bus_files(const char *bus)
{
Eina_List *result;
Eina_List *therms;
char path[PATH_MAX];
char busdir[PATH_MAX];
char *name;
result = NULL;
snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
/* Look through all the devices for the given bus. */
therms = ecore_file_ls(busdir);
EINA_LIST_FREE(therms, name)
{
Eina_List *files;
char *file;
/* Search each device for temp*_input, these should be
* temperature devices. */
snprintf(path, sizeof(path), "%s/%s", busdir, name);
files = ecore_file_ls(path);
EINA_LIST_FREE(files, file)
{
if ((!strncmp("temp", file, 4)) &&
(!strcmp("_input", &file[strlen(file) - 6])))
{
char *f;
snprintf(path, sizeof(path),
"%s/%s/%s", busdir, name, file);
f = strdup(path);
if (f) result = eina_list_append(result, f);
}
free(file);
}
free(name);
}
return result;
}
static void
init(void)
{
Eina_List *therms;
char path[PATH_MAX];
#if defined (__FreeBSD__) || defined(__DragonFly__)
unsigned i;
size_t len;
int rc;
#endif
if ((!sensor_type) || ((!sensor_name) || (sensor_name[0] == 0)))
{
E_FREE(sensor_name);
E_FREE(sensor_path);
#if defined (__FreeBSD__) || defined(__DragonFly__)
for (i = 0; sources[i]; i++)
{
rc = sysctlbyname(sources[i], NULL, NULL, NULL, 0);
if (rc == 0)
{
sensor_type = SENSOR_TYPE_FREEBSD;
sensor_name = strdup(sources[i]);
break;
}
}
#elif __OpenBSD__
mib[0] = CTL_HW;
mib[1] = HW_SENSORS;
for (dev = 0;; dev++)
{
mib[2] = dev;
if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1)
{
if (errno == ENOENT) /* no further sensors */
break;
else
continue;
}
if (strcmp(snsrdev.xname, "cpu0") == 0)
{
sensor_type = SENSOR_TYPE_OPENBSD;
sensor_name = strdup("cpu0");
break;
}
else if (strcmp(snsrdev.xname, "km0") == 0)
{
sensor_type = SENSOR_TYPE_OPENBSD;
sensor_name = strdup("km0");
break;
}
}
#else
therms = ecore_file_ls("/proc/acpi/thermal_zone");
if (therms)
{
char *name;
name = eina_list_data_get(therms);
sensor_type = SENSOR_TYPE_LINUX_ACPI;
sensor_name = strdup(name);
eina_list_free(therms);
}
else
{
eina_list_free(therms);
therms = ecore_file_ls("/sys/class/thermal");
if (therms)
{
char *name;
Eina_List *l;
EINA_LIST_FOREACH(therms, l, name)
{
if (!strncmp(name, "thermal", 7))
{
sensor_type = SENSOR_TYPE_LINUX_SYS;
sensor_name = strdup(name);
eina_list_free(therms);
therms = NULL;
break;
}
}
if (therms) eina_list_free(therms);
}
if (therms)
{
if (ecore_file_exists("/proc/omnibook/temperature"))
{
sensor_type = SENSOR_TYPE_OMNIBOOK;
sensor_name = strdup("dummy");
}
else if (ecore_file_exists("/sys/devices/temperatures/sensor1_temperature"))
{
sensor_type = SENSOR_TYPE_LINUX_PBOOK;
sensor_name = strdup("dummy");
}
else if (ecore_file_exists("/sys/devices/temperatures/cpu_temperature"))
{
sensor_type = SENSOR_TYPE_LINUX_MACMINI;
sensor_name = strdup("dummy");
}
else if (ecore_file_exists("/sys/devices/platform/coretemp.0/temp1_input"))
{
sensor_type = SENSOR_TYPE_LINUX_INTELCORETEMP;
sensor_name = strdup("dummy");
}
else if (ecore_file_exists("/sys/devices/platform/thinkpad_hwmon/temp1_input"))
{
sensor_type = SENSOR_TYPE_LINUX_THINKPAD;
sensor_name = strdup("dummy");
}
else
{
// try the i2c bus
therms = temperature_get_bus_files("i2c");
if (therms)
{
char *name;
if ((name = eina_list_data_get(therms)))
{
if (ecore_file_exists(name))
{
int len;
snprintf(path, sizeof(path),
"%s", ecore_file_file_get(name));
len = strlen(path);
if (len > 6) path[len - 6] = '\0';
sensor_type = SENSOR_TYPE_LINUX_I2C;
sensor_path = strdup(name);
sensor_name = strdup(path);
printf("sensor type = i2c\n"
"sensor path = %s\n"
"sensor name = %s\n",
sensor_path, sensor_name);
}
}
eina_list_free(therms);
}
if (!sensor_path)
{
// try the pci bus
therms = temperature_get_bus_files("pci");
if (therms)
{
char *name;
if ((name = eina_list_data_get(therms)))
{
if (ecore_file_exists(name))
{
int len;
snprintf(path, sizeof(path),
"%s", ecore_file_file_get(name));
len = strlen(path);
if (len > 6) path[len - 6] = '\0';
sensor_type = SENSOR_TYPE_LINUX_PCI;
sensor_path = strdup(name);
free(sensor_name);
sensor_name = strdup(path);
printf("sensor type = pci\n"
"sensor path = %s\n"
"sensor name = %s\n",
sensor_path, sensor_name);
}
}
eina_list_free(therms);
}
}
}
}
}
#endif
}
if ((sensor_type) && (sensor_name) && (!sensor_path))
{
char *name;
switch (sensor_type)
{
case SENSOR_TYPE_NONE:
break;
case SENSOR_TYPE_FREEBSD:
#if defined (__FreeBSD__) || defined(__DragonFly__)
len = sizeof(mib) / sizeof(mib[0]);
rc = sysctlnametomib(sensor_name, mib, &len);
if (rc == 0)
{
miblen = len;
sensor_path = strdup(sensor_name);
}
#endif
break;
case SENSOR_TYPE_OPENBSD:
#ifdef __OpenBSD__
for (numt = 0; numt < snsrdev.maxnumt[SENSOR_TEMP]; numt++) {
mib[4] = numt;
slen = sizeof(snsr);
if (sysctl(mib, 5, &snsr, &slen, NULL, 0) == -1)
continue;
if (slen > 0 && (snsr.flags & SENSOR_FINVALID) == 0)
{
break;
}
}
#endif
break;
case SENSOR_TYPE_OMNIBOOK:
sensor_path = strdup("/proc/omnibook/temperature");
break;
case SENSOR_TYPE_LINUX_MACMINI:
sensor_path = strdup("/sys/devices/temperatures/cpu_temperature");
break;
case SENSOR_TYPE_LINUX_PBOOK:
sensor_path = strdup("/sys/devices/temperatures/sensor1_temperature");
break;
case SENSOR_TYPE_LINUX_INTELCORETEMP:
sensor_path = strdup("/sys/devices/platform/coretemp.0/temp1_input");
break;
case SENSOR_TYPE_LINUX_THINKPAD:
sensor_path = strdup("/sys/devices/platform/thinkpad_hwmon/temp1_input");
break;
case SENSOR_TYPE_LINUX_I2C:
therms = ecore_file_ls("/sys/bus/i2c/devices");
EINA_LIST_FREE(therms, name)
{
snprintf(path, sizeof(path),
"/sys/bus/i2c/devices/%s/%s_input",
name, sensor_name);
if (ecore_file_exists(path))
{
sensor_path = strdup(path);
/* We really only care about the first
* one for the default. */
break;
}
free(name);
}
break;
case SENSOR_TYPE_LINUX_PCI:
therms = ecore_file_ls("/sys/bus/pci/devices");
EINA_LIST_FREE(therms, name)
{
snprintf(path, sizeof(path),
"/sys/bus/pci/devices/%s/%s_input",
name, sensor_name);
if (ecore_file_exists(path))
{
sensor_path = strdup(path);
/* We really only care about the first
* one for the default. */
break;
}
free(name);
}
break;
case SENSOR_TYPE_LINUX_ACPI:
snprintf(path, sizeof(path),
"/proc/acpi/thermal_zone/%s/temperature", sensor_name);
sensor_path = strdup(path);
break;
case SENSOR_TYPE_LINUX_SYS:
snprintf(path, sizeof(path),
"/sys/class/thermal/%s/temp", sensor_name);
sensor_path = strdup(path);
break;
default:
break;
}
}
}
static int
check(void)
{
FILE *f = NULL;
int ret = 0;
int temp = 0;
char buf[4096];
#if defined (__FreeBSD__) || defined(__DragonFly__)
size_t len;
size_t ftemp = 0;
#endif
/* TODO: Make standard parser. Seems to be two types of temperature string:
* - Somename: <temp> C
* - <temp>
*/
switch (sensor_type)
{
case SENSOR_TYPE_NONE:
/* TODO: Slow down poller? */
break;
case SENSOR_TYPE_FREEBSD:
#if defined (__FreeBSD__) || defined(__DragonFly__)
len = sizeof(ftemp);
if (sysctl(mib, miblen, &ftemp, &len, NULL, 0) == 0)
{
temp = (ftemp - 2732) / 10;
ret = 1;
}
else
goto error;
#endif
break;
case SENSOR_TYPE_OPENBSD:
#ifdef __OpenBSD__
if (sysctl(mib, 5, &snsr, &slen, NULL, 0) != -1)
{
temp = (snsr.value - 273150000) / 1000000.0;
ret = 1;
}
else
goto error;
#endif
break;
case SENSOR_TYPE_OMNIBOOK:
f = fopen(sensor_path, "r");
if (f)
{
char dummy[4096];
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
if (sscanf(buf, "%s %s %i", dummy, dummy, &temp) == 3)
ret = 1;
else
goto error;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_MACMINI:
case SENSOR_TYPE_LINUX_PBOOK:
f = fopen(sensor_path, "rb");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
if (sscanf(buf, "%i", &temp) == 1)
ret = 1;
else
goto error;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_INTELCORETEMP:
case SENSOR_TYPE_LINUX_I2C:
case SENSOR_TYPE_LINUX_THINKPAD:
f = fopen(sensor_path, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
/* actually read the temp */
if (sscanf(buf, "%i", &temp) == 1)
ret = 1;
else
goto error;
/* Hack for temp */
temp = temp / 1000;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_PCI:
f = fopen(sensor_path, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
/* actually read the temp */
if (sscanf(buf, "%i", &temp) == 1)
ret = 1;
else
goto error;
/* Hack for temp */
temp = temp / 1000;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_ACPI:
f = fopen(sensor_path, "r");
if (f)
{
char *p, *q;
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
p = strchr(buf, ':');
if (p)
{
p++;
while (*p == ' ')
p++;
q = strchr(p, ' ');
if (q) *q = 0;
temp = atoi(p);
ret = 1;
}
else
goto error;
}
else
goto error;
break;
case SENSOR_TYPE_LINUX_SYS:
f = fopen(sensor_path, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f) == NULL) goto error;
fclose(f);
f = NULL;
temp = atoi(buf);
temp /= 1000;
ret = 1;
}
else
goto error;
break;
default:
break;
}
if (ret) return temp;
return -999;
error:
if (f) fclose(f);
sensor_type = SENSOR_TYPE_NONE;
E_FREE(sensor_name);
E_FREE(sensor_path);
return -999;
}
static Eina_Bool
poll_cb(void *data EINA_UNUSED)
{
int t, pp;
t = check();
pp = cur_poll_interval;
if (t != ptemp)
{
cur_poll_interval /= 2;
if (cur_poll_interval < 4) cur_poll_interval = 4;
}
else
{
cur_poll_interval *= 2;
if (cur_poll_interval > 256) cur_poll_interval = 256;
}
/* adapt polling based on if temp changes - every time it changes,
* halve the time between polls, otherwise double it, between 4 and
* 256 ticks */
if (pp != cur_poll_interval)
{
if (poller) ecore_poller_del(poller);
poller = ecore_poller_add(ECORE_POLLER_CORE, cur_poll_interval,
poll_cb, NULL);
}
if (t != ptemp)
{
if (t == -999) printf("ERROR\n");
else printf("%i\n", t);
fflush(stdout);
}
ptemp = t;
return ECORE_CALLBACK_RENEW;
}
int
main(int argc, char *argv[])
{
if (argc != 4)
{
printf("ARGS INCORRECT!\n");
return 0;
}
sensor_type = atoi(argv[1]);
sensor_name = strdup(argv[2]);
if (!strcmp(sensor_name, "-null-"))
E_FREE(sensor_name);
poll_interval = atoi(argv[3]);
cur_poll_interval = poll_interval;
ecore_init();
init();
if (poller) ecore_poller_del(poller);
poller = ecore_poller_add(ECORE_POLLER_CORE, cur_poll_interval,
poll_cb, NULL);
poll_cb(NULL);
ecore_main_loop_begin();
ecore_shutdown();
return 0;
}