Beispiel #1
0
static void
cb_timer_apm(void *data)
{
   static FILE        *f;

   f = fopen("/proc/apm", "r");
   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;
	char               *s_ptr;

	fgets(s, 255, f);
	sscanf(s, "%*s %*s %x %x %x %x %s %s %s", &apm_flags, &ac_stat,
	       &bat_stat, &bat_flags, s1, s2, s3);
	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);

	up = bat_val - prev_bat_val;
	up2 = up;
	for (i = 0; i < 16; i++)
	   up2 = +prev_up[i];
	up2 = (up2 * 60) / 17;

	prev_up[prev_count] = up;

	prev_count++;
	if (prev_count >= 16)
	   prev_count = 0;

	s_ptr = s;

	if (bat_flags != 0xff && bat_flags & 0x80)
	  {
	     s_ptr += sprintf(s_ptr, "no battery");
	  }
	else
	  {
	     if (bat_val > 0)
		s_ptr += sprintf(s_ptr, "%i%%", bat_val);

	     switch (bat_stat)
	       {
	       case 0:
		  s_ptr += sprintf(s_ptr, ", high");
		  break;
	       case 1:
		  s_ptr += sprintf(s_ptr, ", low");
		  break;
	       case 2:
		  s_ptr += sprintf(s_ptr, ", crit.");
		  break;
	       case 3:
		  s_ptr += sprintf(s_ptr, ", charge");
		  break;
	       }
	  }
	s_ptr += sprintf(s_ptr, "\n");

	if (ac_stat == 1)
	  {
	     s_ptr += sprintf(s_ptr, "AC on-line");
	  }
	else
	  {
	     hours = time_val / 3600;
	     minutes = (time_val / 60) % 60;
	     if (up2 > 0)
		s_ptr += sprintf(s_ptr, "(%i:%02i)\n%i:%02i",
				 (((100 - bat_val) * 2 * 60) / up2) / 60,
				 (((100 - bat_val) * 2 * 60) / up2) % 60,
				 hours, minutes);
	     else
		s_ptr += sprintf(s_ptr, "%i:%02i", hours, minutes);
	  }
	Epplet_change_label(label, s);

	sprintf(s, "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");

	prev_bat_val = bat_val;
     }
   data = NULL;
}
Beispiel #2
0
static void
cb_timer_acpi(void *data)
{
   /* We don't have any data from the remaining percentage, and time directly,
    * so we have to calculate and measure them.
    * (Measure the time and calculate the percentage.)
    */
   static int          prev_bat_drain = 1;

   FILE               *f;
   DIR                *dirp;
   struct dirent      *dp;

   int                 bat_max = 0;
   int                 bat_filled = 0;
   int                 bat_level = 0;
   int                 bat_drain = 1;

   int                 bat_val = 0;

   char                current_status[256];
   char               *line = 0;
   size_t              lsize = 0;
   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. */
   dirp = opendir("/proc/acpi/battery");
   if (dirp)
     {
	while ((dp = readdir(dirp)))
	  {
	     char                buf[4096];

	     if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, "..")))
		continue;
	     snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/info",
		      dp->d_name);
	     f = fopen(buf, "r");
	     if (f)
	       {
		  int                 design_cap = 0;
		  int                 last_full = 0;

		  getline(&line, &lsize, f);
		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s %*s", buf);
		  if (!strcmp(buf, "unknown"))
		     design_cap_unknown = 1;
		  else
		     sscanf(line, "%*[^:]: %i %*s", &design_cap);
		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s %*s", buf);
		  if (!strcmp(buf, "unknown"))
		     last_full_unknown = 1;
		  else
		     sscanf(line, "%*[^:]: %i %*s", &last_full);
		  fclose(f);
		  bat_max += design_cap;
		  bat_filled += last_full;
	       }
	     snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/state",
		      dp->d_name);
	     f = fopen(buf, "r");
	     if (f)
	       {
		  char                present[256];
		  char                capacity_state[256];
		  char                charging_state[256];
		  int                 rate = 1;
		  int                 level = 0;

		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s", present);
		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s", capacity_state);
		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s", charging_state);
		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s %*s", buf);
		  if (!strcmp(buf, "unknown"))
		     rate_unknown = 1;
		  else
		     sscanf(line, "%*[^:]: %i %*s", &rate);
		  getline(&line, &lsize, f);
		  sscanf(line, "%*[^:]: %250s %*s", buf);
		  if (!strcmp(buf, "unknown"))
		     level_unknown = 1;
		  else
		     sscanf(line, "%*[^:]: %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;
	       }
	  }
	closedir(dirp);
     }

   if (prev_bat_drain < 1)
      prev_bat_drain = 1;
   if (bat_drain < 1)
      bat_drain = prev_bat_drain;
   prev_bat_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)
     {
	if (level_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "Level ???\n" "Bad Driver");
	else if (rate_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "%i%% PWR\n" "Time ???", bat_val);
	else
	   snprintf(current_status, sizeof(current_status),
		    "%i%% PWR\n" "%02i:%02i", bat_val, hours, minutes);
     }
   else if (discharging)
     {
	if (level_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "Level ???\n" "Bad Driver");
	else if (rate_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "%i%%\n" "Time ???", bat_val);
	else
	   snprintf(current_status, sizeof(current_status),
		    "%i%%\n" "%02i:%02i", bat_val, hours, minutes);
     }
   else if (!battery)
      snprintf(current_status, sizeof(current_status), "No Bat");
   else
      snprintf(current_status, sizeof(current_status), "Full");

   /* Display current status */
   Epplet_change_label(label, current_status);
   sprintf(current_status, "E-Power-Bat-%i.png", ((bat_val + 5) / 10) * 10);
   Epplet_change_image(image, 44, 24, current_status);
   Epplet_timer(cb_timer, NULL, 5.0, "TIMER");

   /* Final steps before ending the status update. */
   data = NULL;
   if (lsize)
      free(line);
}
Beispiel #3
0
static void
cb_timer_sys(void *data)
{
   /* We don't have any data from the remaining percentage, and time directly,
    * so we have to calculate and measure them.
    * (Measure the time and calculate the percentage.)
    */
   static int          prev_bat_drain = 1;

   FILE               *f;
   DIR                *dirp;
   struct dirent      *dp;

   int                 bat_max = 0;
   int                 bat_filled = 0;
   int                 bat_level = 0;
   int                 bat_drain = 1;

   int                 bat_val = 0;

   char                current_status[256];
   char               *line = 0;
   size_t              lsize = 0;
   int                 discharging = 0;
   int                 charging = 0;
   int                 battery = 0;

   int                 design_cap_unknown = 1;
   int                 last_full_unknown = 1;
   int                 rate_unknown = 1;
   int                 level_unknown = 1;

   int                 hours, minutes;

   /* Read some information on first run. */
   dirp = opendir("/sys/class/power_supply/");
   if (dirp)
     {
	while ((dp = readdir(dirp)))
	  {
	     char                buf[4096];

	     if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, ".."))
		 || (!strstr(dp->d_name, "BAT")))
		continue;
	     snprintf(buf, sizeof(buf), "/sys/class/power_supply/%s/uevent",
		      dp->d_name);
	     f = fopen(buf, "r");
	     if (f)
	       {
		  int                 design_cap = 0;
		  int                 last_full = 0;
		  char                present[256];
		  char                key[256];
		  char                capacity_state[256];
		  char                charging_state[256];
		  char                name[256];
		  int                 rate = 1;
		  int                 level = 0;

		  while (getline(&line, &lsize, f) != -1)
		    {
		       sscanf(line, "%[^=]= %250s", key, name);
		       if (strcmp(key, "POWER_SUPPLY_NAME") == 0)
			 {
			 }
		       else if (strcmp(key, "POWER_SUPPLY_STATUS") == 0)
			 {
			    sscanf(line, "%*[^=]= %250s", charging_state);
			    if (!strcmp(charging_state, "Discharging"))
			       discharging++;
			    if (!strcmp(charging_state, "Charging"))
			       charging++;
			 }
		       else if (strcmp(key, "POWER_SUPPLY_PRESENT") == 0)
			 {
			    sscanf(line, "%*[^=]= %250s", present);
			    if (!strcmp(present, "1"))
			       battery++;
			 }
		       else if (strcmp(key, "POWER_SUPPLY_CURRENT_NOW") == 0)
			 {
			    sscanf(line, "%*[^=]= %i %*s", &rate);
			    rate_unknown = 0;
			    bat_drain += (rate);
			 }
		       else if (strcmp(key, "POWER_SUPPLY_CHARGE_FULL_DESIGN")
				== 0)
			 {
			    sscanf(line, "%*[^=]=%i", &design_cap);
			    design_cap_unknown = 0;
			    bat_max += design_cap;
			 }
		       else if (strcmp(key, "POWER_SUPPLY_CHARGE_FULL") == 0)
			 {
			    sscanf(line, "%*[^=]= %i", &last_full);
			    last_full_unknown = 0;
			    bat_filled += last_full;
			 }
		       else if (strcmp(key, "POWER_SUPPLY_CHARGE_NOW") == 0)
			 {
			    sscanf(line, "%*[^=]= %i", &level);
			    level_unknown = 0;
			    bat_level += level;
			 }
		    }
		  fclose(f);
	       }
	  }
	closedir(dirp);
     }

   if (prev_bat_drain < 1)
      prev_bat_drain = 1;
   if (bat_drain < 1)
      bat_drain = prev_bat_drain;
   prev_bat_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)
     {
	if (level_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "Level ???\n" "Bad Driver");
	else if (rate_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "%i%% PWR\n" "Time ???", bat_val);
	else
	   snprintf(current_status, sizeof(current_status),
		    "%i%% PWR\n" "%02i:%02i", bat_val, hours, minutes);
     }
   else if (discharging)
     {
	if (level_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "Level ???\n" "Bad Driver");
	else if (rate_unknown)
	   snprintf(current_status, sizeof(current_status),
		    "%i%%\n" "Time ???", bat_val);
	else
	   snprintf(current_status, sizeof(current_status),
		    "%i%%\n" "%02i:%02i", bat_val, hours, minutes);
     }
   else if (!battery)
      snprintf(current_status, sizeof(current_status), "No Bat");
   else
      snprintf(current_status, sizeof(current_status), "Full");

   /* Display current status */
   Epplet_change_label(label, current_status);
   sprintf(current_status, "E-Power-Bat-%i.png", ((bat_val + 5) / 10) * 10);
   Epplet_change_image(image, 44, 24, current_status);
   Epplet_timer(cb_timer, NULL, 5.0, "TIMER");

   /* Final steps before ending the status update. */
   data = NULL;
   if (lsize)
      free(line);
}