#!/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 -e

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 &
SC_UART_PID=$!
cat "/dev/Nexus-CP210-FPGA-UART-${NEXUS_ID}" > uart.smc.log &
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.smc.log

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