#!/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 &
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 $?
