You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
6.4 KiB
278 lines
6.4 KiB
# --- 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); |
|
+ } |
|
+ } |
|
+ } |
|
+}
|
|
|