//2013.10.16
/*******************************************************************************
*   モジュール名称      :Application Header                                   *
*   モジュールラベル    :app_mppe_mea.h                                       *
*   タスク区分          :ヘッダ                                               *
*   機能                :define/Struct/Variable/Prototype                     *
*   使用上の注意        :特になし                                             *
*   作成日・作成者      :2011/10/08    Y.K.                                   *
*                                                                              *
*   参照                :Sampleとして、 app.def を参照のこと                  *
*   注意				:  EDIT権限は、MPPE/MEA組                             *
*******************************************************************************/

//
//#define _GET_WORKING_TIME_MEA__03	<==================提出時はコメントアウト
//#define _RUN_WITH_EMU_MEA__			<==================提出時はコメントアウト


//E2PROM SIZE (indicating the address of MEA2)
#define d_Lcl_MEA_E2P_SIZE		720

//Use 8CHs(0) or 16CHs(1) for calculating VM (>=4s)
//	0:	CH0-7 ([16sc][8ch]) are used:
//				VM-M(4s) derived from ([16sc][8ch])
//				Et-M(4s) derived from ([16sc][16ch])
//				3D-H(4s) derived from ([16sc][8ch]))
//	1:	CH0-16(16sc][16ch]) are used:
//				VM-M(2s) derived from ([8sc][16ch] + [8sc][16ch])
//				Et-M(2s) derived from ([8sc][16ch] + [8sc][16ch])
//				3D-H(2s) derived from ([8sc][16ch] + [8sc][16ch])
//VM, Et 3D-H
#define d_Lcl_MEA1_2sM		0	//0 Make 4s-products due to some blind CHs
#define d_Lcl_MEA2_2sM		1	//1 Make 2s-products
//3D-M & 3D-LL
#define d_Lcl_MEA1_3DM		1	//1 Included: derived from ([16sc][8ch])
#define d_Lcl_MEA2_3DM		0	//0

//Count Limit for Automatic g-factor control
#define d_Lcl_MEA_GCNT_UL 100000	//(cnt/sec/ch)   Upper limit for decreasing g
#define d_Lcl_MEA_GCNT_LL 1000		//(cnt/spin/16ch)Lower limit for increasing g


#define d_Lcl_MEA1_PHI0			(MATH_PI/16 + MATH_PI/2)//MEA1 SC0のphiノミナル値	MIAの座標系に準拠 -yからSC0が始まる
#define d_Lcl_MEA2_PHI0			( d_Lcl_MEA1_PHI0 )		// 取り付けは90度離れているがSC定義はMEA1と同じとした+ MATH_PI/2)		//

#define d_Lcl_MEA_TBL_RAD		0x7f				//LOOKUP TABLE RAD. 規格化パラメータ ROMテーブルの作成、読出時に使用
#define d_Lcl_MEA_MAX_RAD		(MATH_PI/16)		//LOOKUP TABLE RAD. 規格化パラメータ (11.25 deg.)
#define d_Lcl_MEA_TBL_RD1		0x1ff				//RAD. 規格化パラメータ sin or cosテーブル作成時に使用
#define d_Lcl_MEA_TBL_GF		0xbf //0x27f		//gf&gf2, 中央値で1に相当
#define d_Lcl_MEA_TBL_GF0		0x40 //0x200		//gf&gf2, 最低値、gf += uc_gf
#define d_Lcl_MEA_TBL_VF		0x27f				//vf, 中央値で1に相当
#define d_Lcl_MEA_TBL_VF0		0x200				//vf, 最低値、vf += uc_vf


//S/C POTENTIAL & Velocity TABLE
#define d_Lcl_MEA_TBL_POT		0x07ff		//LOOKUP TABLE POTENTIAL 規格化パラメータ 
#define d_Lcl_MEA_MAX_POT		100			//LOOKUP TABLE POTENTIAL 規格化パラメータ (V) EWOと同じ VAL_A,Bの規格化にも使用
//0: V64 (not needed for VM cal)
//1: 3-3k		0xffff
//2: 3-25k		0xffff <-> 1.0273e5 km/s(30keV)
//3: 2k-25k		0xffff <-> 1.0273e5 km/s(30keV)
#define d_Lcl_MEA_2qm			5.931e2		//=sqrt(2*q/m)/1000
#define d_Lcl_MEA_MAX_V32		1.0273e5	//LOOKUP TABLE Velocity32 規格化パラメータ (km/s) 30keV
//#define d_Lcl_MEA_MAX_V64		1000		//LOOKUP TABLE Velocity64 規格化パラメータ (km)

//モーメント計算の規格パラメータ
#define d_Lcl_MEA_N_NRM		(1.0*d_Lcl_MEA_TBL_RD1*d_Lcl_MEA_TBL_POT*d_Lcl_MEA_TBL_GF/d_Lcl_MEA_TBL_VF)
																		//Cnt/v*gf/vf*cos*pot = cos*pot*gf/vf
#define d_Lcl_MEA_V2_NRM	(d_Lcl_MEA_N_NRM*0xffff*d_Lcl_MEA_TBL_GF*d_Lcl_MEA_TBL_RD1*d_Lcl_MEA_TBL_POT)	
																		//Cnt*gf*cos*sin*pot^2 = N*C*gf*sin*pot
#define d_Lcl_MEA_V3_NRM	(d_Lcl_MEA_V2_NRM*d_Lcl_MEA_TBL_RD1)		//V2*sin
#define d_Lcl_MEA_P3_NRM	(d_Lcl_MEA_V3_NRM*0xffff*d_Lcl_MEA_TBL_VF*d_Lcl_MEA_TBL_POT)
																		//Cnt*gf*cos^3*v*vf*pot^3 = V3*v*vf*pot
#define d_Lcl_MEA_P4_NRM	(d_Lcl_MEA_P3_NRM*d_Lcl_MEA_TBL_RD1)		//P3*cos
#define d_Lcl_MEA_P5_NRM	(d_Lcl_MEA_P4_NRM*d_Lcl_MEA_TBL_RD1)		//P4*cos
#define d_Lcl_MEA_H3_NRM	(d_Lcl_MEA_P3_NRM*0xffff*d_Lcl_MEA_TBL_VF*d_Lcl_MEA_TBL_POT)
																		//Cnt*gf*cos^3*(v*vf)^2*potf^4 = P3*v*vf*pot
#define d_Lcl_MEA_H2_NRM	(d_Lcl_MEA_H3_NRM/d_Lcl_MEA_TBL_RD1)		//H3/cos
//桁補正
#define d_Lcl_MEA_N_OR	0.1
#define d_Lcl_MEA_V_OR	10
#define d_Lcl_MEA_P_OR	10
#define d_Lcl_MEA_H_OR	100
//モーメント計算の規格パラメータ(単一 energy step)
#define d_Lcl_MEA_N_NRM1	(1.0*0xffff*d_Lcl_MEA_TBL_RD1*d_Lcl_MEA_TBL_GF/d_Lcl_MEA_TBL_VF)
																					//Cnt*gf/vf*cos = Cnt*cos
#define d_Lcl_MEA_V2_NRM1	(d_Lcl_MEA_N_NRM1*d_Lcl_MEA_TBL_GF*d_Lcl_MEA_TBL_RD1)	//Cnt*gf*cos*sin = N1*gf*sin
#define d_Lcl_MEA_V3_NRM1	(d_Lcl_MEA_V2_NRM1*d_Lcl_MEA_TBL_RD1)					//V2*sin
#define d_Lcl_MEA_P3_NRM1	(d_Lcl_MEA_V3_NRM1*d_Lcl_MEA_TBL_VF)					//Cnt*gf*cos^3*vf = V3*vf
#define d_Lcl_MEA_P4_NRM1	(d_Lcl_MEA_P3_NRM1*d_Lcl_MEA_TBL_RD1)					//P3*cos
#define d_Lcl_MEA_P5_NRM1	(d_Lcl_MEA_P4_NRM1*d_Lcl_MEA_TBL_RD1)					//P4*cos
#define d_Lcl_MEA_H3_NRM1	(d_Lcl_MEA_P3_NRM1*d_Lcl_MEA_TBL_VF)					//Cnt*gf*cos^3*(vf)^2 = P3*vf
#define d_Lcl_MEA_H2_NRM1	(d_Lcl_MEA_H3_NRM1/d_Lcl_MEA_TBL_RD1)					//H3/cos



#define d_Lcl_MEA_3DLL			0x10	// Lmode 3D-LLの作成タイミング (最下位1bit = 0)
										// 3D-LL = 3D-M より3D-Mを3D-LLとしてTLM

#define d_Lcl_MEA_HK2B		4						//HDR(8B)
#define d_Lcl_MEA_IF2B		4						//INF(8B)
//#define d_Lcl_MEA_MD2B		(16 + 32 + 13*6)		//M-mode(EtOMN, EtPAP, VM)
//#define d_Lcl_MEA1_Ms2B 	(d_Lcl_MEA_HK2B  + d_Lcl_MEA_IF2B + d_Lcl_MEA_MD2B*2)
//													//MEA1 M mode, 3D-Mのアドレス
#define d_Lcl_MEA1_Ms2B64 	(d_Lcl_MEA_HK2B + 64*2 + d_Lcl_MEA_IF2B + 8*16*2)

#define d_Lcl_MEA_PACSZ (12 + 8 + 1024 + 4)	//観測データPacketの有効部分の最大値
#define d_Lcl_MEA_HDRSZ (12 + 8)			//
//#define d_Lcl_MEA_SCISZ 1024			//Science data size

// データ処理パラメータの規格化

// Please fill contents.

//制御用のフラグ及びパラメータ、コマンドによる変更がある for MEA1&2
struct _s_MEA_CtrlParam {
	unsigned char  uc_snap_ave;		//1:Snapshot, 0:Average
	unsigned char  uc_eng_sci;		//1:Eng, 0:Sci
	unsigned char  uc_mode;			//Eng(0-4), Sci(0-8)
	//POTENTIAL
	unsigned char  uc_pot_mode;		//0: NOT USE; 1: us_pot_A*p + us_pot_B
	//unsigned short us_pot_val;	//  - 0x7fff )*100/0x7fff
	unsigned short us_pot_A;		//  - 0x7fff )*100/0x7fff
	unsigned short us_pot_B;		//  - 0x7fff )*100/0x7fff
	//MGF
	unsigned char uc_B_mode;
	unsigned char uc_B_sec;

	
	//HK monitor
	unsigned char uc_HKmon_ena;//1:ENA, 0:DIS  (from Higher bit, MHV, SVS, SVG, MCPI, ASCT, IF-T, ASIC_SEL)
	unsigned short us_TMCP_lmt[2];
	unsigned short us_MCP_lmt[2];
	unsigned short us_IMCP_lmt[2];
	unsigned short us_TFPG_lmt[2];
	unsigned short us_IP5V_lmt[2];
	unsigned char uc_HK_anmly;	//HK anomaly detection [0-7]TMCP,MCP, IMCP, TFPG, IP5V
	//Product control
	unsigned char uc_stpe_ena;		//FLAG of sending Stp En#
	unsigned char uc_stpe_no;		
	unsigned char uc_gf_ena;		//FLAG of Autmatic GF changing
	unsigned char uc_gf_spn;		//Spin number for GF changing
	unsigned char uc_gf_spn_dec;	//	Counter for decreasing g
	unsigned char uc_gf_spn_inc;	//	Counter for increasing g
	unsigned char uc_gf_no;
	
	unsigned char	uc_ep[9];		//en step for EtPAP, EtPAPe
									// 0:	Width
									// 1-8:	Starting points of energy step
	//unsigned char	uc_evm[6];		//en step for VM
	unsigned int	ui_eng_vmf;	// 1/0 in 32 Estep for VM cal.
	unsigned char uc_en_tbl;
	
	//unsigned char	uc_pac_add;		//Address for asignment of count data at G3uc_data
	unsigned char uc_settbl_n;		//初期化作業用カウンタ
	unsigned char uc_readrom;		//E2PROM読み込みのフラグ, APP02で検出する。
	unsigned char uc_got_e2p_prm;	//E2PROMから読み込み後TRUEになる
	
	//MCP level before turning OFF
	unsigned char uc_MCP_V[2];
	//SCNT1
	unsigned char	uc_swcal_prm[5];	//観測データをソフト内で上書きする
										//0: ENA/DIS
										//1: EnStep		0xff = all
										//2: CH
										//3: Sector
										//4: Count		0 = k(EnStep)
	unsigned char	uc_vet_cmp_ena;	//プロダクトの圧縮を行わない
	//unsigned char	uc_tmp_get_pac;
	
	//unsigned char	uc_pacs;	//パケット番号の栞
	unsigned short	us_spinNo;
	unsigned short	us_Ldata[0x800];
	unsigned short	us_Llen_ttl;
};


//観測データ、解析用パラメータ(初期化時にE2PROMから値を取得する)
struct _s_MEA_ProcParam {
	unsigned char	uc_gf[5*16];		// /gf
	unsigned char	uc_gf2[5*16];		// /gf*dE*sr
	//unsigned short	us_dE[4*16];
	//unsigned short	us_sr[4*16];

	char			c_csp[5*16];
	char			c_snp[5*16];
	char			c_csa[5*16*16];
	char			c_sna[5*16*16];
	short			s_csp0[16];
	short			s_snp0[16];
	short			s_csa0[16];
	short			s_sna0[16];
	unsigned short	us_v32[32*3];	//32step x 4 independent of the mode of f-factor
	//unsigned short	us_v64[64];		//64step
	unsigned char	uc_vf[5*16];
};


//プロダクト
struct _s_MEA_Product {
	unsigned int	ui_LEtO[16];		//(4s)  shared by MEA1&2
	unsigned int	ui_LEtP1[16*4];	//(16s)
	unsigned int	ui_LEtP2[16*4];	//(16s)
	double			f_LVM1[13*6];	//(16s)
	double			f_LVM2[13*6];	//(16s)

	unsigned char	uc_infoL;	//comment[3]
	unsigned char	uc_infoM;	//comment[3]
	
	unsigned int	ui_MEtO[64*2];		//(2s, 4s)  shared by MEA1&2
	unsigned int	ui_MEtP[8*16*2];	//(2s, 4s)  shared by MEA1&2
	double			f_MVM[13*6*2];		//(2s, 4s)  shared by MEA1&2
	unsigned short	us_3DM[16*88 + 8];	//(4s or 8s) M-data container

	unsigned short	us_3D_H[32*88 + 4];
	//unsigned short	us_MEA2_3D_H[32*88];
	
	unsigned short	us_Llen2;
	unsigned short	us_Mlen;
	unsigned short	us_Mlen2;
//	unsigned short	us_Hlen;
	
	unsigned char	uc_hdr[ d_Lcl_MEA_HK2B*2];
	unsigned char	uc_hdrH[d_Lcl_MEA_HK2B*2];
	unsigned char	uc_hdr2[d_Lcl_MEA_IF2B*2];
	
	unsigned int	ui_TIL;
	//unsigned int	ui_TIH;

};

struct _s_MEA_Command {
	unsigned char	uc_cnt;
	unsigned char	uc_err_cnt;
	unsigned char	uc_ans[4];
	unsigned char	uc_mcp_off;		//counter
	unsigned char	uc_psu_off;		//counter
	unsigned char	uc_cnt_en;
};

#ifdef	_EXTERN_MPPE_MEA_VAL_
	#define	d_Lcl_MEA_EXTERN
#else
	#define	d_Lcl_MEA_EXTERN	extern
#endif

d_Lcl_MEA_EXTERN struct _s_MEA_CtrlParam	Gst_MEA1_ctrl;
d_Lcl_MEA_EXTERN struct _s_MEA_CtrlParam	Gst_MEA2_ctrl;
d_Lcl_MEA_EXTERN struct _s_MEA_ProcParam	Gst_MEA1_proc;
d_Lcl_MEA_EXTERN struct _s_MEA_ProcParam	Gst_MEA2_proc;
d_Lcl_MEA_EXTERN struct _s_MEA_Product		Gst_MEA_dat;
d_Lcl_MEA_EXTERN struct _s_MEA_Command		Gst_MEA1_cmd;
d_Lcl_MEA_EXTERN struct _s_MEA_Command		Gst_MEA2_cmd;


unsigned char	app01_Init_MEA(unsigned char);
//char	app03_MEA_tlmout(unsigned char, unsigned short*, unsigned short*, unsigned char);
char	app03_MEA_3D(unsigned short*, unsigned short*, unsigned char);
void	app03_MEA_makeSWcal(unsigned char, unsigned short*, unsigned char);