Beispiel #1
0
def gen_messages(opts) :
    """Generate pprzlink message formatters and parsers using options.
    This function allows python scripts under Windows to control generators
    using the same interface as shell scripts under Unix"""

    fname = opts.definition

    # Enable validation by default, disabling it if explicitly requested
    if opts.validate:
        try:
            from lib.genxmlif import GenXmlIfError
            from lib.minixsv import pyxsval
        except:
            print("WARNING: Unable to load XML validator libraries. XML validation will not be performed")
            opts.validate = False

    def pprz_validate(fname, schema, errorLimitNumber) :
        """Uses minixsv to validate an XML file with a given XSD schema file. We define pprz_validate
           here because it relies on the XML libs that were loaded in gen_messages(), so it can't be called standalone"""
        # use default values of minixsv, location of the schema file must be specified in the XML file
        try:
            domTreeWrapper = pyxsval.parseAndValidate(fname, xsdFile=schema, errorLimit=errorLimitNumber)
        except pyxsval.XsvalError as errstr:
            print(errstr)
            return 1
        except GenXmlIfError as errstr:
            print(errstr)
            return 1
        return 0

    # Process XML file, validating as necessary.
    validation_result = 0
    if opts.validate:
        print("Validating msg_class %s in %s" % (opts.class_name, fname))
        validation_result = pprz_validate(fname, schemaFile, opts.error_limit)
    else:
        print("Validation skipped for msg_class %s in %s." % (opts.class_name, fname))

    print("Parsing %s" % fname)
    xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol)

    if pprz_parse.check_duplicates(xml):
        sys.exit(1)

    print("Found %u PPRZLink messages of msg_class %s in XML file %s" % (
        pprz_parse.total_msgs(xml), opts.class_name, fname))

    if opts.only_validate:
        sys.exit(validation_result)

    # Convert language option to lowercase and validate
    opts.language = opts.language.lower()
    if opts.language == 'c':
        import gen_messages_c
        gen_messages_c.generate(opts.output, xml)
    else:
        print("Unsupported language %s" % opts.language)
Beispiel #2
0
    xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol)

    if pprz_parse.check_duplicates(xml):
        sys.exit(1)

    print("Found %u PPRZLink message types in XML file %s" %
          (pprz_parse.total_msgs(xml), fname))

    if opts.only_validate:
        sys.exit(validation_result)

    # Convert language option to lowercase and validate
    opts.language = opts.language.lower()
    if opts.language == 'c':
        import gen_messages_c
        gen_messages_c.generate(opts.output, xml)
    else:
        print("Unsupported language %s" % opts.language)


if __name__ == "__main__":
    import pprz_parse
    from argparse import ArgumentParser

    parser = ArgumentParser(
        description=
        "This tool generate implementations from PPRZLink message definitions")
    parser.add_argument("-o",
                        "--output",
                        default="stdout",
                        help="output file or stream [default: %(default)s]")
Beispiel #3
0
def gen_messages(opts):
    """Generate pprzlink message formatters and parsers using options.
    This function allows python scripts under Windows to control generators
    using the same interface as shell scripts under Unix"""

    fname = opts.definition

    # Enable validation by default, disabling it if explicitly requested
    if opts.validate:
        try:
            from lib.genxmlif import GenXmlIfError
            from lib.minixsv import pyxsval
        except:
            print(
                "WARNING: Unable to load XML validator libraries. XML validation will not be performed"
            )
            opts.validate = False

    def pprz_validate(fname, schema, errorLimitNumber):
        """Uses minixsv to validate an XML file with a given XSD schema file. We define pprz_validate
           here because it relies on the XML libs that were loaded in gen_messages(), so it can't be called standalone"""
        # use default values of minixsv, location of the schema file must be specified in the XML file
        try:
            domTreeWrapper = pyxsval.parseAndValidate(
                fname, xsdFile=schema, errorLimit=errorLimitNumber)
        except pyxsval.XsvalError as errstr:
            print(errstr)
            return 1
        except GenXmlIfError as errstr:
            print(errstr)
            return 1
        return 0

    # Process XML file, validating as necessary.
    validation_result = 0
    if opts.validate:
        print("Validating msg_class %s in %s" % (opts.class_name, fname))
        validation_result = pprz_validate(fname, schemaFile, opts.error_limit)
    else:
        print("Validation skipped for msg_class %s in %s." %
              (opts.class_name, fname))

    print("Parsing %s" % fname)
    xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol)

    if pprz_parse.check_duplicates(xml):
        sys.exit(1)

    print("Found %u PPRZLink messages of msg_class %s in XML file %s" %
          (pprz_parse.total_msgs(xml), opts.class_name, fname))

    if opts.only_validate:
        sys.exit(validation_result)

    # Convert language option to lowercase and validate
    opts.language = opts.language.lower()
    if opts.language == 'c':
        import gen_messages_c
        gen_messages_c.generate(opts.output, xml)
    else:
        print("Unsupported language %s" % opts.language)
Beispiel #4
0
    xml = pprz_parse.PPRZXML(fname, opts.class_name, opts.protocol)

    if pprz_parse.check_duplicates(xml):
        sys.exit(1)

    print("Found %u PPRZLink messages of msg_class %s in XML file %s" % (
        pprz_parse.total_msgs(xml), opts.class_name, fname))

    if opts.only_validate:
        sys.exit(validation_result)

    # Convert language option to lowercase and validate
    opts.language = opts.language.lower()
    if opts.language == 'c':
        import gen_messages_c
        gen_messages_c.generate(opts.output, xml)
    else:
        print("Unsupported language %s" % opts.language)


if __name__ == "__main__":
    import pprz_parse
    from argparse import ArgumentParser

    parser = ArgumentParser(description="This tool generate implementations from PPRZLink message definitions")
    parser.add_argument("-o", "--output", default="stdout", help="output file or stream [default: %(default)s]")
    parser.add_argument("--lang", dest="language", choices=supportedLanguages, default=DEFAULT_LANGUAGE, help="language of generated code [default: %(default)s]")
    parser.add_argument("--protocol", choices=[pprz_parse.PROTOCOL_1_0], default=DEFAULT_PROTOCOL, help="PPRZLink protocol version. [default: %(default)s]")
    parser.add_argument("--no-validate", action="store_false", dest="validate", default=DEFAULT_VALIDATE, help="Do not perform XML validation. Can speed up code generation if XML files are known to be correct.")
    parser.add_argument("--only-validate", action="store_true", dest="only_validate", help="Only validate messages without generation.")
    parser.add_argument("--error-limit", default=DEFAULT_ERROR_LIMIT, help="maximum number of validation errors to display")