autotest: logger_metadata: understand , in @LoggerMessage

This means multiple messages use exactly the same meaning in the fields

Also retain ordering of fields
This commit is contained in:
Peter Barker 2020-03-20 17:05:57 +11:00 committed by Peter Barker
parent de36b6a16a
commit e671a0912e
5 changed files with 34 additions and 8 deletions

View File

@ -1066,6 +1066,15 @@ class AutoTest(ABC):
(length, min_length)) (length, min_length))
self.progress("xml file length is %u" % length) self.progress("xml file length is %u" % length)
from lxml import objectify
xml = open(xml_filepath,'rb').read()
objectify.enable_recursive_str()
tree = objectify.fromstring(xml)
for thing in tree.logformat:
print("Got (%s)" % str(thing.get("name")))
# for entry in tree.children:
# print("Got entry (%s)" % str(entry))
def initialise_after_reboot_sitl(self): def initialise_after_reboot_sitl(self):
# after reboot stream-rates may be zero. Prompt MAVProxy to # after reboot stream-rates may be zero. Prompt MAVProxy to

View File

@ -41,7 +41,7 @@ DO NOT EDIT
print(' <table>', file=self.fh) print(' <table>', file=self.fh)
print(" <tr><th>FieldName</th><th>Description</th><tr>", print(" <tr><th>FieldName</th><th>Description</th><tr>",
file=self.fh) file=self.fh)
for f in docco.fields: for f in docco.fields_order:
if "description" in docco.fields[f]: if "description" in docco.fields[f]:
fdesc = docco.fields[f]["description"] fdesc = docco.fields[f]["description"]
else: else:

View File

@ -39,7 +39,7 @@ This is a list of log messages which may be present in logs produced and stored
print("~" * len(line), file=self.fh) print("~" * len(line), file=self.fh)
rows = [] rows = []
for f in docco.fields: for f in docco.fields_order:
if "description" in docco.fields[f]: if "description" in docco.fields[f]:
fdesc = docco.fields[f]["description"] fdesc = docco.fields[f]["description"]
else: else:

View File

@ -27,7 +27,7 @@ class XMLEmitter(emitter.Emitter):
print(' <description>%s</description>' % print(' <description>%s</description>' %
docco.description, file=self.fh) docco.description, file=self.fh)
print(' <fields>', file=self.fh) print(' <fields>', file=self.fh)
for f in docco.fields: for f in docco.fields_order:
print(' <field name="%s">' % f, file=self.fh) print(' <field name="%s">' % f, file=self.fh)
if "description" in docco.fields[f]: if "description" in docco.fields[f]:
print(' <description>%s</description>' % print(' <description>%s</description>' %

View File

@ -3,6 +3,7 @@
from __future__ import print_function from __future__ import print_function
import argparse import argparse
import copy
import os import os
import re import re
import sys import sys
@ -14,7 +15,7 @@ import emit_xml
topdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../../') topdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../../')
topdir = os.path.realpath(topdir) topdir = os.path.realpath(topdir)
re_loggermessage = re.compile(r"@LoggerMessage\s*:\s*(\w+)", re.MULTILINE) re_loggermessage = re.compile(r"@LoggerMessage\s*:\s*([\w,]+)", re.MULTILINE)
re_commentline = re.compile(r"\s*//") re_commentline = re.compile(r"\s*//")
re_description = re.compile(r"\s*//\s*@Description\s*:\s*(.*)") re_description = re.compile(r"\s*//\s*@Description\s*:\s*(.*)")
re_url = re.compile(r"\s*//\s*@URL\s*:\s*(.*)") re_url = re.compile(r"\s*//\s*@URL\s*:\s*(.*)")
@ -53,6 +54,7 @@ class LoggerDocco(object):
self.url = None self.url = None
self.description = None self.description = None
self.fields = {} self.fields = {}
self.fields_order = []
self.vehicles = None self.vehicles = None
def set_description(self, desc): def set_description(self, desc):
@ -61,14 +63,17 @@ class LoggerDocco(object):
def set_url(self, url): def set_url(self, url):
self.url = url self.url = url
def set_field_description(self, field, description): def ensure_field(self, field):
if field not in self.fields: if field not in self.fields:
self.fields[field] = {} self.fields[field] = {}
self.fields_order.append(field)
def set_field_description(self, field, description):
self.ensure_field(field)
self.fields[field]["description"] = description self.fields[field]["description"] = description
def set_field_bits(self, field, bits): def set_field_bits(self, field, bits):
if field not in self.fields: self.ensure_field(field)
self.fields = {}
self.fields[field]["bits"] = bits self.fields[field]["bits"] = bits
def set_vehicles(self, vehicles): def set_vehicles(self, vehicles):
@ -104,6 +109,8 @@ class LoggerDocco(object):
if m is None: if m is None:
continue continue
name = m.group(1) name = m.group(1)
if "," in name:
name = name.split(",")
state = state_inside state = state_inside
docco = LoggerDocco.Docco(name) docco = LoggerDocco.Docco(name)
elif state == state_inside: elif state == state_inside:
@ -140,8 +147,18 @@ class LoggerDocco(object):
self.parse_file(_file) self.parse_file(_file)
def emit_output(self): def emit_output(self):
# expand things like PIDR,PIDQ,PIDA into multiple doccos
new_doccos = []
for docco in self.doccos:
if type(docco.name) == list:
for name in docco.name:
tmpdocco = copy.copy(docco)
tmpdocco.name = name
new_doccos.append(tmpdocco)
else:
new_doccos.append(docco)
for emitter in self.emitters: for emitter in self.emitters:
emitter.emit(self.doccos) emitter.emit(new_doccos)
def run(self): def run(self):
self.files = [] self.files = []