dist: trusty
sudo: true
  #
language: c
  #
env:
  global:
    - IDE_VERSION=1.8.9
  matrix:
    - BOARD="multi4in1:avr:multiatmega328p:bootloader=none"
    - BOARD="multi4in1:avr:multiatmega328p:bootloader=optiboot"
    - BOARD="multi4in1:avr:multixmega32d4"
    - BOARD="multi4in1:STM32F1:multistm32f103c:debug_option=none"
   # - BOARD="multi4in1:STM32F1:multistm32f103c:debug_option=native"
    - BOARD="multi4in1:STM32F1:multistm32f103c:debug_option=ftdi"
    #
notifications:
  email: false
  #
before_install:
  #
  # Fetch the tag information for the current branch
  - git fetch origin --tags
  #
  # Publish the buildroot script folder
  - chmod +x ${TRAVIS_BUILD_DIR}/buildroot/bin/*
  - export PATH=${TRAVIS_BUILD_DIR}/buildroot/bin/:${PATH}
  #
  # Install Arduino IDE
  - wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz
  - tar xf arduino-$IDE_VERSION-linux64.tar.xz
  - mv arduino-$IDE_VERSION $HOME/arduino-ide
  - export PATH=$PATH:$HOME/arduino-ide
  # Set the Multi boards package URL
  - arduino --pref "boardsmanager.additional.urls=https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/master/package_multi_4in1_board_index.json" --save-prefs
  #
  - if [[ "$BOARD" =~ "multi4in1:STM32F1:" ]]; then
      arduino --install-boards multi4in1:STM32F1;
    fi
  #
  - if [[ "$BOARD" =~ "multi4in1:avr:" ]]; then
      arduino --install-boards multi4in1:avr;
    fi
  #
  - buildMulti() { start_fold config_diff; travis_time_start; git diff Multiprotocol/_Config.h; end_fold config_diff; exitcode=0; BUILDCMD="arduino --verify --board $BOARD Multiprotocol/Multiprotocol.ino --pref build.path=./build/"; echo $BUILDCMD; $BUILDCMD; if [ $? -ne 0 ]; then exitcode=1; fi; echo; return $exitcode; }
  - buildProtocol() { exitcode=0; opt_disable $ALL_PROTOCOLS; opt_enable $1; buildMulti; if [ $? -ne 0 ]; then exitcode=1; fi; return $exitcode; }
  - buildEachProtocol() { exitcodesum=0; for PROTOCOL in $ALL_PROTOCOLS ; do printf "\e[33;1mBuilding $PROTOCOL\e[0m"; buildProtocol $PROTOCOL; if [ $? -ne 0 ]; then exitcodesum=$((exitcodesum + 1)); fi; done; return $exitcodesum; }
  #
  # Arduino IDE adds a lot of noise caused by network traffic; firewall it
  - sudo iptables -P INPUT DROP
  - sudo iptables -P FORWARD DROP
  - sudo iptables -P OUTPUT ACCEPT
  - sudo iptables -A INPUT -i lo -j ACCEPT
  - sudo iptables -A OUTPUT -o lo -j ACCEPT
  - sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  #
install: true
before_script:
  #
  # Change current working directory to the build dir
  - cd ${TRAVIS_BUILD_DIR}
  # Log the initial Multi config 
  - cat Multiprotocol/_Config.h
  # Back up the configuration
  - cp Multiprotocol/_Config.h ./_Config.h.bak
  # Derive the Multi protocols from the Multi source
  - A7105_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_A7105_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
  - CC2500_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_CC2500_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
  - CYRF6936_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_CYRF6936_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
  - NRF24L01_PROTOCOLS=$(sed -n 's/[\/\/]*[[:blank:]]*#define[[:blank:]]*\([[:alnum:]_]*_NRF24L01_INO\)\(.*\)/\1/p' Multiprotocol/_Config.h)
  - if [[ "$BOARD" =~ "multi4in1:avr:multixmega32d4" ]]; then
      ALL_PROTOCOLS=$(echo $CYRF6936_PROTOCOLS);
    else
      ALL_PROTOCOLS=$(echo $A7105_PROTOCOLS $CC2500_PROTOCOLS $CYRF6936_PROTOCOLS $NRF24L01_PROTOCOLS);
    fi
  - echo $ALL_PROTOCOLS
  #
  # Disable CHECK_FOR_BOOTLOADER when not needed
  - if [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=none" ]]; then
      opt_disable CHECK_FOR_BOOTLOADER;
    fi
  #
  # Trim the build down for the Atmega328p board
  - if [[ "$BOARD" =~ "multi4in1:avr:multiatmega328p:" ]]; then
      opt_disable $ALL_PROTOCOLS;
      opt_enable FRSKYX_CC2500_INO AFHDS2A_A7105_INO MJXQ_NRF24L01_INO DSM_CYRF6936_INO;
    fi
  #
  - export -f travis_fold
  - export -f travis_nanoseconds
  - export -f travis_time_start
  - export -f travis_time_finish
  - start_fold() { echo -e "travis_fold:start:$1"; }
  - end_fold() { echo -e "\ntravis_fold:end:$1\r"; }
script:
  # Build with all protocols enabled for STM32; a subset of protocols for Atmega
  - buildMulti
  #
  # Serial only
  - opt_disable ENABLE_PPM
  - opt_enable ENABLE_SERIAL
  - buildMulti
  #
  # PPM only
  - opt_enable ENABLE_PPM
  - opt_disable ENABLE_SERIAL
  - buildMulti
  #
  # Re-enable PPM and serial
  - opt_enable ENABLE_SERIAL
  - opt_enable ENABLE_PPM
  #
  # Build each protocol individually
  - buildEachProtocol
before_deploy:
  # Create somwhere to put the binaries
  - mkdir ./binaries
  # Restore the default configuration
  - cp ./_Config.h.bak Multiprotocol/_Config.h
  # Build the release files for OrangeRX
  - if [[ "$BOARD" == "multi4in1:avr:multixmega32d4" ]]; then
      printf "\n\e[33;1mBuilding multi-orangerx-aetr-green-inv-$TRAVIS_TAG.bin\e[0m";
      opt_enable $ALL_PROTOCOLS;
      opt_disable ORANGE_TX_BLUE;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-green-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-orangerx-aetr-blue-inv-$TRAVIS_TAG.bin\e[0m";
      opt_enable ORANGE_TX_BLUE;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-orangerx-aetr-blue-inv-$TRAVIS_TAG.bin;
      cp Multiprotocol/Multi.txt ./binaries/Multi.txt;
    fi
  # Build the release files for AVR without bootloader
  - if [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=none" ]]; then
      printf "\n\e[33;1mBuilding multi-avr-usbasp-aetr-A7105-inv-$TRAVIS_TAG.bin\e[0m";
      opt_disable CHECK_FOR_BOOTLOADER;
      opt_disable $ALL_PROTOCOLS;
      opt_enable $A7105_PROTOCOLS;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-A7105-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-avr-usbasp-aetr-CC2500-inv-$TRAVIS_TAG.bin\e[0m";
      opt_disable $ALL_PROTOCOLS;
      opt_enable $CC2500_PROTOCOLS;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-CC2500-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-avr-usbasp-aetr-CYRF6936-inv-$TRAVIS_TAG.bin\e[0m";
      opt_disable $ALL_PROTOCOLS;
      opt_enable $CYRF6936_PROTOCOLS;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-avr-usbasp-aetr-CYRF6936-inv-$TRAVIS_TAG.bin;
    fi
  # Build the release files for AVR with bootloader
  - if [[ "$BOARD" == "multi4in1:avr:multiatmega328p:bootloader=optiboot" ]]; then
      printf "\n\e[33;1mBuilding multi-avr-txflash-aetr-A7105-inv-$TRAVIS_TAG.bin\e[0m";
      opt_enable CHECK_FOR_BOOTLOADER;
      opt_disable $ALL_PROTOCOLS;
      opt_enable $A7105_PROTOCOLS;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-A7105-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-avr-txflash-aetr-CC2500-inv-$TRAVIS_TAG.bin\e[0m";
      opt_disable $ALL_PROTOCOLS;
      opt_enable $CC2500_PROTOCOLS;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-CC2500-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-avr-txflash-aetr-CYRF6936-inv-$TRAVIS_TAG.bin\e[0m";
      opt_disable $ALL_PROTOCOLS;
      opt_enable $CYRF6936_PROTOCOLS;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-avr-txflash-aetr-CYRF6936-inv-$TRAVIS_TAG.bin;
    fi
  # Build the release files for STM32 without debug
  - if [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103c:debug_option=none" ]]; then
      printf "\n\e[33;1mBuilding multi-stm-erskytx-aetr-inv-$TRAVIS_TAG.bin\e[0m";
      opt_enable CHECK_FOR_BOOTLOADER;
      opt_enable $ALL_PROTOCOLS;
      opt_enable MULTI_STATUS;
      opt_disable MULTI_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-aetr-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-erskytx-taer-inv-$TRAVIS_TAG.bin\e[0m";
      opt_replace AETR TAER;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-taer-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-erskytx-reta-inv-$TRAVIS_TAG.bin\e[0m";
      opt_replace TAER RETA;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-reta-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-erskytx-aetr-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace RETA AETR;
      opt_disable INVERT_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-aetr-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-erskytx-taer-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace AETR TAER;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-taer-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-erskytx-reta-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace TAER RETA;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-reta-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-aetr-inv-$TRAVIS_TAG.bin\e[0m";
      opt_replace RETA AETR;
      opt_disable MULTI_STATUS;
      opt_enable MULTI_TELEMETRY;
      opt_enable INVERT_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-aetr-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-taer-inv-$TRAVIS_TAG.bin\e[0m";
      opt_replace AETR TAER;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-taer-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-reta-inv-$TRAVIS_TAG.bin\e[0m";
      opt_replace TAER RETA;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-reta-inv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-aetr-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace RETA AETR;
      opt_disable INVERT_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-aetr-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-taer-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace AETR TAER;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-taer-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-reta-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace TAER RETA;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-reta-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-ppm-aetr-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace RETA AETR;
      opt_disable MULTI_STATUS;
      opt_disable MULTI_TELEMETRY;
      opt_set NBR_BANKS 5;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-aetr-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-ppm-taer-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace AETR TAER;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-taer-noinv-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-ppm-reta-noinv-$TRAVIS_TAG.bin\e[0m";
      opt_replace TAER RETA;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-ppm-reta-noinv-$TRAVIS_TAG.bin;
    fi
  # Build the release files for STM32 with Native USB debugging
  - if [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103c:debug_option=native" ]]; then
      printf "\n\e[33;1mBuilding multi-stm-erskytx-aetr-inv-usbdebug-$TRAVIS_TAG.bin\e[0m";
      opt_enable CHECK_FOR_BOOTLOADER;
      opt_enable $ALL_PROTOCOLS;
      opt_enable MULTI_STATUS;
      opt_disable MULTI_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-aetr-inv-usbdebug-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-aetr-inv-usbdebug-$TRAVIS_TAG.bin\e[0m";
      opt_disable MULTI_STATUS;
      opt_enable MULTI_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-aetr-inv-usbdebug-$TRAVIS_TAG.bin;
    fi
  # Build the release files for STM32 with FTDI USB debugging
  - if [[ "$BOARD" == "multi4in1:STM32F1:multistm32f103c:debug_option=ftdi" ]]; then
      printf "\n\e[33;1mBuilding multi-stm-erskytx-aetr-inv-ftdidebug-$TRAVIS_TAG.bin\e[0m";
      opt_enable CHECK_FOR_BOOTLOADER;
      opt_enable $ALL_PROTOCOLS;
      opt_enable MULTI_STATUS;
      opt_disable MULTI_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-erskytx-aetr-inv-ftdidebug-$TRAVIS_TAG.bin;
      printf "\n\e[33;1mBuilding multi-stm-opentx-aetr-inv-ftdidebug-$TRAVIS_TAG.bin\e[0m";
      opt_disable MULTI_STATUS;
      opt_enable MULTI_TELEMETRY;
      buildMulti;
      mv build/Multiprotocol.ino.bin ./binaries/multi-stm-opentx-aetr-inv-ftdidebug-$TRAVIS_TAG.bin;
    fi
deploy:
  provider: releases
  api_key:
    secure: KGXaoqvd8rbZ3AZtL9Rrn1JYiocGsPaihRUyR8gM8vTfvH9WYAE1+h6SzROQOuJSwr89MvTo3SBOTlM/0PDBnEGLec9Irt7cwO0xf9xM2vPuUG8DYcUzmJJzME9dkn/7qHof1JGgRpp1duUAN1triE9NxhKxL1hbs+tUUbDPAejxwoFNfnta/T4PfD6xmkZNJbneIfYFuFgyLpwwFhuUy9JP7s1AFOiT+fCHxPaZrPn5GsXqAi95Cb7Q3w1iVSt3BmrGxL2j3CeNpWzFY1RrMdc8ay+ppOhSPEIl2vyM7VeLRRBL3EVeFWkiS4ywevqw70wOivTczluv3OeuIJAe5o2UU+w5+59c7+i44Nih23PDAZBhAG5JkLUYUN0XUJpXJ5ZlZsb8IS8sI1txlZa5tNVoXO9+soGEY4rKSpZaPptuENm792CzzAjcaUI9pOFJ/0CBoSCbu5MpM/plkJCMd8fY27EE8cNYvolMuRATNlXs7h9mURGR69pmcR1jFShH+A7Kyp1S1sH19sGCEU16rt2aAtf2FadFg/gKACC2y9rB3wBb4Qnapu2AwNRlTYNuU1+G+kb2FXRwMl04q+38S+cIBHH9NHfdftp9MRPf8Ekatojs92be/Ux21S+hcA7sx/DV22Dl45V6l4mXzR7U4x1nQcdn1SGuy5I4lL6IYCk=
  skip_cleanup: true
  file_glob: true
  file: binaries/*
  on:
    tags: true