#!/bin/bash

export LANG=ja_JP.UTF-8

test $# -lt 1 && echo "eg. $0 (rec_on,rec_off,recoff_eject,eject,check_ready,usb_switch_port2,try_rec) [-T title] [-20,-10]" && exit 1

PATH=${PATH}:/usr/local/bin
PWD=$(cd $(dirname $0);pwd)
REMOSHLL="${PWD}/er130-remocon.sh"
TVSHLL="${PWD}/channel-setBS.sh"
TITLE=
SETHI=false
SETLO=false
TTLOUT=false
RTARG=
ARG1=

Abort()
{
echo -e "${1}"
led-error on
exit 1
}

led_check()
{
local LoopMax=${1}
local TargetStr=${2}
local ExitStr="No"
local FLG=false
for ((i=${LoopMax};i>0;i--))
do
local RET=`led_reader`
if test $? -ne 0; then
break
fi

# ↓ 初公開時は完全一致で比較する仕様だったが、現在は前方一致に変更。でも今のところ前方一致が求められるケースはない
teststr=${RET#$TargetStr} # 前方一致確認の為、RETの先頭からTargetStrの削除を試みる
if test "${teststr}" != "${RET}"; then # 削除に成功(=前方一致を確認)した場合

	if ${FLG}; then
		ExitStr="Yes"
		break
	else
		FLG=true
	fi
else
	FLG=false
fi
	sleep 0.25
done
echo "${ExitStr}"
}

output_title()
{
export DISPLAY=:0.0
local FLG=false
HEAD1="ER1301:"
HEAD2="ER1302:"

testline=$(xsel -so)
testhead=${testline:0:7}
titlelength=${#TITLE} # 今回のタイトルの長さを取得
lengthstr=$(printf "%03d" "${titlelength}")
if test "${testhead}" == "${HEAD1}"; then
prelengthstr=${testline:7:3}
#if test -z "${prelengthstr}"; then prelengthstr="000";fi
pretitlelength=$((10#${prelengthstr}))
preTITLE=${testline:11:${pretitlelength}}
OUTSTR="${HEAD1}${lengthstr}:${TITLE}${HEAD2}${preTITLE}"
else
OUTSTR="${HEAD1}${lengthstr}:${TITLE}"
fi

echo "${OUTSTR}" | xsel -si # 出力

for ((i=30;i>0;i--))
do
	testline=$(xsel -so)

	if test "${testline}" == "${OUTSTR}"; then
		FLG=true
		break
	fi
	sleep 0.1
done

if ! ${FLG}; then
echo "Error,Can't regist title"
exit 1
fi
}


# 厳密な引数チェックは実装してないが、-20,-10オプションは
# 実際にはrec_offもしくはrecoff_eject時のみ有効
# -Tオプションはrec_off,recoff_eject,eject時のみ有効
#
# コマンドラインインターフェースは、第１引数をオプション指定無し、ビットレートを最終引数に固定したいので変態仕様
# そのメリット・デメリットは検証中 
if test -n "${5}"; then
	case "${5}" in
	-20)export SETHI=true;RTARG=-20;;
	-10)export SETLO=true;RTARG=-10;;
	*)echo "Error,Invalid arguments(1)";exit 1;;
	esac
fi

if test -n "${4}"; then
	case "${4}" in
	-20)export SETHI=true;RTARG=-20;;
	-10)export SETLO=true;RTARG=-10;;
	esac
fi

if test -n "${3}"; then
	case "${3}" in
	-20)export SETHI=true;RTARG=-20;;
	-10)export SETLO=true;RTARG=-10;;
	-T)
	TITLE="${4}"
	TTLOUT=true # タイトル出力
	;;
	esac
fi

ARG1="${1}"
if test -n "${2}"; then
	case "${2}" in
	-20)export SETHI=true;RTARG=-20;;
	-10)export SETLO=true;RTARG=-10;;
	-e)ARG1="recoff_eject";;
	-T)
	TITLE="${3}"
	TTLOUT=true # タイトル出力
	;;
	*)echo "Error,Invalid arguments(2)";exit 1;;
	esac
fi

case "${ARG1}" in
-e)ARG1="eject";;
esac

case "${ARG1}" in
check_ready)
# これ以降、通常の処理
LOOPMAX=300 # 約120秒間(PCのスペックに左右される)
TARGETSTR="NoneGreen"
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	exit 0
else
	Abort "check_ready fail"
fi
;;
rec_on)
LOOPMAX=600 # 約240秒間(PCのスペックに左右される)
TARGETSTR="NoneGreen"
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続NoneGreenの場合のみ録画(開始)命令を送信する
	"${REMOSHLL}" rec
	"${TVSHLL}" green # BS1のチャンネルガイドのスーパーを消す"
	sleep 8 # rec_on処理をtry_recプロセス処理側が見逃さないように
	exit 0
else
	Abort "Can't rec_on"
fi
;;
rec_off)
LOOPMAX=20 # 約8秒間(PCのスペックに左右される)
TARGETSTR="SlowRed"
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続SlowRedの場合のみ録画(終了)命令を送信する
	"${REMOSHLL}" rec
	(${SETHI} || ${SETLO}) && ("${0}" check_ready || kill $$)
	${SETHI} && "${PWD}/er130-set-20.sh"
	${SETLO} && "${PWD}/er130-set-10.sh"
	if ${TTLOUT}; then
		output_title
	elif ! ${NOEJECT}; then # 環境変数利用パターン
		: # recoff_ejectから呼ばれた子プロセスの場合はタイトルをクリアしない
	else
		output_title
	fi
	exit 0
else
	Abort "Can't rec_off"
fi 
;;
rec_off_recoffonly)
LOOPMAX=8 # 約3秒間(PCのスペックに左右される)
TARGETSTR="SlowRed"
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続SlowRedの場合のみ録画(終了)命令を送信する
	"${REMOSHLL}" rec
	exit 0
else
	exit 0 # このパートは念の為用だから
fi 
;;
nocheck_rec) # 素早く録画停止する必要がある場合に使用する
"${REMOSHLL}" rec
output_title
exit 0
;;
menu)
LOOPMAX=150 # 約60秒間(PCのスペックに左右される)
TARGETSTR="NoneGreen"
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続NoneGreenの場合のみメニュー命令を送信する
	"${REMOSHLL}" menu
	exit 0
else
	Abort "Can't show menu"
fi 
;;
usb_switch_port2)
LOOPMAX=150 # 約60秒間(PCのスペックに左右される)
TARGETSTR="SlowGreen"
starttime=`date +%s` # 開発用
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続SlowGreenの場合のみUSBポート切替命令を送信する
	powerSwitch.USB_Switcher port2 1>/dev/null
	sleep 1

	LOOPMAX=38 # 約20秒間(現環境で実測し、実際に約20秒間)
	TARGETSTR="SlowGreen"
	led_check ${LOOPMAX} ${TARGETSTR}>/dev/null # 結果は問わない
	sleep 1
	"${REMOSHLL}" ok
	sleep 1
	"${REMOSHLL}" back
	sleep 1
	"${REMOSHLL}" back # 追加発行のカウンター
	sleep 1
	"${REMOSHLL}" back # 追加発行のカウンター

	for ((i=5;i>0;i--))
	do
	sleep 1
	if (mount|grep -q "ER130 "); then
		"${REMOSHLL}" back # (他機器操作との混信時を考慮して)念の為の追加発行
	else
		break
	fi
	done

	exit 0
else

	led-error on
	# ディスクに問題が発見された筈なので修復をおこなう
	"${0}" repair
	"${0}" eject -T "${TITLE}"|| exit 1
	Abort "Can't usb_switch_port2, repaird, retried"
fi 
;;
try_rec)
LOOPMAX=57 # 約30秒間(現環境で実測し、実際に約30秒間)
TARGETSTR="NoneGreen"
starttime=`date +%s` # 開発用
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続NoneGreenの場合のみ以降の処理を実行する

	# 他の録画開始コマンドの起動チェック
	SHELLNAME=${0##*/}  # 最後の/より後ろを取り出す
	PROCESSNUM=$(ps aux|grep -v "sh -c "|grep "${SHELLNAME}"|grep rec_on|wc -l)
	if test ${PROCESSNUM} -eq 0; then
		# 他に録画開始コマンドが起動されていない場合のみ録画(開始)命令を送信する
		"${REMOSHLL}" rec
	else
		echo "try_rec_on_and_off cancelled"
		exit 2
	fi
else

	led-error on
	# ER130は不意に再起動した筈
	sleep 110 # 起動し終わるまでトータル150秒待つ（FW1.1.4では70秒程が余裕の筈だったが、FW1.1.6では？）
	# 201604281614：FW1.1.6でも67秒ほど余裕
	"${0}" set_default
	Abort "Can't try_rec, may be ER130 restarted.(Setting default)\nReformatting is highly recommended."
fi 

# ↓ここから後半
LOOPMAX=13 # 約6秒間(現環境で実測し、実際に約6秒間)
sleep 4 # led_readerの色判定の仕様変更（夏場の感度低下対応）後は、赤から緑への変化の検知が遅くなった。そのため実際には一瞬の赤の発光（エラー）を長い赤（正常に録画中）と誤認する場合がある。このsleepは、エラーが発行されるタイミングを避ける為
TARGETSTR="SlowRed"
if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
	# 0.4秒、間を置いて2回連続SlowRedの場合のみ以降の処理を実行する

	# 他の録画開始コマンドの起動チェック
	SHELLNAME=${0##*/}  # 最後の/より後ろを取り出す
	PROCESSNUM=$(ps aux|grep -v "sh -c "|grep "${SHELLNAME}"|grep rec_on|wc -l)
	if test ${PROCESSNUM} -eq 0; then

		# 他に録画開始コマンドが起動されていない場合のみ録画(終了)命令を送信する
		"${REMOSHLL}" rec
		exit 0
	else
		echo "try_rec_off cancelled"
		exit 2
	fi
else

	"${REMOSHLL}" ok # その前のパートで発行したok+backが有効でなかった場合に対応
	sleep 2
	"${REMOSHLL}" back

	led-error on
	# ER130は何と、こんなところで再起動することがある
	# ディスク障害か不意の再起動かを判別する（実はSiliconPowerだとこの方法で判別できるが、Transcendだと再起動時に点滅しないので駄目）
	LOOPMAX=38 # 約20秒間(現環境で実測し、実際に約20秒間)
	TARGETSTR="SlowGreen"
	if test "$(led_check ${LOOPMAX} ${TARGETSTR})" = "Yes"; then
		# 0.4秒、間を置いて2回連続Slow？の場合のみ以降の処理を実行する
		# ER130は不意に再起動した筈
		sleep 130 # 起動し終わるまでトータル150秒待つ（FW1.1.4では70秒程が余裕の筈だったが、FW1.1.6では？）
		"${0}" set_default
		Abort "Can't try_rec(2), may be ER130 restarted.\nReformatting is highly recommended."
	fi

	# ディスクに問題が発見された筈なので修復をおこなう
	"${0}" repair
	Abort "Can't try_rec(3), Repairing storage"
fi 
;;
repair)
	# ディスクに問題が発見された筈なので修復開始の為にOKを送信する
	echo "Trying to repair the USB storage." >> ${HOME}/repair_usb_storage.log
	date >> ${HOME}/repair_usb_storage.log
	"${REMOSHLL}" ok
	sleep 40
	"${REMOSHLL}" ok
	sleep 3 # 要らない筈だったけど追加
	"${REMOSHLL}" back # 要らない筈だったけど追加


	sleep 1 # 以降のシーケンスは通常は不必要だが、僅かに必要なケースがある
	# 必要なケースの厳密な条件は調査できていない（発生頻度が低い上、日頃、ER130が出力する画面を表示もキャプチャーもしていない為）。
	# sleep時間が足りないだけかもしれない（そこで前回以降、5秒伸ばした）
	"${REMOSHLL}" back
	sleep 1
	"${REMOSHLL}" ok
	sleep 1
	"${REMOSHLL}" back
;;
set_default) # ER130が不意に再起動した際等に、メニュー下のカーソル位置を、ビットーレートを10Mbpsに設定した直後の状態に設定するシーケンス
			# ER130終了＆起動と組み合わせれば、現在のビットレート設定がわからない場合に、自動で（画面を見ずに）10Mbpsに再設定する場合にも使える
	"${0}" menu || exit 1
	sleep 4
	"${REMOSHLL}" right
	sleep 1
	"${REMOSHLL}" ok
	sleep 1
	"${REMOSHLL}" down
	sleep 1
	"${REMOSHLL}" down
	sleep 1
	"${REMOSHLL}" down
	sleep 1
	"${REMOSHLL}" down
	sleep 1
	"${REMOSHLL}" down
	sleep 1
	"${REMOSHLL}" ok
	sleep 1
	"${REMOSHLL}" ok
	sleep 1
	"${REMOSHLL}" up
	sleep 1
	"${REMOSHLL}" ok
	sleep 1
	"${REMOSHLL}" back
	sleep 1
	"${REMOSHLL}" back
	sleep 1
	"${REMOSHLL}" back
;;
eject)
#	! test "$(ps --pid $PPID -o comm=)" == "${0##*/}" && sleep 1 # 直接検索パターン
	${NOEJECT} && sleep 1 # rec_onプロセスの方を優先する為
	"${0}" menu || exit 1
	sleep 3
	"${REMOSHLL}" f1 || Abort "Can't call REMOSHLL"
	${TTLOUT} && output_title
	"${0}" usb_switch_port2 || exit 1
;;
recoff_eject)
	export NOEJECT=false
	"${0}" rec_off  "${RTARG}"|| exit 1
	"${0}" eject -T "${TITLE}"|| exit 1
;;
*)
echo "Error: Illegal command."
exit 1
;;
esac
