mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
"""
 | 
						|
mbed SDK
 | 
						|
Copyright (c) 2011-2013 ARM Limited
 | 
						|
 | 
						|
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.
 | 
						|
"""
 | 
						|
 | 
						|
from mbed_host_tests import BaseHostTest
 | 
						|
 | 
						|
 | 
						|
class TimingDriftTest(BaseHostTest):
 | 
						|
    """ This test is reading single characters from stdio
 | 
						|
        and measures time between their occurrences.
 | 
						|
    """
 | 
						|
    __result = None
 | 
						|
    
 | 
						|
    # This is calculated later: average_drift_max * number of tick events
 | 
						|
    total_drift_max = None
 | 
						|
    
 | 
						|
    average_drift_max = 0.05
 | 
						|
    ticks = []
 | 
						|
    start_time = None
 | 
						|
    finish_time = None
 | 
						|
    dut_seconds_passed = None
 | 
						|
    total_time = None
 | 
						|
    total_drift = None
 | 
						|
    average_drift = None
 | 
						|
    
 | 
						|
    def _callback_result(self, key, value, timestamp):
 | 
						|
        # We should not see result data in this test
 | 
						|
        self.__result = False
 | 
						|
 | 
						|
    def _callback_end(self, key, value, timestamp):
 | 
						|
        """ {{end;%s}}} """
 | 
						|
        self.log("Received end event, timestamp: %f" % timestamp)
 | 
						|
        self.notify_complete(result=self.result(print_stats=True))
 | 
						|
 | 
						|
 | 
						|
    def _callback_tick(self, key, value, timestamp):
 | 
						|
        """ {{tick;%d}}} """
 | 
						|
        self.log("tick! %f" % timestamp)
 | 
						|
        self.ticks.append((key, value, timestamp))
 | 
						|
 | 
						|
 | 
						|
    def setup(self):
 | 
						|
        self.register_callback("end", self._callback_end)
 | 
						|
        self.register_callback('tick', self._callback_tick)
 | 
						|
 | 
						|
 | 
						|
    def result(self, print_stats=True):        
 | 
						|
        self.dut_seconds_passed = len(self.ticks) - 1
 | 
						|
        
 | 
						|
        if self.dut_seconds_passed < 1:
 | 
						|
            if print_stats:
 | 
						|
                self.log("FAIL: failed to receive at least two tick events")
 | 
						|
            self.__result = False
 | 
						|
            return self.__result
 | 
						|
 | 
						|
        self.total_drift_max = self.dut_seconds_passed * self.average_drift_max
 | 
						|
 | 
						|
        self.start_time = self.ticks[0][2]
 | 
						|
        self.finish_time = self.ticks[-1][2]
 | 
						|
        self.total_time = self.finish_time - self.start_time
 | 
						|
        self.total_drift = self.total_time - self.dut_seconds_passed
 | 
						|
        self.average_drift = self.total_drift / self.dut_seconds_passed
 | 
						|
        
 | 
						|
        if print_stats:
 | 
						|
            self.log("Start: %f" % self.start_time)
 | 
						|
            self.log("Finish: %f" % self.finish_time)
 | 
						|
            self.log("Total time taken: %f" % self.total_time)
 | 
						|
        
 | 
						|
            total_drift_ratio_string = "Total drift/Max total drift: %f/%f"
 | 
						|
            self.log(total_drift_ratio_string % (self.total_drift,
 | 
						|
                                                 self.total_drift_max))
 | 
						|
                                                 
 | 
						|
            average_drift_ratio_string = "Average drift/Max average drift: %f/%f"
 | 
						|
            self.log(average_drift_ratio_string % (self.average_drift,
 | 
						|
                                                   self.average_drift_max))
 | 
						|
        
 | 
						|
 | 
						|
        if abs(self.total_drift) > self.total_drift_max:
 | 
						|
            if print_stats:
 | 
						|
                self.log("FAIL: Total drift exceeded max total drift")
 | 
						|
            self.__result = False
 | 
						|
        elif self.average_drift > self.average_drift_max:
 | 
						|
            if print_stats:
 | 
						|
                self.log("FAIL: Average drift exceeded max average drift")
 | 
						|
            self.__result = False
 | 
						|
        else:
 | 
						|
            self.__result = True
 | 
						|
        
 | 
						|
        return self.__result
 | 
						|
 | 
						|
 | 
						|
    def teardown(self):
 | 
						|
        pass |