Merge branch 'develop' into feature/platformio-30

* develop:
  Typo fix
  Version bump to 2.9.4
  Show "udev" warning only for the Linux OS while upload firmware
  Version bump to 2.9.3
  Notify Linux user to install PlatformIO udev rules
  Add new article
  Add support for Arduboy
  Remove unused imports
  Refactor firmware uploading to the embedded boards with SAM-BA bootloader
  Fix firmware uploading to the embedded boards with SAM-BA bootloader
  Add explanation about waiting for the new serial port
  Hook when new serial port is the same in boot mode
  Revert back some code linked with uploading to Leonardo/Due

# Conflicts:
#	platformio/__init__.py
#	platformio/boards/misc.json
#	platformio/builder/scripts/atmelavr.py
#	platformio/builder/scripts/atmelsam.py
#	platformio/builder/tools/pioupload.py
This commit is contained in:
Ivan Kravets
2016-06-06 14:33:09 +03:00
9 changed files with 113 additions and 43 deletions

View File

@ -15,6 +15,19 @@ PlatformIO 3.0
PlatformIO 2.0 PlatformIO 2.0
-------------- --------------
2.9.4 (2016-06-04)
~~~~~~~~~~~~~~~~~~
* Show ``udev`` warning only for the Linux OS while uploading firmware
2.9.3 (2016-06-03)
~~~~~~~~~~~~~~~~~~
* Added support for `Arduboy <https://www.arduboy.com>`__, the game system
the size of a credit card
* Updated `99-platformio-udev.rules <https://github.com/platformio/platformio/blob/develop/scripts/99-platformio-udev.rules>`__ for Linux OS
* Refactored firmware uploading to the embedded boards with SAM-BA bootloader
2.9.2 (2016-06-02) 2.9.2 (2016-06-02)
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~

View File

@ -23,6 +23,7 @@ Here are recent articles about PlatformIO:
2016 2016
^^^^ ^^^^
* Jun 3, 2016 - **Daniel Eichhorn** - `ESP8266: Continuous Delivery Pipeline Push To Production <http://blog.squix.org/2016/06/esp8266-continuous-delivery-pipeline-push-to-production.html>`_
* May 30, 2016 - **Ron Moerman** - `IoT Development with PlatformIO <https://electronicsworkbench.io/blog/platformio>`_ * May 30, 2016 - **Ron Moerman** - `IoT Development with PlatformIO <https://electronicsworkbench.io/blog/platformio>`_
* May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! <http://www.instructables.com/id/Reverse-Engineer-RF-Remote-Controller-for-IoT/?ALLSTEPS>`_ * May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! <http://www.instructables.com/id/Reverse-Engineer-RF-Remote-Controller-for-IoT/?ALLSTEPS>`_
* May 26, 2016 - **Charlie Key** - `7 Best Developer Tools To Build Your NEXT Internet of Things Application <https://www.losant.com/blog/7-best-developer-tools-to-build-your-next-internet-of-things-application>`_ * May 26, 2016 - **Charlie Key** - `7 Best Developer Tools To Build Your NEXT Internet of Things Application <https://www.losant.com/blog/7-best-developer-tools-to-build-your-next-internet-of-things-application>`_

View File

@ -176,6 +176,26 @@ Adafruit
- 8 Kb - 8 Kb
- 0.5 Kb - 0.5 Kb
Arduboy
~~~~~~~
.. list-table::
:header-rows: 1
* - Type ``board``
- Name
- Microcontroller
- Frequency
- Flash
- RAM
* - ``arduboy``
- `Arduboy <https://www.arduboy.com>`_
- ATMEGA32U4
- 16 MHz
- 32 Kb
- 2.5 Kb
Arduino Arduino
~~~~~~~ ~~~~~~~

View File

@ -166,6 +166,26 @@ Adafruit
- 8 Kb - 8 Kb
- 0.5 Kb - 0.5 Kb
Arduboy
~~~~~~~
.. list-table::
:header-rows: 1
* - Type ``board``
- Name
- Microcontroller
- Frequency
- Flash
- RAM
* - ``arduboy``
- `Arduboy <https://www.arduboy.com>`_
- ATMEGA32U4
- 16 MHz
- 32 Kb
- 2.5 Kb
Arduino Arduino
~~~~~~~ ~~~~~~~

View File

@ -162,6 +162,26 @@ Adafruit
- 8 Kb - 8 Kb
- 0.5 Kb - 0.5 Kb
Arduboy
~~~~~~~
.. list-table::
:header-rows: 1
* - Type ``board``
- Name
- Microcontroller
- Frequency
- Flash
- RAM
* - ``arduboy``
- `Arduboy <https://www.arduboy.com>`_
- ATMEGA32U4
- 16 MHz
- 32 Kb
- 2.5 Kb
Arduino Arduino
~~~~~~~ ~~~~~~~

View File

@ -240,6 +240,7 @@ Using Arduino Framework with Staging version
Articles Articles
-------- --------
* Jun 3, 2016 - **Daniel Eichhorn** - `ESP8266: Continuous Delivery Pipeline Push To Production <http://blog.squix.org/2016/06/esp8266-continuous-delivery-pipeline-push-to-production.html>`_
* May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! <http://www.instructables.com/id/Reverse-Engineer-RF-Remote-Controller-for-IoT/?ALLSTEPS>`_ * May 29, 2016 - **Chris Synan** - `Reverse Engineer RF Remote Controller for IoT! <http://www.instructables.com/id/Reverse-Engineer-RF-Remote-Controller-for-IoT/?ALLSTEPS>`_
* May 22, 2016 - **Pedro Minatel** - `Estação meteorológica com ESP8266 (Weather station with ESP8266, Portuguese) <http://pedrominatel.com.br/esp8266/estacao-meteorologica-com-esp8266/>`_ * May 22, 2016 - **Pedro Minatel** - `Estação meteorológica com ESP8266 (Weather station with ESP8266, Portuguese) <http://pedrominatel.com.br/esp8266/estacao-meteorologica-com-esp8266/>`_
* May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (WiFi remote control using ESP8266, Portuguese) <http://pedrominatel.com.br/esp8266/controle-remoto-wifi-com-esp8266/>`_ * May 16, 2016 - **Pedro Minatel** - `Controle remoto WiFi com ESP8266 (WiFi remote control using ESP8266, Portuguese) <http://pedrominatel.com.br/esp8266/controle-remoto-wifi-com-esp8266/>`_

View File

@ -15,6 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
from os.path import isfile, join from os.path import isfile, join
from platform import system
from shutil import copyfile from shutil import copyfile
from time import sleep from time import sleep
@ -47,22 +48,27 @@ def TouchSerialPort(env, port, baudrate):
sleep(0.4) sleep(0.4)
def WaitForNewSerialPort(env): def WaitForNewSerialPort(env, before):
before = [i['port'] for i in get_serialports(use_grep=True)] print "Waiting for the new upload port..."
sleep(0.5) prev_port = env.subst("$UPLOAD_PORT")
new_port = None new_port = None
elapsed = 0 elapsed = 0
while elapsed < 10: while elapsed < 5 and new_port is None:
now = [i['port'] for i in get_serialports(use_grep=True)] now = get_serialports()
diff = list(set(now) - set(before)) for p in now:
if diff: if p not in before:
new_port = diff[0] new_port = p['port']
break break
before = now before = now
sleep(0.25) sleep(0.25)
elapsed += 0.25 elapsed += 0.25
if not new_port:
for p in now:
if prev_port == p['port']:
new_port = p['port']
break
if not new_port: if not new_port:
env.Exit("Error: Couldn't find a board on the selected port. " env.Exit("Error: Couldn't find a board on the selected port. "
"Check that you have the correct port selected. " "Check that you have the correct port selected. "
@ -85,6 +91,15 @@ def AutodetectUploadPort(env):
env.Replace(UPLOAD_PORT=item['disk']) env.Replace(UPLOAD_PORT=item['disk'])
break break
else: else:
if (system() == "Linux" and
not isfile("/etc/udev/99-platformio-udev.rules")):
print (
"\nWarning! Please install `99-platformio-udev.rules` and "
"check that your board's PID and VID are listed in the rules."
"\n https://raw.githubusercontent.com/platformio/platformio"
"/develop/scripts/99-platformio-udev.rules\n"
)
board_hwids = [] board_hwids = []
if "BOARD" in env and "build.hwids" in env.BoardConfig(): if "BOARD" in env and "build.hwids" in env.BoardConfig():
board_hwids = env.BoardConfig().get("build.hwids") board_hwids = env.BoardConfig().get("build.hwids")

View File

@ -287,34 +287,7 @@ def exec_command(*args, **kwargs):
return result return result
def get_serialports(use_grep=False): def get_serialports():
def _grep_serial_ports():
result = []
if system() == "Windows":
output = exec_command(["mode"]).get("out", "")
for line in output.split("\n"):
line = line.strip()
if "COM" in line:
result.append({"port": line[line.index("COM"):-1],
"description": "", "hwid": ""})
else:
if system() == "Linux":
patterns = ["/dev/%s*" % p for p in (
"ttyS", "ttyUSB", "ttyACM", "ttyAMA", "rfcomm", "ttyO")]
else:
patterns = ["/dev/tty.*", "/dev/cu.*"]
for pattern in patterns:
for port in glob(pattern):
result.append(
{"port": port, "description": "", "hwid": ""})
return result
if use_grep:
result = _grep_serial_ports()
if result:
return result
try: try:
from serial.tools.list_ports import comports from serial.tools.list_ports import comports
except ImportError: except ImportError:
@ -332,9 +305,9 @@ def get_serialports(use_grep=False):
result.append({"port": p, "description": d, "hwid": h}) result.append({"port": p, "description": d, "hwid": h})
# fix for PySerial # fix for PySerial
if not result and not use_grep: if not result and system() == "Darwin":
result = _grep_serial_ports() for p in glob("/dev/tty.*"):
result.append({"port": p, "description": "n/a", "hwid": "n/a"})
return result return result

View File

@ -45,8 +45,15 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="066
# QinHeng Electronics HL-340 USB-Serial adapter # QinHeng Electronics HL-340 USB-Serial adapter
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666"
# ARDUINO UNO # Arduino boards
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", MODE:="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="[08][02]*", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="[08][02]*", MODE:="0666"
# Arduino SAM-BA
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{MTP_NO_PROBE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666"
# Digistump boards # Digistump boards
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"