//2018.05.10
/*******************************************************************************
*   ���W���[������      �F�A�v���P�[�V����05 - Background Task - MEA           *
*   ���W���[�����x��    �Fapp05_MEA                                            *
*   �^�X�N�敪          �F�A�v���P�[�V�����^�X�N                               *
*   �@�\                �F                                                     *
*   �R�[�����O�V�[�P���X�Fvoid app05_MEA                                       *
*   �߂�l              �Fvoid                                                 *
*   �g�p��̒���        �F�Ȃ�                                                 *
*   �G���[����          �F�Ȃ�                                                 *
*   ����				�FEDIT�����́AMPPE�g                                   *
*   �쐬���E�쐬��      �F2018/05/18    Y.K.                                   *
********************************************************************************/
#include "app_common.h"
#include 	"app_MPPE-MIA.h"
#include 	"app_MPPE-MEA.h"

int	app05_MEA_TlmDump( unsigned char, unsigned char, unsigned char, unsigned int, unsigned int, unsigned char);
char	app05_MEA_makeH(unsigned char, unsigned short*, unsigned short*);


int	app05_MEA1	(  unsigned int 	ui_TIstart, 	//	[INPUT]	TI - Dump Start 	(0x00000000:OLDEST  0xFFFFFFFF:LATEST)
					   unsigned int 	ui_TIlen,		//	[INPUT]	TI - Dump Length 	(0x0000: 1 Packet	0x0001: 1 Block  0xFFFF: All)
					   unsigned char	uc_drID )		//	[INPUT]	DR-ID	   			(0:CAL etc	1-5:Sync Trigger)
{
	int i_flag;
	unsigned char	uc_nodeId    = Gd_N_MEA1;			// Node-ID:   MEA1
	unsigned char	uc_dataId    = 0;					// Data-ID:   MEA1
	unsigned char 	uc_headId    = Gd_N_MEA1;			// Head-ID:   MEA1

	i_flag = app05_MEA_TlmDump( uc_nodeId, 				//	[INPUT]	Node-ID
								uc_dataId, 				//	[INPUT]	Data-ID
								uc_headId, 				//	[INPUT]	Head-ID
								ui_TIstart,				//	[INPUT]	TI - Dump Start 	(0x00000000:OLDEST  0xFFFFFFFF:LATEST)
								ui_TIlen, 				//	[INPUT]	TI - Dump Length 	(0x0000: 1 Packet	0x0001: 1 Block  0xFFFF: All)
								uc_drID);				//	[INPUT]	DR ID	   			(0:CAL etc	1-5:Sync Trigger)

	return i_flag;	//1: Ok; 0: No data
}




int	app05_MEA2	(  unsigned int 	ui_TIstart, 	//	[INPUT]	TI - Dump Start 	(0x00000000:OLDEST  0xFFFFFFFF:LATEST)
					   unsigned int 	ui_TIlen,		//	[INPUT]	TI - Dump Length 	(0x0000: 1 Packet	0x0001: 1 Block  0xFFFF: All)
					   unsigned char	uc_drID )		//	[INPUT]	DR-ID	   			(0:CAL etc	1-5:Sync Trigger)
{
	int i_flag;
	unsigned char	uc_nodeId    = Gd_N_MEA2;			// Node-ID:   MEA2
	unsigned char	uc_dataId    = 0;					// Data-ID:   MEA2
	unsigned char 	uc_headId    = Gd_N_MEA2;			// Head-ID:   MEA2

	i_flag = app05_MEA_TlmDump( 	uc_nodeId, 			//	[INPUT]	Node-ID
								uc_dataId, 				//	[INPUT]	Data-ID
								uc_headId, 				//	[INPUT]	Head-ID
								ui_TIstart,				//	[INPUT]	TI - Dump Start 	(0x00000000:OLDEST  0xFFFFFFFF:LATEST)
								ui_TIlen, 				//	[INPUT]	TI - Dump Length 	(0x0000: 1 Packet	0x0001: 1 Block  0xFFFF: All)
								uc_drID);				//	[INPUT]	DR ID	   			(0:CAL etc	1-5:Sync Trigger)

	return i_flag;	//1: Ok; 0: No data
}

int	app05_MEA_TlmDump( 	unsigned char	uc_nodeId, 		//	[INPUT]	Node-ID
						unsigned char	uc_dataId, 			//	[INPUT]	Data-ID
						unsigned char	uc_headId, 			//	[INPUT]	Head-ID
						unsigned int	ui_TIstart,			//	[INPUT]	TI - Dump Start 	(0x00000000:OLDEST  0xFFFFFFFF:LATEST)
						unsigned int	ui_TIlen, 			//	[INPUT]	TI - Dump Length 	(0x0000: 1 Packet	0x0001: 1 Block  0xFFFF: All)
						unsigned char	uc_drID)			//	[INPUT]	DR ID	   0:CAL etc	1-5:Sync Trigger					
{
	// === BLOCK read ===
	int				i_numNewBlock;												// Num of blocks with new data		
	M_T_BLOCK_INFO 	t_blockInfo;												// unsigned int 	ui_createTime	Block �����J�n���q������(1LSB=31,25ms)
																				// int 				i_replyNum		Block �o�^Read-Reply��
																				// char 			c_invalidFlg	Block ���f�[�^�ُ�	 [0:�ُ�Ȃ� 1:�ُ킠��]
																				// unsigned int 	ui_blockIndex	LongBuffer/ShortBuffer ��Block����ԍ� (�擪Block:0)
	//int				i_sizeBlk, i_sizePac, i_numPac;
	int				i, j, n;
	int				i_flag, i_rmap_hdr;
	unsigned int	ui_TIend;
	unsigned int	ui_TI;
	
	//unsigned char	uc_mode;					//Mode�ԍ�
	//unsigned char	uc_64nm;					//64Mode�ԍ�
	unsigned char	uc_pckt;					//�p�P�b�g�ԍ�
	unsigned char	uc_en_mode;					//�G�l���M�[���[�h: 2(32en x 16sc), 4(64en x 16sc)�݂̂ɑΉ�
	unsigned char	uc_find_pac1;				//�p�P�b�g�ԍ�1�̌��o�t���O
	int				i_ProNum;
	struct _s_MEA_CtrlParam	*pCtrl;		//����p�̃t���O�y�уp�����[�^	MEA1or2
	
	if (uc_nodeId == Gd_N_MEA1)	pCtrl  = &Gst_MEA1_ctrl;
	else						pCtrl  = &Gst_MEA2_ctrl;
		
	uc_find_pac1 = FALSE;
	i_rmap_hdr   = 12; 		//RMAP�w�b�_:12B
	// -------------------------------------------------
	// -- Set at the LONG buffer with the aimed block --
	// -------------------------------------------------
	i_numNewBlock	= app_SetTlmHBlock( uc_nodeId, uc_dataId, 				// [INPUT]  Node/Data ID
										ui_TIstart,							// [INPUT]  TI of Start Block	[0x0000000: OLDEST		0xFFFFFFFF: NEWEST]
										&t_blockInfo);						// [OUTPUT] Block Info                                ***
																			// (return)	>0:Num of blocks, <=0:No data (error)     ***
	if ( i_numNewBlock < 1 ) 	return(0);									// No data

	// TI-END
	if ( ui_TIlen == 0 || ui_TIlen == 1 )								ui_TIend = t_blockInfo.ui_createTime + 1;			// 1 Packet or 1 Block 
	else {
		if ( ui_TIstart == 0x00000000 || ui_TIstart == 0xFFFFFFFF )		ui_TIend = t_blockInfo.ui_createTime + ui_TIlen;	// from OLDEST or LATEST
		else															ui_TIend = ui_TIstart                + ui_TIlen;	// from OLDEST or LATEST
	}

	// TI-LEN special
	if ( ui_TIlen == 0 || ui_TIlen == 1 )								i_numNewBlock = 1;
	//if ( ui_TIlen == 0 )												i_numPac      = 1;

	for (i=0; i<i_numNewBlock; i++) {
		if ( Guc_TLMh_enadis[ uc_nodeId ]==0 )		break;				// **** 121125: added by YK ****
		if ( t_blockInfo.ui_createTime < ui_TIend	&&						// Time-Width check			(LSB: 31.25msec)
			 t_blockInfo.i_replyNum    > 0			&&						// Data available
			 t_blockInfo.c_invalidFlg == 0 ) {								// Data correct

			
			for (j = 0; j < 18; j++) {
				//��Ƀw�b�_�̂ݓǂݍ��݁A�_�~�[�p�P�b�g�̏ꍇ�̓X�L�b�v
				i_flag = app_GetPacket(
									5,									// [INPUT]  App-No:5
									uc_nodeId, uc_dataId, 				// [INPUT]  Node/Data ID
									0,  								// [INPUT]  Buffer ID = 0 (LONG)
									&t_blockInfo,						// [INPUT]  Block Info
									j,									// [INPUT]  Packet Num        = 0(�擪)
									0,									// [INPUT]  Offset(�W�̔{��)  = 0(�擪)
									32,									// [INPUT]  �Ǐo�T�C�Y		  = 1000B  or  Packet�T�C�Y
									G5uc_packet );						// [OUTPUT] 1 Block Data - copied
				if ( i_flag  )  continue;
				uc_pckt    = G5uc_packet[i_rmap_hdr + 5];
				if (uc_pckt == 0xff || uc_pckt == 0) continue;
				
				uc_pckt &= 0x3f;	//�p�P�b�g�ԍ�
									//	1-16 M2
									//	1-32 M4
				//if (uc_pckt > 0x10) continue;
				uc_en_mode = G5uc_packet[i_rmap_hdr + 4]; 			//M0-4 (2)
				i_flag = app_GetPacket(
									5,									// [INPUT]  App-No:5
									uc_nodeId, uc_dataId, 				// [INPUT]  Node/Data ID
									0,  								// [INPUT]  Buffer ID = 0 (LONG)
									&t_blockInfo,						// [INPUT]  Block Info
									j,									// [INPUT]  Packet Num        = 0(�擪)
									0,									// [INPUT]  Offset(�W�̔{��)  = 0(�擪)
									d_Lcl_MEA_PACSZ,					// [INPUT]  �Ǐo�T�C�Y		  = 1000B  or  Packet�T�C�Y
						G5uc_data + (uc_pckt-1)*d_Lcl_MEA_PACSZ);		// [OUTPUT] 1 Block Data - copied
				if ( i_flag  )  continue;

				//���o��
				if (uc_pckt == 1) {
					memcpy( Gst_MEA_dat.uc_hdrH, G5uc_packet + i_rmap_hdr, 8);	//SWEEP#1�̃w�b�_���擾����
					memcpy(&ui_TI,  G5uc_packet + i_rmap_hdr, 4);				//TI		
					
					uc_find_pac1 = TRUE;														//�p�P�b�g#1���o�t���O
				}
				//���o���Ȍ�
				//ScienceData��uc_data�ɍĔz�u����
				if (uc_find_pac1 && uc_pckt >= 1 && uc_pckt <= 32) {
					//H0
					if (uc_drID == 0) {
						app03_MIA_tlmout(uc_nodeId,				//MEA1 OR MEA2 �t���O
										pCtrl->uc_vet_cmp_ena,				//[INPUT] ���k�t���O
										(8 + 1024)/2,							//[INPUT] data����
										0xfe,									//[INPUT] Comment2
										4,										//[INPUT] Comment3
	(unsigned short*) (G5uc_data + (uc_pckt-1)*d_Lcl_MEA_PACSZ + i_rmap_hdr),	//[INPUT] ���k�O�̃v���_�N�g
										Gst_MEA_dat.us_3D_H,					//[MID]   ���k��o�b�t�@
										ui_TI,									//[INPUT] TI
										4+uc_drID);								//[INPUT] 0:L, 1: M, 4-9:H(DR-ID)
					}
					//H1-5
					//else {
					//	memcpy(&G5uc_data[(uc_pckt-1)*d_Lcl_MEA_SCISZ],
					//			&G5uc_packet[i_rmap_hdr + 8], d_Lcl_MEA_SCISZ);
					//}
				}
				//���K�o��
				//M2 H1-5�̂�
				if (uc_find_pac1 && uc_pckt == 16 && uc_drID != 0 && uc_en_mode == 2) {
					
					//memcpy(&ui_TI,  G5uc_packet + i_rmap_hdr, 4);				//SWEEP#1��TI�̂܂�			//2018.05.10����
					memcpy( Gst_MEA_dat.uc_hdrH, G5uc_packet + i_rmap_hdr, 8);	//SWEEP#16�̃w�b�_�ŏ㏑��	//2018.05.10����
					uc_find_pac1 = FALSE;	//�p�P�b�g#1���o�t���O��߂�

					//SW CAL
					if (pCtrl->uc_swcal_prm[0])	{
						//SW cal ON��: �e�X�g�p�p���X�ŃJ�E���g�f�[�^���㏑������
						app03_MEA_makeSWcal(uc_nodeId,				//[INPUT] SensorID
							(unsigned short*)G5uc_data,			//[OUTPUT] Buffer for Count data
											uc_en_mode);				//[INPUT]  ���[�h�ԍ�
					}
					
					//�v���_�N�g�쐬��TLM�쐬
					//H	mode product�쐬 1(4s) or 2(2s)
					i_ProNum = (uc_nodeId == Gd_N_MEA1) ? 1 + d_Lcl_MEA1_2sM : 1 + d_Lcl_MEA2_2sM;
					for (n = 0; n < i_ProNum; ++n) {
						app05_MEA_makeH(n + 2,						//[INPUT]Mode Flag (2 or 3)
							(unsigned short*)G5uc_data,				//[INPUT]Count data
							Gst_MEA_dat.us_3D_H);					//[OUTPUT]Product
							
						app03_MIA_tlmout(uc_nodeId,								//MEA1 OR MEA2 �t���O
										pCtrl->uc_vet_cmp_ena,					//[INPUT] ���k�t���O
										32*88 + d_Lcl_MEA_HK2B,					//[INPUT] data����
										0xfe,									//[INPUT] Comment2
										n,										//[INPUT] Comment3
							Gst_MEA_dat.us_3D_H,								//[INPUT] ���k�O�̃v���_�N�g
							(unsigned short*)(G5uc_data +d_Lcl_MEA_PACSZ*16),	//[MID]   ���k��o�b�t�@
										ui_TI,									//[INPUT] TI
										4+uc_drID);
					}
			
				}
			}
			Gui_TLMh_blockTime[uc_nodeId] = t_blockInfo.ui_createTime;

			
		}
		
		// To next block
		i_flag = app_NextBlock( 	uc_nodeId, uc_dataId, 					// [INPUT]  Node/Data ID
									0,		  								// [INPUT]  Buffer ID: 0 = LONG
									&t_blockInfo);							// [OUTPUT] Block Info
		if ( i_flag )				break;									// no data
	}
	return 1;
}
char app05_MEA_makeH(unsigned char	uc_f,			// [INPUT]FLG 3D-H 2: H 0-7ch
													//			       3: H 8-15ch
					unsigned short us_pac[],		// [INPUT]		COUNT data
					unsigned short us_out[])		// [OUTPUT] Product
{
	struct _s_MEA_Product		*pDat;		//�v���_�N�g
	pDat =  &Gst_MEA_dat;

	//pDat->us_Hlen = 32*88 + d_Lcl_MEA_HK2B;						//�f�[�^��

	memcpy(us_out, pDat->uc_hdrH, d_Lcl_MEA_HK2B*2);	//SWEEP#1�̃w�b�_���擾����
	//Hmode�͑���݂̂Ȃ̂ŏ������͕s�v
	app03_MEA_3D(us_pac, us_out + d_Lcl_MEA_HK2B, uc_f);			//�v���_�N�g�쐬
	
		
			#ifdef _RUN_ON_WINDOWS_
			int i, j;
			printf("3D-H(2,4s)\n");
			for (j = 0; j < 88; ++j) {
				for (i = 0; i < 32; ++i) printf("%0004x ", *(us_out + d_Lcl_MEA_HK2B + i + j*32) );
				printf("\n");
			}
			#endif
			

	return TRUE;
}