#!/bin/sh

# in seconds
PERIOD=600
RESETGUARD=60
SINK=157
LOCATION="lille"
PLATFORM="iotlab-m3"
ARCH="m3"
RESET=200

_resources() {
    experiment-cli get -r
}

_reset_node() { # 1: node
    # pick random point in time between guard times
    SELECTED=$(shuf -i ${RESETGUARD}-$((${PERIOD}-${RESETGUARD})) -n 1)
    sleep ${SELECTED}
    iotlab-node -sto -l "${LOCATION},${ARCH},${1}"
    iotlab-node -sta -l "${LOCATION},${ARCH},${1}"
}

# for some reason, no DAG is built if all nodes start up simultaneously
_phased_start() {
    iotlab-node -sto
    iotlab-node -sta -l lille,m3,47+49+51+53+${SINK}
    sleep 5
    iotlab-node -sta
}

_run_firmware() {
    echo "Flashing ${1} and ${2}"
    iotlab-node -up ${1} -e "${LOCATION},${ARCH},${SINK}"
    iotlab-node -up ${2} -l "${LOCATION},${ARCH},${SINK}"

    sleep ${PERIOD}

    iotlab-node -sto
    iotlab-node -sta

    _reset_node ${RESET} &
    sleep ${PERIOD}
}

_recompile_firmware() { # 1: BUILDDIR, 2: EXPDIR, 3: MODE, 4: OPTS

    echo Recompiling firmware ${3}

    rm ${1}/rpl-eval-sink.${PLATFORM}
    make -C ${1} TARGET=${PLATFORM} clean
    make -C ${1} -j4 TARGET=${PLATFORM} WITH_RPL_RESTORE_NO_INVOKE=1 $4
    install ${1}/rpl-eval-sink.${PLATFORM} ${2}/${3}-sink

    rm ${1}/rpl-eval-source.${PLATFORM}
    make -C ${1} TARGET=${PLATFORM} clean
    make -C ${1} -j4 TARGET=${PLATFORM} $4
    install ${1}/rpl-eval-source.${PLATFORM} ${2}/${3}-source
}

pre() { # 1: expdir

    if [ -z ${BUILDDIR+x} ]; then
        echo "BUILDDIR not defined..."
        BUILDDIR="/home/tim/src/contiki-inga/examples/ipv6/rpl-print-topo"
    fi

    if [ ! -z ${WITH_RECOMPILE+x} ]; then
        _recompile_firmware ${BUILDDIR} ${1} "n" ""
        _recompile_firmware ${BUILDDIR} ${1} "h" "RPL_RESTORE=1"
        _recompile_firmware ${BUILDDIR} ${1} "hs" "RPL_RESTORE=1 RPL_RESTORE_USE_UIDS=1"
    fi
}

during() { # 1: expdir
    _run_firmware ${1}/n-source ${1}/n-sink
    _run_firmware ${1}/h-source ${1}/h-sink
    _run_firmware ${1}/hs-source ${1}/hs-sink
}

post() {
    echo Finishing experiment $1
}