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.
101 lines
2.8 KiB
101 lines
2.8 KiB
# encoding: utf-8 |
|
# (c) Siddharth Bharat Purohit, 3DRobotics Inc. |
|
|
|
""" |
|
The **mavgen.py** program is a code generator which creates mavlink header files. |
|
""" |
|
|
|
from waflib import Logs, Task, Utils, Node |
|
from waflib.TaskGen import feature, before_method, extension |
|
import os, sys |
|
import os.path |
|
from xml.etree import ElementTree as et |
|
|
|
class mavgen(Task.Task): |
|
"""generate mavlink header files""" |
|
color = 'BLUE' |
|
before = 'cxx c' |
|
|
|
def scan(self): |
|
nodes = [] |
|
names = [] |
|
|
|
entry_point = self.inputs[0] |
|
queue = [entry_point] |
|
head = 0 |
|
|
|
while head < len(queue): |
|
node = queue[head] |
|
head += 1 |
|
|
|
tree = et.parse(node.abspath()) |
|
root = tree.getroot() |
|
includes = root.findall('include') |
|
for i in includes: |
|
path = i.text.strip() |
|
n = node.parent.find_node(path) |
|
if n: |
|
nodes.append(n) |
|
if n not in queue: |
|
queue.append(n) |
|
continue |
|
|
|
path = os.path.join( |
|
node.parent.path_from(entry_point.parent), |
|
path |
|
) |
|
if not path in names: |
|
names.append(path) |
|
|
|
return nodes, names |
|
|
|
def run(self): |
|
sys.path.insert(0,self.env.get_flat('MAVLINK_DIR')) |
|
from pymavlink.generator import mavgen |
|
class mavgen_options: |
|
language = 'C' |
|
wire_protocol = '2.0' |
|
validate = False |
|
output = self.env.get_flat('OUTPUT_DIR') |
|
xml = self.inputs[0].abspath() |
|
if mavgen.mavgen(mavgen_options(), [xml]): |
|
return 0 |
|
return 1 |
|
|
|
def post_run(self): |
|
super(mavgen, self).post_run() |
|
for header in self.generator.output_dir.ant_glob("*.h **/*.h", remove=False): |
|
header.sig = header.cache_sig = self.cache_sig |
|
|
|
def options(opt): |
|
opt.load('python') |
|
|
|
@feature('mavgen') |
|
@before_method('process_source') |
|
def process_mavgen(self): |
|
if not hasattr(self, 'output_dir'): |
|
self.bld.fatal('mavgen: missing option output_dir') |
|
|
|
inputs = self.to_nodes(self.bld.srcnode.find_node(self.source)) |
|
outputs = [] |
|
|
|
self.source = [] |
|
|
|
if not isinstance(self.output_dir, Node.Node): |
|
self.output_dir = self.bld.bldnode.find_or_declare(self.output_dir) |
|
|
|
task = self.create_task('mavgen', inputs, outputs) |
|
task.env['OUTPUT_DIR'] = self.output_dir.abspath() |
|
|
|
task.env.env = dict(os.environ) |
|
task.env.env['PYTHONPATH'] = task.env.MAVLINK_DIR |
|
|
|
def configure(cfg): |
|
""" |
|
setup environment for mavlink header generator |
|
""" |
|
cfg.load('python') |
|
cfg.check_python_version(minver=(2,7,0)) |
|
|
|
env = cfg.env |
|
env.MAVLINK_DIR = cfg.srcnode.make_node('modules/mavlink/').abspath()
|
|
|