mirror of
https://github.com/platformio/platformio-core.git
synced 2025-07-31 18:44:27 +02:00
Merge branch 'release/v0.4.0'
This commit is contained in:
20
HISTORY.rst
20
HISTORY.rst
@@ -1,6 +1,26 @@
|
|||||||
Release History
|
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)
|
0.3.1 (2014-06-21)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
323
README.rst
323
README.rst
@@ -17,6 +17,14 @@ PlatformIO
|
|||||||
:target: https://pypi.python.org/pypi/platformio/
|
:target: https://pypi.python.org/pypi/platformio/
|
||||||
:alt: License
|
: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
|
**PlatformIO** is a console tool to build code with different development
|
||||||
platforms.
|
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>`_
|
* [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
|
Python & OS Support
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
@@ -96,7 +169,7 @@ Quickstart
|
|||||||
$ platformio run
|
$ platformio run
|
||||||
|
|
||||||
For more detailed information please follow to `Installation <#installation>`_
|
For more detailed information please follow to `Installation <#installation>`_
|
||||||
and `User Guide <#user-guide>`_ sections.
|
and `Documentation <#documentation>`_ sections.
|
||||||
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
@@ -127,6 +200,13 @@ Then run the following (which may require administrator access):
|
|||||||
|
|
||||||
$ python get-platformio.py
|
$ 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:
|
On *Windows OS* it may look like:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
@@ -176,8 +256,8 @@ For upgrading the ``platformio`` to new version please use this command:
|
|||||||
$ pip install -U platformio
|
$ pip install -U platformio
|
||||||
|
|
||||||
|
|
||||||
User Guide
|
Documentation
|
||||||
----------
|
-------------
|
||||||
|
|
||||||
To print all available commands and options:
|
To print all available commands and options:
|
||||||
|
|
||||||
@@ -195,36 +275,42 @@ To print all available commands and options:
|
|||||||
--help Show this message and exit.
|
--help Show this message and exit.
|
||||||
|
|
||||||
Commands:
|
Commands:
|
||||||
init Initialize new platformio based project
|
init Initialize new PlatformIO based project
|
||||||
install Install new platforms
|
install Install new platforms
|
||||||
list List installed platforms
|
list List installed platforms
|
||||||
run Process project environments
|
run Process project environments
|
||||||
search Search for development platforms
|
search Search for development platforms
|
||||||
show Show details about an installed platforms
|
serialports List Serial ports
|
||||||
uninstall Uninstall the platforms
|
show Show details about an installed platforms
|
||||||
update Update 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
|
.. code-block:: bash
|
||||||
|
|
||||||
# Print all available development platforms
|
# Change directory to future project
|
||||||
$ platformio search all
|
$ cd /path/to/empty/directory
|
||||||
|
$ platformio init
|
||||||
# Filter platforms by "Query"
|
|
||||||
$ platformio search "Query"
|
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
$ platformio search ti
|
$ platformio init
|
||||||
timsp430 - An embedded platform for TI MSP430 microcontrollers (with Energia Framework)
|
Project has been initialized!
|
||||||
titiva - An embedded platform for TI TIVA C ARM microcontrollers (with Energia Framework)
|
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
|
After this command ``platformio`` will create:
|
||||||
atmelavr - An embedded platform for Atmel AVR microcontrollers (with Arduino Framework)
|
|
||||||
|
* ``.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``
|
``platformio install``
|
||||||
@@ -236,11 +322,12 @@ can install one of them:
|
|||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ platformio install SomePlatform
|
$ platformio install SomePlatform
|
||||||
$ platformio install SomePlatform --with-package=PackageName
|
$ platformio install SomePlatform --with-package=toolchain|uploader|PackageName
|
||||||
$ platformio install SomePlatform --without-package=PackageName
|
$ platformio install SomePlatform --without-package=toolchain|uploader|PackageName
|
||||||
|
$ platformio install SomePlatform --skip-default-package
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
$ platformio install timsp430 --with-package=framework-energiamsp430
|
$ platformio install timsp430
|
||||||
Installing toolchain-timsp430 package:
|
Installing toolchain-timsp430 package:
|
||||||
Downloading [####################################] 100%
|
Downloading [####################################] 100%
|
||||||
Unpacking [####################################] 100%
|
Unpacking [####################################] 100%
|
||||||
@@ -252,6 +339,13 @@ can install one of them:
|
|||||||
Unpacking [####################################] 100%
|
Unpacking [####################################] 100%
|
||||||
The platform 'timsp430' has been successfully installed!
|
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``
|
``platformio list``
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -267,76 +361,6 @@ To list installed platforms:
|
|||||||
timsp430 with packages: toolchain-timsp430, tool-mspdebug, framework-energiamsp430
|
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``
|
``platformio run``
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -372,7 +396,6 @@ Process specific environments:
|
|||||||
scons: `.pioenvs/arduino_pro5v/firmware.elf' is up to date.
|
scons: `.pioenvs/arduino_pro5v/firmware.elf' is up to date.
|
||||||
scons: `.pioenvs/arduino_pro5v/firmware.hex' is up to date.
|
scons: `.pioenvs/arduino_pro5v/firmware.hex' is up to date.
|
||||||
|
|
||||||
Skipped launchpad_msp430g2 environment
|
|
||||||
Processing launchpad_lm4f120 environment:
|
Processing launchpad_lm4f120 environment:
|
||||||
scons: `.pioenvs/launchpad_lm4f120/firmware.elf' is up to date.
|
scons: `.pioenvs/launchpad_lm4f120/firmware.elf' is up to date.
|
||||||
scons: `.pioenvs/launchpad_lm4f120/firmware.hex' is up to date.
|
scons: `.pioenvs/launchpad_lm4f120/firmware.hex' is up to date.
|
||||||
@@ -382,7 +405,7 @@ Process specific target:
|
|||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ platformio run -t clean
|
$ platformio run -t clean
|
||||||
$ platformio run -t upload
|
$ platformio run -t upload --upload-port=/dev/ttyUSBX
|
||||||
|
|
||||||
# Example
|
# Example
|
||||||
platformio run -t clean
|
platformio run -t clean
|
||||||
@@ -409,7 +432,6 @@ Mix environments and targets:
|
|||||||
|
|
||||||
# Example
|
# Example
|
||||||
$ platformio run -e launchpad_msp430g2 -t upload
|
$ platformio run -e launchpad_msp430g2 -t upload
|
||||||
Skipped arduino_pro5v environment
|
|
||||||
Processing launchpad_msp430g2 environment:
|
Processing launchpad_msp430g2 environment:
|
||||||
/Users/ikravets/.platformio/timsp430/tools/mspdebug/mspdebug rf2500 --force-reset "prog .pioenvs/launchpad_msp430g2/firmware.hex"
|
/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
|
MSPDebug version 0.20 - debugging tool for MSP430 MCUs
|
||||||
@@ -439,7 +461,106 @@ Mix environments and targets:
|
|||||||
Writing 32 bytes at ffe0...
|
Writing 32 bytes at ffe0...
|
||||||
Done, 678 bytes total
|
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``
|
``platformio update``
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||||
# See LICENSE for details.
|
# See LICENSE for details.
|
||||||
|
|
||||||
VERSION = (0, 3, 1)
|
VERSION = (0, 4, 0)
|
||||||
__version__ = ".".join([str(s) for s in VERSION])
|
__version__ = ".".join([str(s) for s in VERSION])
|
||||||
|
|
||||||
__title__ = "platformio"
|
__title__ = "platformio"
|
||||||
|
@@ -6,7 +6,7 @@ from os.path import join
|
|||||||
from sys import exit as sys_exit
|
from sys import exit as sys_exit
|
||||||
from traceback import format_exc
|
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 import __version__
|
||||||
from platformio.exception import PlatformioException, UnknownCLICommand
|
from platformio.exception import PlatformioException, UnknownCLICommand
|
||||||
@@ -35,7 +35,7 @@ class PlatformioCLI(MultiCommand):
|
|||||||
|
|
||||||
|
|
||||||
@command(cls=PlatformioCLI)
|
@command(cls=PlatformioCLI)
|
||||||
@version_option(__version__, prog_name="platformio")
|
@version_option(__version__, prog_name="PlatformIO")
|
||||||
def cli():
|
def cli():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ def main():
|
|||||||
cli()
|
cli()
|
||||||
except Exception as e: # pylint: disable=W0703
|
except Exception as e: # pylint: disable=W0703
|
||||||
if isinstance(e, PlatformioException):
|
if isinstance(e, PlatformioException):
|
||||||
sys_exit(style("Error: ", fg="red") + str(e))
|
sys_exit("Error: " + str(e))
|
||||||
else:
|
else:
|
||||||
print format_exc()
|
print format_exc()
|
||||||
|
|
||||||
|
@@ -6,7 +6,8 @@ from os.path import isdir, join
|
|||||||
from SCons.Script import (DefaultEnvironment, Exit, SConscript,
|
from SCons.Script import (DefaultEnvironment, Exit, SConscript,
|
||||||
SConscriptChdir, Variables)
|
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()
|
# AllowSubstExceptions()
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ commonvars.AddVariables(
|
|||||||
("PLATFORM",),
|
("PLATFORM",),
|
||||||
("FRAMEWORK",),
|
("FRAMEWORK",),
|
||||||
("BUILD_FLAGS",),
|
("BUILD_FLAGS",),
|
||||||
|
("SRCBUILD_FLAGS",),
|
||||||
|
|
||||||
# board options
|
# board options
|
||||||
("BOARD",),
|
("BOARD",),
|
||||||
@@ -36,13 +38,14 @@ DefaultEnvironment(
|
|||||||
|
|
||||||
PIOBUILDER_DIR=join(get_source_dir(), "builder"),
|
PIOBUILDER_DIR=join(get_source_dir(), "builder"),
|
||||||
PROJECT_DIR=get_project_dir(),
|
PROJECT_DIR=get_project_dir(),
|
||||||
|
PIOENVS_DIR=get_pioenvs_dir(),
|
||||||
|
|
||||||
PLATFORMIOHOME_DIR=get_home_dir(),
|
PLATFORMIOHOME_DIR=get_home_dir(),
|
||||||
PLATFORM_DIR=join("$PLATFORMIOHOME_DIR", "$PLATFORM"),
|
PLATFORM_DIR=join("$PLATFORMIOHOME_DIR", "$PLATFORM"),
|
||||||
PLATFORMFW_DIR=join("$PLATFORM_DIR", "frameworks", "$FRAMEWORK"),
|
PLATFORMFW_DIR=join("$PLATFORM_DIR", "frameworks", "$FRAMEWORK"),
|
||||||
PLATFORMTOOLS_DIR=join("$PLATFORM_DIR", "tools"),
|
PLATFORMTOOLS_DIR=join("$PLATFORM_DIR", "tools"),
|
||||||
|
|
||||||
BUILD_DIR=join("$PROJECT_DIR", ".pioenvs", "$PIOENV"),
|
BUILD_DIR=join("$PIOENVS_DIR", "$PIOENV"),
|
||||||
LIBSOURCE_DIRS=[
|
LIBSOURCE_DIRS=[
|
||||||
join("$PROJECT_DIR", "lib"),
|
join("$PROJECT_DIR", "lib"),
|
||||||
join("$PLATFORMFW_DIR", "libraries"),
|
join("$PLATFORMFW_DIR", "libraries"),
|
||||||
|
@@ -8,8 +8,9 @@
|
|||||||
from os.path import join
|
from os.path import join
|
||||||
|
|
||||||
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
|
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
|
||||||
DefaultEnvironment, Exit, SConscript,
|
DefaultEnvironment, Exit)
|
||||||
SConscriptChdir)
|
|
||||||
|
from platformio.util import reset_serialport
|
||||||
|
|
||||||
env = DefaultEnvironment()
|
env = DefaultEnvironment()
|
||||||
|
|
||||||
@@ -66,9 +67,6 @@ env.Replace(
|
|||||||
UPLOADEEPCMD="$UPLOADER $UPLOADERFLAGS -U eeprom:w:$SOURCES:i"
|
UPLOADEEPCMD="$UPLOADER $UPLOADERFLAGS -U eeprom:w:$SOURCES:i"
|
||||||
)
|
)
|
||||||
|
|
||||||
if "BUILD_FLAGS" in env:
|
|
||||||
env.MergeFlags(env['BUILD_FLAGS'])
|
|
||||||
|
|
||||||
env.Append(
|
env.Append(
|
||||||
BUILDERS=dict(
|
BUILDERS=dict(
|
||||||
ElfToEep=Builder(
|
ElfToEep=Builder(
|
||||||
@@ -101,23 +99,7 @@ env.Append(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
env.PrependENVPath(
|
BUILT_LIBS = env.ProcessGeneral()
|
||||||
"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
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Target: Build executable and linkable firmware
|
# 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: 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: 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
|
# Target: Upload .eep file
|
||||||
#
|
#
|
||||||
|
|
||||||
eep = env.Alias("eep", target_eep, [
|
uploadeep = env.Alias("uploadeep", target_eep, [
|
||||||
lambda target, source, env: env.ResetDevice(), "$UPLOADEEPCMD"])
|
lambda target, source, env: reset_serialport(env.subst("$UPLOAD_PORT")),
|
||||||
AlwaysBuild(eep)
|
"$UPLOADEEPCMD"])
|
||||||
|
AlwaysBuild(uploadeep)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Target: Upload .hex file
|
# Check for $UPLOAD_PORT variable
|
||||||
#
|
#
|
||||||
|
|
||||||
upload = env.Alias("upload", target_hex, [
|
is_uptarget = (set(["upload", "uploadlazy", "uploadeep"]) &
|
||||||
lambda target, source, env: env.ResetDevice(), "$UPLOADHEXCMD"])
|
set(COMMAND_LINE_TARGETS))
|
||||||
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)
|
|
||||||
if is_uptarget and not env.subst("$UPLOAD_PORT"):
|
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)
|
||||||
|
@@ -7,11 +7,10 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
from platform import system
|
||||||
|
|
||||||
from SCons.Script import (AlwaysBuild, Builder, Default, DefaultEnvironment,
|
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
|
||||||
SConscript, SConscriptChdir)
|
DefaultEnvironment)
|
||||||
|
|
||||||
from platformio.util import get_system
|
|
||||||
|
|
||||||
env = DefaultEnvironment()
|
env = DefaultEnvironment()
|
||||||
|
|
||||||
@@ -54,15 +53,12 @@ env.Replace(
|
|||||||
|
|
||||||
UPLOADER=join("$PLATFORMTOOLS_DIR", "mspdebug", "mspdebug"),
|
UPLOADER=join("$PLATFORMTOOLS_DIR", "mspdebug", "mspdebug"),
|
||||||
UPLOADERFLAGS=[
|
UPLOADERFLAGS=[
|
||||||
"$UPLOAD_PROTOCOL" if get_system() != "windows32" else "tilib",
|
"$UPLOAD_PROTOCOL" if system() != "Windows" else "tilib",
|
||||||
"--force-reset"
|
"--force-reset"
|
||||||
],
|
],
|
||||||
UPLOADCMD='$UPLOADER $UPLOADERFLAGS "prog $SOURCES"'
|
UPLOADCMD='$UPLOADER $UPLOADERFLAGS "prog $SOURCES"'
|
||||||
)
|
)
|
||||||
|
|
||||||
if "BUILD_FLAGS" in env:
|
|
||||||
env.MergeFlags(env['BUILD_FLAGS'])
|
|
||||||
|
|
||||||
env.Append(
|
env.Append(
|
||||||
BUILDERS=dict(
|
BUILDERS=dict(
|
||||||
ElfToHex=Builder(
|
ElfToHex=Builder(
|
||||||
@@ -79,24 +75,7 @@ env.Append(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
env.PrependENVPath(
|
BUILT_LIBS = env.ProcessGeneral()
|
||||||
"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
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Target: Build executable and linkable firmware
|
# Target: Build executable and linkable firmware
|
||||||
@@ -108,17 +87,20 @@ target_elf = env.BuildFirmware(BUILT_LIBS + ["m"])
|
|||||||
# Target: Build the .hex
|
# 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
|
# Target: Upload firmware
|
||||||
#
|
#
|
||||||
|
|
||||||
upload = env.Alias("upload", target_hex, ["$UPLOADCMD"])
|
upload = env.Alias(["upload", "uploadlazy"], target_hex, "$UPLOADCMD")
|
||||||
AlwaysBuild(upload)
|
AlwaysBuild(upload)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Target: Define targets
|
# Target: Define targets
|
||||||
#
|
#
|
||||||
|
|
||||||
Default([target_elf, target_hex])
|
Default(target_hex)
|
||||||
|
@@ -8,8 +8,8 @@
|
|||||||
|
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
|
||||||
from SCons.Script import (AlwaysBuild, Builder, Default, DefaultEnvironment,
|
from SCons.Script import (AlwaysBuild, Builder, COMMAND_LINE_TARGETS, Default,
|
||||||
SConscript, SConscriptChdir)
|
DefaultEnvironment)
|
||||||
|
|
||||||
env = DefaultEnvironment()
|
env = DefaultEnvironment()
|
||||||
|
|
||||||
@@ -75,9 +75,6 @@ env.Replace(
|
|||||||
UPLOADCMD="$UPLOADER $SOURCES"
|
UPLOADCMD="$UPLOADER $SOURCES"
|
||||||
)
|
)
|
||||||
|
|
||||||
if "BUILD_FLAGS" in env:
|
|
||||||
env.MergeFlags(env['BUILD_FLAGS'])
|
|
||||||
|
|
||||||
env.Append(
|
env.Append(
|
||||||
BUILDERS=dict(
|
BUILDERS=dict(
|
||||||
ElfToBin=Builder(
|
ElfToBin=Builder(
|
||||||
@@ -87,28 +84,12 @@ env.Append(
|
|||||||
"binary",
|
"binary",
|
||||||
"$SOURCES",
|
"$SOURCES",
|
||||||
"$TARGET"]),
|
"$TARGET"]),
|
||||||
suffix=".hex"
|
suffix=".bin"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
env.PrependENVPath(
|
BUILT_LIBS = env.ProcessGeneral()
|
||||||
"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
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Target: Build executable and linkable firmware
|
# 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: 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
|
# Target: Upload firmware
|
||||||
#
|
#
|
||||||
|
|
||||||
upload = env.Alias("upload", target_bin, ["$UPLOADCMD"])
|
upload = env.Alias(["upload", "uploadlazy"], target_bin, "$UPLOADCMD")
|
||||||
AlwaysBuild(upload)
|
AlwaysBuild(upload)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Target: Define targets
|
# Target: Define targets
|
||||||
#
|
#
|
||||||
|
|
||||||
Default([target_elf, target_bin])
|
Default(target_bin)
|
||||||
|
@@ -2,11 +2,28 @@
|
|||||||
# See LICENSE for details.
|
# See LICENSE for details.
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from os import listdir, walk
|
from os import getenv, listdir, walk
|
||||||
from os.path import isdir, isfile, join
|
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):
|
def BuildLibrary(env, variant_dir, library_dir):
|
||||||
@@ -46,6 +63,8 @@ def BuildFirmware(env, libslist):
|
|||||||
if _libs:
|
if _libs:
|
||||||
libslist += _libs
|
libslist += _libs
|
||||||
|
|
||||||
|
src.MergeFlags(getenv("PIOSRCBUILD_FLAGS", "$SRCBUILD_FLAGS"))
|
||||||
|
|
||||||
return src.Program(
|
return src.Program(
|
||||||
join("$BUILD_DIR", "firmware"),
|
join("$BUILD_DIR", "firmware"),
|
||||||
[src.GlobCXXFiles(vdir) for vdir in vdirs],
|
[src.GlobCXXFiles(vdir) for vdir in vdirs],
|
||||||
@@ -116,23 +135,12 @@ def ParseBoardOptions(env, path, name):
|
|||||||
return data
|
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(_):
|
def exists(_):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def generate(env):
|
def generate(env):
|
||||||
|
env.AddMethod(ProcessGeneral)
|
||||||
env.AddMethod(BuildLibrary)
|
env.AddMethod(BuildLibrary)
|
||||||
env.AddMethod(BuildDependentLibraries)
|
env.AddMethod(BuildDependentLibraries)
|
||||||
env.AddMethod(BuildFirmware)
|
env.AddMethod(BuildFirmware)
|
||||||
@@ -140,5 +148,4 @@ def generate(env):
|
|||||||
env.AddMethod(GetDependentLibraries)
|
env.AddMethod(GetDependentLibraries)
|
||||||
env.AddMethod(VariantDirRecursive)
|
env.AddMethod(VariantDirRecursive)
|
||||||
env.AddMethod(ParseBoardOptions)
|
env.AddMethod(ParseBoardOptions)
|
||||||
env.AddMethod(ResetDevice)
|
|
||||||
return env
|
return env
|
||||||
|
@@ -11,18 +11,18 @@ from platformio.exception import ProjectInitialized
|
|||||||
from platformio.util import get_source_dir
|
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():
|
def cli():
|
||||||
|
|
||||||
if isfile("platformio.ini") and isdir("src"):
|
if isfile("platformio.ini") and isdir("src"):
|
||||||
raise ProjectInitialized()
|
raise ProjectInitialized()
|
||||||
for d in (".pioenvs", "lib", "src"):
|
for d in ("lib", "src"):
|
||||||
if not isdir(d):
|
if not isdir(d):
|
||||||
makedirs(d)
|
makedirs(d)
|
||||||
if not isfile("platformio.ini"):
|
if not isfile("platformio.ini"):
|
||||||
copyfile(join(get_source_dir(), "projectconftpl.ini"),
|
copyfile(join(get_source_dir(), "projectconftpl.ini"),
|
||||||
"platformio.ini")
|
"platformio.ini")
|
||||||
secho("Project successfully initialized.\n"
|
secho("Project has been initialized!\n"
|
||||||
"Please put your source code to `src` directory, "
|
"Please put your source code to `src` directory, "
|
||||||
"external libraries to `lib` and "
|
"external libraries to `lib` and "
|
||||||
"setup environments in `platformio.ini` file.\n"
|
"setup environments in `platformio.ini` file.\n"
|
||||||
|
@@ -3,19 +3,18 @@
|
|||||||
|
|
||||||
from click import argument, command, option, secho
|
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")
|
@command("install", short_help="Install new platforms")
|
||||||
@argument("platforms", nargs=-1)
|
@argument("platforms", nargs=-1)
|
||||||
@option('--with-package', multiple=True, metavar="<package>")
|
@option("--with-package", multiple=True, metavar="<package>")
|
||||||
@option('--without-package', multiple=True, metavar="<package>")
|
@option("--without-package", multiple=True, metavar="<package>")
|
||||||
def cli(platforms, with_package, without_package):
|
@option("--skip-default-package", is_flag=True)
|
||||||
|
def cli(platforms, with_package, without_package, skip_default_package):
|
||||||
|
|
||||||
for platform in platforms:
|
for platform in platforms:
|
||||||
|
|
||||||
p = PlatformFactory().newPlatform(platform)
|
p = PlatformFactory().newPlatform(platform)
|
||||||
|
if p.install(with_package, without_package, skip_default_package):
|
||||||
if p.install(with_package, without_package):
|
|
||||||
secho("The platform '%s' has been successfully installed!" %
|
secho("The platform '%s' has been successfully installed!" %
|
||||||
platform, fg="green")
|
platform, fg="green")
|
||||||
|
@@ -9,7 +9,7 @@ from platformio.pkgmanager import PackageManager
|
|||||||
@command("list", short_help="List installed platforms")
|
@command("list", short_help="List installed platforms")
|
||||||
def cli():
|
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(
|
echo("{name:<20} with packages: {pkgs}".format(
|
||||||
name=style(name, fg="cyan"),
|
name=style(name, fg="cyan"),
|
||||||
pkgs=", ".join(pkgs.keys())
|
pkgs=", ".join(pkgs.keys())
|
||||||
|
@@ -3,34 +3,46 @@
|
|||||||
|
|
||||||
from click import command, echo, option, secho, style
|
from click import command, echo, option, secho, style
|
||||||
|
|
||||||
from platformio.exception import ProjectEnvsNotAvaialable, UndefinedEnvPlatform
|
from platformio.exception import (InvalidEnvName, ProjectEnvsNotAvaialable,
|
||||||
from platformio.platforms._base import PlatformFactory
|
UndefinedEnvPlatform, UnknownEnvNames)
|
||||||
|
from platformio.platforms.base import PlatformFactory
|
||||||
from platformio.util import get_project_config
|
from platformio.util import get_project_config
|
||||||
|
|
||||||
|
|
||||||
@command("run", short_help="Process project environments")
|
@command("run", short_help="Process project environments")
|
||||||
@option("--environment", "-e", multiple=True, metavar="<environment>")
|
@option("--environment", "-e", multiple=True, metavar="<environment>")
|
||||||
@option("--target", "-t", multiple=True, metavar="<target>")
|
@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()
|
config = get_project_config()
|
||||||
|
|
||||||
if not config.sections():
|
if not config.sections():
|
||||||
raise ProjectEnvsNotAvaialable()
|
raise ProjectEnvsNotAvaialable()
|
||||||
|
|
||||||
|
unknown = set(environment) - set([s[4:] for s in config.sections()])
|
||||||
|
if unknown:
|
||||||
|
raise UnknownEnvNames(", ".join(unknown))
|
||||||
|
|
||||||
for section in config.sections():
|
for section in config.sections():
|
||||||
if section[:4] != "env:":
|
if section[:4] != "env:":
|
||||||
continue
|
raise InvalidEnvName(section)
|
||||||
|
|
||||||
envname = section[4:]
|
envname = section[4:]
|
||||||
if environment and envname not in environment:
|
if environment and envname not in environment:
|
||||||
echo("Skipped %s environment" % style(envname, fg="yellow"))
|
# echo("Skipped %s environment" % style(envname, fg="yellow"))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
echo("Processing %s environment:" % style(envname, fg="cyan"))
|
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 = ["PIOENV=" + envname]
|
||||||
variables.append("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 = []
|
envtargets = []
|
||||||
if target:
|
if target:
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
from click import argument, command, echo, style
|
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
|
from platformio.util import get_platforms
|
||||||
|
|
||||||
|
|
||||||
|
17
platformio/commands/serialports.py
Normal file
17
platformio/commands/serialports.py
Normal 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("")
|
@@ -7,7 +7,7 @@ from click import argument, command, echo, style
|
|||||||
|
|
||||||
from platformio.exception import PlatformNotInstalledYet
|
from platformio.exception import PlatformNotInstalledYet
|
||||||
from platformio.pkgmanager import PackageManager
|
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")
|
@command("show", short_help="Show details about an installed platforms")
|
||||||
@@ -22,8 +22,11 @@ def cli(platform):
|
|||||||
info=p.get_short_info()))
|
info=p.get_short_info()))
|
||||||
|
|
||||||
pm = PackageManager(platform)
|
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("----------")
|
||||||
echo("Package: %s" % style(name, fg="yellow"))
|
echo("Package: %s" % style(name, fg="yellow"))
|
||||||
|
if pkgalias:
|
||||||
|
echo("Alias: %s" % pkgalias)
|
||||||
echo("Location: %s" % join(pm.get_platform_dir(), data['path']))
|
echo("Location: %s" % join(pm.get_platform_dir(), data['path']))
|
||||||
echo("Version: %d" % int(data['version']))
|
echo("Version: %d" % int(data['version']))
|
||||||
|
@@ -5,10 +5,10 @@ from click import argument, command, secho
|
|||||||
|
|
||||||
from platformio.exception import PlatformNotInstalledYet
|
from platformio.exception import PlatformNotInstalledYet
|
||||||
from platformio.pkgmanager import PackageManager
|
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)
|
@argument("platforms", nargs=-1)
|
||||||
def cli(platforms):
|
def cli(platforms):
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
from click import command, echo, style
|
from click import command, echo, style
|
||||||
|
|
||||||
from platformio.pkgmanager import PackageManager
|
from platformio.pkgmanager import PackageManager
|
||||||
from platformio.platforms._base import PlatformFactory
|
from platformio.platforms.base import PlatformFactory
|
||||||
|
|
||||||
|
|
||||||
@command("update", short_help="Update installed platforms")
|
@command("update", short_help="Update installed platforms")
|
||||||
|
@@ -85,3 +85,18 @@ class ProjectInitialized(PlatformioException):
|
|||||||
class ProjectEnvsNotAvaialable(PlatformioException):
|
class ProjectEnvsNotAvaialable(PlatformioException):
|
||||||
|
|
||||||
MESSAGE = "Please setup environments in `platformio.ini` file."
|
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"
|
||||||
|
@@ -14,7 +14,7 @@ from platformio.downloader import FileDownloader
|
|||||||
from platformio.exception import (InvalidPackageVersion, NonSystemPackage,
|
from platformio.exception import (InvalidPackageVersion, NonSystemPackage,
|
||||||
UnknownPackage)
|
UnknownPackage)
|
||||||
from platformio.unpacker import FileUnpacker
|
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):
|
class PackageManager(object):
|
||||||
@@ -66,11 +66,11 @@ class PackageManager(object):
|
|||||||
raise UnknownPackage(name)
|
raise UnknownPackage(name)
|
||||||
|
|
||||||
# check system platform
|
# check system platform
|
||||||
system = get_system()
|
systype = get_systype()
|
||||||
builds = ([b for b in manifest[name] if b['system'] == "all" or system
|
builds = ([b for b in manifest[name] if b['system'] == "all" or systype
|
||||||
in b['system']])
|
in b['system']])
|
||||||
if not builds:
|
if not builds:
|
||||||
raise NonSystemPackage(name, system)
|
raise NonSystemPackage(name, systype)
|
||||||
|
|
||||||
if version:
|
if version:
|
||||||
for b in builds:
|
for b in builds:
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
|
||||||
from platformio.platforms._base import BasePlatform
|
from platformio.platforms.base import BasePlatform
|
||||||
|
|
||||||
|
|
||||||
class AtmelavrPlatform(BasePlatform):
|
class AtmelavrPlatform(BasePlatform):
|
||||||
@@ -16,12 +16,14 @@ class AtmelavrPlatform(BasePlatform):
|
|||||||
|
|
||||||
"toolchain-atmelavr": {
|
"toolchain-atmelavr": {
|
||||||
"path": join("tools", "toolchain"),
|
"path": join("tools", "toolchain"),
|
||||||
|
"alias": "toolchain",
|
||||||
"default": True
|
"default": True
|
||||||
},
|
},
|
||||||
|
|
||||||
"tool-avrdude": {
|
"tool-avrdude": {
|
||||||
"path": join("tools", "avrdude"),
|
"path": join("tools", "avrdude"),
|
||||||
"default": True,
|
"alias": "uploader",
|
||||||
|
"default": True
|
||||||
},
|
},
|
||||||
|
|
||||||
"framework-arduinoavr": {
|
"framework-arduinoavr": {
|
||||||
|
@@ -40,30 +40,49 @@ class BasePlatform(object):
|
|||||||
else:
|
else:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def install(self, with_packages, without_packages):
|
def get_pkg_alias(self, pkgname):
|
||||||
requirements = []
|
return self.PACKAGES[pkgname].get("alias", None)
|
||||||
pm = PackageManager(self.get_name())
|
|
||||||
|
|
||||||
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())
|
ppkgs = set(self.PACKAGES.keys())
|
||||||
if not upkgs.issubset(ppkgs):
|
if not upkgs.issubset(ppkgs):
|
||||||
raise UnknownPackage(", ".join(upkgs - 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:
|
if name in without_packages:
|
||||||
continue
|
continue
|
||||||
elif name in with_packages or opts["default"]:
|
elif (name in with_packages or (not skip_default_packages and
|
||||||
requirements.append((name, opts["path"]))
|
opts['default'])):
|
||||||
|
requirements.append((name, opts['path']))
|
||||||
|
|
||||||
|
pm = PackageManager(self.get_name())
|
||||||
for (package, path) in requirements:
|
for (package, path) in requirements:
|
||||||
pm.install(package, path)
|
pm.install(package, path)
|
||||||
return True
|
return len(requirements)
|
||||||
|
|
||||||
def uninstall(self):
|
def uninstall(self):
|
||||||
platform = self.get_name()
|
platform = self.get_name()
|
||||||
pm = PackageManager(platform)
|
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.uninstall(package, data['path'])
|
||||||
|
|
||||||
pm.unregister_platform(platform)
|
pm.unregister_platform(platform)
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
|
||||||
from platformio.platforms._base import BasePlatform
|
from platformio.platforms.base import BasePlatform
|
||||||
|
|
||||||
|
|
||||||
class Timsp430Platform(BasePlatform):
|
class Timsp430Platform(BasePlatform):
|
||||||
@@ -16,12 +16,14 @@ class Timsp430Platform(BasePlatform):
|
|||||||
|
|
||||||
"toolchain-timsp430": {
|
"toolchain-timsp430": {
|
||||||
"path": join("tools", "toolchain"),
|
"path": join("tools", "toolchain"),
|
||||||
|
"alias": "toolchain",
|
||||||
"default": True
|
"default": True
|
||||||
},
|
},
|
||||||
|
|
||||||
"tool-mspdebug": {
|
"tool-mspdebug": {
|
||||||
"path": join("tools", "mspdebug"),
|
"path": join("tools", "mspdebug"),
|
||||||
"default": True,
|
"alias": "uploader",
|
||||||
|
"default": True
|
||||||
},
|
},
|
||||||
|
|
||||||
"framework-energiamsp430": {
|
"framework-energiamsp430": {
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
|
||||||
from platformio.platforms._base import BasePlatform
|
from platformio.platforms.base import BasePlatform
|
||||||
|
|
||||||
|
|
||||||
class TitivaPlatform(BasePlatform):
|
class TitivaPlatform(BasePlatform):
|
||||||
@@ -16,12 +16,14 @@ class TitivaPlatform(BasePlatform):
|
|||||||
|
|
||||||
"toolchain-gccarmnoneeabi": {
|
"toolchain-gccarmnoneeabi": {
|
||||||
"path": join("tools", "toolchain"),
|
"path": join("tools", "toolchain"),
|
||||||
|
"alias": "toolchain",
|
||||||
"default": True
|
"default": True
|
||||||
},
|
},
|
||||||
|
|
||||||
"tool-lm4flash": {
|
"tool-lm4flash": {
|
||||||
"path": join("tools", "lm4flash"),
|
"path": join("tools", "lm4flash"),
|
||||||
"default": True,
|
"alias": "uploader",
|
||||||
|
"default": True
|
||||||
},
|
},
|
||||||
|
|
||||||
"framework-energiativa": {
|
"framework-energiativa": {
|
||||||
|
@@ -14,7 +14,8 @@
|
|||||||
# Environment with specific build flags
|
# Environment with specific build flags
|
||||||
#[env:specbuildflags]
|
#[env:specbuildflags]
|
||||||
#platform = %INSTALLED_PLATFORM_NAME_HERE%
|
#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
|
# Atmel AVR based board
|
||||||
|
@@ -1,12 +1,16 @@
|
|||||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||||
# See LICENSE for details.
|
# 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 os.path import dirname, expanduser, isfile, join, realpath
|
||||||
from platform import architecture, system
|
from platform import system, uname
|
||||||
from subprocess import PIPE, Popen
|
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:
|
try:
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
@@ -14,8 +18,11 @@ except ImportError:
|
|||||||
from ConfigParser import ConfigParser
|
from ConfigParser import ConfigParser
|
||||||
|
|
||||||
|
|
||||||
def get_system():
|
def get_systype():
|
||||||
return (system() + architecture()[0][:-3]).lower()
|
if system() == "Windows":
|
||||||
|
return "windows"
|
||||||
|
data = uname()
|
||||||
|
return ("%s_%s" % (data[0], data[4])).lower()
|
||||||
|
|
||||||
|
|
||||||
def get_home_dir():
|
def get_home_dir():
|
||||||
@@ -30,6 +37,10 @@ def get_project_dir():
|
|||||||
return getcwd()
|
return getcwd()
|
||||||
|
|
||||||
|
|
||||||
|
def get_pioenvs_dir():
|
||||||
|
return getenv("PIOENVS_DIR", join(get_project_dir(), ".pioenvs"))
|
||||||
|
|
||||||
|
|
||||||
def get_project_config():
|
def get_project_config():
|
||||||
path = join(get_project_dir(), "platformio.ini")
|
path = join(get_project_dir(), "platformio.ini")
|
||||||
if not isfile(path):
|
if not isfile(path):
|
||||||
@@ -53,7 +64,28 @@ def change_filemtime(path, time):
|
|||||||
|
|
||||||
|
|
||||||
def exec_command(args):
|
def exec_command(args):
|
||||||
use_shell = get_system() == "windows32"
|
use_shell = system() == "Windows"
|
||||||
p = Popen(args, stdout=PIPE, stderr=PIPE, shell=use_shell)
|
p = Popen(args, stdout=PIPE, stderr=PIPE, shell=use_shell)
|
||||||
out, err = p.communicate()
|
out, err = p.communicate()
|
||||||
return dict(out=out.strip(), err=err.strip())
|
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()]
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
click==2.1
|
click==2.5
|
||||||
colorama==0.3.1
|
colorama==0.3.1
|
||||||
pyserial==2.7
|
pyserial==2.7
|
||||||
requests==2.3.0
|
requests==2.3.0
|
||||||
|
Reference in New Issue
Block a user