#!/bin/bash
#set -x

if [ "$HAS_DEBUGGING_FUNCTIONS" != "yes" ]; then
. /etc/ags-celestia/debugging_functions
fi

HAS_LPC_FIRMWARE_FUNCTIONS="yes"

LPCUSBCAN2_FIRMWARE_TYPE="lpcusbcan2"
SNAZZY_FIRMWARE_TYPE="snazzy"

LPC_FIRMWARE_TYPE=""

RETRIES=10

function init_lpc_firmware_functions
{
    if [ -f /proc/lpcusbcan2 ]
    then
        LPC_FIRMWARE_TYPE=$LPCUSBCAN2_FIRMWARE_TYPE
    else
        LPC_FIRMWARE_TYPE=$SNAZZY_FIRMWARE_TYPE
    fi
}

# @param $1 device to check version of
function get_lpc_firmware_version
{
    debug_function "get_lpc_firmware_version"

    local DEVICE=$1
    local RESULT=""

    if [ "x${LPC_FIRMWARE_TYPE}" = "x" ]
    then
        init_lpc_firmware_functions
    fi

    case "$LPC_FIRMWARE_TYPE" in
        'snazzy')
            RESULT=$(get_snazzy_firmware_version $DEVICE)
            ;;
        'lpcusbcan2')
            get_lpcusbcan2_firmware_version $DEVICE
            ;;
    esac

    echo "$RESULT"
}

function get_snazzy_firmware_version
{
    local DEVICE=$1
    local RESULT=""
    local RETVAL=1
    local COUNT=0

    while [ $RETVAL -gt 0 ]
    do
        COUNT=$(($COUNT + 1))
        RESULT=$(eDriveXLoadTool --get_firmware_version $DEVICE)
        RETVAL=$?
        
        if [ $RETRIES -gt 0 ]
        then
            if [ $COUNT -ge $RETRIES ]
            then
                RETVAL=0
                RESULT=""
            fi
        fi
    done

    echo "$RESULT"
}

function get_lpcusbcan2_firmware_version
{
    local DEVICE=$1
    local RESULT="Function not implemented"

    echo "$RESULT"
}

function flash_snazzy_lpc_firmware
{
    local DEVICE=$1
    local FIRMWARE_FILE=$2
    local RESULT=""
    local RETVAL=1
    local VERSION=""
    local OLD_VERSION=""
    local NEW_VERSION=""
    local COUNT=0

    if [ "x${FIRMWARE_FILE}" = "x" ]
    then
        RESULT="No Firmware File specified"
    else
        if [ -e $FIRMWARE_FILE ]
        then
            RETVAL=1
            COUNT=0
            while [ $RETVAL -gt 0 ]
            do
                sleep 1
                COUNT=$(($COUNT + 1))
                VERSION=$(eDriveXLoadTool --get_firmware_version $DEVICE)
                RETVAL=$?
                        
                if [ $RETRIES -gt 0 ]
                then
                    if [ $COUNT -ge $RETRIES ]
                    then
                        RETVAL=-1
                        VERSION=""
                    fi
                fi
            done

            if [ $RETVAL = 0 ]
            then
                OLD_VERSION=$VERSION
                RETVAL=1
                COUNT=0
                while [ $RETVAL -gt 0 ]
                do
                    sleep 1
                    COUNT=$(($COUNT + 1))
                    eDriveXLoadTool --prepare_for_update $DEVICE
                    RETVAL=$?
        
                    if [ $RETRIES -gt 0 ]
                    then
                        if [ $COUNT -ge $RETRIES ]
                        then
                            RETVAL=-1
                        fi
                    fi
                done
            else
                RESULT="Failed to get initial firmware version"
            fi

            if [ $RETVAL = 0 ]
            then
                RETVAL=1
                COUNT=0
                while [ $RETVAL -gt 0 ]
                do
                    sleep 1
                    COUNT=$(($COUNT + 1))
                    VERSION=$(eDriveXLoadTool --get_firmware_version $DEVICE)
                    RETVAL=$?
        
                    if [ $RETRIES -gt 0 ]
                    then
                        if [ $COUNT -ge $RETRIES ]
                        then
                            RETVAL=-1
                            VERSION=""
                        fi
                    fi
                done
            else
                RESULT="Failed to prepare for update"
            fi

            if [ $RETVAL = 0 ]
            then
                if [ "x$VERSION" != "x020" ]
                then
                    RETVAL=-1
                fi
            else
                RESULT="Failed to get firmware version after prepare for update"
            fi

            if [ $RETVAL = 0 ]
            then
                RETVAL=1
                COUNT=0
                while [ $RETVAL -gt 0 ]
                do
                    sleep 1
                    COUNT=$(($COUNT + 1))
                    eDriveXLoadTool --update_firmware $DEVICE --filename $FIRMWARE_FILE
                    RETVAL=$?
        
                    if [ $RETRIES -gt 0 ]
                    then
                        if [ $COUNT -ge $RETRIES ]
                        then
                            RETVAL=-1
                        fi
                    fi
                done
            else
                RESULT="Firmware version after prepare for update ($VERSION) does not match expected (020)"
            fi

            if [ $RETVAL = 0 ]
            then
                RETVAL=1
                COUNT=0
                while [ $RETVAL -gt 0 ]
                do
                    sleep 1
                    COUNT=$(($COUNT + 1))
                    VERSION=$(eDriveXLoadTool --get_firmware_version $DEVICE)
                    RETVAL=$?
        
                    if [ $RETRIES -gt 0 ]
                    then
                        if [ $COUNT -ge $RETRIES ]
                        then
                            RETVAL=-1
                        fi
                    fi
                done
            else
                RESULT="Failed to complete firmware update"
            fi

            if [ $RETVAL = 0 ]
            then
                NEW_VERSION=$VERSION
                RESULT="Upgraded LPC $DEVICE firmware from $OLD_VERSION to $NEW_VERSION"
            else
                RESULT="Failed to get firmware version after update"
            fi

        else
            RESULT="Specified firmware file does not exist"
        fi
    fi

    echo "$RESULT"
}

function flash_lpcusbcan2_lpc_firmware
{
    local DEVICE=$1
    local FIRMWARE_FILE=$2
    local RESULT="Function not implemented"

    echo "$RESULT"
}

# @param $1 device to flash
# @param $2 firmware file to flash
function flash_lpc_firmware
{
    debug_function "flash_lpc_firmware"

    local DEVICE=$1
    local FIRMWARE_FILE=$2
    local RESULT=""

    if [ "x${LPC_FIRMWARE_TYPE}" = "x" ]
    then
        init_lpc_firmware_functions
    fi

    if [ "x${FIRMWARE_FILE}" = "x" ]
    then
        RESULT="No Firmware File specified"
    else
        if [ -e $FIRMWARE_FILE ]
        then
            case "$LPC_FIRMWARE_TYPE" in
                'snazzy')
                    RESULT=$(flash_snazzy_lpc_firmware $DEVICE $FIRMWARE_FILE)
                    ;;
                'lpcusbcan2')
                    RESULT=$(flash_lpcusbcan2_firmware $DEVICE $FIRMWARE_FILE)
                    ;;
            esac
        else
            RESULT="Specified firmware file does not exist"
        fi
    fi

    echo "$RESULT"
}

