From 3471a5d5679549ae3b56c2270d445f804680e909 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 9 Feb 2019 15:43:47 +1100 Subject: [PATCH] waf: fixed git hash in generated APJ file # Conflicts: # Tools/ardupilotwaf/chibios.py --- Tools/ardupilotwaf/chibios.py | 28 ++++++-- Tools/ardupilotwaf/px_mkfw.py | 123 ---------------------------------- 2 files changed, 22 insertions(+), 129 deletions(-) delete mode 100755 Tools/ardupilotwaf/px_mkfw.py diff --git a/Tools/ardupilotwaf/chibios.py b/Tools/ardupilotwaf/chibios.py index c10aaad520..77646ee5d1 100644 --- a/Tools/ardupilotwaf/chibios.py +++ b/Tools/ardupilotwaf/chibios.py @@ -92,13 +92,30 @@ class generate_bin(Task.Task): return self.outputs[0].path_from(self.generator.bld.bldnode) class generate_apj(Task.Task): + '''generate an apj firmware file''' color='CYAN' - run_str="python '${UPLOAD_TOOLS}/px_mkfw.py' --image '${SRC}' --prototype '${BUILDROOT}/apj.prototype' > '${TGT}'" always_run = True def keyword(self): - return "Generating" - def __str__(self): - return self.outputs[0].path_from(self.generator.bld.bldnode) + return "apj_gen" + def run(self): + import json, time, base64, zlib + img = open(self.inputs[0].abspath(),'rb').read() + d = { + "board_id": int(self.env.APJ_BOARD_ID), + "magic": "APJFWv1", + "description": "Firmware for a %s board" % self.env.APJ_BOARD_TYPE, + "image": base64.b64encode(zlib.compress(img,9)).decode('utf-8'), + "build_time": int(time.time()), + "summary": self.env.BOARD, + "version": "0.1", + "image_size": len(img), + "git_identity": self.generator.bld.git_head_hash(short=True), + "board_revision": 0 + } + apj_file = self.outputs[0].abspath() + f = open(apj_file, "w") + f.write(json.dumps(d, indent=4)) + f.close() class build_abin(Task.Task): '''build an abin file for skyviper firmware upload via web UI''' @@ -295,12 +312,11 @@ def pre_build(bld): def build(bld): bld( - # build hwdef.h and apj.prototype from hwdef.dat. This is needed after a waf clean + # build hwdef.h from hwdef.dat. This is needed after a waf clean source=bld.path.ant_glob(bld.env.HWDEF), rule="python '${AP_HAL_ROOT}/hwdef/scripts/chibios_hwdef.py' -D '${BUILDROOT}' '%s' %s" % (bld.env.HWDEF, bld.env.BOOTLOADER_OPTION), group='dynamic_sources', target=[bld.bldnode.find_or_declare('hwdef.h'), - bld.bldnode.find_or_declare('apj.prototype'), bld.bldnode.find_or_declare('ldscript.ld')] ) diff --git a/Tools/ardupilotwaf/px_mkfw.py b/Tools/ardupilotwaf/px_mkfw.py deleted file mode 100755 index 67a534322c..0000000000 --- a/Tools/ardupilotwaf/px_mkfw.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python -############################################################################ -# -# Copyright (C) 2012, 2013 PX4 Development Team. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name PX4 nor the names of its contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -############################################################################ - -# -# PX4 firmware image generator -# -# The PX4 firmware file is a JSON-encoded Python object, containing -# metadata fields and a zlib-compressed base64-encoded firmware image. -# - -import sys -import argparse -import json -import base64 -import zlib -import time -import subprocess - -# -# Construct a basic firmware description -# -def mkdesc(): - proto = {} - proto['magic'] = "PX4FWv1" - proto['board_id'] = 0 - proto['board_revision'] = 0 - proto['version'] = "" - proto['summary'] = "" - proto['description'] = "" - proto['git_identity'] = "" - proto['build_time'] = 0 - proto['image'] = bytes() - proto['image_size'] = 0 - return proto - -# Parse commandline -parser = argparse.ArgumentParser(description="Firmware generator for the PX autopilot system.") -parser.add_argument("--prototype", action="store", help="read a prototype description from a file") -parser.add_argument("--board_id", action="store", help="set the board ID required") -parser.add_argument("--board_revision", action="store", help="set the board revision required") -parser.add_argument("--version", action="store", help="set a version string") -parser.add_argument("--summary", action="store", help="set a brief description") -parser.add_argument("--description", action="store", help="set a longer description") -parser.add_argument("--git_identity", action="store", help="the working directory to check for git identity") -parser.add_argument("--parameter_xml", action="store", help="the parameters.xml file") -parser.add_argument("--airframe_xml", action="store", help="the airframes.xml file") -parser.add_argument("--image", action="store", help="the firmware image") -args = parser.parse_args() - -# Fetch the firmware descriptor prototype if specified -if args.prototype != None: - f = open(args.prototype,"r") - desc = json.load(f) - f.close() -else: - desc = mkdesc() - -desc['build_time'] = int(time.time()) - -if args.board_id != None: - desc['board_id'] = int(args.board_id) -if args.board_revision != None: - desc['board_revision'] = int(args.board_revision) -if args.version != None: - desc['version'] = str(args.version) -if args.summary != None: - desc['summary'] = str(args.summary) -if args.description != None: - desc['description'] = str(args.description) -if args.git_identity != None: - cmd = " ".join(["git", "--git-dir", args.git_identity + "/.git", "describe", "--always", "--dirty"]) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout - desc['git_identity'] = str(p.read().strip()) - p.close() -if args.parameter_xml != None: - f = open(args.parameter_xml, "rb") - bytes = f.read() - desc['parameter_xml_size'] = len(bytes) - desc['parameter_xml'] = base64.b64encode(zlib.compress(bytes,9)).decode('utf-8') - desc['mav_autopilot'] = 12 # 12 = MAV_AUTOPILOT_PX4 -if args.airframe_xml != None: - f = open(args.airframe_xml, "rb") - bytes = f.read() - desc['airframe_xml_size'] = len(bytes) - desc['airframe_xml'] = base64.b64encode(zlib.compress(bytes,9)).decode('utf-8') -if args.image != None: - f = open(args.image, "rb") - bytes = f.read() - desc['image_size'] = len(bytes) - desc['image'] = base64.b64encode(zlib.compress(bytes,9)).decode('utf-8') - -print(json.dumps(desc, indent=4))