/*
 *	clippsrl.h
 *
 *	パチスロゲーム用リールシミュレータ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2017 Naoyuki Sawa
 *
 *	* Mon Jan 30 21:41:16 JST 2017 Naoyuki Sawa
 *	- 1st リリース。
 *	* Tue Jan 31 22:45:54 JST 2017 Naoyuki Sawa
 *	- PslRelCh_Intr()の「等速中(センサ未検出)」のセンサ検出時に、センサ未検出カウンタの最小有効値未満でも、再加速へ移行しないように修正しました。
 *	  修正した理由は、そうしないと、リール回転開始後の初回の等速中(センサ未検出)にセンサ検出をした時に、間違って再加速へ移行する問題が生じるからです。
 *	  なぜならば、リール回転開始後の初回に等速中(センサ未検出)へ移行した時点ではセンサまでの距離は不定であり、すぐにセンサを検出しても正常だからです。
 *	* Wed Feb 01 21:56:57 JST 2017 Naoyuki Sawa
 *	- PslRelCh_Intr()にて全相励磁の出力パターンを間違えていたのを修正しました。
 *	  修正前は「fOut = -1」としていて、PslRel_Intr()にて他のリールの出力パターンとマージする際に、他のリールの出力パターンを破壊してしまっていました。
 *	  修正後は「fOut = (1<<0)|(1<<1)|(1<<2)|(1<<3)」として、他のリールの出力パターンを破壊してしないようになりました。
 */
#ifndef __CLIP_PSRL_H__
#define __CLIP_PSRL_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
#ifndef __RENESAS__
#define PslRel_UseVirtualReel	//このシンボルを定義すると、等速中(センサ検出済み)と停止中以外の状態でも、オフセットと絵柄位置を追跡します。仮想リールとして描画する場合等に、このシンボルを定義して下さい。
#endif//__RENESAS__
/****************************************************************************
 *	定数
 ****************************************************************************/
//ST_PslRelCh.iStat							//意味			備考			移行条件1		移行条件2				センサ検出
#define PslRelCh_Stat_Off		0				//非励磁中					回転開始でAccelへ						センサ検出を行わない
#define PslRelCh_Stat_Accel		1				//加速中		再加速中も含む		加速完了でNdへ							センサ検出を行わない
#define PslRelCh_Stat_Nd		2				//等速中		センサ未検出		センサ検出でCruiseへ	一定時間センサ未検出でAccelへ		センサ検出を行う		N.D.はnot detectedの略です。
#define PslRelCh_Stat_Cruise		3				//等速中		センサ検出済み		停止開始でBrakeへ	一定時間センサ未検出でAccelへ		センサ検出を行う
#define PslRelCh_Stat_Brake		4				//停止中					目標位置到達でStopへ	1ステップ遅延する場合はBrake2へ		センサ検出を行わない
#define PslRelCh_Stat_Brake2		5				//1ステップ遅延中				必ずStopへ							センサ検出を行わない
#define PslRelCh_Stat_Stop		6				//全相励磁中					一定時間経過でOffへ						センサ検出を行わない
/*--------------------------------------------------------------------------*/
#define PslRel_Ofs_Max			23/*変更可*/								//一絵柄のパルス数-1	┬(23+1)*(20+1)=504…一周のパルス数	┬リールユニットに依存する値
#define PslRel_Pos_Max			20/*変更可*/								//一周の絵柄数-1	┘					┘
/*--------------------------------------------------------------------------*/
#define PslRel_Sns_Ofs			8/*変更可*/								//順方向センサ検出時のオフセット				┬リールユニットに依存する値
#define PslRel_Sns_Pos			3/*変更可*/								//順方向センサ検出時の絵柄位置					┘
/*--------------------------------------------------------------------------*/
#define PslRel_NdCnt_Min		(((PslRel_Ofs_Max+1)*(PslRel_Pos_Max+1))-(PslRel_Ofs_Max+1)/*変更可*/)	//センサ未検出カウンタの最小有効値	検出が一絵柄分早過ぎても許容する事にした。(変更可)
#define PslRel_NdCnt_Max		(((PslRel_Ofs_Max+1)*(PslRel_Pos_Max+1))+(PslRel_Ofs_Max+1)/*変更可*/)	//センサ未検出カウンタの最大有効値	検出が一絵柄分遅過ぎても許容する事にした。(変更可)
/*--------------------------------------------------------------------------*/
#define PslRel_StpCnt_Max		((200000/PslRel_IntrNs)-1)						//全相励磁時間-1	200[ms]とした。(変更可)		((200000/1488)-1)=133[割り込み]
/*--------------------------------------------------------------------------*/
#define PslRel_OutPat_Add		0									//全総励磁後に出力パターンインデクスに加算する値	リールユニットの慣性に依存する値。停止時に慣性で進んでしまう場合はこの値を増やせ。
/*--------------------------------------------------------------------------*/
#define PslRel_IntrNs			((1000000*60)/(((PslRel_Ofs_Max+1)*(PslRel_Pos_Max+1))*80))		//タイマ割り込み間隔[ns]	((1000000*60)/(((23+1)*(20+1))*80))=1488[ns]
//					 ~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~
//					   一分[ns]                一周のパルス数              別表第五 回胴式遊技機に係る技術上の規格(第六条関係) ⇒ (1)性能に関する規格 ⇒ イ 回胴の回転に係る遊技機の性能に関する規格 ⇒ (ニ) 〜 その回転の回数は、一分間に八十回転を超えるものでないこと。 〜」
/****************************************************************************
 *	構造体
 ****************************************************************************/
typedef struct _ST_PslRelCh {
	uint8_t		iStat;		//+ 0, 1 状態				PslRelCh_Stat_*
	uint8_t		fSns;		//+ 1, 1 センサ状態			bit0=現在の状態,bit1=1回前の状態,bit2=2回前の状態,...,bit7=7回前の状態
	uint8_t		iOfs;		//+ 2, 1 オフセット			0〜PslRelCh_Ofs_Max
	uint8_t		iPos;		//+ 3, 1 絵柄位置			0〜PslRelCh_Pos_Max		上段基準
	uint8_t		iStpPos;	//+ 4, 1 停止位置			0〜PslRelCh_Pos_Max		上段基準
	uint8_t		iOutPat;	//+ 5, 1 出力パターンインデクス		[2:0]=0〜7,[7:3]=不定値		TBL_PslRel_OutPat[]へのインデクス	非励磁中,及び,全相励磁中は参照しない。
	uint8_t		iAccPat;	//+ 6, 1 加速パターンインデクス						TBL_PslRel_AccPat[]へのインデクス
	uint8_t		nAccCnt1;	//+ 7, 1 加速パターンカウンタ1
	uint8_t		nAccCnt2;	//+ 8, 1 加速パターンカウンタ2
	uint8_t		nStpCnt;	//+ 9, 1 全総励磁カウンタ
	uint16_t	nNdCnt;		//+10, 2 センサ未検出カウンタ
} ST_PslRelCh;				//=12
/*--------------------------------------------------------------------------*/
typedef struct _ST_PslRel {
	ST_PslRelCh	TBL_PslRelCh[3];	//[0]=左リール,[1]=中リール,[2]=右リール
#ifndef PslRel_UseVirtualReel
	uint8_t		iIntr;			//割り込みカウンタ	PslRel_Sync()で割り込み処理が完了するタイミングに同期するために使用する。
#endif//PslRel_UseVirtualReel
} ST_PslRel;
/****************************************************************************
 *	グローバル関数
 ****************************************************************************/
void PslRel_Init(ST_PslRel* pPslRel);
int PslRel_Intr(ST_PslRel* pPslRel, int fSns);
void PslRel_Sync(ST_PslRel* pPslRel);
void PslRel_Accel(ST_PslRel* pPslRel);
void PslRel_Brake(ST_PslRel* pPslRel, int iPslRelCh, int iStpPos);
ST_PslRelCh* PslRel_GetPslRelCh(ST_PslRel* pPslRel, int iPslRelCh);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_PSRL_H__
