You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
3.1 KiB
66 lines
3.1 KiB
from __future__ import print_function |
|
|
|
from LogAnalyzer import Test, TestResult |
|
import DataflashLog |
|
from VehicleType import VehicleType |
|
|
|
class TestPerformance(Test): |
|
'''check performance monitoring messages (PM) for issues with slow loops, etc''' |
|
|
|
def __init__(self): |
|
Test.__init__(self) |
|
self.name = "PM" |
|
|
|
def run(self, logdata, verbose): |
|
self.result = TestResult() |
|
self.result.status = TestResult.StatusType.GOOD |
|
|
|
# this test should be valid for all vehicle types, just need to figure out why PM logging data is different in each |
|
if logdata.vehicleType != VehicleType.Copter: |
|
self.result.status = TestResult.StatusType.NA |
|
return |
|
|
|
# NOTE: we'll ignore MaxT altogether for now, it seems there are quite regularly one or two high values in there, even ignoring the ones expected after arm/disarm events |
|
# gather info on arm/disarm lines, we will ignore the MaxT data from the first line found after each of these |
|
# armingLines = [] |
|
# for line,ev in logdata.channels["EV"]["Id"].listData: |
|
# if (ev == 10) or (ev == 11): |
|
# armingLines.append(line) |
|
# ignoreMaxTLines = [] |
|
# for maxT in logdata.channels["PM"]["MaxT"].listData: |
|
# if not armingLines: |
|
# break |
|
# if maxT[0] > armingLines[0]: |
|
# #print("Ignoring maxT from line %d, as it is the first PM line after arming on line %d" % (maxT[0],armingLines[0])) |
|
# ignoreMaxTLines.append(maxT[0]) |
|
# armingLines.pop(0) |
|
|
|
if "PM" not in logdata.channels: |
|
self.result.status = TestResult.StatusType.UNKNOWN |
|
self.result.statusMessage = "No PM log data" |
|
return |
|
|
|
# check for slow loops, i.e. NLon greater than 6% of NLoop |
|
maxPercentSlow = 0 |
|
maxPercentSlowLine = 0 |
|
slowLoopLineCount = 0 |
|
for i in range(len(logdata.channels["PM"]["NLon"].listData)): |
|
(line, nLon) = logdata.channels["PM"]["NLon"].listData[i] |
|
(line, nLoop) = logdata.channels["PM"]["NLoop"].listData[i] |
|
(line, maxT) = logdata.channels["PM"]["MaxT"].listData[i] |
|
percentSlow = (nLon / float(nLoop)) * 100 |
|
if percentSlow > 6.0: |
|
slowLoopLineCount = slowLoopLineCount + 1 |
|
if percentSlow > maxPercentSlow: |
|
maxPercentSlow = percentSlow |
|
maxPercentSlowLine = line |
|
#if (maxT > 13000) and line not in ignoreMaxTLines: |
|
# print("MaxT of %d detected on line %d" % (maxT,line)) |
|
if (maxPercentSlow > 10) or (slowLoopLineCount > 6): |
|
self.result.status = TestResult.StatusType.FAIL |
|
self.result.statusMessage = "%d slow loop lines found, max %.2f%% on line %d" % (slowLoopLineCount,maxPercentSlow,maxPercentSlowLine) |
|
elif (maxPercentSlow > 6): |
|
self.result.status = TestResult.StatusType.WARN |
|
self.result.statusMessage = "%d slow loop lines found, max %.2f%% on line %d" % (slowLoopLineCount,maxPercentSlow,maxPercentSlowLine) |
|
|
|
|
|
|