8cd89ee
Author: Evgeni Golov <evgeni@debian.org>, Michael Meskes <meskes@debian.org>
8cd89ee
Description: Fix reading of battery information.
8cd89ee
8cd89ee
--- acpitool-0.5.1/src/acpitool.h	2008-10-16 17:38:12.000000000 +0200
8cd89ee
+++ acpitool-0.5.1.fixed/src/acpitool.h	2010-03-28 11:35:12.000000000 +0200
8cd89ee
@@ -39,6 +39,9 @@
8cd89ee
     char Serial[13];
8cd89ee
     char Bat_Type[13];
8cd89ee
     char Voltage_Now[13];
8cd89ee
+    char Charge_Now[13];
8cd89ee
+    char Charge_Full[13];
8cd89ee
+    char Charge_Full_Design[13];
8cd89ee
 };
8cd89ee
 
8cd89ee
 
8cd89ee
--- acpitool-0.5.1/src/battery.cpp	2009-08-13 21:42:43.000000000 +0200
8cd89ee
+++ acpitool-0.5.1.fixed/src/battery.cpp	2010-03-28 13:46:40.000000000 +0200
8cd89ee
@@ -107,6 +107,9 @@
8cd89ee
 	    memset(Batt_Info[i]->Serial, '\0', 13);
8cd89ee
 	    memset(Batt_Info[i]->Bat_Type, '\0', 13); 
8cd89ee
 	    memset(Batt_Info[i]->Voltage_Now, '\0', 13); 
8cd89ee
+	    memset(Batt_Info[i]->Charge_Now, '\0', 13);
8cd89ee
+	    memset(Batt_Info[i]->Charge_Full, '\0', 13);
8cd89ee
+	    memset(Batt_Info[i]->Charge_Full_Design, '\0', 13);
8cd89ee
 	    
8cd89ee
 	    // initialize all struct members to blanks --> avoid rubbish in output //
8cd89ee
 			
8cd89ee
@@ -139,7 +142,12 @@
8cd89ee
 		case 1 : 
8cd89ee
 		{	
8cd89ee
 	    	    Present_Batteries++;
8cd89ee
-		    Remaining_Percentage = float(atoi(Batt_Info[i]->Remaining_Cap)) / float(atoi(Batt_Info[i]->LastFull_Cap)) * 100.0;
8cd89ee
+
8cd89ee
+		    if (strcmp(Batt_Info[i]->Charge_Now,"")!=0 &&
8cd89ee
+			strcmp(Batt_Info[i]->Charge_Now,"unknown")!=0)
8cd89ee
+		    	Remaining_Percentage = float(atoi(Batt_Info[i]->Charge_Now)) / float(atoi(Batt_Info[i]->Charge_Full)) * 100.0;
8cd89ee
+		    else
8cd89ee
+			Remaining_Percentage = float(atoi(Batt_Info[i]->Remaining_Cap)) / float(atoi(Batt_Info[i]->LastFull_Cap)) * 100.0;
8cd89ee
 		    
8cd89ee
 		    /* from Alan Pope : some broken Dell batteries report a remaining capacity bigger
8cd89ee
 		       than their last full capacity or their design capacity. This led acpitool to report
8cd89ee
@@ -153,19 +161,24 @@
8cd89ee
             	    else
8cd89ee
             		Precision = 4;
8cd89ee
             	    
8cd89ee
-		    if( strncmp(Batt_Info[i]->Charging_State,"char",4)==0 ) 
8cd89ee
+		    if(strncasecmp(Batt_Info[i]->Charging_State,"char",4)==0)
8cd89ee
 		    {
8cd89ee
 			Is_Charging = 1;
8cd89ee
 		    }
8cd89ee
 		    else
8cd89ee
 		    {
8cd89ee
-			if(strncmp(Batt_Info[i]->Charging_State,"disch",5)==0) Is_Discharging = 1;
8cd89ee
+			if(strncasecmp(Batt_Info[i]->Charging_State,"disch",5)==0) Is_Discharging = 1;
8cd89ee
 		    }
8cd89ee
 		    		    
8cd89ee
 	    	    if(Show_Time)      // calculate remaining or charging time only if present battery rate != 0 //
8cd89ee
 	    	    {
8cd89ee
-			if(Is_Charging)
8cd89ee
-			  Remaining_Time = (float(atoi(Batt_Info[i]->LastFull_Cap)) - float(atoi(Batt_Info[i]->Remaining_Cap))) / float(atoi(Batt_Info[i]->Present_Rate)); 
8cd89ee
+			if(Is_Charging) {
8cd89ee
+			  if (strcmp(Batt_Info[i]->Charge_Now,"")!=0 &&
8cd89ee
+			      strcmp(Batt_Info[i]->Charge_Now,"unknown")!=0)
8cd89ee
+			  	Remaining_Time = (float(atoi(Batt_Info[i]->Charge_Full)) - float(atoi(Batt_Info[i]->Charge_Now))) / float(atoi(Batt_Info[i]->Present_Rate));
8cd89ee
+			  else
8cd89ee
+			  	Remaining_Time = (float(atoi(Batt_Info[i]->LastFull_Cap)) - float(atoi(Batt_Info[i]->Remaining_Cap))) / float(atoi(Batt_Info[i]->Present_Rate)); 
8cd89ee
+			}
8cd89ee
 			else
8cd89ee
 			  Remaining_Time = float(atoi(Batt_Info[i]->Remaining_Cap)) / float(atoi(Batt_Info[i]->Present_Rate)); 
8cd89ee
 			// this represents hours //
8cd89ee
@@ -180,9 +193,11 @@
8cd89ee
 			Minutes = Time_In_Seconds / 60;
8cd89ee
 			Time_In_Seconds = Time_In_Seconds - (Minutes * 60);
8cd89ee
 	    	    }
8cd89ee
-		    
8cd89ee
+		   
8cd89ee
 		    if(atoi(Batt_Info[i]->Design_Cap) > 0)
8cd89ee
 		      Battery_Left_Percent = float(atoi(Batt_Info[i]->LastFull_Cap)) / float(atoi(Batt_Info[i]->Design_Cap)) * 100.0;
8cd89ee
+		    else if(atoi(Batt_Info[i]->Charge_Full_Design) > 0)
8cd89ee
+		      Battery_Left_Percent = float(atoi(Batt_Info[i]->Charge_Full)) / float(atoi(Batt_Info[i]->Charge_Full_Design)) * 100.0;
8cd89ee
 		    else
8cd89ee
 		      Battery_Left_Percent = -1.0;
8cd89ee
 		      			  
8cd89ee
@@ -207,8 +222,15 @@
8cd89ee
 				    <
8cd89ee
 				 cout<
8cd89ee
 				 
8cd89ee
-				 cout<<"    Design capacity    : "<<Batt_Info[i]->Design_Cap<
8cd89ee
-				 cout<<"    Last full capacity : "<<Batt_Info[i]->LastFull_Cap;
8cd89ee
+		    		 if(atoi(Batt_Info[i]->Design_Cap) > 0)
8cd89ee
+				 	cout<<"    Design capacity    : "<<Batt_Info[i]->Design_Cap<
8cd89ee
+				 else if(atoi(Batt_Info[i]->Charge_Full_Design) > 0)
8cd89ee
+				 	cout<<"    Design capacity    : "<<Batt_Info[i]->Charge_Full_Design<
8cd89ee
+
8cd89ee
+		    		 if(atoi(Batt_Info[i]->LastFull_Cap) > 0)
8cd89ee
+					cout<<"    Last full capacity : "<<Batt_Info[i]->LastFull_Cap;
8cd89ee
+				 else if(atoi(Batt_Info[i]->Charge_Full) > 0)
8cd89ee
+					cout<<"    Last full capacity : "<<Batt_Info[i]->Charge_Full;
8cd89ee
 				 
8cd89ee
 				 if(Battery_Left_Percent<100.0)
8cd89ee
 				 {
8cd89ee
@@ -327,7 +349,7 @@
8cd89ee
 
8cd89ee
 
8cd89ee
 
8cd89ee
-int Get_Battery_Info_from_Proc(const int bat_nr, Battery_Info *bat_info, int verbose)
8cd89ee
+int Get_Battery_Info_from_Proc(const int bat_nr, Battery_Info *batt_info, int verbose)
8cd89ee
 {
8cd89ee
     ifstream file_in;
8cd89ee
     char filename[4][65], str[100], temp[100];
8cd89ee
@@ -378,7 +400,7 @@
8cd89ee
     {
8cd89ee
 	if(!verbose)
8cd89ee
    	{
8cd89ee
-   	    bat_info->Battery_Present = 2;     // 2 represents error value //
8cd89ee
+   	    batt_info->Battery_Present = 2;     // 2 represents error value //
8cd89ee
    	    return 0;
8cd89ee
    	}
8cd89ee
    	else
8cd89ee
@@ -422,24 +444,24 @@
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
     	strncpy(temp, str+25, 4);
8cd89ee
     	if(strncmp(temp,"yes",3)==0)
8cd89ee
-    	    bat_info->Battery_Present = 1;               //yes, we have a battery //
8cd89ee
+    	    batt_info->Battery_Present = 1;               //yes, we have a battery //
8cd89ee
     	else
8cd89ee
     	{
8cd89ee
-    	    bat_info->Battery_Present = 0;
8cd89ee
+    	    batt_info->Battery_Present = 0;
8cd89ee
     	    return 0;                  //bail out if battery is not present //
8cd89ee
     	}
8cd89ee
     	
8cd89ee
 	// then get the design capacity //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Design_Cap, str+25, 9);
8cd89ee
+    	strncpy(batt_info->Design_Cap, str+25, 9);
8cd89ee
 	
8cd89ee
     	// then get the last full capacity //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->LastFull_Cap, str+25, 9);
8cd89ee
+    	strncpy(batt_info->LastFull_Cap, str+25, 9);
8cd89ee
 	
8cd89ee
-	if (strncmp(bat_info->LastFull_Cap,"unknown",7)==0)
8cd89ee
+	if (strncmp(batt_info->LastFull_Cap,"unknown",7)==0)
8cd89ee
 	{
8cd89ee
-    	    bat_info->Battery_Present = 0;
8cd89ee
+    	    batt_info->Battery_Present = 0;
8cd89ee
     	    return 0;                  //bail out if battery is not present //
8cd89ee
     	}
8cd89ee
 	/* some Dell laptops seem to report a 2nd battery as being present, while it is NOT, but then report the 
8cd89ee
@@ -449,21 +471,21 @@
8cd89ee
     
8cd89ee
     	// then get the technology //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Technology, str+25, 12);
8cd89ee
+    	strncpy(batt_info->Technology, str+25, 12);
8cd89ee
     
8cd89ee
     	// then get the model number //
8cd89ee
     	for(int t=0; t<5; t++)
8cd89ee
 	file_in.getline(str, 100);            //skip 5 lines //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Model, str+25, 12);
8cd89ee
+    	strncpy(batt_info->Model, str+25, 12);
8cd89ee
     
8cd89ee
     	// then get the serial number //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Serial, str+25, 12);
8cd89ee
+    	strncpy(batt_info->Serial, str+25, 12);
8cd89ee
     
8cd89ee
     	// then get the battery type //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Bat_Type, str+25, 12);
8cd89ee
+    	strncpy(batt_info->Bat_Type, str+25, 12);
8cd89ee
     
8cd89ee
     	file_in.close();
8cd89ee
     	
8cd89ee
@@ -480,17 +502,17 @@
8cd89ee
     	// then get the charging state //
8cd89ee
     	file_in.getline(str, 100); file_in.getline(str, 100);     // skip first 2 lines //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Charging_State, str+25, 12);
8cd89ee
-	if (strncmp(bat_info->Charging_State,"unknown",7)==0) strncpy(bat_info->Charging_State, "charged",7);
8cd89ee
+    	strncpy(batt_info->Charging_State, str+25, 12);
8cd89ee
+	if (strncmp(batt_info->Charging_State,"unknown",7)==0) strncpy(batt_info->Charging_State, "charged",7);
8cd89ee
 	/* on older kernels, like 2.4.22, the charging state is reported as "unknown", whereas in recent kernels
8cd89ee
 	   this was changed to "charged". */  
8cd89ee
 
8cd89ee
     	// then get the charging rate //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Present_Rate, str+25, 9);
8cd89ee
-	if (strncmp(bat_info->Charging_State,"charged",7)==0)
8cd89ee
+    	strncpy(batt_info->Present_Rate, str+25, 9);
8cd89ee
+	if (strncmp(batt_info->Charging_State,"charged",7)==0)
8cd89ee
 	{
8cd89ee
-	    if (strncmp(bat_info->Present_Rate, "unknown",7)==0) strncpy(bat_info->Present_Rate, "0      ",7);
8cd89ee
+	    if (strncmp(batt_info->Present_Rate, "unknown",7)==0) strncpy(batt_info->Present_Rate, "0      ",7);
8cd89ee
 	}    
8cd89ee
 	/* some batteries report the present rate as "unknown", even when they report the battery as being charged.
8cd89ee
 	   If the battery is charged, the rate should be 0 */     
8cd89ee
@@ -498,12 +520,12 @@
8cd89ee
 
8cd89ee
     	// then get the remaining capacity //
8cd89ee
     	file_in.getline(str, 100);
8cd89ee
-    	strncpy(bat_info->Remaining_Cap, str+25, 9);
8cd89ee
+    	strncpy(batt_info->Remaining_Cap, str+25, 9);
8cd89ee
     
8cd89ee
     	file_in.close();
8cd89ee
 	}
8cd89ee
 	else      // battery dir is readable but empty : only . and .. at most //
8cd89ee
-	    bat_info->Battery_Present = 3;   
8cd89ee
+	    batt_info->Battery_Present = 3;   
8cd89ee
 	
8cd89ee
 	return 0;
8cd89ee
 }
8cd89ee
@@ -513,8 +535,8 @@
8cd89ee
 int Get_Battery_Info_from_Sys(const int bat_nr, Battery_Info *batt_info, int verbose)
8cd89ee
 {
8cd89ee
     ifstream file_in;
8cd89ee
-    char filename[6][65], str[100], temp[100];
8cd89ee
-    int bat_count = 0, start = 0, findex = 0;
8cd89ee
+    char filename[6][65], str[100], temp[100], attr[100];
8cd89ee
+    int bat_count = 0, start = 0, findex = 0, value = 0;
8cd89ee
     DIR *battery_dir;
8cd89ee
     char *name, *dirname;
8cd89ee
        
8cd89ee
@@ -613,165 +635,104 @@
8cd89ee
 	    return -1;
8cd89ee
     	}
8cd89ee
     	
8cd89ee
-    	memset(str, '\0', 100);
8cd89ee
-	for(int t=0; t<5; t++)
8cd89ee
-	    fgets(str, 100, power_fp);            /* skip first 5 lines */
8cd89ee
-    	
8cd89ee
-    	/* get battery status (full, charging, ...) */
8cd89ee
-    	memset(str, '\0', 100);
8cd89ee
-    	fgets(str, 100, power_fp);
8cd89ee
-    	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Charging_State, temp, 12);
8cd89ee
-    	}   
8cd89ee
-	
8cd89ee
-	    
8cd89ee
-	/* get battery presence (0 or 1) */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-	{
8cd89ee
-	    memset(temp, '\0', 100);
8cd89ee
-	    strncpy(temp, str+21, 1);
8cd89ee
-    	    if(strncmp(temp,"1",1)==0)
8cd89ee
-    	        batt_info->Battery_Present = 1;               /* yes, we have a battery */
8cd89ee
-    	    else
8cd89ee
-    	    {
8cd89ee
-    		batt_info->Battery_Present = 0;
8cd89ee
-    		printf(" Battery is not present, bailing out. \n");
8cd89ee
-    		return 0;                                    /* bail out if battery is not present */
8cd89ee
-    	    }
8cd89ee
-    	}
8cd89ee
-    	    
8cd89ee
-    	    
8cd89ee
-    	/* get technology */    
8cd89ee
-    	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Technology, temp, 12);
8cd89ee
-    	} 
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->Technology, "unknown", 7);
8cd89ee
-    	    
8cd89ee
-    	    
8cd89ee
-    	    
8cd89ee
-    	//printf(" \n bat_info_tech = %s \n\n ",  batt_info->Technology);    
8cd89ee
-    	
8cd89ee
-    	
8cd89ee
-
8cd89ee
-	fgets(str, 100, power_fp);    	/* skip 1 line */	
8cd89ee
-
8cd89ee
-
8cd89ee
-	/* get voltage_now */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Voltage_Now, temp, 12);
8cd89ee
-    	}    
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->Voltage_Now, "unknown", 7);
8cd89ee
-
8cd89ee
-    	
8cd89ee
-	/* get current_now, which I believe is the charging rate ? */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Present_Rate, temp, 12);
8cd89ee
-    	}       
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->Present_Rate, "unknown", 7);
8cd89ee
-
8cd89ee
-	
8cd89ee
-	/* get charge_full_design */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Design_Cap, temp, 12);
8cd89ee
-    	}          
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->Design_Cap, "unknown", 7);
8cd89ee
-    	    
8cd89ee
-    	    
8cd89ee
-    	//printf(" \n bat_info_design_cap = %s \n ",  batt_info->Design_Cap);    
8cd89ee
-
8cd89ee
-
8cd89ee
-	/* get charge_full, which is the last full capacity I guess ? */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->LastFull_Cap, temp, 12);
8cd89ee
-    	}       
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->LastFull_Cap, "unknown", 7);
8cd89ee
-
8cd89ee
-
8cd89ee
-	//printf(" \n bat_info_lastfull_cap = %s \n\n ",  batt_info->LastFull_Cap); 
8cd89ee
-
8cd89ee
-
8cd89ee
-	/* get charge_now */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Remaining_Cap, temp, 12);
8cd89ee
-    	}       
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->Remaining_Cap, "unknown", 7);
8cd89ee
-
8cd89ee
-	//printf(" \n bat_info_remaining_cap = %s \n\n ",  batt_info->Remaining_Cap); 
8cd89ee
-
8cd89ee
-
8cd89ee
-	/* get model_name */  
8cd89ee
-	memset(str, '\0', 100);  
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
-	if (strlen(str)>0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-	    strncpy(temp, str+24, 12);         // use strncpy here because sscanf chokes on blanks in this one ? //
8cd89ee
-
8cd89ee
-    	    memset(str, '\0', 100);
8cd89ee
-    	    sscanf(temp, "%[^\n]", str);       // strip trailing \n, fucks up output //
8cd89ee
-    	    
8cd89ee
-    	    strncpy(batt_info->Model, str, 12);
8cd89ee
+	strncpy(batt_info->Technology, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Voltage_Now, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Charge_Now, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Charge_Full, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Charge_Full_Design, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Present_Rate, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Design_Cap, "unknown", 7);
8cd89ee
+	strncpy(batt_info->LastFull_Cap, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Remaining_Cap, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Model, "unknown", 7);
8cd89ee
+	strncpy(batt_info->Serial, "unknown", 7);
8cd89ee
+
8cd89ee
+	// see linux-2.6/drivers/power/power_supply_sysfs.c
8cd89ee
+	// there can be different number of lines, so read up to 40 lines
8cd89ee
+	for(int t=0; t<40; t++) {
8cd89ee
+    		memset(str, '\0', 100);
8cd89ee
+		memset(attr, '\0', 100);
8cd89ee
+    		memset(temp, '\0', 100);
8cd89ee
+		fgets(str, 100, power_fp);
8cd89ee
+		sscanf(str, "%[^=]s %*s %*[^\n]", attr);
8cd89ee
+    		sscanf(str, "%*[^=] %*c %s %*[^\n]",temp); 
8cd89ee
+		if (strcmp(attr,"POWER_SUPPLY_STATUS")==0) {
8cd89ee
+    			strncpy(batt_info->Charging_State, temp, 12);
8cd89ee
+    		}   
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_TYPE")==0) {
8cd89ee
+			strncpy(batt_info->Bat_Type, temp, 12);
8cd89ee
+    		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_TECHNOLOGY")==0) {
8cd89ee
+    			strncpy(batt_info->Technology, temp, 12);
8cd89ee
+    		} 
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_VOLTAGE_NOW")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mV", value);
8cd89ee
+    	    		strncpy(batt_info->Voltage_Now, temp, 12);
8cd89ee
+    		}    
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_CURRENT_NOW")==0 ||
8cd89ee
+			 strcmp(attr,"POWER_SUPPLY_POWER_NOW")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i", value);
8cd89ee
+			strncpy(batt_info->Present_Rate, temp, 9);
8cd89ee
+		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_CHARGE_NOW")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mA", value);
8cd89ee
+			strncpy(batt_info->Charge_Now, temp, 12);
8cd89ee
+		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_CHARGE_FULL_DESIGN")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mA", value);
8cd89ee
+			strncpy(batt_info->Charge_Full_Design, temp, 12);
8cd89ee
+		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_CHARGE_FULL")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mA", value);
8cd89ee
+			strncpy(batt_info->Charge_Full, temp, 12);
8cd89ee
+		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_ENERGY_FULL_DESIGN")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mWh", value);
8cd89ee
+			strncpy(batt_info->Design_Cap, temp, 9);
8cd89ee
+		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_ENERGY_FULL")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mWh", value);
8cd89ee
+			strncpy(batt_info->LastFull_Cap, temp, 9);
8cd89ee
+		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_ENERGY_NOW")==0) {
8cd89ee
+			value = atoi(temp) / 1000;
8cd89ee
+			snprintf(temp, sizeof(temp), "%i mWh", value);
8cd89ee
+			strncpy(batt_info->Remaining_Cap, temp, 9);
8cd89ee
+    		}       
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_MODEL_NAME")==0) {
8cd89ee
+			strncpy(batt_info->Model, temp, 12);
8cd89ee
+    		}
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_SERIAL_NUMBER")==0) {
8cd89ee
+			strncpy(batt_info->Serial, temp, 12);
8cd89ee
+    		}       
8cd89ee
+		else if (strcmp(attr,"POWER_SUPPLY_PRESENT")==0) {
8cd89ee
+			if(strncmp(temp,"1",1)==0) {
8cd89ee
+				batt_info->Battery_Present = 1;
8cd89ee
+			}
8cd89ee
+			else {
8cd89ee
+				batt_info->Battery_Present = 0;
8cd89ee
+				printf(" Battery is not present, bailing out. \n");
8cd89ee
+				return 0;
8cd89ee
+    			}
8cd89ee
+           	}       
8cd89ee
     	}       
8cd89ee
+	if (strcmp(batt_info->Charge_Now,"")!=0 &&
8cd89ee
+	   strcmp(batt_info->Charge_Now,"unknown")!=0)
8cd89ee
+		snprintf(temp, sizeof(temp), "%s mA", batt_info->Present_Rate);
8cd89ee
     	else
8cd89ee
-    	    strncpy(batt_info->Model, "unknown", 7);
8cd89ee
+		snprintf(temp, sizeof(temp), "%s mW", batt_info->Present_Rate);
8cd89ee
 
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
+	strncpy(batt_info->Present_Rate, temp, 9);
8cd89ee
 	
8cd89ee
-	/* get serial */    
8cd89ee
-	memset(str, '\0', 100);
8cd89ee
-	fgets(str, 100, power_fp);   
8cd89ee
-	if (strlen(str)!=0)
8cd89ee
-    	{
8cd89ee
-    	    memset(temp, '\0', 100);
8cd89ee
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
8cd89ee
-    	    strncpy(batt_info->Serial, temp, 12);
8cd89ee
-    	}       
8cd89ee
-    	else
8cd89ee
-    	    strncpy(batt_info->Serial, "unknown", 7);
8cd89ee
-    
8cd89ee
     	fclose(power_fp);
8cd89ee
-	}
8cd89ee
+    }
8cd89ee
     else      // battery dir is readable but empty : only . and .. at most //
8cd89ee
         batt_info->Battery_Present = 3;   
8cd89ee
     return 0;