Guest User

Untitled

a guest
Aug 8th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 51.87 KB | None | 0 0
  1. #!/bin/bash
  2. #                                            __      __  __
  3. #                                           /  |    /  |/  |
  4. #     ______    ______           __    __  _██ |_   ██/ ██ |
  5. #    /      \  /      \  ______ /  |  /  |/ ██   |  /  |██ |
  6. #   /██████  |/██████  |/      |██ |  ██ |██████/   ██ |██ |
  7. #   ██ |  ██ |██ |  ██ |██████/ ██ |  ██ |  ██ | __ ██ |██ |
  8. #   ██ |__██ |██ \__██ |        ██ \__██ |  ██ |/  |██ |██ |
  9. #   ██    ██/ ██    ██/         ██    ██/   ██  ██/ ██ |██ |
  10. #   ███████/   ██████/           ██████/     ████/  ██/ ██/
  11. #   ██ |
  12. #   ██ |
  13. #   ██/                  https://po-util.com
  14. #
  15.  
  16. #  po-util - The Ultimate Local Particle Experience for Linux and macOS
  17. # Copyright (C) 2017  Nathan Robinson
  18. #
  19. # This program is free software: you can redistribute it and/or modify
  20. # it under the terms of the GNU General Public License as published by
  21. # the Free Software Foundation, either version 3 of the License, or
  22. # (at your option) any later version.
  23. #
  24. # This program is distributed in the hope that it will be useful,
  25. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27. # GNU General Public License for more details.
  28. #
  29. # You should have received a copy of the GNU General Public License
  30. # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  31.  
  32. # Helper functions
  33. pause()
  34. {
  35.     read -rp "$*"
  36. }
  37.  
  38. print_logo()
  39. {
  40.   if [ "$1" ];
  41.   then
  42.     TEXTLINE="$1"
  43.   else
  44.     TEXTLINE="https://po-util.com"
  45.   fi
  46.  
  47. LOGO="                                                     __      __  __
  48.                                                    /  |    /  |/  |
  49.              ______    ______           __    __  _██ |_   ██/ ██ |
  50.             /      \  /      \  ______ /  |  /  |/ ██   |  /  |██ |
  51.            /██████  |/██████  |/      |██ |  ██ |██████/   ██ |██ |
  52.            ██ |  ██ |██ |  ██ |██████/ ██ |  ██ |  ██ | __ ██ |██ |
  53.            ██ |__██ |██ \__██ |        ██ \__██ |  ██ |/  |██ |██ |
  54.            ██    ██/ ██    ██/         ██    ██/   ██  ██/ ██ |██ |
  55.            ███████/   ██████/           ██████/     ████/  ██/ ██/
  56.            ██ |
  57.            ██ |
  58.            ██/                  $TEXTLINE
  59. "
  60.   if [ -t 1 ];
  61.   then
  62.       echo "$(tput setaf 6)$(tput bold)$LOGO$(tput sgr0)"
  63.   else
  64.       echo "$LOGO"
  65.   fi
  66. }
  67.  
  68.  
  69. blue_echo()
  70. {
  71.     if [ -t 1 ];
  72.     then
  73.         echo "$(tput setaf 6)$(tput bold)$1$(tput sgr0)"
  74.     else
  75.         echo "$1"
  76.     fi
  77. }
  78.  
  79. green_echo()
  80. {
  81.     if [ -t 1 ];
  82.     then
  83.         echo "$(tput setaf 2)$(tput bold)$1$(tput sgr0)"
  84.     else
  85.         echo "$1"
  86.     fi
  87. }
  88.  
  89. red_echo()
  90. {
  91.     if [ -t 1 ];
  92.     then
  93.         echo "$(tput setaf 1)$(tput bold)$1$(tput sgr0)"
  94.     else
  95.         echo "$1"
  96.     fi
  97. }
  98.  
  99. find_objects() #Consolidated function
  100. {
  101.     if [ "$1" != "" ];
  102.     then
  103.         case "$1" in
  104.             */)
  105.                 #"has slash"
  106.                 DEVICESFILE="${1%?}"
  107.                 FIRMWAREDIR="${1%?}"
  108.                 FIRMWAREBIN="${1%?}"
  109.                 DIRECTORY="${1%?}"
  110.             ;;
  111.             *)
  112.                 echo "doesn't have a slash" > /dev/null
  113.                 DEVICESFILE="$1"
  114.                 FIRMWAREDIR="$1"
  115.                 FIRMWAREBIN="$1"
  116.                 DIRECTORY="$1"
  117.             ;;
  118.         esac
  119.         if [ -f "$CWD/$DEVICESFILE/devices.txt" ] || [ -d "$CWD/$FIRMWAREDIR/firmware" ] || [ -f "$CWD/$FIRMWAREBIN/bin/firmware.bin" ];
  120.         then
  121.             DEVICESFILE="$CWD/$DEVICESFILE/devices.txt"
  122.             FIRMWAREDIR="$CWD/$FIRMWAREDIR/firmware"
  123.             FIRMWAREBIN="$CWD/$FIRMWAREBIN/bin/firmware.bin"
  124.         else
  125.             if [ -d "$DIRECTORY" ] && [ -d "$DIRECTORY/firmware" ];
  126.             then
  127.                 DEVICESFILE="$DIRECTORY/devices.txt"
  128.                 FIRMWAREDIR="$DIRECTORY/firmware"
  129.                 FIRMWAREBIN="$DIRECTORY/bin/firmware.bin"
  130.             else
  131.                 if [ -d "$CWD/$DIRECTORY" ] && [ -d "$CWD/firmware" ];
  132.                 then
  133.                     DEVICESFILE="$CWD/$DIRECTORY/../devices.txt"
  134.                     FIRMWAREDIR="$CWD/$DIRECTORY"
  135.                     FIRMWAREBIN="$CWD/$DIRECTORY/../bin/firmware.bin"
  136.                 else
  137.                     if [ "$DIRECTORY" == "." ] && [ -f "$CWD/main.cpp" ];
  138.                     then
  139.                         cd "$CWD/.."
  140.                         DEVICESFILE="$(pwd)/devices.txt"
  141.                         FIRMWAREDIR="$CWD"
  142.                         FIRMWAREBIN="$(pwd)/bin/firmware.bin"
  143.                     else
  144.                         echo
  145.                         red_echo "Firmware not found!"
  146.                         blue_echo "Please run \"po init DEVICE FOLDER\" to setup a project,
  147. or choose a valid directory."
  148.                         echo
  149.                         exit
  150.                     fi
  151.                 fi
  152.             fi
  153.         fi
  154.     else
  155.         DEVICESFILE="$CWD/devices.txt"
  156.         FIRMWAREDIR="$CWD/firmware"
  157.         FIRMWAREBIN="$CWD/bin/firmware.bin"
  158.     fi
  159.  
  160.     if [ -d "$FIRMWAREDIR" ];
  161.     then
  162.         FIRMWAREDIR="$FIRMWAREDIR"
  163.     else
  164.         if [ "$DIRWARNING" == "true" ];
  165.         then
  166.             echo
  167.             red_echo "Firmware directory not found!"
  168.             blue_echo "Please run \"po init DEVICE FOLDER\" to setup a project,
  169. or choose a valid directory."
  170.             echo
  171.             exit
  172.         fi
  173.         FINDDIRFAIL="true"
  174.     fi
  175.  
  176.     if [ -f "$DEVICESFILE" ];
  177.     then
  178.         DEVICES="$(cat $DEVICESFILE)"
  179.     else
  180.         if [ "$DEVICEWARNING" == "true" ];
  181.         then
  182.             echo
  183.             red_echo "devices.txt not found!"
  184.             blue_echo "You need to create a \"devices.txt\" file in your project directory with the names
  185. of your devices on each line."
  186.             green_echo "Example:"
  187.             echo "    product1
  188.    product2
  189.    product3
  190.            "
  191.         fi
  192.         FINDDEVICESFAIL="true"
  193.     fi
  194.  
  195.     if [ -f "$FIRMWAREBIN" ];
  196.     then
  197.         FIRMWAREBIN="$FIRMWAREBIN"
  198.     else
  199.         if [ "$BINWARNING" == "true" ];
  200.         then
  201.             echo
  202.             red_echo "Firmware Binary not found!"
  203.             blue_echo "Perhaps you need to build your firmware?"
  204.             echo
  205.         fi
  206.         FINDBINFAIL="true"
  207.     fi
  208. }
  209.  
  210. build_message()
  211. {
  212.     echo
  213.     cd "$FIRMWAREDIR"/.. || exit
  214.     BINARYDIR="$(pwd)/bin"
  215.     green_echo "Binary saved to $BINARYDIR/firmware.bin"
  216.     echo
  217.     exit
  218. }
  219.  
  220. dfu_open()
  221. {
  222. DFU_LIST="$(dfu-util -l)"
  223.  
  224. if echo "$DFU_LIST" | grep "2b04:d006" > /dev/null || echo "$DFU_LIST" | grep "2b04:d008" > /dev/null ||  echo "$DFU_LIST" | grep "2b04:d00a" > /dev/null || echo "$DFU_LIST" | grep "1d50:607f" > /dev/null || echo "$DFU_LIST" | grep "1d50:607f" > /dev/null ;
  225. then
  226.   blue_echo "
  227. Already found a device in DFU mode!
  228. "
  229.   rm "$DFU_LIST"
  230.   return
  231. fi
  232.  
  233. if [ "$1" == "-d" ] || [ "$1" == "--device" ];
  234. then
  235.  
  236.   if stty -F "$2" > /dev/null 2>&1; # Check if serial port is avaliable
  237.   then
  238.   blue_echo "
  239. Placing device $2 into DFU mode...
  240. "
  241.   custom-baud "$2" "$DFUBAUDRATE" > /dev/null 2>&1
  242.   return
  243.  
  244. else
  245.   red_echo "
  246. Could not find a device on $2
  247.  "
  248.   fi
  249.  
  250.   return
  251. fi
  252.  
  253.     if [ "$DEVICE_TYPE" == "duo" ];
  254.     then
  255.         if [ "$MODEM_DUO" != "" ];
  256.         then
  257.             MODEM="$MODEM_DUO"
  258.         else
  259.             echo
  260.             red_echo "Device not found!"
  261.             echo
  262.             blue_echo "Your device must be connected by USB."
  263.             echo
  264.             exit
  265.         fi
  266.     else
  267.         if [ "$MODEM" != "" ];
  268.         then
  269.             MODEM="$MODEM"
  270.         else
  271.             echo
  272.             red_echo "Device not found!"
  273.             echo
  274.             blue_echo "Your device must be connected by USB."
  275.             echo
  276.             exit
  277.         fi
  278.     fi
  279.  
  280.     if [ "$MODEM" ];
  281.     then
  282.         custom-baud "$MODEM" "$DFUBAUDRATE" > /dev/null 2>&1
  283.     fi
  284. }
  285.  
  286. common_commands() #List common commands
  287. {
  288.     echo
  289.     blue_echo "Common commands include:
  290.    build, flash, clean, ota, dfu, serial, init, config, setup, library"
  291.     echo
  292. }
  293.  
  294. build_firmware()
  295. {
  296.     print_logo "Building firmware for $DEVICE_TYPE..."
  297.  
  298.   if [ "$DEVICE_TYPE" == "duo" ];
  299.   then
  300.     make all -s -C "$FIRMWARE_DUO/firmware/main" APPDIR="$FIRMWAREDIR" TARGET_DIR="$FIRMWAREDIR/../bin" PLATFORM="$DEVICE_TYPE"
  301.   else
  302.  
  303.     if [ "$DEVICE_TYPE" == "pi" ];
  304.     then
  305.         if hash docker 2>/dev/null;
  306.         then
  307.           if docker run --rm -i -v $FIRMWARE_PI/firmware:/firmware -v $FIRMWAREDIR:/input -v $FIRMWAREDIR/../bin:/output particle/buildpack-raspberrypi 2> echo;
  308.           then
  309.             echo
  310.             blue_echo "Successfully built firmware for Raspberry Pi"
  311.           else
  312.             echo
  313.             red_echo "Build failed."
  314.             echo
  315.             exit 1
  316.           fi
  317.         else
  318.           red_echo "Docker not found. Please install docker to build firmware for Raspberry Pi"
  319.           echo
  320.           exit
  321.         fi
  322.       else
  323.     make all -s -C "$FIRMWARE_PARTICLE/main" APPDIR="$FIRMWAREDIR" TARGET_DIR="$FIRMWAREDIR/../bin" PLATFORM="$DEVICE_TYPE"
  324.     fi
  325.   fi
  326. }
  327.  
  328. ota() # device firmware
  329. {
  330.   find_objects "$2"
  331.   DIRWARNING="true"
  332.   BINWARNING="true"
  333.   if [ "$FINDDIRFAIL" == "true" ] || [ "$FINDBINFAIL" == "true" ];
  334.   then
  335.     exit
  336.   fi
  337.  
  338.   if [ "$1" == "" ];
  339.   then
  340.     echo
  341.     red_echo "Please specify which device to flash ota."
  342.     echo
  343.     exit
  344.   fi
  345.  
  346.   if [ "$1" == "--multi" ] || [ "$1" == "-m" ] || [ "$1" == "-ota" ];
  347.   then
  348.     DEVICEWARNING="true"
  349.     if [ "$FINDDEVICESFAIL" == "true" ];
  350.     then
  351.       cd "$CWD"
  352.       echo "" > devices.txt
  353.       red_echo "Please list your devices in devices.txt"
  354.       sleep 3
  355.       exit
  356.     fi
  357.     for DEVICE in $DEVICES ; do
  358.       echo
  359.       blue_echo "Flashing to device $DEVICE..."
  360.       particle flash "$DEVICE" "$FIRMWAREBIN" || ( red_echo "Your device must be online in order to flash firmware OTA." )
  361.     done
  362.     echo
  363.     exit
  364.   fi
  365.   echo
  366.   blue_echo "Flashing to device $1..."
  367.   particle flash "$1" "$FIRMWAREBIN" || ( red_echo "Try using \"particle flash\" if you are having issues." )
  368.   echo
  369.   exit
  370. }
  371.  
  372. initProject()
  373. {
  374.     if [[ "$FOLDER" == "/"* ]]; # Check for absolute or relative
  375.     then
  376.       FIRMWAREDIR="$FOLDER/firmware"
  377.     else
  378.       FIRMWAREDIR="$CWD/$FOLDER/firmware"
  379.     fi
  380.  
  381.     if [ -d "$FIRMWAREDIR" ];
  382.     then
  383.       echo
  384.       green_echo "Directory is already Initialized!"
  385.       echo
  386.       exit
  387.     fi
  388.  
  389.     mkdir -p "$FIRMWAREDIR"
  390.     echo "#include \"Particle.h\"
  391.  
  392. void setup() // Put setup code here to run once
  393. {
  394.  
  395. }
  396.  
  397. void loop() // Put code here to loop forever
  398. {
  399.  
  400. }" > "$FIRMWAREDIR/main.cpp"
  401.  
  402.       cp "$HOME/.po-util/doc/po-util-README.md" "$FIRMWAREDIR/../README.md"
  403.  
  404.       if [ "$DEVICE_TYPE" != "" ];
  405.       then
  406.           echo "---
  407. cmd: po $DEVICE_TYPE build
  408.  
  409. targets:
  410.  Build:
  411.    args:
  412.      - $DEVICE_TYPE
  413.      - build
  414.    cmd: po
  415.    keymap: ctrl-alt-1
  416.    name: Build
  417.  Flash:
  418.    args:
  419.      - $DEVICE_TYPE
  420.      - flash
  421.    cmd: po
  422.    keymap: ctrl-alt-2
  423.    name: Flash
  424.  Clean:
  425.    args:
  426.      - $DEVICE_TYPE
  427.      - clean
  428.    cmd: po
  429.    keymap: ctrl-alt-3
  430.    name: Clean
  431.  DFU:
  432.    args:
  433.      - $DEVICE_TYPE
  434.      - dfu
  435.    cmd: po
  436.    keymap: ctrl-alt-4
  437.    name: DFU
  438.  OTA:
  439.    args:
  440.      - $DEVICE_TYPE
  441.      - ota
  442.      - --multi
  443.    cmd: po
  444.    keymap: ctrl-alt-5
  445.    name: DFU
  446.          " >> "$FIRMWAREDIR/../.atom-build.yml"
  447.  
  448.   mkdir -p "$FIRMWAREDIR/../ci"
  449.  
  450.   echo "dist: trusty
  451. sudo: required
  452. language: generic
  453.  
  454. script:
  455.  - ci/travis.sh
  456.  
  457. cache:
  458.  directories:
  459.  - $HOME/bin" > "$FIRMWAREDIR/../.travis.yml"
  460.  
  461.   echo "#!/bin/bash
  462. bash <(curl -sL https://master.po-util.com/ci-install)
  463. po lib clean . -f &> /dev/null
  464. yes \"no\" | po lib setup # change to \"yes\" to prefer libraries from GitHub
  465. po $DEVICE_TYPE build" > "$FIRMWAREDIR/../ci/travis.sh"
  466.  
  467. chmod +x "$FIRMWAREDIR/../ci/travis.sh"
  468.  
  469.       fi
  470.  
  471.   echo "bin/*" > "$FIRMWAREDIR/../.gitignore"
  472.   cd "$FIRMWAREDIR/.."
  473.   git init &> /dev/null
  474.  
  475.       echo
  476.       green_echo "Directory initialized as a po-util project for $DEVICE_TYPE"
  477.       echo
  478.       exit
  479. }
  480.  
  481. # End of helper functions
  482.  
  483. if [ "$1" == "" ] || [ "$1" == "help" ]; # Print help
  484. then
  485.     print_logo
  486.  
  487.     echo "Copyright (GPL) 2017 Nathan D. Robinson
  488.  
  489.    Usage: po DEVICE_TYPE COMMAND DEVICE_NAME
  490.           po DFU_COMMAND
  491.           po install [full_install_path]
  492.           po library LIBRARY_COMMAND
  493.  
  494.    Run \"man po\" for help.
  495.    "
  496. exit
  497. fi
  498.  
  499. if [ "$1" == "setup-atom" ];
  500. then
  501.   echo
  502.   blue_echo "Installing Atom packages to enhance po-util experience..."
  503.   echo
  504.   apm install build minimap file-icons language-particle
  505.   echo
  506.   exit
  507. fi
  508.  
  509. CWD="$(pwd)" # Global Current Working Directory variable
  510. # Configuration file is created at "~/.po-util/config"
  511. SETTINGS=$CWD/config
  512. FIRMWARE_PARTICLE=$CWD/submodules/particle_firmware
  513. DFUBAUDRATE=14400       # changed in the "~/.po" file.
  514. MODEM="$(ls -1 /dev/* | grep "ttyACM" | tail -1)"
  515. GCC_ARM_VER=gcc-arm-none-eabi-4_9-2015q3 # Updated to 4.9
  516. GCC_ARM_PATH=$BINDIR/gcc-arm-embedded/$GCC_ARM_VER/bin/
  517. CUSTOM_BAUD_PATH=$BINDIR/custom-baud
  518. PATH="$PATH:$GCC_ARM_PATH"
  519. PATH="$PATH:$CUSTOM_BAUD_PATH"
  520.  
  521. if [ "$1" == "config" ];
  522. then
  523.   if [ -f "$SETTINGS" ];
  524.   then
  525.      rm "$SETTINGS"
  526.   fi
  527.   config
  528.   exit
  529. fi
  530.  
  531.  
  532. if [ "$1" == "info" ];
  533. then
  534.   echo "
  535. $(tput bold)$(tput setaf 3)$(date)$(tput sgr0)
  536.  
  537. $(tput bold)Configured Settings:$(tput sgr0)
  538.  
  539. $(tput bold)Firmware Branches:$(tput sgr0)
  540. $(tput bold)Particle: $(tput setaf 6)$BRANCH$(tput sgr0)
  541. $(tput bold)Duo: $(tput setaf 6)$BRANCH_DUO$(tput sgr0)
  542.  
  543. $(tput bold)DFU Baud Rate: $(tput setaf 6)$DFUBAUDRATE$(tput sgr0)
  544. $(tput bold)Automatic Headers: $(tput setaf 6)$AUTO_HEADER$(tput sgr0)
  545. "
  546.   exit
  547. fi
  548.  
  549. addHeaders()
  550. {
  551.     [ "$1" != "" ] && HEADER="$1" || HEADER="$LIB_NAME"
  552.     if [ "$AUTO_HEADER" == "true" ];
  553.     then
  554.         if (grep "#include \"$HEADER/$HEADER.h\"" "$FIRMWAREDIR/main.cpp") &> /dev/null ;
  555.         then
  556.             echo "Already imported" &> /dev/null
  557.         else
  558.             echo "#include \"$HEADER/$HEADER.h\"" > "$FIRMWAREDIR/main.cpp.temp"
  559.             cat "$FIRMWAREDIR/main.cpp" >> "$FIRMWAREDIR/main.cpp.temp"
  560.             rm "$FIRMWAREDIR/main.cpp"
  561.             mv "$FIRMWAREDIR/main.cpp.temp" "$FIRMWAREDIR/main.cpp"
  562.         fi
  563.     fi
  564. }
  565.  
  566. rmHeaders()
  567. {
  568.     if [ "$AUTO_HEADER" == "true" ];
  569.     then
  570.         if (grep "#include \"$1/$1.h\"" "$FIRMWAREDIR/main.cpp") &> /dev/null ;
  571.         then
  572.             grep -v "#include \"$1/$1.h\"" "$FIRMWAREDIR/main.cpp" > "$FIRMWAREDIR/main.cpp.temp"
  573.             rm "$FIRMWAREDIR/main.cpp"
  574.             mv "$FIRMWAREDIR/main.cpp.temp" "$FIRMWAREDIR/main.cpp"
  575.         fi
  576.  
  577.         if (grep "#include \"$1.h\"" "$FIRMWAREDIR/main.cpp") &> /dev/null ; # Backwards support
  578.         then
  579.             grep -v "#include \"$1.h\"" "$FIRMWAREDIR/main.cpp" > "$FIRMWAREDIR/main.cpp.temp"
  580.             rm "$FIRMWAREDIR/main.cpp"
  581.             mv "$FIRMWAREDIR/main.cpp.temp" "$FIRMWAREDIR/main.cpp"
  582.         fi
  583.  
  584.         if (grep "#include <$1.h>" "$FIRMWAREDIR/main.cpp") &> /dev/null ; # Other support
  585.         then
  586.             grep -v "#include <$1.h>" "$FIRMWAREDIR/main.cpp" > "$FIRMWAREDIR/main.cpp.temp"
  587.             rm "$FIRMWAREDIR/main.cpp"
  588.             mv "$FIRMWAREDIR/main.cpp.temp" "$FIRMWAREDIR/main.cpp"
  589.         fi
  590.  
  591.     fi
  592. }
  593.  
  594.  
  595. addLib()
  596. {
  597.  
  598.   if (ls -1 "$LIBRARY" | grep "$LIB_NAME") &> /dev/null ; # Try to automatically get library if not found
  599.   then
  600.     echo "FOUND LIBRARY!" &> /dev/null
  601.   else
  602.     getLib "$LIB_NAME" || ( echo && exit)
  603.   fi
  604.  
  605.     if [ -f "$FIRMWAREDIR/$LIB_NAME.cpp" ] || [ -f "$FIRMWAREDIR/$LIB_NAME.h" ] || [ -d "$FIRMWAREDIR/$LIB_NAME" ];
  606.     then
  607.         echo
  608.         red_echo "Library $LIB_NAME is already added to this project..."
  609.     else
  610.         echo
  611.         green_echo "Adding library $LIB_NAME to this project..."
  612.  
  613.         # Include library as a folder full of symlinks -- This is the new feature
  614.  
  615.         mkdir -p "$FIRMWAREDIR/$LIB_NAME"
  616.  
  617.         if [ -d "$LIBRARY/$LIB_NAME/firmware" ];
  618.         then
  619.             ln -s $LIBRARY/$LIB_NAME/firmware/* "$FIRMWAREDIR/$LIB_NAME"
  620.         else
  621.             if [ -d "$LIBRARY/$LIB_NAME/src" ];
  622.             then
  623.                 cd $FIRMWAREDIR/$LIB_NAME
  624.                 ln -s ../../../../lib/$LIB_NAME/src/* .
  625.             else
  626.                 cd $FIRMWAREDIR/$LIB_NAME
  627.                 ln -s ../../../../lib/$LIB_NAME/* .
  628.             fi
  629.         fi
  630.     fi
  631. }
  632.  
  633. getLibURL()
  634. {
  635.   TOKEN="$(grep 'token' ~/.particle/particle.config.json | grep -oE '([0-Z])\w+' | grep -v 'token')"
  636.   DATA=$(curl -sLH "Authorization: Bearer $TOKEN" "https://api.particle.io/v1/libraries/$1" | json_pp)
  637.   LIBURL=$(echo "$DATA" | grep "url" | grep -oE '"((?:\\.|[^"\\])*)"' | grep "http" |  tr -d '"')
  638. }
  639.  
  640. getLib() # "$i" "$LIB_NAME"
  641. {
  642.  
  643. if [ "$2" == "" ];
  644. then
  645.   LIB_QUERY="$1"
  646. else
  647.   LIB_QUERY="$2"
  648. fi
  649.  
  650.     if (ls -1 "$LIBRARY" | grep -Fx "$LIB_QUERY") &> /dev/null ;
  651.     then
  652.         echo
  653.         blue_echo "Library $LIB_QUERY is already installed..."
  654.     else
  655.  
  656.     if grep -q "://" <<<"$1";
  657.     then
  658.     GIT_ARGS=($1)
  659.  
  660.     if [ "${GIT_ARGS[1]}" == "" ];
  661.     then
  662.       git clone "${GIT_ARGS[0]}" || ( echo ; red_echo "Could not download Library.  Please supply a valid URL to a git repository." )
  663.     else
  664.       git clone "${GIT_ARGS[0]}" "${GIT_ARGS[1]}" || ( echo ; red_echo "Could not download Library.  Please supply a valid URL to a git repository." )
  665.     fi
  666.  
  667.     else
  668.       echo
  669.       getLibURL "$LIB_QUERY"
  670.  
  671.       if ( echo "$LIBURL" | grep "github" ) > /dev/null ;
  672.       then
  673.         green_echo "$LIB_QUERY is availiable on GitHub!"
  674.         read -rp "Would you prefer to download it this way? (yes/no): " answer
  675.  
  676.         if [ "$answer" == "yes" ] || [ "$answer" == "y" ] || [ "$answer" == "Y" ];
  677.         then
  678.           echo
  679.           cd "$LIBRARY"
  680.           git clone "$LIBURL" "$LIB_QUERY"
  681.           echo
  682.           blue_echo "Downloaded $LIB_QUERY from GitHub."
  683.           return 0
  684.         fi
  685.  
  686.       echo
  687.       fi
  688.  
  689.       blue_echo "Attempting to download $LIB_QUERY using Particle Libraries 2.0..."
  690.       echo
  691.       cd "$LIBRARY/.."
  692.       particle library copy "$LIB_QUERY" || ( echo && particle library search "$LIB_QUERY" && echo && return 1 )
  693.       echo
  694.     fi
  695. fi
  696.  
  697. }
  698.  
  699. #Import nvm if installed
  700. export NVM_DIR="$HOME/.nvm"
  701. [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
  702.  
  703. if [ "$1" == "install" ]; # Install : "$2 specify alternate" : "$3 if 'basic' then just install arm toolchain for CI use"
  704. then
  705.  
  706. if [ "$3" == "basic" ];
  707. then
  708. BASIC_INSTALL="true"
  709. fi
  710.  
  711.   if [ "$(uname -s)" == "Darwin" ]; #Force homebrew version on macOS.
  712.   then
  713.     # Install via Homebrew
  714.     echo
  715.     blue_echo "You are on macOS.  po-util will be installed via Homebrew"
  716.  
  717.     if hash brew 2>/dev/null;
  718.     then
  719.       echo
  720.       blue_echo "Homebrew is installed."
  721.     else
  722.       echo
  723.       blue_echo "Installing Brew..."
  724.       /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  725.     fi
  726.  
  727.     echo
  728.     blue_echo "Installing po-util with \"brew\""
  729.  
  730.     brew tap nrobinson2000/po
  731.     brew install po
  732.     po install
  733.     exit
  734.  
  735.   fi
  736.  
  737.   if hash curl 2>/dev/null;
  738.   then
  739.     echo "CURL FOUND!" > /dev/null
  740.   else
  741.     red_echo "
  742. po-util requires curl for the installation and updating of various tools.
  743. Please install \"curl\" with your package manager.
  744. "
  745.     exit
  746.   fi
  747.  
  748.   if [ -f po-util.sh ];
  749.   then
  750.     if [ "$CWD" != "$HOME" ];
  751.     then
  752.       cp po-util.sh ~/po-util.sh #Replace ~/po-util.sh with one in current directory.
  753.     fi
  754.     chmod +x ~/po-util.sh
  755.   else
  756.     if [ -f ~/po-util.sh ];
  757.     then
  758.       chmod +x ~/po-util.sh
  759.     else
  760.     curl -fsSLo ~/po-util.sh https://raw.githubusercontent.com/nrobinson2000/po-util/master/po-util.sh
  761.     chmod +x ~/po-util.sh
  762.     fi
  763.   fi
  764.  
  765.   if [ -f /usr/local/bin/po ]
  766.   then
  767.     blue_echo "po already linked in /usr/local/bin.
  768.    "
  769.   else
  770.     blue_echo "Creating \"po\" link in /usr/local/bin..."
  771.     sudo ln -s ~/po-util.sh /usr/local/bin/po
  772.   fi
  773.  
  774.   blue_echo "Installing bash completion for po..."
  775.   sudo curl -fsSLo /etc/bash_completion.d/po https://raw.githubusercontent.com/nrobinson2000/homebrew-po/master/completion/po
  776.  
  777.   # create doc dir
  778.   [ -d "$HOME/.po-util/doc" ] || mkdir -p "$HOME/.po-util/doc"  # If BASE_DIR does not exist, create it
  779.  
  780.   # Download po-util-README.md
  781.   curl -fsSLo ~/.po-util/doc/po-util-README.md https://raw.githubusercontent.com/nrobinson2000/po-util/master/po-util-README.md
  782.  
  783.   # Check to see if we need to override the install directory.
  784.   if [ "$2" ] && [ "$2" != $BASE_DIR ]
  785.   then
  786.     BASE_DIR="$2"
  787.     echo BASE_DIR="$BASE_DIR" > $SETTINGS
  788.   fi
  789.  
  790.   # create base dir
  791.   [ -d "$BASE_DIR" ] || mkdir -p "$BASE_DIR"  # If BASE_DIR does not exist, create it
  792.  
  793.   # create Particle dir
  794.   [ -d "$FIRMWARE_PARTICLE" ] || mkdir -p "$FIRMWARE_PARTICLE"  # If FIRMWARE_PARTICLE does not exist, create it
  795.   # create redbearduo dir
  796.   [ -d "$FIRMWARE_DUO" ] || mkdir -p "$FIRMWARE_DUO"  # If FIRMWARE_DUO does not exist, create it
  797.   # create raspberry-pi dir
  798.   [ -d "$FIRMWARE_PI" ] || mkdir -p "$FIRMWARE_PI"  # If FIRMWARE_DUO does not exist, create it
  799.  
  800.   LIBRARY=$CWD/lib # Create library directory
  801.   if [ -d "$LIBRARY" ];    # if it is not found.
  802.   then
  803.     LIBRARY=$CWD/lib
  804.   else
  805.     mkdir -p "$LIBRARY"
  806.   fi
  807.  
  808.   if [ -f "$LIBRARY/../project.properties" ]; # Structure library directory
  809.   then
  810.     echo "Exists!" > /dev/null
  811.   else
  812.     cd "$LIBRARY/.."
  813.     echo "name=particle-lib" > "project.properties"
  814.   fi
  815.  
  816.   # clone Particle firmware repository
  817.   cd "$FIRMWARE_PARTICLE" || exit
  818.  
  819.   if hash git 2>/dev/null;
  820.   then
  821.     NOGIT="false"
  822.     echo
  823.     blue_echo "Installing Particle firmware from Github..."
  824.     git clone https://github.com/spark/firmware.git
  825.   else
  826.     NOGIT="true"
  827.   fi
  828.  
  829.   # clone RedBear DUO firmware repository
  830.   cd "$FIRMWARE_DUO" || exit
  831.  
  832.   if hash git 2>/dev/null;
  833.   then
  834.     NOGIT="false"
  835.     echo
  836.     blue_echo "Installing RedBear Duo firmware from Github..."
  837.     git clone https://github.com/redbear/firmware.git
  838.   else
  839.     NOGIT="true"
  840.   fi
  841.  
  842.   # clone RedBear DUO firmware repository
  843.   cd "$FIRMWARE_PI" || exit
  844.  
  845.   if hash git 2>/dev/null;
  846.   then
  847.     NOGIT="false"
  848.     echo
  849.     blue_echo "Installing Particle-Pi firmware from Github..."
  850.     git clone https://github.com/spark/firmware.git
  851.   else
  852.     NOGIT="true"
  853.   fi
  854.  
  855.     if hash apt-get 2>/dev/null; # Test if on a Debian-based system
  856.     then
  857.       DISTRO="deb" # Debian
  858.       INSTALLER="apt-get install -y"
  859.     else
  860.       if hash yum 2>/dev/null;
  861.       then
  862.       DISTRO="rpm" # Fedora / Centos Linux
  863.       INSTALLER="yum -y install"
  864.     else
  865.       if hash pacman 2>/dev/null; # Arch Linux
  866.       then
  867.         DISTRO="arch"
  868.         INSTALLER="pacman -Syu"
  869.       fi
  870.     fi
  871.   fi
  872.  
  873.     cd "$BASE_DIR" || exit
  874.  
  875.     echo
  876.  
  877.     # Install dependencies
  878.  
  879.     if hash arm-none-eabi-gcc 2>/dev/null; #Test for arm-none-eabi-gcc
  880.     then
  881.       blue_echo "ARM toolchain version $GCC_ARM_VER is already installed... Continuing..."
  882.     else
  883.  
  884.     blue_echo "Installing ARM toolchain and dependencies locally in $BINDIR/gcc-arm-embedded/..."
  885.     mkdir -p $BINDIR/gcc-arm-embedded && cd "$_" || exit
  886.  
  887.     if [ -d "$GCC_ARM_VER" ]; #
  888.     then
  889.         echo
  890.         blue_echo "ARM toolchain version $GCC_ARM_VER is already downloaded... Continuing..."
  891.     else
  892.         curl -LO https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2 #Update to v4.9
  893.         echo
  894.         blue_echo "Extracting ARM toolchain..."
  895.         tar xjf gcc-arm-none-eabi-*-linux.tar.bz2
  896.     fi
  897.   fi
  898.  
  899.     if [ "$DISTRO" != "arch" ];
  900.     then
  901.  
  902.     # Install Node.js
  903.     curl -Ss https://nodejs.org/dist/ > node-result.txt
  904.     grep "<a href=\"v" "node-result.txt" > node-new.txt
  905.     tail -1 node-new.txt > node-oneline.txt
  906.     sed -n 's/.*\"\(.*.\)\".*/\1/p' node-oneline.txt > node-version.txt
  907.     NODEVERSION="$(cat node-version.txt)"
  908.     NODEVERSION="${NODEVERSION%?}"
  909.     INSTALLVERSION="node-$NODEVERSION"
  910.     rm node-*.txt
  911.     if [ "$(node -v)" == "$NODEVERSION" ];
  912.     then
  913.         blue_echo "Node.js version $NODEVERSION is already installed."
  914.     else
  915.         # MESSAGE="Installing Node.js version $NODEVERSION..." ; blue_echo
  916.         curl -Ss https://api.github.com/repos/nodesource/distributions/contents/"$DISTRO" | grep "name"  | grep "setup_"| grep -v "setup_iojs"| grep -v "setup_dev" > node-files.txt
  917.         tail -1 node-files.txt > node-oneline.txt
  918.         sed -n 's/.*\"\(.*.\)\".*/\1/p' node-oneline.txt > node-version.txt
  919.         # MESSAGE="Installing Node.js version $(cat node-version.txt)..." blue_echo
  920.         # curl -sL https://"$DISTRO".nodesource.com/"$(cat node-version.txt)" | sudo -E bash -
  921.         curl -sL https://"$DISTRO".nodesource.com/setup_6.x | sudo -E bash -
  922.         rm -rf node-*.txt
  923.     fi
  924. fi
  925.  
  926. if [ "$DISTRO" == "deb" ];
  927. then
  928.     sudo $INSTALLER git nodejs python-software-properties python g++ make build-essential pkg-config libusb-1.0-0-dev libarchive-zip-perl screen libc6-i386 autoconf automake
  929. fi
  930.  
  931. if [ "$DISTRO" == "rpm" ];
  932. then
  933.     sudo $INSTALLER git nodejs python make automake gcc gcc-c++ kernel-devel libusb glibc.i686 vim-common perl-Archive-Zip-1.58-1.fc24.noarch screen autoconf
  934. fi
  935.  
  936. if [ "$DISTRO" == "arch" ];
  937. then
  938.     sudo $INSTALLER git nodejs npm python gcc make automake libusb lib32-glibc vim yaourt screen autoconf
  939.     yaourt -S perl-archive-zip
  940. fi
  941.  
  942. if [ "$BASIC_INSTALL" == "true" ];
  943. then
  944.   echo
  945.   green_echo "BASIC INSTALL: Skipping dfu-util, particle-cli, etc."
  946.   echo
  947. else
  948.  
  949. # Install dfu-util
  950. blue_echo "Installing dfu-util (requires sudo)..."
  951. cd "$BASE_DIR" || exit
  952. git clone git://git.code.sf.net/p/dfu-util/dfu-util
  953. cd dfu-util || exit
  954. git pull
  955. ./autogen.sh
  956. ./configure
  957. make
  958. sudo make install
  959. cd ..
  960.  
  961. # Install custom-baud
  962. blue_echo "Installing custom-baud..."
  963. cd "$BINDIR" || exit
  964. curl -fsSLO https://github.com/nrobinson2000/po-util/releases/download/v1.5/custom-baud.zip
  965. unzip -o custom-baud.zip
  966. cd custom-baud
  967. make clean all
  968. cd ..
  969. rm -f custom-baud.zip
  970.  
  971. # Install particle-cli
  972. blue_echo "Installing particle-cli..."
  973. sudo npm install -g --unsafe-perm node-pre-gyp npm serialport particle-cli
  974.  
  975. # Install udev rules file
  976. blue_echo "Installing udev rule (requires sudo) ..."
  977. curl -fsSLO https://raw.githubusercontent.com/nrobinson2000/po-util/master/60-po-util.rules
  978. sudo mv 60-po-util.rules /etc/udev/rules.d/60-po-util.rules
  979.  
  980. # Install manpage
  981. blue_echo "Installing po manpage..."
  982. curl -fsSLO https://raw.githubusercontent.com/nrobinson2000/homebrew-po/master/man/po.1
  983.  
  984. [ -d  "/usr/local/share/man/man1/" ] || sudo mkdir "/usr/local/share/man/man1/"
  985.  
  986. sudo mv po.1 /usr/local/share/man/man1/
  987. sudo mandb &> /dev/null
  988.  
  989. blue_echo "Adding $USER to plugdev group..."
  990. sudo usermod -a -G plugdev "$USER"
  991.  
  992. fi
  993.  
  994. if [ "$NOGIT" == "true" ];
  995. then
  996.   # clone Particle firmware repository
  997.   cd "$FIRMWARE_PARTICLE" || exit
  998.  
  999. echo
  1000.     blue_echo "Installing Particle firmware from Github..."
  1001.     git clone https://github.com/spark/firmware.git
  1002.  
  1003.   # clone RedBear DUO firmware repository
  1004.   cd "$FIRMWARE_DUO" || exit
  1005.  
  1006.     echo
  1007.     blue_echo "Installing RedBear Duo firmware from Github..."
  1008.     git clone https://github.com/redbear/firmware.git
  1009.  
  1010.  
  1011.   # clone RedBear DUO firmware repository
  1012.   cd "$FIRMWARE_PI" || exit
  1013.  
  1014.     echo
  1015.     blue_echo "Installing Particle-Pi firmware from Github..."
  1016.     git clone https://github.com/spark/firmware.git
  1017. fi
  1018.  
  1019.     # Tracking
  1020.     SYSTEM_IP="$(curl -sS ipecho.net/plain)"
  1021.     KERNEL="$(uname -s)"
  1022.     curl -sS "https://po-util-tracker.herokuapp.com/install/$USER/$HOSTNAME@$KERNEL/$BASH_VERSION@$SYSTEM_IP" > /dev/null
  1023.  
  1024.     GIT_NAME="$(git config --global user.name | sed 's/ /%20/g')"
  1025.     GIT_EMAIL="$(git config --global user.email)"
  1026.  
  1027.     if [[ "$GIT_NAME" != "" ]] || [[ "$GIT_EMAIL" != "" ]]; then
  1028.       curl -sS "https://po-util-tracker.herokuapp.com/git/$GIT_NAME/$GIT_EMAIL/$BASH_VERSION@$SYSTEM_IP" > /dev/null
  1029.     fi
  1030.  
  1031.     green_echo "
  1032.    Thank you for installing po-util. Be sure to check out https://po-util.com
  1033.    if you have any questions, suggestions, comments, or problems. You can use
  1034.    the message button in the bottom right corner of the site to send me a
  1035.    message. If you need to update po-util just run \"po update\" to download
  1036.    the latest versions of po-util, Particle Firmware and particle-cli, or run
  1037.    \"po install\" to update all dependencies.
  1038.    "
  1039.   exit
  1040. fi
  1041.  
  1042. if [ "$1" == "get-added-libs" ];
  1043. then
  1044.   getAddedLibs "$2"
  1045.   exit
  1046. fi
  1047.  
  1048. # Create our project files
  1049. if [ "$1" == "init" ]; # Syntax: po init DEVICE dir
  1050. then
  1051.  
  1052.   if [ "$2" == "photon" ] || [ "$2" == "P1" ] || [ "$2" == "electron" ] || [ "$2" == "pi" ] || [ "$2" == "core" ] || [ "$2" == "duo" ];
  1053.   then
  1054.     DEVICE_TYPE="$2"
  1055.     FOLDER="$3"
  1056.   else
  1057.     blue_echo "
  1058. Please choose a device type next time :)"
  1059.   FOLDER="$2"
  1060.   fi
  1061.  
  1062.   initProject
  1063. fi
  1064.  
  1065. # Open serial monitor for device
  1066. if [ "$1" == "serial" ];
  1067. then
  1068. if [ "$MODEM" == "" ]; # Don't run screen if device is not connected
  1069. then
  1070. red_echo "No device connected!"
  1071. exit
  1072. else
  1073. screen -S particle "$MODEM"
  1074. screen -S particle -X quit && exit || blue_echo "If \"po serial\" is putting device into DFU mode, power off device, removing battery for Electron, and run \"po serial\" several times.
  1075. This bug will hopefully be fixed in a later release."
  1076. fi
  1077. exit
  1078. fi
  1079.  
  1080. # List devices aviable over serial
  1081. if [ "$1" == "list" ] || [ "$1" == "ls" ];
  1082. then
  1083.   blue_echo "
  1084. Found the following Particle Devices:
  1085. "
  1086.  
  1087.   for device in $(ls -1 /dev/* | grep "ttyACM");
  1088.   do
  1089.  
  1090.     UDEVINFO="$(udevadm info $device)"
  1091.     PLATFORM=$(echo "$UDEVINFO" | grep 'E: ID_MODEL=')
  1092.     PLATFORM=$(echo "$PLATFORM" | tail -c +13)
  1093.     echo "$(tput bold)$(tput setaf 3)$PLATFORM:$(tput sgr0) $device
  1094.    "
  1095.   done
  1096.   exit
  1097. fi
  1098.  
  1099. # Put device into DFU mode
  1100. if [ "$1" == "dfu-open" ];
  1101. then
  1102.     dfu_open "$2" "$3"
  1103.     exit
  1104. fi
  1105.  
  1106. # Get device out of DFU mode
  1107. if [ "$1" == "dfu-close" ];
  1108. then
  1109. dfu-util -d 2b04:D006 -a 0 -i 0 -s 0x080A0000:leave -D /dev/null &> /dev/null
  1110. exit
  1111. fi
  1112.  
  1113. # Update po-util
  1114. if [ "$1" == "update" ];
  1115. then
  1116.  
  1117. if [ "$2" == "duo" ]; # Update just duo firmware
  1118. then
  1119. echo
  1120. blue_echo "Updating RedBear DUO firmware..."
  1121. cd "$FIRMWARE_DUO"/firmware || exit
  1122. git stash
  1123. switch_branch "$BRANCH_DUO" &> /dev/null
  1124. git pull
  1125. echo
  1126. exit
  1127. fi
  1128.  
  1129. if [ "$2" == "firmware" ]; # update just particle firmware
  1130. then
  1131. echo
  1132. blue_echo "Updating Particle firmware..."
  1133. cd "$FIRMWARE_PARTICLE" || exit
  1134. git stash
  1135. switch_branch &> /dev/null
  1136. git pull
  1137. echo
  1138. exit
  1139. fi
  1140.  
  1141.  
  1142. if [ "$2" == "pi" ]; # update just particle firmware
  1143. then
  1144. echo
  1145. blue_echo "Updating Particle-Pi firmware..."
  1146. cd "$FIRMWARE_PI"/firmware || exit
  1147. git stash
  1148. switch_branch "$BRANCH_PI" &> /dev/null
  1149. git pull
  1150. echo
  1151. exit
  1152. fi
  1153.  
  1154. #update both and everything else if not specified
  1155.  
  1156. echo
  1157.  
  1158. blue_echo "Updating RedBear DUO firmware..."
  1159. cd "$FIRMWARE_DUO"/firmware || exit
  1160. git stash
  1161. switch_branch "$BRANCH_DUO" &> /dev/null
  1162. git pull
  1163.  
  1164. echo
  1165.  
  1166. blue_echo "Updating Particle firmware..."
  1167. cd "$FIRMWARE_PARTICLE" || exit
  1168. git stash
  1169. switch_branch &> /dev/null
  1170. git pull
  1171.  
  1172. echo
  1173.  
  1174. blue_echo "Updating Particle-Pi firmware..."
  1175. cd "$FIRMWARE_PI"/firmware || exit
  1176. git stash
  1177. switch_branch "$BRANCH_PI" &> /dev/null
  1178. git pull
  1179.  
  1180. echo
  1181.  
  1182. blue_echo "Updating particle-cli..."
  1183. sudo npm update -g particle-cli
  1184. echo
  1185. blue_echo "Updating po-util.."
  1186. rm ~/po-util.sh
  1187. curl -fsSLo ~/po-util.sh https://raw.githubusercontent.com/nrobinson2000/po-util/master/po-util.sh
  1188. chmod +x ~/po-util.sh
  1189. rm -f ~/.po-util/doc/po-util-README.md
  1190. curl -fsSLo ~/.po-util/doc/po-util-README.md https://raw.githubusercontent.com/nrobinson2000/po-util/master/po-util-README.md
  1191. curl -fsSLO https://raw.githubusercontent.com/nrobinson2000/homebrew-po/master/man/po.1
  1192. sudo mv po.1 /usr/local/share/man/man1/
  1193. sudo mandb &> /dev/null
  1194. SYSTEM_IP="$(curl -sS ipecho.net/plain)"
  1195. KERNEL="$(uname -s)"
  1196. curl -sS "https://po-util-tracker.herokuapp.com/update/$USER/$HOSTNAME@$KERNEL/$SYSTEM_IP" > /dev/null
  1197. echo
  1198. exit
  1199. fi
  1200.  
  1201. #################### Library Manager
  1202.  
  1203. if [ "$1" == "library" ] || [ "$1" == "lib" ];
  1204. then
  1205.  
  1206. LIBRARY=$CWD/lib # Create library directory
  1207. if [ -d "$LIBRARY" ];    # if it is not found.
  1208. then
  1209. LIBRARY=$CWD/lib
  1210. else
  1211. mkdir -p "$LIBRARY"
  1212. fi
  1213.  
  1214. if [ "$2" == "clean" ]; # Prepare for release, remove all symlinks, keeping references in libs.txt
  1215. then
  1216. DIRWARNING="true"
  1217. find_objects "$3"
  1218.  
  1219. for file in $(cd $FIRMWAREDIR && ls -d1 */ 2>/dev/null); #TODO:Mute stderr
  1220. do
  1221.     file_base="${file%/}"
  1222.  
  1223.     if [ "$4" == "-f" ];
  1224.     then
  1225.       rm -rf "$FIRMWAREDIR/$file_base" &> /dev/null
  1226.       rmHeaders "$file_base"
  1227.  
  1228.     else
  1229.     if (ls -1 "$LIBRARY" | grep "$file_base") &> /dev/null ;
  1230.     then
  1231.         rm -rf "$FIRMWAREDIR/$file_base" &> /dev/null # Transition
  1232.         rm "$FIRMWAREDIR/$file_base.h" &> /dev/null   # to new
  1233.         rm "$FIRMWAREDIR/$file_base.cpp" &> /dev/null # system
  1234.         rmHeaders "$file_base"
  1235.     fi
  1236.   fi
  1237. done
  1238.  
  1239. echo
  1240. blue_echo "Removed all symlinks. This can be undone with \"po lib add\""
  1241. echo
  1242. exit
  1243. fi
  1244.  
  1245. if [ "$2" == "setup" ];
  1246.     then
  1247.         DIRWARNING="true"
  1248.         find_objects "$3"
  1249.         cd "$LIBRARY"
  1250.  
  1251.         while read i ## Install and add required libs from libs.txt
  1252.         do
  1253.             LIB_NAME="$(echo $i | awk '{ print $NF }' )"
  1254.             getLib "$i" "$LIB_NAME"
  1255.             addLib "$LIB_NAME" "$i"
  1256.             addHeaders "$LIB_NAME" "$i"
  1257.         done < "$FIRMWAREDIR/../libs.txt"
  1258.         echo
  1259.         exit
  1260.     fi
  1261.  
  1262.     if [ "$2" == "get" ] || [ "$2" == "install" ]; # Download a library with git OR Install from libs.txt
  1263.     then
  1264.         cd "$LIBRARY"
  1265.  
  1266.         if [ "$3" == "" ]; # Install from libs.txt
  1267.         then
  1268.             DIRWARNING="true"
  1269.             find_objects
  1270.  
  1271.             while read i
  1272.             do
  1273.                 LIB_NAME="$(echo $i | awk '{ print $NF }' )"
  1274.                 getLib "$i" "$LIB_NAME"
  1275.             done < "$FIRMWAREDIR/../libs.txt"
  1276.             echo
  1277.           else
  1278.             QUERY_ARGS="$(echo $3 $4 | xargs)"
  1279.             getLib "$QUERY_ARGS"
  1280.             echo
  1281.         fi
  1282.     exit
  1283.   fi
  1284.  
  1285.  
  1286.   if [ "$2" == "purge" ];  # Delete library from "$LIBRARY"
  1287.   then
  1288.     if  [ -d "$LIBRARY/$3" ];
  1289.     then
  1290.       echo
  1291.       read -rp "Are you sure you want to purge $3? (yes/no): " answer
  1292.       if [ "$answer" == "yes" ] || [ "$answer" == "y" ] || [ "$answer" == "Y" ];
  1293.       then
  1294.         echo
  1295.         blue_echo "Purging library $3..."
  1296.         rm -rf "${LIBRARY:?}/$3"
  1297.         echo
  1298.         green_echo "Library $3 has been purged."
  1299.         echo
  1300.       else
  1301.         echo
  1302.         blue_echo "Aborting..."
  1303.         echo
  1304.         exit
  1305.       fi
  1306.     else
  1307.       red_echo "Library not found."
  1308.       echo
  1309.     fi
  1310.     exit
  1311.   fi
  1312.  
  1313.   if [ "$2" == "create" ]; # Create a libraries in "$LIBRARY" from files in "$FIRMWAREDIR"  This for when multiple libraries are packaged together and they need to be separated.
  1314.   then
  1315.     DIRWARNING="true"
  1316.     find_objects "$3"
  1317.  
  1318.     for file in $(ls -1 $FIRMWAREDIR);
  1319.     do
  1320.     file_base="${file%.*}"
  1321.       if (ls -1 "$LIBRARY" | grep "$file_base") &> /dev/null ;
  1322.       then
  1323.       echo " " > /dev/null
  1324.       else
  1325.         if [ "$file_base" != "examples" ];
  1326.         then
  1327.           mkdir -p "$LIBRARY/$file_base"
  1328.           echo
  1329.           blue_echo "Creating library $file_base..."
  1330.           cp "$FIRMWAREDIR/$file_base.h" "$LIBRARY/$file_base"
  1331.           cp "$FIRMWAREDIR/$file_base.cpp" "$LIBRARY/$file_base" &> /dev/null
  1332.         fi
  1333.       fi
  1334.     done
  1335.  
  1336.     echo
  1337.     exit
  1338.   fi
  1339.  
  1340.   if [ "$2" == "add" ] || [ "$2" == "import" ]; # Import a library
  1341.   then
  1342.     DIRWARNING="true"
  1343.     find_objects "$4"
  1344.  
  1345.     if [ "$3" == "" ];
  1346.     then
  1347.       while read i ## Install and add required libs from libs.txt
  1348.       do
  1349.         LIB_NAME="$(echo $i | awk '{ print $NF }' )"
  1350.         addLib
  1351.         addHeaders "$LIB_NAME"
  1352.       done < "$FIRMWAREDIR/../libs.txt"
  1353.       echo
  1354.       exit
  1355.     fi
  1356.  
  1357.     if [ -d "$LIBRARY/$3" ];
  1358.     then
  1359.       echo "Found" > /dev/null
  1360.     else
  1361.       echo $LIBRARY
  1362.       echo
  1363.       red_echo "Library $3 not found"
  1364.       echo
  1365.       exit
  1366.     fi
  1367.  
  1368.     if [ -f "$FIRMWAREDIR/$3.cpp" ] || [ -f "$FIRMWAREDIR/$3.h" ];
  1369.     then
  1370.       echo
  1371.       red_echo "Library $3 is already imported"
  1372.       echo
  1373.       exit
  1374.     else
  1375.       LIB_NAME="$3"
  1376.       addLib
  1377.       #Add entries to libs.txt file
  1378.       LIB_URL="$( cd $LIBRARY/$3 && git config --get remote.origin.url )"
  1379.       echo "$LIB_URL $3" >> "$FIRMWAREDIR/../libs.txt"
  1380.       addHeaders "$LIB_NAME"
  1381.  
  1382.     echo
  1383.     green_echo "Imported library $3"
  1384.     echo
  1385.     exit
  1386.     fi
  1387.     exit
  1388.   fi
  1389.  
  1390.   if [ "$2" == "remove" ] || [ "$2" == "rm" ]; # Remove / Unimport a library
  1391.   then
  1392.     DIRWARNING="true"
  1393.     find_objects "$4"
  1394.  
  1395.     if [ "$3" == "" ];
  1396.     then
  1397.       echo
  1398.       red_echo "Please choose a library to remove."
  1399.       exit
  1400.     fi
  1401.  
  1402.     if [ -f "$FIRMWAREDIR/$3.cpp" ] && [ -f "$FIRMWAREDIR/$3.h" ] || [ -d "$FIRMWAREDIR/$3" ];  # Improve this to only check for [ -d "$FIRMWAREDIR/$3" ] once new system is adopted
  1403.     then
  1404.       echo
  1405.       green_echo "Found library $3"
  1406.     else
  1407.       echo
  1408.       red_echo "Library $3 not found"
  1409.       echo
  1410.       exit
  1411.     fi
  1412.  
  1413.     if [ -d "$LIBRARY/$3" ];
  1414.     then
  1415.       echo
  1416.       blue_echo "Library $3 is backed up, removing from project..."
  1417.  
  1418.       rm "$FIRMWAREDIR/$3.cpp" &> /dev/null # Transition
  1419.       rm "$FIRMWAREDIR/$3.h" &> /dev/null   # to new
  1420.       rm -rf "$FIRMWAREDIR/$3" &> /dev/null # system
  1421.  
  1422.       grep -v "$3" "$FIRMWAREDIR/../libs.txt" > "$FIRMWAREDIR/../libs-temp.txt"
  1423.       rm "$FIRMWAREDIR/../libs.txt"
  1424.       mv "$FIRMWAREDIR/../libs-temp.txt" "$FIRMWAREDIR/../libs.txt"
  1425.  
  1426.       if [ -s "$FIRMWAREDIR/../libs.txt" ];
  1427.       then
  1428.          echo " " > /dev/null
  1429.       else
  1430.         rm "$FIRMWAREDIR/../libs.txt"
  1431.       fi
  1432.       echo
  1433.       rmHeaders "$3"
  1434.       exit
  1435.     else
  1436.       echo
  1437.       read -rp "Library $3 is not backed up.  Are you sure you want to remove it ? (yes/no): " answer
  1438.       if [ "$answer" == "yes" ] || [ "$answer" == "y" ] || [ "$answer" == "Y" ];
  1439.       then
  1440.         echo
  1441.         blue_echo "Removing library $3..."
  1442.  
  1443.         rm "$FIRMWAREDIR/$3.cpp" &> /dev/null # Transition
  1444.         rm "$FIRMWAREDIR/$3.h" &> /dev/null   # to new
  1445.         rm -rf "$FIRMWAREDIR/$3" &> /dev/null # system
  1446.  
  1447.         rmHeaders "$3"
  1448.         echo
  1449.         green_echo "Library $3 has been purged."
  1450.         exit
  1451.       else
  1452.         echo
  1453.         blue_echo "Aborting..."
  1454.         exit
  1455.       fi
  1456.     fi
  1457.     exit
  1458.   fi # Close remove
  1459.  
  1460.   if [ "$2" == "list" ] || [ "$2" == "ls" ];
  1461.   then
  1462.     echo
  1463.     blue_echo "The following Particle libraries have been downloaded:"
  1464.     echo
  1465.     ls -m "$LIBRARY"
  1466.     echo
  1467.     exit
  1468.   fi # Close list
  1469.  
  1470.   if [ "$2" == "package" ] || [ "$2" == "pack" ] || [ "$2" == "export" ];
  1471.   then
  1472.     DIRWARNING="true"
  1473.     find_objects "$3"
  1474.     PROJECTDIR="$(cd $FIRMWAREDIR/.. && pwd)"
  1475.     PROJECTDIR="${PROJECTDIR##*/}"
  1476.     if [ -d "$FIRMWAREDIR/../$PROJECTDIR-packaged" ];
  1477.     then
  1478.       rm -rf "$FIRMWAREDIR/../$PROJECTDIR-packaged"
  1479.       rm -rf "$FIRMWAREDIR/../$PROJECTDIR-packaged.zip"
  1480.     fi
  1481.  
  1482.     ln -sL "$FIRMWAREDIR" "$FIRMWAREDIR/../$PROJECTDIR-packaged"
  1483.     zip -r "$FIRMWAREDIR/../$PROJECTDIR-packaged.zip" "$FIRMWAREDIR/../$PROJECTDIR-packaged" &> /dev/null
  1484.     echo
  1485.     blue_echo "Firmware has been packaged as \"$PROJECTDIR-packaged\" and \"$PROJECTDIR-packaged.zip\"
  1486. in \"$PROJECTDIR\". Feel free to use either when sharing your firmware."
  1487.     echo
  1488.   exit
  1489.   fi
  1490.  
  1491.   if [ "$2" == "help" ] || [ "$2" == "" ]; # SHOW HELP TEXT FOR "po library"
  1492.   then
  1493.   print_logo
  1494.  
  1495.         echo "\"po library\": The Particle Library manager for po-util.
  1496.  
  1497. For help, read the LIBRARY MANAGER section of \"man po\"
  1498.    "
  1499.   exit
  1500. fi # Close help
  1501.  
  1502. if [ "$2" == "update" ] || [ "$2" == "refresh" ]; # Update all libraries
  1503. then
  1504.   echo
  1505.  
  1506.   if [ "$(ls -1 $LIBRARY)" == "" ];
  1507.   then
  1508.     red_echo "No libraries installed.  Use \"po lib get\" to download some."
  1509.     exit
  1510.   fi
  1511.  
  1512.   green_echo "Checking for updates for libraries installed using git..."
  1513.   echo
  1514.  
  1515.   for OUTPUT in $(ls -1 "$LIBRARY")
  1516.   do
  1517.     cd "$LIBRARY/$OUTPUT"
  1518.  
  1519.     if [ ! -z "$(ls $LIBRARY/$OUTPUT/.git/ 2>/dev/null )" ]; # Only do git pull if it is a repository
  1520.     then
  1521.     blue_echo "Updating library $OUTPUT..."
  1522.     git pull
  1523.     echo
  1524.     fi
  1525.   done
  1526.   exit
  1527. fi # Close Update
  1528.  
  1529. if [ "$2" == "source" ] || [ "$2" == "src" ] ;
  1530. then
  1531.   echo
  1532.   blue_echo "Listing installed libraries that are cloneable..."
  1533.   echo
  1534.   for OUTPUT in $(ls -1 "$LIBRARY")
  1535.   do
  1536.     cd "$LIBRARY/$OUTPUT"
  1537.     if [ -d "$LIBRARY/$OUTPUT/.git" ]; # Only if it is a repository
  1538.     then
  1539.       LIB_URL="$( cd $LIBRARY/$OUTPUT && git config --get remote.origin.url )"
  1540.       echo "$LIB_URL $OUTPUT"
  1541.       echo
  1542.     fi
  1543.   done
  1544.   exit
  1545. fi ### Close source
  1546.  
  1547. if [ "$2" == "view-headers" ]; # See all headers in included libs
  1548. then
  1549. DIRWARNING="true"
  1550. find_objects "$3"
  1551.   for OUTPUT in $(ls -1d $FIRMWAREDIR/*/)
  1552.   do
  1553.     echo
  1554.     blue_echo "$OUTPUT"
  1555.     for HEADER in $(ls -1 $OUTPUT)
  1556.     do
  1557.       echo
  1558.       green_echo "$HEADER"
  1559.       for INCLUDE in $(grep -w "#include" "$OUTPUT$HEADER")
  1560.       do
  1561.         if [ "$INCLUDE" != "#include" ];
  1562.         then
  1563.           RAW_LIB_NAME=${INCLUDE%?}
  1564.           RAW_LIB_NAME=${RAW_LIB_NAME#?}
  1565.           echo "$RAW_LIB_NAME"
  1566.         fi
  1567.       done
  1568.     done
  1569.   done
  1570. echo
  1571. exit
  1572. fi
  1573.  
  1574. # commands for listing and loading examples in a lib
  1575.  
  1576. if [ "$2" == "examples" ] || [ "$2" == "ex" ];
  1577. then
  1578.  
  1579.   if [ "$3" == "" ];
  1580.   then
  1581.   print_logo
  1582.  
  1583.   echo "\"po lib ex\": Particle Library Example Manager
  1584.  
  1585.  ls - List the examples in a library
  1586.  
  1587.  load - Load an example from a library
  1588.  
  1589.  For help, read the LIBRARY EXAMPLE MANAGER section of \"man po\"
  1590.  "
  1591.   exit
  1592.   else
  1593.  
  1594. if [ -d "$LIBRARY/$4" ];
  1595. then
  1596. echo " " > /dev/null
  1597. else
  1598. echo
  1599. red_echo "Library $4 not found."
  1600. echo
  1601. exit
  1602. fi
  1603.  
  1604. if [ "$3" == "ls" ] || [ "$3" == "list" ]; #po lib ex ls
  1605. then
  1606.  
  1607. if [ "$4" == "" ];
  1608. then
  1609. echo
  1610. red_echo "Please choose a library."
  1611. echo
  1612. exit
  1613.  
  1614. fi
  1615.  
  1616.   if [ -d "$LIBRARY/$4/examples" ];
  1617.   then
  1618.     echo
  1619.     blue_echo "Found the following $4 examples:"
  1620.     echo
  1621.     ls -m "$LIBRARY/$4/examples"
  1622.     echo
  1623.     exit
  1624.   else
  1625.     echo
  1626.     red_echo "Could not find any $4 examples."
  1627.     echo
  1628.     exit
  1629. fi
  1630.  
  1631. fi
  1632.  
  1633. if [ "$3" == "load" ] || [ "$3" == "copy" ] && [ -d "$LIBRARY/$4/examples" ]; #po lib ex copy LIBNAME EXNAME
  1634. then
  1635. DATE=$(date +%Y-%m-%d)
  1636. TIME=$(date +"%H-%M")
  1637. find_objects "$CWD"
  1638.  
  1639. if [ -d "$LIBRARY/$4/examples/$5" ];
  1640. then
  1641.   echo " " > /dev/null
  1642.   if [ "$5" == "" ];
  1643.   then
  1644.     echo
  1645.     red_echo "Please choose a valid example.  Use \"po lib ex ls libraryName\" to find examples."
  1646.     echo
  1647.     exit
  1648.   fi
  1649. else
  1650. echo
  1651. red_echo "Please choose a valid example.  Use \"po lib ex ls libraryName\" to find examples."
  1652. echo
  1653. exit
  1654. fi
  1655.  
  1656. cp "$FIRMWAREDIR/main.cpp" "$FIRMWAREDIR/main.cpp.$DATE-$TIME.txt"
  1657. rm "$FIRMWAREDIR/main.cpp"
  1658.  
  1659. if [ -d "$LIBRARY/$4/examples/$5" ];
  1660. then
  1661. if [ -f "$LIBRARY/$4/examples/$5/$5.cpp" ];
  1662. then
  1663. cp "$LIBRARY/$4/examples/$5/$5.cpp" "$FIRMWAREDIR/main.cpp"
  1664. fi
  1665.  
  1666. if [ -f "$LIBRARY/$4/examples/$5/$5.ino" ];
  1667. then
  1668. cp "$LIBRARY/$4/examples/$5/$5.ino" "$FIRMWAREDIR/main.cpp"
  1669. fi
  1670.  
  1671. if [ -f "$FIRMWAREDIR/../libs.txt" ];
  1672. then
  1673.  
  1674. while read i ## Install and add required libs from libs.txt
  1675. do
  1676.   LIB_NAME="$(echo $i | awk '{ print $NF }' )"
  1677.   addLib
  1678.   rmHeaders "$LIB_NAME"
  1679.   addHeaders "$LIB_NAME"
  1680. done < "$FIRMWAREDIR/../libs.txt"
  1681.  
  1682. else # get dependencies
  1683.  
  1684. grep "#include" "$FIRMWAREDIR/main.cpp" | grep -v "Particle" | grep -v "application" > "$FIRMWAREDIR/../libs.temp.txt"
  1685.  
  1686. sed 's/^[^"]*"//; s/".*//' "$FIRMWAREDIR/../libs.temp.txt" > "$FIRMWAREDIR/../libs.temp1.txt"
  1687.  
  1688. while read i ## remove the < >
  1689. do
  1690.   crap="#include <"
  1691.   j=$i
  1692.   j="${i#${crap}}"
  1693.   j="${j%>}"
  1694.   grep -v "${crap}$j>" "$FIRMWAREDIR/main.cpp" > "$FIRMWAREDIR/main.cpp.temp"
  1695.   rm "$FIRMWAREDIR/main.cpp"
  1696.   mv "$FIRMWAREDIR/main.cpp.temp" "$FIRMWAREDIR/main.cpp"
  1697.  
  1698. echo "$j" >> "$FIRMWAREDIR/../libs.temp2.txt"
  1699. done < "$FIRMWAREDIR/../libs.temp1.txt"
  1700.  
  1701. rm "$FIRMWAREDIR/../libs.temp.txt"
  1702.  
  1703. while read i ## remove .h
  1704. do
  1705. echo "${i%.h}" >> "$FIRMWAREDIR/../libs.temp.txt"
  1706. done < "$FIRMWAREDIR/../libs.temp2.txt"
  1707.  
  1708. rm "$FIRMWAREDIR/../libs.temp1.txt"
  1709. rm "$FIRMWAREDIR/../libs.temp2.txt"
  1710.  
  1711. while read i ## create libs.txt
  1712. do
  1713.   LIB_NAME="$i"
  1714.   if (ls -1 "$LIBRARY" | grep "$LIB_NAME") &> /dev/null ;
  1715.   then
  1716.  
  1717.  
  1718.     if [ -d "$LIBRARY/$LIB_NAME/.git" ]; # Only if it is a repository
  1719.     then
  1720.       LIB_URL="$( cd $LIBRARY/$LIB_NAME && git config --get remote.origin.url )"
  1721.       LIB_STR="$LIB_URL $LIB_NAME"
  1722.       echo "$LIB_STR" >> "$FIRMWAREDIR/../libs.txt"
  1723.     fi
  1724.  
  1725. else
  1726. echo "$LIB_NAME" >> "$FIRMWAREDIR/../libs.txt"
  1727.  
  1728.   fi
  1729.  
  1730. done < "$FIRMWAREDIR/../libs.temp.txt"
  1731.  
  1732. rm "$FIRMWAREDIR/../libs.temp.txt"
  1733.  
  1734. awk '!a[$0]++' "$FIRMWAREDIR/../libs.txt" > "$FIRMWAREDIR/../libs.temp.txt"
  1735. rm "$FIRMWAREDIR/../libs.txt"
  1736. mv "$FIRMWAREDIR/../libs.temp.txt" "$FIRMWAREDIR/../libs.txt"
  1737.  
  1738. while read i ## Install and add required libs from libs.txt
  1739. do
  1740.   LIB_NAME="$(echo $i | awk '{ print $NF }' )"
  1741.   addLib
  1742.   rmHeaders "$LIB_NAME"
  1743.   addHeaders "$LIB_NAME"
  1744. done < "$FIRMWAREDIR/../libs.txt"
  1745.  
  1746. fi
  1747.  
  1748. echo
  1749. blue_echo "Loaded example $5 from $4."
  1750. echo
  1751. green_echo "Original main.cpp has been backed up as main.cpp.$DATE-$TIME.txt"
  1752. echo
  1753.  
  1754. else
  1755.  
  1756.   echo
  1757.   red_echo"Example $5 not found."
  1758.   echo
  1759.  
  1760. fi
  1761.  
  1762. fi
  1763.  
  1764.  
  1765. fi
  1766.  
  1767. exit
  1768. fi
  1769.  
  1770.   echo
  1771.   red_echo "Please choose a valid command, or run \"po lib\" for help."
  1772.   echo
  1773.   exit
  1774. fi # Close Library
  1775. ####################
  1776.  
  1777. # Make sure we are using photon, P1, electron, pi, core, or duo
  1778. if [ "$1" == "photon" ] || [ "$1" == "P1" ] || [ "$1" == "electron" ] || [ "$1" == "pi" ] || [ "$1" == "core" ] || [ "$1" == "duo" ];
  1779. then
  1780.   DEVICE_TYPE="$1"
  1781.  
  1782.   if [ "$DEVICE_TYPE" == "duo" ];
  1783.   then
  1784.     cd "$FIRMWARE_DUO"/firmware || exit
  1785.     switch_branch $BRANCH_DUO &> /dev/null
  1786.   else
  1787.  
  1788.   if [ "$DEVICE_TYPE" == "pi" ];
  1789.   then
  1790.     cd "$FIRMWARE_PI"/firmware || exit
  1791.     switch_branch "feature/raspberry-pi"  &> /dev/null
  1792.  
  1793.   else
  1794.     cd "$FIRMWARE_PARTICLE" || exit
  1795.     switch_branch &> /dev/null
  1796.   fi
  1797. fi
  1798.  
  1799.  
  1800. else
  1801.   echo
  1802.   if [ "$1" == "redbear" ] || [ "$1" == "bluz" ] || [ "$1" == "oak" ];
  1803.   then
  1804.     red_echo "This compound is not supported yet. Find out more here: https://git.io/vMTAw"
  1805.     echo
  1806.   fi
  1807.   red_echo "Please choose \"photon\", \"P1\", \"electron\", \"core\", \"pi\", or \"duo\",
  1808. or choose a proper command."
  1809.   common_commands
  1810.   exit
  1811. fi
  1812. if [ "$DEVICE_TYPE" == "photon" ];
  1813. then
  1814.   DFU_ADDRESS1="2b04:D006"
  1815.   DFU_ADDRESS2="0x080A0000"
  1816. fi
  1817. if [ "$DEVICE_TYPE" == "P1" ];
  1818. then
  1819.   DFU_ADDRESS1="2b04:D008"
  1820.   DFU_ADDRESS2="0x080A0000"
  1821. fi
  1822. if [ "$DEVICE_TYPE" == "electron" ];
  1823. then
  1824.   DFU_ADDRESS1="2b04:d00a"
  1825.   DFU_ADDRESS2="0x08080000"
  1826. fi
  1827. if [ "$DEVICE_TYPE" == "core" ];
  1828. then
  1829.   DFU_ADDRESS1="1d50:607f"
  1830.   DFU_ADDRESS2="0x08005000"
  1831. fi
  1832. if [ "$DEVICE_TYPE" == "duo" ];
  1833. then
  1834.   DFU_ADDRESS1="2b04:d058"
  1835.   DFU_ADDRESS2="0x80C0000"
  1836. fi
  1837.  
  1838. if [ "$2" == "setup" ];
  1839. then
  1840.   echo
  1841.   pause "Connect your device and put it into Listening mode. Press [ENTER] to continue..."
  1842.   particle serial identify
  1843.   if [ "$DEVICE_TYPE" != "electron" ];
  1844.   then
  1845.     echo
  1846.   pause "We will now connect your $DEVICE_TYPE to Wi-Fi. Press [ENTER] to continue..."
  1847.   echo
  1848.   particle serial wifi
  1849. fi
  1850. echo
  1851. blue_echo "You should now be able to claim your device.  Please run
  1852. \"particle device add Device_ID\", using the Device_ID we found above."
  1853. echo
  1854. exit
  1855. fi
  1856.  
  1857. # Create our project files
  1858. if [ "$2" == "init" ]; # Syntax: po init DEVICE dir
  1859. then
  1860.     FOLDER="$3"
  1861.     initProject
  1862. fi
  1863.  
  1864. # Flash already compiled binary
  1865. if [ "$2" == "dfu" ];
  1866. then
  1867.   BINWARNING="true"
  1868.   find_objects "$3"
  1869.   if [ "$FINDBINFAIL" == "true" ];
  1870.   then
  1871.     exit
  1872.   fi
  1873.   dfu_open
  1874.   sleep 1
  1875.   echo
  1876.   blue_echo "Flashing $FIRMWAREBIN with dfu-util..."
  1877.   echo
  1878.   dfu-util -d "$DFU_ADDRESS1" -a 0 -i 0 -s "$DFU_ADDRESS2":leave -D "$FIRMWAREBIN" || ( echo && red_echo "Device not found." && echo && exit )
  1879.   echo
  1880.   blue_echo "Firmware successfully flashed to $DEVICE_TYPE on $MODEM"
  1881.   echo
  1882.   exit
  1883. fi
  1884.  
  1885. #Upgrade our firmware on device
  1886. if [ "$2" == "upgrade" ] || [ "$2" == "patch" ] || [ "$2" == "update" ];
  1887. then
  1888.  
  1889. if [ "$DEVICE_TYPE" == "photon" ] || [ "$DEVICE_TYPE" == "P1" ] || [ "$DEVICE_TYPE" == "electron" ];
  1890. then
  1891.  
  1892.   pause "Connect your device and put into DFU mode. Press [ENTER] to continue..."
  1893.  
  1894.   cd "$FIRMWARE_PARTICLE/modules" || exit
  1895.   make clean all PLATFORM="$DEVICE_TYPE" program-dfu
  1896.  
  1897.   # cd "$FIRMWARE_PARTICLE" && git stash || exit
  1898.   sleep 1
  1899.   dfu-util -d $DFU_ADDRESS1 -a 0 -i 0 -s $DFU_ADDRESS2:leave -D /dev/null &> /dev/null
  1900.   exit
  1901.  
  1902. else
  1903.  
  1904.   if [ "$DEVICE_TYPE" == "duo" ];
  1905.   then
  1906.  
  1907.   pause "Connect your device and put into DFU mode. Press [ENTER] to continue..."
  1908.  
  1909.   cd "$FIRMWARE_DUO/firmware/modules" || exit
  1910.   make clean all PLATFORM="$DEVICE_TYPE" program-dfu
  1911.  
  1912.   cd "$FIRMWARE_DUO/firmware" && git stash || exit
  1913.   sleep 1
  1914.   dfu-util -d $DFU_ADDRESS1 -a 0 -i 0 -s $DFU_ADDRESS2:leave -D /dev/null &> /dev/null
  1915.  
  1916.   exit
  1917.   fi
  1918.  
  1919.   echo
  1920.   red_echo "This command can only be used to update the system firmware for
  1921. photon, P1, electron, or duo."
  1922. echo
  1923.  
  1924. if [ "$DEVICE_TYPE" == "core" ];
  1925. then
  1926. blue_echo "On the Spark Core, firmware is monolithic, meaning that the system
  1927. firmware is packaged with the user firmware.  To use a core with po-util
  1928. just manually put it into DFU mode the first time you flash to it."
  1929.  
  1930. echo
  1931. fi
  1932.  
  1933. if [ "$DEVICE_TYPE" == "pi" ];
  1934. then
  1935. blue_echo "Raspberry Pi is still in beta and you must be registered in the beta
  1936. to use Particle on Raspberry Pi.
  1937.  
  1938. To update the \"system firmware\" on Raspberry Pi, simply re-install
  1939. particle-agent. https://git.io/vynBd"
  1940.  
  1941. echo
  1942. fi
  1943.  
  1944. exit
  1945. fi
  1946.  
  1947. fi
  1948.  
  1949. # Clean firmware directory
  1950. if [ "$2" == "clean" ];
  1951. then
  1952.   DIRWARNING="true"
  1953.   find_objects "$3"
  1954.   if [ "$FINDDIRFAIL" == "true" ];
  1955.   then
  1956.     exit
  1957.   fi
  1958.     # git stash &> /dev/null
  1959.     echo
  1960.     blue_echo "Cleaning firmware..."
  1961.     echo
  1962.     if [ "$DEVICE_TYPE" == "pi" ];
  1963.     then
  1964.       make clean -s 2>&1 /dev/null
  1965.     else
  1966.       make clean -s PLATFORM="$DEVICE_TYPE"  2>&1 /dev/null
  1967.     fi
  1968.  
  1969.     if [ "$FIRMWAREDIR/../bin" != "$HOME/bin" ];
  1970.     then
  1971.       rm -rf "$FIRMWAREDIR/../bin"
  1972.     fi
  1973.     blue_echo "Sucessfully cleaned."
  1974.     echo
  1975.   exit
  1976. fi
  1977.  
  1978. # Flash binary over the air
  1979. # Use --multi to flash multiple devices at once.  This reads a file named devices.txt
  1980. if [ "$2" == "ota" ];
  1981. then
  1982.   ota "$3"
  1983. fi
  1984.  
  1985. if [ "$2" == "build" ];
  1986. then
  1987.   DIRWARNING="true"
  1988.   find_objects "$3"
  1989.   if [ "$FINDDIRFAIL" == "true" ];
  1990.   then
  1991.     exit
  1992.   fi
  1993.     echo
  1994.     build_firmware || exit
  1995.     build_message
  1996. fi
  1997.  
  1998. if [ "$2" == "flash" ];
  1999. then
  2000.   DIRWARNING="true"
  2001.   find_objects "$3"
  2002.   if [ "$FINDDIRFAIL" == "true" ];
  2003.   then
  2004.     exit
  2005.   fi
  2006.   if [ "$DEVICE_TYPE" == "pi" ];
  2007.   then
  2008.     build_firmware
  2009.     ota "-m"
  2010.     exit
  2011.   fi
  2012.   dfu_open
  2013.   echo
  2014.   ( build_firmware && echo && green_echo "Building firmware was successful! Flashing with dfu-util..." && echo ) || ( echo && red_echo 'Building firmware failed! Closing DFU...' && echo && dfu-util -d "$DFU_ADDRESS1" -a 0 -i 0 -s "$DFU_ADDRESS2":leave -D /dev/null &> /dev/null && exit )
  2015.   dfu-util -d "$DFU_ADDRESS1" -a 0 -i 0 -s "$DFU_ADDRESS2":leave -D "$FIRMWAREDIR/../bin/firmware.bin" || exit #&> /dev/null
  2016.   echo
  2017.   blue_echo "Firmware successfully flashed to $DEVICE_TYPE on $MODEM"
  2018.   echo
  2019.   exit
  2020. fi
  2021.  
  2022. # If an improper command is chosen:
  2023. echo
  2024. red_echo "Please choose a proper command."
  2025. common_commands
Advertisement
Add Comment
Please, Sign In to add comment