#!/bin/bash
#
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Run a test on the nexus FPGA platform
set -ex

BITSTREAM_PATH="$1"
BINARY_PATH="$2"
NEXUS_ID="${NEXUS_ID:-$3}"
DEFAULT_NEXUS_FLASH_PATH="${ROOTDIR}/internal/nexus_usage/nexus_flash.sh"
NEXUS_FLASH_PATH="${NEXUS_FLASH_PATH:-$DEFAULT_NEXUS_FLASH_PATH}"
export LOG_TIMEOUT="${LOG_TIMEOUT:-900}"
export LOG_CHECK_INTERVAL="${LOG_CHECK_INTERVAL:-30}"


function mcu_write() {
    string=$1
    length=${#string}
    for ((i = 0; i < length; i++)); do
        char="${string:i:1}"
        echo -n "$char"
        sleep 0.5
    done > "/dev/Nexus-FTDI-${NEXUS_ID}-MCU-UART"
    echo -e "\r" > "/dev/Nexus-FTDI-${NEXUS_ID}-MCU-UART"
}


if [ $# -lt 2 ] || [ $# -gt 3 ] ; then
cat << EOF
    $0 <bitstream> <binary> [nexus index]
    bitstream: The path to the nexus bitstream.
               This will be copied and loaded to the fpga.
               If the bitstream file doesn't exist the test will continue with
               whatever bitstream is already loaded.
    binary: The path to the test binary.
            This will be loaded with the opentitantool utility using the
            bootstrap subcommand
    nexus index: The number assigned to the nexus board that will be used for
                 the test. Include zero padding for numbers less than 10. This
                 arg is optional and will fall back on the NEXUS_ID environment
                 variable.
EOF
exit 1
fi

# Verify no one else is using our UARTs
if fuser "/dev/Nexus-FTDI-${NEXUS_ID}-FPGA-UART"
then
    echo "/dev/Nexus-FTDI-${NEXUS_ID}-FPGA-UART appears to be busy"
fi
if fuser "/dev/Nexus-CP210-FPGA-UART-${NEXUS_ID}"
then
    echo "/dev/Nexus-CP210-FPGA-UART-${NEXUS_ID} appears to be busy"
fi
if fuser "/dev/Nexus-FTDI-${NEXUS_ID}-MCU-UART"
then
    echo "/dev/Nexus-FTDI-${NEXUS_ID}-MCU-UART appears to be busy"
fi

stty --file="/dev/Nexus-FTDI-${NEXUS_ID}-FPGA-UART" 115200
stty --file="/dev/Nexus-CP210-FPGA-UART-${NEXUS_ID}" 115200
stty --file="/dev/Nexus-FTDI-${NEXUS_ID}-MCU-UART" 115200

# Starting logging the UARTs
cat "/dev/Nexus-FTDI-${NEXUS_ID}-FPGA-UART" > uart.sc.log 2> uart.sc.err &
SC_UART_PID=$!
cat "/dev/Nexus-CP210-FPGA-UART-${NEXUS_ID}" > uart.smc.log 2> uart.smc.err &
SMC_UART_PID=$!

# Logging cleanup for when the script exits
trap 'kill -INT ${SC_UART_PID} ; kill -INT ${SMC_UART_PID} ; \
      sleep 10 ; \
      kill -KILL ${SC_UART_PID} ; kill -KILL ${SMC_UART_PID}' 0

if [[ -f "${BITSTREAM_PATH}" ]]; then
    # Issue a no-op command to flush the character buffer in case it isn't empty
    mcu_write "help"
    scp \
        "${BITSTREAM_PATH}" \
        "root@nexus${NEXUS_ID}:/mnt/mmcp1/"
    mcu_write "camera_powerdown"
    sleep 5
    # zturn exits with 1 even when working correctly. Mask with exit 0
    BITSTREAM_NAME=$(basename "${BITSTREAM_PATH}")
    ssh \
        "root@nexus${NEXUS_ID}" \
        "/mnt/mmcp1/zturn -d a /mnt/mmcp1/${BITSTREAM_NAME} ; exit 0"
    mcu_write "camera_powerup"
fi

OT_TOOL_PATH=`command -v opentitantool`
NEXUS_JSON_DIR=`dirname "${OT_TOOL_PATH}"`
NEXUS_JSON_PATH="${NEXUS_JSON_DIR}/nexus.json"

if [[ "${BINARY_PATH}" == *".bin" ]]; then
    opentitantool \
        --conf "${NEXUS_JSON_PATH}" \
        --interface nexus \
        --usb-serial "Nexus-FTDI-${NEXUS_ID}" \
        bootstrap "${BINARY_PATH}"
elif [[ "${BINARY_PATH}" == *"extflash.tar" ]]; then
    export NEXUS_BOARD="${NEXUS_ID}"
    export OT_TOOL="${OT_TOOL_PATH}"
    export NEXUS_JSON="${NEXUS_JSON_PATH}"
    "${NEXUS_FLASH_PATH}" "${BINARY_PATH}"
fi

timeout "${LOG_TIMEOUT}" bash -c '
    until grep -q -e PASS! -e FAIL! uart.sc.log uart.smc.log ; do
        echo "Expected log is missing. Wait up to ${LOG_TIMEOUT}s."
        sleep "${LOG_CHECK_INTERVAL}"
    done' || echo "Time out waiting for PASS! or FAIL! log"

cat -n uart.sc.log
cat -n uart.sc.err
cat -n uart.smc.log
cat -n uart.smc.err

grep -q "PASS!" uart.sc.log uart.smc.log
exit $?
