#!/bin/bash -e

VERSION=V1.2.9
export DISPLAY=:0 

#---------------------------------------------------------------
#获取板卡的参数
#---------------------------------------------------------------

board_info() {
    if [[ "$2" == "rk3128" ]]; then
        case $1 in
            0000)
                BOARD_NAME='LubanCat-0H'
                BOARD_DTB='rk3128-lubancat-0h.dtb'
                UENV_TXT='uEnvLubanCat0H.txt'
                ;;
            *)
                [ "$INTERACTIVE" = True ] && echo "Device ID Error !!!"
                BOARD_NAME='LubanCat-RK3128'
                BOARD_DTB='rk3128-lubancat-generic.dtb'
                UENV_TXT='uEnvLubanCat.txt'
                ;;
        esac
        BOARD_CPU='rk3128'
    elif [[ "$2" == "rk3528" ||  "$2" == "rk3528a" ]]; then
        case $1 in
            0001)
                BOARD_NAME='LubanCat-Q1'
                BOARD_DTB='rk3528-lubancat-q1.dtb'
                UENV_TXT='uEnvLubanCatQ1.txt'
                ;;
            *)
                [ "$INTERACTIVE" = True ] && echo "Device ID Error !!!"
                BOARD_NAME='LubanCat-RK3528'
                BOARD_DTB='rk3528-lubancat-generic.dtb'
                UENV_TXT='uEnvLubanCat.txt'
                ;;
        esac
        BOARD_CPU='rk3528'
    elif [[ "$2" == "rk3562" ]]; then
        case $1 in
            0000)
                BOARD_NAME='LubanCat-1HS'
                BOARD_DTB='rk3562-lubancat-1hs.dtb'
                UENV_TXT='uEnvLubanCat1HS.txt'
                ;;
	   0100)
                BOARD_NAME='LubanCat-1HSI'
                BOARD_DTB='rk3562-lubancat-1hs.dtb'
                BOARD_uEnv='uEnvLubanCat1HS.txt'
                ;;

            *)
                [ "$INTERACTIVE" = True ] && echo "Device ID Error !!!"
                BOARD_NAME='LubanCat-RK3562'
                BOARD_DTB='rk3562-lubancat-generic.dtb'
                UENV_TXT='uEnvLubanCat.txt'
                ;;
        esac
        BOARD_CPU='rk3562'
    elif [[ "$2" == "rk3566" ||  "$2" == "rk3568" ]]; then
        case $1 in
            0000)
                BOARD_NAME='LubanCat-1'
                BOARD_DTB='rk3566-lubancat-1.dtb'
                UENV_TXT='uEnvLubanCat1.txt'
                BOARD_CPU='rk3566'
                ;;
            0001)
                BOARD_NAME='LubanCat-1IOF'
                BOARD_DTB='rk3566-lubancat-1io.dtb'
                UENV_TXT='uEnvLubanCat1IO.txt'
                BOARD_CPU='rk3566'
                ;;
            0002)
                BOARD_NAME='LubanCat-1IOB'
                BOARD_DTB='rk3566-lubancat-1io.dtb'
                UENV_TXT='uEnvLubanCat1IO.txt'
                BOARD_CPU='rk3566'
                ;;
            0100)
                BOARD_NAME='LubanCat-1N'
                BOARD_DTB='rk3566-lubancat-1n.dtb'
                UENV_TXT='uEnvLubanCat1N.txt'
                BOARD_CPU='rk3566'
                ;;
            0102)
                BOARD_NAME='LubanCat-2IOBI'
                BOARD_DTB='rk3568-lubancat-2io.dtb'
                UENV_TXT='uEnvLubanCat2IO.txt'
                BOARD_CPU='rk3568'
                ;;
            0200)
                BOARD_NAME='LubanCat-0N'
                BOARD_DTB='rk3566-lubancat-0.dtb'
                UENV_TXT='uEnvLubanCatZN.txt'
                BOARD_CPU='rk3566'
                ;;
            0201)
                BOARD_NAME='LubanCat-1H'
                BOARD_DTB='rk3566-lubancat-1h.dtb'
                UENV_TXT='uEnvLubanCat1H.txt'
                BOARD_CPU='rk3566'
                ;;
            0300)
                BOARD_NAME='LubanCat-0W'
                BOARD_DTB='rk3566-lubancat-0.dtb'
                UENV_TXT='uEnvLubanCatZW.txt'
                BOARD_CPU='rk3566'
                ;;
            0304)
                BOARD_NAME='LubanCat-CM4'
                BOARD_DTB='rk3566-lubancat-cm4.dtb'
                UENV_TXT='uEnvLubanCatCM4.txt'
                BOARD_CPU='rk3566'
                ;;
            0400)
                BOARD_NAME='LubanCat-2'
                BOARD_DTB='rk3568-lubancat-2.dtb'
                UENV_TXT='uEnvLubanCat2.txt'
                BOARD_CPU='rk3568'
                ;;
            0402)
                BOARD_NAME='LubanCat-2 v1'
                BOARD_DTB='rk3568-lubancat-2-v1.dtb'
                UENV_TXT='uEnvLubanCat2-V1.txt'
                BOARD_CPU='rk3568'
                ;;
            0403)
                BOARD_NAME='LubanCat-2 v2'
                BOARD_DTB='rk3568-lubancat-2-v2.dtb'
                UENV_TXT='uEnvLubanCat2-V2.txt'
                BOARD_CPU='rk3568'
                ;;
            0404)
                BOARD_NAME='LubanCat-2 v3'
                BOARD_DTB='rk3568-lubancat-2-v3.dtb'
                UENV_TXT='uEnvLubanCat2-V3.txt'
                BOARD_CPU='rk3568'
                ;;
            0500 |\
            0600)
                BOARD_NAME='LubanCat-2N'
                BOARD_DTB='rk3568-lubancat-2n.dtb'
                UENV_TXT='uEnvLubanCat2N.txt'
                BOARD_CPU='rk3568'
                ;;
            0501)
                BOARD_NAME='LubanCat-2N v2'
                BOARD_DTB='rk3568-lubancat-2n-v2.dtb'
                UENV_TXT='uEnvLubanCat2N-V2.txt'
                BOARD_CPU='rk3568'
                ;;
            0601)
                BOARD_NAME='LubanCat-2H'
                BOARD_DTB='rk3568-lubancat-2h.dtb'
                UENV_TXT='uEnvLubanCat2H.txt'
                BOARD_CPU='rk3568'
                ;;
            0700)
                BOARD_NAME='LubanCat-2IOF'
                BOARD_DTB='rk3568-lubancat-2io.dtb'
                UENV_TXT='uEnvLubanCat2IO.txt'
                BOARD_CPU='rk3568'
                ;;
            0701)
                BOARD_NAME='LubanCat-2IOB'
                BOARD_DTB='rk3568-lubancat-2io.dtb'
                UENV_TXT='uEnvLubanCat2IO.txt'
                BOARD_CPU='rk3568'
                ;;
            *)
                [ "$INTERACTIVE" = True ] && echo "Device ID Error !!!"
                BOARD_NAME='LubanCat-RK356X'
                BOARD_DTB='rk356x-lubancat-generic.dtb'
                UENV_TXT='uEnvLubanCat.txt'
                ;;
        esac
    elif [[ "$2" == "rk3576" ]]; then
            case $1 in
            0000)
                BOARD_NAME='LubanCat-3'
                BOARD_DTB='rk3576-lubancat-3.dtb'
                UENV_TXT='uEnvLubanCat3.txt'
                BOARD_CPU='rk3576'
                ;;
            0001)
                BOARD_NAME='LubanCat-3IO'
                BOARD_DTB='rk3576-lubancat-3io.dtb'
                UENV_TXT='uEnvLubanCat3IO.txt'
                BOARD_CPU='rk3576'
                ;;
            *)
                [ "$INTERACTIVE" = True ] && echo "Device ID Error !!!"
                BOARD_NAME='LubanCat-RK3576'
                BOARD_DTB='rk3576-lubancat-generic.dtb'
                UENV_TXT='uEnvLubanCat.txt'
                BOARD_CPU='rk3576'
                ;;
        esac
    elif [[ "$2" == "rk3588" ||  "$2" == "rk3588s" ]]; then
            case $1 in
            0101)
                BOARD_NAME='LubanCat-4'
                BOARD_DTB='rk3588s-lubancat-4.dtb'
                UENV_TXT='uEnvLubanCat4.txt'
                BOARD_CPU='rk3588s'
                ;;
            0102)
                BOARD_NAME='LubanCat-4 v1'
                BOARD_DTB='rk3588s-lubancat-4-v1.dtb'
                UENV_TXT='uEnvLubanCat4-V1.txt'
                BOARD_CPU='rk3588s'
                ;;
            0201)
                BOARD_NAME='LubanCat-4IOF'
                BOARD_DTB='rk3588s-lubancat-4io.dtb'
                UENV_TXT='uEnvLubanCat4IO.txt'
                BOARD_CPU='rk3588s'
                ;;
            0301)
                BOARD_NAME='LubanCat-4IOB'
                BOARD_DTB='rk3588s-lubancat-4io.dtb'
                UENV_TXT='uEnvLubanCat4IO.txt'
                BOARD_CPU='rk3588s'
                ;;
            0401)
                BOARD_NAME='LubanCat-5'
                BOARD_DTB='rk3588-lubancat-5.dtb'
                UENV_TXT='uEnvLubanCat5.txt'
                BOARD_CPU='rk3588'
                ;;
            0402)
                BOARD_NAME='LubanCat-5 v2'
                BOARD_DTB='rk3588-lubancat-5-v2.dtb'
                UENV_TXT='uEnvLubanCat5-V2.txt'
                BOARD_CPU='rk3588'
                ;;
            0501)
                BOARD_NAME='LubanCat-5IOF'
                BOARD_DTB='rk3588-lubancat-5io.dtb'
                UENV_TXT='uEnvLubanCat5IO.txt'
                BOARD_CPU='rk3588'
                ;;
            0601)
                BOARD_NAME='LubanCat-5IOB'
                BOARD_DTB='rk3588-lubancat-5io.dtb'
                UENV_TXT='uEnvLubanCat5IO.txt'
                BOARD_CPU='rk3588'
                ;;
            *)
                [ "$INTERACTIVE" = True ] && echo "Device ID Error !!!"
                BOARD_NAME='LubanCat-RK3588'
                BOARD_DTB='rk3588-lubancat-generic.dtb'
                UENV_TXT='uEnvLubanCat.txt'
                ;;
        esac
    fi

    BOARD_MESSAGE="${BOARD_NAME} 是野火科技推出的基于RockChip ${BOARD_CPU}设计的一款低功耗、高性能单板电脑， 保留了完善的硬件资源，充分考虑了用户的使用需求，在成本优化的同时，引出了尽可能多的外设功能。\n\n\
    BOARD_NAME : $BOARD_NAME\n\
    BOARD_DTB : $BOARD_DTB\n\
    UENV_TXT : $UENV_TXT\n\
    BOARD_CPU : $BOARD_CPU\n\ "

    echo "BOARD_NAME:"$BOARD_NAME >> $debug_file
    echo "BOARD_DTB:"$BOARD_DTB >> $debug_file
    echo "UENV_TXT:"$UENV_TXT >> $debug_file
    echo "BOARD_CPU:"$BOARD_CPU >> $debug_file
}

# voltage_scale
# 1.7578125 8bit
# 0.439453125 12bit
get_index(){

    ADC_RAW=$(cat /sys/bus/iio/devices/iio\:device0/in_voltage${1}_raw)
    echo ADC_CH:$1 ADC_RAW:$ADC_RAW >> $debug_file
    INDEX=0xff

    if [ $(echo "$ADC_voltage_scale > 1 "|bc) -eq 1 ] ; then
        declare -a ADC_INDEX=(229 344 460 595 732 858 975 1024)
    else
        declare -a ADC_INDEX=(916 1376 1840 2380 2928 3432 3900 4096)
    fi

    for i in 00 01 02 03 04 05 06 07; do
        if [ $ADC_RAW -lt ${ADC_INDEX[$i]} ]; then
            INDEX=$i
            break
        fi
    done
}


board_id() {
    ADC_voltage_scale=$(cat /sys/bus/iio/devices/iio\:device0/in_voltage_scale)
    echo "ADC_voltage_scale:"$ADC_voltage_scale >> $debug_file

    SOC_type=$(cat /proc/device-tree/compatible | cut -d,  -f 3 | sed 's/\x0//g')
    echo "SOC_type:"$SOC_type >> $debug_file

    if [[ "$SOC_type" == "rk3128" ]]; then
        get_index 0
        ADC_INDEX_H=$INDEX

        get_index 2
        ADC_INDEX_L=$INDEX
    else
        get_index 2
        ADC_INDEX_H=$INDEX

        get_index 3
        ADC_INDEX_L=$INDEX
    fi

    BOARD_ID=$ADC_INDEX_H$ADC_INDEX_L
    echo "BOARD_ID:"$BOARD_ID >> $debug_file
}

get_board_type(){
    SOC=$(cat /proc/device-tree/compatible | tr -d '\0')
    BOARD=$(cat /proc/device-tree/model | tr -d '\0' )

    if [[ $SOC == *"rk3588s"* && $BOARD == *"LubanCat-4"* ]]; then
            BOARD_NAME='LubanCat-4'
            BOARD_DTB='rk3588s-lubancat-4.dtb'
            UENV_TXT='uEnvLubanCat4.txt'
            BOARD_CPU='rk3588s'
            BOARD_MESSAGE="LubanCat-4 是野火科技推出的基于RockChip RK3588S设计的一款低功耗、高性能单板电脑， 保留了完善的硬件资源，充分考虑了用户的使用需求，在成本优化的同时，引出了尽可能多的外设功能\n\n\
BOARD_NAME : $BOARD_NAME\n\
BOARD_DTB : $BOARD_DTB\n\
UENV_TXT : $UENV_TXT\n\
BOARD_CPU : $BOARD_CPU\n\
    "
    fi

    if [[ $SOC == *"rk3588"* && $BOARD == *"LubanCat-5"* ]]; then
            BOARD_NAME='LubanCat-5'
            BOARD_DTB='rk3588-lubancat-5.dtb'
            UENV_TXT='uEnvLubanCat5.txt'
            BOARD_CPU='rk3588'
            BOARD_MESSAGE="LubanCat-5 是野火科技推出的基于RockChip RK3588设计的一款低功耗、高性能单板电脑， 保留了完善的硬件资源，充分考虑了用户的使用需求，在成本优化的同时，引出了尽可能多的外设功能\n\n\
BOARD_NAME : $BOARD_NAME\n\
BOARD_DTB : $BOARD_DTB\n\
UENV_TXT : $UENV_TXT\n\
BOARD_CPU : $BOARD_CPU\n\
    "
    fi
}


do_show_board(){
    whiptail --title "板卡信息" --msgbox "$BOARD_MESSAGE" 20 60
}

#---------------------------------------------------------------
#引脚复用(N选N)
#---------------------------------------------------------------

get_dt_status() {
    DT_STATUS=$(grep "lubancat-$1-overlay." "/boot/uEnv/$UENV_TXT" | cut -c1)
    if [ "$DT_STATUS" == "#" ] || [ -z "$DT_STATUS" ];then
        flag="OFF"
        echo 0
    else
        flag="ON"
        echo 1
    fi
}

set_dt() {
   	if [ $2 == "OFF" ]; then
        sed -i -e "s/^dtoverlay=\(.*-$1-overlay.*\)/#dtoverlay=\1/g" "/boot/uEnv/$UENV_TXT"
	elif [ $2 == "ON" ]; then
		sed -i -e "s/^#dtoverlay=\(.*-$1-overlay.*\)/dtoverlay=\1/g" "/boot/uEnv/$UENV_TXT"
    else
        echo "wrong data"
	fi
}

do_set_pin_menu() {
    PIN_FUN_START=$(grep -n "#overlay_start" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    PIN_FUN_END=$(grep -n "#display" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    if [ -z "$PIN_FUN_END" ]; then
        PIN_FUN_END=$(grep -n "# Display" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    fi
    PIN_FUN=$(sed -n "${PIN_FUN_START},${PIN_FUN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-\(.*\)-overlay.dtbo$/\1/p')
    PIN_FUN_COUNT=$(sed -n "${PIN_FUN_START},${PIN_FUN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-\(.*\)-overlay.dtbo$/\1/p' | wc -l)
    echo $PIN_FUN_START $PIN_FUN_END >> $debug_file
    echo $PIN_FUN >> $debug_file
    echo $PIN_FUN_COUNT >> $debug_file
    MAX_COUNT="30"

    declare -A $PIN_STATUS > /dev/null
    declare -a PIN_FUN_ARR=($PIN_FUN) > /dev/null

    int="0"
    while (( $int < $PIN_FUN_COUNT ))
	do
        get_dt_status ${PIN_FUN_ARR[$int]} > /dev/null
        PIN_STATUS[$int]="$flag"
        int=$(expr $int + 1)
	done

    int="$PIN_FUN_COUNT"
    while (( $int < $MAX_COUNT ))
	do
        PIN_FUN_ARR[$int]="NULL"
        PIN_STATUS[$int]="OFF"
        int=$(expr $int + 1)
	done

	D2=$(whiptail --title "配置你的板卡引脚的复用功能" --checklist  --ok-button "空格键选中" --cancel-button "Enter键设置"\
	"配置你的板卡引脚的复用功能(完成后-reboot-应用配置)" 20 60 12 \
	"0" "${PIN_FUN_ARR[0]}"   		${PIN_STATUS[0]} \
	"1" "${PIN_FUN_ARR[1]}"   		${PIN_STATUS[1]}  \
	"2" "${PIN_FUN_ARR[2]}"   		${PIN_STATUS[2]}  \
	"3" "${PIN_FUN_ARR[3]}"   		${PIN_STATUS[3]}  \
	"4" "${PIN_FUN_ARR[4]}"   		${PIN_STATUS[4]}  \
	"5" "${PIN_FUN_ARR[5]}"   		${PIN_STATUS[5]} \
	"6" "${PIN_FUN_ARR[6]}"   		${PIN_STATUS[6]} \
	"7" "${PIN_FUN_ARR[7]}"   		${PIN_STATUS[7]} \
	"8" "${PIN_FUN_ARR[8]}"   		${PIN_STATUS[8]} \
    "9" "${PIN_FUN_ARR[9]}"   		${PIN_STATUS[9]} \
    "10" "${PIN_FUN_ARR[10]}"   	${PIN_STATUS[10]} \
    "11" "${PIN_FUN_ARR[11]}"   	${PIN_STATUS[11]} \
    "12" "${PIN_FUN_ARR[12]}"   	${PIN_STATUS[12]} \
	"13" "${PIN_FUN_ARR[13]}"   	${PIN_STATUS[13]}  \
	"14" "${PIN_FUN_ARR[14]}"   	${PIN_STATUS[14]}  \
	"15" "${PIN_FUN_ARR[15]}"   	${PIN_STATUS[15]}  \
	"16" "${PIN_FUN_ARR[16]}"   	${PIN_STATUS[16]}  \
	"17" "${PIN_FUN_ARR[17]}"   	${PIN_STATUS[17]} \
	"18" "${PIN_FUN_ARR[18]}"   	${PIN_STATUS[18]} \
	"19" "${PIN_FUN_ARR[19]}"   	${PIN_STATUS[19]} \
	"20" "${PIN_FUN_ARR[20]}"   	${PIN_STATUS[20]} \
    "21" "${PIN_FUN_ARR[21]}"   	${PIN_STATUS[21]} \
    "22" "${PIN_FUN_ARR[22]}"   	${PIN_STATUS[22]} \
    "23" "${PIN_FUN_ARR[23]}"   	${PIN_STATUS[23]} \
	"24" "${PIN_FUN_ARR[24]}"   	${PIN_STATUS[24]}  \
	"25" "${PIN_FUN_ARR[25]}"   	${PIN_STATUS[25]} \
	"26" "${PIN_FUN_ARR[26]}"   	${PIN_STATUS[26]} \
	"27" "${PIN_FUN_ARR[27]}"   	${PIN_STATUS[27]} \
	"28" "${PIN_FUN_ARR[28]}"   	${PIN_STATUS[28]} \
    "29" "${PIN_FUN_ARR[29]}"   	${PIN_STATUS[29]} \
	3>&1 1>&2 2>&3)

	exitstatus=$?
    echo $exitstatus > /dev/null
    if [ $exitstatus = 0 ]; then
        echo $D2 >> $debug_file
        int="0"
        while (( $int<$PIN_FUN_COUNT ))
        do
            PIN_STATUS[$int]="OFF"
            set_dt "${PIN_FUN_ARR[$int]}" "OFF"
            int=$(expr $int + 1)
        done

        declare -a D2_ARR=($D2)
        D2_SIZE=${#D2_ARR[*]}

        int="0"
        while (( $int < $D2_SIZE ))
        do
            D2_ARR[$int]="${D2_ARR[$int]//\"/}" 
            set_dt ${PIN_FUN_ARR[${D2_ARR[$int]}]} "ON"
            int=$(expr $int + 1)
        done
    fi
    
}

#---------------------------------------------------------------
#配置usb复用功能(N选1)
#---------------------------------------------------------------
do_set_usb_menu(){
    USB_CONFIG=$(cat /etc/init.d/.usb_config)
    echo $USB_CONFIG
    declare -A $USB_STATUS

    int="0"
    while (( $int<6 ))
	do
        USB_STATUS[$int]="OFF"
        int=$(expr $int + 1)
	done

    case $USB_CONFIG in
        "usb_adb_en")
            USB_STATUS[0]="ON" ;;
        "usb_rndis_en")
            USB_STATUS[1]="ON" ;;
        "usb_acm_en")
            USB_STATUS[2]="ON" ;;
        "usb_ums_en")
            USB_STATUS[3]="ON" ;;
        "usb_uac1_en")
            USB_STATUS[4]="ON" ;;
        "usb_uac2_en")
            USB_STATUS[5]="ON" ;;
    esac

    DISTROS=$(whiptail --title "Test Checklist Dialog" --radiolist \
    "What is the Linux distro of your choice?" 20 60 6 \
    "ADB" "ADB 调试功能" ${USB_STATUS[0]} \
    "RNDIS" "USB模拟以太网" ${USB_STATUS[1]} \
    "ACM" "USB虚拟串口" ${USB_STATUS[2]} \
    "UMS" "虚拟存储设备" ${USB_STATUS[3]} \
    "UAC1" "虚拟声卡" ${USB_STATUS[4]} \
    "UAC2" "虚拟声卡" ${USB_STATUS[5]} \
    3>&1 1>&2 2>&3)
    
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
        echo "The chosen distro is:" $DISTROS
    else
        echo "You chose Cancel."
    fi

    case $DISTROS in
        "ADB")
            echo usb_adb_en > /etc/init.d/.usb_config ;;
        "RNDIS")
            echo usb_rndis_en > /etc/init.d/.usb_config ;;
        "ACM")
            echo usb_acm_en > /etc/init.d/.usb_config ;;
        "UMS")
            echo usb_ums_en > /etc/init.d/.usb_config ;;
        "UAC1")
            echo usb_uac1_en > /etc/init.d/.usb_config ;;
        "UAC2")
            echo usb_uac2_en > /etc/init.d/.usb_config ;;
    esac    
}
#---------------------------------------------------------------
#sd卡备份系统与重新烧录
#---------------------------------------------------------------

do_sd_help(){
    whiptail --title "系统镜像备份与烧录" --msgbox "基于鲁班猫镜像构建与部署篇的系统镜像备份并重新烧录章节，将操作步骤通过脚本一键完成，方便开发和生产。" 20 60
    whiptail --title "SD备份eMMC" --msgbox "1. 自动压缩eMMC没有使用的空间，减小备份镜像的大小。
2. 添加随机网口Mac和扩充脚本。
3. 使用dd进行备份，与SDK构建的格式不一样。" 20 60
    whiptail --title "SD烧录eMMC" --msgbox "1.将备份镜像重新烧录到eMMC，镜像需位于/home/cat/或者/mnt/，名字为backup.img。
2. 只能烧录dd打包的镜像，不能烧录SDK构建的通用镜像。" 20 60
    do_set_sd_backup_and_download_menu
}

do_sd_random_mac_and_capacity_expansion(){
    #挂载emmc根文件系统分区
    mkdir -p /media/emmc

    # 检查emmc的boot分区是否挂载
    if ! mount | grep "$BOOT_PARTITION" > /dev/null; then
        mount $BOOT_PARTITION /media/emmc
    else 
        umount $BOOT_PARTITION
        mount $BOOT_PARTITION /media/emmc
    fi

    # 删除可能存在的扩容和随机网口的初始化判断文件
    rm -rf /media/emmc/boot_dilatation_init
    rm -rf /media/emmc/boot_mac_*
    sync
    sleep 2
    umount $BOOT_PARTITION
    sleep 2

    # 检查emmc的根文件系统是否挂载
    if ! mount | grep "$PARTITION" > /dev/null; then
        mount $PARTITION /media/emmc
    else 
        umount $PARTITION
        mount $PARTITION /media/emmc
    fi

    boot_init_file="/media/emmc/etc/init.d/boot_init.sh"
    # 判断是否已添加
    if ! grep -q "boot_dilatation_init" "$boot_init_file"; then

    #添加随机mac和扩容到boot_init.sh初始化脚本
    echo '
#-------扩容------
#判断/boot/boot_dilatation_init文件是否存在,不存在则进行扩容
if [ ! -e "/boot/boot_dilatation_init" ] ;
   then

    #转换MBR -> GPT分区表
    sgdisk -e /dev/mmcblk0

    #修改/dev/mmcblk0p3根文件系统分区空间配置
    #printf "yes\n-1\nyes" | parted /dev/mmcblk0 resizepart 3 ---pretend-input-tty

    #根据配置重新分配空间
    resize2fs /dev/mmcblk0p3

    #创建判断文件，第二次启动存在该文件不再执行此扩容
    touch /boot/boot_dilatation_init
fi

# 遍历eth0到eth3网口
for i in {0..3}; do
    iface="eth$i"

    # 检查接口是否存在
    if ifconfig "$iface" &> /dev/null; then

        # 判断是否是原生GMAC网口
        if cat /sys/class/net/"$iface"/device/of_node/compatible | grep  "gmac" &> /dev/null; then
            # 原生GMAC网口使用rk工具——vendor_storage
            # 判断/boot/boot_mac_ethX，不存在则进行随机mac
            if [ ! -e "/boot/boot_mac_$iface" ] ; then
                # 生成随机MAC地址
                new_mac=$(printf '%01x2%02x%02x%02x%02x%02x' $((RANDOM%16)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)))

                # 创建判断文件，第二次启动存在该文件则不再执行随机mac
                touch /boot/boot_mac_$iface

                # 保存随机生成的mac到判断文件中
                echo "$new_mac" > /boot/boot_mac_$iface

                # 获取生成的mac并修改
                vendor_lan_mac=$vendor_lan_mac$(cat /boot/boot_mac_$iface)
                # 使用vendor_storage工具固化修改原生GMAC网口MAC
                vendor_storage -w VENDOR_LAN_MAC_ID -t hex -i "${vendor_lan_mac}"

                # 确保第一次启动时生效，因为vendor_storage固化后需重启才能生效
                ip link set dev "$iface" down
                ifconfig "${iface}" hw ether "${new_mac}"
                ip link set dev "$iface" up
            fi
        else
            # 非原生网口每次启动都使用ifconfig修改mac
            # 判断/boot/boot_mac_ethX，不存在则进行随机mac
            if [ ! -e "/boot/boot_mac_$iface" ] ; then
                # 生成随机MAC地址
                new_mac=$(printf '%01x2:%02x:%02x:%02x:%02x:%02x' $((RANDOM%16)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)))

                # 创建判断文件，第二次启动存在该文件则不再执行随机mac
                touch /boot/boot_mac_$iface

                # 保存随机生成的mac到判断文件中
                echo "$new_mac" > /boot/boot_mac_$iface
            fi

            ip link set dev "$iface" down

            # 获取生成的mac并修改
            mac_address=$(cat /boot/boot_mac_$iface)
            ifconfig $iface hw ether $mac_address

            ip link set dev "$iface" up
        fi
    fi
done' | sudo tee -a $boot_init_file >> /dev/null 2>&1

        echo "添加随机mac和扩容分区内容到eMMC boot_init.sh初始化脚本完成"

    else
        echo "随机网口Mac和扩容分区内容已经添加"
        echo " "
    fi

    sync
    sleep 2
    umount $PARTITION
}

do_sd_compression_partition(){

    # 获取当前存储可用空间
    current_device_available_space=$(df -m | grep $ROOT_FS | awk '{print $4}')

    # 获取备份文件系统分区的起始地址
    rootfs_start=$(parted $EMMC_DEVICE unit MB print | awk '/^ 3/{print $2}' | tr -d 'MB')
    
    # 获取备份文件系统分区总大小
    rootfs_total_space=$(parted $EMMC_DEVICE unit MB print | awk '/^ 3/{print $4}' | tr -d 'MB')

    # 获取需备份的文件系统可调整的最小大小
    rootfs_min_size=$(resize2fs -P $PARTITION 2> /dev/null | grep -oP '\d+' | awk '{print $NF}')

    # 转换为mb
    rootfs_min_size_mb=$(( (rootfs_min_size * 4096) / 1024 / 1024 + 1 ))

    # 文件系统压缩后的空间，余量200M
    rootfs_required_space=$((rootfs_min_size_mb + 200))

    # 压缩分区的结束地址，为起始地址+容量
    rootfs_end=$((rootfs_start + rootfs_required_space))

    # 检查是否需要调整分区
    if [ "$rootfs_required_space" -lt "$rootfs_total_space" ]; then
        # echo "可以进行分区调整，备份的文件系统的已用大小：${rootfs_min_size_mb}MB，调整分区大小为：${rootfs_required_space}MB"
        echo "可以进行分区调整，备份的文件系统的已用大小：${rootfs_min_size_mb}MB，调整分区大小为最小可能的大小"

        # 检查文件系统
        echo "检查文件系统是否挂载..."
        if mount | grep "$PARTITION" > /dev/null; then
            echo "$PARTITION 已挂载，正在卸载..."
            umount "$PARTITION" || { echo "卸载失败，请确保没有使用该分区"; exit 1; }
        else
            echo 文件系统未挂载，可进行压缩空间和备份...
        fi

        # 提前检查并修复文件系统
        e2fsck -p -f $PARTITION 

        # 调整分区大小
        # echo "开始调整文件系统分区大小为 ${rootfs_required_space}MB"
        echo "开始调整文件系统分区大小"

        # 压缩文件系统
        # resize2fs $PARTITION "${rootfs_required_space}MB"
        resize2fs -M $PARTITION

        # 使用parted调整分区大小
        #printf "${rootfs_end}MB\nyes" | parted $EMMC_DEVICE resizepart 3 ---pretend-input-tty

        #重新调整文件系统大小
        #resize2fs $PARTITION

        # 再次检查并修复文件系统
        e2fsck -p -f $PARTITION > /dev/null 2>&1

        echo "文件系统分区调整完成。"
    else
        echo "文件系统分区实际使用部分和总容量接近，无需调整，备份文件系统的已用大小：${rootfs_min_size_mb}MB，总大小：${rootfs_total_space}"
    fi
        echo " "
        echo "正在执行sync同步...."
        sync
}


do_sd_dd_package_system(){
    echo "开启打包镜像，请耐心等待..."

    img_size=$rootfs_end

    if [ "$current_device_available_space" -lt "$img_size" ]; then
        if [ -e /dev/sda ] || [ -e /dev/sda1 ]; then

            if [ -e /dev/sda1 ]; then
                move_disk_partitions=/dev/sda1
            else
                move_disk_partitions=/dev/sda
            fi

            sd_fs_type=$(blkid -o value -s TYPE $move_disk_partitions)

            if [ "$sd_fs_type" == "ntfs" ]; then
                whiptail --title "检测" --msgbox "当前SD卡空间不足以备份eMMC！\n检测到插入U盘，磁盘符为$move_disk_partitions，并且U盘格式为NTFS格式，将备份镜像到U盘。" 20 60
                if mount | grep "$move_disk_partitions" > /dev/null; then
                    umount $move_disk_partitions
                fi
                mount -t ntfs $move_disk_partitions /mnt/
                #转换MBR -> GPT分区表
                sgdisk -e /dev/mmcblk0
                echo "正在为备份前的系统检查并修复GPT分区表...."
                dd if=$EMMC_DEVICE of=/mnt/backup.img count=$img_size bs=1024k conv=sync status=progress
                echo "正在执行sync同步，请耐心等待...."
                sync
                whiptail --title "检测" --msgbox "备份已完成！\n生成的镜像位于/mnt/backup.img" 20 60
                do_set_sd_backup_and_download_menu
            else
                whiptail --title "检测" --msgbox "当前SD卡空间不足以备份eMMC！\n检测到插入U盘，磁盘符为$move_disk_partitions，但U盘格式不是NTFS格式，无法进行备份！\n请格式化为NTFS格式再尝试备份。" 20 60
                do_set_sd_backup_and_download_menu
            fi
        else
            whiptail --title "检测" --msgbox "当前SD卡不足以备份eMMC，请插入U盘！\n插入的U盘请提前格式化为NTFS格式！" 20 60
            do_set_sd_backup_and_download_menu
        fi
    else
        #转换MBR -> GPT分区表
        sgdisk -e /dev/mmcblk0
        echo "正在为备份前的系统检查并修复GPT分区表...."
        dd if=$EMMC_DEVICE of=/home/cat/backup.img count=$img_size bs=1024k conv=sync status=progress
        echo "正在执行sync同步，请耐心等待...."
        sync

        whiptail --title "检测" --msgbox "备份已完成！\n生成的镜像位于/home/cat/backup.img" 20 60
        do_set_sd_backup_and_download_menu
    fi
}

do_sd_start_the_medium(){
    # 设置eMMC设备和分区
    EMMC_DEVICE="/dev/mmcblk0"
    BOOT_PARTITION="${EMMC_DEVICE}p2"
    PARTITION="${EMMC_DEVICE}p3"

    # 获取当前根文件系统的设备
    ROOT_FS=$(df / | awk 'NR==2 {print $1}')
    }

    do_sd_backup(){
    # 检测启动设备
    do_sd_start_the_medium

    # 如果不是eMMC启动
    if [ "$ROOT_FS" != "$PARTITION" ]; then
        echo "------------------------------------------------"
        echo "------------------开启备份eMMC------------------"
        echo "------------------------------------------------"

        rm -rf /home/cat/backup.img
        rm -rf /mnt/backup.img

        do_sd_random_mac_and_capacity_expansion
        do_sd_compression_partition
        do_sd_dd_package_system
    else 
        whiptail --title "检测" --msgbox "检测到不是SD卡启动系统，无法备份eMMC!" 20 60
        do_set_sd_backup_and_download_menu
    fi
}

do_sd_download(){
    # 检测启动设备
    do_sd_start_the_medium

    # 如果不是 eMMC 启动
    if [ "$ROOT_FS" != "$PARTITION" ]; then
        if [ -f /home/cat/backup.img ] && [ ! -f /mnt/backup.img ]; then
            if whiptail --title "检测" --yes-button "YES" --no-button "NO" \
                --yesno "存在 /home/cat/backup.img，可烧录到eMMC。\n烧录会格式化eMMC，是否烧录？" 20 60; then
                echo "清除eMMC分区表..."
                dd if=/dev/zero of=$EMMC_DEVICE bs=1M count=16
                echo "开始烧录eMMC...."
                dd if=/home/cat/backup.img of=$EMMC_DEVICE bs=1024k conv=sync status=progress
                echo "正在执行sync同步...."
                sync
                #转换MBR -> GPT分区表
                sgdisk -e /dev/mmcblk0
                echo "正在检查系统的GPT分区表并修复...."

                whiptail --title "检测" --msgbox "烧录已完成！" 20 60
            else
                do_set_sd_backup_and_download_menu
            fi
        elif [ ! -f /home/cat/backup.img ] && [ -f /mnt/backup.img ]; then
            if whiptail --title "检测" --yes-button "YES" --no-button "NO" \
                --yesno "存在 /mnt/backup.img，可烧录到eMMC。\n烧录会格式化eMMC，是否烧录？" 20 60; then
                echo "清除eMMC分区表..."
                dd if=/dev/zero of=$EMMC_DEVICE bs=1M count=16
                echo "开始烧录eMMC...."
                dd if=/mnt/backup.img of=$EMMC_DEVICE bs=1024k conv=sync status=progress
                echo "正在执行sync同步...."
                sync
                #转换MBR -> GPT分区表
                sgdisk -e /dev/mmcblk0
                echo "正在检查系统的GPT分区表并修复...."
                whiptail --title "检测" --msgbox "烧录已完成！" 20 60
            else
                do_set_sd_backup_and_download_menu
            fi
        elif [ -f /home/cat/backup.img ] && [ -f /mnt/backup.img ]; then
            whiptail --title "检测" --msgbox "存在/home/cat/backup.img以及/mnt/backup.img，请先删除其中一个再尝试烧录。" 20 60
        else
            whiptail --title "检测" --msgbox "不存在/home/cat/backup.img或者/mnt/backup.img，无法进行烧录！" 20 60
        fi
        do_set_sd_backup_and_download_menu
    else
        whiptail --title "检测" --msgbox "检测到不是SD卡启动系统，无法下载镜像到eMMC!" 20 60
        do_set_sd_backup_and_download_menu
    fi
}


do_set_sd_backup_and_download_menu(){
    local FUN
    FUN=$(whiptail --menu "请选择你要使用的功能" --cancel-button Back --ok-button Select 20 60 6 \
    "U1 Help" "   介绍及使用方法" \
    "U2 SD备份eMMC" "   通过SD备份eMMC"  \
    "U3 SD烧录eMMC" "   通过SD重新烧录eMMC" \
    3>&1 1>&2 2>&3)
    
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
        case "$FUN" in
            U1\ *) do_sd_help ;;
            U2\ *) do_sd_backup ;; 
            U3\ *) do_sd_download ;;             
            *) whiptail --msgbox "error : FUN = $FUN" 20 60 1 ;;
        esac
    fi
}

#---------------------------------------------------------------
#帮助和更新
#---------------------------------------------------------------

do_help(){
    whiptail  --msgbox "This tool provides a straight-forward way of doing initial configuration of LubanCat. Although it can be run at any time, some of the options may have difficulties if you have heavily customised your installation.\nThis tool use keyboard up & down to select menu,use left & right or Tab to switch button,use Enter to confirm,use ESC to exit.\n\n该工具提供了一种快捷的方法对鲁班猫配置。虽然它可以在任何时候运行，但如果您对鲁班猫进行大量的客制化，其中一些选项就可能对鲁班猫不适用。\n此工具使用键盘上下选择菜单，使用左右键或Tab键切换按钮，使用Enter键确认，使用ESC键退出。" 20 60 
}

do_no_help(){
    whiptail --title "你不想要的help" --ok-button "破喉咙！！破喉咙！！" --msgbox "你竟然·拒绝了我的帮助，来!!!叫破喉咙都没有人来救你的了！！嘻嘻嘻嘻！！！" 20 60 
}

do_update() {
  apt-get update &&
  apt-get install fire-config &&
  sleep 1 &&
  exec fire-config
}

do_help_update_menu() {
    local FUN
    FUN=$(whiptail --menu "请选择你要使用的功能" --cancel-button Back --ok-button Select 20 60 6 \
    "U1 Help" "   工具的介绍及使用方法" \
    "U2 Update fire-config" "   更新fire-config工具"  \
    "U3 No more Help" "   just a joke" \
    3>&1 1>&2 2>&3)
    
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
        case "$FUN" in
            U1\ *) do_help ;;
            U2\ *) do_update ;; 
            U3\ *) do_no_help ;;             
            *) whiptail --msgbox "error : FUN = $FUN" 20 60 1 ;;
        esac
    fi
}

#---------------------------------------------------------------
#屏幕设置
#---------------------------------------------------------------

function compare_arrays(){
    # 第一个数组
    local arr1=("${!1}")
    # 第二个数组
    local arr2=("${!2}")
    # 检查数组长度是否相等
    if [ ${#arr1[@]} -ne ${#arr2[@]} ]; then
        return 1
    fi
    # 比较数组元素是否相等
    for (( i=0; i<${#arr1[@]}; i++ )); do
        if [ "${arr1[$i]}" != "${arr2[$i]}" ]; then
            return 1
        fi
    done
    return 0
}

normal_arr=(1 0 0 0 1 0 0 0 1)
left_arr=(0 -1 1 1 0 0 0 0 1)
right_arr=(0 1 0 -1 0 1 0 0 1)
inverted_arr=(-1 0 1 0 -1 1 0 0 1)


function compare_touch_arrays(){
    local arr1=("${!1}")

    compare_arrays arr1[@] normal_arr[@]
    if [ "$?" == "0" ] ;then
        return 0 
    fi
    compare_arrays arr1[@] left_arr[@]
    if [ "$?" == "0" ] ;then
        return 1
    fi
    compare_arrays arr1[@] right_arr[@]
    if [ "$?" == "0" ] ;then
        return 2 
    fi
    compare_arrays arr1[@] inverted_arr[@]
    if [ "$?" == "0" ] ;then
        return 3 
    fi
    return 4 
}
#屏幕的触摸设置菜单
set_touch(){
    local ID="$1"
    local NAME="$2"

    echo $ID
    if [ "$ID" == "QAQ" ] ;then
        whiptail --msgbox " What's wrong with you ,bro!!!" 10 60
    else
        int="0"
        while (( $int<5 ))
        do
            TOUCH_FLAG[$int]="OFF"
            int=$(expr $int + 1)
        done
        props=$(xinput list-props "$ID" | grep "Coordinate Transformation Matrix")
        Matrix=$(echo ${props#*:} | sed 's/,/ /g' | xargs printf "%.0f ")
        declare -a Matrix_arr=($Matrix)
        compare_touch_arrays Matrix_arr[@]
        case $? in
            0)
                TOUCH_FLAG[0]="ON" ;;
            1)
                TOUCH_FLAG[1]="ON" ;;
            2)
                TOUCH_FLAG[2]="ON" ;;
            3)
                TOUCH_FLAG[3]="ON" ;;
            4)
                TOUCH_FLAG[4]="ON" ;;
        esac 

        DISTROS=$(whiptail --title "$NAME" --radiolist \
        "设置触摸屏幕的旋转角度" 20 60 5 \
        "1 正常        " "正常的显示" ${TOUCH_FLAG[0]} \
        "2 向左旋转90度" "屏幕顺时针旋转90度" ${TOUCH_FLAG[1]} \
        "3 向右旋转90度" "屏幕顺时针旋转270度" ${TOUCH_FLAG[2]} \
        "4 旋转180度   " "屏幕顺时针旋转180度" ${TOUCH_FLAG[3]} \
        "5 其他 " "$Matrix" ${TOUCH_FLAG[4]} \
        3>&1 1>&2 2>&3)

        exitstatus=$?
        echo $exitstatus
        if [ $exitstatus = 0 ]; then
            int="0"
            while (( $int<5 ))
            do
                TOUCH_FLAG[$int]="OFF"
                int=$(expr $int + 1)
            done
            
            case $DISTROS in
            1\ *) 
                xinput set-prop "$ID" "Coordinate Transformation Matrix" "${normal_arr[@]}" ;;
            2\ *)
                xinput set-prop "$ID" 'Coordinate Transformation Matrix' "${left_arr[@]}" ;;
            3\ *)
                xinput set-prop "$ID" 'Coordinate Transformation Matrix' "${right_arr[@]}" ;;
            4\ *) 
                xinput set-prop "$ID" 'Coordinate Transformation Matrix' "${inverted_arr[@]}" ;;
            5\ *)
                prop=$(whiptail --inputbox "input Coordinate Transformation Matrix" 20 60 $Matrix 3>&1 1>&2 2>&3)
                exitstatus=$?
                echo "其他：$exitstatus"
                if [ $exitstatus = 0 ]; then
                    declare -a prop_arr=($prop)
                    if [ ${#prop_arr[@]} -ne ${#normal_arr[@]} ]; then
                        whiptail --msgbox "长度不对啊 你的尺寸：${#prop_arr[@]} 人家的尺寸：${#normal_arr[@]} 你的数据：$prop" 20 60
                    else
                        xinput set-prop "$ID" 'Coordinate Transformation Matrix' "${prop_arr[@]}"   
                    fi
                fi
                TOUCH_FLAG[4]="ON" ;;
            esac
        else
            echo "返回上一级"
        fi
    fi
}

#触摸设置菜单
do_set_touch(){
    # TOUCH_LIST=("fts" 'Goodix Capacitive TouchScreen' "Mouse")
    TOUCH_LIST=("fts" 'Goodix Capacitive TouchScreen' )
    TOUCH_LIST_LENGTH="${#TOUCH_LIST[@]}"
    TOUCH_STATUS=0
    TOUCH_CURRENT=()
    TOUCH_ID=()
    Matrix=()
    int="0"
    while [ $int -lt $TOUCH_LIST_LENGTH ]
	do
        TOUCH_CMDLINE=$(xinput list | grep pointer |grep "${TOUCH_LIST[$int]}")
        if [ "$TOUCH_CMDLINE" != "" ] ;then
            while IFS= read -r line; do
                device=$(echo "$line" | grep -oP '(?<=↳ ).*(?=\s+id)')
                device=$(echo $device | sed 's/\s\+/ /g')
                id=$(echo "$line" | grep -oP '(?<=id=)[0-9]+')
                TOUCH_CURRENT+=("$device")
                TOUCH_ID+=("$id")
                if [ "$device" != "" ] ;then
                    TOUCH_STATUS=$(expr $TOUCH_STATUS + 1)
                fi
            done <<< "$TOUCH_CMDLINE"
        fi
        int=$(expr $int + 1)
	done

#只有一个的情况
    if [ "$TOUCH_STATUS" == "1" ] ;then
        set_touch ${TOUCH_ID[0]} ${TOUCH_CURRENT[0]}
#具有多个的情况
    elif [ "$TOUCH_STATUS" -gt "1" ] ;then
        int="0"
	    while (( $int<4 ))
	    do
            MENU_NAME[$int]="Don't choose me!!!"
            MENU_ID[$int]="QAQ    "
            int=$(expr $int + 1)
        done
        
        int="0"
	    while (( $int<$TOUCH_STATUS ))
	    do
            MENU_NAME[$int]="${TOUCH_CURRENT[$int]}"
            MENU_ID[$int]="${TOUCH_ID[$int]}"
            int=$(expr $int + 1)
        done

        OPTION=$(whiptail --title "Menu Dialog" --menu "选择你要旋转的屏幕" 15 60 4 \
        "${MENU_ID[0]}" "${MENU_NAME[0]}" \
        "${MENU_ID[1]}" "${MENU_NAME[1]}" \
        "${MENU_ID[2]}" "${MENU_NAME[2]}" \
        "${MENU_ID[3]}" "${MENU_NAME[3]}" \
        3>&1 1>&2 2>&3)

        exitstatus=$?
        if [ $exitstatus = 0 ]; then
            case $OPTION in         
            "${MENU_ID[0]}")
                set_touch ${MENU_ID[0]} ${MENU_NAME[0]} ;;
            "${MENU_ID[1]}")
                set_touch ${MENU_ID[1]} ${MENU_NAME[1]} ;;
            "${MENU_ID[2]}")
                set_touch ${MENU_ID[2]} ${MENU_NAME[2]} ;;
            "${MENU_ID[3]}")
                set_touch ${MENU_ID[3]} ${MENU_NAME[3]} ;;
            esac
        else
            echo "You chose Cancel."
        fi
    else
        whiptail --msgbox "找不到触摸" 20 60
    fi
}

#比较mipi是否全部都关闭
function compare_screen_arr(){
	local arr1=("${!1}")
	local count="$2"
    # 比较数组元素是否相等
    for (( i=0; i<$count; i++ )); do
        if [ "${arr1[$i]}" != "OFF" ]; then
			return 1
        fi
    done
	return 0
}

#3566单屏幕切换设置
rk3566_screen_config(){
	SCREEN_START=$(grep -n "#display" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    SCREEN_END=$(grep -n "#overlay_end" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
	SCREEN_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-dsi0-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-dsi0-\(.*\)-overlay.dtbo$/\1/p' | wc -l)

	declare -a SCREEN_LIST_ARR=($SCREEN_LIST)
	declare -A $SCREEN_STATUS
	declare -A $SCREEN_EVENT
	
	int="0"
    while (( $int < $SCREEN_COUNT ))
	do
        get_dt_status "dsi0-${SCREEN_LIST_ARR[$int]}"
        SCREEN_STATUS[$int]="$flag"
		SCREEN_EVENT[$int]="Set ${SCREEN_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

	SCREEN_OTHER="HDMI"
	SCREEN_OTHER_EVENT="Set $SCREEN_OTHER as video output"
	compare_screen_arr SCREEN_STATUS[@] SCREEN_COUNT
	if [ $? == "0" ] ;then
		SCREEN_OTHER_STATUS="ON"
	else
		SCREEN_OTHER_STATUS="OFF"
	fi

	local DISTROS
	DISTROS=$(whiptail --title "RK3566屏幕配置" --radiolist \
	"选择你要开启的屏" 20 70 8 \
	"$SCREEN_OTHER" "$SCREEN_OTHER_EVENT" "$SCREEN_OTHER_STATUS" \
	"${SCREEN_LIST_ARR[0]}" "${SCREEN_EVENT[0]}" "${SCREEN_STATUS[0]}" \
	"${SCREEN_LIST_ARR[1]}" "${SCREEN_EVENT[1]}" "${SCREEN_STATUS[1]}" \
	"${SCREEN_LIST_ARR[2]}" "${SCREEN_EVENT[2]}" "${SCREEN_STATUS[2]}" \
    "${SCREEN_LIST_ARR[3]}" "${SCREEN_EVENT[3]}" "${SCREEN_STATUS[3]}" \
    "${SCREEN_LIST_ARR[4]}" "${SCREEN_EVENT[4]}" "${SCREEN_STATUS[4]}" \
	3>&1 1>&2 2>&3)
	
	exitstatus=$?
	if [ $exitstatus = 0 ]; then
		int="0"
		while (( $int < $SCREEN_COUNT ))
		do
			set_dt ${SCREEN_LIST_ARR[$int]} "OFF"
			int=$(expr $int + 1)
		done 

		case $DISTROS in
			${SCREEN_LIST_ARR[0]})
				set_dt "dsi0-${SCREEN_LIST_ARR[0]}" "ON" ;;
			${SCREEN_LIST_ARR[1]})
				set_dt "dsi0-${SCREEN_LIST_ARR[1]}" "ON" ;;
			${SCREEN_LIST_ARR[2]})
				set_dt "dsi0-${SCREEN_LIST_ARR[2]}" "ON" ;;
            ${SCREEN_LIST_ARR[3]})
				set_dt "dsi0-${SCREEN_LIST_ARR[3]}" "ON" ;;
            ${SCREEN_LIST_ARR[4]})
				set_dt "dsi0-${SCREEN_LIST_ARR[4]}" "ON" ;;
			$SCREEN_OTHER)
				echo "$SCREEN_OTHER_EVENT";;
		esac
	fi
}

rk3588_screen_config(){
	SCREEN_START=$(grep -n "# Display 显示输出配置" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    SCREEN_END=$(grep -n "# cam0" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
	SCREEN_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*rk3588-lubancat-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*rk3588-lubancat-\(.*\)-overlay.dtbo$/\1/p' | wc -l)

	declare -a SCREEN_LIST_ARR=($SCREEN_LIST)
	declare -A $SCREEN_STATUS
	declare -A $SCREEN_EVENT
	
	int="0"
    while (( $int < $SCREEN_COUNT ))
	do
        get_dt_status "${SCREEN_LIST_ARR[$int]}"
        SCREEN_STATUS[$int]="$flag"
		SCREEN_EVENT[$int]="Set ${SCREEN_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

    

    
    local whiptail_options=()
    whiptail_options+=("$SCREEN_OTHER" "$SCREEN_OTHER_EVENT" "$SCREEN_OTHER_STATUS")
    for ((i=0; i<SCREEN_COUNT; i++)); do
        whiptail_options+=("${SCREEN_LIST_ARR[$i]}" "${SCREEN_EVENT[$i]}" "${SCREEN_STATUS[$i]}")
    done

    
    DISTROS=$(whiptail --title "RK3588屏幕配置" --checklist \
        "选择要开启的屏幕（每个vp只能选一个屏幕）" 40 90 $((SCREEN_COUNT + 1)) \
        "${whiptail_options[@]}" \
        3>&1 1>&2 2>&3)
    
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
        
        int="0"
        while (( $int < $SCREEN_COUNT )); do
            set_dt "${SCREEN_LIST_ARR[$int]}" "OFF"
            int=$(expr $int + 1)
        done
        
        IFS=' ' read -ra SELECTED_ITEMS <<< "$DISTROS"
        #  遍历选中项，逐个启用
        for item in "${SELECTED_ITEMS[@]}"; do
                # 查找当前item在屏幕列表中的索引
                for ((i=0; i<SCREEN_COUNT; i++)); do
                    if [ "\"${SCREEN_LIST_ARR[$i]}\"" == $item ]; then
                       
                        set_dt "${SCREEN_LIST_ARR[$i]}" "ON"
                        break

                    fi
                done
            
        done

    fi
}


rk3588s_screen_config(){
	SCREEN_START=$(grep -n "# Display 显示输出配置" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    SCREEN_END=$(grep -n "# CAM0" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
	SCREEN_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*rk3588s-lubancat-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*rk3588s-lubancat-\(.*\)-overlay.dtbo$/\1/p' | wc -l)

	declare -a SCREEN_LIST_ARR=($SCREEN_LIST)
	declare -A $SCREEN_STATUS
	declare -A $SCREEN_EVENT
	
	int="0"
    while (( $int < $SCREEN_COUNT ))
	do
        get_dt_status "${SCREEN_LIST_ARR[$int]}"
        SCREEN_STATUS[$int]="$flag"
		SCREEN_EVENT[$int]="Set ${SCREEN_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

    
    local whiptail_options=()
    whiptail_options+=("$SCREEN_OTHER" "$SCREEN_OTHER_EVENT" "$SCREEN_OTHER_STATUS")
    for ((i=0; i<SCREEN_COUNT; i++)); do
        whiptail_options+=("${SCREEN_LIST_ARR[$i]}" "${SCREEN_EVENT[$i]}" "${SCREEN_STATUS[$i]}")
    done

    
    DISTROS=$(whiptail --title "RK3588s屏幕配置" --checklist \
        "选择要开启的屏幕（每个vp只能选一个屏幕）" 40 90 $((SCREEN_COUNT + 1)) \
        "${whiptail_options[@]}" \
        3>&1 1>&2 2>&3)
    
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
        
        int="0"
        while (( $int < $SCREEN_COUNT )); do
            set_dt "${SCREEN_LIST_ARR[$int]}" "OFF"
            int=$(expr $int + 1)
        done
        

        IFS=' ' read -ra SELECTED_ITEMS <<< "$DISTROS"

        #  遍历选中项，逐个启用
        for item in "${SELECTED_ITEMS[@]}"; do
                # 查找当前item在屏幕列表中的索引
                for ((i=0; i<SCREEN_COUNT; i++)); do
                    if [ "\"${SCREEN_LIST_ARR[$i]}\"" == $item ]; then
                       
                        set_dt "${SCREEN_LIST_ARR[$i]}" "ON"
                        break

                    fi
                done
            
        done

    fi
}



rk3568_screen_config_1(){
	local OPTION

	SCREEN_START=$(grep -n "#display" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    SCREEN_END=$(grep -n "#overlay_end" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
	SCREEN_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-\(.*\)-dsi0-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-\(.*\)-dsi0-\(.*\)-overlay.dtbo$/\1/p' | wc -l)


	declare -a SCREEN_LIST_ARR=($SCREEN_LIST)
	declare -A $SCREEN_STATUS
	declare -A $SCREEN_EVENT
	
	int="0"
    while (( $int < $SCREEN_COUNT ))
	do
        get_dt_status "dsi0-${SCREEN_LIST_ARR[$int]}"
        SCREEN_STATUS[$int]="$flag"

		if [ $flag == "ON" ];then
			MIPI_NOW=${SCREEN_LIST_ARR[$int]}
		fi

		SCREEN_EVENT[$int]="Set ${SCREEN_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

	get_dt_status "hdmi-disabled"
	if [ $flag == "OFF" ] ;then
		HDMI_STATUS="Enable"
	else
		HDMI_STATUS="Disable"
	fi

	compare_screen_arr SCREEN_STATUS[@] SCREEN_COUNT
	if [ $? == "0" ] ;then
		SCREEN_OTHER_STATUS="ON"
	else
		SCREEN_OTHER_STATUS="OFF"
	fi

	if [ -z "$MIPI_NOW" ];then
		MIPI_NOW="NOT SET"
	fi

	OPTION=$(whiptail --title "RK3568双屏管理" --menu "选择配置你的屏幕" 20 60 2 \
	"1 HDMI($HDMI_STATUS) " "SET Enable/Disable" \
	"2 MIPI($MIPI_NOW)" "Choose mipi screnn to set" \
	3>&1 1>&2 2>&3)
	
	exitstatus=$?
	if [ $exitstatus = 0 ]; then
		case "$OPTION" in
		1\ *)
			if (whiptail --title "Yes/No Box" --yes-button "Enable" --no-button "Disable"  --yesno "Enable or Disable HDMI" 10 60) then
				set_dt "hdmi-disabled" "OFF"
			else
				set_dt "hdmi-disabled" "ON"
			fi
			;;
		2\ *)
			local DISTROS
			DISTROS=$(whiptail --title "MIPI屏幕配置" --radiolist \
			"选择你要开启的屏" 20 60 4 \
			"${SCREEN_LIST_ARR[0]}" "${SCREEN_EVENT[0]}" "${SCREEN_STATUS[0]}" \
			"${SCREEN_LIST_ARR[1]}" "${SCREEN_EVENT[1]}" "${SCREEN_STATUS[1]}" \
			"${SCREEN_LIST_ARR[2]}" "${SCREEN_EVENT[2]}" "${SCREEN_STATUS[2]}" \
			"close" "Do not set any mipi screen" "$SCREEN_OTHER_STATUS" \
			3>&1 1>&2 2>&3)
			
			exitstatus=$?
			if [ $exitstatus = 0 ]; then
				int="0"
				while (( $int < $SCREEN_COUNT ))
				do
					set_dt ${SCREEN_LIST_ARR[$int]} "OFF"
					int=$(expr $int + 1)
				done 

				case $DISTROS in
					${SCREEN_LIST_ARR[0]})
						echo ${SCREEN_EVENT[0]} > /dev/zero
						set_dt "dsi0-${SCREEN_LIST_ARR[0]}" "ON" ;;
					${SCREEN_LIST_ARR[1]})
						echo ${SCREEN_EVENT[1]} > /dev/zero
						set_dt "dsi0-${SCREEN_LIST_ARR[1]}" "ON" ;;
					${SCREEN_LIST_ARR[2]})
						echo ${SCREEN_EVENT[2]} > /dev/zero
						set_dt "dsi0-${SCREEN_LIST_ARR[2]}" "ON" ;;
					$SCREEN_OTHER)
						echo "" > /dev/zero;;
				esac
			fi
			;;
		esac
	else
		echo "You chose Cancel."
	fi

}


# 3568双屏异显管理器-2mipi，1hdmi lubancat2-v2
rk3568_screen_config_2(){
	local OPTION

	SCREEN_START=$(grep -n "#display" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    SCREEN_END=$(grep -n "#overlay_end" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
	SCREEN0_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi0-in-vp1-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN0_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi0-in-vp1-\(.*\)-overlay.dtbo$/\1/p' | wc -l)
	
    SCREEN1_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi1-in-vp0-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN1_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi1-in-vp0-\(.*\)-overlay.dtbo$/\1/p' | wc -l)

	declare -a SCREEN0_LIST_ARR=($SCREEN0_LIST)
	declare -A $SCREEN0_STATUS
	declare -A $SCREEN0_EVENT

	declare -a SCREEN1_LIST_ARR=($SCREEN1_LIST)
	declare -A $SCREEN1_STATUS
	declare -A $SCREEN1_EVENT
	
	int="0"
    while (( $int < $SCREEN0_COUNT ))
	do
        get_dt_status "2-dsi0-in-vp1-${SCREEN0_LIST_ARR[$int]}"
        SCREEN0_STATUS[$int]="$flag"

		if [ $flag == "ON" ];then
			MIPI0_NOW=${SCREEN0_LIST_ARR[$int]}
		fi

		SCREEN0_EVENT[$int]="Set ${SCREEN0_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

    int="0"
    while (( $int < $SCREEN1_COUNT ))
	do
        get_dt_status "2-dsi1-in-vp0-${SCREEN1_LIST_ARR[$int]}"
        SCREEN1_STATUS[$int]="$flag"

		if [ $flag == "ON" ];then
			MIPI1_NOW=${SCREEN1_LIST_ARR[$int]}
		fi

		SCREEN1_EVENT[$int]="Set ${SCREEN1_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

	get_dt_status "hdmi-disabled"
	if [ $flag == "OFF" ] ;then
		HDMI_STATUS="Enable"
	else
		HDMI_STATUS="Disable"
	fi

	compare_screen_arr SCREEN0_STATUS[@] SCREEN0_COUNT
	if [ $? == "0" ] ;then
		SCREEN0_OTHER_STATUS="ON"
	else
		SCREEN0_OTHER_STATUS="OFF"
	fi

    compare_screen_arr SCREEN1_STATUS[@] SCREEN1_COUNT
	if [ $? == "0" ] ;then
		SCREEN1_OTHER_STATUS="ON"
	else
		SCREEN1_OTHER_STATUS="OFF"
	fi

	if [ -z "$MIPI0_NOW" ];then
		MIPI0_NOW="NOT SET"
	fi

    if [ -z "$MIPI1_NOW" ];then
		MIPI1_NOW="NOT SET"
	fi

	OPTION=$(whiptail --title "RK3568双屏配置（1和2二选一）" --menu "选择配置你的屏幕" 20 60 3 \
	"1 HDMI($HDMI_STATUS) " "SET Enable/Disable" \
	"2 MIPI-DSI1($MIPI1_NOW)" "Choose mipi-dsi1 screen to set" \
    "3 MIPI-DSI0($MIPI0_NOW)" "Choose mipi-dsi0 screen to set" \
	3>&1 1>&2 2>&3)
	
	exitstatus=$?
	if [ $exitstatus = 0 ]; then
		case "$OPTION" in
		1\ *)
			if (whiptail --title "Yes/No Box" --yes-button "Enable" --no-button "Disable"  --yesno "Enable or Disable HDMI" 10 60) then
				set_dt "hdmi-disabled" "OFF"
                int="0"
				while (( $int < $SCREEN1_COUNT ))
				do
					set_dt "2-dsi1-in-vp0-${SCREEN1_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 
                MIPI1_NOW="NOT SET"
			else
				set_dt "hdmi-disabled" "ON"
			fi
			;;
		3\ *)
			local DISTROS
			DISTROS=$(whiptail --title "MIPI屏幕配置" --radiolist \
			"选择你要开启的屏" 20 80 5 \
			"${SCREEN0_LIST_ARR[0]}" "${SCREEN0_EVENT[0]}" "${SCREEN0_STATUS[0]}" \
			"${SCREEN0_LIST_ARR[1]}" "${SCREEN0_EVENT[1]}" "${SCREEN0_STATUS[1]}" \
			"${SCREEN0_LIST_ARR[2]}" "${SCREEN0_EVENT[2]}" "${SCREEN0_STATUS[2]}" \
            "${SCREEN0_LIST_ARR[3]}" "${SCREEN0_EVENT[3]}" "${SCREEN0_STATUS[3]}" \
			"close" "Do not set any mipi screen" "$SCREEN0_OTHER_STATUS" \
			3>&1 1>&2 2>&3)
			
			exitstatus=$?
			if [ $exitstatus = 0 ]; then
				int="0"
				while (( $int < $SCREEN0_COUNT ))
				do
					set_dt "2-dsi0-in-vp1-${SCREEN0_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 

				case $DISTROS in
					${SCREEN0_LIST_ARR[0]})
						echo ${SCREEN0_EVENT[0]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[0]}" "ON" ;;
					${SCREEN0_LIST_ARR[1]})
						echo ${SCREEN0_EVENT[1]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[1]}" "ON" ;;
					${SCREEN0_LIST_ARR[2]})
						echo ${SCREEN0_EVENT[2]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[2]}" "ON" ;;
                    ${SCREEN0_LIST_ARR[3]})
						echo ${SCREEN0_EVENT[3]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[3]}" "ON" ;;
					$SCREEN_OTHER)
						echo "" > /dev/zero;;
				esac
			fi
			;;
        2\ *)
			local DISTROS
			DISTROS=$(whiptail --title "MIPI屏幕配置" --radiolist \
			"选择你要开启的屏" 20 80 5 \
			"${SCREEN1_LIST_ARR[0]}" "${SCREEN1_EVENT[0]}" "${SCREEN1_STATUS[0]}" \
			"${SCREEN1_LIST_ARR[1]}" "${SCREEN1_EVENT[1]}" "${SCREEN1_STATUS[1]}" \
			"${SCREEN1_LIST_ARR[2]}" "${SCREEN1_EVENT[2]}" "${SCREEN1_STATUS[2]}" \
            "${SCREEN1_LIST_ARR[3]}" "${SCREEN1_EVENT[3]}" "${SCREEN1_STATUS[3]}" \
			"close" "Do not set any mipi screen" "$SCREEN1_OTHER_STATUS" \
			3>&1 1>&2 2>&3)
			
			exitstatus=$?
			if [ $exitstatus = 0 ]; then
				int="0"
				while (( $int < $SCREEN1_COUNT ))
				do
					set_dt "2-dsi1-in-vp0-${SCREEN1_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 

				case $DISTROS in
					${SCREEN1_LIST_ARR[0]})
						echo ${SCREEN1_EVENT[0]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[0]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
					${SCREEN1_LIST_ARR[1]})
						echo ${SCREEN1_EVENT[1]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[1]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
					${SCREEN1_LIST_ARR[2]})
						echo ${SCREEN1_EVENT[2]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[2]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
                    ${SCREEN1_LIST_ARR[3]})
						echo ${SCREEN1_EVENT[3]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[3]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
					$SCREEN_OTHER)
						echo "" > /dev/zero;;
				esac
			fi
			;;
		esac
	else
		echo "You chose Cancel."
	fi
}

# 3568双屏异显管理器-2mipi，1hdmi，1edp lubancat2io
rk3568_screen_config_3(){
	local OPTION

	SCREEN_START=$(grep -n "#display" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
    SCREEN_END=$(grep -n "#overlay_end" /boot/uEnv/$UENV_TXT|cut -d ':' -f 1)
	SCREEN0_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi0-in-vp1-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN0_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi0-in-vp1-\(.*\)-overlay.dtbo$/\1/p' | wc -l)
	
    SCREEN1_LIST=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi1-in-vp0-\(.*\)-overlay.dtbo$/\1/p')
    SCREEN1_COUNT=$(sed -n "${SCREEN_START},${SCREEN_END}p" /boot/uEnv/$UENV_TXT | sed -n 's/^.*lubancat-2-dsi1-in-vp0-\(.*\)-overlay.dtbo$/\1/p' | wc -l)

	declare -a SCREEN0_LIST_ARR=($SCREEN0_LIST)
	declare -A $SCREEN0_STATUS
	declare -A $SCREEN0_EVENT

	declare -a SCREEN1_LIST_ARR=($SCREEN1_LIST)
	declare -A $SCREEN1_STATUS
	declare -A $SCREEN1_EVENT
	
	int="0"
    while (( $int < $SCREEN0_COUNT ))
	do
        get_dt_status "2-dsi0-in-vp1-${SCREEN0_LIST_ARR[$int]}"
        SCREEN0_STATUS[$int]="$flag"

		if [ $flag == "ON" ];then
			MIPI0_NOW=${SCREEN0_LIST_ARR[$int]}
		fi

		SCREEN0_EVENT[$int]="Set ${SCREEN0_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

    int="0"
    while (( $int < $SCREEN1_COUNT ))
	do
        get_dt_status "2-dsi1-in-vp0-${SCREEN1_LIST_ARR[$int]}"
        SCREEN1_STATUS[$int]="$flag"

		if [ $flag == "ON" ];then
			MIPI1_NOW=${SCREEN1_LIST_ARR[$int]}
		fi

		SCREEN1_EVENT[$int]="Set ${SCREEN1_LIST_ARR[$int]}-mipi as video output"
        int=$(expr $int + 1)
	done

	get_dt_status "hdmi-disabled"
	if [ $flag == "OFF" ] ;then
		HDMI_STATUS="Enable"
	else
		HDMI_STATUS="Disable"
	fi

    get_dt_status "2io-edp-in-vp1"
	if [ $flag == "OFF" ] ;then
		EDP_STATUS="Disable"
	else
		EDP_STATUS="Enable"
	fi

	compare_screen_arr SCREEN0_STATUS[@] SCREEN0_COUNT
	if [ $? == "0" ] ;then
		SCREEN0_OTHER_STATUS="ON"
	else
		SCREEN0_OTHER_STATUS="OFF"
	fi

    compare_screen_arr SCREEN1_STATUS[@] SCREEN1_COUNT
	if [ $? == "0" ] ;then
		SCREEN1_OTHER_STATUS="ON"
	else
		SCREEN1_OTHER_STATUS="OFF"
	fi

	if [ -z "$MIPI0_NOW" ];then
		MIPI0_NOW="NOT SET"
	fi

    if [ -z "$MIPI1_NOW" ];then
		MIPI1_NOW="NOT SET"
	fi

	OPTION=$(whiptail --title "RK3568双屏配置(1和2二选一，3和4二选一)" --menu "选择配置你的屏幕" 20 60 4 \
	"1 HDMI($HDMI_STATUS) " "SET Enable/Disable" \
	"2 MIPI-DSI1($MIPI1_NOW)" "Choose mipi-dsi1 screen to set" \
    "3 MIPI-DSI0($MIPI0_NOW)" "Choose mipi-dsi0 screen to set" \
    "4 eDP($EDP_STATUS) " "SET Enable/Disable" \
	3>&1 1>&2 2>&3)
	
	exitstatus=$?
	if [ $exitstatus = 0 ]; then
		case "$OPTION" in
		1\ *)
			if (whiptail --title "Yes/No Box" --yes-button "Enable" --no-button "Disable"  --yesno "Enable or Disable HDMI" 10 60) then
				set_dt "hdmi-disabled" "OFF"
                int="0"
				while (( $int < $SCREEN1_COUNT ))
				do
					set_dt "2-dsi1-in-vp0-${SCREEN1_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 
                MIPI1_NOW="NOT SET"
			else
				set_dt "hdmi-disabled" "ON"
			fi
			;;
		3\ *)
			local DISTROS
			DISTROS=$(whiptail --title "MIPI屏幕配置" --radiolist \
			"选择你要开启的屏" 20 80 5 \
			"${SCREEN0_LIST_ARR[0]}" "${SCREEN0_EVENT[0]}" "${SCREEN0_STATUS[0]}" \
			"${SCREEN0_LIST_ARR[1]}" "${SCREEN0_EVENT[1]}" "${SCREEN0_STATUS[1]}" \
			"${SCREEN0_LIST_ARR[2]}" "${SCREEN0_EVENT[2]}" "${SCREEN0_STATUS[2]}" \
            "${SCREEN0_LIST_ARR[3]}" "${SCREEN0_EVENT[3]}" "${SCREEN0_STATUS[3]}" \
			"close" "Do not set any mipi screen" "$SCREEN0_OTHER_STATUS" \
			3>&1 1>&2 2>&3)
			
			exitstatus=$?
			if [ $exitstatus = 0 ]; then
				int="0"
				while (( $int < $SCREEN0_COUNT ))
				do
					set_dt "2-dsi0-in-vp1-${SCREEN0_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 

				case $DISTROS in
					${SCREEN0_LIST_ARR[0]})
						echo ${SCREEN0_EVENT[0]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[0]}" "ON" 
                        set_dt "2io-edp-in-vp1" "OFF" ;;
					${SCREEN0_LIST_ARR[1]})
						echo ${SCREEN0_EVENT[1]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[1]}" "ON" 
                        set_dt "2io-edp-in-vp1" "OFF" ;;
					${SCREEN0_LIST_ARR[2]})
						echo ${SCREEN0_EVENT[2]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[2]}" "ON" 
                        set_dt "2io-edp-in-vp1" "OFF" ;;
                    ${SCREEN0_LIST_ARR[3]})
						echo ${SCREEN0_EVENT[3]} > /dev/zero
						set_dt "lubancat-2-dsi0-in-vp1-${SCREEN0_LIST_ARR[3]}" "ON" 
                        set_dt "2io-edp-in-vp1" "OFF";;
					$SCREEN_OTHER)
						echo "" > /dev/zero;;
				esac
			fi
			;;
        2\ *)
			local DISTROS
			DISTROS=$(whiptail --title "MIPI屏幕配置" --radiolist \
			"选择你要开启的屏" 20 80 5 \
			"${SCREEN1_LIST_ARR[0]}" "${SCREEN1_EVENT[0]}" "${SCREEN1_STATUS[0]}" \
			"${SCREEN1_LIST_ARR[1]}" "${SCREEN1_EVENT[1]}" "${SCREEN1_STATUS[1]}" \
			"${SCREEN1_LIST_ARR[2]}" "${SCREEN1_EVENT[2]}" "${SCREEN1_STATUS[2]}" \
            "${SCREEN1_LIST_ARR[3]}" "${SCREEN1_EVENT[3]}" "${SCREEN1_STATUS[3]}" \
			"close" "Do not set any mipi screen" "$SCREEN1_OTHER_STATUS" \
			3>&1 1>&2 2>&3)
			
			exitstatus=$?
			if [ $exitstatus = 0 ]; then
				int="0"
				while (( $int < $SCREEN1_COUNT ))
				do
					set_dt "2-dsi1-in-vp0-${SCREEN1_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 

				case $DISTROS in
					${SCREEN1_LIST_ARR[0]})
						echo ${SCREEN1_EVENT[0]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[0]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
					${SCREEN1_LIST_ARR[1]})
						echo ${SCREEN1_EVENT[1]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[1]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
					${SCREEN1_LIST_ARR[2]})
						echo ${SCREEN1_EVENT[2]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[2]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
                    ${SCREEN1_LIST_ARR[3]})
						echo ${SCREEN1_EVENT[3]} > /dev/zero
						set_dt "lubancat-2-dsi1-in-vp0-${SCREEN1_LIST_ARR[3]}" "ON" 
                        set_dt "hdmi-disabled" "ON" 
                        HDMI_STATUS="Disable";;
					$SCREEN_OTHER)
						echo "" > /dev/zero;;
				esac
			fi
			;;
        4\ *)
			if (whiptail --title "Yes/No Box" --yes-button "Enable" --no-button "Disable"  --yesno "Enable or Disable EDP" 10 60) then
				set_dt "2io-edp-in-vp1" "ON"
                int="0"
				while (( $int < $SCREEN0_COUNT ))
				do
					set_dt "2-dsi0-in-vp1-${SCREEN0_LIST_ARR[$int]}" "OFF"
					int=$(expr $int + 1)
				done 
                MIPI0_NOW="NOT SET"
			else
				set_dt "2io-edp-in-vp1" "OFF"
			fi
			;;
		esac
	else
		echo "You chose Cancel."
	fi
}

do_set_screen(){

	if [ $BOARD_CPU = 'rk3566' ] ;then
		rk3566_screen_config
	elif [ $BOARD_CPU = 'rk3568' ] ;then
		if [ $BOARD_NAME = 'LubanCat-2IO' ] ;then
			rk3568_screen_config_3
        elif [ $BOARD_NAME = 'LubanCat-2-V2' ] ;then 
            rk3568_screen_config_2
		else
			rk3568_screen_config_1
		fi
	elif [ $BOARD_CPU = 'rk3588' ] ;then	
		rk3588_screen_config
    elif [ $BOARD_CPU = 'rk3588s' ] ;then	
		rk3588s_screen_config
	else
		echo "The $BOARD_NAME currently does not support screen settings!!!"
        whiptail --msgbox "$BOARD_NAME 当前不支持该功能!!!" 20 60 1
	fi
}

do_set_screen_menu(){
    local FUN
    FUN=$(whiptail --menu "请选择你要使用的功能" --cancel-button Back --ok-button Select 20 60 6 \
    "S1 设置屏幕" "   设置你想要显示的屏幕" \
    "S2 设置触摸屏的方向" "   设置触摸屏幕的触摸方向" \
    3>&1 1>&2 2>&3)
    
    exitstatus=$?
    if [ $exitstatus = 0 ]; then
        case "$FUN" in
            S1\ *) do_set_screen ;;
            S2\ *) do_set_touch ;;             
            *) whiptail --msgbox "error : FUN = $FUN" 10 60 1 ;;
        esac
    fi
}


#---------------------------------------------------------------
#初始化
#---------------------------------------------------------------
if [ $(id -u) -ne 0 ]; then
  printf "Script must be run as root. Try 'sudo fire-config'\n"
  exit 1
fi

# 使用硬件id获取板卡信息
debug_file="/var/fireconfig_log"
board_id
board_info ${BOARD_ID} ${SOC_type}

# 使用系统文件获取板卡信息
if [ -z "$BOARD_NAME" ]; then
get_board_type
fi

time=$(date)
echo $time > $debug_file

INTERACTIVE=True
USER=${SUDO_USER:-$(who -m | awk '{ print $1 }')}
INIT="$(ps --no-headers -o comm 1)"
DISPLAY_MANAGER=$(cat /etc/X11/default-display-manager | tr -d '\0')
ASK_TO_REBOOT=0

#---------------------------------------------------------------
# 命令行获取/设置板卡信息
#---------------------------------------------------------------

get_username() {
    echo $USER
}

get_boardname() {
    echo $BOARD_NAME
}

get_cpuname() {
    echo $BOARD_CPU
}

get_systemname() {
    awk -F' ' 'NR==1{print $1,$2,$3}' /etc/issue
}

do_change_passwd() {
    echo $USER:$1 | chpasswd -c SHA512
}

get_boot_cli() {
  if [ "$(basename $(readlink -f /lib/systemd/system/default.target))" = graphical.target ] \
     && systemctl is-enabled lightdm > /dev/null 2>&1; then
    echo 1
  else
    echo 0
  fi
}

get_autologin() {
  if [ $(get_boot_cli) -eq 0 ]; then
    # 检测命令行登录
    if [ -e /etc/systemd/system/getty@tty1.service.d/autologin.conf ] ; then
      echo 0
    else
      echo 1
    fi
  else
    # 检测桌面登录
    if [ -e /etc/lightdm/lightdm.conf ] && grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
      echo 0
    else
      echo 1
    fi
  fi
}

do_boot() {
  if [ "$INTERACTIVE" = True ]; then
    BOOTOPT=$(whiptail --title "Lubancat 配置工具(fire-config)" --menu "启动选项" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT \
	  "B0 Console" "终端，需要登陆" \
      "B1 Console Autologin" "屏幕终端, 自动登录'$USER' 用户" \
      "B2 Desktop" "桌面系统, 需要登录" \
      "B3 Desktop Autologin" "桌面, 自动登录'$USER' 用户" \
      3>&1 1>&2 2>&3)
  else
    BOOTOPT=$1
    true
  fi

  if [ $? -eq 0 ]; then
    case "$BOOTOPT" in
	  B0*)
        systemctl --quiet set-default multi-user.target
		rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf
		;;
      B1*)
        systemctl --quiet set-default multi-user.target
	if [ ! -d "/etc/systemd/system/getty@tty1.service.d" ]; then
  		mkdir /etc/systemd/system/getty@tty1.service.d
	fi
	if [ ! -e "/etc/systemd/system/getty@tty1.service.d/autologin.conf" ]; then
  		touch /etc/systemd/system/getty@tty1.service.d/autologin.conf
	fi 
		cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
EOF
        ;;
      B2*)
        systemctl --quiet set-default graphical.target
        if [ $DISPLAY_MANAGER == "/usr/sbin/lightdm" ]; then
		    rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf
            if [ -e /etc/lightdm/lightdm.conf ] ; then
                sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/#autologin-user=/"
            fi
        elif [ $DISPLAY_MANAGER == "/usr/sbin/gdm3" ]; then
            rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf
            if [ -e /etc/gdm3/daemon.conf ] ; then
                sed /etc/gdm3/daemon.conf -i -e "s/^AutomaticLoginEnable.*/AutomaticLoginEnable = false/"
            fi
        else
          whiptail --msgbox "Do 'sudo apt-get install lightdm/gdm3' to allow configuration of boot to desktop" 20 60 2
          return 1
        fi
        ;;
      B3*)
        systemctl --quiet set-default graphical.target
        if [ $DISPLAY_MANAGER == "/usr/sbin/lightdm" ]; then
	        if [ ! -d "/etc/systemd/system/getty@tty1.service.d" ]; then
                mkdir /etc/systemd/system/getty@tty1.service.d
            fi
            if [ ! -e "/etc/systemd/system/getty@tty1.service.d/autologin.conf" ]; then
                touch /etc/systemd/system/getty@tty1.service.d/autologin.conf
            fi
		  cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
EOF
          if [ -e /etc/lightdm/lightdm.conf ] ; then
            sed /etc/lightdm/lightdm.conf -i -e "s/^\(#\|\)autologin-user=.*/autologin-user=$USER/"
          else
            touch /etc/lightdm/lightdm.conf
            echo "[Seat:*] " >> /etc/lightdm/lightdm.conf
            echo "autologin-user=$USER" >> /etc/lightdm/lightdm.conf
            echo "autologin-user-timeout=0" >> /etc/lightdm/lightdm.conf
          fi
        elif [ $DISPLAY_MANAGER == "/usr/sbin/gdm3" ]; then
            rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf
            if [ -e /etc/gdm3/daemon.conf ] ; then
                sed /etc/gdm3/daemon.conf -i -e "s/^AutomaticLogin =.*/AutomaticLogin = $USER/"
                sed /etc/gdm3/daemon.conf -i -e "s/^AutomaticLoginEnable.*/AutomaticLoginEnable = true/"
            fi
        else
          whiptail --msgbox "Do 'sudo apt-get install lightdm/gdm3' to allow configuration of boot to desktop" 20 60 2
          return 1
        fi
        ;;
      *)
        whiptail --msgbox "Programmer error, unrecognised boot option" 20 60 2
        return 1
        ;;
    esac
    if [ "$INIT" = "systemd" ]; then
      systemctl daemon-reload
    fi
    ASK_TO_REBOOT=1
  fi
}

do_system_menu() {
    FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "System Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
      "S1 板卡信息" "$BOARD_NAME" \
      "S2 启动选项" "自动登录板卡系统" \
      3>&1 1>&2 2>&3)

  RET=$?
  if [ $RET -eq 1 ]; then
    return 0
  elif [ $RET -eq 0 ]; then
    case "$FUN" in
      S1\ *) do_show_board ;;
      S2\ *) do_boot ;;
      *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
    esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
  fi
}

do_finish() {
  if [ $ASK_TO_REBOOT -eq 1 ]; then
    whiptail --yesno "Would you like to reboot now?" 20 60 2
    if [ $? -eq 0 ]; then # yes
      sync
      reboot
    fi
  fi
  exit 0
}

# 修改字符集
do_change_locale() {
  if [ "$INTERACTIVE" = True ]; then
    dpkg-reconfigure locales
  else
    if ! LOCALE_LINE="$(grep -E "^$1( |$)" /usr/share/i18n/SUPPORTED)"; then
      return 1
    fi
    export LC_ALL=C
    export LANG=C
    LG="/etc/locale.gen"
    NEW_LANG="$(echo $LOCALE_LINE | cut -f1 -d " ")"
    [ -L "$LG" ] && [ "$(readlink $LG)" = "/usr/share/i18n/SUPPORTED" ] && rm -f "$LG"
    echo "$LOCALE_LINE" > /etc/locale.gen
    update-locale --no-checks LANG
    update-locale --no-checks "LANG=$NEW_LANG"
    dpkg-reconfigure -f noninteractive locales
  fi
}

# 重启
do_reboot() {
    sync
    reboot
}

do_hdmi() {
    HDMI=$1
    case "$HDMI" in
      ON*)
        set_dt "hdmi-disabled" "ON"
        ;;
      OFF*)
        set_dt "hdmi-disabled" "OFF"
        ;;
    esac
}

do_mipi() {
    MIPI_SELECT=$1
    case "$MIPI_SELECT" in
      dsi0-720p*)
        set_dt "dsi0-720p" "ON"
        set_dt "dsi0-1080p" "OFF"
        set_dt "dsi0-rpi" "OFF"
        set_dt "dsi0-7.0-1024x600" "OFF"
        set_dt "dsi0-10.1-800x1280" "OFF"
        ;;
      dsi0-1080p*)
        set_dt "dsi0-720p" "OFF"
        set_dt "dsi0-1080p" "ON"
        set_dt "dsi0-rpi" "OFF"
        set_dt "dsi0-7.0-1024x600" "OFF"
        set_dt "dsi0-10.1-800x1280" "OFF"
        ;;
      dsi0-rpi*)
        set_dt "dsi0-720p" "OFF"
        set_dt "dsi0-1080p" "OFF"
        set_dt "dsi0-rpi" "ON"
        set_dt "dsi0-7.0-1024x600" "OFF"
        set_dt "dsi0-10.1-800x1280" "OFF"
        ;;
      dsi0-7.0-1024x600*)
        set_dt "dsi0-720p" "OFF"
        set_dt "dsi0-1080p" "OFF"
        set_dt "dsi0-rpi" "OFF"
        set_dt "dsi0-7.0-1024x600" "ON"
        set_dt "dsi0-10.1-800x1280" "OFF"
        ;;
      dsi0-10.1-800x1280*)
        set_dt "dsi0-720p" "OFF"
        set_dt "dsi0-1080p" "OFF"
        set_dt "dsi0-rpi" "OFF"
        set_dt "dsi0-7.0-1024x600" "OFF"
        set_dt "dsi0-10.1-800x1280" "ON"
        ;;
      *)
        set_dt "dsi0-720p" "OFF"
        set_dt "dsi0-1080p" "OFF"
        set_dt "dsi0-rpi" "OFF"
        set_dt "dsi0-7.0-1024x600" "OFF"
        set_dt "dsi0-10.1-800x1280" "OFF"
        ;;
    esac
}

do_hdmi_rotation() {
HDMI_ROTATION=$1
    case "$HDMI_ROTATION" in
      normal*)
        xrandr  --output HDMI-1 --rotate normal
        ;;
      left*)
        xrandr  --output HDMI-1 --rotate left
        ;;
      right*)
        xrandr  --output HDMI-1 --rotate right
        ;;
      inverted*)
        xrandr  --output HDMI-1 --rotate inverted
        ;;
        *)
        xrandr  --output HDMI-1 --rotate normal
        ;;
    esac
}

do_dsi_rotation() {
DSI_ROTATION=$1
    case "$DSI_ROTATION" in
      normal*)
        xrandr  --output DSI-1 --rotate normal
        ;;
      left*)
        xrandr  --output DSI-1 --rotate left
        ;;
      right*)
        xrandr  --output DSI-1 --rotate right
        ;;
      inverted*)
        xrandr  --output DSI-1 --rotate inverted
        ;;
        *)
        xrandr  --output DSI-1 --rotate normal
        ;;
    esac
}

#---------------------------------------------------------------
# 附加功能，服务于nonint 命令行模式
#---------------------------------------------------------------

# 获取设备列表内容并存入字典中
get_uenv_list(){
    UENV_PATH="/boot/uEnv/$UENV_TXT"
    # without hdmi|dsi|pci|sata
    UENV_LIST=$(egrep '.dtbo' "$UENV_PATH" | grep -vE 'hdmi|dsi|pci|sata')
    UENV_LIST_device=$(echo "$UENV_LIST" | sed -n 's/^.*lubancat-\(.*\)-overlay.dtbo$/\1/p')
    UENV_LIST_status=$(echo "$UENV_LIST" | awk -F "dtoverlay" '{print $1}' | sed -e 's/^#/false/g' -e 's/^$/true/g')
    UENV_LIST_COUNT=$(echo "$UENV_LIST" | sed -n 's/^.*lubancat-\(.*\)-overlay.dtbo$/\1/p' | wc -l)

    declare -a UENV_LIST_device_arr=($UENV_LIST_device)
    declare -a UENV_LIST_status_arr=($UENV_LIST_status)
    declare -a UENV_FUN=()
    
    int=0
    
    while [ $int -lt $((UENV_LIST_COUNT)) ]
    do
        UENV_FUN[int]=${UENV_LIST_device_arr[int]},${UENV_LIST_status_arr[int]}
        #echo ${UENV_FUN[int]}
        ((int++))
    done
    echo ${UENV_FUN[@]}
}
get_usb_list(){
    USB_CONFIG="/etc/init.d/.usb_config"
    USB_TYPE="usb_adb_en usb_rndis_en usb_acm_en usb_ums_en usb_uac1_en usb_uac2_en"
    declare -A USB_STATUS
    USB_TYPE_ARR=($USB_TYPE)
    for item in ${USB_TYPE_ARR[@]}
    do
        USB_STATUS[$item]=false
    done

    for line in $(cat $USB_CONFIG);do 
        USB_STATUS[$line]=true
    done

    for key in ${!USB_STATUS[@]}; do
    echo ${key},${USB_STATUS[$key]}
    done

}


set_usb(){

    USB_CONFIG="/etc/init.d/.usb_config"

    if [ "$2" == "OFF" ];then
        echo OFF
        case $1 in
        "usb_adb_en")
            sed -i 's/usb_adb_en//g' $USB_CONFIG ;;
        "usb_rndis_en")
            sed -i 's/usb_rndis_en//g' $USB_CONFIG  ;;
        "usb_acm_en")
            sed -i 's/usb_acm_en//g' $USB_CONFIG  ;;
        "usb_ums_en")
            sed -i 's/usb_ums_en//g' $USB_CONFIG ;;
        "usb_uac1_en")
            sed -i 's/usb_uac1_en//g' $USB_CONFIG  ;;
        "usb_uac2_en")
            sed -i 's/usb_uac2_en//g' $USB_CONFIG  ;;
    esac

    elif [ "$2" == "ON" ];then
        
        if grep -q "$1" $USB_CONFIG 2> /dev/null;then
            echo Do Nothing >> /dev/null
        else
            echo $1 >> $USB_CONFIG 
        fi
        
    fi
    sed -i '/^\s*$/d' $USB_CONFIG


}


get_hdmi_rotation (){
    hdmi_rotation=`xrandr -q  2>/dev/null | grep conn| cut  -f4 -d " "|sed -e 's/(//g'`
    if [ -n "$hdmi_rotation" ]; then
        echo $hdmi_rotation
    else
        echo "NOCONNECT"
    fi
}

#---------------------------------------------------------------
# 命令行模式
#---------------------------------------------------------------
nonint() {
  "$@"
}

for i in $*
do
  case $i in
  nonint)
    INTERACTIVE=False
    "$@"
    exit $?
    ;;
  *)
    # unknown option
    ;;
  esac
done

#---------------------------------------------------------------
#一级菜单
#---------------------------------------------------------------

calc_wt_size() {
  # NOTE: it's tempting to redirect stderr to /dev/null, so supress error 
  # output from tput. However in this case, tput detects neither stdout or 
  # stderr is a tty and so only gives default 80, 24 values
  WT_HEIGHT=17
  WT_WIDTH=$(tput cols)

  if [ -z "$WT_WIDTH" ] || [ "$WT_WIDTH" -lt 60 ]; then
    WT_WIDTH=80
  fi
  if [ "$WT_WIDTH" -gt 178 ]; then
    WT_WIDTH=120
  fi
  WT_MENU_HEIGHT=$(($WT_HEIGHT-7))
}

if [ "$INTERACTIVE" = True ]; then
  [ -e $CONFIG ] || touch $CONFIG
  calc_wt_size
  while true; do
      FUN=$(whiptail --title "LubanCat-RK Software Configuration Tool (fire-config) ${VERSION}" --backtitle "$BOARD_NAME" --menu "Setup Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Finish --ok-button Select \
      	"P1 系统" "设置板卡启动和显示板卡信息" \
      	"P2 外设" "配置引脚的复用功能" \
        "P3 USB Gadget" "配置usb device(OTG)的功能" \
        "P4 屏幕设置" "配置屏幕或者设置触摸屏" \
        "P5 系统备份与重新烧录" "配置SD卡备份eMMC或烧录eMMC" \
        "P6 Help & Update " "帮助与更新" \
      3>&1 1>&2 2>&3)
    exitstatus=$?
    if [ $exitstatus -eq 1 ]; then
        do_finish
    elif [ $exitstatus -eq 0 ]; then
        echo $FUN >> $debug_file
        case "$FUN" in
      	    P1\ *) do_system_menu;;
		    P2\ *) do_set_pin_menu ;;
            P3\ *) do_set_usb_menu ;;
            P4\ *) do_set_screen_menu ;;
            P5\ *) do_set_sd_backup_and_download_menu ;;
            P6\ *) do_help_update_menu ;;
            *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
        esac || whiptail --msgbox "There was an error running option" 20 60 1
    else
        echo "exit" >> $debug_file
        exit 1
    fi
  done
fi

