From a94ba7cbfdeb310c32b5d4655631d2612e66fb40 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Wed, 30 Nov 2016 17:06:45 +0900 Subject: [PATCH] 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. --- src/modules/Makefile_temperature.mk | 11 +- src/modules/temperature/e_mod_config.c | 44 ++ src/modules/temperature/e_mod_main.c | 242 ++++----- src/modules/temperature/e_mod_main.h | 41 +- src/modules/temperature/e_mod_tempget.c | 642 +++++++++++++++++++++--- src/modules/temperature/e_mod_udev.c | 70 +-- src/modules/temperature/tempget.c | 634 ----------------------- 7 files changed, 752 insertions(+), 932 deletions(-) delete mode 100644 src/modules/temperature/tempget.c diff --git a/src/modules/Makefile_temperature.mk b/src/modules/Makefile_temperature.mk index b58306394..d1cb7fb76 100644 --- a/src/modules/Makefile_temperature.mk +++ b/src/modules/Makefile_temperature.mk @@ -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 diff --git a/src/modules/temperature/e_mod_config.c b/src/modules/temperature/e_mod_config.c index 57f521217..597184ec8 100644 --- a/src/modules/temperature/e_mod_config.c +++ b/src/modules/temperature/e_mod_config.c @@ -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) { diff --git a/src/modules/temperature/e_mod_main.c b/src/modules/temperature/e_mod_main.c index 345b7e6ca..41e1c3842 100644 --- a/src/modules/temperature/e_mod_main.c +++ b/src/modules/temperature/e_mod_main.c @@ -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 */ diff --git a/src/modules/temperature/e_mod_main.h b/src/modules/temperature/e_mod_main.h index 08a60b1ee..b096b4f5a 100644 --- a/src/modules/temperature/e_mod_main.h +++ b/src/modules/temperature/e_mod_main.h @@ -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 diff --git a/src/modules/temperature/e_mod_tempget.c b/src/modules/temperature/e_mod_tempget.c index 5091d07b8..d4078c3ee 100644 --- a/src/modules/temperature/e_mod_tempget.c +++ b/src/modules/temperature/e_mod_tempget.c @@ -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 +# include +# include +#endif + +#ifdef __OpenBSD__ +#include +#include +#include +#include +#include +#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: C + * - + */ + 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; } diff --git a/src/modules/temperature/e_mod_udev.c b/src/modules/temperature/e_mod_udev.c index f0fafd061..1dafb3109 100644 --- a/src/modules/temperature/e_mod_udev.c +++ b/src/modules/temperature/e_mod_udev.c @@ -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; } diff --git a/src/modules/temperature/tempget.c b/src/modules/temperature/tempget.c deleted file mode 100644 index c5153b7c9..000000000 --- a/src/modules/temperature/tempget.c +++ /dev/null @@ -1,634 +0,0 @@ -#include "e.h" - -#if defined (__FreeBSD__) || defined(__DragonFly__) -# include -# include -# include -#endif - -#ifdef __OpenBSD__ -#include -#include -#include -#include -#include -#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: C - * - - */ - 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; -} -