#!/bin/bash

### 衛星位置＆衛星軌道の表示スクリプト［GIFアニメ対応］ ###

function disp_usage() {
	echo ""
	echo "TPLOT - GPL/LGPL TAZEL Output Plotter (Ver.1) [ Copyright (c) 2023-2023 NekoMimi <twintail@angelmodelnet> ]"
	echo "  This program reads TLE file and calculate object position and/or orbit by using TAZEL,"
	echo "  then plot its output by using GNUPLOT.  FYI: This program utilize TAZEL,TSEPA & GNUPLOT."
	echo ""
	echo "Usage1: $cmd                3TLE.txt [Date Time] LoopTick Size PlotType    <- GNUPLOT 静止画表示"
	echo "Usage2: $cmd  -anime #.###  3TLE.txt [Date Time] LoopTick Size PlotType    <- GNUPLOT 動  画表示"
	echo "Usage3: $cmd  -anime *.gif  3TLE.txt [Date Time] LoopTick Size PlotType    <- GIF ファイル生成"
	echo ""
	echo "> 3TLE.txt    = NORAD TLE FileName      ( \"-\" for STDIN                     )"
	echo "> Date & Time = TAZEL Date & Time Value ( Default = . 0 [Today 00:00:00]      )"
	echo "> LoopTick    = TAZEL LoopTick    Value ( \".\" for 1 Loop                    )"
	echo "> Size        = leo | meo | geo | deep"
	echo "> PlotType    = o | oa | op | ov | on   ( Orbit | Orbit+[All|Point|Velo|Name] ) *1"
	echo ">             = p | pa | pp | pv | pn   ( Point | Point+[All|Point|Velo|Name] ) *1"
	echo ">             = d                       ( Dot                                 ) *1"
	echo ">             = xN                      ( Orbit Motion, N = DataCount / Frame ) *1"
	echo "> (*1) If 1st letter of PlotType is upper case, TPLOT will disable equator hiding."
	echo "> -anime #.### -> Display  Animation with \"gnuplot> pause #.###\""
	echo "> -anime *.gif -> Make GIF Animation File as \"*.gif\""
	echo ""
}

function is_option() {
	headch=`echo $1 | cut -b 1`
	length=`echo ${#1}`
	if [ $length -ne 1 -a "$headch" == "-" ] ; then
		echo "Y"
	else
		echo "N"
	fi
}

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# コマンドライン引数の取得＆確認 1/2
cmd=`basename $0`
if [ $# -lt 4 -o $# -gt 9 ] ; then
	disp_usage
	exit 1
fi

# OPTION 指定時の処理
opt_tazel="-p2"							# デフォルト: TAZEL オプション＝"-p2"
opt_anime="N/A"							# デフォルト: ANIME オプション＝無し（静止画 TERM 直接表示）
while [ `is_option $1` == "Y" ]
do
	if [ "$1" != "-anime" ] ; then		# TAZEL オプション
		opt_tazel="${opt_tazel} ${1}"
		shift
	else								# ANIME オプション
		opt_anime=$2					# gnuplot> pause 値 ｜ GIF FileName
		shift ; shift
	fi
done

#echo $opt_anime
#echo $opt_tazel

# コマンドライン引数の取得＆確認 2/2
if [ $# -ne 4 -a $# -ne 6 ] ; then
	disp_usage
	exit 1
fi

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# 必須パラメータの取得 1
fname_3tle=$1					# 3TLE ファイル名

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# Date & Time の取得
date="."						# デフォルト： "." = Today
time="0"						# デフォルト： "0" = 00:00:00
if [ $# -eq 6 ] ; then
	date=$2
	time=$3
	shift ; shift
fi

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# 必須パラメータの取得 2
looptick=$2						# LoopTick値
size_u=$3						# Size    値
plottype=$4						# PlotType値

#---------------------------------------------------------------------------------------------------|
# Note: setno の値について
#---------------------------------------------------------------------------------------------------|
# > 静止画では、setno=1 とする。（ tsepa 未使用）
#   軌道           表示 -> fname_o を利用
#   位置/速度/名前 表示 -> fname_p を利用
#   情報(ラベル)   表示 -> fname_i を利用
#
# > アニメーション：位置伝搬の動画アニメーションでは、setno=1 とする。
#   軌道           表示 -> fname_o を利用
#   位置/速度/名前 表示 -> fname_o より各時刻毎に 1 行づつ分解      したファイル 00000   〜 99999   を利用
#   情報(ラベル)   表示 -> fname_o より各時刻毎に 1 行づつ分解＆生成したファイル 00000.i 〜 99999.i を利用
#   （分解＆生成したファイルを fname_p ＆ fname_i と見なして、次々と切り替え表示する）
#
# > アニメーション：軌道伝搬の動画アニメーションでは、setno=N とする。（ N は衛星軌道を構成するデータ数）
#   軌道           表示 -> fname_o より各時刻毎に N 行づつ分解      したファイル 00000   〜 99999   を利用
#   位置/速度/名前 表示 -> なし
#   情報(ラベル)   表示 -> fname_o より各時刻毎に N 行づつ分解＆生成したファイル 00000.i 〜 99999.i を利用（時刻は各ブロックの先頭時刻）
#   （分解＆生成したファイルを fname_o ＆ fname_i と見なして、次々と切り替え表示する）
#
setno=1							# Line/Frame 行数

p_head=`echo $plottype | cut -b 1 `		# 先頭文字 x24 -> x
p_tail=`echo $plottype | cut -b 2-`		# 数値文字 x24 -> 24
if [ "$p_head" == "x" -o "$p_head" == "X" ] ; then
	plottype=$p_head			# 上書き
	setno=$p_tail				# 上書き
fi

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# コマンドの存在確認
if [ ! -x "$(command -v tazel)" ] || [ ! -x "$(command -v tsepa)" ] ; then
	echo "Error($cmd): \"tazel\" command or \"tsepa\" command not found"
	echo " > See. https://osdn.net/projects/tle2azel/"
	exit 1
fi

if [ ! -x "$(command -v gnuplot)" ] ; then
	echo "Error($cmd): \"gnuplot\" command not found"
	echo " > See. http://www.gnuplot.info"
	exit 1
fi

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# ファイルの存在確認（ "-" = STDIN ）
if [ "$fname_3tle" != "-" ] && [ ! -f $fname_3tle ] ; then
	echo "Error($cmd): 3TLE.txt not found [$fname_3tle]"
	exit 1
fi

# パラメーター値の妥当性確認
if [ "$size_u" != "leo" -a "$size_u" != "meo" -a "$size_u" != "geo" -a "$size_u" != "deep" ] ; then
	echo "Error($cmd): Illegal SIZE [$size_u]"
	exit 1
fi

if [ "$plottype" != "o" -a "$plottype" != "oa" -a "$plottype" != "op" -a "$plottype" != "ov" -a "$plottype" != "on" \
  -a "$plottype" != "O" -a "$plottype" != "Oa" -a "$plottype" != "Op" -a "$plottype" != "Ov" -a "$plottype" != "On" \
  -a "$plottype" != "p" -a "$plottype" != "pa" -a "$plottype" != "pp" -a "$plottype" != "pv" -a "$plottype" != "pn" \
  -a "$plottype" != "P" -a "$plottype" != "Pa" -a "$plottype" != "Pp" -a "$plottype" != "Pv" -a "$plottype" != "Pn" \
  -a "$plottype" != "d" -a "$plottype" != "x" \
  -a "$plottype" != "D" -a "$plottype" != "X" ] ; then
	echo "Error($cmd): Illegal PlotType [$plottype]"
	exit 1
fi

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# GNUPLOT Script の設定

### Image: Orbit ###
if [ "$plottype" == "o"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_o @cl                                    \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "oa" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_o @cl, fname_p @p, fname_p @v, fname_p @n\" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "op" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_o @cl, fname_p @p                        \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "ov" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_o @cl, fname_p @p, fname_p @v            \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "on" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_o @cl, fname_p @p, fname_p @n            \" ; load \"99-plot.txt\" ; pause mouse close"
fi

if [ "$plottype" == "O"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_o @cl                                    \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Oa" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_o @cl, fname_p @p, fname_p @v, fname_p @n\" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Op" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_o @cl, fname_p @p                        \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Ov" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_o @cl, fname_p @p, fname_p @v            \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "On" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_o @cl, fname_p @p, fname_p @n            \" ; load \"99-plot.txt\" ; pause mouse close"
fi

### Image: Point ###
if [ "$plottype" == "p"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @p                                     \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "pa" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @p, fname_p @v, fname_p @n             \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "pp" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @p                                     \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "pv" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @p, fname_p @v                         \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "pn" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @p, fname_p @n                         \" ; load \"99-plot.txt\" ; pause mouse close"
fi

if [ "$plottype" == "P"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @p                                     \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Pa" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @p, fname_p @v, fname_p @n             \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Pp" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @p                                     \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Pv" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @p, fname_p @v                         \" ; load \"99-plot.txt\" ; pause mouse close"
fi
if [ "$plottype" == "Pn" ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @p, fname_p @n                         \" ; load \"99-plot.txt\" ; pause mouse close"
fi

### Image: Dot   ###
if [ "$plottype" == "d"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @d                                     \" ; load \"99-plot.txt\" ; pause mouse close"
fi

if [ "$plottype" == "D"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @d                                     \" ; load \"99-plot.txt\" ; pause mouse close"
fi

### Orbit Motion ###
if [ "$plottype" == "x"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @e, fname_p @cl                                    \" ; load \"99-plot.txt\" ; pause mouse close"
fi

if [ "$plottype" == "X"  ] ; then
	plot_script="load \"00-orbit.txt\" ; plot_script=\"load fname_i ; @lmi ; splot @E, fname_p @cl                                    \" ; load \"99-plot.txt\" ; pause mouse close"
fi

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# 作業用パラメーターの設定（全ての作業用ファイルは作業用ディレクトリ内に作成する）
tmpdir=$cmd.$$					# 作業用ディレクトリ名
odata=o							# 軌道データ用ファイル名
pdata=p							# 位置データ用ファイル名
idata=i							# 情報データ用ファイル名

### DEBUG ###
#echo "OPT_TAZEL=$opt_tazel"
#echo "OPT_ANIME=$opt_anime"
#echo "SetNo=$setno"
#echo "3TLE.txt=$fname_3tle"
#echo "LoopTick=$looptick"
#echo "PlotType=$plottype"
#echo "SIZE=$size_u"

#echo "plot_script=$plot_script"

#echo "tmpdir=$tmpdir"
#echo "odata=$odata"
#echo "pdata=$pdata"
#echo "idata=$idata"

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# TAZEL の実行（衛星軌道＆衛星位置の計算）
mkdir $tmpdir ; cd $tmpdir

if [ "$fname_3tle" == "-" ] ; then
	tazel $opt_tazel -              $date $time $looptick > $odata		# 軌道データの計算
else
	tazel $opt_tazel ../$fname_3tle $date $time $looptick > $odata		# 軌道データの計算
fi
if [ $? -ne 0 ] ; then exit 1 ; fi

if [ "$fname_3tle" == "-" ] ; then
	tazel $opt_tazel -              $date $time           > $pdata		# 位置データの計算
else
	tazel $opt_tazel ../$fname_3tle $date $time           > $pdata		# 位置データの計算
fi
if [ $? -ne 0 ] ; then exit 1 ; fi

# 情報用にファイル $idata を生成（日付時刻＋TLEファイル名）
echo -n "MiscInfo=\"Date&Time = "                         >  $idata
cat $pdata | head -2 | tail -1 | cut -b 1-19 | tr -d "\n" >> $idata
echo " [UTC]\\n# $cmd $*\""                               >> $idata

# 動画用にファイル $pdata を 000000 ~ 999999 に分離
cat $odata | tsepa size=$setno
if [ $? -ne 0 ] ; then exit 1 ; fi

# 動画用ループ数（ =tsepa 出力ファイル数）を取得
loop_c=`ls [0-9][0-9][0-9][0-9][0-9] | wc -l`
if [ $? -ne 0 ] ; then exit 1 ; fi

# 情報用にファイル $idata を生成（日付時刻＋TLEファイル名）
for f in [0-9][0-9][0-9][0-9][0-9]
do
	echo -n "MiscInfo=\"Date&Time = "                         >  ${f}.i
	cat $f     | head -1           | cut -b 1-19 | tr -d "\n" >> ${f}.i
	echo " [UTC]\\n# $cmd $*\""                               >> ${f}.i
done

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# GNUPLOT の実行（グラフ表示）
cd ..

echo $plot_script | gnuplot	\
	-e "anime=\"$opt_anime\""		\
	-e "fname_o=\"$tmpdir/$odata\""	\
	-e "fname_p=\"$tmpdir/$pdata\""	\
	-e "fname_i=\"$tmpdir/$idata\""	\
	-e "tmpdir=\"$tmpdir\""			\
	-e "loop_c=\"$loop_c\"" 		\
	-e "size_u=\"$size_u\""			-

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
# 終了（作業ディレクトリの削除）
rm -r $tmpdir
