Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/modules/battery


Modified Files:
        e_mod_main.c e_mod_main.h 


Log Message:


battery modules now... works... in theory. i have to test it on a real
laptop...

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/battery/e_mod_main.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- e_mod_main.c        27 Dec 2004 08:33:51 -0000      1.1
+++ e_mod_main.c        27 Dec 2004 10:49:46 -0000      1.2
@@ -19,6 +19,10 @@
 static void     _battery_cb_face_up(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
 static void     _battery_cb_face_move(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
 static int      _battery_cb_event_container_resize(void *data, int type, void 
*event);
+static int      _battery_cb_check(void *data);
+static int      _battery_linux_acpi_check(Battery_Face *ef);
+static int      _battery_linux_apm_check(Battery_Face *ef);
+static void     _battery_level_set(Battery_Face *ef, double level);
 
 /* public module routines. all modules must have these */
 void *
@@ -222,6 +226,14 @@
 
    _battery_face_reconfigure(ef);
    
+   ef->battery_check_mode = CHECK_NONE;
+   ef->battery_prev_drain = 1;
+   ef->battery_prev_ac = -1;
+   ef->battery_prev_battery = -1;
+   ef->battery_check_timer = ecore_timer_add(5.0, _battery_cb_check, ef);
+   
+   _battery_cb_check(ef);
+   
    evas_event_thaw(ef->evas);
 }
 
@@ -347,3 +359,318 @@
    _battery_face_reconfigure(ef);
    return 1;
 }
+
+static int
+_battery_cb_check(void *data)
+{
+   Battery_Face *ef;
+   int ret = 0;
+   
+   ef = data;
+   if (ef->battery_check_mode == 0)
+     {
+       if (e_file_is_dir("/proc/acpi"))
+         ef->battery_check_mode = CHECK_LINUX_ACPI;
+       else if (e_file_is_dir("/proc/apm"))
+         ef->battery_check_mode = CHECK_LINUX_APM;
+     }
+   switch (ef->battery_check_mode)
+     {
+      case CHECK_LINUX_ACPI:
+       ret = _battery_linux_acpi_check(ef);
+       break;
+      case CHECK_LINUX_APM:
+       ret = _battery_linux_acpi_check(ef);
+       break;
+      default:
+       break;
+     }
+   if (!ret)
+     {
+       if (ef->battery_prev_battery != -2)
+         {
+            edje_object_signal_emit(ef->bat_object, "unknown", "");
+            ef->battery_prev_battery = -2;
+         }
+       edje_object_part_text_set(ef->bat_object, "reading", "NO INFO");
+       edje_object_part_text_set(ef->bat_object, "time", "--:--");
+       ef->battery_check_mode = CHECK_NONE;
+       _battery_level_set(ef, (double)(rand() & 0xff) / 255.0);
+     }
+   return 1;
+}
+
+static int
+_battery_linux_acpi_check(Battery_Face *ef)
+{
+   Evas_List *bats;
+   char buf[4096], buf2[4096];
+   
+   int bat_max = 0;
+   int bat_filled = 0;
+   int bat_level = 0;
+   int bat_drain = 1;
+   
+   int bat_val = 0;
+   
+   char current_status[256];
+   int discharging = 0;
+   int charging = 0;
+   int battery = 0;
+   
+   int design_cap_unknown = 0;
+   int last_full_unknown = 0;
+   int rate_unknown = 0;
+   int level_unknown = 0;
+   
+   int hours, minutes;
+   
+   /* Read some information on first run. */
+   bats = e_file_ls("/proc/acpi/battery");
+   if (!bats) return 0;
+   while (bats) 
+     {
+       FILE *f;
+       char *name;
+       
+       name = bats->data;
+       if ((!strcmp(name, ".")) || (!strcmp(name, "..")))
+         {
+            bats = evas_list_remove_list(bats, bats);
+            free(name);
+            continue;
+         }
+       snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/info", name);
+       f = fopen(buf, "r");
+       if (f)
+         {
+            int design_cap = 0;
+            int last_full = 0;
+            
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s %*s", buf);
+            if (!strcmp(buf, "unknown")) design_cap_unknown = 1;
+            else sscanf(buf2, "%*[^:]: %i %*s", &design_cap);
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s %*s", buf);
+            if (!strcmp(buf, "unknown")) last_full_unknown = 1;
+            else sscanf(buf2, "%*[^:]: %i %*s", &last_full);
+            fclose(f);
+            bat_max += design_cap;
+            bat_filled += last_full;
+         }
+       snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/state", name);
+       f = fopen(buf, "r");
+       if (f)
+         {
+            char present[256];
+            char capacity_state[256];
+            char charging_state[256];
+            int rate = 1;
+            int level = 0;
+            
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s", present);
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s", capacity_state);
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s", charging_state);
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s %*s", buf);
+            if (!strcmp(buf, "unknown")) rate_unknown = 1;
+            else sscanf(buf2, "%*[^:]: %i %*s", &rate);
+            fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
+            sscanf(buf2, "%*[^:]: %250s %*s", buf);
+            if (!strcmp(buf, "unknown")) level_unknown = 1;
+            else sscanf(buf2, "%*[^:]: %i %*s", &level);
+            fclose(f);
+            if (!strcmp(present, "yes")) battery++;
+            if (!strcmp(charging_state, "discharging")) discharging++;
+            if (!strcmp(charging_state, "charging")) charging++;
+            bat_drain += rate;
+            bat_level += level;
+         }
+       bats = evas_list_remove_list(bats, bats);
+       free(name);
+     }
+   if (ef->battery_prev_drain < 1) ef->battery_prev_drain = 1;
+   if (bat_drain < 1) bat_drain = ef->battery_prev_drain;
+   ef->battery_prev_drain = bat_drain;
+   
+   if (bat_filled > 0) bat_val = (100 * bat_level) / bat_filled;
+   else bat_val = 100;
+   
+   if (discharging) minutes = (60 * bat_level) / bat_drain;
+   else
+     {
+       if (bat_filled > 0)
+         minutes = (60 * (bat_filled - bat_level)) / bat_drain;
+       else
+         minutes = 0;
+     }
+   hours = minutes / 60;
+   minutes -= (hours * 60);
+   
+   if ((charging) || (discharging))
+     {
+       ef->battery_prev_battery = 1;
+       if ((charging ) && (ef->battery_prev_ac == 0))
+         {
+            edje_object_signal_emit(ef->bat_object, "charge", "");
+            ef->battery_prev_ac = 1;
+         }
+       else if ((discharging) && (ef->battery_prev_ac == 1))
+         {
+            edje_object_signal_emit(ef->bat_object, "discharge", "");
+            ef->battery_prev_ac = 0;
+         }
+       if (level_unknown)
+         {
+            edje_object_part_text_set(ef->bat_object, "reading", "BAD DIRVER");
+            edje_object_part_text_set(ef->bat_object, "time", "--:--");
+            _battery_level_set(ef, 0.0);
+         }
+       else if (rate_unknown)
+         {
+            snprintf(buf, sizeof(buf), "%i%%", bat_val);
+            edje_object_part_text_set(ef->bat_object, "reading", buf);
+            edje_object_part_text_set(ef->bat_object, "time", "--:--");
+            _battery_level_set(ef, (double)bat_val / 100.0);
+         }
+       else
+         {
+            snprintf(buf, sizeof(buf), "%i%%", bat_val);
+            edje_object_part_text_set(ef->bat_object, "reading", buf);
+            snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes);
+            edje_object_part_text_set(ef->bat_object, "time", buf);
+            _battery_level_set(ef, (double)bat_val / 100.0);
+         }
+     }
+   else if (!battery)
+     {
+       if (ef->battery_prev_battery != 0)
+         {
+            edje_object_signal_emit(ef->bat_object, "unknown", "");
+            ef->battery_prev_battery = 0;
+         }
+       edje_object_part_text_set(ef->bat_object, "reading", "NO BAT");
+       edje_object_part_text_set(ef->bat_object, "time", "--:--");
+       _battery_level_set(ef, 1.0);
+     }
+   else
+     {
+       if (ef->battery_prev_battery == 0)
+         {
+            edje_object_signal_emit(ef->bat_object, "charge", "");
+            ef->battery_prev_battery = 1;
+         }
+       edje_object_part_text_set(ef->bat_object, "reading", "FULL");
+       edje_object_part_text_set(ef->bat_object, "time", "--:--");
+       _battery_level_set(ef, 1.0);
+     }
+   return 1;
+}
+
+static int
+_battery_linux_apm_check(Battery_Face *ef)
+{
+   FILE *f;
+   char s[256], s1[32], s2[32], s3[32], buf[4096];
+   int  apm_flags, ac_stat, bat_stat, bat_flags, bat_val, time_val;
+   int  hours, minutes;
+   
+   f = fopen("/proc/apm", "r");
+   if (!f) return 0;
+            
+   fgets(s, sizeof(s), f); s[sizeof(s) - 1] = 0;
+   if (sscanf(s, "%*s %*s %x %x %x %x %s %s %s", 
+             &apm_flags, &ac_stat, &bat_stat, &bat_flags, s1, s2, s3) != 7)
+     {
+       fclose(f);
+       return 0;
+     }
+   s1[strlen(s1) - 1] = 0;
+   bat_val = atoi(s1);
+   if (!strcmp(s3, "sec")) time_val = atoi(s2);
+   else if (!strcmp(s3, "min")) time_val = atoi(s2) * 60;
+   fclose(f);
+   
+   if ((bat_flags != 0xff) && (bat_flags & 0x80))
+     {
+       if (ef->battery_prev_battery != 0)
+         {
+            edje_object_signal_emit(ef->bat_object, "unknown", "");
+            ef->battery_prev_battery = 0;
+         }
+       edje_object_part_text_set(ef->bat_object, "reading", "NO BAT");
+       edje_object_part_text_set(ef->bat_object, "time", "--:--");
+       _battery_level_set(ef, 1.0);
+     }
+   else
+     {
+       ef->battery_prev_battery = 1;
+       if (bat_val > 0)
+         {
+            snprintf(buf, sizeof(buf), "%i%%", bat_val);
+            edje_object_part_text_set(ef->bat_object, "reading", buf);
+            _battery_level_set(ef, (double)bat_val / 100.0);
+         }
+       else
+         {
+            switch( bat_stat )
+              {
+               case 0:
+                 edje_object_part_text_set(ef->bat_object, "reading", "High");
+                 _battery_level_set(ef, 1.0);
+                 break;
+               case 1:
+                 edje_object_part_text_set(ef->bat_object, "reading", "Low");
+                 _battery_level_set(ef, 0.50);
+                 break;
+               case 2:
+                 edje_object_part_text_set(ef->bat_object, "reading", 
"Danger");
+                 _battery_level_set(ef, 0.25);
+                 break;
+               case 3:
+                 edje_object_part_text_set(ef->bat_object, "reading", 
"Charge");
+                 _battery_level_set(ef, 1.0);
+                 break;
+              }
+         }
+     }
+   
+   if (ac_stat == 1)
+     {
+       if ((ac_stat == 1) && (ef->battery_prev_ac == 0))
+         {
+            edje_object_signal_emit(ef->bat_object, "charge", "");
+            ef->battery_prev_ac = 1;
+         }
+       else if ((ac_stat == 0) && (ef->battery_prev_ac == 1))
+         {
+            edje_object_signal_emit(ef->bat_object, "discharge", "");
+            ef->battery_prev_ac = 0;
+         }
+       edje_object_part_text_set(ef->bat_object, "time", "--:--");
+     }
+   else
+     {
+       hours = time_val / 3600;
+       minutes = (time_val / 60) % 60;
+       snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes);
+       edje_object_part_text_set(ef->bat_object, "time", buf);
+     }
+   return 1;
+}
+
+static void
+_battery_level_set(Battery_Face *ef, double level)
+{
+   Edje_Message_Float msg;
+   
+   if (level < 0.0) level = 0.0;
+   else if (level > 1.0) level = 1.0;
+   msg.val = level;
+   edje_object_message_send(ef->bat_object, EDJE_MESSAGE_FLOAT, 1, &msg);
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/battery/e_mod_main.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- e_mod_main.h        27 Dec 2004 08:33:51 -0000      1.1
+++ e_mod_main.h        27 Dec 2004 10:49:46 -0000      1.2
@@ -5,6 +5,10 @@
 typedef struct _Battery      Battery;
 typedef struct _Battery_Face Battery_Face;
 
+#define CHECK_NONE 0
+#define CHECK_LINUX_ACPI 1
+#define CHECK_LINUX_APM 2
+
 struct _Config
 {
    int width;
@@ -35,7 +39,13 @@
    unsigned char   resize : 1;
    Evas_Coord      xx, yy;
    Evas_Coord      fx, fy, fw;
-
+   
+   int                  battery_check_mode;
+   Ecore_Timer         *battery_check_timer;
+   int                  battery_prev_drain;
+   int                  battery_prev_ac;
+   int                  battery_prev_battery;
+   
    Ecore_Event_Handler *ev_handler_container_resize;
 };
 




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
http://productguide.itmanagersjournal.com/
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to