#!/bin/sh

# This script is loosly based on a script with same purpose provided
# by RIOT-OS (https://github.com/RIOT-OS/RIOT)

OPENOCD=${OPENOCD:-openocd}
OPENOCD_CMD="${OPENOCD}${OPENOCD_DEFAULT_PATH:+ -s $OPENOCD_DEFAULT_PATH}"
OPENOCD_CONFIG=${ZEPHYR_BASE}/boards/${ARCH}/${BOARD_NAME}/support/openocd.cfg
BIN_NAME=${O}/${KERNEL_BIN_NAME}
ELF_NAME=${O}/${KERNEL_ELF_NAME}

test_config() {
    if [ ! -f "${OPENOCD_CONFIG}" ]; then
        echo "Error: Unable to locate OpenOCD configuration file: ${OPENOCD_CONFIG}"
        exit 1
    fi
    if ! which ${OPENOCD} >/dev/null 2>&1; then
        echo "Error: Unable to locate OpenOCD executable: ${OPENOCD}"
        exit 1
    fi
}

test_bin() {
    if [ ! -f "${BIN_NAME}" ]; then
        echo "Error: Unable to locate image binary: ${BIN_NAME}"
        exit 1
    fi
}

do_flash() {
    test_config
    test_bin

    # flash device with specified image
    # setsid is needed so that Ctrl+C in GDB doesn't kill OpenOCD
    [ -z "${SETSID}" ] && SETSID="$(which setsid)"
    # temporary file that saves OpenOCD pid
    OCD_PIDFILE=$(mktemp -t "openocd_pid.XXXXXXXXXX")
    # cleanup after script terminates
    trap "cleanup ${OCD_PIDFILE}" EXIT
    # don't trap on Ctrl+C, because GDB keeps running
    trap '' INT
    # start OpenOCD as GDB server
    ${SETSID} sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
            ${OPENOCD_EXTRA_INIT} \
            -c 'tcl_port ${TCL_PORT:-6333}' \
            -c 'telnet_port ${TELNET_PORT:-4444}' \
            -c 'gdb_port ${GDB_PORT:-3333}' \
            -c 'init' \
            -c 'targets' \
            -c 'halt' \
             & \
            echo \$! > $OCD_PIDFILE" &
    # connect to the GDB server
    ${GDB} ${TUI} -ex "target remote :${GDB_PORT:-3333}" \
            -ex "load" -ex "c" ${ELF_NAME}
    # will be called by trap
    cleanup() {
        OCD_PID="$(cat $OCD_PIDFILE)"
        kill ${OCD_PID} &>/dev/null
        rm -f "$OCD_PIDFILE"
        exit 0
    }
}


do_debug() {
    test_config
    test_bin
    # setsid is needed so that Ctrl+C in GDB doesn't kill OpenOCD
    [ -z "${SETSID}" ] && SETSID="$(which setsid)"
    # temporary file that saves OpenOCD pid
    OCD_PIDFILE=$(mktemp -t "openocd_pid.XXXXXXXXXX")
    # cleanup after script terminates
    trap "cleanup ${OCD_PIDFILE}" EXIT
    # don't trap on Ctrl+C, because GDB keeps running
    trap '' INT
    # start OpenOCD as GDB server
    ${SETSID} sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
            ${OPENOCD_EXTRA_INIT} \
            -c 'tcl_port ${TCL_PORT:-6333}' \
            -c 'telnet_port ${TELNET_PORT:-4444}' \
            -c 'gdb_port ${GDB_PORT:-3333}' \
            -c 'init' \
            -c 'targets' \
            -c 'halt' \
             & \
            echo \$! > $OCD_PIDFILE" &
    # connect to the GDB server
    ${GDB} ${TUI} -ex "target remote :${GDB_PORT:-3333}" -ex "load" ${ELF_NAME}
    # will be called by trap
    cleanup() {
        OCD_PID="$(cat $OCD_PIDFILE)"
        kill ${OCD_PID} &>/dev/null
        rm -f "$OCD_PIDFILE"
        exit 0
    }
}

do_debugserver() {
    test_config
    sh -c "${OPENOCD_CMD} -f '${OPENOCD_CONFIG}' \
            -c 'init' \
            -c 'targets' \
            -c 'reset halt'"
}

CMD="$1"
shift

if [ "$KBUILD_VERBOSE" -eq 1 ]
then
	set -x
fi

case "${CMD}" in
  flash)
    echo "Flashing Target Device"
    do_flash "$@"
    ;;
  debugserver)
    do_debugserver "$@"
    ;;
  debug)
    do_debug "$@"
    ;;
esac
