OBJ_i8k_right_fan_rpm,
OBJ_i8k_ac_status,
OBJ_i8k_buttons_status,
+ OBJ_ibm_fan,
+ OBJ_ibm_temps,
+ OBJ_ibm_volume,
+ OBJ_ibm_brightness,
#endif /* __linux__ */
OBJ_if_existing,
OBJ_if_mounted,
char *s; /* some string */
int i; /* some integer */
long l; /* some other integer */
- struct net_stat *net;
+ unsigned int sensor;
+ struct net_stat *net;
struct fs_stat *fs;
unsigned char loadavg[3];
unsigned int cpu_index;
END OBJ(i8k_right_fan_rpm, INFO_I8K)
END OBJ(i8k_ac_status, INFO_I8K)
END OBJ(i8k_buttons_status, INFO_I8K)
+ END OBJ(ibm_fan, 0)
+ END OBJ(ibm_temps, 0)
+ if (!isdigit(arg[0])
+ || strlen(arg) >=2
+ || atoi(&arg[0]) >=8)
+ {
+ obj->data.sensor=0;
+ ERR("Invalid temperature sensor! Sensor number must be 0 to 7. Using 0 (CPU temp sensor).");
+ }
+ obj->data.sensor = atoi(&arg[0]);
+ END OBJ(ibm_volume, 0)
+ END OBJ(ibm_brightness, 0)
+
#endif /* __linux__ */
END OBJ(buffers, INFO_BUFFERS)
END OBJ(cached, INFO_BUFFERS)
snprintf(p, p_max_size, "%s", i8k.buttons_status);
}
+ OBJ(ibm_fan) {
+ get_ibm_acpi_fan(p, p_max_size);
+ }
+ OBJ(ibm_temps) {
+ get_ibm_acpi_temps();
+ snprintf(p, p_max_size, "%d",
+ ibm_acpi.temps[obj->data.sensor]);
+ }
+ OBJ(ibm_volume) {
+ get_ibm_acpi_volume(p, p_max_size);
+ }
+ OBJ(ibm_brightness) {
+ get_ibm_acpi_brightness(p, p_max_size);
+ }
#endif /* __linux__ */
#ifdef X11
diskio_value = tot;
}
+/* Here come the IBM ACPI-specific things. For reference, see
+ http://ibm-acpi.sourceforge.net/README
+If IBM ACPI is installed, /proc/acpi/ibm contains the following files:
+bay
+beep
+bluetooth
+brightness
+cmos
+dock
+driver
+ecdump
+fan
+hotkey
+led
+light
+thermal
+video
+volume
+The content of these files is described in detail in the aforementioned
+README - some of them also in the following functions accessing them.
+Peter Tarjan (ptarjan@citromail.hu)
+*/
+
+#define IBM_ACPI_DIR "/proc/acpi/ibm"
+
+void get_ibm_acpi_fan( char * p_client_buffer, size_t client_buffer_size )
+{
+/* get fan speed on IBM/Lenovo laptops running the ibm acpi.
+ /proc/acpi/ibm/fan looks like this (3 lines):
+status: disabled
+speed: 2944
+commands: enable, disable
+Peter Tarjan (ptarjan@citromail.hu)
+*/
+
+ if ( !p_client_buffer || client_buffer_size <= 0 )
+ return;
+
+ FILE *fp;
+ unsigned int speed=0;
+ char fan[128];
+ snprintf(fan, 127, "%s/fan",IBM_ACPI_DIR);
+
+ fp = fopen(fan, "r");
+ if (fp != NULL)
+ {
+ while (!feof(fp))
+ {
+ char line[256];
+ if (fgets(line, 255, fp) == NULL) break;
+ if (sscanf(line, "speed: %d", &speed)) break;
+ }
+ }
+ else
+ {
+ CRIT_ERR("can't open '%s': %s\nYou are not using the IBM ACPI. Remove ibm* from your Conky config file.", fan, strerror(errno));
+ }
+
+ fclose(fp);
+ snprintf( p_client_buffer, client_buffer_size, "%d", speed );
+ return;
+
+}
+
+static double last_ibm_acpi_temp_time;
+void get_ibm_acpi_temps()
+{
+/* get the measured temperatures from the temperature sensors
+ on IBM/Lenovo laptops running the ibm acpi.
+ There are 8 values in /proc/acpi/ibm/thermal, and according to
+ http://ibm-acpi.sourceforge.net/README
+ these mean the following (at least on an IBM R51...)
+0: CPU (also on the T series laptops)
+1: Mini PCI Module (?)
+2: HDD (?)
+3: GPU (also on the T series laptops)
+4: Battery (?)
+5: N/A
+6: Battery (?)
+7: N/A
+ I'm not too sure about those with the question mark, but the values I'm
+ reading from *my* thermal file (on a T42p) look realistic for the
+ hdd and the battery.
+ #5 and #7 are always -128.
+ /proc/acpi/ibm/thermal looks like this (1 line):
+temperatures: 41 43 31 46 33 -128 29 -128
+Peter Tarjan (ptarjan@citromail.hu)
+*/
+
+/* don't update too often */
+ if (current_update_time - last_ibm_acpi_temp_time < 10.00)
+ {
+ return;
+ }
+ last_ibm_acpi_temp_time = current_update_time;
+
+/* if ( !p_client_buffer || client_buffer_size <= 0 )
+ return; */
+
+ FILE *fp;
+
+ char thermal[128];
+ snprintf(thermal, 127, "%s/thermal",IBM_ACPI_DIR);
+ fp = fopen(thermal, "r");
+
+ if (fp != NULL)
+ {
+ while (!feof(fp))
+ {
+ char line[256];
+ if (fgets(line, 255, fp) == NULL) break;
+ if (sscanf(line, "temperatures: %d %d %d %d %d %d %d %d",
+ &ibm_acpi.temps[0], &ibm_acpi.temps[1],
+ &ibm_acpi.temps[2], &ibm_acpi.temps[3],
+ &ibm_acpi.temps[4], &ibm_acpi.temps[5],
+ &ibm_acpi.temps[6], &ibm_acpi.temps[7])) break;
+ }
+ }
+ else
+ {
+ CRIT_ERR("can't open '%s': %s\nYou are not using the IBM ACPI. Remove ibm* from your Conky config file.", thermal, strerror(errno));
+ }
+
+ fclose(fp);
+
+}
+
+
+void get_ibm_acpi_volume( char * p_client_buffer, size_t client_buffer_size )
+{
+
+/* get volume (0-14) on IBM/Lenovo laptops running the ibm acpi.
+ "Volume" here is none of the mixer volumes, but a "master of masters"
+ volume adjusted by the IBM volume keys.
+ /proc/acpi/ibm/fan looks like this (4 lines):
+level: 4
+mute: off
+commands: up, down, mute
+commands: level <level> (<level> is 0-15)
+Peter Tarjan (ptarjan@citromail.hu)
+*/
+
+ if ( !p_client_buffer || client_buffer_size <= 0 )
+ return;
+
+ FILE *fp;
+
+ char volume[128];
+ snprintf(volume, 127, "%s/volume",IBM_ACPI_DIR);
+ unsigned int vol=-1;
+ char mute[3]="";
+
+ fp = fopen(volume, "r");
+ if (fp != NULL)
+ {
+ while (!feof(fp))
+ {
+ char line[256];
+ if (fgets(line, 255, fp) == NULL) break;
+ if (sscanf(line, "level: %d", &vol)) continue;
+ if (sscanf(line, "mute: %s", mute)) break;
+ }
+ }
+ else
+ {
+ CRIT_ERR("can't open '%s': %s\nYou are not using the IBM ACPI. Remove ibm* from your Conky config file.", volume, strerror(errno));
+ }
+
+ fclose(fp);
+
+ if (strcmp(mute, "on")==0)
+ {
+ snprintf( p_client_buffer, client_buffer_size, "%s", "mute" );
+ return;
+ }
+ else
+ {
+ snprintf( p_client_buffer, client_buffer_size, "%d", vol );
+ return;
+ }
+
+}
+
+/*static FILE *fp=NULL;*/
+
+void get_ibm_acpi_brightness(char * p_client_buffer, size_t client_buffer_size)
+{
+/* get LCD brightness on IBM/Lenovo laptops running the ibm acpi.
+ /proc/acpi/ibm/brightness looks like this (3 lines):
+level: 7
+commands: up, down
+commands: level <level> (<level> is 0-7)
+Peter Tarjan (ptarjan@citromail.hu)
+*/
+
+ if ( !p_client_buffer || client_buffer_size <= 0 )
+ return;
+
+ FILE *fp;
+ unsigned int brightness=0;
+ char filename[128];
+ snprintf(filename, 127, "%s/brightness",IBM_ACPI_DIR);
+
+ fp = fopen(filename, "r");
+ if (fp != NULL)
+ {
+ while (!feof(fp))
+ {
+ char line[256];
+ if (fgets(line, 255, fp) == NULL) break;
+ if (sscanf(line, "level: %d", &brightness)) break;
+ }
+ }
+ else
+ {
+ CRIT_ERR("can't open '%s': %s\nYou are not using the IBM ACPI. Remove ibm* from your Conky config file.", filename, strerror(errno));
+ }
+
+ fclose(fp);
+
+ snprintf( p_client_buffer, client_buffer_size, "%d", brightness );
+ return;
+
+}