255 lines
10 KiB
Python
255 lines
10 KiB
Python
|
import random
|
||
|
import os
|
||
|
import time
|
||
|
|
||
|
from TCAction import TCActionBase, PerformanceTCBase
|
||
|
from Utility import MakeFolder
|
||
|
from Utility import MultimeterUtil
|
||
|
from NativeLog import NativeLog
|
||
|
|
||
|
LOG_PATH = os.path.join("AT_LOG", "SLEEP")
|
||
|
|
||
|
SLEEP_MODE_LIST = ["none_sleep", "light_sleep", "modem_sleep"]
|
||
|
SLEEP_MODE = dict(zip(SLEEP_MODE_LIST, range(len(SLEEP_MODE_LIST))))
|
||
|
|
||
|
SAMPLE_RATE = 0.002
|
||
|
SAMPLE_NUM = 512
|
||
|
MAX_VALUE = 1
|
||
|
Y_AXIS_LABEL = "Current (mA)"
|
||
|
|
||
|
MEASURE_FREQ_HOUR = 3600
|
||
|
|
||
|
GPIO_WAKE_UP = 15
|
||
|
GPIO_EDGE_DELAY = 120 # 20 ms
|
||
|
GPIO_CHIP_RESET = 14
|
||
|
GPIO_CHIP_RESET_DELAY = 100
|
||
|
|
||
|
NONE_SLEEP_MIN_CUR = 30
|
||
|
LIGHT_SLEEP_MIN_CUR = 1.5
|
||
|
MODEM_SLEEP_MIN_CUR = 20
|
||
|
|
||
|
LIGHT_SLEEP_WAKEUP_DELAY = 0.01
|
||
|
|
||
|
|
||
|
class ForceSleep(PerformanceTCBase.PerformanceTCBase):
|
||
|
|
||
|
def __init__(self, name, test_env, cmd_set, timeout=30, log_path=TCActionBase.LOG_PATH):
|
||
|
PerformanceTCBase.PerformanceTCBase.__init__(self, name, test_env, cmd_set=cmd_set,
|
||
|
timeout=timeout, log_path=log_path)
|
||
|
self.test_mode = "mode_change"
|
||
|
self.test_count = 100
|
||
|
self.sleep_mode = SLEEP_MODE_LIST
|
||
|
# load param from excel
|
||
|
for i in range(1, len(cmd_set)):
|
||
|
if cmd_set[i][0] != "dummy":
|
||
|
cmd_string = "self." + cmd_set[i][0]
|
||
|
exec cmd_string
|
||
|
self.log_folder = MakeFolder.make_folder(os.path.join(LOG_PATH,
|
||
|
"FORCE_SLEEP_%s_%s" % (self.test_mode,
|
||
|
time.strftime("%d%H%M%S",
|
||
|
time.localtime()))))
|
||
|
self.multimeter = MultimeterUtil.MultimeterUtil(self.log_folder)
|
||
|
|
||
|
@staticmethod
|
||
|
def find_min_items(item_list, count):
|
||
|
assert count < len(item_list)
|
||
|
min_items = []
|
||
|
for i in range(count):
|
||
|
min_val = min(item_list)
|
||
|
min_items.append(min_val)
|
||
|
item_list.remove(min_val)
|
||
|
return min_items
|
||
|
|
||
|
def sleep_time_boundary_test(self):
|
||
|
result = True
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "op -S -o 0")
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
if self.check_response("SSC1", "+MODE:OK") is False:
|
||
|
result = False
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "fsleep -S -t 1")
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
if self.check_response("SSC1", "+FSLEEP_MODE:OK") is False:
|
||
|
result = False
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "fsleep -D -d 0")
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
# if self.check_response("SSC1", "+FSLEEP_MODE:OK") is False:
|
||
|
# result = False
|
||
|
time.sleep(1)
|
||
|
current_line = self.multimeter.measure_current(sample_rate=SAMPLE_RATE,
|
||
|
sample_num=SAMPLE_NUM,
|
||
|
max_value=MAX_VALUE)
|
||
|
min_items = self.find_min_items(current_line, 10)
|
||
|
average_val = float(0)
|
||
|
for val in min_items:
|
||
|
average_val += val
|
||
|
average_val /= 10
|
||
|
if average_val > LIGHT_SLEEP_MIN_CUR:
|
||
|
NativeLog.add_trace_critical("[ForceSleep][Boundary] did not enter light sleep %d" % average_val)
|
||
|
result = False
|
||
|
return result
|
||
|
else:
|
||
|
NativeLog.add_trace_critical("[ForceSleep][Boundary] enter light sleep")
|
||
|
|
||
|
for i in range(3):
|
||
|
time.sleep(MEASURE_FREQ_HOUR)
|
||
|
for j in range(3):
|
||
|
time.sleep(10)
|
||
|
current_line = self.multimeter.measure_current(sample_rate=SAMPLE_RATE,
|
||
|
sample_num=SAMPLE_NUM,
|
||
|
max_value=MAX_VALUE)
|
||
|
self.multimeter.draw_graph(current_line, SAMPLE_RATE,
|
||
|
"light_sleep_boundary_%s_%s" % (i, j), Y_AXIS_LABEL)
|
||
|
pass
|
||
|
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
time.sleep(1)
|
||
|
self.serial_write_line("SSC1", "reboot")
|
||
|
self.check_response("SSC1", "ready!!!")
|
||
|
self.serial_write_line("SSC1", "fsleep -S -t 1")
|
||
|
if self.check_response("SSC1", "+FSLEEP_MODE:OK") is False:
|
||
|
result = False
|
||
|
self.serial_write_line("SSC1", "")
|
||
|
self.serial_write_line("SSC1", "fsleep -B -t 1")
|
||
|
if self.check_response("SSC1", "+FSLEEP_MODE:OK") is False:
|
||
|
result = False
|
||
|
time.sleep(MEASURE_FREQ_HOUR)
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_CHIP_RESET,GPIO_CHIP_RESET_DELAY))
|
||
|
return result
|
||
|
|
||
|
def force_sleep_current_measure(self, sleep_mode):
|
||
|
result = True
|
||
|
# choose sleep mode
|
||
|
sleep_mode_enum = SLEEP_MODE[sleep_mode]
|
||
|
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "op -S -o 0")
|
||
|
if self.check_response("SSC1", "+MODE:OK") is False:
|
||
|
result = False
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
|
||
|
# set sleep mode
|
||
|
self.serial_write_line("SSC1", "fsleep -S -t %s" % sleep_mode_enum)
|
||
|
if self.check_response("SSC1", "+FSLEEP_MODE:OK") is False:
|
||
|
result = False
|
||
|
self.serial_write_line("SSC1", "fsleep -D -d 0")
|
||
|
# if self.check_response("SSC1", "+FSLEEP_MODE:OK") is False:
|
||
|
# result = False
|
||
|
|
||
|
time.sleep(3)
|
||
|
|
||
|
for i in range(10):
|
||
|
time.sleep(10)
|
||
|
# measure current
|
||
|
current_line = self.multimeter.measure_current(sample_rate=SAMPLE_RATE,
|
||
|
sample_num=SAMPLE_NUM,
|
||
|
max_value=MAX_VALUE)
|
||
|
self.multimeter.draw_graph(current_line, SAMPLE_RATE,
|
||
|
"force_%s_sleep_current_%s" % (sleep_mode, i), Y_AXIS_LABEL)
|
||
|
NativeLog.add_trace_critical("[ForceSleep][current_measure] force_%s_%d"% (sleep_mode,i))
|
||
|
|
||
|
# self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP,GPIO_EDGE_DELAY))
|
||
|
# self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
# self.serial_write_line("SSC1", "reboot")
|
||
|
# self.check_response("SSC1", "ready!!!")
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_CHIP_RESET, GPIO_CHIP_RESET_DELAY))
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
if self.check_response("SSC1", "ready!!!") is False:
|
||
|
result = False
|
||
|
time.sleep(1)
|
||
|
return result
|
||
|
|
||
|
def force_sleep_illegal_enter(self):
|
||
|
result = True
|
||
|
# choose sleep mode
|
||
|
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "op -S -o 2")
|
||
|
if self.check_response("SSC1", "+MODE:OK") is False:
|
||
|
result = False
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
|
||
|
# set sleep mode
|
||
|
self.serial_write_line("SSC1", "fsleep -D -d 0")
|
||
|
if self.check_response("SSC1", "ready!!!", timeout=10) is False:
|
||
|
result = False
|
||
|
time.sleep(5)
|
||
|
return result
|
||
|
|
||
|
def force_sleep_stable_test(self):
|
||
|
result = True
|
||
|
# choose sleep mode
|
||
|
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "fsleep -L")
|
||
|
if self.check_response("SSC1", "+MODE:OK") is False:
|
||
|
result = False
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
|
||
|
time.sleep(3600)
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_CHIP_RESET, GPIO_CHIP_RESET_DELAY))
|
||
|
time.sleep(5)
|
||
|
return result
|
||
|
|
||
|
def cleanup(self):
|
||
|
self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY))
|
||
|
time.sleep(LIGHT_SLEEP_WAKEUP_DELAY)
|
||
|
self.serial_write_line("SSC1", "reboot")
|
||
|
self.check_response("SSC1", "ready!!!")
|
||
|
self.check_response("SSC2", "+GPIO_SET:OK")
|
||
|
|
||
|
def execute(self):
|
||
|
TCActionBase.TCActionBase.execute(self)
|
||
|
self.serial_write_line("SSC2", "sta -D")
|
||
|
self.check_response("SSC2", "+QAP")
|
||
|
self.serial_write_line("SSC1", "sta -D")
|
||
|
self.check_response("SSC1", "+QAP")
|
||
|
try:
|
||
|
test_mode = self.test_mode
|
||
|
test_count = self.test_count
|
||
|
sleep_mode = self.sleep_mode
|
||
|
except StandardError, e:
|
||
|
return
|
||
|
|
||
|
# set gpio to input on sleep target
|
||
|
self.serial_write_line("SSC1", "gpio -G -p %d" % GPIO_WAKE_UP)
|
||
|
self.check_response("SSC1", "+GPIO_GET")
|
||
|
self.serial_write_line("SSC1", "gpio -G -p %d" % GPIO_CHIP_RESET)
|
||
|
self.check_response("SSC1", "+GPIO_GET")
|
||
|
|
||
|
if test_mode == "boundary_test":
|
||
|
for i in range(test_count):
|
||
|
result = self.sleep_time_boundary_test()
|
||
|
pass
|
||
|
elif test_mode == "measure_current":
|
||
|
for j in range(test_count):
|
||
|
for mode in sleep_mode:
|
||
|
result = self.force_sleep_current_measure(mode)
|
||
|
pass
|
||
|
elif test_mode == "illegal_enter":
|
||
|
for i in range(test_count):
|
||
|
result = self.force_sleep_illegal_enter()
|
||
|
pass
|
||
|
elif test_mode == "stable_test":
|
||
|
for i in range(test_count):
|
||
|
result = self.force_sleep_stable_test()
|
||
|
pass
|
||
|
pass
|
||
|
|
||
|
|
||
|
def main():
|
||
|
pass
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|