#//-----------------------------------------------------------------------------
#//	グローバル変数
#//-----------------------------------------------------------------------------
set VERBOSE 0	;#//0=詳細表示無し,1=詳細表示有り
set now 0
#//-----------------------------------------------------------------------------
#//	コールバック関数
#//-----------------------------------------------------------------------------
proc fnSnrSeq {pSnrSeq iCh iSnrFnc pArgs} {
	global VERBOSE
	global now
	#//引数を表示する。
	if {$VERBOSE} then {
		set pos [blob_reader_get_pos $pArgs]
		set sep " "
		puts -nonewline [format {%4d %s} $now $iSnrFnc]
		while {[blob_reader_get_pos $pArgs] < [blob_reader_get_bits $pArgs]} {
			puts -nonewline [format {%s%02X} $sep [blob_read_byte $pArgs]]
			set sep ":"
		}
		puts ""
		blob_reader_set_pos $pArgs $pos
	}
	#//個別の関数処理。
	return [eval $iSnrFnc $pSnrSeq $iCh $iSnrFnc $pArgs]
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#//	シナリオシーケンサ互換関数
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc getRemainBytes {pArgs} {
	set bits [blob_reader_get_bits $pArgs]
	set pos [blob_reader_get_pos $pArgs]
	return [expr {($bits - $pos) / 8}]
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeq_Exec {pSnrSeq iCh iSnrFnc pArgs} {
	SnrSeq_Exec $pSnrSeq
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_Exec {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	SnrSeqCh_Exec $pSnrSeq $iCh
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeq_ClrTbl {pSnrSeq iCh iSnrFnc pArgs} {
	SnrSeq_ClrTbl $pSnrSeq
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_SetTbl {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	set pSnrTbl [blob_read_string $pArgs]	;#//pSnrTblは"NULL"のみ対応。それ以外はSnrSeqCh_SetTblNoを使用して下さい。
	SnrSeqCh_SetTbl $pSnrSeq $iCh $pSnrTbl
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeq_SendTrig {pSnrSeq iCh iSnrFnc pArgs} {
	set iSnrTrg [[expr {([getRemainBytes $pArgs] <= 1) ? "blob_read_byte" : "blob_read_string"}] $pArgs]	;#//番号指定ならば残り1バイトであるはず。名前指定ならば"SnrTrg_..."なので残り7+1バイト以上であるはず。
	SnrSeq_SendTrig $pSnrSeq $iSnrTrg
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_SendTrig {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	set iSnrTrg [[expr {([getRemainBytes $pArgs] <= 1) ? "blob_read_byte" : "blob_read_string"}] $pArgs]	;#//番号指定ならば残り1バイトであるはず。名前指定ならば"SnrTrg_..."なので残り7+1バイト以上であるはず。
	SnrSeqCh_SendTrig $pSnrSeq $iCh $iSnrTrg
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeq_Unlock {pSnrSeq iCh iSnrFnc pArgs} {
	SnrSeq_Unlock $pSnrSeq
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_Unlock {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	SnrSeqCh_Unlock $pSnrSeq $iCh
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeq_Stop {pSnrSeq iCh iSnrFnc pArgs} {
	SnrSeq_Stop $pSnrSeq
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_Stop {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	SnrSeqCh_Stop $pSnrSeq $iCh
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeq_GetStat {pSnrSeq iCh iSnrFnc pArgs} {
	return [SnrSeq_GetStat $pSnrSeq $iCh]
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_GetStat {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	return [SnrSeqCh_GetStat $pSnrSeq $iCh]
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SnrSeqCh_SetTblNo {pSnrSeq iCh iSnrFnc pArgs} {
	incr iCh [blob_read_byte $pArgs]
	set iSnrTblNo [[expr {([getRemainBytes $pArgs] <= 2) ? "blob_read_half" : "blob_read_string"}] $pArgs]	;#//番号指定ならば残り2バイトであるはず。名前指定ならば"SnrTblNo_..."なので残り9+1バイト以上であるはず。
	SnrSeqCh_SetTblNo $pSnrSeq $iCh TBL_SnrTblNo $iSnrTblNo
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#//	テスト用関数
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_PrintStr {pSnrSeq iCh iSnrFnc pArgs} {
	global now
	set str [blob_read_string $pArgs]
	puts [format {%4d %s} $now $str]
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_PrintVar {pSnrSeq iCh iSnrFnc pArgs} {
	global now
	set varName [blob_read_string $pArgs]
	set value [uplevel #0 set $varName]
	puts [format {%4d %s=%d} $now $varName $value]
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_SetVar {pSnrSeq iCh iSnrFnc pArgs} {
	set varName [blob_read_string $pArgs]
	set value [blob_read_byte $pArgs]
	set value [expr {$value & 255}]
	if {$value > 127} then {incr value -256}
	uplevel #0 set $varName $value
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_AddVar {pSnrSeq iCh iSnrFnc pArgs} {
	set varName [blob_read_string $pArgs]
	set increment [blob_read_byte $pArgs]
	set value [uplevel #0 set $varName]
	if {$increment > 127} then {incr increment -256}
	incr value $increment
	uplevel #0 set $varName $value
	return 0
}
#//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
proc SnrFnc_GetVar {pSnrSeq iCh iSnrFnc pArgs} {
	set varName [blob_read_string $pArgs]
	set value [uplevel #0 set $varName]
	return $value
}
#//-----------------------------------------------------------------------------
#//	コマンドライン処理
#//-----------------------------------------------------------------------------
#//オプションを解析する。
for {set i 0} {$i < [llength $argv]} {incr i} {
	set s [lindex $argv $i]
	if {![string match {-*} $s]} then {break}
	switch -- $s {
	"-v"
		{
			set VERBOSE 1
		}
	default
		{
			puts stderr "illegal option '$s'"
			exit 1
		}
	}
}
#//コマンドライン引数からオプションを取り除く。
set argv [lrange $argv $i end]
#//コマンドライン引数が無ければ、テーブル名にUsage，トリガ名にもUsageが指定されたものと見なす。
if {![llength $argv]} then {set argv [list Usage Usage]}
#//-----------------------------------------------------------------------------
#//	テスト初期化処理
#//-----------------------------------------------------------------------------
#//シナリオシーケンサを作成する。
set pSnrSeq [SnrSeq_New {{pSnrSeq iCh iSnrFnc pArgs} {fnSnrSeq $pSnrSeq $iCh $iSnrFnc $pArgs}} 4 8]	;#//チャネル数,コンテキスト数は変更可
#//コマンドライン引数でテーブル名が指定されていたら、テーブルを設定する。
if {[llength $argv] >= 1} then {
	set s "SnrSeqCh_SetTblNo $pSnrSeq 0 TBL_SnrTblNo SnrTblNo_[lindex $argv 0]"
	if {$VERBOSE} then {
		puts $s
	}
	eval $s
}
#//コマンドライン引数でトリガ名が指定されていたら、トリガを送信する。
if {[llength $argv] >= 2} then {
	set s "SnrSeqCh_SendTrig $pSnrSeq 0 SnrTrg_[lindex $argv 1]"
	if {$VERBOSE} then {
		puts $s
	}
	eval $s
}
#//-----------------------------------------------------------------------------
#//	テスト実行処理
#//-----------------------------------------------------------------------------
for {set now 1} {$now <= 9999} {incr now} {		;#//最大継続時間は変更可。
	SnrSeq_Exec $pSnrSeq
	if {![SnrSeq_GetStat $pSnrSeq]} {break}		;#//全てのチャネルが停止したら抜ける。
}
#//-----------------------------------------------------------------------------
#//	テスト終了処理
#//-----------------------------------------------------------------------------
#//シナリオシーケンサを開放する。
SnrSeq_Free $pSnrSeq
