#!/bin/sh
. /lib/dyiot/bin/diag_sys.sh

json_init

# uboot_env=`fw_printenv`
uboot_env=$(factory get)
mac_addr=$(echo "$uboot_env" | awk -F'=' '/^MAC=/{print $2}')
sn=$(echo "$uboot_env" | awk -F'=' '/^SN=/{print $2}')
hwver=$(echo "$uboot_env" | awk -F'=' '/^HWVER=/{print $2}')
fdate=$(echo "$uboot_env" | awk -F'=' '/^DATE=/{print $2}')
echo "HWVER: $hwver"
echo "SN: $sn"
echo "DATE: $date"
echo "SWVER: $(cat /etc/issue)"
json_add_string "sn" "$sn"
json_add_string "product" "$PRODUCT"
json_add_int "timestamp" $(date +%s)
json_add_string "MAC" "$mac_addr"
json_add_string "HWVER": "$hwver"
json_add_string "SWVER": "$(cat /etc/issue)"

help() {
	cat <<_HELP_
diagnose devices

Usage:  $0 [COM]
           if no item given, then will diagnose all device
_HELP_
}

prepare_env

json_add_object "data"

setup_gpio() {
    local gnum="$1"
    local gdir="/sys/class/gpio/gpio${gnum}"
    [ ! -e "${gdir}" ] && \
        echo "${gnum}" > '/sys/class/gpio/export'
    if [ ! -e "${gdir}" ] ; then
        echo "Error, failed to export GPIO '${gnum}'" 1>&2
        return 1
    fi
    local gmod="`cat ${gdir}/direction`"
    if [ "${gmod}" != "$2" ] ; then
        echo "$2" > "${gdir}/direction"
        return $?
    fi
    return 0
}

dump_input_val() {
    local gnum="$1"
    setup_gpio "${gnum}" "in"
    local gdir="/sys/class/gpio/gpio${gnum}"
    if [ -e "${gdir}/value" ] ; then
        echo -n "`cat ${gdir}/value`"
        return 0
    fi
    return 1
}

set_output() {
    local gnum="$1"
    local gval="$2"
    setup_gpio "${gnum}" "out"
    echo "${gval}" > "/sys/class/gpio/gpio${gnum}/value"
    return $?
}

# GPIO OUTPUT Pins
GPIO_DO_1=124 # GPIO4_28
GPIO_DO_2=122 # GPIO4_26
GPIO_DO_3=121 # GPIO4_25
GPIO_DO_4=118 # GPIO4_22
GPIO_DO_5=117 # GPIO4_21
GPIO_DO_6=119 # GPIO4_23
GPIO_DO_7=120 # GPIO4_24
GPIO_DO_8=123 # GPIO4_27

# GPIO INPUT Pins
GPIO_DI_01=81 # GPIO3_17
GPIO_DI_02=79 # GPIO3_15
GPIO_DI_03=77 # GPIO3_13
GPIO_DI_04=75 # GPIO3_11
GPIO_DI_05=73 # GPIO3_09
GPIO_DI_06=71 # GPIO3_07
GPIO_DI_07=69 # GPIO3_05
GPIO_DI_08=65 # GPIO3_01
GPIO_DI_09=66 # GPIO3_02
GPIO_DI_10=68 # GPIO3_04
GPIO_DI_11=78 # GPIO3_14
GPIO_DI_12=76 # GPIO3_12
GPIO_DI_13=72 # GPIO3_08
GPIO_DI_14=70 # GPIO3_06
GPIO_DI_15=67 # GPIO3_03
GPIO_DI_16=64 # GPIO3_00

set_output 3 1 # Enable DI pins, GPIO1_03

test_di_via_do() {
    set_output ${GPIO_DO_1} 0; set_output ${GPIO_DO_2} 0
    set_output ${GPIO_DO_3} 0; set_output ${GPIO_DO_4} 0
    set_output ${GPIO_DO_5} 0; set_output ${GPIO_DO_6} 0
    # set_output ${GPIO_DO_7} 0; set_output ${GPIO_DO_8} 0
    local out_01=$(dump_input_val ${GPIO_DI_01})
    local out_02=$(dump_input_val ${GPIO_DI_02})
    local out_03=$(dump_input_val ${GPIO_DI_03})
    local out_04=$(dump_input_val ${GPIO_DI_04})
    local out_05=$(dump_input_val ${GPIO_DI_05})
    local out_06=$(dump_input_val ${GPIO_DI_06})
    local out_07=$(dump_input_val ${GPIO_DI_07})
    local out_08=$(dump_input_val ${GPIO_DI_08})
    local out_09=$(dump_input_val ${GPIO_DI_09})
    local out_10=$(dump_input_val ${GPIO_DI_10})
    local out_11=$(dump_input_val ${GPIO_DI_11})
    local out_12=$(dump_input_val ${GPIO_DI_12})
    local out_13=$(dump_input_val ${GPIO_DI_13})
    local out_14=$(dump_input_val ${GPIO_DI_14})
    local out_15=$(dump_input_val ${GPIO_DI_15})
    local out_16=$(dump_input_val ${GPIO_DI_16})
    local out_val="${out_01}${out_02}${out_03}${out_04}${out_05}${out_06}${out_07}${out_08}"
    out_val="${out_val}${out_09}${out_10}${out_11}${out_12}${out_13}${out_14}${out_15}${out_16}"
    # echo "out_val1: ${out_val}" 1>&2
    if [ "${out_val}" = "1111111111111111" ] ; then
        echo "success"
        return 0
    fi
    echo "failed"
    return 1
}

test_do_via_di() {
    set_output ${GPIO_DO_1} 1; set_output ${GPIO_DO_2} 1
    set_output ${GPIO_DO_3} 1; set_output ${GPIO_DO_4} 1
    set_output ${GPIO_DO_5} 1; set_output ${GPIO_DO_6} 1
    # set_output ${GPIO_DO_7} 1; set_output ${GPIO_DO_8} 1
    local out_01=$(dump_input_val ${GPIO_DI_01})
    local out_02=$(dump_input_val ${GPIO_DI_02})
    local out_03=$(dump_input_val ${GPIO_DI_03})
    local out_04=$(dump_input_val ${GPIO_DI_04})
    local out_05=$(dump_input_val ${GPIO_DI_05})
    local out_06=$(dump_input_val ${GPIO_DI_06})
    local out_07=$(dump_input_val ${GPIO_DI_07})
    local out_08=$(dump_input_val ${GPIO_DI_08})
    local out_09=$(dump_input_val ${GPIO_DI_09})
    local out_10=$(dump_input_val ${GPIO_DI_10})
    local out_11=$(dump_input_val ${GPIO_DI_11})
    local out_12=$(dump_input_val ${GPIO_DI_12})
    local out_13=$(dump_input_val ${GPIO_DI_13})
    local out_14=$(dump_input_val ${GPIO_DI_14})
    local out_15=$(dump_input_val ${GPIO_DI_15})
    local out_16=$(dump_input_val ${GPIO_DI_16})
    local out_val="${out_01}${out_02}${out_03}${out_04}${out_05}${out_06}${out_07}${out_08}"
    out_val="${out_val}${out_09}${out_10}${out_11}${out_12}${out_13}${out_14}${out_15}${out_16}"
    # echo "out_val2: ${out_val}" 1>&2
    if [ "${out_val}" = "0000000000000000" ] ; then
        echo "success"
        return 0
    fi
    echo "failed"
    return 1
}

if [ $# -ge 1 ]; then
	case "$1" in
    DIDO)
        json_add_array "DIDO"
        msg=$(test_di_via_do)
        ret=$?
        json_add_result_to_obj "DI_TEST" "$ret" "$msg"
        sleep 5 # delay 5 seconds for DO_7/DO_8 manual test
        msg=$(test_do_via_di)
        ret=$?
        json_add_result_to_obj "DO_TEST" "$ret" "$msg"

        json_close_array
        ;;
    CAN)
        json_add_array "CAN"
        msg=$(test_can can0 can1)
        ret=$?
        json_add_result_to_obj "CAN0" "$ret" "$msg"

        msg=$(test_can can1 can0)
        ret=$?
        json_add_result_to_obj "CAN1" "$ret" "$msg"

        json_close_array
        ;;
	COM)
		json_add_array "COM"
		msg=$(test_uart ttymxc1 ttymxc2)
		ret=$?
		json_add_result_to_obj "RS485_1" "$ret" "$msg"
		msg=$(test_uart ttymxc2 ttymxc1)
		ret=$?
		json_add_result_to_obj "RS485_2" "$ret" "$msg"
		msg=$(test_uart ttymxc3 ttymxc4)
		ret=$?
		json_add_result_to_obj "RS485_3" "$ret" "$msg"
		msg=$(test_uart ttymxc4 ttymxc3)
		ret=$?
		json_add_result_to_obj "RS485_4" "$ret" "$msg"

		msg=$(test_uart ttysym1 ttysym2)
		ret=$?
		json_add_result_to_obj "RS485_5" "$ret" "$msg"
		msg=$(test_uart ttysym2 ttysym1)
		ret=$?
		json_add_result_to_obj "RS485_6" "$ret" "$msg"
		msg=$(test_uart ttysym3 ttysym4)
		ret=$?
		json_add_result_to_obj "RS485_7" "$ret" "$msg"
		msg=$(test_uart ttysym4 ttysym3)
		ret=$?
		json_add_result_to_obj "RS485_8" "$ret" "$msg"

		json_close_array
		;;
	LED)
		json_add_array "Led"
		msg=$(test_led led-heart led-internet led-wlan)
		ret=$?
		json_add_result_to_obj "led" "$ret" "$msg"
		json_close_array
		;;
	*)
		help
		exit 1
		;;
	esac
else
	json_add_array "Led"
	msg=$(test_led led-heart led-internet)
	ret=$?
	json_add_result_to_obj "led" "$ret" "$msg"
	json_close_array

	json_add_array "OnBoardPort"
	msg=$(test_uart ttymxc1 ttymxc2)
	ret=$?
	json_add_result_to_obj "RS485_1" "$ret" "$msg"
	msg=$(test_uart ttymxc2 ttymxc1)
	ret=$?
	json_add_result_to_obj "RS485_2" "$ret" "$msg"
	msg=$(test_uart ttymxc3 ttymxc4)
	ret=$?
	json_add_result_to_obj "RS485_3" "$ret" "$msg"
	msg=$(test_uart ttymxc4 ttymxc3)
	ret=$?
	json_add_result_to_obj "RS485_4" "$ret" "$msg"

	msg=$(test_uart ttysym1 ttysym2)
	ret=$?
	json_add_result_to_obj "RS485_5" "$ret" "$msg"
	msg=$(test_uart ttysym2 ttysym1)
	ret=$?
	json_add_result_to_obj "RS485_6" "$ret" "$msg"
	msg=$(test_uart ttysym3 ttysym4)
	ret=$?
	json_add_result_to_obj "RS485_7" "$ret" "$msg"
	msg=$(test_uart ttysym4 ttysym3)
	ret=$?
	json_add_result_to_obj "RS485_8" "$ret" "$msg"

	msg=$(test_can can0 can1)
	ret=$?
	json_add_result_to_obj "CAN0" "$ret" "$msg"
	msg=$(test_can can1 can0)
	ret=$?
	json_add_result_to_obj "CAN1" "$ret" "$msg"

	msg=$(test_di_via_do)
	ret=$?
	json_add_result_to_obj "DI_TEST" "$ret" "$msg"

	msg=$(test_do_via_di)
	ret=$?
	json_add_result_to_obj "DO_TEST" "$ret" "$msg"

	msg=$(test_rtc)
	ret=$?
	json_add_result_to_obj "RTC" "$ret" "$msg"
	json_close_array

	json_add_array "Wireless"
	msg=$(test_wifi 0)
	ret=$?
	json_add_result_to_obj "wlan0" "$ret" "$msg"
	json_close_array

	json_add_array "NetWork"
	msg=$(test_4g_modem)
	ret=$?
	json_add_result_to_obj "4g_modem" "$ret" "$msg"

	msg=$(test_net_connect)
	ret=$?
	json_add_result_to_obj "ping" "$ret" "$msg"

	msg=$(test_internet usb0)
	ret=$?
	json_add_result_to_obj "Ping with 4G" "$ret" "$msg"

	msg=$(test_wan eth0)
	ret=$?
	json_add_result_to_obj "WAN" "$ret" "$msg"

	msg=$(test_lan)
	ret=$?
	json_add_result_to_obj "LAN" "$ret" "$msg"
	json_close_array
fi
json_close_object
echo ""
echo "---TEST SUMMARY---"
#cat $TEST_SUMMARY
sleep 1
json_str=$(json_dump)
echo "test_result:$json_str"

restore_env
