#!/usr/bin/env python
|
|
|
|
# adapted boards.txt.py from esp8266/Arduino
|
|
# - single board definition, ldscripts
|
|
# - portable boards.local.txt for 2.3.0 and up
|
|
|
|
import os
|
|
import argparse
|
|
import sys
|
|
import collections
|
|
|
|
# TODO: drop after platform.io supports python 3
|
|
if sys.version < (3, 2):
|
|
import string
|
|
|
|
_format = string.Formatter().vformat
|
|
|
|
def format_map(tmpl, f_map):
|
|
return _format(tmpl, None, f_map)
|
|
|
|
|
|
else:
|
|
|
|
def format_map(tmpl, f_map):
|
|
return tmpl.format_map(f_map)
|
|
|
|
|
|
class VersionedSubstitution(collections.MutableMapping):
|
|
def __init__(self, substitutions, targets, *args, **kwargs):
|
|
self._targets = targets
|
|
self._version = None
|
|
self._store = substitutions.copy()
|
|
self.update(dict(*args, **kwargs))
|
|
|
|
def set_version(self, version):
|
|
self._version = version
|
|
|
|
def __getitem__(self, key):
|
|
if self._version in self._targets:
|
|
return self._store[key]
|
|
return key
|
|
|
|
def __setitem__(self, key, value):
|
|
self._store[key] = value
|
|
|
|
def __delitem__(self, key):
|
|
del self._store[key]
|
|
|
|
def __iter__(self):
|
|
return iter(self._store)
|
|
|
|
def __len__(self):
|
|
return len(self._store)
|
|
|
|
|
|
BOARDS_LOCAL = {
|
|
"global": collections.OrderedDict(
|
|
[("menu.float_support", "scanf and printf float support")]
|
|
),
|
|
"flash_size": collections.OrderedDict(
|
|
[
|
|
(".menu.{eesz}.1M1S", "1M (1 EEPROM Sector, no SPIFFS)"),
|
|
(".menu.{eesz}.1M1S.build.flash_size", "1M"),
|
|
(".menu.{eesz}.1M1S.build.flash_size_bytes", "0x100000"),
|
|
(".menu.{eesz}.1M1S.build.flash_ld", "eagle.flash.1m0m1s.ld"),
|
|
(".menu.{eesz}.1M1S.build.spiffs_pagesize", "256"),
|
|
(".menu.{eesz}.1M1S.upload.maximum_size", "1023984"),
|
|
(".menu.{eesz}.1M1S.build.rfcal_addr", "0xFC000"),
|
|
(".menu.{eesz}.2M4S", "2M (4 EEPROM Sectors, 1M SPIFFS)"),
|
|
(".menu.{eesz}.2M4S.build.flash_size", "2M"),
|
|
(".menu.{eesz}.2M4S.build.flash_size_bytes", "0x200000"),
|
|
(".menu.{eesz}.2M4S.build.flash_ld", "eagle.flash.2m1m4s.ld"),
|
|
(".menu.{eesz}.2M4S.build.spiffs_pagesize", "256"),
|
|
(".menu.{eesz}.2M4S.upload.maximum_size", "1044464"),
|
|
(".menu.{eesz}.2M4S.build.rfcal_addr", "0x1FC000"),
|
|
(".menu.{eesz}.4M1M4S", "4M (4 EEPROM Sectors, 1M SPIFFS)"),
|
|
(".menu.{eesz}.4M1M4S.build.flash_size", "4M"),
|
|
(".menu.{eesz}.4M1M4S.build.flash_size_bytes", "0x400000"),
|
|
(".menu.{eesz}.4M1M4S.build.flash_ld", "eagle.flash.4m1m4s.ld"),
|
|
(".menu.{eesz}.4M1M4S.build.spiffs_pagesize", "256"),
|
|
(".menu.{eesz}.4M1M4S.upload.maximum_size", "1044464"),
|
|
(".menu.{eesz}.4M1M4S.build.rfcal_addr", "0x3FC000"),
|
|
(".menu.{eesz}.4M3M4S", "4M (4 EEPROM Sectors, 3M SPIFFS)"),
|
|
(".menu.{eesz}.4M3M4S.build.flash_size", "4M"),
|
|
(".menu.{eesz}.4M3M4S.build.flash_size_bytes", "0x400000"),
|
|
(".menu.{eesz}.4M3M4S.build.flash_ld", "eagle.flash.4m3m4s.ld"),
|
|
(".menu.{eesz}.4M3M4S.build.spiffs_pagesize", "256"),
|
|
(".menu.{eesz}.4M3M4S.upload.maximum_size", "1044464"),
|
|
(".menu.{eesz}.4M3M4S.build.rfcal_addr", "0x3FC000"),
|
|
]
|
|
),
|
|
"float_support": collections.OrderedDict(
|
|
[
|
|
(".menu.float_support.disabled", "Disabled (Recommended)"),
|
|
(".menu.float_support.disabled.build.float", ""),
|
|
(".menu.float_support.enabled", "Enabled"),
|
|
(
|
|
".menu.float_support.enabled.build.float",
|
|
"-u _printf_float -u _scanf_float",
|
|
),
|
|
]
|
|
),
|
|
}
|
|
|
|
|
|
BOARD = "generic"
|
|
MENUS = ["flash_size", "float_support"]
|
|
|
|
|
|
CORE_VERSIONS = ["2.3.0", "latest"]
|
|
|
|
EXTRA_FLAGS = [
|
|
(".compiler.cpp.extra_flags", "-DNO_GLOBAL_EEPROM -DMQTT_MAX_PACKET_SIZE=400")
|
|
]
|
|
|
|
|
|
SUBSTITUTIONS = VersionedSubstitution(
|
|
dict(eesz="FlashSize", wipe="FlashErase", baud="UploadSpeed", vt="VTable"),
|
|
["2.3.0"],
|
|
)
|
|
|
|
|
|
def generate_boards_txt(args, sub=SUBSTITUTIONS):
|
|
|
|
versions = args.versions
|
|
if args.version:
|
|
versions = [args.version]
|
|
|
|
for version in versions:
|
|
|
|
sub.set_version(version)
|
|
|
|
result = ["#version={}\n\n".format(version)]
|
|
result.extend("{}={}\n".format(k, v) for k, v in BOARDS_LOCAL["global"].items())
|
|
result.append("\n")
|
|
|
|
# print("{} unused:".format(version, set(BOARDS_LOCAL.keys()) - set(MENUS[version])))
|
|
# continue
|
|
|
|
for menu in MENUS:
|
|
section = []
|
|
for k, v in BOARDS_LOCAL[menu].items():
|
|
k = format_map(k, sub)
|
|
section.append(BOARD + "=".join([k, v]))
|
|
result.append("\n".join(section))
|
|
result.append("\n\n")
|
|
|
|
if EXTRA_FLAGS:
|
|
result.extend(("{}{}={}".format(BOARD, k, v)) for k, v in EXTRA_FLAGS)
|
|
|
|
f_path = os.path.join(args.directory, version, "boards.local.txt")
|
|
f_dir, _ = os.path.split(f_path)
|
|
if not os.path.exists(f_dir):
|
|
os.makedirs(f_dir)
|
|
|
|
with open(f_path, "w") as f:
|
|
for part in result:
|
|
f.write(part)
|
|
f.write("\n")
|
|
|
|
|
|
def print_versions(args):
|
|
for version in CORE_VERSIONS:
|
|
print("- {}".format(version))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-d", "--directory", default="arduino_ide")
|
|
|
|
subparsers = parser.add_subparsers(title="commands")
|
|
parser_versions = subparsers.add_parser("versions", help="list supported versions")
|
|
parser_versions.set_defaults(command=print_versions)
|
|
|
|
parser_generate = subparsers.add_parser("generate", help="")
|
|
parser_generate.add_argument("version", nargs="?")
|
|
parser_generate.set_defaults(command=generate_boards_txt, versions=CORE_VERSIONS)
|
|
|
|
args = parser.parse_args()
|
|
args.command(args)
|