blob: 3f8fd3aa324fbd55866579d6ce3d6f85515ae8af [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2020 - The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import time
from acts import signals
from acts import utils
from acts_contrib.test_utils.power.PowerBaseTest import PowerBaseTest
from acts_contrib.test_utils.gnss import gnss_test_utils as gutils
from acts_contrib.test_utils.wifi import wifi_test_utils as wutils
DEFAULT_WAIT_TIME = 60
DPO_NV_VALUE = '15DC'
MDS_TEST_PACKAGE = 'com.google.mdstest'
MDS_RUNNER = 'com.google.mdstest.instrument.ModemConfigInstrumentation'
class PowerGTWGnssBaseTest(PowerBaseTest):
"""Power GTW Gnss Base test"""
def setup_class(self):
super().setup_class()
self.ad = self.android_devices[0]
req_params = [
'wifi_network', 'test_location', 'qdsp6m_path',
'calibrate_target', 'interval', 'meas_interval'
]
self.unpack_userparams(req_param_names=req_params)
self.set_xtra_data()
def setup_test(self):
super().setup_test()
# Enable DPO
self.enable_DPO(True)
# Enable GNSS setting for GNSS standalone mode
self.ad.adb.shell('settings put secure location_mode 3')
# Recover attenuation value to strong CN
self.set_attenuation(self.atten_level['strong_signal'])
def teardown_test(self):
begin_time = utils.get_current_epoch_time()
self.ad.take_bug_report(self.test_name, begin_time)
gutils.get_gnss_qxdm_log(self.ad, self.qdsp6m_path)
def set_xtra_data(self):
gutils.disable_xtra_throttle(self.ad)
self.turn_on_wifi_connection()
gutils.enable_gnss_verbose_logging(self.ad)
gutils.start_gnss_by_gtw_gpstool(self.ad, True, 'gnss')
time.sleep(30)
gutils.start_gnss_by_gtw_gpstool(self.ad, False, 'gnss')
def turn_on_wifi_connection(self):
"""Turn on wifi connection."""
wutils.wifi_toggle_state(self.ad, True)
gutils.connect_to_wifi_network(self.ad, self.wifi_network)
def set_cell_only(self):
"""Turn off wifi connection, enable cell service."""
wutils.wifi_toggle_state(self.ad, False)
utils.force_airplane_mode(self.ad, False)
def baseline_test(self):
"""Baseline power measurement"""
self.ad.droid.goToSleepNow()
self.collect_power_data()
self.ad.log.info('TestResult AVG_Current %.2f' % self.avg_current)
def start_gnss_tracking_with_power_data(self,
mode='default',
is_signal=True,
freq=0,
lowpower=False,
meas=False):
"""Start GNSS tracking and collect power metrics.
Args:
is_signal: default True, False for no Gnss signal test.
freq: an integer to set location update frequency.
lowpower: a boolean to set GNSS Low Power Mode.
meas: a boolean to set GNSS Measurement registeration.
"""
self.ad.adb.shell('settings put secure location_mode 3')
gutils.start_gnss_by_gtw_gpstool(self.ad, True, 'gnss', True, freq,
lowpower, meas)
self.ad.droid.goToSleepNow()
self.ad.log.info('Collect SV data for %d seconds.' % DEFAULT_WAIT_TIME)
time.sleep(DEFAULT_WAIT_TIME)
samples = self.collect_power_data()
self.ad.log.info('TestResult AVG_Current %.2f' % self.avg_current)
self.calibrate_avg_current(samples)
self.ad.send_keycode('WAKEUP')
gutils.start_gnss_by_gtw_gpstool(self.ad, False, 'gnss')
gutils.parse_gtw_gpstool_log(self.ad, self.test_location, type='gnss')
def calibrate_avg_current(self, samples):
"""Calibrate average current by filtering AP wake up current with target
value.
Args:
samples: a list of tuples where the first element is a timestamp
and the second element is a current sample.
"""
calibrate_results = [
sample[1] * 1000 for sample in samples
if sample[1] * 1000 < self.calibrate_target
]
avg_current = sum(calibrate_results) / len(calibrate_results)
self.ad.log.info('TestResult Calibrate_AVG_Current %.2f' % avg_current)
def enable_DPO(self, enable):
"""Enable or disable the DPO option.
Args:
enable: True or False to enable DPO.
"""
self.ad.log.info('Change DPO to new state: %s.' % enable)
val = '02' if enable else '00'
options = {'request': 'writeNV', 'item': DPO_NV_VALUE, 'data': val}
instrument_cmd = gutils.build_instrumentation_call(
MDS_TEST_PACKAGE, MDS_RUNNER, options=options)
result = self.ad.adb.shell(instrument_cmd)
if 'SUCCESS' not in result:
self.ad.log.info(result)
raise signals.TestFailure('DPO is not able to Turn: %s' % enable)
self.dut_rockbottom()