import random import os import time from TCAction import TCActionBase, PerformanceTCBase from NativeLog import NativeLog from Utility import MakeFolder from Utility import MultimeterUtil 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_SLEEP_MODE_CHANGE = 0.002 SAMPLE_NUM_SLEEP_MODE_CHANGE = 256 SAMPLE_RATE = 0.002 SAMPLE_NUM = 512 MAX_VALUE = 1 Y_AXIS_LABEL = "Current (mA)" GPIO_EDGE_DELAY = 120 # 20 ms NONE_SLEEP_MIN_CUR = 30 LIGHT_SLEEP_MIN_CUR = 1.5 MODEM_SLEEP_MIN_CUR = 20 GPIO_WAKE_UP = 15 AT_WAKE_UP_IND_PIN = 14 AT_WAKE_UP_PIN = 12 class ATSleep(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 self.sleep_wake_pin = AT_WAKE_UP_PIN self.sleep_wakeup_ind_pin = AT_WAKE_UP_IND_PIN # 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, "AT_AUTO_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_mode_change(self, sleep_mode): result = True NativeLog.add_prompt_trace("[AutoSleep][ModeChange] %s start" % sleep_mode) # choose sleep mode sleep_mode_enum = SLEEP_MODE[sleep_mode] # change GPIO to make sure target exit sleep mode, so it can process SSC commands self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY)) # set sleep mode self.serial_write_line("AT1", "AT+SLEEP=%d" % sleep_mode_enum) self.check_response("AT1", "OK") self.check_response("SSC2", "+GPIO_SET:OK") NativeLog.add_prompt_trace("[AutoSleep][ModeChange] mode set") time.sleep(10) # measure current current_line = self.multimeter.measure_current(sample_rate=SAMPLE_RATE_SLEEP_MODE_CHANGE, sample_num=SAMPLE_NUM_SLEEP_MODE_CHANGE, max_value=MAX_VALUE) # do check measure min_items = self.find_min_items(current_line, 10) average_val = float(0) for val in min_items: average_val += val average_val /= 10 NativeLog.add_prompt_trace("[AutoSleep][ModeChange] measure done, average min current %f" % average_val) if sleep_mode == "none_sleep": if average_val < NONE_SLEEP_MIN_CUR: result = False elif sleep_mode == "light_sleep": if average_val > LIGHT_SLEEP_MIN_CUR: result = False elif sleep_mode == "modem_sleep": if average_val > MODEM_SLEEP_MIN_CUR or average_val < LIGHT_SLEEP_MIN_CUR: result = False if result is False: NativeLog.add_trace_critical("[AutoSleep][ModeChange] %s failed" % sleep_mode) self.multimeter.draw_graph(current_line, SAMPLE_RATE, "%s_fail" % sleep_mode, Y_AXIS_LABEL) time.sleep(5) return result def sleep_current_measure(self, sleep_mode): result = True NativeLog.add_prompt_trace("[AutoSleep][CurrentMeasure] %s start" % sleep_mode) # choose sleep mode sleep_mode_enum = SLEEP_MODE[sleep_mode] # change GPIO to make sure target exit sleep mode, so it can process SSC commands self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY)) # set sleep mode self.serial_write_line("AT1", "AT+SLEEP=%d" % sleep_mode_enum) self.check_response("AT1", "OK") self.check_response("SSC2", "+GPIO_SET:OK") NativeLog.add_prompt_trace("[AutoSleep][CurrentMeasure] set mode done") 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, sleep_mode, Y_AXIS_LABEL) NativeLog.add_prompt_trace("[AutoSleep][CurrentMeasure] measure done") return result def light_sleep_wakeup(self): result = True NativeLog.add_prompt_trace("[AutoSleep][LightSleepWakeup] start") self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY)) time.sleep(1) self.serial_write_line("AT1", "") time.sleep(1) self.check_response("SSC2", "+GPIO_SET:OK", timeout=1) for i in range(10): self.serial_write_line("SSC2", "gpio -G -p %d" % self.sleep_wakeup_ind_pin) if self.check_response("SSC2", "+GPIO_GET:0", timeout=0.73) is True: break else: NativeLog.add_prompt_trace("AT Sleep wakeup pin is not correct when in sleep") # check if respond to uart self.flush_data("AT1") for i in range(60): self.serial_write("AT1", "a") time.sleep(0.43) time.sleep(0.1) respond_data = self.serial_read_data("AT1") if len(respond_data) >= 60: NativeLog.add_trace_critical("[AutoSleep][light sleep wakeup] " "Failed when recving data during sleep, %d" % len(respond_data)) result = False NativeLog.add_prompt_trace("[AutoSleep][LightSleepWakeup] check on sleep mode done") # change GPIO to make target wakeup self.serial_write_line("SSC2", "gpio -L -p %d -t 0" % GPIO_WAKE_UP) self.check_response("SSC2", "+GPIO_SET:OK") time.sleep(0.01) for i in range(3): self.serial_write_line("SSC2", "gpio -G -p %d" % self.sleep_wakeup_ind_pin) if self.check_response("SSC2", "+GPIO_GET:1") is False: NativeLog.add_prompt_trace("AT Sleep wakeup pin is not correct when wakeup") self.serial_write_line("AT1", "") time.sleep(1) self.flush_data("AT1") for i in range(60): self.serial_write("AT1", "a") time.sleep(0.043) time.sleep(0.1) respond_data = self.serial_read_data("AT1") if len(respond_data) < 60: NativeLog.add_trace_critical("[AutoSleep][light sleep wakeup] " "Failed when recving data during wakeup, %d" % len(respond_data)) result = False NativeLog.add_prompt_trace("[AutoSleep][LightSleepWakeup] check on wakeup mode done") self.serial_write_line("AT1", "") # restore GPIO level self.serial_write_line("SSC2", "gpio -L -p %d -t 1" % GPIO_WAKE_UP) time.sleep(2) return result def cleanup(self): self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY)) self.serial_write_line("AT1", "") self.serial_write_line("AT1", "AT+RST") self.check_response("SSC2", "+GPIO_SET:OK") self.check_response("AT1", "ready") def execute(self): TCActionBase.TCActionBase.execute(self) try: test_mode = self.test_mode test_count = self.test_count sleep_mode = self.sleep_mode except StandardError, e: return # make sure enter modem sleep mode before start test self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY)) self.serial_write_line("AT1", "AT+RST") self.check_response("SSC2", "+GPIO_SET:OK") self.check_response("AT1", "ready") self.check_response("AT1", "WIFI GOT IP") # set AT light sleep wakeup pin self.serial_write_line("AT1", "AT+WAKEUPGPIO=1,%d,0" % self.sleep_wake_pin) self.check_response("AT1", "OK") # start test if "mode_change" in test_mode: for i in range(test_count): result = self.sleep_mode_change(random.choice(SLEEP_MODE_LIST)) elif "measure_current" in test_mode: for i in range(test_count): for mode in sleep_mode: result = self.sleep_current_measure(mode) pass elif "gpio_wakeup" in test_mode: # change GPIO to make sure target exit sleep mode, so it can process SSC commands self.serial_write_line("SSC2", "gpio -E -p %d -t 0 -d %d" % (GPIO_WAKE_UP, GPIO_EDGE_DELAY)) # config wakeup gpio self.serial_write_line("AT1", "AT+WAKEUPGPIO=1,%d,0,%d,1" % (self.sleep_wake_pin, self.sleep_wakeup_ind_pin)) self.check_response("AT1", "OK") # set sleep mode self.serial_write_line("AT1", "AT+SLEEP=%d" % SLEEP_MODE["light_sleep"]) self.check_response("AT1", "OK") self.check_response("SSC2", "+GPIO_SET:OK") for i in range(test_count): result = self.light_sleep_wakeup() pass pass def main(): pass if __name__ == '__main__': main()