#!/bin/bash
# Copyright (C) MOXA Inc. All rights reserved.
# Authors:
#     2024  Wilson YS Huang  <wilsonys.huang@moxa.com>
# This software is distributed under the terms of the MOXA SOFTWARE NOTICE.
# See the file LICENSE for details.
#

MCU_MGMT="/usr/sbin/mx-mcu-mgmt"

usage() {
    cat <<EOF
Usage:
        mx-app-wdt-ctl [Options]...
Options:
        -a, --appwdt_mode
                Get app wdt mode and timeout status
        -a, --appwdt_mode [0|1] [5:15]
                Set app wdt mode and timeout [0:disable|1:enable] [5~15 timeout in sec]
        -w, --appwdt_resetmode
                Get app wdt reset mode
        -w, --appwdt_resetmode [0|1]
                Set app wdt reset mode (0:not reset|1:reset)
        -m, --appwdt_relaymode
                Get app wdt relay mode
        -m, --appwdt_relaymode [0|1|2]
                Set app wdt relay mode (0:connect|1:disconnect|2:by-pass)

EOF
}

handle_appwdt_mdoe_option() {
    local mode
    local timeout
    local result

    if [ $# -eq 1 ]; then
        result=$($MCU_MGMT app_wdt_timout get_timeout)
        case "$result" in
        disabled)
            mode="0"
            timeout="0"
            ;;
        [5-9] | 1[0-5])
            mode="1"
            timeout="$result"
            ;;
        *)
            echo "unknown"
            return
            ;;
        esac

        echo "Get APP WDT Mode: $mode"
        echo "Get APP WDT Timeout: $timeout"
    elif [ $# -eq 2 ] || [ $# -eq 3 ]; then
        mode=$2
        case "$mode" in
        0)
            timeout=0
            ;;
        1)
            timeout="$3"
            if [ "$timeout" -lt 5 ] || [ "$timeout" -gt 15 ]; then
                echo "invalid timeout"
                return
            fi
            ;;
        *)
            echo "invalid mode"
            return
            ;;
        esac

        $MCU_MGMT app_wdt_timout set_timeout "$timeout" 2>&1 >/dev/null
        if [ $? -ne 0 ]; then
            echo "Set APP WDT Mode: $mode"
            echo "Set APP WDT Timeout: $timeout"
        fi
    else
        echo "Please check input variables."
    fi
}

handle_appwdt_reset_option() {
    local mode

    if [ -n "$2" ]; then
        case "$2" in
        0) mode="off" ;;
        1) mode="on" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        $MCU_MGMT app_wdt_reset set_mode "$mode"
        echo "Set APP Watchdog Reset Mode: $2"
    else
        case "$($MCU_MGMT app_wdt_reset get_mode)" in
        off) mode="0" ;;
        on) mode="1" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        echo "Get APP Watchdog Reset Mode: $mode"
    fi
}

handle_appwdt_relay_option() {
    local mode

    if [ -n "$2" ]; then
        case "$2" in
        0) mode="connect" ;;
        1) mode="disconnect" ;;
        2) mode="bypass" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        $MCU_MGMT app_wdt_relay set_mode "$mode"
        echo "Set APP Watchdog Relay Mode: $2"
    else
        case "$($MCU_MGMT app_wdt_relay get_mode)" in
        connect) mode="0" ;;
        disconnect) mode="1" ;;
        bypass) mode="2" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        echo "Get APP Watchdog Relay Mode: $mode"
    fi
}

main() {
    if [ ! -x "${MCU_MGMT}" ]; then
        echo "Error: mx-mcu-mgmt is not exist."
        exit 1
    fi

    if [ $# -eq 0 ]; then
        usage
        exit 1
    fi

    case "$1" in
    -a | --appwdt_mode)
        handle_appwdt_mdoe_option "$@"
        ;;
    -w | --appwdt_resetmode)
        handle_appwdt_reset_option "$@"
        ;;
    -m | --appwdt_relaymode)
        handle_appwdt_relay_option "$@"
        ;;
    -h | --help)
        usage
        exit 0
        ;;
    *)
        echo "Unknown option: $1"
        usage
        exit 1
        ;;
    esac
}

main $@
