/*******************************************************************************
*   ���W���[������      �FAPP13 Mission TLM (L&M) MDM tasks                    *
*   ���W���[�����x��    �Fapp13_MDM                                            *
*   �^�X�N�敪          �FApplication-13  MDM task for Mission TLM (L)         *
*   �@�\                �F                                                     *
*   �R�[�����O�V�[�P���X�Fvoid app13_MDM                                       *
*   ����                �F�Ȃ�                                                 *
*   �߂�l              �F�Ȃ�                                                 *
*   �g�p��̒���        �F�O���[�o���ϐ��̓A�v���P�[�V�����O�P�ł܂Ƃ߂ď����� *
*   �G���[����          �F�Ȃ�                                                 *
*   ����				�F  EDIT�����́AMDM(core)�g                            *
*   �쐬���E�쐬��      �F2012/1/2      Y.K.                                   *
*******************************************************************************/
#include "app_common.h"

// *** MDM: local***
#define		d_MDM_pacSize		120								// MDM Packet size

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

// *** APP13 Common Grobal Variable (in app_common.h & app_common_variable.c) ***
//#define  				d_dataRawLen	0x40000
//#define  				d_dataPacLen	0x2000
//extern unsigned char	G13uc_data  [d_dataRawLen];			// for RAW data:    262.11 kB [EWO:80packet, Others:more than 1Block]
//extern unsigned char	G13uc_packet[d_dataPacLen];			// for Packet data: 8kB - max [Packet size to DMC: 1kB-max]


void	app13_MDM( unsigned int ui_sunpulseCnt )
{
	int				i;
	int				i_flag;

	// === BLOCK read ===
	int				i_bufId;													// Buffer ID
	int				i_numNewBlock;												// Num of blocks with new data
	unsigned int	ui_timeData;												// Processing data TI
	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)

	// === MDM data output ===
	int				i_pacId;

	// -----------------------------------------------------------
	// -- Set at the buffer with the oldest non-processed block --
	// -----------------------------------------------------------
	i_bufId = app_CheckNonProcBlock      ( Gd_N_MDM, 0,	 						// [INPUT]  NodeID = Gd_N_MDM,  Data ID = 0
										   Gui_TLMm_blockTime[Gd_N_MDM],		// [INPUT]  TI of Processed Block
										   & ui_timeData);						// [OUTPUT] TI of Newest Block in the selected buffer
																				// (return) Buffer-ID  (0:L, 1:S, -1:no data)
	if ( i_bufId < 0 )  return;													//  === No data ===

	// -------------------------------------------
	// -- Set at the oldest non-processed block --
	// -------------------------------------------
	// Newest Block
	i_numNewBlock	= app_SetNonProcBlock( Gd_N_MDM, 0,	 						// [INPUT]  NodeID = Gd_N_MDM,  Data ID = 0
										   i_bufId,  							// [INPUT]  Buffer ID  (0:L, 1:S)
										   Gui_TLMm_blockTime[Gd_N_MDM],		// [INPUT]  TI of Processed Block
										   &t_blockInfo);						// [OUTPUT] Block Info                                
																				// (return)	>0:Num of blocks, <=0:No data (error)     
	if ( i_numNewBlock < 1 ) {
		Gui_TLMm_blockTime[Gd_N_MDM] = ui_timeData;								//  === shift to newest data for SKIP ===
		return;
	}


	// ---------------------
	// -- Read Block data --
	// ---------------------
	for (i=0; i<i_numNewBlock; i++) {
		if ( t_blockInfo.ui_createTime > Gui_TLMm_blockTime[Gd_N_MDM]	&&		// NEW data
			 t_blockInfo.i_replyNum    > 0								&&		// Data available
			 t_blockInfo.c_invalidFlg == 0 								&&		// Data correct
			 i == i_numNewBlock-1 ) {											// latest 2 packets		[Max-packet production: 1 in 1-spin]

			// ****************************
			// **** Packet header read ****
			// ****************************
			//		RMAP-read-header	12B
			//		Contents			 ?B
			i_flag = app_GetBlock(	13,											// [INPUT]  App-No:13
									Gd_N_MDM, 0, 								// [INPUT]  NodeID = Gd_N_MDM,  Data ID = 0
									i_bufId,  									// [INPUT]  Buffer ID
									&t_blockInfo,								// [INPUT]  Block Info
									G13uc_data );								// [OUTPUT] 1 Block Data - copied
			if ( i_flag  )  continue;
			Gui_TLMm_blockTime[Gd_N_MDM] = t_blockInfo.ui_createTime;			// !!! Successfuly Processed !!!

			// ***********************
			// **** Packet decode ****
			// ***********************
			// [RMAP-READ-HEADER - offset: 12B]
			// TI		12+ 0-3		�T���p���X�ł̃��b�`�f�[�^�B�X�V����4sec����
			memcpy( &Gui_MDM_data_TI, &(G13uc_data[12]), 4);
			if (Gui_MDM_data_TI != 0xFFFFFFFF) {
				// Status1	12+ 12		B3	CAL	1:ENA	0:DIS
				if ( G13uc_data[24] & 0x08 )		i_pacId	= 0x40;				// CAL: FM�ł� "event" �Ƃ݂Ȃ��Ȃ��B
				else								i_pacId = 0x00;

				// Priority	12+ 10		�m�C�Yor�C�x���g�̃t���O�A�y�єg���l�@*
				//						B7(MSB)	1:event	0:noise
				//						B6-B0	Peak
				if ( G13uc_data[22] & 0x80 ) {
					if ( i_pacId == 0) {													// non-CAL���̂݁uFM�ł�event�Ƃ݂Ȃ��v
						memcpy( &Gus_MDM_data_dt, &(G13uc_data[16]), 2);					// *** Triggered TI for EWO: "1-spin delay"��
						Guc_MDM_data_priority = 0x80;
					}
					i_pacId	|= 0x80;
				} 

				// *****************
				// **** Put TLM ****
				// *****************
				// msec		12+ 4-5		1msec-CLK�J�E���^�[(16bit)
				if ( i == i_numNewBlock-1 ) {
					// TLM-packet formation
					memcpy( &(Guc_MDM_data[d_MDM_pacSize * Gi_MDM_numPacket]), &(G13uc_data[12]), d_MDM_pacSize );
					Gi_MDM_numPacket ++;
					if ( ( i_bufId == 1          )	||							// Short-packet
						 ( Gi_MDM_numPacket >= 8 )	||							// 8-packet�~��
						 ( Guc_HK_link[Gd_N_MDM ] == 0 )  ) {					// MDM = OFF
						i_pacId |= Gi_MDM_numPacket;
						/*
						app13_MDM_putTLM ( 	i_pacId, 							// [INPUT]  PacID
										   	Gui_MDM_data_TI,					// [INPUT]  TI (lsb:1.953msec)
										   	Guc_MDM_data,						// [INPUT]  MDM data packet
										   	d_MDM_pacSize * Gi_MDM_numPacket);	// [INPUT]  Packet size
						*/
	i_flag = app_PutTlm( 	13,						// [INPUT]  APP-NUM = 13
							Gd_N_MDM,				// [INPUT]	Node-ID
							0,						// [INPUT]	Data-ID
							Gd_N_MDM,				// [INPUT]	Header-ID (for PID-ID, CAT-ID setting)
							2,						// [INPUT]	DR-ID     (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)]
							Guc_TLMm_cmp[Gd_N_MDM], // [INPUT]	Comp mode			   [0:non 1:JPEG-rev 2:Math 3-7:After-User-COMP]
							i_pacId, 				// [INPUT]	Packet ID 			<<<< USER-DEF:       0x00-      0xFF >>>>
							Gui_MDM_data_TI, 		// [INPUT]	Data TI				<<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>>
							Guc_cmdDummy, 			// [INPUT]	Comment				<<<< USER-DEF: <128B                 >>>>
							0, 						// [INPUT]	Comment - Size 		<<<< USER-DEF: <128B                 >>>>
							Guc_MDM_data, 			// [INPUT]	Data				<<<< USER-DEF: <0x1E00               >>>>
							d_MDM_pacSize * Gi_MDM_numPacket); 	// [INPUT]	Data - Size			<<<< USER-DEF: <0x1E00               >>>>


						Gi_MDM_numPacket = 0;
					}
				}
			}
		}

		// To next block
		i_flag = app_NextBlock( Gd_N_MDM, 0, 								// [INPUT]  NodeID = Gd_N_MDM,  Data ID = 0
								i_bufId, 									// [INPUT]  Buffer ID
								&t_blockInfo);								// [OUTPUT] Block Info
		if ( i_flag )			break;										// no data
	}
	return;
}




/*
// ===========================================================================
// app13_MDM_putTLM
//		[INPUT]		int				i_pacId				Packet Num (0x00-0x1F)
//					unsigned int	ui_dataTi				Header: TI
//					unsigned char	uc_data[]				Data
//					int				i_dataSize				Data Size
// ===========================================================================
void	app13_MDM_putTLM(	int				i_pacId,				// [INPUT]		Packet ID
							unsigned int	ui_dataTi,				// [INPUT]		TI
							unsigned char	uc_data[],				// [INPUT]		Data
							int				i_dataSize)				// [INPUT]		Data Size (Byte)
{
	int				i_flag;

	i_flag = app_PutTlm( 	13,						// [INPUT]  APP-NUM = 13
							Gd_N_MDM,				// [INPUT]	Node-ID
							0,						// [INPUT]	Data-ID
							Gd_N_MDM,				// [INPUT]	Header-ID (for PID-ID, CAT-ID setting)
							2,						// [INPUT]	DR-ID     (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)]
							Guc_TLMm_cmp[Gd_N_MDM], // [INPUT]	Comp mode			   [0:non 1:JPEG-rev 2:Math 3-7:After-User-COMP]
							i_pacId, 				// [INPUT]	Packet ID 			<<<< USER-DEF:       0x00-      0xFF >>>>
							ui_dataTi, 				// [INPUT]	Data TI				<<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>>
							Guc_cmdDummy, 			// [INPUT]	Comment				<<<< USER-DEF: <128B                 >>>>
							0, 						// [INPUT]	Comment - Size 		<<<< USER-DEF: <128B                 >>>>
							uc_data, 				// [INPUT]	Data				<<<< USER-DEF: <0x1E00               >>>>
							i_dataSize); 			// [INPUT]	Data - Size			<<<< USER-DEF: <0x1E00               >>>>
	return;
}
*/