/*	
 *	clipprds.h
 *
 *	演出制御
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2014 Naoyuki Sawa
 *
 *	* Mon Jul 02 23:56:03 JST 2012 Naoyuki Sawa
 *	- 1stリリース。
 *	* Sat Nov 10 18:19:56 JST 2012 Naoyuki Sawa
 *	- ProdDev_CancelSetup()、ProdDev_GetProdDat()を追加しました。
 *	* Tue Feb 05 11:35:37 JST 2013 Naoyuki Sawa
 *	- ProdCh_ClearWarrantCounter()、ProdCh_ClearWarrantCounterAll()を追加しました。
 *	* Wed Apr 03 18:05:33 JST 2013 Naoyuki Sawa
 *	- 暗黙のクリアトリガ送信仕様を追加しました。
 *	  変更した関数は、ProdSetList_Setup()のみです。
 *	* Wed Apr 10 18:39:31 JST 2013 Naoyuki Sawa
 *	- ワークエリアをST_Prod構造体の一か所にまとめるために、大幅なソース変更を行いました。
 *	  主な変更内容は、定義位置の変更であり、アルゴリズムはほぼ変更ありません。
 *	- ワークエリアをST_Prod構造体の一か所にまとめた目的は、今後、演出の途中状態をまるごとバックアップするためです。
 *	* Tue Apr 16 22:45:58 JST 2013 Naoyuki Sawa
 *	- クリティカルセクション内で、演出コマンドを個別にコピーして保持するのでなく、演出コマンドリストのまま保持するよう変更しました。
 *	  バッファのメモリ節約と、コピー時間の短縮のためです。
 *	- グローバル関数の定義には、変更ありません。
 *	  ただし、ProdCmdList_Setup()に指定する演出コマンドリストは、不変であること。(即ち、ROM,又は,実行されるまで変更しないRAM上にあること)
 *	  実際にはさほど厳密な制約ではなく、クリティカルセクションを抜けるまで不変であれば良いだけなので、余り気にする必要はありません。
 *	  演出デバイスのセットアップ関数内から、再帰的にProdCmdList_Setup()を呼び出す場合にのみ、注意が必要です。
 *	  具体的には、セットアップ関数のスタック上に演出コマンドリストを作成してProdCmdList_Setup()を呼び出したりすると、正しく動作しません。
 *	* Mon Jul 01 17:42:17 JST 2013 Naoyuki Sawa
 *	- 演出コマンドリスト,演出順序リスト,演出セットリストの、終端を示す方法を変更しました。
 *	  これまでは、特殊なフィールド値を持つ終端レコードによって示していました。今後は、最終レコードのEndフラグを用いて示すよう変更します。
 *	  この変更によって、終端レコードを配置することが不要になり、データ容量が節約できます。
 *	- これまでは、演出デバイス番号0を、終端レコードを表す特殊なフィールド値として使用していましたが、今回の変更によって不要になったため、
 *	  今後は、演出デバイス番号0も利用できるようになりました。即ち、演出デバイス番号は(1〜ProdDev_Max)でなく、(0〜ProdDev_Max)となります。
 *	* Fri Sep 13 20:13:42 JST 2013 Naoyuki Sawa
 *	- 同一トリガを二回以上セットアップしようとしたときに、二回目以降のセットアップを無視する仕様を削除しました。
 *	  当仕様を削除した理由は:
 *	  ・実際に使ってみて、効果的であるケースが少なかったこと。	//二回目以降のセットアップを自動的に無視することが、却って、バグを発見しづらくする原因になることもあった
 *	  ・この挙動が効果的なケースに対しても、アプリケーション側で比較的簡単に対応できること。
 *	  当仕様の削除に伴い、以下の変更を行いました:
 *	  ・同一トリガを二回以上セットアップするためのフラグであった、ProdSet_Flag_Multiが不要になり、削除しました。
 *	  ・ST_ProdCh.TriggerMaskフィールドが不要になり、削除しました。
 *	  ・トリガ番号の範囲が、変更前は最大31でしたが、変更後は最大255になりました。(ST_ProdCh.TriggerMaskのビット数の制限に囚われなくなったため)
 *	  ・トリガ番号の範囲変更に伴い、暗黙のクリアトリガのトリガ番号を、31⇒255に変更しました。
 *	- 演出セット構造体のフラグに、保障時間カウンタをクリアする機能である、ProdSet_Flag_Immediateを追加しました。
 *	  これまでは、アプリケーションが明示的にProdCh_ClearWarrantCounter()等を呼び出して保障時間カウンタをクリアする必要が有り、データ化しづらい問題がありました。
 *	  今後も、ProdCh_ClearWarrantCounter()等でクリアすることもできますが、それに加えて、保障時間カウンタをクリアしたいトリガの演出セットにフラグ指定できるようになりました。
 *	* Sat Feb 08 14:57:06 JST 2014 Naoyuki Sawa
 *	- 演出デバイスのフィルタ関数とセットアップ関数の格納方法を変更しました。
 *	- これまでは、演出デバイス毎に、個別の関数ポインタを格納していましたが、
 *	  今後は、共通の関数とし、アプリケーション側で振り分けることにしました。
 *	- こう変更した理由は、演出デバイス毎に個別の、関数ポインタを格納するメモリを節約するためです。
 *	  これまで使用した限り、個別の関数が直接呼び出されることの利点は薄かったので、問題ありません。
 *	- 今回の変更に伴い、ProdDev_Install()の使用方法を変更しました。
 *	* Wed Aug 27 20:38:48 JST 2014 Naoyuki Sawa
 *	- ST_ProdSeq.env_ProdDev_CancelSetupを実体⇒ポインタに変更しました。
 *	* Wed Aug 27 20:38:48 JST 2014 Naoyuki Sawa
 *	- ST_ProdSeq.env_ProdDev_CancelSetupを実体⇒ポインタに変更しました。
 *	  理由1. これまでは、アプリケーションが、ProdCmdList_Setup()を経由せずに直接、演出デバイスのフィルタ関数,又は,セットアップ関数を呼出し、
 *	         演出デバイスのフィルタ関数,又は,セットアップ関数の中でProdDev_CancelSetup()を呼出すと、予測できない不正な動作になっていました。
 *	         ProdCmd_Setup()でのenv_ProdDev_CancelSetupに対するsetjmp()が行われた後かを、ProdDev_CancelSetup()では判断できなかったからです。
 *	         今回の変更により、env_ProdDev_CancelSetupをポインタに変更したので、ProdDev_CancelSetup()で上記を判断できるようになりました。
 *	         今後は、上記のケースでProdDev_CancelSetup()内でエラー停止するようになり、バグが見つけ易くなりました。
 *	  理由2. このジャンプバッファは、ProdCmd_Setup()の呼出し期間中のみ必要な変数であり、当構造体の中に静的に確保することはメモリの無駄です。
 *	         EPSONライブラリの場合、jmp_bufは16ワード(64バイト)の変数であり、64バイトの無駄となっていました。
 *	         今後は、env_ProdDev_CancelSetupの実体はProdCmd_Setup()のスタック上に確保し、当構造体の中にはポインタ(4バイト)のみを確保します。
 *	         当構造体のサイズが、60バイト節約できました。
 */
#ifndef __CLIP_PRDS_H__
#define __CLIP_PRDS_H__

/****************************************************************************
 *	演出デバイス
 ****************************************************************************/

/* 演出デバイスの総数
 * - 演出デバイス番号として有効な値の範囲は、(0〜ProdDev_Max)です。			//{{2013/07/01:コメント変更}}
 */
#define ProdDev_Max	31	/* (0〜255)の範囲で、調整可能 */			//{{2013/07/01:コメント変更}}

//{{2014/02/08:追加
/* 初期化情報 */
typedef struct _ST_ProdDevInfo {
	int (*fnFilter)(int ProdDev, int ProdDat);	/* フィルタ関数 */
	void (*fnSetup)(int ProdDev, int ProdDat);	/* セットアップ関数 */
} ST_ProdDevInfo;
//}}2014/02/08:追加

//{{2014/02/08:変更
//void ProdDev_Install(int iProdDev, int (*pFilter)(int ProdDev, int ProdDat), void (*pSetup)(int ProdDev, int ProdDat));
//↓2014/02/08:変更
void ProdDev_Install(const ST_ProdDevInfo* pProdDevInfo);
//}}2014/02/08:変更
void ProdDev_CancelSetup();		//{{2012/11/10:追加}}
int ProdDev_GetProdDat(int iProdDev);	//{{2012/11/10:追加}}

/****************************************************************************
 *	演出コマンド
 ****************************************************************************/

#define ProdCmd_Flag_NoReset	(1<<0)	/* 演出データが変化しなければ、セットアップしない */
#define ProdCmd_Flag_Reserved1	(1<<1)	/* (未使用) */
#define ProdCmd_Flag_Reserved2	(1<<2)	/* (未使用) */
#define ProdCmd_Flag_Reserved3	(1<<3)	/* (未使用) */
#define ProdCmd_Flag_Reserved4	(1<<4)	/* (未使用) */
#define ProdCmd_Flag_Reserved5	(1<<5)	/* (未使用) */
#define ProdCmd_Flag_Reserved6	(1<<6)	/* (未使用) */
#define ProdCmd_Flag_End	(1<<7)	/* これが最終レコードであることを示す */	//{{2013/07/01:変更}}

/* 演出コマンド構造体 */
typedef struct _ProdCmd {
	unsigned char Flag;		/* フラグ(ProdCmd_Flag_*の組み合わせ) */
	unsigned char iProdDev;		/* 演出デバイス番号(0〜ProdDev_Max) */		//{{2013/07/01:コメント変更}}
	unsigned short ProdDat;		/* 演出データ(アプリケーション定義) */
} ProdCmd;

void ProdCmdList_Setup(const ProdCmd* pProdCmdList);

/****************************************************************************
 *	演出順序
 ****************************************************************************/

#define ProdOrd_Flag_Ensure	(1<<0)	/* 停止時に未到達ならば、停止時にセットアップする */
#define ProdOrd_Flag_Reserved1	(1<<1)	/* (未使用) */
#define ProdOrd_Flag_Reserved2	(1<<2)	/* (未使用) */
#define ProdOrd_Flag_Reserved3	(1<<3)	/* (未使用) */
#define ProdOrd_Flag_Reserved4	(1<<4)	/* (未使用) */
#define ProdOrd_Flag_Reserved5	(1<<5)	/* (未使用) */
#define ProdOrd_Flag_Reserved6	(1<<6)	/* (未使用) */
#define ProdOrd_Flag_End	(1<<7)	/* これが最終レコードであることを示す */	//{{2013/07/01:変更}}

/* 演出順序構造体 */
typedef struct _ProdOrd {
	unsigned char Flag;		/* フラグ(ProdOrd_Flag_*の組み合わせ) */
	unsigned char Repeat;		/* 繰り返し回数(0=1回,1=2回,…,254=255回,255=無限) */
	unsigned short Delay;		/* 遅延時間(0=即時,1〜65534=遅延時間,65535=停止時) */	/* 【特例処理】65535(停止時)を指定すると、暗黙のProdOrd_Flag_Ensureも指定されたものと見なす */
	const ProdCmd* pProdCmdList;	/* 演出コマンドリスト(NULL=不可) */		//{{2013/07/01:コメント変更}}
} ProdOrd;

/****************************************************************************
 *	演出セット
 ****************************************************************************/

//#define ProdSet_Flag_Multi	(1<<0)	/* 同一のトリガを、二回以上セットアップ可能とする */	/* このフラグがセットされていなければ、同一のトリガの二回目以降の送信時はセットアップしない */	//{{2013/09/13:削除}}
#define ProdSet_Flag_Immediate	(1<<0)	/* 保障時間カウンタをクリアし、確実に即時実行する */	/* このフラグがセットされていなければ、保障時間カウンタがタイムアウトするのを待って実行する */	//{{2013/09/13:追加}}
#define ProdSet_Flag_Reserved1	(1<<1)	/* (未使用) */
#define ProdSet_Flag_Reserved2	(1<<2)	/* (未使用) */
#define ProdSet_Flag_Reserved3	(1<<3)	/* (未使用) */
#define ProdSet_Flag_Reserved4	(1<<4)	/* (未使用) */
#define ProdSet_Flag_Reserved5	(1<<5)	/* (未使用) */
#define ProdSet_Flag_Reserved6	(1<<6)	/* (未使用) */
#define ProdSet_Flag_End	(1<<7)	/* これが最終レコードであることを示す */	//{{2013/07/01:変更}}

/* 演出セット構造体 */
typedef struct _ProdSet {
	unsigned char Flag;		/* フラグ(ProdSet_Flag_*の組み合わせ) */
	unsigned char Trigger;		/* トリガ(0=セットアップ時,1〜254=アプリケーション定義,255=クリア時) */	//{{2013/04/03:コメント変更}}	//{{2013/09/13:コメント変更}}
	unsigned short Warrant;		/* 保証時間(0=保証時間無し,1〜65535=保証時間) */
	const ProdOrd* pProdOrdList;	/* 演出順序リスト(NULL=不可) */						//{{2013/07/01:コメント変更}}
} ProdSet;

/****************************************************************************
 *	演出制御チャネル
 ****************************************************************************/

/* 演出制御チャネルの総数
 * - 演出制御チャネル番号として有効な値の範囲は、(0〜ProdCh_Max)です。
 */
#define ProdCh_Max	3	/* (0〜任意)の範囲で、調整可能 */

void ProdCh_Exec(int iProdCh);
void ProdCh_ExecAll();

void ProdCh_ClearWarrantCounter(int iProdCh);
void ProdCh_ClearWarrantCounterAll();

void ProdCh_Reset(int iProdCh);
void ProdCh_ResetAll();

void ProdCh_SendTrigger(int iProdCh, int Trigger);
void ProdCh_SendTriggerAll(int Trigger);

void ProdSetList_Setup(const ProdSet* pProdSetList, int iProdCh);

/****************************************************************************
 *	サンプル
 ****************************************************************************/

//	//演出デバイスのフィルタ関数の定義例
//	int ProdDev_Filter(int ProdDev, int ProdDat) {
//		switch(ProdDev) {
//		case 0:
//			switch(ProdDat) {
//			case 0x0000: /** no job **/     break;
//			case 0xFFFF: /** no job **/     break;
//			default:     ProdDat += 0x0203; break;
//			}
//			return ProdDat;
//		default:
//			DIE();
//		}
//	}
//	//演出デバイスのセットアップ関数の定義例
//	void ProdDev_Setup(int ProdDev, int ProdDat) {
//		switch(ProdDev) {
//		case 0:
//			switch(ProdDat) {
//			case 0x0000: surface_clear(&surface, 0);                                            break;
//			case 0xFFFF: render_rectangle(&render, 0, 0, DISP_X, DISP_Y, 3);                    break;
//			default:     render_printf(&render, (ProdDat&255)*10, (ProdDat>>8)*10, 0, 3, "○"); break;
//			}
//			return;
//		default:
//			DIE();
//		}
//	}
//	const ST_ProdDevInfo stProdDevInfo = { ProdDev_Filter, ProdDev_Setup };
//	//初期化の例
//	void TestInit() {
//		pcePowerSetReport(PWR_RPTOFF);
//		ProdDev_Install(&stProdDevInfo);
//	}
//	//演出コマンドリストの定義例
//	const ProdCmd cmd0[] = {{ProdCmd_Flag_End|0,0,0x0000}};
//	const ProdCmd cmd1[] = {{ProdCmd_Flag_End|0,0,0x0101}}, cmd2[] = {{ProdCmd_Flag_End|0,0,0x0102}}, cmd3[] = {{ProdCmd_Flag_End|0,0,0x0103}}, cmd4[] = {{ProdCmd_Flag_End|0,0,0x0104}}, cmd5[] = {{ProdCmd_Flag_End|0,0,0x0105}};
//	const ProdCmd cmd6[] = {{ProdCmd_Flag_End|0,0,0x0201}}, cmd7[] = {{ProdCmd_Flag_End|0,0,0x0202}}, cmd8[] = {{ProdCmd_Flag_End|0,0,0x0203}}, cmd9[] = {{ProdCmd_Flag_End|0,0,0x0204}}, cmdA[] = {{ProdCmd_Flag_End|0,0,0x0205}};
//	const ProdCmd cmdB[] = {{ProdCmd_Flag_End|0,0,0x0301}}, cmdC[] = {{ProdCmd_Flag_End|0,0,0x0302}}, cmdD[] = {{ProdCmd_Flag_End|0,0,0x0303}}, cmdE[] = {{ProdCmd_Flag_End|0,0,0x0304}}, cmdF[] = {{ProdCmd_Flag_End|0,0,0x0305}};
//	const ProdCmd cmdZ[] = {{ProdCmd_Flag_End|0,0,0xFFFF}};
//	//演出順序リストの定義例
//	const ProdOrd ord1[] = {{                 1,0,SEC(0),cmd1},{1,0,SEC(1),cmd2},{1,0,SEC(1),cmd3},{1,0,SEC(1),cmd4},{ProdOrd_Flag_End|1,0,SEC(1),cmd5}};
//	const ProdOrd ord2[] = {{                 1,0,SEC(0),cmd6},{1,0,SEC(1),cmd7},{1,0,SEC(1),cmd8},{1,0,SEC(1),cmd9},{ProdOrd_Flag_End|1,0,SEC(1),cmdA}};
//	const ProdOrd ord3[] = {{                 1,0,SEC(0),cmdB},{1,0,SEC(1),cmdC},{1,0,SEC(1),cmdD},{1,0,SEC(1),cmdE},{ProdOrd_Flag_End|1,0,SEC(1),cmdF}};
//	const ProdOrd ordZ[] = {{ProdOrd_Flag_End|1,0,SEC(0),cmdZ}};
//	//演出セットリストの定義例
//	const ProdSet set1[] = {{0,0,SEC(2),ord1},{0,1,SEC(2),ord2},{0,2,SEC(2),ord3},{ProdSet_Flag_End|0,255,SEC(0),ordZ}};
//	//メインループの例
//	void TestExec() {
//		for(;;) {
//			schedule();
//			if(joy & TRG_SELECT) exit(0);
//			//演出セットリストのセットアップ例
//			if(joy & TRG_A) { ProdSetList_Setup(set1, 0); } //演出制御チャネルに、演出セットリストをセットアップ	既存の演出セットリストが有る場合は、差し替える前に暗黙のクリアトリガ(255)を送信。差し替えた後、暗黙のセットアップトリガ(0)を送信。
//			if(joy & TRG_B) { ProdSetList_Setup(NULL, 0); } //演出制御チャネルの、演出セットリストをクリア		既存の演出セットリストが有る場合は、クリアする前に暗黙のクリアトリガ(255)を送信。
//			//トリガの送信例
//			if(joy & TRG_LF) { ProdCh_SendTriggerAll(1); } //演出制御チャネルに、トリガを送信
//			if(joy & TRG_RI) { ProdCh_SendTriggerAll(2); } //演出制御チャネルに、トリガを送信
//			//演出コマンドリストのセットアップ例
//			if(joy & TRG_UP) { ProdCmdList_Setup(cmd0); } //演出デバイスに直接、演出コマンドリストをセットアップ
//			//演出制御チャネルのリセット例
//			if(joy & TRG_DN) { ProdCmdList_Setup(cmd0); ProdCh_ResetAll(); } //上に加えて演出制御チャネル0を停止
//			//演出制御チャネルの実行例
//			ProdCh_ExecAll();
//		}
//	}

//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■　　　　　　　　　これ以降は、モジュールのプライベート定義です。アプリケーションが参照してはいけません。　　　　　　　　　■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

/*--- 演出デバイス ---*/

/* 演出デバイス構造体 */
typedef struct _ST_ProdDev {
//{{2014/02/08:変更
//	int ProdDat;					/* 最後にセットアップした演出データ */
//	int (*pFilter)(int ProdDev, int ProdDat);	/* 演出データフィルタ関数(NULL=無し) */
//	void (*pSetup)(int ProdDev, int ProdDat);	/* 演出データセットアップ関数(NULL=無し) */
//↓2014/02/08:変更
	unsigned short ProdDat;				/* 最後にセットアップした演出データ */
//}}2014/02/08:変更
} ST_ProdDev;

/*--- 演出コマンド ---*/

//{{2013/04/13:変更
///* 演出コマンドバッファサイズ
// * - 演出コマンドセットアップ処理のクリティカルセクション内で、演出コマンドを一時格納できる最大数を示します。
// *   必要な数はデータに依存しますが、概ね、演出デバイスと演出制御チャネルの数に比例すると考え、両者を掛けた数としました。
// *   (ProdCh_SendTriggerAll()内のクリティカルセクションが、もっとも多い演出コマンドをバッファする可能性があると考えたため)
// * - 実際のアプリケーションによっては、もっと多く必要だったり、もっと少なくても大丈夫だったりすると思います。
// *   実際のアプリケーションによって、調整してください。
// */
//#define ProdCmd_Buffer_Size	((ProdDev_Max+1)*(ProdCh_Max+1))	/* (1〜任意)の範囲で、調整可能 */
//↓2013/04/13:変更
/* 演出コマンドリストバッファサイズ
 * - 演出コマンドリストセットアップ処理のクリティカルセクション内で、演出コマンドリストを一時格納できる最大数を示します。
 *   必要な数はデータに依存しますが、概ね、演出制御チャネルの数に比例すると考え、『4』を掛けた数としました。
 *   ProdCh_SendTriggerAll()内のクリティカルセクションが、もっとも多い演出コマンドリストをバッファする可能性があります。
 * - 『4』を掛けた理由は、トリガ当りProdOrd_Flag_Ensureがセットされている演出順序データ数が、『4』前後と考えたからです。
 *   演出の停止,又は,差し替えに時、残っているProdOrd_Flag_Ensureがセットされている演出順序データをまとめて実行する時に、
 *   もっとも多い演出コマンドリストをバッファする可能性があります。
 * - 実際のアプリケーションによっては、もっと多く必要だったり、もっと少なくても大丈夫だったりすると思います。
 *   実際のアプリケーションによって、調整してください。
 */
#define ProdCmdList_Buffer_Size	((4)*(ProdCh_Max+1))	/* (1〜任意)の範囲で、調整可能 */
//}}2013/04/13:変更

/*--- 演出順序制御チャネル ---*/

/* 演出順序制御チャネルの総数
 * - 演出順序制御チャネル番号として有効な値の範囲は、(0〜ProdOrdCh_Max)です。
 */
#define ProdOrdCh_Max	ProdCh_Max

/* 演出順序制御チャネル構造体 */
typedef struct _ST_ProdOrdCh {
	const ProdOrd* pProdOrdList;	/* 演出順序リスト(NULL=停止) */
	int RepeatCounter;		/* 繰り返し回数カウンタ(アップカウンタ) */
	int DelayCounter;		/* 遅延時間カウンタ(アップカウンタ) */
} ST_ProdOrdCh;

/*--- 演出セット制御チャネル ---*/

/* 演出セット制御チャネルの総数-1
 * - 演出セット制御チャネル番号として有効な値の範囲は、(0〜ProdSetCh_Max)です。
 */
#define ProdSetCh_Max	ProdCh_Max

/* 演出セットバッファサイズ
 * - 先に開始した演出セットの保証時間到達前に、後続の演出セットを予約できる最大数を示します。
 *   1ならば後続の演出セットを1個，2ならば2個，…，NならばN個まで、予約できます。
 *   通常の用途ならば1(後続の演出セットを1個予約可能)でも充分です。
 */
#define ProdSetCh_ProdSetBuffer_Size	4	/* (1〜任意)の範囲で、調整可能 */

/* 演出セット制御チャネル構造体 */
typedef struct _ST_ProdSetCh {
	const ProdSet* pProdSetBuffer[ProdSetCh_ProdSetBuffer_Size];	/* 演出セットバッファ */
	int WarrantCounter;	/* 保証時間カウンタ(ダウンカウンタ) */
} ST_ProdSetCh;

/*--- 演出制御チャネル ---*/

/* 演出制御チャネル構造体 */
typedef struct _ST_ProdCh {
	const ProdSet* pProdSetList;	/* 演出セットリスト(NULL=無し) */
//	int TriggerMask;		/* 送信済みトリガマスク */	//{{2013/09/13:削除}}
} ST_ProdCh;

/*--- 演出制御 ---*/

/* 演出制御構造体 */
typedef struct _ST_ProdSeq {

	/*--- 演出デバイス ---*/

//{{2014/02/08:追加
	/* 初期化情報 */
	const ST_ProdDevInfo* pProdDevInfo;
//}}2014/02/08:追加

	/* 演出デバイステーブル
	 * - TBL_ProdDev[0]           = (iProdDev=0)          に対応	//{{2013/07/01:コメント変更}}
	 *   TBL_ProdDev[ProdDev_Max] = (iProdDev=ProdDev_Max)に対応	//{{2013/07/01:コメント変更}}
	 */
	ST_ProdDev TBL_ProdDev[ProdDev_Max + 1];			//{{2013/07/01:変更}}

	/*--- 演出コマンド ---*/

//{{2013/04/13:変更
//	/* 演出コマンドバッファ
//	 * - 演出コマンドセットアップ処理のクリティカルセクション内で、演出コマンドを格納します。
//	 *   ProdCmd_SetupDirect()とProdCmd_SetupBuffer()を参照してください。
//	 */
//	ProdCmd TBL_ProdCmd_Buffer[ProdCmd_Buffer_Size];
//↓2013/04/13:変更
	/* 演出コマンドリストバッファ
	 * - 演出コマンドリストセットアップ処理のクリティカルセクション内で、演出コマンドリストを格納します。
	 *   ProdCmdList_Setup()とProdCmdList_Setup_LeaveCS()を参照してください。
	 */
	const ProdCmd* TBL_ProdCmdList_Buffer[ProdCmdList_Buffer_Size];
//}}2013/04/13:変更

//{{2013/04/13:変更
//	/* 演出コマンドセットアップ処理の、クリティカルセクションに入った回数 */
//	int ProdCmd_Setup_CountCS;
//↓2013/04/13:変更
	/* 演出コマンドリストセットアップ処理の、クリティカルセクションに入った回数 */
	int ProdCmdList_Setup_CountCS;
//}}2013/04/13:変更

//{{2013/04/13:変更
//	/* ProdDev_CancelSetup()、及び、ProdCmd_SetupDirect()から利用します。 */
//	jmp_buf env_ProdDev_CancelSetup;
//↓2013/04/13:変更
//	/* ProdDev_CancelSetup()、及び、ProdCmdList_Setup_LeaveCS()から利用します。 */
//	jmp_buf env_ProdDev_CancelSetup;
//↓2014/08/27:変更
	/* * Wed Aug 27 20:38:48 JST 2014 Naoyuki Sawa
	 * - ST_ProdSeq.env_ProdDev_CancelSetupを実体⇒ポインタに変更しました。
	 *   理由1. これまでは、アプリケーションが、ProdCmdList_Setup()を経由せずに直接、演出デバイスのフィルタ関数,又は,セットアップ関数を呼出し、
	 *          演出デバイスのフィルタ関数,又は,セットアップ関数の中でProdDev_CancelSetup()を呼出すと、予測できない不正な動作になっていました。
	 *          ProdCmd_Setup()でのenv_ProdDev_CancelSetupに対するsetjmp()が行われた後かを、ProdDev_CancelSetup()では判断できなかったからです。
	 *          今回の変更により、env_ProdDev_CancelSetupをポインタに変更したので、ProdDev_CancelSetup()で上記を判断できるようになりました。
	 *          今後は、上記のケースでProdDev_CancelSetup()内でエラー停止するようになり、バグが見つけ易くなりました。
	 *   理由2. このジャンプバッファは、ProdCmd_Setup()の呼出し期間中のみ必要な変数であり、当構造体の中に静的に確保することはメモリの無駄です。
	 *          EPSONライブラリの場合、jmp_bufは16ワード(64バイト)の変数であり、64バイトの無駄となっていました。
	 *          今後は、env_ProdDev_CancelSetupの実体はProdCmd_Setup()のスタック上に確保し、当構造体の中にはポインタ(4バイト)のみを確保します。
	 *          当構造体のサイズが、60バイト節約できました。 */
	jmp_buf* env_ProdDev_CancelSetup;
//}}2014/08/27:変更

	/*--- 演出順序制御チャネル ---*/

	/* 演出順序制御チャネルテーブル
	 * - TBL_ProdOrdCh[0]             = (iProdOrdCh=0)            に対応
	 *   TBL_ProdOrdCh[ProdOrdCh_Max] = (iProdOrdCh=ProdOrdCh_Max)に対応
	 */
	ST_ProdOrdCh TBL_ProdOrdCh[ProdOrdCh_Max + 1];

	/*--- 演出セット制御チャネル ---*/

	/* 演出セット制御チャネルテーブル
	 * - TBL_ProdSetCh[0]             = (iProdSetCh=0)            に対応
	 *   TBL_ProdSetCh[ProdSetCh_Max] = (iProdSetCh=ProdSetCh_Max)に対応
	 */
	ST_ProdSetCh TBL_ProdSetCh[ProdSetCh_Max + 1];

	/*--- 演出制御チャネル ---*/

	/* 演出制御チャネルテーブル
	 * - TBL_ProdCh[0]          = (iProdCh=0)         に対応
	 *   TBL_ProdCh[ProdCh_Max] = (iProdCh=ProdCh_Max)に対応
	 */
	ST_ProdCh TBL_ProdCh[ProdCh_Max + 1];

} ST_ProdSeq;

#endif/*__CLIP_PRDS_H__*/
