From 2a1358264a10f3303baeebcae5b2d990c14d12f5 Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Fri, 15 Dec 2006 08:32:31 +0000 Subject: [PATCH] Only check the type of sensor on init and when changing config. SVN revision: 27464 --- src/modules/temperature/e_mod_config.c | 168 +++++------ src/modules/temperature/e_mod_main.c | 371 +++++++++++++++++-------- src/modules/temperature/e_mod_main.h | 16 +- 3 files changed, 325 insertions(+), 230 deletions(-) diff --git a/src/modules/temperature/e_mod_config.c b/src/modules/temperature/e_mod_config.c index e538527b1..d91b0afa8 100644 --- a/src/modules/temperature/e_mod_config.c +++ b/src/modules/temperature/e_mod_config.c @@ -29,7 +29,7 @@ struct _E_Config_Dialog_Data int high_temp; int sensor; - int acpizone; + Ecore_List *sensors; }; /* Protos */ @@ -67,8 +67,9 @@ _config_temperature_module(void) static void _fill_data(E_Config_Dialog_Data *cfdata) { - double p; + double p; Ecore_List *therms; + char *name; cfdata->units = temperature_config->units; if (temperature_config->units == CELCIUS) @@ -110,34 +111,46 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->high_method = TEMP_HIGH_HIGH; cfdata->sensor = 0; - if (temperature_config->sensor_name) + switch (temperature_config->sensor_type) { - if (!strcmp(temperature_config->sensor_name, "temp1")) - cfdata->sensor = 0; - else if (!strcmp(temperature_config->sensor_name, "temp2")) - cfdata->sensor = 1; - else if (!strcmp(temperature_config->sensor_name, "temp3")) - cfdata->sensor = 2; - } - cfdata->acpizone = 0; - if (temperature_config->acpi_sel) - { - therms = ecore_file_ls("/proc/acpi/thermal_zone"); - if (therms) - { - char *tzone; - int n = 0; - while ((tzone = ecore_list_next(therms))) - { - if (!strcmp(temperature_config->acpi_sel, tzone)) - { - cfdata->acpizone = n; - break; - } - else n++; - } - ecore_list_destroy(therms); - } + case SENSOR_TYPE_NONE: + break; + case SENSOR_TYPE_FREEBSD: + break; + case SENSOR_TYPE_OMNIBOOK: + break; + case SENSOR_TYPE_LINUX_MACMINI: + break; + case SENSOR_TYPE_LINUX_I2C: + ecore_list_append(cfdata->sensors, strdup("temp1")); + ecore_list_append(cfdata->sensors, strdup("temp2")); + ecore_list_append(cfdata->sensors, strdup("temp3")); + ecore_list_goto_first(cfdata->sensors); + while ((name = ecore_list_next(cfdata->sensors))) + { + if (!strcmp(temperature_config->sensor_name, name)) + break; + cfdata->sensor++; + } + break; + case SENSOR_TYPE_LINUX_ACPI: + therms = ecore_file_ls("/proc/acpi/thermal_zone"); + if (therms) + { + int n = 0; + + while ((name = ecore_list_next(therms))) + { + ecore_list_append(cfdata->sensors, strdup(name)); + if (!strcmp(temperature_config->sensor_name, name)) + { + cfdata->sensor = n; + } + n++; + } + ecore_list_destroy(therms); + } + break; } } @@ -147,6 +160,8 @@ _create_data(E_Config_Dialog *cfd) E_Config_Dialog_Data *cfdata; cfdata = E_NEW(E_Config_Dialog_Data, 1); + cfdata->sensors = ecore_list_new(); + ecore_list_set_free_cb(cfdata->sensors, free); _fill_data(cfdata); return cfdata; } @@ -155,6 +170,8 @@ static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { temperature_config->config_dialog = NULL; + if (cfdata->sensors) ecore_list_destroy(cfdata->sensors); + cfdata->sensors = NULL; free(cfdata); } @@ -276,57 +293,24 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data e_widget_framelist_object_append(of, ob); e_widget_list_object_append(o, of, 1, 1, 0.5); -#ifndef __FreeBSD__ - Ecore_List *therms; - - therms = ecore_file_ls("/proc/acpi/thermal_zone"); - if ((!therms) || (ecore_list_is_empty(therms))) + if (!ecore_list_is_empty(cfdata->sensors)) { - FILE *f; - - if (therms) - { - ecore_list_destroy(therms); - therms = NULL; - } + /* TODO: Notify user which thermal system is in use */ + /* TODO: Let the user choose the wanted thermal system */ + char *name; + int n = 0; - f = fopen("/sys/devices/temperatures/cpu_temperature", "rb"); - if (f) fclose(f); - - if (!f) + of = e_widget_framelist_add(evas, _("Sensors"), 0); + rg = e_widget_radio_group_new(&(cfdata->sensor)); + ecore_list_goto_first(cfdata->sensors); + while ((name = ecore_list_next(cfdata->sensors))) { - therms = ecore_file_ls("/sys/bus/i2c/devices"); - if ((therms) && (!ecore_list_is_empty(therms))) - { - of = e_widget_framelist_add(evas, _("Sensors"), 0); - rg = e_widget_radio_group_new(&(cfdata->sensor)); - ob = e_widget_radio_add(evas, _("Temp 1"), 0, rg); - e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Temp 2"), 1, rg); - e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Temp 3"), 2, rg); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 1, 0.5); - } - if (therms) ecore_list_destroy(therms); - } - } - else - { - of = e_widget_framelist_add(evas, _("ACPI Temperature"), 0); - rg = e_widget_radio_group_new(&(cfdata->acpizone)); - char *tzone; - int n = 0; - while ((tzone = ecore_list_next(therms))) - { - ob = e_widget_radio_add(evas, _(tzone), n, rg); + ob = e_widget_radio_add(evas, _(name), n, rg); e_widget_framelist_object_append(of, ob); n++; } e_widget_list_object_append(o, of, 1, 1, 0.5); - ecore_list_destroy(therms); } -#endif of = e_widget_framelist_add(evas, _("Check Interval"), 0); ob = e_widget_slider_add(evas, 1, 0, _("%1.1f seconds"), 0.5, 1000.0, 0.5, 0, &(cfdata->poll_time), NULL, 200); @@ -378,10 +362,6 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - int n = 0; - Ecore_List *therms; - char *tzone; - if (cfdata->unit_method != temperature_config->units) { if (cfdata->unit_method == 0) @@ -404,36 +384,12 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) temperature_config->high = cfdata->high_temp; if (temperature_config->sensor_name) evas_stringshare_del(temperature_config->sensor_name); - temperature_config->sensor_name = NULL; - switch (cfdata->sensor) - { - case 0: - temperature_config->sensor_name = evas_stringshare_add("temp1"); - break; - case 1: - temperature_config->sensor_name = evas_stringshare_add("temp2"); - break; - case 2: - temperature_config->sensor_name = evas_stringshare_add("temp3"); - break; - } - if (temperature_config->acpi_sel) - evas_stringshare_del(temperature_config->acpi_sel); - temperature_config->acpi_sel = NULL; - therms = ecore_file_ls("/proc/acpi/thermal_zone"); - if (therms) - { - while ((tzone = ecore_list_next(therms))) - { - if (n == cfdata->acpizone) - { - temperature_config->acpi_sel = evas_stringshare_add(tzone); - break; - } - n++; - } - ecore_list_destroy(therms); - } + temperature_config->sensor_name = + evas_stringshare_add(ecore_list_goto_index(cfdata->sensors, cfdata->sensor)); + if (temperature_config->sensor_path) + evas_stringshare_del(temperature_config->sensor_path); + temperature_config->sensor_path = NULL; + _temperature_face_cb_config_updated(); e_config_save_queue(); return 1; diff --git a/src/modules/temperature/e_mod_main.c b/src/modules/temperature/e_mod_main.c index 2acbb5a3b..7b19c2370 100644 --- a/src/modules/temperature/e_mod_main.c +++ b/src/modules/temperature/e_mod_main.c @@ -44,7 +44,8 @@ struct _Instance static void _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _menu_cb_post(void *data, E_Menu *m); -static int _temperature_cb_check(void *data); +static void _temperature_sensor_init(void); +static int _temperature_cb_check(void *data); static void _temperature_face_level_set(Instance *inst, double level); static void _temperature_face_cb_menu_configure(void *data, E_Menu *m, E_Menu_Item *mi); @@ -169,138 +170,249 @@ _menu_cb_post(void *data, E_Menu *m) temperature_config->menu = NULL; } +static void +_temperature_sensor_init(void) +{ + Ecore_List *therms; + char path[PATH_MAX]; +#ifdef __FreeBSD__ + int len; +#endif + + if ((!temperature_config->sensor_type) || (!temperature_config->sensor_name)) + { + if (temperature_config->sensor_name) evas_stringshare_del(temperature_config->sensor_name); + if (temperature_config->sensor_path) evas_stringshare_del(temperature_config->sensor_path); + temperature_config->sensor_path = NULL; +#ifdef __FreeBSD__ + /* TODO: FreeBSD can also have more temperature sensors! */ + temperature_config->sensor_type = SENSOR_TYPE_FREEBSD; + temperature_config->sensor_name = evas_stringshare_add("tz0"); +#else +# ifdef HAVE_OMNIBOOK + /* TODO: This does not have to be a define */ + temperature_config->sensor_type = SENSOR_TYPE_OMNIBOOK; + temperature_config->sensor_name = evas_stringshare_add("dummy"); +# else + therms = ecore_file_ls("/proc/acpi/thermal_zone"); + if ((therms) && (!ecore_list_is_empty(therms))) + { + char *name; + + name = ecore_list_next(therms); + temperature_config->sensor_type = SENSOR_TYPE_LINUX_ACPI; + temperature_config->sensor_name = evas_stringshare_add(name); + + ecore_list_destroy(therms); + } + else + { + FILE *f; + + if (therms) ecore_list_destroy(therms); + + f = fopen("/sys/devices/temperatures/cpu_temperature", "rb"); + if (f) + { + temperature_config->sensor_type = SENSOR_TYPE_LINUX_MACMINI; + temperature_config->sensor_name = evas_stringshare_add("dummy"); + } + else + { + /* TODO: Is there I2C devices with more than 3 temperature sensors? */ + /* TODO: What to do when there is more than one tempX? */ + therms = ecore_file_ls("/sys/bus/i2c/devices"); + if (therms) + { + char *name; + + while ((name = ecore_list_next(therms))) + { + char *sensors[] = { "temp1", "temp2", "temp3" }; + int i; + + for (i = 0; i < 3; i++) + { + sprintf(path, "/sys/bus/i2c/devices/%s/%s_input", + name, sensors[i]); + if (ecore_file_exists(path)) + { + temperature_config->sensor_type = SENSOR_TYPE_LINUX_I2C; + temperature_config->sensor_name = evas_stringshare_add(sensors[i]); + break; + } + } + if (temperature_config->sensor_type) break; + } + ecore_list_destroy(therms); + } + } + } + } +# endif +#endif + if ((temperature_config->sensor_type) && + (temperature_config->sensor_name) && + (!temperature_config->sensor_path)) + { + switch (temperature_config->sensor_type) + { + case SENSOR_TYPE_NONE: + break; + case SENSOR_TYPE_FREEBSD: +#ifdef __FreeBSD__ + snprintf(path, sizeof(path), "hw.acpi.thermal.%s.temperature", + temperature_config->sensor_name); + temperature_config->sensor_path = evas_stringshare_add(path); + + len = 5; + sysctlnametomib(temperature_config->sensor_path, temperature_config->mib, &len); +#endif + break; + case SENSOR_TYPE_OMNIBOOK: + temperature_config->sensor_path = evas_stringshare_add("/proc/omnibook/temperature"); + break; + case SENSOR_TYPE_LINUX_MACMINI: + temperature_config->sensor_path = evas_stringshare_add("/sys/devices/temperatures/cpu_temperature"); + break; + case SENSOR_TYPE_LINUX_I2C: + therms = ecore_file_ls("/sys/bus/i2c/devices"); + if (therms) + { + char *name; + + while ((name = ecore_list_next(therms))) + { + sprintf(path, "/sys/bus/i2c/devices/%s/%s_input", + name, temperature_config->sensor_name); + if (ecore_file_exists(path)) + { + temperature_config->sensor_path = evas_stringshare_add(path); + break; + } + } + ecore_list_destroy(therms); + } + break; + case SENSOR_TYPE_LINUX_ACPI: + snprintf(path, sizeof(path), "/proc/acpi/thermal_zone/%s/temperature", + temperature_config->sensor_name); + temperature_config->sensor_path = evas_stringshare_add(path); + break; + } + } +} + static int _temperature_cb_check(void *data) { + FILE *f; int ret = 0; Instance *inst; - Ecore_List *therms; Evas_List *l; int temp = 0; char buf[4096]; #ifdef __FreeBSD__ - static int mib[5] = {-1}; int len; #endif + _temperature_sensor_init(); + + /* TODO: Make standard parser. Seems to be two types of temperature string: + * - Somename: C + * - + */ + switch (temperature_config->sensor_type) + { + case SENSOR_TYPE_NONE: + /* TODO: Slow down timer? */ + break; + case SENSOR_TYPE_FREEBSD: #ifdef __FreeBSD__ - if (mib[0] == -1) - { - len = 5; - sysctlnametomib("hw.acpi.thermal.tz0.temperature", mib, &len); + len = sizeof(temp); + if (sysctl(mib, 5, &temp, &len, NULL, 0) != -1) + { + temp = (temp - 2732) / 10; + ret = 1; + } + else + goto error; +#endif + break; + case SENSOR_TYPE_OMNIBOOK: + f = fopen(temperature_config->sensor_path, "r"); + if (f) + { + char dummy[4096]; + + fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; + if (sscanf(buf, "%s %s %i", dummy, dummy, &temp) == 3) + ret = 1; + else + goto error; + fclose(f); + } + else + goto error; + break; + case SENSOR_TYPE_LINUX_MACMINI: + f = fopen(temperature_config->sensor_path, "rb"); + if (f) + { + fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; + if (sscanf(buf, "%i", &temp) == 1) + ret = 1; + else + goto error; + fclose(f); + } + else + goto error; + break; + case SENSOR_TYPE_LINUX_I2C: + f = fopen(temperature_config->sensor_path, "r"); + if (f) + { + fgets(buf, sizeof(buf), f); + buf[sizeof(buf) - 1] = 0; + + /* actuallty read the temp */ + if (sscanf(buf, "%i", &temp) == 1) + ret = 1; + else + goto error; + /* Hack for temp */ + temp = temp / 1000; + fclose(f); + } + else + goto error; + break; + case SENSOR_TYPE_LINUX_ACPI: + f = fopen(temperature_config->sensor_path, "r"); + if (f) + { + char *p, *q; + fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; + fclose(f); + 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; } - - if (mib[0] != -1) - { - len = sizeof(temp); - if (sysctl(mib, 5, &temp, &len, NULL, 0) != -1) - { - temp = (temp - 2732) / 10; - ret = 1; - } - } -#else -# ifdef HAVE_OMNIBOOK - FILE *f; - char dummy[256]; - - f = fopen("/proc/omnibook/temperature", "r"); - if (f) - { - fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; - if (sscanf(buf, "%s %s %i", dummy, dummy, &temp) == 3) - ret = 1; - fclose(f); - } -# else - therms = ecore_file_ls("/proc/acpi/thermal_zone"); - if ((!therms) || ecore_list_is_empty(therms)) - { - FILE *f; - if (therms) ecore_list_destroy(therms); - - f = fopen("/sys/devices/temperatures/cpu_temperature", "rb"); - if (f) - { - fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; - if (sscanf(buf, "%i", &temp) == 1) - ret = 1; - fclose(f); - } - else - { - therms = ecore_file_ls("/sys/bus/i2c/devices"); - if (therms) - { - const char *name, *sensor; - - sensor = temperature_config->sensor_name; - if (!sensor) sensor = "temp1"; - - while ((name = ecore_list_next(therms))) - { - char fname[1024]; - - sprintf(fname, "/sys/bus/i2c/devices/%s/%s_input", - name, sensor); - if (ecore_file_exists(fname)) - { - FILE *f; - - f = fopen(fname,"r"); - if (f) - { - fgets(buf, sizeof(buf), f); - buf[sizeof(buf) - 1] = 0; - - /* actuallty read the temp */ - if (sscanf(buf, "%i", &temp) == 1) - ret = 1; - /* Hack for temp */ - temp = temp / 1000; - fclose(f); - } - } - } - ecore_list_destroy(therms); - } - } - } - else - { - const char *name; - - ret = 0; - name = temperature_config->acpi_sel; - if (!name) name = ecore_list_next(therms); - if (name) - { - char *p, *q; - FILE *f; - snprintf(buf, sizeof(buf), "/proc/acpi/thermal_zone/%s/temperature", name); - f = fopen(buf, "rb"); - if (f) - { - fgets(buf, sizeof(buf), f); buf[sizeof(buf) - 1] = 0; - fclose(f); - p = strchr(buf, ':'); - if (p) - { - p++; - while (*p == ' ') p++; - q = strchr(p, ' '); - if (q) *q = 0; - temp = atoi(p); - ret = 1; - } - } - } - ecore_list_destroy(therms); - } -# endif -#endif - if (temperature_config->units == FAHRENHEIT) temp = (temp * 9.0 / 5.0) + 32; @@ -351,6 +463,17 @@ _temperature_cb_check(void *data) } } return 1; + +error: + /* TODO: Error count? Might be a temporary problem */ + /* TODO: Error dialog */ + /* TODO: This should be further up, so that it will affect the gadcon */ + temperature_config->sensor_type = SENSOR_TYPE_NONE; + if (temperature_config->sensor_name) evas_stringshare_del(temperature_config->sensor_name); + temperature_config->sensor_name = NULL; + if (temperature_config->sensor_path) evas_stringshare_del(temperature_config->sensor_path); + temperature_config->sensor_path = NULL; + return 1; } static void @@ -377,8 +500,7 @@ _temperature_face_cb_config_updated(void) { ecore_timer_del(temperature_config->temperature_check_timer); temperature_config->temperature_check_timer = - ecore_timer_add(temperature_config->poll_time, _temperature_cb_check, - NULL); + ecore_timer_add(temperature_config->poll_time, _temperature_cb_check, NULL); } /***************************************************************************/ @@ -401,9 +523,9 @@ e_modapi_init(E_Module *m) E_CONFIG_VAL(D, T, poll_time, DOUBLE); E_CONFIG_VAL(D, T, low, INT); E_CONFIG_VAL(D, T, high, INT); + E_CONFIG_VAL(D, T, sensor_type, INT); E_CONFIG_VAL(D, T, sensor_name, STR); E_CONFIG_VAL(D, T, units, INT); - E_CONFIG_VAL(D, T, acpi_sel, STR); temperature_config = e_config_domain_load("module.temperature", conf_edd); if (!temperature_config) @@ -412,9 +534,10 @@ e_modapi_init(E_Module *m) temperature_config->poll_time = 10.0; temperature_config->low = 30; temperature_config->high = 80; - temperature_config->sensor_name = evas_stringshare_add("temp1"); + temperature_config->sensor_type = SENSOR_TYPE_NONE; + temperature_config->sensor_name = NULL; + temperature_config->sensor_path = NULL; temperature_config->units = CELCIUS; - temperature_config->acpi_sel = NULL; } E_CONFIG_LIMIT(temperature_config->poll_time, 0.5, 1000.0); E_CONFIG_LIMIT(temperature_config->low, 0, 100); @@ -449,6 +572,8 @@ e_modapi_shutdown(E_Module *m) ecore_timer_del(temperature_config->temperature_check_timer); if (temperature_config->sensor_name) evas_stringshare_del(temperature_config->sensor_name); + if (temperature_config->sensor_path) + evas_stringshare_del(temperature_config->sensor_path); free(temperature_config); temperature_config = NULL; E_CONFIG_DD_FREE(conf_edd); diff --git a/src/modules/temperature/e_mod_main.h b/src/modules/temperature/e_mod_main.h index 58cf19124..f9bc9bb73 100644 --- a/src/modules/temperature/e_mod_main.h +++ b/src/modules/temperature/e_mod_main.h @@ -12,13 +12,24 @@ typedef enum _Unit FAHRENHEIT } Unit; +typedef enum _Sensor_Type +{ + SENSOR_TYPE_NONE, + SENSOR_TYPE_FREEBSD, + SENSOR_TYPE_OMNIBOOK, + SENSOR_TYPE_LINUX_MACMINI, + SENSOR_TYPE_LINUX_I2C, + SENSOR_TYPE_LINUX_ACPI +} Sensor_Type; + struct _Config { /* saved * loaded config values */ double poll_time; int low, high; + Sensor_Type sensor_type; const char *sensor_name; - const char *acpi_sel; + const char *sensor_path; Unit units; /* just config state */ E_Module *module; @@ -27,6 +38,9 @@ struct _Config E_Menu *menu; Ecore_Timer *temperature_check_timer; unsigned char have_temp; +#ifdef __FreeBSD__ + int mib[5]; +#endif }; EAPI extern E_Module_Api e_modapi;