diff --git a/Tools/fsm_visualisation.py b/Tools/fsm_visualisation.py deleted file mode 100755 index c678ef0f4b..0000000000 --- a/Tools/fsm_visualisation.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python3 - -"""fsm_visualisation.py: Create dot code and dokuwiki table from a state transition table - -convert dot code to png using graphviz: - -dot fsm.dot -Tpng -o fsm.png -""" - -import argparse -import re - -__author__ = "Julian Oes" - -def get_dot_header(): - - return """digraph finite_state_machine { - graph [ dpi = 300 ]; - ratio = 1.5 - node [shape = circle];""" - -def get_dot_footer(): - - return """}\n""" - -def main(): - - # parse input arguments - parser = argparse.ArgumentParser(description='Create dot code and dokuwiki table from a state transition table.') - parser.add_argument("-i", "--input-file", default=None, help="choose file to parse") - parser.add_argument("-d", "--dot-file", default=None, help="choose file for output dot file") - parser.add_argument("-t", "--table-file", default=None, help="choose file for output of table") - args = parser.parse_args() - - # open source file - if args.input_file == None: - exit('please specify file') - f = open(args.input_file,'r') - source = f.read() - - # search for state transition table and extract the table itself - # first look for StateTable::Tran - # then accept anything including newline until { - # but don't accept the definition (without ;) - # then extract anything inside the brackets until }; - match = re.search(r'StateTable::Tran(?:.|\n!;)*\{((?:.|\n)*?)\};', source) - - if not match: - exit('no state transition table found') - - table_source = match.group(1) - - # bookkeeping for error checking - num_errors_found = 0 - - states = [] - events = [] - - # first get all states and events - for table_line in table_source.split('\n'): - - match = re.search(r'/\*\s+\w+_STATE_(\w+)\s+\*/', table_line) - if match: - states.append(str(match.group(1))) - # go to next line - continue - - if len(states) == 1: - match = re.search(r'/\*\s+EVENT_(\w+)\s+\*/', table_line) - if match: - events.append(str(match.group(1))) - - print('Found %d states and %d events' % (len(states), len(events))) - - - # keep track of origin state - state = None - - # fill dot code in here - dot_code = '' - - # create table len(states)xlen(events) - transition_table = [[[] for x in range(len(states))] for y in range(len(events))] - - # now fill the transition table and write the dot code - for table_line in table_source.split('\n'): - - # get states - # from: /* NAV_STATE_NONE */ - # extract only "NONE" - match = re.search(r'/\*\s+\w+_STATE_(\w+)\s+\*/', table_line) - if match: - state = match.group(1) - state_index = states.index(state) - # go to next line - continue - - # can't advance without proper state - if state == None: - continue - - # get event and next state - # from /* EVENT_READY_REQUESTED */ {ACTION(&Navigator::start_ready), NAV_STATE_READY} - # extract "READY_REQUESTED" and "READY" if there is ACTION - match_action = re.search(r'/\*\s+EVENT_(\w+)\s+\*/\s+\{ACTION\((?:.|\n)*\w+_STATE_(\w+)', table_line) - - # get event and next state - # from /* EVENT_NONE_REQUESTED */ {NO_ACTION, NAV_STATE_NONE}, - # extract "NONE_REQUESTED" and "NAV_STATE_NONE" if there is NO_ACTION - match_no_action = re.search(r'/\*\s+EVENT_(\w+)\s+\*/\s+\{NO_ACTION(?:.|\n)*\w+_STATE_(\w+)', table_line) - - # ignore lines with brackets only - if match_action or match_no_action: - - # only write arrows for actions - if match_action: - event = match_action.group(1) - new_state = match_action.group(2) - dot_code += ' ' + state + ' -> ' + new_state + '[ label = "' + event + '"];\n' - - elif match_no_action: - event = match_no_action.group(1) - new_state = match_no_action.group(2) - - # check for state changes without action - if state != new_state: - print('Error: no action but state change:') - print('State: ' + state + ' changed to: ' + new_state) - print(table_line) - num_errors_found += 1 - - # check for wrong events - if event not in events: - print('Error: unknown event: ' + event) - print(table_line) - num_errors_found += 1 - - # check for wrong new states - if new_state not in states: - print('Error: unknown new state: ' + new_state) - print(table_line) - num_errors_found += 1 - - # save new state in transition table - event_index = events.index(event) - - # bold for action - if match_action: - transition_table[event_index][state_index] = '**' + new_state + '**' - else: - transition_table[event_index][state_index] = new_state - - - - # assemble dot code - dot_code = get_dot_header() + dot_code + get_dot_footer() - - # write or print dot file - if args.dot_file: - f = open(args.dot_file,'w') - f.write(dot_code) - print('Wrote dot file') - else: - print('##########Dot-start##########') - print(dot_code) - print('##########Dot-end############') - - - # assemble doku wiki table - table_code = '| ^ ' - # start with header of all states - for state in states: - table_code += state + ' ^ ' - - table_code += '\n' - - # add events and new states - for event, row in zip(events, transition_table): - table_code += '^ ' + event + ' | ' - for new_state in row: - table_code += new_state + ' | ' - table_code += '\n' - - # write or print wiki table - if args.table_file: - f = open(args.table_file,'w') - f.write(table_code) - print('Wrote table file') - else: - print('##########Table-start########') - print(table_code) - print('##########Table-end##########') - - # report obvous errors - if num_errors_found: - print('Obvious errors found: %d' % num_errors_found) - else: - print('No obvious errors found') - -if __name__ == '__main__': - main() diff --git a/src/lib/parameters/px4params/__init__.py b/src/lib/parameters/px4params/__init__.py index a1142bff09..5103c86f3a 100644 --- a/src/lib/parameters/px4params/__init__.py +++ b/src/lib/parameters/px4params/__init__.py @@ -1 +1 @@ -__all__ = ["srcscanner", "srcparser", "xmlout", "dokuwikiout", "dokuwikirpc", "scope"] +__all__ = ["srcscanner", "srcparser", "xmlout", "scope"] diff --git a/src/lib/parameters/px4params/dokuwikiout.py b/src/lib/parameters/px4params/dokuwikiout.py deleted file mode 100644 index 28e487ea62..0000000000 --- a/src/lib/parameters/px4params/dokuwikiout.py +++ /dev/null @@ -1,44 +0,0 @@ -from xml.sax.saxutils import escape -import codecs - -class DokuWikiTablesOutput(): - def __init__(self, groups): - result = ("====== Parameter Reference ======\n" - "**This list is auto-generated from the source code** and contains the most recent parameter documentation.\n" - "\n") - for group in groups: - result += "==== %s ====\n\n" % group.GetName() - result += "|< 100% 25% 45% 10% 10% 10% >|\n" - result += "^ Name ^ Description ^ Min ^ Max ^ Default ^\n" - result += "^ ::: ^ Comment ^^^^\n" - for param in group.GetParams(): - code = param.GetName() - def_val = param.GetDefault() - name = param.GetFieldValue("short_desc") - min_val = param.GetFieldValue("min") - max_val = param.GetFieldValue("max") - long_desc = param.GetFieldValue("long_desc") - - if name == code: - name = "" - else: - name = name.replace("\n", " ") - name = name.replace("|", "%%|%%") - name = name.replace("^", "%%^%%") - - result += "| **%s** |" % code - result += " %s |" % name - result += " %s |" % (min_val or "") - result += " %s |" % (max_val or "") - result += " %s |" % (def_val or "") - result += "\n" - - if long_desc is not None: - result += "| ::: |
%s
||||\n" % long_desc - - result += "\n" - self.output = result; - - def Save(self, filename): - with codecs.open(filename, 'w', 'utf-8') as f: - f.write(self.output) diff --git a/src/lib/parameters/px4params/dokuwikirpc.py b/src/lib/parameters/px4params/dokuwikirpc.py deleted file mode 100644 index 407d306fda..0000000000 --- a/src/lib/parameters/px4params/dokuwikirpc.py +++ /dev/null @@ -1,16 +0,0 @@ -try: - import xmlrpclib -except ImportError: - import xmlrpc.client as xmlrpclib - -# See https://www.dokuwiki.org/devel:xmlrpc for a list of available functions! -# Usage example: -# xmlrpc = dokuwikirpc.get_xmlrpc(url, username, password) -# print(xmlrpc.dokuwiki.getVersion()) - -def get_xmlrpc(url, username, password): - #proto, url = url.split("://") - #url = proto + "://" + username + ":" + password + "@" + url + "/lib/exe/xmlrpc.php" - url += "/lib/exe/xmlrpc.php?u=" + username + "&p=" + password - - return xmlrpclib.ServerProxy(url) diff --git a/src/lib/parameters/px_process_params.py b/src/lib/parameters/px_process_params.py index d8c8f7c2ff..00c428eaf4 100755 --- a/src/lib/parameters/px_process_params.py +++ b/src/lib/parameters/px_process_params.py @@ -40,18 +40,14 @@ # # Currently supported formats are: # * XML for the parametric UI generator -# * Human-readable description in DokuWiki page format # * Human-readable description in Markdown page format for the PX4 dev guide # -# This tool also allows to automatically upload the human-readable version -# to the DokuWiki installation via XML-RPC. -# from __future__ import print_function import sys import os import argparse -from px4params import srcscanner, srcparser, xmlout, dokuwikiout, dokuwikirpc, markdownout +from px4params import srcscanner, srcparser, xmlout, markdownout import re import json @@ -88,37 +84,6 @@ def main(): metavar="FILENAME", help="Create Markdown file" " (default FILENAME: parameters.md)") - parser.add_argument("-w", "--wiki", - nargs='?', - const="parameters.wiki", - metavar="FILENAME", - help="Create DokuWiki file" - " (default FILENAME: parameters.wiki)") - parser.add_argument("-u", "--wiki-update", - nargs='?', - const="firmware:parameters", - metavar="PAGENAME", - help="Update DokuWiki page" - " (default PAGENAME: firmware:parameters)") - parser.add_argument("--wiki-url", - default="https://pixhawk.org", - metavar="URL", - help="DokuWiki URL" - " (default: https://pixhawk.org)") - parser.add_argument("--wiki-user", - default=os.environ.get('XMLRPCUSER', None), - metavar="USERNAME", - help="DokuWiki XML-RPC user name" - " (default: $XMLRPCUSER environment variable)") - parser.add_argument("--wiki-pass", - default=os.environ.get('XMLRPCPASS', None), - metavar="PASSWORD", - help="DokuWiki XML-RPC user password" - " (default: $XMLRPCUSER environment variable)") - parser.add_argument("--wiki-summary", - metavar="SUMMARY", - default="Automagically updated parameter documentation from code.", - help="DokuWiki page edit summary") parser.add_argument('-v', '--verbose', action='store_true', help="verbose output") @@ -130,7 +95,7 @@ def main(): args = parser.parse_args() # Check for valid command - if not (args.xml or args.wiki or args.wiki_update or args.markdown): + if not (args.xml or args.markdown): print("Error: You need to specify at least one output method!\n") parser.print_usage() sys.exit(1) @@ -172,20 +137,6 @@ def main(): os.path.join(cur_dir, args.inject_xml)) out.Save(args.xml) - # Output to DokuWiki tables - if args.wiki or args.wiki_update: - out = dokuwikiout.DokuWikiTablesOutput(param_groups) - if args.wiki: - print("Creating wiki file " + args.wiki) - out.Save(args.wiki) - if args.wiki_update: - if args.wiki_user and args.wiki_pass: - print("Updating wiki page " + args.wiki_update) - xmlrpc = dokuwikirpc.get_xmlrpc(args.wiki_url, args.wiki_user, args.wiki_pass) - xmlrpc.wiki.putPage(args.wiki_update, out.output, {'sum': args.wiki_summary}) - else: - print("Error: You need to specify DokuWiki XML-RPC username and password!") - # Output to Markdown/HTML tables if args.markdown: out = markdownout.MarkdownTablesOutput(param_groups)