Merge branch 'release/v0.4.0'

This commit is contained in:
Ivan Kravets
2014-07-31 16:26:35 +03:00
27 changed files with 485 additions and 273 deletions

View File

@ -1,6 +1,26 @@
Release History
===============
1.0.0 (?)
---------
0.4.0 (2014-07-31)
------------------
* Implemented ``serialports`` command
* Allowed to put special build flags only for ``src`` files via
``srcbuild_flags`` environment option
* Allowed to override some of settings via system environment variables
such as: ``$PIOSRCBUILD_FLAGS`` and ``$PIOENVS_DIR``
* Added ``--upload-port`` option for ``platformio run`` command
* Implemented (especially for `SmartAnthill <http://smartanthill.ikravets.com/>`_)
``platformio run -t uploadlazy`` target (no dependencies to framework libs,
ELF and etc.)
* Allowed to skip default packages via ``platformio install --skip-default-package`` flag
* Added tools for Raspberry Pi platform
* Added support for Microduino and Raspduino boards in ``atmelavr`` platform
0.3.1 (2014-06-21)
------------------

View File

@ -17,6 +17,14 @@ PlatformIO
:target: https://pypi.python.org/pypi/platformio/
:alt: License
`Quickstart <#quickstart>`_ |
`Installation <#installation>`_ |
`Documentation <#documentation>`_ |
`Examples <https://github.com/ivankravets/platformio/tree/develop/examples>`_ |
`Embedded Platform Boards <#embedded-platform-boards>`_ |
`IDE Integration <#ide-integration>`_ |
`Blog <http://www.ikravets.com/category/computer-life/platformio>`_
**PlatformIO** is a console tool to build code with different development
platforms.
@ -70,6 +78,71 @@ IDE Integration
* [Eclipse] `Building and debugging Atmel AVR (Arduino-based) project using Eclipse IDE+PlatformIO <http://www.ikravets.com/computer-life/programming/2014/06/20/building-and-debugging-atmel-avr-arduino-based-project-using-eclipse-ideplatformio>`_
Embedded Platform Boards
------------------------
**PlatformIO** has pre-configured settings for most popular platform boards. You
have no need to specify in ``platformio.ini`` type or frequency of MCU, upload
protocol or etc. Please use ``board`` option (for
`example <https://github.com/ivankravets/platformio/blob/develop/examples/wiring-blink/platformio.ini>`_).
Platform ``atmelavr``
~~~~~~~~~~~~~~~~~~~~~
* ``diecimilaatmega168`` Arduino Duemilanove or Diecimila (ATmega168)
* ``diecimilaatmega328`` Arduino Duemilanove or Diecimila (ATmega328)
* ``fio`` Arduino Fio
* ``leonardo`` Arduino Leonardo
* ``LilyPadUSB`` Arduino LilyPad USB
* ``lilypadatmega168`` Arduino LilyPad (ATmega168)
* ``lilypadatmega328`` Arduino LilyPad (ATmega328)
* ``megaatmega1280`` Arduino Mega (ATmega1280)
* ``megaatmega2560`` Arduino Mega (ATmega2560)
* ``megaADK`` Arduino Mega ADK
* ``micro`` Arduino Micro
* ``miniatmega168`` Arduino Mini (ATmega168)
* ``miniatmega328`` Arduino Mini (ATmega328)
* ``nanoatmega168`` Arduino Nano (ATmega168)
* ``nanoatmega328`` Arduino Nano (ATmega328)
* ``pro8MHzatmega168`` Arduino Pro or Pro Mini (ATmega168, 3.3V, 8MHz)
* ``pro16MHzatmega168`` Arduino Pro or Pro Mini (ATmega168, 5V, 16MHz)
* ``pro8MHzatmega328`` Arduino Pro or Pro Mini (ATmega328, 3.3V, 8MHz)
* ``pro16MHzatmega328`` Arduino Pro or Pro Mini (ATmega328, 5V, 16MHz)
* ``uno`` Arduino Uno
* ``raspduino`` Raspduino
* ``328p8m`` Microduino Core (ATmega328P, 3.3V, 8MHz)
* ``328p16m`` Microduino Core (Atmega328P, 5V, 16MHz)
* ``168pa8m`` Microduino Core (ATmega168PA, 3.3V, 8MHz)
* ``168pa16m`` Microduino Core (ATmega168PA, 5V, 16MHz)
* ``644pa8m`` Microduino Core+ (ATmega644PA, 3.3V, 8MHz)
* ``644pa16m`` Microduino Core+ (ATmega644PA, 5V, 16MHz)
* ``1284p8m`` Microduino-Core+ (ATmega1284P, 3.3V, 8MHz)
* ``1284p16m`` Microduino-Core+ (ATmega1284P, 5V, 16MHz)
* ``32u416m`` Microduino-Core USB (ATmega32U4, 5V, 16MHz)
Platform ``timsp430``
~~~~~~~~~~~~~~~~~~~~~
* ``lpmsp430g2231`` TI LaunchPad MSP430 (msp430g2231)
* ``lpmsp430g2452`` TI LaunchPad MSP430 (msp430g2452)
* ``lpmsp430g2553`` TI LaunchPad MSP430 (msp430g2553)
* ``lpmsp430f5529`` TI LaunchPad MSP430 (msp430f5529, 16MHz)
* ``lpmsp430f5529_25`` TI LaunchPad MSP430 (msp430f5529, 25MHz)
* ``lpmsp430fr5969`` TI LaunchPad MSP430 (msp430fr5969)
* ``lpmsp430fr5739`` TI FraunchPad MSP430 (msp430fr5739)
Platform ``titiva``
~~~~~~~~~~~~~~~~~~~
* ``lplm4f120h5qr`` TI Stellaris LM4F120 LaunchPad
* ``lptm4c1230c3pm`` TI Tiva C Series TM4C123G LaunchPad
* ``lptm4c1294ncpdt`` TI Tiva C Series TM4C1294 Connected LaunchPad
Python & OS Support
-------------------
@ -96,7 +169,7 @@ Quickstart
$ platformio run
For more detailed information please follow to `Installation <#installation>`_
and `User Guide <#user-guide>`_ sections.
and `Documentation <#documentation>`_ sections.
Installation
@ -127,6 +200,13 @@ Then run the following (which may require administrator access):
$ python get-platformio.py
An alternative short version for *Mac/Linux* users:
.. code-block:: bash
$ curl -L http://bit.ly/1lpanta | python
On *Windows OS* it may look like:
.. code-block:: bash
@ -176,8 +256,8 @@ For upgrading the ``platformio`` to new version please use this command:
$ pip install -U platformio
User Guide
----------
Documentation
-------------
To print all available commands and options:
@ -195,36 +275,42 @@ To print all available commands and options:
--help Show this message and exit.
Commands:
init Initialize new platformio based project
install Install new platforms
list List installed platforms
run Process project environments
search Search for development platforms
show Show details about an installed platforms
uninstall Uninstall the platforms
update Update installed platforms
init Initialize new PlatformIO based project
install Install new platforms
list List installed platforms
run Process project environments
search Search for development platforms
serialports List Serial ports
show Show details about an installed platforms
uninstall Uninstall platforms
update Update installed platforms
``platformio search``
~~~~~~~~~~~~~~~~~~~~~
``platformio init``
~~~~~~~~~~~~~~~~~~~
Search for development platforms:
Initialize new PlatformIO based project.
.. code-block:: bash
# Print all available development platforms
$ platformio search all
# Filter platforms by "Query"
$ platformio search "Query"
# Change directory to future project
$ cd /path/to/empty/directory
$ platformio init
# Example
$ platformio search ti
timsp430 - An embedded platform for TI MSP430 microcontrollers (with Energia Framework)
titiva - An embedded platform for TI TIVA C ARM microcontrollers (with Energia Framework)
$ platformio init
Project has been initialized!
Please put your source code to `src` directory, external libraries to `lib`
and setup environments in `platformio.ini` file.
Then process project with `platformio run` command.
$ platformio search arduino
atmelavr - An embedded platform for Atmel AVR microcontrollers (with Arduino Framework)
After this command ``platformio`` will create:
* ``.pioenvs`` - a temporary working directory.
* ``lib`` - a directory for project specific libraries. PlatformIO will
compile their to static libraries and link to executable file
* ``src`` - a source directory. Put code here.
* ``platformio.ini`` - a configuration file for project
``platformio install``
@ -236,11 +322,12 @@ can install one of them:
.. code-block:: bash
$ platformio install SomePlatform
$ platformio install SomePlatform --with-package=PackageName
$ platformio install SomePlatform --without-package=PackageName
$ platformio install SomePlatform --with-package=toolchain|uploader|PackageName
$ platformio install SomePlatform --without-package=toolchain|uploader|PackageName
$ platformio install SomePlatform --skip-default-package
# Example
$ platformio install timsp430 --with-package=framework-energiamsp430
$ platformio install timsp430
Installing toolchain-timsp430 package:
Downloading [####################################] 100%
Unpacking [####################################] 100%
@ -252,6 +339,13 @@ can install one of them:
Unpacking [####################################] 100%
The platform 'timsp430' has been successfully installed!
# Skip default packages and install uploader utility only
$ platformio install timsp430 --skip-default-package --with-package=uploader
Installing tool-mspdebug package:
Downloading [####################################] 100%
Unpacking [####################################] 100%
The platform 'timsp430' has been successfully installed!
``platformio list``
~~~~~~~~~~~~~~~~~~~
@ -267,76 +361,6 @@ To list installed platforms:
timsp430 with packages: toolchain-timsp430, tool-mspdebug, framework-energiamsp430
``platformio show``
~~~~~~~~~~~~~~~~~~~
To show details about an installed platform:
.. code-block:: bash
$ platformio show SomePlatform
# Example
$ platformio show timsp430
timsp430 - An embedded platform for TI MSP430 microcontrollers (with Energia Framework)
----------
Package: toolchain-timsp430
Location: /Users/ikravets/.platformio/timsp430/tools/toolchain
Version: 1
----------
Package: tool-mspdebug
Location: /Users/ikravets/.platformio/timsp430/tools/mspdebug
Version: 1
----------
Package: framework-energiamsp430
Location: /Users/ikravets/.platformio/timsp430/frameworks/energia
Version: 1
``platformio uninstall``
~~~~~~~~~~~~~~~~~~~~~~~~
To uninstall platform:
.. code-block:: bash
$ platformio uninstall SomePlatform
# Example
$ platformio uninstall timsp430
Uninstalling toolchain-timsp430 package: [OK]
Uninstalling tool-mspdebug package: [OK]
Uninstalling framework-energiamsp430 package: [OK]
The platform 'timsp430' has been successfully uninstalled!
``platformio init``
~~~~~~~~~~~~~~~~~~~
Initialize new platformio based project.
.. code-block:: bash
# Change directory to future project
$ cd /path/to/empty/directory
$ platformio init
# Example
$ platformio init
Project successfully initialized.
Please put your source code to `src` directory, external libraries to `lib`
and setup environments in `platformio.ini` file.
Then process project with `platformio run` command.
After this command ``platformio`` will create:
* ``.pioenvs`` - a temporary working directory.
* ``lib`` - a directory for project specific libraries. PlatformIO will
compile their to static libraries and link to executable file
* ``src`` - a source directory. Put code here.
* ``platformio.ini`` - a configuration file for project
``platformio run``
~~~~~~~~~~~~~~~~~~
@ -372,7 +396,6 @@ Process specific environments:
scons: `.pioenvs/arduino_pro5v/firmware.elf' is up to date.
scons: `.pioenvs/arduino_pro5v/firmware.hex' is up to date.
Skipped launchpad_msp430g2 environment
Processing launchpad_lm4f120 environment:
scons: `.pioenvs/launchpad_lm4f120/firmware.elf' is up to date.
scons: `.pioenvs/launchpad_lm4f120/firmware.hex' is up to date.
@ -382,7 +405,7 @@ Process specific target:
.. code-block:: bash
$ platformio run -t clean
$ platformio run -t upload
$ platformio run -t upload --upload-port=/dev/ttyUSBX
# Example
platformio run -t clean
@ -409,7 +432,6 @@ Mix environments and targets:
# Example
$ platformio run -e launchpad_msp430g2 -t upload
Skipped arduino_pro5v environment
Processing launchpad_msp430g2 environment:
/Users/ikravets/.platformio/timsp430/tools/mspdebug/mspdebug rf2500 --force-reset "prog .pioenvs/launchpad_msp430g2/firmware.hex"
MSPDebug version 0.20 - debugging tool for MSP430 MCUs
@ -439,7 +461,106 @@ Mix environments and targets:
Writing 32 bytes at ffe0...
Done, 678 bytes total
Skipped launchpad_lm4f120 environment
``platformio search``
~~~~~~~~~~~~~~~~~~~~~
Search for development platforms:
.. code-block:: bash
# Print all available development platforms
$ platformio search all
# Filter platforms by "Query"
$ platformio search "Query"
# Example
$ platformio search ti
timsp430 - An embedded platform for TI MSP430 microcontrollers (with Energia Framework)
titiva - An embedded platform for TI TIVA C ARM microcontrollers (with Energia Framework)
$ platformio search arduino
atmelavr - An embedded platform for Atmel AVR microcontrollers (with Arduino Framework)
``platformio serialports``
~~~~~~~~~~~~~~~~~~~~~~~~~~
To list available `Serial Ports <http://en.wikipedia.org/wiki/Serial_port>`_:
.. code-block:: bash
$ platformio serialports
# Example (Posix)
$ platformio serialports
/dev/cu.SLAB_USBtoUART
----------
Hardware ID: USB VID:PID=10c4:ea60 SNR=0001
Description: CP2102 USB to UART Bridge Controller
/dev/cu.uart-1CFF4676258F4543
----------
Hardware ID: USB VID:PID=451:f432 SNR=1CFF4676258F4543
Description: Texas Instruments MSP-FET430UIF
# Example (Windows)
$ platformio serialports
COM4
----------
Hardware ID: USB VID:PID=0451:F432
Description: MSP430 Application UART (COM4)
COM3
----------
Hardware ID: USB VID:PID=10C4:EA60 SNR=0001
Description: Silicon Labs CP210x USB to UART Bridge (COM3)
``platformio show``
~~~~~~~~~~~~~~~~~~~
To show details about an installed platform:
.. code-block:: bash
$ platformio show SomePlatform
# Example
$ platformio show atmelavr
atmelavr - An embedded platform for Atmel AVR microcontrollers (with Arduino Framework)
----------
Package: toolchain-atmelavr
Alias: toolchain
Location: /Users/ikravets/.platformio/atmelavr/tools/toolchain
Version: 1
----------
Package: tool-avrdude
Alias: uploader
Location: /Users/ikravets/.platformio/atmelavr/tools/avrdude
Version: 1
----------
Package: framework-arduinoavr
Location: /Users/ikravets/.platformio/atmelavr/frameworks/arduino
Version: 1
``platformio uninstall``
~~~~~~~~~~~~~~~~~~~~~~~~
To uninstall platform:
.. code-block:: bash
$ platformio uninstall SomePlatform
# Example
$ platformio uninstall timsp430
Uninstalling toolchain-timsp430 package: [OK]
Uninstalling tool-mspdebug package: [OK]
Uninstalling framework-energiamsp430 package: [OK]
The platform 'timsp430' has been successfully uninstalled!
``platformio update``

View File

@ -1,7 +1,7 @@
# Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details.
VERSION = (0, 3, 1)
VERSION = (0, 4, 0)
__version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio"

View File

@ -6,7 +6,7 @@ from os.path import join
from sys import exit as sys_exit
from traceback import format_exc
from click import command, MultiCommand, style, version_option
from click import command, MultiCommand, version_option
from platformio import __version__
from platformio.exception import PlatformioException, UnknownCLICommand
@ -35,7 +35,7 @@ class PlatformioCLI(MultiCommand):
@command(cls=PlatformioCLI)
@version_option(__version__, prog_name="platformio")
@version_option(__version__, prog_name="PlatformIO")
def cli():
pass
@ -45,7 +45,7 @@ def main():
cli()
except Exception as e: # pylint: disable=W0703
if isinstance(e, PlatformioException):
sys_exit(style("Error: ", fg="red") + str(e))
sys_exit("Error: " + str(e))
else:
print format_exc()

View File

@ -6,7 +6,8 @@ from os.path import isdir, join
from SCons.Script import (DefaultEnvironment, Exit, SConscript,
SConscriptChdir, Variables)
from platformio.util import get_home_dir, get_project_dir, get_source_dir
from platformio.util import (get_home_dir, get_pioenvs_dir, get_project_dir,
get_source_dir)
# AllowSubstExceptions()
@ -17,6 +18,7 @@ commonvars.AddVariables(
("PLATFORM",),
("FRAMEWORK",),
("BUILD_FLAGS",),
("SRCBUILD_FLAGS",),
# board options
("BOARD",),
@ -36,13 +38,14 @@ DefaultEnvironment(
PIOBUILDER_DIR=join(get_source_dir(), "builder"),
PROJECT_DIR=get_project_dir(),
PIOENVS_DIR=get_pioenvs_dir(),
PLATFORMIOHOME_DIR=get_home_dir(),
PLATFORM_DIR=join("$PLATFORMIOHOME_DIR", "$PLATFORM"),
PLATFORMFW_DIR=join("$PLATFORM_DIR", "frameworks", "$FRAMEWORK"),
PLATFORMTOOLS_DIR=join("$PLATFORM_DIR", "tools"),
BUILD_DIR=join("$PROJECT_DIR", ".pioenvs", "$PIOENV"),
BUILD_DIR=join("$PIOENVS_DIR", "$PIOENV"),
LIBSOURCE_DIRS=[
join("$PROJECT_DIR", "lib"),
join("$PLATFORMFW_DIR", "libraries"),

View File

@ -8,8 +8,9 @@
from os.path import join
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
DefaultEnvironment, Exit, SConscript,
SConscriptChdir)
DefaultEnvironment, Exit)
from platformio.util import reset_serialport
env = DefaultEnvironment()
@ -66,9 +67,6 @@ env.Replace(
UPLOADEEPCMD="$UPLOADER $UPLOADERFLAGS -U eeprom:w:$SOURCES:i"
)
if "BUILD_FLAGS" in env:
env.MergeFlags(env['BUILD_FLAGS'])
env.Append(
BUILDERS=dict(
ElfToEep=Builder(
@ -101,23 +99,7 @@ env.Append(
)
)
env.PrependENVPath(
"PATH",
join(env.subst("$PLATFORMTOOLS_DIR"), "toolchain", "bin")
)
BUILT_LIBS = []
#
# Process framework script
#
if "FRAMEWORK" in env:
SConscriptChdir(0)
flibs = SConscript(env.subst(join("$PIOBUILDER_DIR", "scripts",
"frameworks", "${FRAMEWORK}.py")),
exports="env")
BUILT_LIBS += flibs
BUILT_LIBS = env.ProcessGeneral()
#
# Target: Build executable and linkable firmware
@ -129,39 +111,48 @@ target_elf = env.BuildFirmware(BUILT_LIBS + ["m"])
# Target: Extract EEPROM data (from EEMEM directive) to .eep file
#
target_eep = env.ElfToEep(join("$BUILD_DIR", "firmware"), target_elf)
target_eep = env.Alias("eep", env.ElfToEep(join("$BUILD_DIR", "firmware"),
target_elf))
#
# Target: Build the .hex file
#
target_hex = env.ElfToHex(join("$BUILD_DIR", "firmware"), target_elf)
if "uploadlazy" in COMMAND_LINE_TARGETS:
target_hex = join("$BUILD_DIR", "firmware.hex")
else:
target_hex = env.ElfToHex(join("$BUILD_DIR", "firmware"), target_elf)
#
# Target: Upload by default .hex file
#
upload = env.Alias(["upload", "uploadlazy"], target_hex, [
lambda target, source, env: reset_serialport(env.subst("$UPLOAD_PORT")),
"$UPLOADHEXCMD"])
AlwaysBuild(upload)
#
# Target: Upload .eep file
#
eep = env.Alias("eep", target_eep, [
lambda target, source, env: env.ResetDevice(), "$UPLOADEEPCMD"])
AlwaysBuild(eep)
uploadeep = env.Alias("uploadeep", target_eep, [
lambda target, source, env: reset_serialport(env.subst("$UPLOAD_PORT")),
"$UPLOADEEPCMD"])
AlwaysBuild(uploadeep)
#
# Target: Upload .hex file
# Check for $UPLOAD_PORT variable
#
upload = env.Alias("upload", target_hex, [
lambda target, source, env: env.ResetDevice(), "$UPLOADHEXCMD"])
AlwaysBuild(upload)
#
# Target: Define targets
#
env.Alias("build-eep", [target_eep])
Default([target_elf, target_hex])
# check for $UPLOAD_PORT variable
is_uptarget = ("eep" in COMMAND_LINE_TARGETS or "upload" in
COMMAND_LINE_TARGETS)
is_uptarget = (set(["upload", "uploadlazy", "uploadeep"]) &
set(COMMAND_LINE_TARGETS))
if is_uptarget and not env.subst("$UPLOAD_PORT"):
Exit("Please specify 'upload_port'")
Exit("Please specify environment 'upload_port' or use global "
"--upload-port option.")
#
# Setup default targets
#
Default(target_hex)

View File

@ -7,11 +7,10 @@
"""
from os.path import join
from platform import system
from SCons.Script import (AlwaysBuild, Builder, Default, DefaultEnvironment,
SConscript, SConscriptChdir)
from platformio.util import get_system
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
DefaultEnvironment)
env = DefaultEnvironment()
@ -54,15 +53,12 @@ env.Replace(
UPLOADER=join("$PLATFORMTOOLS_DIR", "mspdebug", "mspdebug"),
UPLOADERFLAGS=[
"$UPLOAD_PROTOCOL" if get_system() != "windows32" else "tilib",
"$UPLOAD_PROTOCOL" if system() != "Windows" else "tilib",
"--force-reset"
],
UPLOADCMD='$UPLOADER $UPLOADERFLAGS "prog $SOURCES"'
)
if "BUILD_FLAGS" in env:
env.MergeFlags(env['BUILD_FLAGS'])
env.Append(
BUILDERS=dict(
ElfToHex=Builder(
@ -79,24 +75,7 @@ env.Append(
)
)
env.PrependENVPath(
"PATH",
join(env.subst("$PLATFORMTOOLS_DIR"), "toolchain", "bin")
)
BUILT_LIBS = []
#
# Process framework script
#
if "FRAMEWORK" in env:
SConscriptChdir(0)
flibs = SConscript(env.subst(join("$PIOBUILDER_DIR", "scripts",
"frameworks", "${FRAMEWORK}.py")),
exports="env")
BUILT_LIBS += flibs
BUILT_LIBS = env.ProcessGeneral()
#
# Target: Build executable and linkable firmware
@ -108,17 +87,20 @@ target_elf = env.BuildFirmware(BUILT_LIBS + ["m"])
# Target: Build the .hex
#
target_hex = env.ElfToHex(join("$BUILD_DIR", "firmware"), target_elf)
if "uploadlazy" in COMMAND_LINE_TARGETS:
target_hex = join("$BUILD_DIR", "firmware.hex")
else:
target_hex = env.ElfToHex(join("$BUILD_DIR", "firmware"), target_elf)
#
# Target: Upload firmware
#
upload = env.Alias("upload", target_hex, ["$UPLOADCMD"])
upload = env.Alias(["upload", "uploadlazy"], target_hex, "$UPLOADCMD")
AlwaysBuild(upload)
#
# Target: Define targets
#
Default([target_elf, target_hex])
Default(target_hex)

View File

@ -8,8 +8,8 @@
from os.path import join
from SCons.Script import (AlwaysBuild, Builder, Default, DefaultEnvironment,
SConscript, SConscriptChdir)
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
DefaultEnvironment)
env = DefaultEnvironment()
@ -75,9 +75,6 @@ env.Replace(
UPLOADCMD="$UPLOADER $SOURCES"
)
if "BUILD_FLAGS" in env:
env.MergeFlags(env['BUILD_FLAGS'])
env.Append(
BUILDERS=dict(
ElfToBin=Builder(
@ -87,28 +84,12 @@ env.Append(
"binary",
"$SOURCES",
"$TARGET"]),
suffix=".hex"
suffix=".bin"
)
)
)
env.PrependENVPath(
"PATH",
join(env.subst("$PLATFORMTOOLS_DIR"), "toolchain", "bin")
)
BUILT_LIBS = []
#
# Process framework script
#
if "FRAMEWORK" in env:
SConscriptChdir(0)
flibs = SConscript(env.subst(join("$PIOBUILDER_DIR", "scripts",
"frameworks", "${FRAMEWORK}.py")),
exports="env")
BUILT_LIBS += flibs
BUILT_LIBS = env.ProcessGeneral()
#
# Target: Build executable and linkable firmware
@ -120,17 +101,20 @@ target_elf = env.BuildFirmware(BUILT_LIBS + ["c", "gcc", "m"])
# Target: Build the .bin file
#
target_bin = env.ElfToBin(join("$BUILD_DIR", "firmware"), target_elf)
if "uploadlazy" in COMMAND_LINE_TARGETS:
target_bin = join("$BUILD_DIR", "firmware.bin")
else:
target_bin = env.ElfToBin(join("$BUILD_DIR", "firmware"), target_elf)
#
# Target: Upload firmware
#
upload = env.Alias("upload", target_bin, ["$UPLOADCMD"])
upload = env.Alias(["upload", "uploadlazy"], target_bin, "$UPLOADCMD")
AlwaysBuild(upload)
#
# Target: Define targets
#
Default([target_elf, target_bin])
Default(target_bin)

View File

@ -2,11 +2,28 @@
# See LICENSE for details.
import re
from os import listdir, walk
from os import getenv, listdir, walk
from os.path import isdir, isfile, join
from time import sleep
from serial import Serial
from SCons.Script import SConscript, SConscriptChdir
def ProcessGeneral(env):
libs = []
if "BUILD_FLAGS" in env:
env.MergeFlags(env['BUILD_FLAGS'])
env.PrependENVPath(
"PATH",
join(env.subst("$PLATFORMTOOLS_DIR"), "toolchain", "bin")
)
if "FRAMEWORK" in env:
SConscriptChdir(0)
libs = SConscript(env.subst(join("$PIOBUILDER_DIR", "scripts",
"frameworks", "${FRAMEWORK}.py")),
exports="env")
return libs
def BuildLibrary(env, variant_dir, library_dir):
@ -46,6 +63,8 @@ def BuildFirmware(env, libslist):
if _libs:
libslist += _libs
src.MergeFlags(getenv("PIOSRCBUILD_FLAGS", "$SRCBUILD_FLAGS"))
return src.Program(
join("$BUILD_DIR", "firmware"),
[src.GlobCXXFiles(vdir) for vdir in vdirs],
@ -116,23 +135,12 @@ def ParseBoardOptions(env, path, name):
return data
def ResetDevice(env):
""" Pulse the DTR line and flush serial buffer """
s = Serial(env.subst("$UPLOAD_PORT"))
s.flushInput()
s.setDTR(False)
s.setRTS(False)
sleep(0.1)
s.setDTR(True)
s.setRTS(True)
s.close()
def exists(_):
return True
def generate(env):
env.AddMethod(ProcessGeneral)
env.AddMethod(BuildLibrary)
env.AddMethod(BuildDependentLibraries)
env.AddMethod(BuildFirmware)
@ -140,5 +148,4 @@ def generate(env):
env.AddMethod(GetDependentLibraries)
env.AddMethod(VariantDirRecursive)
env.AddMethod(ParseBoardOptions)
env.AddMethod(ResetDevice)
return env

View File

@ -11,18 +11,18 @@ from platformio.exception import ProjectInitialized
from platformio.util import get_source_dir
@command("init", short_help="Initialize new platformio based project")
@command("init", short_help="Initialize new PlatformIO based project")
def cli():
if isfile("platformio.ini") and isdir("src"):
raise ProjectInitialized()
for d in (".pioenvs", "lib", "src"):
for d in ("lib", "src"):
if not isdir(d):
makedirs(d)
if not isfile("platformio.ini"):
copyfile(join(get_source_dir(), "projectconftpl.ini"),
"platformio.ini")
secho("Project successfully initialized.\n"
secho("Project has been initialized!\n"
"Please put your source code to `src` directory, "
"external libraries to `lib` and "
"setup environments in `platformio.ini` file.\n"

View File

@ -3,19 +3,18 @@
from click import argument, command, option, secho
from platformio.platforms._base import PlatformFactory
from platformio.platforms.base import PlatformFactory
@command("install", short_help="Install new platforms")
@argument("platforms", nargs=-1)
@option('--with-package', multiple=True, metavar="<package>")
@option('--without-package', multiple=True, metavar="<package>")
def cli(platforms, with_package, without_package):
@option("--with-package", multiple=True, metavar="<package>")
@option("--without-package", multiple=True, metavar="<package>")
@option("--skip-default-package", is_flag=True)
def cli(platforms, with_package, without_package, skip_default_package):
for platform in platforms:
p = PlatformFactory().newPlatform(platform)
if p.install(with_package, without_package):
if p.install(with_package, without_package, skip_default_package):
secho("The platform '%s' has been successfully installed!" %
platform, fg="green")

View File

@ -9,7 +9,7 @@ from platformio.pkgmanager import PackageManager
@command("list", short_help="List installed platforms")
def cli():
for name, pkgs in PackageManager.get_installed().iteritems():
for name, pkgs in PackageManager.get_installed().items():
echo("{name:<20} with packages: {pkgs}".format(
name=style(name, fg="cyan"),
pkgs=", ".join(pkgs.keys())

View File

@ -3,34 +3,46 @@
from click import command, echo, option, secho, style
from platformio.exception import ProjectEnvsNotAvaialable, UndefinedEnvPlatform
from platformio.platforms._base import PlatformFactory
from platformio.exception import (InvalidEnvName, ProjectEnvsNotAvaialable,
UndefinedEnvPlatform, UnknownEnvNames)
from platformio.platforms.base import PlatformFactory
from platformio.util import get_project_config
@command("run", short_help="Process project environments")
@option("--environment", "-e", multiple=True, metavar="<environment>")
@option("--target", "-t", multiple=True, metavar="<target>")
def cli(environment, target):
@option("--upload-port", metavar="<upload port>")
def cli(environment, target, upload_port):
config = get_project_config()
if not config.sections():
raise ProjectEnvsNotAvaialable()
unknown = set(environment) - set([s[4:] for s in config.sections()])
if unknown:
raise UnknownEnvNames(", ".join(unknown))
for section in config.sections():
if section[:4] != "env:":
continue
raise InvalidEnvName(section)
envname = section[4:]
if environment and envname not in environment:
echo("Skipped %s environment" % style(envname, fg="yellow"))
# echo("Skipped %s environment" % style(envname, fg="yellow"))
continue
echo("Processing %s environment:" % style(envname, fg="cyan"))
variables = ["%s=%s" % (o.upper(), v) for o, v in config.items(section)
if o != "targets"]
variables.append("PIOENV=" + envname)
variables = ["PIOENV=" + envname]
if upload_port:
variables.append("UPLOAD_PORT=%s" % upload_port)
for k, v in config.items(section):
k = k.upper()
if k == "TARGETS" or (k == "UPLOAD_PORT" and upload_port):
continue
variables.append("%s=%s" % (k.upper(), v))
envtargets = []
if target:

View File

@ -3,7 +3,7 @@
from click import argument, command, echo, style
from platformio.platforms._base import PlatformFactory
from platformio.platforms.base import PlatformFactory
from platformio.util import get_platforms

View File

@ -0,0 +1,17 @@
# Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details.
from click import command, echo, secho
from platformio.util import get_serialports
@command("serialports", short_help="List Serial ports")
def cli():
for item in get_serialports():
secho(item['port'], fg="cyan")
echo("----------")
echo("Hardware ID: %s" % item['hwid'])
echo("Description: %s" % item['description'])
echo("")

View File

@ -7,7 +7,7 @@ from click import argument, command, echo, style
from platformio.exception import PlatformNotInstalledYet
from platformio.pkgmanager import PackageManager
from platformio.platforms._base import PlatformFactory
from platformio.platforms.base import PlatformFactory
@command("show", short_help="Show details about an installed platforms")
@ -22,8 +22,11 @@ def cli(platform):
info=p.get_short_info()))
pm = PackageManager(platform)
for name, data in pm.get_installed(platform).iteritems():
for name, data in pm.get_installed(platform).items():
pkgalias = p.get_pkg_alias(name)
echo("----------")
echo("Package: %s" % style(name, fg="yellow"))
if pkgalias:
echo("Alias: %s" % pkgalias)
echo("Location: %s" % join(pm.get_platform_dir(), data['path']))
echo("Version: %d" % int(data['version']))

View File

@ -5,10 +5,10 @@ from click import argument, command, secho
from platformio.exception import PlatformNotInstalledYet
from platformio.pkgmanager import PackageManager
from platformio.platforms._base import PlatformFactory
from platformio.platforms.base import PlatformFactory
@command("uninstall", short_help="Uninstall the platforms")
@command("uninstall", short_help="Uninstall platforms")
@argument("platforms", nargs=-1)
def cli(platforms):

View File

@ -4,7 +4,7 @@
from click import command, echo, style
from platformio.pkgmanager import PackageManager
from platformio.platforms._base import PlatformFactory
from platformio.platforms.base import PlatformFactory
@command("update", short_help="Update installed platforms")

View File

@ -85,3 +85,18 @@ class ProjectInitialized(PlatformioException):
class ProjectEnvsNotAvaialable(PlatformioException):
MESSAGE = "Please setup environments in `platformio.ini` file."
class InvalidEnvName(PlatformioException):
MESSAGE = "Invalid environment '%s'. The name must start " "with 'env:'."
class UnknownEnvNames(PlatformioException):
MESSAGE = "Unknown environment names '%s'."
class GetSerialPortsError(PlatformioException):
MESSAGE = "No implementation for your platform ('%s') available"

View File

@ -14,7 +14,7 @@ from platformio.downloader import FileDownloader
from platformio.exception import (InvalidPackageVersion, NonSystemPackage,
UnknownPackage)
from platformio.unpacker import FileUnpacker
from platformio.util import get_home_dir, get_system
from platformio.util import get_home_dir, get_systype
class PackageManager(object):
@ -66,11 +66,11 @@ class PackageManager(object):
raise UnknownPackage(name)
# check system platform
system = get_system()
builds = ([b for b in manifest[name] if b['system'] == "all" or system
systype = get_systype()
builds = ([b for b in manifest[name] if b['system'] == "all" or systype
in b['system']])
if not builds:
raise NonSystemPackage(name, system)
raise NonSystemPackage(name, systype)
if version:
for b in builds:

View File

@ -3,7 +3,7 @@
from os.path import join
from platformio.platforms._base import BasePlatform
from platformio.platforms.base import BasePlatform
class AtmelavrPlatform(BasePlatform):
@ -16,12 +16,14 @@ class AtmelavrPlatform(BasePlatform):
"toolchain-atmelavr": {
"path": join("tools", "toolchain"),
"alias": "toolchain",
"default": True
},
"tool-avrdude": {
"path": join("tools", "avrdude"),
"default": True,
"alias": "uploader",
"default": True
},
"framework-arduinoavr": {

View File

@ -40,30 +40,49 @@ class BasePlatform(object):
else:
raise NotImplementedError()
def install(self, with_packages, without_packages):
requirements = []
pm = PackageManager(self.get_name())
def get_pkg_alias(self, pkgname):
return self.PACKAGES[pkgname].get("alias", None)
upkgs = set(with_packages + without_packages)
def pkg_aliases_to_names(self, aliases):
names = []
for alias in aliases:
name = alias
# lookup by packages alias
if name not in self.PACKAGES:
for _name, _opts in self.PACKAGES.items():
if _opts.get("alias", None) == alias:
name = _name
break
names.append(name)
return names
def install(self, with_packages, without_packages, skip_default_packages):
with_packages = set(self.pkg_aliases_to_names(with_packages))
without_packages = set(self.pkg_aliases_to_names(without_packages))
upkgs = with_packages | without_packages
ppkgs = set(self.PACKAGES.keys())
if not upkgs.issubset(ppkgs):
raise UnknownPackage(", ".join(upkgs - ppkgs))
for name, opts in self.PACKAGES.iteritems():
requirements = []
for name, opts in self.PACKAGES.items():
if name in without_packages:
continue
elif name in with_packages or opts["default"]:
requirements.append((name, opts["path"]))
elif (name in with_packages or (not skip_default_packages and
opts['default'])):
requirements.append((name, opts['path']))
pm = PackageManager(self.get_name())
for (package, path) in requirements:
pm.install(package, path)
return True
return len(requirements)
def uninstall(self):
platform = self.get_name()
pm = PackageManager(platform)
for package, data in pm.get_installed(platform).iteritems():
for package, data in pm.get_installed(platform).items():
pm.uninstall(package, data['path'])
pm.unregister_platform(platform)

View File

@ -3,7 +3,7 @@
from os.path import join
from platformio.platforms._base import BasePlatform
from platformio.platforms.base import BasePlatform
class Timsp430Platform(BasePlatform):
@ -16,12 +16,14 @@ class Timsp430Platform(BasePlatform):
"toolchain-timsp430": {
"path": join("tools", "toolchain"),
"alias": "toolchain",
"default": True
},
"tool-mspdebug": {
"path": join("tools", "mspdebug"),
"default": True,
"alias": "uploader",
"default": True
},
"framework-energiamsp430": {

View File

@ -3,7 +3,7 @@
from os.path import join
from platformio.platforms._base import BasePlatform
from platformio.platforms.base import BasePlatform
class TitivaPlatform(BasePlatform):
@ -16,12 +16,14 @@ class TitivaPlatform(BasePlatform):
"toolchain-gccarmnoneeabi": {
"path": join("tools", "toolchain"),
"alias": "toolchain",
"default": True
},
"tool-lm4flash": {
"path": join("tools", "lm4flash"),
"default": True,
"alias": "uploader",
"default": True
},
"framework-energiativa": {

View File

@ -14,7 +14,8 @@
# Environment with specific build flags
#[env:specbuildflags]
#platform = %INSTALLED_PLATFORM_NAME_HERE%
#build_flags = "-I/opt/include -L/opt/lib -lfoo -DMYDEFINE=13"
#build_flags = "-I/opt/include -L/opt/lib -lfoo"
#srcbuild_flags = "-DSPECIAL_DEFINE_FOR_MY_SRC_FILES=13"
#
# Atmel AVR based board

View File

@ -1,12 +1,16 @@
# Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details.
from os import getcwd, listdir, utime
from os import name as os_name
from os import getcwd, getenv, listdir, utime
from os.path import dirname, expanduser, isfile, join, realpath
from platform import architecture, system
from platform import system, uname
from subprocess import PIPE, Popen
from time import sleep
from platformio.exception import NotPlatformProject
from serial import Serial
from platformio.exception import GetSerialPortsError, NotPlatformProject
try:
from configparser import ConfigParser
@ -14,8 +18,11 @@ except ImportError:
from ConfigParser import ConfigParser
def get_system():
return (system() + architecture()[0][:-3]).lower()
def get_systype():
if system() == "Windows":
return "windows"
data = uname()
return ("%s_%s" % (data[0], data[4])).lower()
def get_home_dir():
@ -30,6 +37,10 @@ def get_project_dir():
return getcwd()
def get_pioenvs_dir():
return getenv("PIOENVS_DIR", join(get_project_dir(), ".pioenvs"))
def get_project_config():
path = join(get_project_dir(), "platformio.ini")
if not isfile(path):
@ -53,7 +64,28 @@ def change_filemtime(path, time):
def exec_command(args):
use_shell = get_system() == "windows32"
use_shell = system() == "Windows"
p = Popen(args, stdout=PIPE, stderr=PIPE, shell=use_shell)
out, err = p.communicate()
return dict(out=out.strip(), err=err.strip())
def reset_serialport(port):
s = Serial(port)
s.flushInput()
s.setDTR(False)
s.setRTS(False)
sleep(0.1)
s.setDTR(True)
s.setRTS(True)
s.close()
def get_serialports():
if os_name == "nt":
from serial.tools.list_ports_windows import comports
elif os_name == "posix":
from serial.tools.list_ports_posix import comports
else:
raise GetSerialPortsError(os_name)
return[{"port": p, "description": d, "hwid": h} for p, d, h in comports()]

View File

@ -1,4 +1,4 @@
click==2.1
click==2.5
colorama==0.3.1
pyserial==2.7
requests==2.3.0