firmware_ECCharging: Don't test when DUT performs discharge on AC

Some boards (eg. eve) performs discharge on AC when battery reports
that it is fully charged and doesn't want more charge. This can lead to
situation in which charge is below 100% and battery is still discharging,
for example:

> battery
  Status:    0x00e0 FULL DCHG INIT
  Param flags:00000002
  Temp:      0x0baa = 298.6 K (25.5 C)
  V:         0x218d = 8589 mV
  V-desired: 0x0000 = 0 mV
  I:         0xff22 = -222 mA(DISCHG)
  I-desired: 0x0000 = 0 mA
  Charging:  Not Allowed
  Charge:    98 %

> chgstate
  state = discharge
  ac = 1
  batt_is_charging = 0

Test expects that battery is being charged when it is below 100%,
which is not true during discharge on AC.

This patch adds checking if discharge on AC takes place, if so just
exit from test with appropriate message.

BUG=b:162254118
TEST=Charge battery to 100%, this should trigger discharge on AC (check
     it using 'battery' and 'chgstate' commands).
     Run firmware_ECCharging test. It should report that DUT performs
     discharge on AC and finish successfully.

Change-Id: Ic42a55cf98082984b95ea0d7d5daba83755d34bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/2440896
Tested-by: Patryk Duda <pdk@semihalf.com>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Wai-Hong Tam <waihong@google.com>
Commit-Queue: Wai-Hong Tam <waihong@google.com>
diff --git a/server/site_tests/firmware_ECCharging/firmware_ECCharging.py b/server/site_tests/firmware_ECCharging/firmware_ECCharging.py
index 9e12edf..acc53ae 100644
--- a/server/site_tests/firmware_ECCharging/firmware_ECCharging.py
+++ b/server/site_tests/firmware_ECCharging/firmware_ECCharging.py
@@ -13,6 +13,10 @@
     """
     version = 1
 
+    # Flags set by battery
+    BATT_FLAG_WANT_CHARGE = 0x1
+    STATUS_FULLY_CHARGED = 0x20
+
     # Threshold of trickle charging current in mA
     TRICKLE_CHARGE_THRESHOLD = 100
 
@@ -147,6 +151,18 @@
                 1.05 * self._get_charger_target_current()):
             raise error.TestFail("Battery actual current is too high.")
 
+    def _check_if_discharge_on_ac(self):
+        """Check if DUT is performing discharge on AC"""
+        match = self.ec.send_command_get_output("battery",
+                ["Status:\s*(0x[0-9a-f]+)\s", "Param flags:\s*([0-9a-f]+)\s"])
+        status = int(match[0][1], 16)
+        params = int(match[1][1], 16)
+
+        if (not (params & self.BATT_FLAG_WANT_CHARGE) and
+                (status & self.STATUS_FULLY_CHARGED)):
+            return True
+
+        return False
 
     def run_once(self):
         """Execute the main body of the test.
@@ -156,6 +172,9 @@
         if self._get_battery_charge() == 100:
             logging.info("Battery is full. Unable to test.")
             return
+        if self._check_if_discharge_on_ac():
+            logging.info("DUT is performing discharge on AC. Unable to test.")
+            return
         if self._get_trickle_charging():
             logging.info("Trickling charging battery. Unable to test.")
             return