/*******************************************************************************
*   ���W���[������      �FAPP01 - CMD from DMC to DPU (for EWO task)           *
*   �쐬���E�쐬��      �F2018/1/12     Y.Kasaba, T.Imachi                     *
*   �Q��                �F  app01_DPU.c ���Q�Ƃ̂���                           *
*   ����		:  EDIT�����́AEWO�g                                  *
********************************************************************************/

#define __APP_WFC_OFA__
#define __APP_WFC_AM2P__

#include 	"app_common.h"
#include 	"app_EWO.h"

// *** Prototype - Local ***
unsigned char	app01_EWO            ( unsigned int,  unsigned char * , int);
//
unsigned char	app01_InitVar_EWO    ( void );
//unsigned char	app01_ErrClr_EWO     ( void );
//
unsigned char	app01_DPU            ( unsigned int,  unsigned char * , int);

// *** Local Macro ***
void			app01_EWO_E2PROM     ( int, unsigned int, int, unsigned char *, int);


// ********************************
// *** CMD analyses / execution ***
// ********************************
unsigned char	app01_EWO  ( unsigned int ui_Cntl, unsigned char uc_Data[], int i_Size )
{
	unsigned char	uc_flag = 0;
	int				i;

	// --------------------------------------------------------
	// ----- Common: INIT -------------------------------------
	// --------------------------------------------------------
	if      (ui_Cntl==0x0010) {
		if (i_Size!=0) return(0xFF);							// MD*U_EWO_HW_INIT (ex.name MD*U_EWO_E2PROM)
		G1uc_EWO_E2PROM	    = 0x01;								//	EWO: E2PROM operation:	1:start 2:EFD-LPF(1) 3:EFD-LPF(2) 4:EFD-SWEEP 6:EWOB-LPF 7:Hungary-table 0:none
//		G1uc_EWO_relay_init = 0x01;								// Initialization of EWO relays and flags
	}
	//
	else if (ui_Cntl==0x0011) {
		if (i_Size!=3) return(0xFF);							// MD*U_EWO_ECL_SET		--- Antenna eclipse angle (SSAS: 225deg) ----
		Gus_EWO_Ec_X1ang = ( uc_Data[0] * 5) % 360;				//	X1(WPT-S1:  0) eclipse angle	Spin-Phase =  45deg (=0x09)	<< HK N(0-72)x5 >>
																//	Y1(MEF-S1: 90) eclipse angle	Spin-Phase = 135deg (=0x1B)	<< HK N(0-72)x5 >>
																//	X2(WPT-S2:180) eclipse angle	Spin-Phase = 225deg (=0x2D)	<< HK N(0-72)x5 >>
																//	Y2(MEF-S2:270) eclipse angle	Spin-Phase = 315deg	(=0x3F)	<< HK N(0-72)x5 >>
		Guc_EwoMdmData_before = uc_Data[1];
		Guc_EwoMdmData_after  = uc_Data[2];
	}

	// --------------------------------------------------------
	// ----- Common: Mode set ---------------------------------
	// --------------------------------------------------------
	else if (ui_Cntl==0x0100)	{
		if (i_Size!=1) return(0xFF);							// MD*U_EFD_FILTER_MODE
		Guc_EFD_mode = uc_Data[0];								//	EFD-DPB-*: 0x*0:ave 0x*1:deci 
																//	EFD-DPB-L: 0x0*:8Hz 0x1*:4Hz 0x2*:2Hz
																//	SORBET:    0x0*:1/5spin 0x8*:1/10spin
		// RMAP 23 01 6C 00 21 01  F6  00 04 00 00 00 00 00 0E  1A 21 C0 00 00 07  01 02 01 08  10  01 00 91
	}
	//
	else if (ui_Cntl==0x0101)	{
		if (i_Size!=3) return(0xFF);							// MD*U_EWO_WFCE_OFA_CH
		G13uc_WFCE_L_channel  = (uc_Data[0] & 0x03);			// 0x00:|E|, 0x01:E1, 0x02:E2
		G13uc_WFCE_M1_channel = (uc_Data[1] & 0x03);			// 0x00:|E|, 0x01:E1, 0x02:E2
		G13uc_WFCE_M2_channel = (uc_Data[2] & 0x03);			// 0x00:|E|, 0x01:E1, 0x02:E2
	}
	//
	else if (ui_Cntl==0x0102)	{
		if (i_Size!=3) return(0xFF);							// MD*U_EWO_WFCB_OFA_CH
		G13uc_WFCB_L_channel = (uc_Data[0] & 0x03);				// 0x00:|B|, 0x01:Bx, 0x02:By, 0x03:Bz
		G13uc_WFCB_M1_channel = (uc_Data[1] & 0x03);			// 0x00:|B|, 0x01:Bx, 0x02:By, 0x03:Bz
		G13uc_WFCB_M2_channel = (uc_Data[2] & 0x03);			// 0x00:|B|, 0x01:Bx, 0x02:By, 0x03:Bz
	}
	//
	else if (ui_Cntl==0x0103)	{
		if (i_Size!=1) return(0xFF);							// MD*U_EWO_WFC_OFA_INTERVAL
		G13uc_WFC_OFA_interval = (uc_Data[0] & 0x03);			// 
	}
	//
	else if (ui_Cntl==0x0104)	{
		if (i_Size!=1) return(0xFF);							// OFA_COMP_SET	0:�񈳏k 1:���k		rev. 2012.11.26 Imachi
		Guc_TLMm_cmp[Gd_N_EWOE] = Guc_TLMm_cmp[Gd_N_EWOB] = Guc_TLMm_cmp[Gd_N_EFD] = Guc_TLMm_cmp[Gd_N_AM2P] = uc_Data[0] & 0x03;	// rev. by YK 121126
		// if ( uc_Data[0] != 0)																									// rev. by YK 121126
		//	Guc_TLMm_cmp[Gd_N_EWOE] = Guc_TLMm_cmp[Gd_N_EWOB] = Guc_TLMm_cmp[Gd_N_EFD] = Guc_TLMm_cmp[Gd_N_AM2P] = 1;				// rev. by YK 121126
		// else																														// rev. by YK 121126
		//	Guc_TLMm_cmp[Gd_N_EWOE] = Guc_TLMm_cmp[Gd_N_EWOB] = Guc_TLMm_cmp[Gd_N_EFD] = Guc_TLMm_cmp[Gd_N_AM2P] = 0;				// rev. by YK 121126
	}
	//
	else if (ui_Cntl==0x0105)	{
		if (i_Size!=3) return(0xFF);							// MD*U_EWO_WFC_CAL_ON
		G14uc_WFC_CAL_stage = 1;
		G14s_AM2P_TCWord = ( (short)uc_Data[0] << 8 ) + (short)uc_Data[1];
		G14uc_AM2P_shift = uc_Data[2];
	}
	//
	else if (ui_Cntl==0x0110)	{
		if (i_Size!=3) return(0xFF);							// AM2P_OBS_SET
		if( uc_Data[0] == 0xff && uc_Data[1] == 0xff ){			// FF FF �̏ꍇ�CTC word ���ăZ�b�g�����Ɏ��s
			G14uc_AM2P_stage = 2;
		} else {
			G14uc_AM2P_stage = 1;
			G14s_AM2P_TCWord = ( (short)uc_Data[0] << 8 ) + (short)uc_Data[1];
			G14uc_AM2P_shift = uc_Data[2];
		}
	}
	//
	else if (ui_Cntl==0x0120)	{
		if (i_Size!=1) return(0xFF);							// WFC_VL_CH_SET (�� WFC_VL_STRT)
		G14uc_WFCB_VL_ch = uc_Data[0] & 0x07;
		G14uc_WFCE_VL_ch = ( uc_Data[0] >> 4 ) & 0x03;
	}
	//
	else if (ui_Cntl==0x0130)	{
		if (i_Size!=1) return(0xFF);							// WFC_H_COMP_SET	0:�񈳏k 1:���k
		if ( uc_Data[0] != 0) {
			Guc_TLMh_cmp[Gd_N_EWOE] = Guc_TLMh_cmp[Gd_N_EWOB] = 3;																// rev. by YK 121126
			// Guc_TLMh_cmp[Gd_N_EWOE] = Guc_TLMh_cmp[Gd_N_EWOB] = Guc_TLMh_cmp[Gd_N_EFD] = Guc_TLMh_cmp[Gd_N_AM2P] = 3;		// rev. by YK 121126
		} else {
			Guc_TLMh_cmp[Gd_N_EWOE] = Guc_TLMh_cmp[Gd_N_EWOB] = 0;																// rev. by YK 121126
			// Guc_TLMh_cmp[Gd_N_EWOE] = Guc_TLMh_cmp[Gd_N_EWOB] = Guc_TLMh_cmp[Gd_N_EFD] = Guc_TLMh_cmp[Gd_N_AM2P] = 0;		// rev. by YK 121126
		}
	}
	//
	else if (ui_Cntl==0x0131)	{
		if (i_Size!=1) return(0xFF);							// WFC_H_CH_SET
		G5uc_WFCB_H_ch = uc_Data[0] & 0x07;
		G5uc_WFCE_H_ch = ( uc_Data[0] >> 4 ) & 0x03;
	}
		//
	else if (ui_Cntl==0x0132)	{
		if (i_Size!=1) return(0xFF);							// WFC_H_PREC_SET
		G5ui_EWO_WFCH_prec = (unsigned int)uc_Data[0];
	}
	//
	else if (ui_Cntl==0x0133)	{
		if (i_Size!=1) return(0xFF);							// WFC_H_RATE_SET		// 2013.11.13	T.Imachi
		G5uc_EWO_WFCH_rate = uc_Data[0] & 0x7f;
	}
	//
	else if (ui_Cntl==0x0140)	{
		if (i_Size!=1) return(0xFF);							// WFC_MDM_ENA	0:DIS 1:ENA
		G14uc_WFC_MDM_eve_ena = uc_Data[0];
	}
	//
	else if (ui_Cntl==0x01FF)	{
		if (i_Size!=1) return(0xFF);							// AM2P_SUSPND	0:ACT 1:Suspended
			G14uc_AM2P_suspend = uc_Data[0];
	}
	//
	else if (ui_Cntl==0x0200)	{
		if (i_Size!=3) return(0xFF);							// AM2P_TC_SET	[0]-[1]:TCword [2]:shift
		if( uc_Data[0] == 0xff && uc_Data[1] == 0xff && uc_Data[2] == 0xff ){	// 2012.12.20 Kasaba
			G14uc_AM2P_stage = 0;	// ALL 0xff �Ȃ珉�����̂�					// 2012.12.17 Imachi
		}																		// 2012.12.17 Imachi
		else{ 
			G14s_AM2P_TCWord_reserve = ( (short)uc_Data[0] << 8 ) + (short)uc_Data[1];
			G14uc_AM2P_shift_reserve = uc_Data[2];
		}
	}
	//
	else if (ui_Cntl==0x0201)	{
//		if (i_Size!=2) return(0xFF);							// AM2P_INT_SET	0x00:DIS 0x01-0xFE:INT 0xFF:OneShot
		if( i_Size == 2 ){
			if( uc_Data[0] == 0 ){
				G14uc_AM2P_disable = 1;								// �C���^�[�o�����O�̏ꍇ�AAM2P ��~�t���O�𗧂Ă�̂�
			}
			else{
//				G14uc_AM2P_interval = uc_Data[0];
				if( uc_Data[0] == 0xff ){
//					G14ui_AM2P_interval = 0xffff;
					G14ui_AM2P_interval_preset = 0xffff;		// 2013.08.12 T.imachi
				}
				else{
//					G14ui_AM2P_interval = (unsigned int)uc_Data[0];
					G14ui_AM2P_interval_preset = (unsigned int)uc_Data[0];		// 2013.08.12 T.imachi
				}
//				G14ui_AM2P_interval = (unsigned int)uc_Data[0];
				G14uc_AM2P_disable = 0;
			}
			G14uc_AM2P_trg_num = uc_Data[1];						//		�g���K��
		}
		else if( i_Size == 3 ){
			if( uc_Data[0] == 0 && uc_Data[1] == 0 ){
				G14uc_AM2P_disable = 1;								// �C���^�[�o�����O�̏ꍇ�AAM2P ��~�t���O�𗧂Ă�̂�
			}
			else{
//				G14ui_AM2P_interval = (unsigned int)uc_Data[0] << 8 | (unsigned int)uc_Data[1];
				G14ui_AM2P_interval_preset = (unsigned int)uc_Data[0] << 8 | (unsigned int)uc_Data[1];		// 2013.08.12 T.imachi
				G14uc_AM2P_disable = 0;
			}
			G14uc_AM2P_trg_num = uc_Data[2];						//		�g���K��
		}
		else{
			return( 0xFF );
		}
	}
	//
	else if (ui_Cntl==0x0202)	{
//		if (i_Size!=1) return(0xFF);							// WFC_VL_INT_SET	0x00:DIS 0x01-0xFE:INT 0xFF:OneShot
		if( i_Size == 1 ){
//			G14uc_WFC_VL_interval = uc_Data[0];
			G14ui_WFC_VL_interval = uc_Data[0];
		}
		else if( i_Size == 2 ){
			G14ui_WFC_VL_interval = (unsigned int)uc_Data[0] << 8 | (unsigned int)uc_Data[1];
		}
		else{
			return( 0xFF );
		}
	}
	//
	else if (ui_Cntl==0x0203)	{
		if( i_Size == 3 ){										// ISDM_INT_SET [0-1] Interval [2] spectrum dump enable		2013.11.18 T.Imachi
			G14ui_ISDM_interval = (unsigned int)uc_Data[0] << 8 | (unsigned int)uc_Data[1];
			G14uc_ISDM_dump_ena = uc_Data[2];
		}
		else{
			return( 0xFF );
		}
//		if (i_Size!=1) return(0xFF);							// ISDM_INT_SET	0x00:DIS 0x01-0xFE:INT 0xFF:OneShot
/*
		if( i_Size == 1 ){
//			G14uc_ISDM_interval = uc_Data[0];
			G14ui_ISDM_interval = uc_Data[0];
		}
		else if( i_Size == 2 ){
			G14ui_ISDM_interval = (unsigned int)uc_Data[0] << 8 | (unsigned int)uc_Data[1];
		}
		else{
			return( 0xFF );
		}
*/
	}
	//
	else if (ui_Cntl==0x0204)	{
		if (i_Size<3) return(0xFF);								// ISDM_TBL_WRT	[0]:Addr [1]:Length [2]-[n]:Data
		if ( ( uc_Data[0] + uc_Data[1] ) > 74 ) return(0xFF);	// 		Invalid parameter
		for( i=0; i<uc_Data[1]; i++ )
			G14uc_ISDM_table[i + uc_Data[0]] = uc_Data[i + 2];
	}
	//
	else if (ui_Cntl==0x0205)	{
		if (i_Size!=0) return(0xFF);								// ISDM_TBL_DMP
		G14uc_ISDM_table_dump_ena = 1;
	}	//
	else if (ui_Cntl==0x0206)	{
		if (i_Size!=0) return(0xFF);								// ISDM_INIT
		G14uc_ISDM_init = 1;
	}
	//
	else if (ui_Cntl==0x0207)	{
		if (i_Size!=0) return(0xFF);								// ISDM_RESTART
		G14uc_ISDM_reset = 1;
	}
	//
	else if (ui_Cntl==0x0208)	{
		if (i_Size!=1) return(0xFF);								// AGC_ENA_DIS
		G13uc_EWOE_AGC_ena = ( uc_Data[0] & 0x02 ) >> 1;
		G13uc_EWOB_AGC_ena = uc_Data[0] & 0x01;
	}
	//
	else if (ui_Cntl==0x0209)	{
		if (i_Size!=1) return(0xFF);								// AGC_INT_SET
		G13uc_EWO_AGC_interval = uc_Data[0];
	}
	//
	else if (ui_Cntl==0x020a)	{
		if (i_Size!=4) return(0xFF);								// WFCE_AGC_LIMIT_SET
		G13i_EWO_WFCE_upper_limit = ( (int)uc_Data[3] << 8 ) | (int)uc_Data[2];
		G13i_EWO_WFCE_lower_limit = ( (int)uc_Data[1] << 8 ) | (int)uc_Data[0];
	}
	//
	else if (ui_Cntl==0x020b)	{
		if (i_Size!=4) return(0xFF);								// WFCB_AGC_LIMIT_SET
		G13i_EWO_WFCB_upper_limit = ( (int)uc_Data[3] << 8 ) | (int)uc_Data[2];
		G13i_EWO_WFCB_lower_limit = ( (int)uc_Data[1] << 8 ) | (int)uc_Data[0];
	}
	//
	else if (ui_Cntl==0x020c)	{
		if (i_Size!=1) return(0xFF);								// ISDM_RAW_ENA		// 2013.11.13	T.Imachi
		G14uc_ISDM_dump_ena = uc_Data[0];
	}
	else if (ui_Cntl==0x020d)	{
		if (i_Size!=1) return(0xFF);								// WFC_VL_MOD_SET	// 2013.12.17	T.Imachi
		G14uc_WFCE_VL_M_ena = ( uc_Data[0] >> 3 ) & 0x01;
		G14uc_WFCE_VL_L_ena = ( uc_Data[0] >> 2 ) & 0x01;
		G14uc_WFCB_VL_M_ena = ( uc_Data[0] >> 1 ) & 0x01;
		G14uc_WFCB_VL_L_ena = ( uc_Data[0]      ) & 0x01;
	}
	
	
	// --------------------------------------------------------
	// ----- Mode preset --------------------------------------
	// --------------------------------------------------------
	else if (ui_Cntl==0x0300)	{
		if (i_Size!=1) return(0xFF);								// AM2P_EWOE_FREQ_SELECT
		Guc_AM2P_EWOE_freq = uc_Data[0];
	}
	else if (ui_Cntl==0x0301)	{
		if (i_Size!=1) return(0xFF);								// AM2P_EWOE_INPUT_SELECT
		Guc_AM2P_EWOE_input = uc_Data[0];
	}
	//	
	else if (ui_Cntl==0x0302)	{
		if (i_Size!=1) return(0xFF);								// AM2P_EWOE_GAIN_SET
		Guc_AM2P_EWOE_gain = uc_Data[0];
	}
	//
	else if (ui_Cntl==0x0303)	{
		if (i_Size!=1) return(0xFF);								// AM2P_WPTP_GAIN_SET
		Guc_AM2P_WPTP_gain = uc_Data[0];
	}
	//
	else if (ui_Cntl==0x0304)	{
		if (i_Size!=2) return(0xFF);								// AM2P_MEF_MODE_SET
		memcpy( &Guc_AM2P_MEF_mode[0], &uc_Data[0], 2 );
	}
	//
	else if (ui_Cntl==0x0305)	{
		if (i_Size!=3) return(0xFF);								// AM2P_MEF_BIAS1_SET
		memcpy( &Guc_AM2P_MEF_BIAS1[0], &uc_Data[0], 3 );
	}
	//
	else if (ui_Cntl==0x0306)	{
		if (i_Size!=3) return(0xFF);								// AM2P_MEF_BIAS2_SET
		memcpy( &Guc_AM2P_MEF_BIAS2[0], &uc_Data[0], 3 );
	}
	
	// --------------------------------------------------------
	// ----- System command override --------------------------
	// --------------------------------------------------------
	else if (ui_Cntl==0x0400)	{
		if (i_Size!=1) return(0xFF);								// EWOE_FREQ_SELECT
		Guc_EWOE_freq = uc_Data[0];
		Guc_EWOE_freq_set = 1;
	}
	//
	else if (ui_Cntl==0x0401)	{
		if (i_Size!=1) return(0xFF);								// EWOE_INPUT_SELECT
		Guc_EWOE_input = uc_Data[0];
		Guc_EWOE_input_set = 1;
	}
	//
	else if (ui_Cntl==0x0402)	{
		if (i_Size!=1) return(0xFF);								// EWOE_GAIN_SET
		Guc_EWOE_gain = uc_Data[0];
		Guc_EWOE_gain_set = 1;
	}
	//
	else if (ui_Cntl==0x0403)	{
		if (i_Size!=1) return(0xFF);								// EWO_WPTP_GAIN_SET
		Guc_EWO_WPTP_gain = uc_Data[0];
		Guc_EWO_WPTP_gain_set = 1;
	}
	//
	else if (ui_Cntl==0x0404)	{
		if (i_Size!=2) return(0xFF);								// EWO_MEF_MODE_SET
		memcpy( &Guc_EWO_MEF_mode[0], &uc_Data[0], 2 );
		Guc_EWO_MEF_mode_set = 1;
	}
	//
	else if (ui_Cntl==0x0405)	{
		if (i_Size!=3) return(0xFF);								// EWO_MEF_BIAS1_SET
		memcpy( &Guc_EWO_MEF_BIAS1[0], &uc_Data[0], 3 );
		Guc_EWO_MEF_BIAS1_set = 1;
	}
	//
	else if (ui_Cntl==0x0406)	{
		if (i_Size!=3) return(0xFF);								// EWO_MEF_BIAS2_SET
		memcpy( &Guc_EWO_MEF_BIAS2[0], &uc_Data[0], 3 );
		Guc_EWO_MEF_BIAS2_set = 1;
	}
	
	
	// --------------------------------------------------------
	// ----- EFD: Mode set ------------------------------------
	// --------------------------------------------------------
	else if (ui_Cntl==0x0800)	{
		if (i_Size!=2) return(0xFF);							// MD*U_EWO_EFD_MODE
		Guc_EFD_SPB_ena		= uc_Data[0];						//	Guc_EFD_SPB_ena 	M: B4:WPT-S1(0x10)  B5:WPT-S2(0x20)  B6:MEF-S1(0x40)  B7:MEF-S2(0x80)
																//					    L: B0:WPT-S1(0x11)  B1:WPT-S2(0x22)  B2:MEF-S1(0x44)  B3:MEF-S2(0x88)
		Guc_EFD_DPB_ena		= uc_Data[1];						//	ENA/DIS for DPB 	M: b4:WPT-Wa(0x10)  b5:MEF-Wa(0x20)  b6:WPT-Sp(0x40)  b7:MEF-Sp(0x80)
																//						L: b0:WPT-Wa(0x11)  b1:MEF-Wa(0x22)  b2:WPT-Sp(0x44)  b3:MEF-Sp(0x88)
		// # DPB: M:ALL, L:Ex-wave, Ey-wave, SPB: M:ALL, L:Ex+, Ey+ (14:46)
		// RMAP 23 01 6C 00 21 01  F5  00 04 00 00 00 00 00 0F  1A 21 C0 00 00 08  01 02 01 08  10  08 00 F5 F7
		//
		Guc_EFD_SPB_ena		&= ( 0xF0 + (Guc_EFD_SPB_ena>>4) );
		Guc_EFD_DPB_ena		&= ( 0xF0 + (Guc_EFD_DPB_ena>>4) );
	}
	//
	else if (ui_Cntl==0x0801)	{
		if (i_Size!=1) return(0xFF);							// MD*U_EWO_SWEEP_TBL
		if (uc_Data[0]     == 0x10) {                                                                                            // 180112
		  Guc_EFD_SlowSweep = 1;                                                                                                 // 180112
		} else if (uc_Data[0] > 0x10) {                                                                                          // 180112
		  Guc_EFD_SlowSweep = 0;                                                                                                 // 180112
		} else {                                                                                                                 // 180112
		  Guc_EFD_SlowSweep = 0;                                                                                                 // 180112
		G1uc_EFD_Sweep_Load = 1;								// SWEEP-LOAD:  ENA
		Guc_EFD_SweepTbl    = uc_Data[0] & 0x03;				// SWEEP-TABLE: 0-3
		Guc_EFD_SweepTbl_sum= 0x00;								// SWEEP-SUM
		}
	}
	
	//
	else uc_flag = 0xFF;										// *** Error: CMD not found ***
	return( uc_flag );
}
// **********************************************************************************************************