Compare commits

..

1 commit

Author SHA1 Message Date
Phillip Burgess
5d3232280f Add matrixportal (w/tinyusb stack) to build platforms 2020-10-06 10:12:15 -07:00
7 changed files with 103 additions and 272 deletions

View file

@ -16,5 +16,5 @@ jobs:
run: bash ./actions_install.sh run: bash ./actions_install.sh
- name: test platforms - name: test platforms
run: | run: |
python3 build_platform.py uno leonardo mega2560 zero esp8266 esp32 pico_rp2040 python3 build_platform.py uno leonardo mega2560 zero esp8266 esp32

View file

@ -1,15 +1,19 @@
language: python language: c
sudo: false
dist: focal
cache: cache:
directories: directories:
- ~/arduino_ide - ~/arduino_ide
- ~/.arduino15/packages/
git: git:
depth: false depth: false
quiet: true quiet: true
addons:
apt:
packages:
- python3
- python3-pip
before_install: before_install:
- source $TRAVIS_BUILD_DIR/install.sh - source $TRAVIS_BUILD_DIR/install.sh

View file

@ -1,9 +1,9 @@
# Travis CI Arduino Init Script [![Build Status](https://travis-ci.com/adafruit/travis-ci-arduino.svg?branch=master)](https://travis-ci.com/adafruit/travis-ci-arduino) # Travis CI Arduino Init Script [![Build Status](https://travis-ci.com/adafruit/travis-ci-arduino.svg?branch=master)](https://travis-ci.com/adafruit/travis-ci-arduino)
The purpose of this repo is to create a centrally managed dependency The purpose of this repo is to create a centrally managed dependency
install script for all Adafruit Arduino Library Travis CI and Github Actions configs. install script for all Adafruit Arduino Library Travis CI configs.
This will allow us to easily update the install steps without This will allow us to easily update the install steps without
having to manually or programmatically update 100+ `.travis.yml` files. having to manually or programatically update 100+ `.travis.yml` files.
We have a guide that you can use to follow along to install both TravisCI and Doxygen generation here https://learn.adafruit.com/the-well-automated-arduino-library/ We have a guide that you can use to follow along to install both TravisCI and Doxygen generation here https://learn.adafruit.com/the-well-automated-arduino-library/
@ -17,7 +17,7 @@ source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/
``` ```
If you only want to install and build on certain platforms, you can set the If you only want to install and build on certain platforms, you can set the
`INSTALL_PLATFORMS` environment variable to a comma-separated list of platforms. `INSTALL_PLATFORMS` envionrment variable to a comma-seperated list of platforms.
**Example `.travis.yml`:** **Example `.travis.yml`:**
```yaml ```yaml
@ -181,7 +181,7 @@ deploy:
``` ```
6. Still in the top-level directory of the library you'll be testing, copy the current library to Adafruit_Test_Library 6. Still in the top-level directory of the library you'll be testing, copy the current library to Adafruit_Test_Library
```bash ```bash
adafruit@adafruit:~/Adafruit_BMP183_Library$ cp * ~/Arduino/libraries/Adafruit_Test_Library/ adafruit@adafruit:~/Adafruit_BMP183_Library$ cp * ~/Arduino/libraryes/Adafruit_Test_Library/
``` ```
7. Grep for build_platform.py in githubci.yml to find out what boards to test. 7. Grep for build_platform.py in githubci.yml to find out what boards to test.
```bash ```bash

View file

@ -4,7 +4,7 @@ set -e
pip3 install clint pyserial setuptools adafruit-nrfutil pip3 install clint pyserial setuptools adafruit-nrfutil
sudo apt-get update sudo apt-get update
sudo apt-get install -y libllvm8 -V sudo apt-get install -y --allow-downgrades libllvm8=1:8-3~ubuntu18.04.2 -V
sudo apt install -fy cppcheck clang-format-8 sudo apt install -fy cppcheck clang-format-8
if [ ! -f /usr/bin/clang-format ]; then if [ ! -f /usr/bin/clang-format ]; then
sudo ln -s /usr/bin/clang-format-8 /usr/bin/clang-format sudo ln -s /usr/bin/clang-format-8 /usr/bin/clang-format
@ -18,6 +18,6 @@ mkdir ${HOME}/Arduino/libraries
# install arduino IDE # install arduino IDE
export PATH=$PATH:$GITHUB_WORKSPACE/bin export PATH=$PATH:$GITHUB_WORKSPACE/bin
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh -s 0.11.0 2>&1
arduino-cli config init > /dev/null arduino-cli config init > /dev/null
arduino-cli core update-index > /dev/null arduino-cli core update-index > /dev/null

View file

@ -2,36 +2,20 @@ import sys
import glob import glob
import time import time
import os import os
import shutil
from distutils.dir_util import copy_tree
import subprocess import subprocess
import collections import collections
# optional wall option cause build failed if has warnings
BUILD_WALL = False
BUILD_WARN = True
if "--wall" in sys.argv:
BUILD_WALL = True
sys.argv.remove("--wall")
if "--no_warn" in sys.argv:
BUILD_WARN = False
sys.argv.remove("--no_warn")
# add user bin to path! # add user bin to path!
BUILD_DIR = '' BUILD_DIR = ''
# add user bin to path! # add user bin to path!
try: try:
# If we're on actions BUILD_DIR = os.environ["TRAVIS_BUILD_DIR"]
except KeyError:
pass # ok maybe we're on actions?
try:
BUILD_DIR = os.environ["GITHUB_WORKSPACE"] BUILD_DIR = os.environ["GITHUB_WORKSPACE"]
except KeyError: except KeyError:
try: pass # ok maybe we're on travis?
# If we're on travis
BUILD_DIR = os.environ["TRAVIS_BUILD_DIR"]
except KeyError:
# If we're running on local machine
BUILD_DIR = os.path.abspath(".")
pass
os.environ["PATH"] += os.pathsep + BUILD_DIR + "/bin" os.environ["PATH"] += os.pathsep + BUILD_DIR + "/bin"
print("build dir:", BUILD_DIR) print("build dir:", BUILD_DIR)
@ -40,11 +24,6 @@ IS_LEARNING_SYS = False
if "Adafruit_Learning_System_Guides" in BUILD_DIR: if "Adafruit_Learning_System_Guides" in BUILD_DIR:
print("Found learning system repo") print("Found learning system repo")
IS_LEARNING_SYS = True IS_LEARNING_SYS = True
os.remove(BUILD_DIR + "/ci/examples/Blink/Blink.ino")
os.rmdir(BUILD_DIR + "/ci/examples/Blink")
elif "METROX-Examples-and-Project-Sketches" in BUILD_DIR:
print("Found MetroX Examples Repo")
IS_LEARNING_SYS = True
#os.system('pwd') #os.system('pwd')
#os.system('ls -lA') #os.system('ls -lA')
@ -54,106 +33,60 @@ CHECK = u'\N{check mark}'
ALL_PLATFORMS={ ALL_PLATFORMS={
# classic Arduino AVR # classic Arduino AVR
"uno" : ["arduino:avr:uno", None], "uno" : "arduino:avr:uno",
"leonardo" : ["arduino:avr:leonardo", None], "leonardo" : "arduino:avr:leonardo",
"mega2560" : ["arduino:avr:mega:cpu=atmega2560", None], "mega2560" : "arduino:avr:mega:cpu=atmega2560",
# Arduino SAMD # Arduino SAMD
"zero" : ["arduino:samd:arduino_zero_native", "0x68ed2b88"], "zero" : "arduino:samd:arduino_zero_native",
"cpx" : ["arduino:samd:adafruit_circuitplayground_m0", "0x68ed2b88"], "cpx" : "arduino:samd:adafruit_circuitplayground_m0",
# Espressif # Espressif
"esp8266" : ["esp8266:esp8266:huzzah:eesz=4M3M,xtal=80", None], "esp8266" : "esp8266:esp8266:huzzah:eesz=4M3M,xtal=80",
"esp32" : ["esp32:esp32:featheresp32:FlashFreq=80", None], "esp32" : "esp32:esp32:featheresp32:FlashFreq=80",
"magtag" : ["esp32:esp32:adafruit_magtag29_esp32s2", "0xbfdd4eee"],
"funhouse" : ["esp32:esp32:adafruit_funhouse_esp32s2", "0xbfdd4eee"],
"metroesp32s2" : ["esp32:esp32:adafruit_metro_esp32s2", "0xbfdd4eee"],
"qtpy_esp32s2" : ["esp32:esp32:adafruit_qtpy_esp32s2", "0xbfdd4eee"],
"feather_esp32s2" : ["esp32:esp32:adafruit_feather_esp32s2", "0xbfdd4eee"],
"feather_esp32s2_tft" : ["esp32:esp32:adafruit_feather_esp32s2_tft", "0xbfdd4eee"],
# Adafruit AVR # Adafruit AVR
"trinket_3v" : ["adafruit:avr:trinket3", None], "trinket_3v" : "adafruit:avr:trinket3",
"trinket_5v" : ["adafruit:avr:trinket5", None], "trinket_5v" : "adafruit:avr:trinket5",
"protrinket_3v" : ["adafruit:avr:protrinket3", None], "protrinket_3v" : "adafruit:avr:protrinket3",
"protrinket_5v" : ["adafruit:avr:protrinket5", None], "protrinket_5v" : "adafruit:avr:protrinket5",
"gemma" : ["adafruit:avr:gemma", None], "gemma" : "adafruit:avr:gemma",
"flora" : ["adafruit:avr:flora8", None], "flora" : "adafruit:avr:flora8",
"feather32u4" : ["adafruit:avr:feather32u4", None], "feather32u4" : "adafruit:avr:feather32u4",
"cpc" : ["arduino:avr:circuitplay32u4cat", None], "cpc" : "arduino:avr:circuitplay32u4cat",
# Adafruit SAMD # Adafruit SAMD
"gemma_m0" : ["adafruit:samd:adafruit_gemma_m0", "0x68ed2b88"], "gemma_m0" : "adafruit:samd:adafruit_gemma_m0",
"trinket_m0" : ["adafruit:samd:adafruit_trinket_m0", "0x68ed2b88"], "trinket_m0" : "adafruit:samd:adafruit_trinket_m0",
"feather_m0_express" : ["adafruit:samd:adafruit_feather_m0_express", "0x68ed2b88"], "feather_m0_express" : "adafruit:samd:adafruit_feather_m0_express",
"feather_m4_express" : ["adafruit:samd:adafruit_feather_m4:speed=120", "0x68ed2b88"], "metro_m0" : "adafruit:samd:adafruit_metro_m0",
"feather_m4_express_tinyusb" : ["adafruit:samd:adafruit_feather_m4:speed=120,usbstack=tinyusb", "0x68ed2b88"], "metro_m0_tinyusb" : "adafruit:samd:adafruit_metro_m0:usbstack=tinyusb",
"feather_m4_can" : ["adafruit:samd:adafruit_feather_m4_can:speed=120", "0x68ed2b88"], "metro_m4" : "adafruit:samd:adafruit_metro_m4:speed=120",
"feather_m4_can_tinyusb" : ["adafruit:samd:adafruit_feather_m4_can:speed=120,usbstack=tinyusb", "0x68ed2b88"], "metro_m4_tinyusb" : "adafruit:samd:adafruit_metro_m4:speed=120,usbstack=tinyusb",
"metro_m0" : ["adafruit:samd:adafruit_metro_m0", "0x68ed2b88"], "metro_m4_airliftlite" : "adafruit:samd:adafruit_metro_m4_airliftlite:speed=120",
"metro_m0_tinyusb" : ["adafruit:samd:adafruit_metro_m0:usbstack=tinyusb", "0x68ed2b88"], "pybadge" : "adafruit:samd:adafruit_pybadge_m4:speed=120",
"metro_m4" : ["adafruit:samd:adafruit_metro_m4:speed=120", "0x55114460"], "pybadge_tinyusb" : "adafruit:samd:adafruit_pybadge_m4:speed=120,usbstack=tinyusb",
"metro_m4_tinyusb" : ["adafruit:samd:adafruit_metro_m4:speed=120,usbstack=tinyusb", "0x55114460"], "pygamer" : "adafruit:samd:adafruit_pygamer_m4:speed=120",
"metro_m4_airliftlite" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120", "0x55114460"], "hallowing_m0" : "adafruit:samd:adafruit_hallowing",
"metro_m4_airliftlite_tinyusb" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120,usbstack=tinyusb", "0x55114460"], "hallowing_m4" : "adafruit:samd:adafruit_hallowing_m4:speed=120,usbstack=tinyusb",
"pybadge" : ["adafruit:samd:adafruit_pybadge_m4:speed=120", "0x55114460"], "neotrellis_m4" : "adafruit:samd:adafruit_trellis_m4:speed=120",
"pybadge_tinyusb" : ["adafruit:samd:adafruit_pybadge_m4:speed=120,usbstack=tinyusb", "0x55114460"], "monster_m4sk" : "adafruit:samd:adafruit_monster_m4sk:speed=120,usbstack=tinyusb",
"pygamer" : ["adafruit:samd:adafruit_pygamer_m4:speed=120", "0x55114460"], "pyportal" : "adafruit:samd:adafruit_pyportal_m4:speed=120,usbstack=tinyusb",
"pygamer_tinyusb" : ["adafruit:samd:adafruit_pygamer_m4:speed=120,usbstack=tinyusb", "0x55114460"], "pyportal_titano" : "adafruit:samd:adafruit_pyportal_m4_titano:speed=120,usbstack=tinyusb",
"hallowing_m0" : ["adafruit:samd:adafruit_hallowing", "0x68ed2b88"], "cpx_ada" : "adafruit:samd:adafruit_circuitplayground_m0",
"hallowing_m4" : ["adafruit:samd:adafruit_hallowing_m4:speed=120", "0x55114460"], "grand_central" : "adafruit:samd:adafruit_grandcentral_m4:speed=120,usbstack=tinyusb",
"hallowing_m4_tinyusb" : ["adafruit:samd:adafruit_hallowing_m4:speed=120,usbstack=tinyusb", "0x55114460"], "matrixportal" : "adafruit:samd:adafruit_matrixportal_m4:speed=120,usbstack=tinyusb",
"neotrellis_m4" : ["adafruit:samd:adafruit_trellis_m4:speed=120", "0x55114460"],
"monster_m4sk" : ["adafruit:samd:adafruit_monster_m4sk:speed=120", "0x55114460"],
"monster_m4sk_tinyusb" : ["adafruit:samd:adafruit_monster_m4sk:speed=120,usbstack=tinyusb", "0x55114460"],
"pyportal" : ["adafruit:samd:adafruit_pyportal_m4:speed=120", "0x55114460"],
"pyportal_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4:speed=120,usbstack=tinyusb", "0x55114460"],
"pyportal_titano" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120", "0x55114460"],
"pyportal_titano_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120,usbstack=tinyusb", "0x55114460"],
"cpx_ada" : ["adafruit:samd:adafruit_circuitplayground_m0", "0x68ed2b88"],
"grand_central" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120", "0x55114460"],
"grand_central_tinyusb" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120,usbstack=tinyusb", "0x55114460"],
"matrixportal" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120", "0x55114460"],
"matrixportal_tinyusb" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120,usbstack=tinyusb", "0x55114460"],
"neotrinkey_m0" : ["adafruit:samd:adafruit_neotrinkey_m0", "0x68ed2b88"],
"rotarytrinkey_m0" : ["adafruit:samd:adafruit_rotarytrinkey_m0", "0x68ed2b88"],
"neokeytrinkey_m0" : ["adafruit:samd:adafruit_neokeytrinkey_m0", "0x68ed2b88"],
"slidetrinkey_m0" : ["adafruit:samd:adafruit_slidetrinkey_m0", "0x68ed2b88"],
"proxlighttrinkey_m0" : ["adafruit:samd:adafruit_proxlighttrinkey_m0", "0x68ed2b88"],
"qtpy_m0" : ["adafruit:samd:adafruit_qtpy_m0", "0x68ed2b88"],
"qtpy_m0_tinyusb" : ["adafruit:samd:adafruit_qtpy_m0:usbstack=tinyusb", "0x68ed2b88"],
# Arduino nRF # Arduino nRF
"microbit" : ["sandeepmistry:nRF5:BBCmicrobit:softdevice=s110", None], "microbit" : "sandeepmistry:nRF5:BBCmicrobit:softdevice=s130",
# Adafruit nRF # Adafruit nRF
"nrf52832" : ["adafruit:nrf52:feather52832:softdevice=s132v6,debug=l0", None], "nrf52832" : "adafruit:nrf52:feather52832:softdevice=s132v6,debug=l0",
"nrf52840" : ["adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0", "0xada52840"], "nrf52840" : "adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0",
"cpb" : ["adafruit:nrf52:cplaynrf52840:softdevice=s140v6,debug=l0", "0xada52840"], "cpb" : "adafruit:nrf52:cplaynrf52840:softdevice=s140v6,debug=l0",
"clue" : ["adafruit:nrf52:cluenrf52840:softdevice=s140v6,debug=l0", "0xada52840"], "clue" : "adafruit:nrf52:cluenrf52840:softdevice=s140v6,debug=l0",
"ledglasses_nrf52840" : ["adafruit:nrf52:ledglasses_nrf52840:softdevice=s140v6,debug=l0", "0xada52840"],
# RP2040 (Philhower)
"pico_rp2040" : ["rp2040:rp2040:rpipico:freq=125,flash=2097152_0", "0xe48bff56"],
"pico_rp2040_tinyusb" : ["rp2040:rp2040:rpipico:flash=2097152_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56"],
"feather_rp2040" : ["rp2040:rp2040:adafruit_feather:freq=125,flash=8388608_0", "0xe48bff56"],
"feather_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_feather:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56"],
"qt2040_trinkey" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:freq=125,flash=8388608_0", "0xe48bff56"],
"qt2040_trinkey_tinyusb" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56"],
# Attiny8xy, 16xy, 32xy (SpenceKonde)
"attiny3217" : ["megaTinyCore:megaavr:atxy7:chip=3217", None],
"attiny3216" : ["megaTinyCore:megaavr:atxy6:chip=3216", None],
"attiny1617" : ["megaTinyCore:megaavr:atxy7:chip=1617", None],
"attiny1616" : ["megaTinyCore:megaavr:atxy6:chip=1616", None],
"attiny1607" : ["megaTinyCore:megaavr:atxy7:chip=1607", None],
"attiny1606" : ["megaTinyCore:megaavr:atxy6:chip=1606", None],
"attiny817" : ["megaTinyCore:megaavr:atxy7:chip=817", None],
"attiny816" : ["megaTinyCore:megaavr:atxy6:chip=816", None],
"attiny807" : ["megaTinyCore:megaavr:atxy7:chip=807", None],
"attiny806" : ["megaTinyCore:megaavr:atxy6:chip=806", None],
# groupings # groupings
"main_platforms" : ("uno", "leonardo", "mega2560", "zero", "qtpy_m0", "main_platforms" : ("uno", "leonardo", "mega2560", "zero",
"esp8266", "esp32", "metro_m4", "trinket_m0"), "esp8266", "esp32", "metro_m4", "nrf52840"),
"arcada_platforms" : ("pybadge", "pygamer", "hallowing_m4", "arcada_platforms" : ("pybadge", "pygamer", "hallowing_m4",
"cpb", "cpx_ada"), "cpb", "cpx_ada")
"wippersnapper_platforms" : ("metro_m4_airliftlite_tinyusb", "pyportal_tinyusb"),
"rp2040_platforms" : ("pico_rp2040", "feather_rp2040")
} }
BSP_URLS = "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json,https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json,https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json,http://drazzy.com/package_drazzy.com_index.json" BSP_URLS = "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://dl.espressif.com/dl/package_esp32_index.json,https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json"
class ColorPrint: class ColorPrint:
@ -186,20 +119,12 @@ def install_platform(platform):
ColorPrint.print_fail("FAILED to install "+platform) ColorPrint.print_fail("FAILED to install "+platform)
exit(-1) exit(-1)
ColorPrint.print_pass(CHECK) ColorPrint.print_pass(CHECK)
# print installed core version
print(os.popen('arduino-cli core list | grep {}'.format(platform)).read(), end='')
def run_or_die(cmd, error): def run_or_die(cmd, error):
print(cmd) print(cmd)
attempt = 0 if os.system(cmd) != 0:
while attempt < 3: ColorPrint.print_fail(error)
if os.system(cmd) == 0: exit(-1)
return
attempt += 1
print('attempt {} failed, {} retry left'.format(attempt, 3-attempt))
time.sleep(5)
ColorPrint.print_fail(error)
exit(-1)
################################ Install Arduino IDE ################################ Install Arduino IDE
print() print()
@ -208,10 +133,17 @@ print("INSTALLING ARDUINO BOARDS")
ColorPrint.print_info('#'*40) ColorPrint.print_info('#'*40)
run_or_die("arduino-cli core update-index --additional-urls "+BSP_URLS+ run_or_die("arduino-cli core update-index --additional-urls "+BSP_URLS+
" > /dev/null", "FAILED to update core indices") " > /dev/null", "FAILED to update core indecies")
print() print()
################################ Install dependencies # link test library folder to the arduino libraries folder
if not IS_LEARNING_SYS:
try:
os.symlink(BUILD_DIR, os.environ['HOME']+'/Arduino/libraries/Adafruit_Test_Library')
except FileExistsError:
pass
################################ Install dependancies
our_name=None our_name=None
try: try:
if IS_LEARNING_SYS: if IS_LEARNING_SYS:
@ -227,74 +159,18 @@ try:
dep = dep.strip() dep = dep.strip()
print("Installing "+dep) print("Installing "+dep)
run_or_die('arduino-cli lib install "'+dep+'" > /dev/null', run_or_die('arduino-cli lib install "'+dep+'" > /dev/null',
"FAILED to install dependency "+dep) "FAILED to install dependancy "+dep)
except OSError: except OSError:
print("No library dep or properties found!") print("No library dep or properties found!")
pass # no library properties pass # no library properties
# Delete the existing library if we somehow downloaded # Delete the existing library if we somehow downloaded
# due to dependencies # due to dependancies
if our_name: if our_name:
run_or_die("arduino-cli lib uninstall \""+our_name+"\"", "Could not uninstall") run_or_die("arduino-cli lib uninstall \""+our_name+"\"", "Could not uninstall")
print("Libraries installed: ", glob.glob(os.environ['HOME']+'/Arduino/libraries/*')) print("Libraries installed: ", glob.glob(os.environ['HOME']+'/Arduino/libraries/*'))
# link our library folder to the arduino libraries folder
if not IS_LEARNING_SYS:
try:
os.symlink(BUILD_DIR, os.environ['HOME']+'/Arduino/libraries/' + os.path.basename(BUILD_DIR))
except FileExistsError:
pass
################################ UF2 Utils.
def glob1(pattern):
result = glob.glob(pattern)
if len(result) != 1:
raise RuntimeError(f"Required pattern {pattern} to match exactly 1 file, got {result}")
return result[0]
def download_uf2_utils():
"""Downloads uf2conv tools if we don't already have them
"""
cmd = "wget -nc --no-check-certificate http://raw.githubusercontent.com/microsoft/uf2/master/utils/uf2families.json https://raw.githubusercontent.com/microsoft/uf2/master/utils/uf2conv.py"
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
r = proc.wait(timeout=60)
out = proc.stdout.read()
err = proc.stderr.read()
if r != 0:
ColorPrint.print_fail("Failed to download UF2 Utils!")
ColorPrint.print_fail(out.decode("utf-8"))
ColorPrint.print_fail(err.decode("utf-8"))
return False
return True
def generate_uf2(example_path):
"""Generates a .uf2 file from a .bin or .hex file.
:param str example_path: A path to the compiled .bin or .hex file.
"""
if not download_uf2_utils():
return None
cli_build_path = "build/*.*." + fqbn.split(':')[2] + "/*.hex"
input_file = glob1(os.path.join(example_path, cli_build_path))
output_file = os.path.splitext(input_file)[0] + ".uf2"
family_id = ALL_PLATFORMS[platform][1]
cmd = ['python3', 'uf2conv.py', input_file, '-c', '-f', family_id, '-o', output_file]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
r = proc.wait(timeout=60)
out = proc.stdout.read()
err = proc.stderr.read()
if r == 0 and not err:
ColorPrint.print_pass(CHECK)
ColorPrint.print_info(out.decode("utf-8"))
else:
ColorPrint.print_fail(CROSS)
ColorPrint.print_fail(out.decode("utf-8"))
ColorPrint.print_fail(err.decode("utf-8"))
return None
return output_file
################################ Test platforms ################################ Test platforms
platforms = [] platforms = []
success = 0 success = 0
@ -302,9 +178,9 @@ success = 0
# expand groups: # expand groups:
for arg in sys.argv[1:]: for arg in sys.argv[1:]:
platform = ALL_PLATFORMS.get(arg, None) platform = ALL_PLATFORMS.get(arg, None)
if isinstance(platform, list): if isinstance(platform, str):
platforms.append(arg) platforms.append(arg)
elif isinstance(platform, tuple): elif isinstance(platform, collections.Iterable):
for p in platform: for p in platform:
platforms.append(p) platforms.append(p)
else: else:
@ -325,62 +201,21 @@ def test_examples_in_folder(folderpath):
# check if we should SKIP # check if we should SKIP
skipfilename = folderpath+"/."+platform+".test.skip" skipfilename = folderpath+"/."+platform+".test.skip"
onlyfilename = folderpath+"/."+platform+".test.only" onlyfilename = folderpath+"/."+platform+".test.only"
# check if we should GENERATE UF2
gen_file_name = folderpath+"/."+platform+".generate"
if os.path.exists(skipfilename): if os.path.exists(skipfilename):
ColorPrint.print_warn("skipping") ColorPrint.print_warn("skipping")
continue continue
if glob.glob(folderpath+"/.*.test.only"): if glob.glob(folderpath+"/.*.test.only") and not os.path.exists(onlyfilename):
platformname = glob.glob(folderpath+"/.*.test.only")[0].split('.')[1] ColorPrint.print_warn("skipping")
if platformname != "none" and not platformname in ALL_PLATFORMS: continue
# uh oh, this isnt a valid testonly!
ColorPrint.print_fail(CROSS)
ColorPrint.print_fail("This example does not have a valid .platform.test.only file")
success = 1
continue
if not os.path.exists(onlyfilename):
ColorPrint.print_warn("skipping")
continue
if os.path.exists(gen_file_name):
ColorPrint.print_info("generating")
if BUILD_WARN:
if os.path.exists(gen_file_name):
cmd = ['arduino-cli', 'compile', '--warnings', 'all', '--fqbn', fqbn, '-e', folderpath]
else:
cmd = ['arduino-cli', 'compile', '--warnings', 'all', '--fqbn', fqbn, folderpath]
else:
cmd = ['arduino-cli', 'compile', '--warnings', 'none', '--export-binaries', '--fqbn', fqbn, folderpath]
cmd = ['arduino-cli', 'compile', '--fqbn', fqbn, examplepath]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) stderr=subprocess.PIPE)
try: r = proc.wait()
out, err = proc.communicate(timeout=60) out = proc.stdout.read()
r = proc.returncode err = proc.stderr.read()
except: if r == 0:
proc.kill()
out, err = proc.communicate()
r = 1
if r == 0 and not (err and BUILD_WALL == True):
ColorPrint.print_pass(CHECK) ColorPrint.print_pass(CHECK)
if err:
# also print out warning message
ColorPrint.print_fail(err.decode("utf-8"))
if os.path.exists(gen_file_name):
if ALL_PLATFORMS[platform][1] == None:
ColorPrint.print_info("Platform does not support UF2 files, skipping...")
else:
ColorPrint.print_info("Generating UF2...")
filename = generate_uf2(folderpath)
if filename is None:
success = 1 # failure
if IS_LEARNING_SYS:
fqbnpath, uf2file = filename.split("/")[-2:]
os.makedirs(BUILD_DIR+"/build", exist_ok=True)
os.makedirs(BUILD_DIR+"/build/"+fqbnpath, exist_ok=True)
shutil.copy(filename, BUILD_DIR+"/build/"+fqbnpath+"-"+uf2file)
os.system("ls -lR "+BUILD_DIR+"/build")
else: else:
ColorPrint.print_fail(CROSS) ColorPrint.print_fail(CROSS)
ColorPrint.print_fail(out.decode("utf-8")) ColorPrint.print_fail(out.decode("utf-8"))
@ -396,8 +231,8 @@ def test_examples_in_learningrepo(folderpath):
continue continue
if not projectpath.endswith(".ino"): if not projectpath.endswith(".ino"):
continue continue
# found an INO! # found an INO!
print('\t'+projectpath, end=' ', flush=True) print('\t'+projectpath, end=' ')
# check if we should SKIP # check if we should SKIP
skipfilename = folderpath+"/."+platform+".test.skip" skipfilename = folderpath+"/."+platform+".test.skip"
onlyfilename = folderpath+"/."+platform+".test.only" onlyfilename = folderpath+"/."+platform+".test.only"
@ -407,8 +242,8 @@ def test_examples_in_learningrepo(folderpath):
elif glob.glob(folderpath+"/.*.test.only") and not os.path.exists(onlyfilename): elif glob.glob(folderpath+"/.*.test.only") and not os.path.exists(onlyfilename):
ColorPrint.print_warn("skipping") ColorPrint.print_warn("skipping")
continue continue
cmd = ['arduino-cli', 'compile', '--warnings', 'all', '--fqbn', fqbn, projectpath] cmd = ['arduino-cli', 'compile', '--fqbn', fqbn, projectpath]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) stderr=subprocess.PIPE)
r = proc.wait() r = proc.wait()
@ -416,9 +251,6 @@ def test_examples_in_learningrepo(folderpath):
err = proc.stderr.read() err = proc.stderr.read()
if r == 0: if r == 0:
ColorPrint.print_pass(CHECK) ColorPrint.print_pass(CHECK)
if err:
# also print out warning message
ColorPrint.print_fail(err.decode("utf-8"))
else: else:
ColorPrint.print_fail(CROSS) ColorPrint.print_fail(CROSS)
ColorPrint.print_fail(out.decode("utf-8")) ColorPrint.print_fail(out.decode("utf-8"))
@ -427,7 +259,7 @@ def test_examples_in_learningrepo(folderpath):
for platform in platforms: for platform in platforms:
fqbn = ALL_PLATFORMS[platform][0] fqbn = ALL_PLATFORMS[platform]
print('#'*80) print('#'*80)
ColorPrint.print_info("SWITCHING TO "+fqbn) ColorPrint.print_info("SWITCHING TO "+fqbn)
install_platform(":".join(fqbn.split(':', 2)[0:2])) # take only first two elements install_platform(":".join(fqbn.split(':', 2)[0:2])) # take only first two elements

View file

@ -44,8 +44,6 @@ if [[ -z "${TRAVIS_BUILD_DIR}" ]]; then
export BUILD_DIR=${GITHUB_WORKSPACE} export BUILD_DIR=${GITHUB_WORKSPACE}
export AUTH=${GITHUB_ACTOR}:${GH_REPO_TOKEN} export AUTH=${GITHUB_ACTOR}:${GH_REPO_TOKEN}
export REPO_SLUG=${GITHUB_REPOSITORY} export REPO_SLUG=${GITHUB_REPOSITORY}
export COMMIT_SHA1=${GITHUB_SHA}
export BUILD_ID="GitHub Actions run: ${GITHUB_RUN_ID}"
if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then
export IS_PULL=1 export IS_PULL=1
fi fi
@ -53,8 +51,6 @@ else
export BUILD_DIR=${TRAVIS_BUILD_DIR} export BUILD_DIR=${TRAVIS_BUILD_DIR}
export AUTH=${GH_REPO_TOKEN} export AUTH=${GH_REPO_TOKEN}
export REPO_SLUG=${TRAVIS_REPO_SLUG} export REPO_SLUG=${TRAVIS_REPO_SLUG}
export COMMIT_SHA1=${TRAVIS_COMMIT}
export BUILD_ID="Travis build: ${TRAVIS_BUILD_NUMBER}"
if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then
export IS_PULL=1 export IS_PULL=1
fi fi
@ -82,7 +78,7 @@ cd ${REPO_NAME}
git config --global push.default simple git config --global push.default simple
# Pretend to be an user called Doxygen CI. # Pretend to be an user called Doxygen CI.
git config user.name "Doxygen CI" git config user.name "Doxygen CI"
git config user.email "ci-arduino@invalid" git config user.email "travis@travis-ci.org"
# Remove everything currently in the gh-pages branch. # Remove everything currently in the gh-pages branch.
# GitHub is smart enough to know which files have changed and which files have # GitHub is smart enough to know which files have changed and which files have
@ -175,12 +171,10 @@ if [ -d "html" ] && [ -f "html/index.html" ]; then
# Commit the added files with a title and description containing the Travis CI # Commit the added files with a title and description containing the Travis CI
# build number and the GitHub commit reference that issued this build. # build number and the GitHub commit reference that issued this build.
echo 'Git committing' echo 'Git committing'
git commit \ git commit -m "Deploy code docs to GitHub Pages Travis build: ${TRAVIS_BUILD_NUMBER}" -m "Commit: ${TRAVIS_COMMIT}"
-m "Deploy docs to GitHub Pages from commit ${COMMIT_SHA1:0:10}" \
-m "Commit: ${COMMIT_SHA1}"$'\n'"${BUILD_ID}"
# Force push to the remote gh-pages branch. # Force push to the remote gh-pages branch.
# The output is redirected to /dev/null to hide any sensitive credential data # The ouput is redirected to /dev/null to hide any sensitive credential data
# that might otherwise be exposed. # that might otherwise be exposed.
echo 'Git pushing' echo 'Git pushing'
git push --force "https://${AUTH}@github.com/${REPO_SLUG}.git" > /dev/null 2>&1 git push --force "https://${AUTH}@github.com/${REPO_SLUG}.git" > /dev/null 2>&1

View file

@ -109,7 +109,6 @@ INSTALL_NRF52=$([[ $INSTALL_PLATFORMS == *"nrf52"* || -z "$INSTALL_PLATFORMS" ]]
if [[ $INSTALL_ESP32 == 1 ]]; then if [[ $INSTALL_ESP32 == 1 ]]; then
echo -n "ESP32: " echo -n "ESP32: "
pip install pyserial
DEPENDENCY_OUTPUT=$(arduino --install-boards esp32:esp32 2>&1) DEPENDENCY_OUTPUT=$(arduino --install-boards esp32:esp32 2>&1)
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
fi fi
@ -140,10 +139,12 @@ fi
if [[ $INSTALL_NRF52 == 1 ]]; then if [[ $INSTALL_NRF52 == 1 ]]; then
echo -n "ADAFRUIT NRF5X: " echo -n "ADAFRUIT NRF5X: "
pip install wheel pip3 install --user setuptools
pip install setuptools pip3 install --user adafruit-nrfutil
pip install adafruit-nrfutil pip3 install --user pyserial
pip install pyserial sudo pip3 install setuptools
sudo pip3 install adafruit-nrfutil
sudo pip3 install pyserial
DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:nrf52 2>&1) DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:nrf52 2>&1)
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
fi fi
@ -168,7 +169,7 @@ export SKIP_COUNT=0
export FAIL_COUNT=0 export FAIL_COUNT=0
export PDE_COUNT=0 export PDE_COUNT=0
# close if [[ $# -eq 0 ]] ; then # close if [[ $# -eq 0 ]] ; then
fi fi
# build all of the examples for the passed platform # build all of the examples for the passed platform
#Sourcing and defining functions #Sourcing and defining functions
function build_platform() function build_platform()