#!/bin/bash
|
|
|
|
ip=
|
|
board=
|
|
size=
|
|
auth=
|
|
flags=
|
|
|
|
export boards=()
|
|
ips=""
|
|
|
|
exists() {
|
|
command -v "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
echo_pad() {
|
|
string=$1
|
|
pad=$2
|
|
printf '%s' "$string"
|
|
printf '%*s' $(( $pad - ${#string} ))
|
|
}
|
|
|
|
useAvahi() {
|
|
|
|
echo_pad "#" 4
|
|
echo_pad "HOSTNAME" 25
|
|
echo_pad "IP" 25
|
|
echo_pad "APP" 15
|
|
echo_pad "VERSION" 15
|
|
echo_pad "DEVICE" 30
|
|
echo_pad "MEM_SIZE" 10
|
|
echo_pad "SDK_SIZE" 10
|
|
echo
|
|
|
|
printf -v line '%*s\n' 134
|
|
echo ${line// /-}
|
|
|
|
counter=0
|
|
|
|
ip_file="/tmp/espurna.flash.ips"
|
|
board_file="/tmp/espurna.flash.boards"
|
|
count_file="/tmp/espurna.flash.count"
|
|
size_file="/tmp/espurna.flash.size"
|
|
echo -n "" > $ip_file
|
|
echo -n "" > $board_file
|
|
echo -n "" > $size_file
|
|
echo -n "$counter" > $count_file
|
|
|
|
avahi-browse -t -r -p "_arduino._tcp" 2>/dev/null | grep ^= | sort -t ';' -k 3 | while read line; do
|
|
|
|
(( counter++ ))
|
|
echo "$counter" > $count_file
|
|
|
|
hostname=`echo $line | cut -d ';' -f4`
|
|
ip=`echo $line | cut -d ';' -f8`
|
|
txt=`echo $line | cut -d ';' -f10`
|
|
app_name=`echo $txt | sed -n "s/.*app_name=\([^\"]*\).*/\1/p"`
|
|
app_version=`echo $txt | sed -n "s/.*app_version=\([^\"]*\).*/\1/p"`
|
|
board=`echo $txt | sed -n "s/.*target_board=\([^\"]*\).*/\1/p"`
|
|
mem_size=`echo $txt | sed -n "s/.*mem_size=\([^\"]*\).*/\1/p"`
|
|
sdk_size=`echo $txt | sed -n "s/.*sdk_size=\([^\"]*\).*/\1/p"`
|
|
|
|
echo_pad "$counter" 4
|
|
echo_pad "$hostname" 25
|
|
echo_pad "http://$ip" 25
|
|
echo_pad "$app_name" 15
|
|
echo_pad "$app_version" 15
|
|
echo_pad "$board" 30
|
|
echo_pad "$mem_size" 10
|
|
echo_pad "$sdk_size" 10
|
|
echo
|
|
|
|
echo -n "$ip;" >> $ip_file
|
|
echo -n "$board;" >> $board_file
|
|
if [ "$mem_size" == "$sdk_size" ]; then
|
|
mem_size=`echo $mem_size | head -c 1`
|
|
echo -n "$mem_size;" >> $size_file
|
|
else
|
|
echo -n ";" >> $size_file
|
|
fi
|
|
|
|
done
|
|
|
|
echo
|
|
read -p "Choose the board you want to flash (empty if none of these): " num
|
|
|
|
# None of these
|
|
if [ "$num" == "" ]; then
|
|
return
|
|
fi
|
|
|
|
# Check boundaries
|
|
counter=`cat $count_file`
|
|
if [ $num -lt 1 ] || [ $num -gt $counter ]; then
|
|
echo "Board number must be between 1 and $counter"
|
|
exit 1
|
|
fi
|
|
|
|
# Fill the fields
|
|
ip=`cat $ip_file | cut -d ';' -f$num`
|
|
board=`cat $board_file | cut -d ';' -f$num`
|
|
size=`cat $size_file | cut -d ';' -f$num`
|
|
|
|
}
|
|
|
|
getBoard() {
|
|
|
|
boards=(`cat espurna/config/hardware.h | grep "defined" | sed "s/.*(\(.*\)).*/\1/" | sort`)
|
|
|
|
echo_pad "#" 4
|
|
echo_pad "DEVICE" 30
|
|
echo
|
|
|
|
printf -v line '%*s\n' 34
|
|
echo ${line// /-}
|
|
|
|
counter=0
|
|
for board in "${boards[@]}"; do
|
|
(( counter++ ))
|
|
echo_pad "$counter" 4
|
|
echo_pad "$board" 30
|
|
echo
|
|
done
|
|
|
|
echo
|
|
read -p "Choose the board you want to flash (empty if none of these): " num
|
|
|
|
# None of these
|
|
if [ "$num" == "" ]; then
|
|
return
|
|
fi
|
|
|
|
# Check boundaries
|
|
counter=${#boards[*]}
|
|
if [ $num -lt 1 ] || [ $num -gt $counter ]; then
|
|
echo "Board code must be between 1 and $counter"
|
|
exit 1
|
|
fi
|
|
|
|
# Fill the fields
|
|
(( num -- ))
|
|
board=${boards[$num]}
|
|
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Welcome
|
|
echo
|
|
echo "--------------------------------------------------------------"
|
|
echo "ESPURNA FIRMWARE OTA FLASHER"
|
|
|
|
# Get current version
|
|
version=`cat espurna/config/version.h | grep APP_VERSION | awk '{print $3}' | sed 's/"//g'`
|
|
echo "Building for version $version"
|
|
|
|
echo "--------------------------------------------------------------"
|
|
echo
|
|
|
|
if exists avahi-browse; then
|
|
useAvahi
|
|
fi
|
|
|
|
if [ "$board" == "" ]; then
|
|
getBoard
|
|
fi
|
|
|
|
if [ "$board" == "" ]; then
|
|
read -p "Board type of the device to flash: " -e -i "NODEMCU_LOLIN" board
|
|
fi
|
|
|
|
if [ "$board" == "" ]; then
|
|
echo "You must define the board type"
|
|
exit 2
|
|
fi
|
|
|
|
if [ "$size" == "" ]; then
|
|
read -p "Board memory size (1 for 1M, 4 for 4M): " -e size
|
|
fi
|
|
|
|
if [ "$size" == "" ]; then
|
|
echo "You must define the board memory size"
|
|
exit 2
|
|
fi
|
|
|
|
if [ "$ip" == "" ]; then
|
|
read -p "IP of the device to flash: " -e -i 192.168.4.1 ip
|
|
fi
|
|
|
|
if [ "$ip" == "" ]; then
|
|
echo "You must define the IP of the device"
|
|
exit 2
|
|
fi
|
|
|
|
if [ "$auth" == "" ]; then
|
|
read -p "Authorization key of the device to flash: " auth
|
|
fi
|
|
|
|
if [ "$flags" == "" ]; then
|
|
read -p "Extra flags for the build: " -e -i "" flags
|
|
fi
|
|
|
|
env="esp8266-${size}m-ota"
|
|
|
|
echo
|
|
echo "ESPURNA_IP = $ip"
|
|
echo "ESPURNA_BOARD = $board"
|
|
echo "ESPURNA_AUTH = $auth"
|
|
echo "ESPURNA_FLAGS = $flags"
|
|
echo "ESPURNA_ENV = $env"
|
|
|
|
echo
|
|
echo -n "Are these values corrent [y/N]: "
|
|
read response
|
|
|
|
if [ "$response" != "y" ]; then
|
|
exit
|
|
fi
|
|
|
|
export ESPURNA_IP=$ip
|
|
export ESPURNA_BOARD=$board
|
|
export ESPURNA_AUTH=$auth
|
|
export ESPURNA_FLAGS=$flags
|
|
|
|
pio run -e $env -t upload
|