- #!/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=1024")
- ]
-
-
- 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=os.path.join(
- os.path.dirname(os.path.realpath(__file__)), "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)
|