On some systems POWER_SUPPLY_ENERGY_* is replaced by POWER_SUPPLY_CHARGE_*
*/
+/*on n900 with power kernel: (non power kernel could use "hal-device bme" and do something else)
+/sys/class/power_supply/bq27200-0/uevent
+PHYSDEVPATH=/class/i2c-adapter/i2c-2/2-0055
+PHYSDEVBUS=i2c
+PHYSDEVDRIVER=bq27200-battery
+POWER_SUPPLY_NAME=bq27200-0
+POWER_SUPPLY_TYPE=Battery
+POWER_SUPPLY_PRESENT=1 << this is always 1, it means the battery is inserted
+POWER_SUPPLY_VOLTAGE_NOW=4039 << this keeps updating during charging
+POWER_SUPPLY_CURRENT_NOW=1960 << this goes negative when charging!
+POWER_SUPPLY_CAPACITY=98 << supposed to be the %, but it stops updating when charging until it hits 100%
+POWER_SUPPLY_TEMP=39 << only temperature sensor in n900 :(
+*/
+
#define SYSFS_BATTERY_BASE_PATH "/sys/class/power_supply"
-#define ACPI_BATTERY_BASE_PATH "/proc/acpi/battery"
-#define APM_PATH "/proc/apm"
-#define MAX_BATTERY_COUNT 4
+#define ACPI_BATTERY_BASE_PATH "/proc/acpi/battery" //not for n900
+#define APM_PATH "/proc/apm" //not for n900
+#define MAX_BATTERY_COUNT 4 //more like 1
static FILE *sysfs_bat_fp[MAX_BATTERY_COUNT] = { NULL, NULL, NULL, NULL };
static FILE *acpi_bat_fp[MAX_BATTERY_COUNT] = { NULL, NULL, NULL, NULL };
if (sysfs_bat_fp[idx] != NULL) {
/* SYSFS */
- int present_rate = -1;
- int remaining_capacity = -1;
- char charging_state[64];
+ int present_rate = -9999; //we will put "current now" into this. negative when charging!
+ int remaining_capacity = -1; //in %
+ char charging_state[64];//can't get this without hal bme
+ int voltage = -1;
+ //int capacity = -1;
+ int temp = 9999;
char present[4];
-
+ strcpy(present, "no");
strcpy(charging_state, "unknown");
while (!feof(sysfs_bat_fp[idx])) {
/* let's just hope units are ok */
if (strncmp (buf, "POWER_SUPPLY_PRESENT=1", 22) == 0)
- strcpy(present, "yes");
- else if (strncmp (buf, "POWER_SUPPLY_PRESENT=0", 22) == 0)
- strcpy(present, "no");
- else if (strncmp (buf, "POWER_SUPPLY_STATUS=", 20) == 0)
- sscanf(buf, "POWER_SUPPLY_STATUS=%63s", charging_state);
- /* present_rate is not the same as the
- current flowing now but it is the same value
- which was used in the past. so we continue
- the tradition! */
+ strcpy(present, "yes");//n900 always yes
+ else if (strncmp(buf, "POWER_SUPPLY_VOLTAGE_NOW=", 25) == 0)
+ sscanf(buf, "POWER_SUPPLY_VOLTAGE_NOW=%d", &voltage);
+// else if (strncmp (buf, "POWER_SUPPLY_STATUS=", 20) == 0)
+// sscanf(buf, "POWER_SUPPLY_STATUS=%63s", charging_state);
else if (strncmp(buf, "POWER_SUPPLY_CURRENT_NOW=", 25) == 0)
sscanf(buf, "POWER_SUPPLY_CURRENT_NOW=%d", &present_rate);
- else if (strncmp(buf, "POWER_SUPPLY_ENERGY_NOW=", 24) == 0)
- sscanf(buf, "POWER_SUPPLY_ENERGY_NOW=%d", &remaining_capacity);
- else if (strncmp(buf, "POWER_SUPPLY_ENERGY_FULL=", 25) == 0)
- sscanf(buf, "POWER_SUPPLY_ENERGY_FULL=%d", &acpi_last_full[idx]);
- else if (strncmp(buf, "POWER_SUPPLY_CHARGE_NOW=", 24) == 0)
- sscanf(buf, "POWER_SUPPLY_CHARGE_NOW=%d", &remaining_capacity);
- else if (strncmp(buf, "POWER_SUPPLY_CHARGE_FULL=", 25) == 0)
- sscanf(buf, "POWER_SUPPLY_CHARGE_FULL=%d", &acpi_last_full[idx]);
+ else if (strncmp(buf, "POWER_SUPPLY_CAPACITY=", 22) == 0)
+ sscanf(buf, "POWER_SUPPLY_CAPACITY=%d", &remaining_capacity);
+ else if (strncmp(buf, "POWER_SUPPLY_TEMP=", 18) == 0)
+ sscanf(buf, "POWER_SUPPLY_TEMP=%d", &temp);
+// else if (strncmp(buf, "POWER_SUPPLY_ENERGY_NOW=", 24) == 0)
+// sscanf(buf, "POWER_SUPPLY_ENERGY_NOW=%d", &remaining_capacity);
+// else if (strncmp(buf, "POWER_SUPPLY_ENERGY_FULL=", 25) == 0)
+// sscanf(buf, "POWER_SUPPLY_ENERGY_FULL=%d", &acpi_last_full[idx]);
+// else if (strncmp(buf, "POWER_SUPPLY_CHARGE_NOW=", 24) == 0)
+// sscanf(buf, "POWER_SUPPLY_CHARGE_NOW=%d", &remaining_capacity);
+// else if (strncmp(buf, "POWER_SUPPLY_CHARGE_FULL=", 25) == 0)
+// sscanf(buf, "POWER_SUPPLY_CHARGE_FULL=%d", &acpi_last_full[idx]);
}
fclose(sysfs_bat_fp[idx]);
sysfs_bat_fp[idx] = NULL;
/* Hellf[i]re notes that remaining capacity can exceed acpi_last_full */
- if (remaining_capacity > acpi_last_full[idx])
- acpi_last_full[idx] = remaining_capacity; /* normalize to 100% */
+ //lance notes, we don't care
+// if (remaining_capacity > acpi_last_full[idx])
+// acpi_last_full[idx] = remaining_capacity; /* normalize to 100% */
/* not present */
- if (strcmp(present, "No") == 0) {
- strncpy(last_battery_str[idx], "not present", 64);
- }
+ //not possible
+// if (strcmp(present, "no") == 0) {
+// strncpy(last_battery_str[idx], "not present", 64);
+// }
/* charging */
- else if (strcmp(charging_state, "Charging") == 0) {
- if (acpi_last_full[idx] != 0 && present_rate > 0) {
+ if (present_rate <= 0) {//if charging
/* e.g. charging 75% */
snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1, "charging %i%%",
- (int) (((float) remaining_capacity / acpi_last_full[idx]) * 100 ));
- /* e.g. 2h 37m */
- format_seconds(last_battery_time_str[idx], sizeof(last_battery_time_str[idx])-1,
- (long) (((float)(acpi_last_full[idx] - remaining_capacity) / present_rate) * 3600));
- } else if (acpi_last_full[idx] != 0 && present_rate <= 0) {
- snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1, "charging %d%%",
- (int) (((float)remaining_capacity / acpi_last_full[idx]) * 100));
- snprintf(last_battery_time_str[idx],
- sizeof(last_battery_time_str[idx]) - 1, "unknown");
- } else {
- strncpy(last_battery_str[idx], "charging", sizeof(last_battery_str[idx])-1);
- snprintf(last_battery_time_str[idx],
+ (int) (((float) remaining_capacity / 100) ));
+ snprintf(last_battery_time_str[idx],
sizeof(last_battery_time_str[idx]) - 1, "unknown");
- }
- }
+ /* e.g. 2h 37m */
+// format_seconds(last_battery_time_str[idx], sizeof(last_battery_time_str[idx])-1,
+// (long) (((float)(acpi_last_full[idx] - remaining_capacity) / present_rate) * 3600));
+ }
+
+// else if (acpi_last_full[idx] != 0 && present_rate <= 0) {//supposed to be guessing the time to fully charge, won't work though.
+// snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1, "charging %d%%",
+// (int) (((float)remaining_capacity / acpi_last_full[idx]) * 100));
+// snprintf(last_battery_time_str[idx],
+// sizeof(last_battery_time_str[idx]) - 1, "unknown");
+// } else {
+// strncpy(last_battery_str[idx], "charging", sizeof(last_battery_str[idx])-1);
+// snprintf(last_battery_time_str[idx],
+// sizeof(last_battery_time_str[idx]) - 1, "unknown");
+// }
+// }
/* discharging */
- else if (strncmp(charging_state, "Discharging", 64) == 0) {
- if (present_rate > 0) {
+ else if (present_rate > 0) {
+
/* e.g. discharging 35% */
snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1, "discharging %i%%",
- (int) (((float) remaining_capacity / acpi_last_full[idx]) * 100 ));
- /* e.g. 1h 12m */
- format_seconds(last_battery_time_str[idx], sizeof(last_battery_time_str[idx])-1,
- (long) (((float) remaining_capacity / present_rate) * 3600));
- } else if (present_rate == 0) { /* Thanks to Nexox for this one */
- snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1, "full");
- snprintf(last_battery_time_str[idx],
- sizeof(last_battery_time_str[idx]) - 1, "unknown");
- } else {
- snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1,
- "discharging %d%%",
- (int) (((float)remaining_capacity / acpi_last_full[idx]) * 100));
- snprintf(last_battery_time_str[idx],
+ (int) (((float) remaining_capacity / 100) ));
+
+ snprintf(last_battery_time_str[idx],
sizeof(last_battery_time_str[idx]) - 1, "unknown");
- }
+ /* e.g. 1h 12m */
+// format_seconds(last_battery_time_str[idx], sizeof(last_battery_time_str[idx])-1,
+// (long) (((float) remaining_capacity / present_rate) * 3600));
+// else {
+// snprintf(last_battery_str[idx], sizeof(last_battery_str[idx])-1,
+// "discharging %d%%",
+// (int) (((float)remaining_capacity / acpi_last_full[idx]) * 100));
+// snprintf(last_battery_time_str[idx],
+// sizeof(last_battery_time_str[idx]) - 1, "unknown");
+// }
}
/* charged */
/* thanks to Lukas Zapletal <lzap@seznam.cz> */
- else if (strncmp(charging_state, "Charged", 64) == 0 || strncmp(charging_state, "Full", 64) == 0) {
- /* Below happens with the second battery on my X40,
- * when the second one is empty and the first one
- * being charged. */
- if (remaining_capacity == 0)
- strcpy(last_battery_str[idx], "empty");
- else
- strcpy(last_battery_str[idx], "charged");
- }
+
+ if (remaining_capacity == 100)
+ strcpy(last_battery_str[idx], "charged");
+
+// else if (strncmp(charging_state, "Charged", 64) == 0 || strncmp(charging_state, "Full", 64) == 0) {
+// /* Below happens with the second battery on my X40,
+// * when the second one is empty and the first one
+// * being charged. */
+// if (remaining_capacity == 0)
+// strcpy(last_battery_str[idx], "empty");
+// else
+// strcpy(last_battery_str[idx], "charged");
+// }
/* unknown, probably full / AC */
- else {
- if (acpi_last_full[idx] != 0
- && remaining_capacity != acpi_last_full[idx])
- snprintf(last_battery_str[idx], 64, "unknown %d%%",
- (int) (((float)remaining_capacity / acpi_last_full[idx]) * 100));
- else
- strncpy(last_battery_str[idx], "AC", 64);
- }
- } else if (acpi_bat_fp[idx] != NULL) {
+// else {
+// if (acpi_last_full[idx] != 0
+// && remaining_capacity != acpi_last_full[idx])
+// snprintf(last_battery_str[idx], 64, "unknown %d%%",
+// (int) (((float)remaining_capacity / acpi_last_full[idx]) * 100));
+// else
+// strncpy(last_battery_str[idx], "AC", 64);
+// }
+ } else if (acpi_bat_fp[idx] != NULL) {//skipped on n900
/* ACPI */
int present_rate = -1;
int remaining_capacity = -1;
}
fclose(acpi_bat_fp[idx]);
acpi_bat_fp[idx] = NULL;
- } else {
+ } else {//also skipped on n900
/* APM */
if (apm_bat_fp[idx] == NULL) {
apm_bat_fp[idx] = open_file(APM_PATH, &rep2);
char buf[256];
if (fgets(buf, 256, sysfs_bat_fp[idx]) == NULL)
break;
-
- if (strncmp(buf, "POWER_SUPPLY_CHARGE_NOW=", 24) == 0) {
- sscanf(buf, "POWER_SUPPLY_CHARGE_NOW=%d", &remaining_capacity);
- } else if (strncmp(buf, "POWER_SUPPLY_CHARGE_FULL=",25) == 0) {
- sscanf(buf, "POWER_SUPPLY_CHARGE_FULL=%d", &acpi_design_capacity[idx]);
- } else if (strncmp(buf, "POWER_SUPPLY_ENERGY_NOW=", 24) == 0) {
- sscanf(buf, "POWER_SUPPLY_ENERGY_NOW=%d", &remaining_capacity);
- } else if (strncmp(buf, "POWER_SUPPLY_ENERGY_FULL=",25) == 0) {
- sscanf(buf, "POWER_SUPPLY_ENERGY_FULL=%d", &acpi_design_capacity[idx]);
+ if (strncmp(buf, "POWER_SUPPLY_CAPACITY=", 22) == 0) {
+ sscanf(buf, "POWER_SUPPLY_CAPACITY=%d", &remaining_capacity);
+
+// if (strncmp(buf, "POWER_SUPPLY_CHARGE_NOW=", 24) == 0) {
+// sscanf(buf, "POWER_SUPPLY_CHARGE_NOW=%d", &remaining_capacity);
+// } else if (strncmp(buf, "POWER_SUPPLY_CHARGE_FULL=",25) == 0) {
+// sscanf(buf, "POWER_SUPPLY_CHARGE_FULL=%d", &acpi_design_capacity[idx]);
+// } else if (strncmp(buf, "POWER_SUPPLY_ENERGY_NOW=", 24) == 0) {
+// sscanf(buf, "POWER_SUPPLY_ENERGY_NOW=%d", &remaining_capacity);
+// } else if (strncmp(buf, "POWER_SUPPLY_ENERGY_FULL=",25) == 0) {
+// sscanf(buf, "POWER_SUPPLY_ENERGY_FULL=%d", &acpi_design_capacity[idx]);
+// }
}
}
-
fclose(sysfs_bat_fp[idx]);
sysfs_bat_fp[idx] = NULL;
return 0;
}
/* compute the battery percentage */
- last_battery_perct[idx] =
- (int) (((float) remaining_capacity / acpi_design_capacity[idx]) * 100);
- if (last_battery_perct[idx] > 100) last_battery_perct[idx] = 100;
+ last_battery_perct[idx] =
+ remaining_capacity;
+ //(int) (((float) remaining_capacity / acpi_design_capacity[idx]) * 100);
+ //if (last_battery_perct[idx] > 100) last_battery_perct[idx] = 100;
return last_battery_perct[idx];
}