/*
 *	vidrec.hsp
 *
 *	P/ECE画像レコーダ
 *
 *	* Sat Nov 10 21:16:18 JST 2007 Naoyuki Sawa
 *	- 1st リリース。
 *	  HSP 3.1で開発、コンパイルしました。
 *	  実行するためには、vidrec.exeと同じフォルダに、hspext.dllとhspcv.dllが必要です。
 *	  これらのDLLは、HSPのバージョンアップに伴って変更される可能性があるので、
 *	  PATHの通ったフォルダに置かない方が安全だと思います。(バージョン不整合の要因となるため)
 *	- P/ECEの動画(avi)を作成するツールです。
 *	  P/ECEアプリケーションの雛型(clip/test.pce)を元に作成したアプリケーションの、
 *	  app.hのUSE_VIDRECシンボルを一時的に定義して、コンパイル、実行してください。
 *	  次にこのアプリケーション(vidrec.exe)を実行し、ポートとファイル名を適切に設定し、
 *	  実行ボタンを押してください。aviファイルが作成されます。
 *	  終了するには、ウインドウを閉じるか、F12キーを押してください。
 */
#include "hspcv.as" /* hspcv.dllが必要 */
#include "hspext.as" /* hspext.dllが必要 */

#define APP_TITLE "vidrec"
#const FOURCC $44495643 /* 'CVID' = Cinepak (変更可) */

#packopt name APP_TITLE
#packopt hide 1

/****************************************************************************
 *	
 ****************************************************************************/

	title APP_TITLE
	onexit *on_exit		/* 終了時処理のため */
	onkey gosub *on_key	/* F12キーによる終了のため */

	dim buf, 1024		/* 受信バッファ。comgetはあらかじめ領域確保が必要みたい(※要確認) */

	/* デスクトップフォルダを取得 */
	newcom WScript_Shell, "WScript.Shell"
	SpecialFolders = WScript_Shell("SpecialFolders")
	Desktop = SpecialFolders("Item", "Desktop")
	delcom SpecialFolders
	delcom WScript_Shell

	/* デフォルトファイル名を作成 */
	fname = Desktop
	fname + "\\"
	fname + APP_TITLE
	fname + "-"
	fname + strf("%04d", gettime(0))
	fname + strf("%02d", gettime(1))
	fname + strf("%02d", gettime(3))
	fname + strf("%02d", gettime(4))
	fname + strf("%02d", gettime(5))
	fname + ".avi" /* 必要。拡張子が正しくないと、cvmakeaviが失敗するみたい */

	/* デフォルトCOMポートを設定 */
	port = 3 /* 変更可 */

	screen 0, 128, 128
	pos  2,   2 : mes "ポート"
	pos 64,   2 : input port, 62 : port_id = stat
	pos  2,  26 : mes "ファイル名"
	pos  2,  50 : input fname, 124 : fname_id = stat
	pos 64,  74 : objsize 62 : button "参照", *on_browse : objsize
	pos  2, 102 : objsize 124 : button "実行", *on_exec : objsize
	objsel stat
	stop

/****************************************************************************
 *	
 ****************************************************************************/

*on_browse
	dialog "avi", 17
	if stat : objprm fname_id, refstr
	stop

/****************************************************************************
 *	
 ****************************************************************************/

*on_exec
	/* 通信初期化 */
	comopen port, ""
	if stat {
		dialog "COMポートが開けません。", 0, "エラー"
		objsel port_id
		stop
	}
	cls
	color 255, 0, 255
	boxf
	gosub *skip_dummy	/* 余分を読み飛ばす */
	computc 1		/* 画面出力開始 */
	do
		wait 0 /* メッセージ処理のため */
		comgetc DISP_X
	until stat
	do
		wait 0 /* メッセージ処理のため */
		comgetc DISP_Y
	until stat
	do
		wait 0 /* メッセージ処理のため */
		comgetc BPP
	until stat
	do
		wait 0 /* メッセージ処理のため */
		comgetc FPS
	until stat
	if (((DISP_X=128)and(DISP_Y=88))or((DISP_X=88)and(DISP_Y=128)))=0 {
		dialog "受信した初期化データが不正です。", 0, "エラー"
		goto *on_exit
	}
	if ((BPP=2)or(BPP=4))=0 {
		dialog "受信した初期化データが不正です。", 0, "エラー"
		goto *on_exit
	}
	if ((FPS>=1)and(FPS<=255))=0 {
		dialog "受信した初期化データが不正です。", 0, "エラー"
		goto *on_exit
	}

	/* 画像作成用バッファ初期化 */
	buffer 1, DISP_X, DISP_Y
	mref vram, 66

	/* ムービー作成初期化 */
	cvbuffer 0, DISP_X, DISP_Y
	cvsel 0
	cvmakeavi fname, FOURCC, FPS

	/* 受信ループ */
	x = 0
	y = 0
	i = (DISP_X * (DISP_Y - 1)) * 3
	repeat
		comget buf, 1024
		if stat {
			repeat stat
				v = peek(buf, cnt) ^ $FF
				switch BPP
				case 2
					repeat 4
						c = v & 3
						c = c|(c<<2)|(c<<4)|(c<<6)
						poke vram, i, c : i+
						poke vram, i, c : i+
						poke vram, i, c : i+
						v >>= 2
					loop
					x + 4
					swbreak
				case 4
					repeat 2
						c = v & 15
						c = c|(c<<4)
						poke vram, i, c : i+
						poke vram, i, c : i+
						poke vram, i, c : i+
						v >>= 4
					loop
					x + 2
					swbreak
				swend
				if x = DISP_X {
					x = 0
					y+
					if(y = DISP_Y) {
						y = 0
						/* 画像作成 */
						gsel 0
						pos (ginfo_winx - DISP_X) / 2, (ginfo_winy - DISP_Y) / 2
						gcopy 1, 0, 0, DISP_X, DISP_Y
						/* ムービー作成 */
						gsel 1
						cvputimg
						cvputavi
					}
					i = (DISP_X * (DISP_Y - 1 - y)) * 3
				}
			loop
		} else {
			wait 0 /* メッセージ処理のため */
		}
	loop
	stop /* NOTREACHED */

/****************************************************************************
 *	
 ****************************************************************************/

*on_exit
	onexit 0		/* 再帰防止 */
	computc 0		/* 画面出力停止 */
	cvcloseavi		/* ムービー作成終了 */
	gosub *skip_dummy	/* 余分を読み飛ばす */
	comclose
	end

/****************************************************************************
 *	
 ****************************************************************************/

*on_key
	if wparam = $7B/*VK_F12*/ : goto *on_exit
	return

/****************************************************************************
 *	
 ****************************************************************************/

*skip_dummy
	do
		wait 1 /* 調整可。USBパケット到着間隔のため、0は不可 */
		comget buf, 1024
	until stat = 0
	return

