from LogAnalyzer import Test,TestResult import DataflashLog import collections class TestBrownout(Test): '''test for a log that has been truncated in flight''' def __init__(self): Test.__init__(self) self.name = "Brownout" def run(self, logdata, verbose): self.result = TestResult() self.result.status = TestResult.StatusType.GOOD isArmed = False # FIXME: cope with LOG_ARM_DISARM_MSG message if "EV" in logdata.channels: # step through the arm/disarm events in order, to see if they're symmetrical # note: it seems landing detection isn't robust enough to rely upon here, so we'll only consider arm+disarm, not takeoff+land for line,ev in logdata.channels["EV"]["Id"].listData: if ev == 10: isArmed = True elif ev == 11: isArmed = False if "CTUN" not in logdata.channels: self.result.status = TestResult.StatusType.UNKNOWN self.result.statusMessage = "No CTUN log data" return if "BarAlt" in logdata.channels['CTUN']: self.ctun_baralt_att = 'BarAlt' else: self.ctun_baralt_att = 'BAlt' # check for relative altitude at end (finalAlt,finalAltLine) = logdata.channels["CTUN"][self.ctun_baralt_att].getNearestValue(logdata.lineCount, lookForwards=False) finalAltMax = 3.0 # max alt offset that we'll still consider to be on the ground if isArmed and finalAlt > finalAltMax: self.result.status = TestResult.StatusType.FAIL self.result.statusMessage = "Truncated Log? Ends while armed at altitude %.2fm" % finalAlt