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); | 
						|
+	  } | 
						|
+      } | 
						|
+    } | 
						|
+}
 | 
						|
 |