Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/Tools/ardupilotwaf/mavgen.py
9807 views
1
# encoding: utf-8
2
# (c) Siddharth Bharat Purohit, 3DRobotics Inc.
3
4
# flake8: noqa
5
6
"""
7
The **mavgen.py** program is a code generator which creates mavlink header files.
8
"""
9
10
from waflib import Logs, Task, Utils, Node
11
from waflib.TaskGen import feature, before_method, extension
12
import sys
13
import os.path
14
from xml.etree import ElementTree as et
15
16
class mavgen(Task.Task):
17
"""generate mavlink header files"""
18
color = 'BLUE'
19
before = 'cxx c'
20
21
def scan(self):
22
nodes = []
23
names = []
24
25
entry_point = self.inputs[0]
26
queue = [entry_point]
27
head = 0
28
29
while head < len(queue):
30
node = queue[head]
31
head += 1
32
33
tree = et.parse(node.abspath())
34
root = tree.getroot()
35
includes = root.findall('include')
36
for i in includes:
37
path = i.text.strip()
38
n = node.parent.find_node(path)
39
if n:
40
nodes.append(n)
41
if n not in queue:
42
queue.append(n)
43
continue
44
45
path = os.path.join(
46
node.parent.path_from(entry_point.parent),
47
path
48
)
49
if path not in names:
50
names.append(path)
51
52
return nodes, names
53
54
def run(self):
55
sys.path.insert(0,self.env.get_flat('MAVLINK_DIR'))
56
from pymavlink.generator import mavgen
57
class mavgen_options:
58
language = 'C'
59
wire_protocol = '2.0'
60
validate = False
61
output = self.env.get_flat('OUTPUT_DIR')
62
xml = self.inputs[0].abspath()
63
if mavgen.mavgen(mavgen_options(), [xml]):
64
return 0
65
return 1
66
67
def post_run(self):
68
super(mavgen, self).post_run()
69
for header in self.generator.output_dir.ant_glob("*.h **/*.h", remove=False):
70
header.sig = header.cache_sig = self.cache_sig
71
72
def options(opt):
73
opt.load('python')
74
75
@feature('mavgen')
76
@before_method('process_source')
77
def process_mavgen(self):
78
if not hasattr(self, 'output_dir'):
79
self.bld.fatal('mavgen: missing option output_dir')
80
81
inputs = self.to_nodes(self.bld.srcnode.find_node(self.source))
82
# depend on fixed headers so a rebuild occurs if they change
83
mavlink_dir = self.env.get_flat('MAVLINK_DIR')
84
headers_dir = mavlink_dir+"/pymavlink/generator/C/include_v2.0"
85
headers = self.bld.root.find_node(headers_dir) # expected to be absolute
86
inputs.extend(headers.ant_glob("*.h"))
87
# also depend on the generator source itself
88
gen_src_dir = mavlink_dir+"/pymavlink/"
89
gen_src = self.bld.root.find_node(gen_src_dir)
90
inputs.extend(gen_src.ant_glob("__init__.py generator/*.py"))
91
92
outputs = []
93
94
self.source = []
95
96
if not isinstance(self.output_dir, Node.Node):
97
self.output_dir = self.bld.bldnode.find_or_declare(self.output_dir)
98
99
task = self.create_task('mavgen', inputs, outputs)
100
task.env['OUTPUT_DIR'] = self.output_dir.abspath()
101
102
def configure(cfg):
103
"""
104
setup environment for mavlink header generator
105
"""
106
env = cfg.env
107
env.MAVLINK_DIR = cfg.srcnode.make_node('modules/mavlink/').abspath()
108
109