forked from enlightenment/enlightenment
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:
parent
8934ada4d8
commit
a94ba7cbfd
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue