#!/bin/sh
# ---------------------------------------------------------
# 用户侧操作脚本：包含成品引脚到 RK3506 GPIO 的映射表
# ---------------------------------------------------------
# | 引脚名称 | 编号 | 引脚名称 | 编号 | 引脚名称 | 编号 |
# |---------|------|---------|------|---------|------|
# | GPIO0_A0 | 0 | GPIO1_A0 | 32 | GPIO2_A0 | 64 |
# | GPIO0_B0 | 8 | GPIO1_B0 | 40 | GPIO2_B0 | 72 |
# | GPIO0_C0 | 16 | GPIO1_C0 | 48 | GPIO2_C0 | 80 |
# | GPIO0_D0 | 24 | GPIO1_D0 | 56 | GPIO2_D0 | 88 |
# | GPIO3_A0 | 96 | GPIO4_A0 | 128 | GPIO4_D7 | 159 |
# BACKEND_SCRIPT="/path/to/your/gpio_backend.sh"

# P1_B2	42	IO1
# P1_B1	41	IO2
# P1_A0	32	IO3
# P1_A1	33	IO4
# P1_A2	34	IO5
# P0_A3	3	IO6
# P0_C1	17	IO7
# P0_C2	18	IO8
# P0_C0	16	IO9
# P1_B6	46	IO10
# P1_A5	37	IO11
# P1_A4	36	IO12
# P1_C7	55	IO13
# P1_C5	53	IO14
# P1_A6	38	IO15
# P1_B3	43	IO16
# P1_C2	50	IO17
# P1_B5	45	IO18
# P1_D0	56	IO19
# P1_C6	54	IO20
# P1_C4	52	IO21
# P0_C3	19	IO22
# P0_B7	15	IO23
# P0_B5	13	IO24
# P1_C1	49	IO25
# P1_C0	48	IO26
# P1_B7	47	IO27
# P1_B6	46	IO28
# P1_B4	44	IO29
# P1_B0	40	IO30

BACKEND_SCRIPT="/usr/local/command/gpio_backend.sh"
# 引脚映射表函数
get_hw_gpio() {
	local user_pin=$1
	case "$user_pin" in
		
		"IO1") echo "42";;
		"IO2") echo "41";;
		"IO3") echo "32";;
		"IO4") echo "33";;
		"IO5") echo "34";;
		"IO6") echo "3";;
		"IO7") echo "17";;
		"IO8") echo "18";;
		"IO9") echo "16";;
		"IO10") echo "46";;
		"IO11") echo "37";;
		"IO12") echo "36";;
		"IO13") echo "55";;
		"IO14") echo "53";;
		"IO15") echo "38";;
		"IO16") echo "43";;
		"IO17") echo "50";;
		"IO18") echo "45";;
		"IO19") echo "56";;
		"IO20") echo "54";;
		"IO21") echo "52";;
		"IO22") echo "19";;
		"IO23") echo "15";;
		"IO24") echo "13";;
		"IO25") echo "49";;
		"IO26") echo "48";;
		"IO27") echo "47";;
		"IO28") echo "46";;
		"IO29") echo "44";;
		"IO30") echo "40";;
		"RELAY_A")  echo "42"  ;;
		*)
			# 尝试解析 P{bank}{group}{pin} 格式，例如 P1A1, P4D7
			if echo "$user_pin" | grep -Eq '^P[0-4][A-D][0-7]$'; then
				# 提取数字和字母
				bank=$(echo "$user_pin" | sed -E 's/^P([0-4])[A-D][0-7]$/\1/')
				group_char=$(echo "$user_pin" | sed -E 's/^P[0-4]([A-D])[0-7]$/\1/')
				pin=$(echo "$user_pin" | sed -E 's/^P[0-4][A-D]([0-7])$/\1/')
				
				# 将组字母转换为偏移量 A=0, B=1, C=2, D=3
				case "$group_char" in
					A) group=0 ;;
					B) group=1 ;;
					C) group=2 ;;
					D) group=3 ;;
				esac
				
				# 计算公式: bank * 32 + group * 8 + pin
				gpio_num=$(( bank * 32 + group * 8 + pin ))
				echo "$gpio_num"
			else
				# 未知格式，输出空字符串
				echo ""
			fi
			;;
	esac
}
APP_NAME="gpio_control" # 这里定义你对外展示的指令名

# 检查参数
if [ "$#" -lt 2 ]; then
    echo "用法: $APP_NAME <引脚名称> <read|write> [状态值(0|1)]"
    echo "示例: $APP_NAME IO1 write 1"
    echo "      $APP_NAME IO1 read"
    exit 1
fi


USER_PIN=$1
ACTION=$2
VALUE=$3

# 映射到真实 GPIO
HW_GPIO=$(get_hw_gpio "$USER_PIN")

if [ -z "$HW_GPIO" ]; then
	echo "错误: 未知的引脚名称 '${USER_PIN}'" >&2
	exit 1
fi

# 调用底层脚本并传递状态码
if [ "$ACTION" = "read" ]; then
	# 读取并输出结果
	RESULT=$("$BACKEND_SCRIPT" read "$HW_GPIO")
	if [ $? -eq 0 ]; then
		echo "${RESULT}"
	else
		echo "读取失败" >&2
		exit 1
	fi
elif [ "$ACTION" = "write" ]; then
	"$BACKEND_SCRIPT" write "$HW_GPIO" "$VALUE"
	if [ $? -eq 0 ]; then
		echo "成功将 ${USER_PIN} 设置为: ${VALUE}"
	else
		echo "设置失败" >&2
		exit 1
	fi
else
	echo "错误: 不支持的操作 '${ACTION}'" >&2
	exit 1
fi