[PATCH] acpi: battery: added trip point tests for acpi batteries.
Alex Hung
alex.hung at canonical.com
Wed May 23 11:11:33 UTC 2012
Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
src/acpi/battery/battery.c | 41 ++++++++
src/lib/include/fwts_battery.h | 3 +
src/lib/src/fwts_battery.c | 211 +++++++++++++++++++++++++++++++++++++++-
3 files changed, 253 insertions(+), 2 deletions(-)
diff --git a/src/acpi/battery/battery.c b/src/acpi/battery/battery.c
index d9e4d5e..47771b0 100644
--- a/src/acpi/battery/battery.c
+++ b/src/acpi/battery/battery.c
@@ -188,6 +188,46 @@ static void check_battery_cycle_count(fwts_framework *fw, int index, char *name)
}
+static void check_battery_trip_point(fwts_framework *fw, int index, char *name)
+{
+ int trip_point;
+ int trip_point_org;
+
+ fwts_printf(fw, "==== Checking trip point of battery '%s' ====\n", name);
+
+ if (!fwts_battery_check_trip_point_support(fw, index)) {
+ fwts_printf(fw, "==== Not supported - skip test ====\n");
+ return;
+ }
+
+ if (fwts_battery_get_trip_point(fw, index, &trip_point) == FWTS_OK)
+ trip_point_org = trip_point;
+ else
+ trip_point_org = 0;
+
+ fwts_log_info(fw, "Test battery '%s' downward trip point.", name);
+ fwts_printf(fw, "==== Please now UNPLUG the AC power of the machine ====\n");
+ fwts_press_enter(fw);
+ sleep(1);
+ trip_point = get_full(fw, index) - 5;
+ fwts_battery_set_trip_point(fw, index, trip_point);
+ fwts_cpu_consume_start();
+ wait_for_acpi_event(fw, name);
+ fwts_cpu_consume_complete();
+
+ fwts_log_info(fw, "Test battery '%s' upwards trip point.", name);
+ fwts_printf(fw, "==== Please PLUG IN the AC power of the machine ====\n");
+ fwts_press_enter(fw);
+ sleep(1);
+ trip_point = get_full(fw, index) + 3;
+ fwts_battery_set_trip_point(fw, index, trip_point);
+ wait_for_acpi_event(fw, name);
+
+ if (trip_point_org != 0)
+ fwts_battery_set_trip_point(fw, index, trip_point_org);
+
+}
+
static void do_battery_test(fwts_framework *fw, int index)
{
char name[PATH_MAX];
@@ -211,6 +251,7 @@ static void do_battery_test(fwts_framework *fw, int index)
wait_for_acpi_event(fw, name);
check_charging(fw, index, name);
check_battery_cycle_count(fw, index, name);
+ check_battery_trip_point(fw, index, name);
}
static int battery_test1(fwts_framework *fw)
diff --git a/src/lib/include/fwts_battery.h b/src/lib/include/fwts_battery.h
index 83d381b..8fbd838 100644
--- a/src/lib/include/fwts_battery.h
+++ b/src/lib/include/fwts_battery.h
@@ -27,6 +27,9 @@
int fwts_battery_get_count(fwts_framework *fw, int *count);
int fwts_battery_get_cycle_count(fwts_framework *fw, int index, int *cycle_count);
+bool fwts_battery_check_trip_point_support(fwts_framework *fw, int index);
+int fwts_battery_set_trip_point(fwts_framework *fw, int index, int trip_point);
+int fwts_battery_get_trip_point(fwts_framework *fw, int index, int *trip_point);
int fwts_battery_get_capacity(fwts_framework *fw, int type, int index, uint32_t *capacity_mAh, uint32_t *capacity_mWh);
int fwts_battery_get_name(fwts_framework *fw, int index, char *name);
diff --git a/src/lib/src/fwts_battery.c b/src/lib/src/fwts_battery.c
index d8cc318..a558d6e 100644
--- a/src/lib/src/fwts_battery.c
+++ b/src/lib/src/fwts_battery.c
@@ -45,11 +45,11 @@ static int fwts_battery_get_capacity_sys_fs(fwts_framework *fw,
switch (type) {
case FWTS_BATTERY_DESIGN_CAPACITY:
field_mAh = "POWER_SUPPLY_CHARGE_FULL_DESIGN=";
- field_mWh = "ENERGY_SUPPLY_CHARGE_FULL_DESIGN=";
+ field_mWh = "POWER_SUPPLY_ENERGY_FULL_DESIGN=";
break;
case FWTS_BATTERY_REMAINING_CAPACITY:
field_mAh = "POWER_SUPPLY_CHARGE_NOW=";
- field_mWh = "ENERGY_SUPPLY_CHARGE_NOW=";
+ field_mWh = "POWER_SUPPLY_ENERGY_NOW=";
break;
default:
return FWTS_ERROR;
@@ -356,6 +356,213 @@ static int fwts_battery_get_cycle_count_proc_fs(fwts_framework *fw, DIR *dir, in
return FWTS_OK;
}
+static int fwts_battery_set_trip_point_sys_fs(fwts_framework *fw, DIR *dir, int index, int trip_point)
+{
+ struct dirent *entry;
+ int i = 0;
+
+ do {
+ entry = readdir(dir);
+ if (entry && strlen(entry->d_name) > 2) {
+ char path[PATH_MAX];
+ char *data;
+ FILE *fp;
+ bool match;
+
+ /* Check that type field matches the expected type */
+ snprintf(path, sizeof(path), "%s/%s/type", FWTS_SYS_CLASS_POWER_SUPPLY, entry->d_name);
+ if ((data = fwts_get(path)) != NULL) {
+ bool mismatch = (strstr(data, "Battery") == NULL);
+ free(data);
+ if (mismatch)
+ continue; /* type don't match, skip this entry */
+ } else
+ continue; /* can't check type, skip this entry */
+ match = ((index == FWTS_BATTERY_ALL) || (index == i));
+ i++;
+ if (!match)
+ continue;
+
+ snprintf(path, sizeof(path), "%s/%s/alarm", FWTS_SYS_CLASS_POWER_SUPPLY, entry->d_name);
+ if ((fp = fopen(path, "rw+")) == NULL) {
+ fwts_log_info(fw, "Battery %s present but undersupported - no state present.", entry->d_name);
+ } else {
+ char buffer[512];
+ sprintf(buffer, "%d", trip_point * 1000);
+ fputs(buffer, fp);
+ fclose(fp);
+ }
+ }
+ } while (entry);
+
+ return FWTS_OK;
+}
+
+static int fwts_battery_get_trip_point_sys_fs(fwts_framework *fw, DIR *dir, int index, int *trip_point)
+{
+ struct dirent *entry;
+ int i = 0;
+
+ *trip_point = 0;
+ do {
+ entry = readdir(dir);
+ if (entry && strlen(entry->d_name) > 2) {
+ char path[PATH_MAX];
+ char *data;
+ int val;
+ FILE *fp;
+ bool match;
+
+ /* Check that type field matches the expected type */
+ snprintf(path, sizeof(path), "%s/%s/type", FWTS_SYS_CLASS_POWER_SUPPLY, entry->d_name);
+ if ((data = fwts_get(path)) != NULL) {
+ bool mismatch = (strstr(data, "Battery") == NULL);
+ free(data);
+ if (mismatch)
+ continue; /* type don't match, skip this entry */
+ } else
+ continue; /* can't check type, skip this entry */
+ match = ((index == FWTS_BATTERY_ALL) || (index == i));
+ i++;
+ if (!match)
+ continue;
+
+ snprintf(path, sizeof(path), "%s/%s/alarm", FWTS_SYS_CLASS_POWER_SUPPLY, entry->d_name);
+ if ((fp = fopen(path, "r")) == NULL) {
+ fwts_log_info(fw, "Battery %s present but undersupported - no state present.", entry->d_name);
+ } else {
+ char buffer[4096];
+ while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) {
+ sscanf(buffer, "%d", &val);
+ *trip_point = val / 1000;
+ }
+ fclose(fp);
+ }
+ }
+ } while (entry);
+
+ return FWTS_OK;
+}
+
+static int fwts_battery_set_trip_point_proc_fs(fwts_framework *fw, DIR *dir, int index, int trip_point)
+{
+ struct dirent *entry;
+ int i = 0;
+
+ do {
+ entry = readdir(dir);
+ if (entry && strlen(entry->d_name) > 2) {
+ char path[PATH_MAX];
+ FILE *fp;
+ bool match = ((index == FWTS_BATTERY_ALL) || (index == i));
+
+ i++;
+ if (!match)
+ continue;
+
+ snprintf(path, sizeof(path), "%s/%s/alarm", FWTS_PROC_ACPI_BATTERY, entry->d_name);
+ if ((fp = fopen(path, "rw+")) == NULL) {
+ fwts_log_info(fw, "Battery %s present but undersupported - no state present.", entry->d_name);
+ } else {
+ char buffer[512];
+ sprintf(buffer, "%d", trip_point);
+ fputs(buffer, fp);
+ fclose(fp);
+ }
+ }
+ } while (entry);
+
+ return FWTS_OK;
+}
+
+static int fwts_battery_get_trip_point_proc_fs(fwts_framework *fw, DIR *dir, int index, int *trip_point)
+{
+ struct dirent *entry;
+ int i = 0;
+
+ *trip_point = 0;
+ do {
+ entry = readdir(dir);
+ if (entry && strlen(entry->d_name) > 2) {
+ char path[PATH_MAX];
+ int val;
+ FILE *fp;
+ bool match = ((index == FWTS_BATTERY_ALL) || (index == i));
+
+ i++;
+ if (!match)
+ continue;
+
+ snprintf(path, sizeof(path), "%s/%s/alarm", FWTS_PROC_ACPI_BATTERY, entry->d_name);
+ if ((fp = fopen(path, "r")) == NULL) {
+ fwts_log_info(fw, "Battery %s present but undersupported - no state present.", entry->d_name);
+ } else {
+ char buffer[4096];
+ while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) {
+ if (strstr(buffer, "alarm:") &&
+ strlen(buffer) > 25) {
+ sscanf(buffer + 25, "%d", &val);
+ *trip_point = val;
+ break;
+ }
+ }
+ fclose(fp);
+ }
+ }
+ } while (entry);
+
+ return FWTS_OK;
+}
+
+int fwts_battery_set_trip_point(fwts_framework *fw, int index, int trip_point)
+{
+ int ret;
+ DIR *dir;
+
+ if ((dir = opendir(FWTS_SYS_CLASS_POWER_SUPPLY)) != NULL) {
+ ret = fwts_battery_set_trip_point_sys_fs(fw, dir, index, trip_point);
+ closedir(dir);
+ } else if ((dir = opendir(FWTS_PROC_ACPI_BATTERY)) != NULL) {
+ ret = fwts_battery_set_trip_point_proc_fs(fw, dir, index, trip_point);
+ closedir(dir);
+ } else {
+ return FWTS_ERROR;
+ }
+
+ return ret;
+}
+
+int fwts_battery_get_trip_point(fwts_framework *fw, int index, int *trip_point)
+{
+ int ret;
+ DIR *dir;
+
+ if ((dir = opendir(FWTS_SYS_CLASS_POWER_SUPPLY)) != NULL) {
+ ret = fwts_battery_get_trip_point_sys_fs(fw, dir, index, trip_point);
+ closedir(dir);
+ } else if ((dir = opendir(FWTS_PROC_ACPI_BATTERY)) != NULL) {
+ ret = fwts_battery_get_trip_point_proc_fs(fw, dir, index, trip_point);
+ closedir(dir);
+ } else {
+ return FWTS_ERROR;
+ }
+
+ return ret;
+}
+
+bool fwts_battery_check_trip_point_support(fwts_framework *fw, int index)
+{
+ int trip_point;
+
+ if (!(fwts_battery_get_trip_point(fw, index, &trip_point) == FWTS_OK))
+ return false;
+
+ if (trip_point == 0)
+ return false;
+
+ return true;
+}
+
int fwts_battery_get_cycle_count(fwts_framework *fw, int index, int *cycle_count)
{
int ret;
--
1.7.9.5
More information about the fwts-devel
mailing list