Initial commit: RNodeTHV4 boundary mode firmware for Heltec V4
Bridges LoRa mesh and TCP/WiFi backbone networks using microReticulum. Based on microReticulum_Firmware with boundary mode additions: - BoundaryMode.h: State management and EEPROM persistence - BoundaryConfig.h: WiFi captive portal for configuration - TcpInterface.h: TCP backbone interface with HDLC framing - Display.h: Custom OLED layout with network status indicators - Transport/Identity library patches for embedded memory constraints
This commit is contained in:
197
extra_script.py
Executable file
197
extra_script.py
Executable file
@@ -0,0 +1,197 @@
|
||||
import time
|
||||
import hashlib
|
||||
import shutil
|
||||
|
||||
Import("env")
|
||||
|
||||
env.Replace(PROGNAME="rnode_firmware_%s" % env.GetProjectOption("custom_variant"))
|
||||
print("PROGNAME:", env.subst("$PROGNAME"))
|
||||
|
||||
#
|
||||
# Custom targets
|
||||
#
|
||||
|
||||
def target_package(target, source, env):
|
||||
print("target_package...")
|
||||
print("Platform:", env.GetProjectOption("platform"))
|
||||
print("Board:", env.GetProjectOption("board"))
|
||||
print("Variant:", env.GetProjectOption("custom_variant"))
|
||||
# do some actions
|
||||
platform = env.GetProjectOption("platform")
|
||||
board = env.GetProjectOption("board")
|
||||
firmware_package(env)
|
||||
|
||||
platform = env.GetProjectOption("platform")
|
||||
print("Platform:", platform)
|
||||
if (platform == "espressif32"):
|
||||
env.AddCustomTarget(
|
||||
name="package",
|
||||
dependencies="$BUILD_DIR/${PROGNAME}.bin",
|
||||
actions=[
|
||||
target_package
|
||||
],
|
||||
title="Package",
|
||||
description="Package esp32 firmware for delivery"
|
||||
)
|
||||
elif (platform == "nordicnrf52"):
|
||||
# remove --specs=nano.specs to allow exceptions to work
|
||||
if '--specs=nano.specs' in env['LINKFLAGS']:
|
||||
env['LINKFLAGS'].remove('--specs=nano.specs')
|
||||
env.AddCustomTarget(
|
||||
name="package",
|
||||
dependencies="$BUILD_DIR/${PROGNAME}.zip",
|
||||
actions=[
|
||||
target_package
|
||||
],
|
||||
title="Package",
|
||||
description="Package nrf52 firmware for delivery"
|
||||
)
|
||||
|
||||
#
|
||||
# Upload actions
|
||||
#
|
||||
|
||||
def pre_upload(source, target, env):
|
||||
print("pre_upload...")
|
||||
# do some actions
|
||||
|
||||
def post_upload(source, target, env):
|
||||
print("post_upload...")
|
||||
print("Platform:", env.GetProjectOption("platform"))
|
||||
print("Board:", env.GetProjectOption("board"))
|
||||
print("Variant:", env.GetProjectOption("custom_variant"))
|
||||
print("Serial port:", env.subst("$UPLOAD_PORT"))
|
||||
# do some actions
|
||||
platform = env.GetProjectOption("platform")
|
||||
board = env.GetProjectOption("board")
|
||||
if (platform == "espressif32"):
|
||||
time.sleep(10)
|
||||
# device provisioning is incomplete and only currently appropriate for 915MHz T-Beam
|
||||
device_provision(env)
|
||||
firmware_hash(source, env)
|
||||
# firmware pacakaging is incomplete due to missing console image
|
||||
#firmware_package(env)
|
||||
elif (platform == "nordicnrf52"):
|
||||
time.sleep(5)
|
||||
# device provisioning is incomplete and only currently appropriate for 915MHz RAK4631
|
||||
device_provision(env)
|
||||
firmware_hash(source, env)
|
||||
# firmware pacakaging is incomplete due to missing console image
|
||||
#firmware_package(env)
|
||||
|
||||
def post_clean(source, target, env):
|
||||
print("post_clean...")
|
||||
core_dir = env.subst("$CORE_DIR")
|
||||
print("core_dir:", core_dir)
|
||||
packages_dir = env.subst("$PACKAGES_DIR")
|
||||
print("packages_dir:", packages_dir)
|
||||
project_dir = env.subst("$PROJECT_DIR")
|
||||
print("project_dir:", project_dir)
|
||||
#build_dir = env.subst("$BUILD_DIR").get_abspath()
|
||||
build_dir = env.subst("$BUILD_DIR")
|
||||
print("build_dir:", build_dir)
|
||||
build_cache_dir = env.subst("$PLATFORMIO_BUILD_CACHE_DIR")
|
||||
print("build_cache_dir:", build_cache_dir)
|
||||
workspace_dir = env.subst("$PLATFORMIO_WORKSPACE_DIR")
|
||||
print("workspace_dir:", workspace_dir)
|
||||
#shutil.rmtree(directory_path)
|
||||
env.Execute("rm -f " + project_dir + "/Release/" + project_dir + "/" + env.subst("$PROGNAME") + ".zip")
|
||||
|
||||
env.AddPreAction("upload", pre_upload)
|
||||
env.AddPostAction("upload", post_upload)
|
||||
env.AddPostAction("clean", post_clean)
|
||||
|
||||
def device_wipe(env):
|
||||
# Device wipe
|
||||
print("Wiping device...")
|
||||
env.Execute("rnodeconf --eeprom-wipe " + env.subst("$UPLOAD_PORT"))
|
||||
|
||||
def device_provision(env):
|
||||
# Device provision
|
||||
print("Provisioning device...")
|
||||
platform = env.GetProjectOption("platform")
|
||||
print("Platform:", platform)
|
||||
board = env.GetProjectOption("board")
|
||||
print("Board:", board)
|
||||
variant = env.GetProjectOption("custom_variant")
|
||||
print("Variant:", variant)
|
||||
if variant in ("tbeam", "tbeam_local"):
|
||||
env.Execute("rnodeconf --product e0 --model e9 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
||||
elif variant in ("lora32v21", "lora32v21_local"):
|
||||
env.Execute("rnodeconf --product b1 --model b9 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
||||
elif variant in ("heltec32v4", "heltec32v4_local", "heltec32v4_boundary", "heltec32v4_boundary_local"):
|
||||
env.Execute("rnodeconf --product b1 --model b9 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
||||
elif variant in ("rak4631", "rak4631_local"):
|
||||
env.Execute("rnodeconf --product 10 --model 12 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
||||
elif variant in ("heltec_t114", "heltec_t114_local"):
|
||||
env.Execute("rnodeconf --product c2 --model c7 --hwrev 1 --rom " + env.subst("$UPLOAD_PORT"))
|
||||
|
||||
def firmware_hash(source, env):
|
||||
# Firmware hash
|
||||
print("Updating firmware hash...")
|
||||
source_file = source[0].get_abspath()
|
||||
platform = env.GetProjectOption("platform")
|
||||
print("Platform:", platform)
|
||||
if (platform == "nordicnrf52"):
|
||||
build_dir = env.subst("$BUILD_DIR")
|
||||
env.Execute("cd " + build_dir + "; unzip -o " + source_file + " " + env.subst("$PROGNAME") + ".bin")
|
||||
#source_file.replace(".zip", ".bin")
|
||||
source_file = build_dir + "/" + env.subst("$PROGNAME") + ".bin";
|
||||
print("source_file:", source_file)
|
||||
firmware_data = open(source_file, "rb").read()
|
||||
calc_hash = hashlib.sha256(firmware_data).digest()
|
||||
hex_hash = calc_hash.hex()
|
||||
print("firmware_hash:", hex_hash)
|
||||
env.Execute("rnodeconf --firmware-hash " + hex_hash + " " + env.subst("$UPLOAD_PORT"))
|
||||
else:
|
||||
print("source_file:", source_file)
|
||||
firmware_data = open(source_file, "rb").read()
|
||||
calc_hash = hashlib.sha256(firmware_data[0:-32]).digest()
|
||||
part_hash = firmware_data[-32:]
|
||||
hex_hash = calc_hash.hex()
|
||||
print("firmware_hash:", hex_hash)
|
||||
if (calc_hash == part_hash):
|
||||
env.Execute("rnodeconf --firmware-hash " + hex_hash + " " + env.subst("$UPLOAD_PORT"))
|
||||
else:
|
||||
print("Calculated hash does not match!")
|
||||
|
||||
def firmware_package(env):
|
||||
platform = env.GetProjectOption("platform")
|
||||
board = env.GetProjectOption("board")
|
||||
# Firmware package
|
||||
print("Building firmware package...")
|
||||
platform = env.GetProjectOption("platform")
|
||||
print("Platform:", platform)
|
||||
board = env.GetProjectOption("board")
|
||||
print("Board:", board)
|
||||
variant = env.GetProjectOption("custom_variant")
|
||||
print("Variant:", variant)
|
||||
core_dir = env.subst("$CORE_DIR")
|
||||
print("core_dir:", core_dir)
|
||||
packages_dir = env.subst("$PACKAGES_DIR")
|
||||
print("packages_dir:", packages_dir)
|
||||
workspace_dir = env.subst("$WORKSPACE_DIR")
|
||||
print("workspace_dir:", workspace_dir)
|
||||
project_dir = env.subst("$PROJECT_DIR")
|
||||
print("project_dir:", project_dir)
|
||||
#build_dir = env.subst("$BUILD_DIR").get_abspath()
|
||||
build_dir = env.subst("$BUILD_DIR")
|
||||
print("build_dir:", build_dir)
|
||||
if (platform == "espressif32"):
|
||||
#env.Execute("cp " + packages_dir + "/framework-arduinoespressif32/tools/partitions/boot_app0.bin " + build_dir + "/rnode_firmware_" + variant + ".boot_app0")
|
||||
env.Execute("cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin " + build_dir + "/rnode_firmware_" + variant + ".boot_app0")
|
||||
env.Execute("cp " + build_dir + "/bootloader.bin " + build_dir + "/" + env.subst("$PROGNAME") + ".bootloader")
|
||||
env.Execute("cp " + build_dir + "/partitions.bin " + build_dir + "/" + env.subst("$PROGNAME") + ".partitions")
|
||||
env.Execute("rm -f " + project_dir + "/Release/" + env.subst("$PROGNAME") + ".zip")
|
||||
zip_cmd = "zip --junk-paths "
|
||||
zip_cmd += project_dir + "/Release/rnode_firmware_" + variant + ".zip "
|
||||
zip_cmd += project_dir + "/Release/esptool/esptool.py "
|
||||
zip_cmd += project_dir + "/Release/console_image.bin "
|
||||
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".bin "
|
||||
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".boot_app0 "
|
||||
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".bootloader "
|
||||
zip_cmd += build_dir + "/" + env.subst("$PROGNAME") + ".partitions "
|
||||
env.Execute(zip_cmd)
|
||||
elif (platform == "nordicnrf52"):
|
||||
env.Execute("cp " + build_dir + "/" + env.subst("$PROGNAME") + ".zip " + project_dir + "/Release/.")
|
||||
env.Execute("python " + project_dir + "/release_hashes.py > " + project_dir + "/Release/release.json")
|
||||
Reference in New Issue
Block a user