# --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: package/.../epplets16/epower-acpi.patch # Copyright (C) 2004 - 2006 The T2 SDE Project # # More information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # --- SDE-COPYRIGHT-NOTE-END --- --- epplets-0.7/epplets/E-Power.c 2001-10-13 20:32:19.000000000 +0200 +++ epplets-0.7-jsaw/epplets/E-Power.c 2005-07-26 00:05:04.000000000 +0200 @@ -1,22 +1,40 @@ #include "epplet.h" +int use_acpi = 0; +#define MAX_ACPI_BAT 4 +struct __acpibat { + /* info */ + int present[MAX_ACPI_BAT]; + int design_capacity[MAX_ACPI_BAT]; + + int last_full_capacity[MAX_ACPI_BAT]; + int design_capacity_warning[MAX_ACPI_BAT]; + int design_capacity_low[MAX_ACPI_BAT]; +} acpibat; + int prev_bat_val = 110; -int bat_val = 0; -int time_val = 0; +int bat_num = 0; +int bat_val = 0, ac_stat, bat_stat, bat_flags; + +int up2, time_val = 0; int prev_up[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int prev_count = 0; Epplet_gadget b_close, b_suspend, b_sleep, b_help, image, label; +static void power_setup(void); + static void cb_timer(void *data); static void cb_close(void *data); static void cb_in(void *data, Window w); static void cb_out(void *data, Window w); static void cb_help(void *data); -static void -cb_timer(void *data) +static int cb_apm(); +static int cb_acpi(); + +static int cb_apm() { static FILE *f; @@ -24,8 +42,8 @@ if (f) { char s[256], s1[32], s2[32], s3[32]; - int apm_flags, ac_stat, bat_stat, bat_flags; - int i, hours, minutes, up, up2; + int apm_flags; + int i, up; char *s_ptr; fgets(s, 255, f); @@ -49,13 +67,111 @@ prev_count++; if (prev_count >= 16) prev_count = 0; + } +} + +#define TAG(tag) !strncmp(tag, s, strlen(tag)) +static int cb_acpi() +{ + FILE *f; + char s[256], *s_val; + int rate = 0, remain = 0; + + bat_num++; + while ((bat_num < MAX_ACPI_BAT) && (acpibat.present[bat_num] < 0)) bat_num++; + if (bat_num >= MAX_ACPI_BAT) + bat_num = 0; + + if (acpibat.present[bat_num] <= 0) { + bat_flags = 0x80; + return 0; + } + + bat_flags = 0x00; + + /* parse state */ + snprintf(s, 256, "/proc/acpi/battery/BAT%d/state", bat_num); + f = fopen(s, "r"); + if (!f) { + bat_flags = 0x80; + return 0; + } + + while (!feof(f)) { + if (fgets(s, 256, f)) + { + s_val = s; + while(*s_val != ':') s_val++; s_val++; + while((*s_val == ' ')||(*s_val == '\t')) s_val++; - s_ptr = s; + /* FIXME "capacity state:" ??? */ + if (TAG("charging state:")) + { + if (!strncmp(s_val, "char", 4)) { + ac_stat = 1; + bat_stat = 3; /* CHARGING */ + } + else { + ac_stat = 0; + bat_stat = 0; + } + } + else if (TAG("present rate:")) { + rate = strtol(s_val, NULL, 10); + } + else if (TAG("remaining capacity:")) { + remain = strtol(s_val, NULL, 10); + } + else if (TAG("present rate:")) { + rate = strtol(s_val, NULL, 10); + } + } + } + fclose(f); + + bat_val = (remain * 100) / acpibat.last_full_capacity[bat_num]; + if (bat_stat != 3) { + if (remain < acpibat.design_capacity_low[bat_num]) + bat_stat = 2; + else if (remain < acpibat.design_capacity_warning[bat_num]) + bat_stat = 1; + else + bat_stat = 0; + + time_val = (remain * 3600)/rate; + } + else { + time_val = ((acpibat.last_full_capacity[bat_num]-remain) * 3600)/rate; + } + + /* + up2 ???? + */ + + return 0; +} +static void +cb_timer(void *data) +{ + int fail; + char s[256]; + char *s_ptr = s; + int hours, minutes; + + if (use_acpi) fail = cb_acpi(); + else fail = cb_apm(); + + if (!fail) + { + /* convert to display */ if( bat_flags != 0xff && bat_flags & 0x80 ) { - s_ptr += sprintf( s_ptr, "no battery" ); + if (use_acpi) + s_ptr += sprintf( s_ptr, "no bat. [%d]", bat_num ); + else + s_ptr += sprintf( s_ptr, "no battery" ); } else { @@ -97,9 +213,10 @@ else s_ptr += sprintf(s_ptr, "%i:%02i", hours, minutes); } + s_ptr += sprintf( s_ptr, " [%d]", bat_num ); Epplet_change_label(label, s); - sprintf(s, EROOT"/epplet_data/E-Power//E-Power-Bat-%i.png", + sprintf(s, EROOT"/epplet_data/E-Power/E-Power-Bat-%i.png", ((bat_val + 5) / 10) * 10); Epplet_change_image(image, 44, 24, s); Epplet_timer(cb_timer, NULL, 30.0, "TIMER"); @@ -170,6 +287,8 @@ int main(int argc, char **argv) { + power_setup(); + Epplet_Init("E-Power", "0.1", "Enlightenment Laptop Power Epplet", 3, 3, argc, argv, 0); atexit(Epplet_cleanup); @@ -200,3 +319,69 @@ Epplet_Loop(); return 0; } + +static void power_setup(void) +{ + FILE *f; + + f = fopen("/proc/apm", "r"); + if (f) + { + fclose(f); + } + else + { /* try acpi */ + int i; + char s[256]; + char *s_val; + + memset(&acpibat, 0, sizeof(struct __acpibat)); + + for(i=0; i<MAX_ACPI_BAT; i++) { + snprintf(s, 256, "/proc/acpi/battery/BAT%d/info", i); + acpibat.present[i] = -1; + + f = fopen(s, "r"); + if (f) + { + use_acpi++; + + while (!feof(f)) { + if (fgets(s, 256, f)) + { + s_val = s; + while(*s_val != ':') s_val++; s_val++; + while((*s_val == ' ')||(*s_val == '\t')) s_val++; + + if (TAG("present:")) + { + if (!strncmp(s_val, "yes", 3)) + acpibat.present[i] = 1; + else + acpibat.present[i] = 0; + } + else if (TAG("design capacity:")) + { + acpibat.design_capacity[i] = strtol(s_val, NULL, 10); + } + else if (TAG("last full capacity:")) + { + acpibat.last_full_capacity[i] = strtol(s_val, NULL, 10); + } + else if (TAG("design capacity warning:")) + { + acpibat.design_capacity_warning[i] = strtol(s_val, NULL, 10); + } + else if (TAG("design capacity low:")) + { + acpibat.design_capacity_low[i] = strtol(s_val, NULL, 10); + } + } + + } + + fclose(f); + } + } + } +}