Implement 'boards' command // Resolve #11
This commit is contained in:
@@ -2,22 +2,20 @@
|
||||
# See LICENSE for details.
|
||||
|
||||
try:
|
||||
from platformio.util import get_home_dir
|
||||
from platformio import util
|
||||
except ImportError:
|
||||
import sys
|
||||
for _path in sys.path:
|
||||
if "platformio" in _path:
|
||||
sys.path.insert(0, _path[:_path.rfind("platformio")-1])
|
||||
break
|
||||
from platformio.util import get_home_dir
|
||||
from platformio import util
|
||||
|
||||
from os.path import join
|
||||
|
||||
from SCons.Script import (DefaultEnvironment, SConscript, SConscriptChdir,
|
||||
Variables)
|
||||
|
||||
from platformio.util import (get_lib_dir, get_pioenvs_dir, get_project_dir,
|
||||
get_source_dir)
|
||||
|
||||
# AllowSubstExceptions()
|
||||
|
||||
@@ -54,23 +52,39 @@ DefaultEnvironment(
|
||||
toolpath=[join("$PIOBUILDER_DIR", "tools")],
|
||||
variables=commonvars,
|
||||
|
||||
PIOHOME_DIR=get_home_dir(),
|
||||
PROJECT_DIR=get_project_dir(),
|
||||
PIOENVS_DIR=get_pioenvs_dir(),
|
||||
PIOHOME_DIR=util.get_home_dir(),
|
||||
PROJECT_DIR=util.get_project_dir(),
|
||||
PIOENVS_DIR=util.get_pioenvs_dir(),
|
||||
|
||||
PIOBUILDER_DIR=join(get_source_dir(), "builder"),
|
||||
PIOBUILDER_DIR=join(util.get_source_dir(), "builder"),
|
||||
PIOPACKAGES_DIR=join("$PIOHOME_DIR", "packages"),
|
||||
PLATFORMFW_DIR=join("$PIOPACKAGES_DIR", "$PIOPACKAGE_FRAMEWORK"),
|
||||
|
||||
BUILD_DIR=join("$PIOENVS_DIR", "$PIOENV"),
|
||||
LIBSOURCE_DIRS=[
|
||||
join("$PROJECT_DIR", "lib"),
|
||||
get_lib_dir(),
|
||||
util.get_lib_dir(),
|
||||
join("$PLATFORMFW_DIR", "libraries"),
|
||||
]
|
||||
)
|
||||
|
||||
env = DefaultEnvironment()
|
||||
|
||||
if "BOARD" in env:
|
||||
try:
|
||||
env.Replace(BOARD_OPTIONS=util.get_boards(env.subst("$BOARD")))
|
||||
except KeyError:
|
||||
env.Exit("Error: Unknown board '%s'" % env.subst("$BOARD"))
|
||||
|
||||
if "BOARD_MCU" not in env:
|
||||
env.Replace(BOARD_MCU="${BOARD_OPTIONS['build']['mcu']}")
|
||||
if "BOARD_F_CPU" not in env:
|
||||
env.Replace(BOARD_F_CPU="${BOARD_OPTIONS['build']['f_cpu']}")
|
||||
if "UPLOAD_PROTOCOL" not in env:
|
||||
env.Replace(UPLOAD_PROTOCOL="${BOARD_OPTIONS['upload']['protocol']}")
|
||||
if "UPLOAD_SPEED" not in env:
|
||||
env.Replace(UPLOAD_SPEED="${BOARD_OPTIONS['upload']['speed']}")
|
||||
|
||||
env.PrependENVPath(
|
||||
"PATH",
|
||||
env.subst(join("$PIOPACKAGES_DIR", "$PIOPACKAGE_TOOLCHAIN", "bin"))
|
||||
|
||||
@@ -11,7 +11,7 @@ from time import sleep
|
||||
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
|
||||
DefaultEnvironment, Exit)
|
||||
|
||||
from platformio.util import get_serialports, reset_serialport
|
||||
from platformio.util import get_serialports
|
||||
|
||||
env = DefaultEnvironment()
|
||||
|
||||
@@ -41,7 +41,10 @@ env.Replace(
|
||||
"-mmcu=$BOARD_MCU"
|
||||
],
|
||||
|
||||
CXXFLAGS=["-fno-exceptions"],
|
||||
CXXFLAGS=[
|
||||
"-fno-exceptions",
|
||||
"-fno-threadsafe-statics"
|
||||
],
|
||||
|
||||
CPPDEFINES=[
|
||||
"F_CPU=$BOARD_F_CPU"
|
||||
@@ -101,7 +104,7 @@ env.Append(
|
||||
)
|
||||
|
||||
|
||||
def reset_device():
|
||||
def before_upload():
|
||||
|
||||
def rpi_sysgpio(path, value):
|
||||
with open(path, "w") as f:
|
||||
@@ -115,7 +118,7 @@ def reset_device():
|
||||
rpi_sysgpio("/sys/class/gpio/gpio18/value", 0)
|
||||
rpi_sysgpio("/sys/class/gpio/unexport", 18)
|
||||
else:
|
||||
return reset_serialport(env.subst("$UPLOAD_PORT"))
|
||||
return env.FlushSerialBuffer("$UPLOAD_PORT")
|
||||
|
||||
|
||||
CORELIBS = env.ProcessGeneral()
|
||||
@@ -147,7 +150,7 @@ else:
|
||||
#
|
||||
|
||||
upload = env.Alias(["upload", "uploadlazy"], target_hex, [
|
||||
lambda target, source, env: reset_device(), "$UPLOADHEXCMD"])
|
||||
lambda target, source, env: before_upload(), "$UPLOADHEXCMD"])
|
||||
AlwaysBuild(upload)
|
||||
|
||||
#
|
||||
@@ -155,7 +158,7 @@ AlwaysBuild(upload)
|
||||
#
|
||||
|
||||
uploadeep = env.Alias("uploadeep", target_eep, [
|
||||
lambda target, source, env: reset_device(), "$UPLOADEEPCMD"])
|
||||
lambda target, source, env: before_upload(), "$UPLOADEEPCMD"])
|
||||
AlwaysBuild(uploadeep)
|
||||
|
||||
#
|
||||
|
||||
@@ -12,35 +12,31 @@ from SCons.Script import Import, Return
|
||||
env = None
|
||||
Import("env")
|
||||
|
||||
BOARD_OPTIONS = env.ParseBoardOptions(
|
||||
join("$PLATFORMFW_DIR", "boards.txt"),
|
||||
"${BOARD}"
|
||||
)
|
||||
ARDUINO_VERSION = int(
|
||||
open(join(env.subst("$PLATFORMFW_DIR"),
|
||||
"version.txt")).read().replace(".", "").strip())
|
||||
|
||||
# usb flags
|
||||
ARDUINO_USBDEFINES = []
|
||||
if "build.usb_product" in BOARD_OPTIONS:
|
||||
if "usb_product" in env.subst("${BOARD_OPTIONS['build']}"):
|
||||
ARDUINO_USBDEFINES = [
|
||||
"USB_VID=%s" % BOARD_OPTIONS['build.vid'],
|
||||
"USB_PID=%s" % BOARD_OPTIONS['build.pid'],
|
||||
'USB_PRODUCT=\\"%s\\"' % BOARD_OPTIONS['build.usb_product'].replace(
|
||||
'"', "")
|
||||
"USB_VID=${BOARD_OPTIONS['build']['vid']}",
|
||||
"USB_PID=${BOARD_OPTIONS['build']['pid']}",
|
||||
'USB_PRODUCT=\\"%s\\"' % (env.subst(
|
||||
"${BOARD_OPTIONS['build']['usb_product']}").replace('"', ""))
|
||||
]
|
||||
|
||||
# include board variant
|
||||
env.VariantDir(
|
||||
join("$BUILD_DIR", "FrameworkArduinoVariant"),
|
||||
join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant'])
|
||||
join("$PLATFORMFW_DIR", "variants", "${BOARD_OPTIONS['build']['variant']}")
|
||||
)
|
||||
|
||||
env.Append(
|
||||
CPPDEFINES=[
|
||||
"ARDUINO_ARCH_%s" % env.subst("$PLATFORM").upper()[-3:],
|
||||
"ARDUINO=%d" % ARDUINO_VERSION,
|
||||
"ARDUINO_%s" % BOARD_OPTIONS['build.board']
|
||||
"ARDUINO_${BOARD_OPTIONS['build']['board']}"
|
||||
] + ARDUINO_USBDEFINES,
|
||||
CPPPATH=[
|
||||
join("$BUILD_DIR", "FrameworkArduino"),
|
||||
@@ -48,25 +44,16 @@ env.Append(
|
||||
]
|
||||
)
|
||||
|
||||
if "BOARD_MCU" not in env:
|
||||
env.Replace(BOARD_MCU=BOARD_OPTIONS['build.mcu'])
|
||||
if "BOARD_F_CPU" not in env:
|
||||
env.Replace(BOARD_F_CPU=BOARD_OPTIONS['build.f_cpu'])
|
||||
if "UPLOAD_PROTOCOL" not in env:
|
||||
env.Replace(UPLOAD_PROTOCOL=BOARD_OPTIONS['upload.protocol'])
|
||||
if "UPLOAD_SPEED" not in env:
|
||||
env.Replace(UPLOAD_SPEED=BOARD_OPTIONS['upload.speed'])
|
||||
|
||||
|
||||
libs = []
|
||||
|
||||
#
|
||||
# Target: Build Core Library
|
||||
#
|
||||
|
||||
libs = []
|
||||
|
||||
libs.append(env.BuildLibrary(
|
||||
join("$BUILD_DIR", "FrameworkArduino"),
|
||||
join("$PLATFORMFW_DIR", "cores", BOARD_OPTIONS['build.core'])
|
||||
join("$PLATFORMFW_DIR", "cores", "${BOARD_OPTIONS['build']['core']}")
|
||||
))
|
||||
|
||||
Return("libs")
|
||||
|
||||
@@ -12,10 +12,6 @@ from SCons.Script import Import, Return
|
||||
env = None
|
||||
Import("env")
|
||||
|
||||
BOARD_OPTIONS = env.ParseBoardOptions(
|
||||
join("$PLATFORMFW_DIR", "boards.txt"),
|
||||
"${BOARD}"
|
||||
)
|
||||
ENERGIA_VERSION = int(
|
||||
open(join(env.subst("$PLATFORMFW_DIR"),
|
||||
"version.txt")).read().replace(".", "").strip())
|
||||
@@ -23,7 +19,7 @@ ENERGIA_VERSION = int(
|
||||
# include board variant
|
||||
env.VariantDir(
|
||||
join("$BUILD_DIR", "FrameworkEnergiaVariant"),
|
||||
join("$PLATFORMFW_DIR", "variants", BOARD_OPTIONS['build.variant'])
|
||||
join("$PLATFORMFW_DIR", "variants", "${BOARD_OPTIONS['build']['variant']}")
|
||||
)
|
||||
|
||||
env.Append(
|
||||
@@ -37,31 +33,25 @@ env.Append(
|
||||
]
|
||||
)
|
||||
|
||||
if "BOARD_MCU" not in env:
|
||||
env.Replace(BOARD_MCU=BOARD_OPTIONS['build.mcu'])
|
||||
if "BOARD_F_CPU" not in env:
|
||||
env.Replace(BOARD_F_CPU=BOARD_OPTIONS['build.f_cpu'])
|
||||
if "UPLOAD_PROTOCOL" not in env and "upload.protocol" in BOARD_OPTIONS:
|
||||
env.Replace(UPLOAD_PROTOCOL=BOARD_OPTIONS['upload.protocol'])
|
||||
|
||||
# specific linker script for TIVA devices
|
||||
if "ldscript" in BOARD_OPTIONS:
|
||||
if "ldscript" in env.subst("${BOARD_OPTIONS['build']}"):
|
||||
env.Append(
|
||||
LINKFLAGS=["-T", join("$PLATFORMFW_DIR", "cores",
|
||||
BOARD_OPTIONS['build.core'],
|
||||
BOARD_OPTIONS['ldscript'])]
|
||||
LINKFLAGS=["-T", join(
|
||||
"$PLATFORMFW_DIR", "cores",
|
||||
"${BOARD_OPTIONS['build']['core']}",
|
||||
"${BOARD_OPTIONS['build']['ldscript']}")]
|
||||
)
|
||||
|
||||
|
||||
libs = []
|
||||
|
||||
#
|
||||
# Target: Build Core Library
|
||||
#
|
||||
|
||||
libs = []
|
||||
|
||||
libs.append(env.BuildLibrary(
|
||||
join("$BUILD_DIR", "FrameworkEnergia"),
|
||||
join("$PLATFORMFW_DIR", "cores", BOARD_OPTIONS['build.core'])
|
||||
join("$PLATFORMFW_DIR", "cores", "${BOARD_OPTIONS['build']['core']}")
|
||||
))
|
||||
|
||||
Return("libs")
|
||||
|
||||
@@ -5,8 +5,10 @@ import atexit
|
||||
import re
|
||||
from os import getenv, listdir, remove, walk
|
||||
from os.path import basename, isdir, isfile, join
|
||||
from time import sleep
|
||||
|
||||
from SCons.Script import SConscript, SConscriptChdir
|
||||
from serial import Serial
|
||||
|
||||
|
||||
def ProcessGeneral(env):
|
||||
@@ -126,38 +128,6 @@ def VariantDirRecursive(env, variant_dir, src_dir, duplicate=True):
|
||||
return variants
|
||||
|
||||
|
||||
def ParseBoardOptions(env, path, name):
|
||||
path = env.subst(path)
|
||||
name = env.subst(name)
|
||||
if not isfile(path):
|
||||
env.Exit("Invalid path to boards.txt -> %s" % path)
|
||||
|
||||
data = {}
|
||||
with open(path) as f:
|
||||
for line in f:
|
||||
if not line.strip() or line[0] == "#":
|
||||
continue
|
||||
|
||||
_group = line[:line.index(".")]
|
||||
_cpu = name[len(_group):]
|
||||
line = line[len(_group)+1:].strip()
|
||||
if _group != name[:len(_group)]:
|
||||
continue
|
||||
elif "menu.cpu." in line:
|
||||
if _cpu not in line:
|
||||
continue
|
||||
else:
|
||||
line = line[len(_cpu)+10:]
|
||||
|
||||
if "=" in line:
|
||||
opt, value = line.split("=", 1)
|
||||
data[opt] = value
|
||||
if not data:
|
||||
env.Exit("Unknown Board '%s'" % name)
|
||||
else:
|
||||
return data
|
||||
|
||||
|
||||
def ConvertInoToCpp(env):
|
||||
|
||||
def delete_tmpcpp(files):
|
||||
@@ -206,6 +176,17 @@ def ConvertInoToCpp(env):
|
||||
atexit.register(delete_tmpcpp, tmpcpp)
|
||||
|
||||
|
||||
def FlushSerialBuffer(env, port):
|
||||
s = Serial(env.subst(port))
|
||||
s.flushInput()
|
||||
s.setDTR(False)
|
||||
s.setRTS(False)
|
||||
sleep(0.1)
|
||||
s.setDTR(True)
|
||||
s.setRTS(True)
|
||||
s.close()
|
||||
|
||||
|
||||
def exists(_):
|
||||
return True
|
||||
|
||||
@@ -219,6 +200,6 @@ def generate(env):
|
||||
env.AddMethod(GetDependentLibraries)
|
||||
env.AddMethod(ParseIncludesRecurive)
|
||||
env.AddMethod(VariantDirRecursive)
|
||||
env.AddMethod(ParseBoardOptions)
|
||||
env.AddMethod(ConvertInoToCpp)
|
||||
env.AddMethod(FlushSerialBuffer)
|
||||
return env
|
||||
|
||||
Reference in New Issue
Block a user