/*
 * Created: 2022/11/4 11:02:40
 *  Author:  wangzk zhengmengxing
 */ 

#include	"..\PrjCommon\CommonDef.h"
#include	"..\PrjCommon\DevDefine.h"
#include 	"AttMath.h"
#include 	"AttCtrlMain.h"
#include    "..\PrjTelCtrlMng\TelCtrlMng.h"

/***********************************************
说明：数据处理模块初始化函数,进程开始调用一次	
***********************************************/
void 	ZKDPInit(void)
{
	UINT32 i = 0;
	sAttPriData *tmpAtt = NULL;
	SsPara_t *pStar= NULL;
	GyroPara_t *pGyro= NULL;
	AssPara_t *pAss= NULL;
	MagPara_t *pMag= NULL;
	WhlPara_t *PWhl= NULL;
	PPUPara_t *PPPU= NULL;

	tmpAtt = (sAttPriData *)ATTCLT_DATA1_ADDR;	
	if(NULL==tmpAtt)
	{
		return;		
	}
		
	pAss = &tmpAtt->sPerPara.AssPara;
	pMag = &tmpAtt->sPerPara.MagPara;
	PWhl = &tmpAtt->sPerPara.WhlPara;
	PPPU = &tmpAtt->sPerPara.PPUPara;				
	
	//星敏
	for (i = 0; i < STAR_NUM; i++)
	{
		pStar = &tmpAtt->sPerPara.SsPara[i];
		pStar->ssIn_AttVld = POSE_NO;
		pStar->ssIn_DataSta  = 0;
		pStar->ssCrCheckFlg = NO_CC;
		memset(pStar->ssIn_W, 0, 3*sizeof(TYPE_CAL));
		pStar->ssExpose_Qbi[0] = 0;
		pStar->ssExpose_Qbi[1] = 0;
		pStar->ssExpose_Qbi[2] = 0;
		pStar->ssExpose_Qbi[3] = 1;
		memset(pStar->ssExpose_Wbi, 0, 3*sizeof(TYPE_CAL));
	}

	tmpAtt->sPerPara.Ss_Qi[0] = 0;
	tmpAtt->sPerPara.Ss_Qi[1] = 0;
	tmpAtt->sPerPara.Ss_Qi[2] = 0;
	tmpAtt->sPerPara.Ss_Qi[3] = 1;
	memset(tmpAtt->sPerPara.Ss_Wi, 0.0, 3*sizeof(TYPE_CAL));

	//陀螺
	for (i = 0; i < GYRO_NUM; i++)
	{
		pGyro = &tmpAtt->sPerPara.GyroPara[i];
		pGyro->GyroIn_AttVld = POSE_NO;
		pGyro->Gyro_ComTHUse[0] = POSE_OK;
		pGyro->Gyro_ComTHUse[1] = POSE_OK;
		pGyro->Gyro_ComTHUse[2] = POSE_OK;
		pGyro->GyroIn_DataSta  = 0;
		pGyro->GyroCrCheckFlg =NO_CC;
		memset(pGyro->GyroIn_Tmper, 0, 3*sizeof(TYPE_CAL));
		memset(pGyro->Gyro_Wi, 0, 3*sizeof(TYPE_CAL));
	}
	memset(tmpAtt->sPerPara.GyroIn_CombWi, 0, 3*sizeof(TYPE_CAL));
	memset(tmpAtt->sPerPara.Gyro_ATTWi, 0, 3*sizeof(TYPE_CAL));
	tmpAtt->sPerPara.GyroIn_Comb = POSE_NO;	
	
	//模拟太敏
	for (i = 0; i < ASS_NUM; i++)
	{
		pAss->AssIn_AttVld[i]= POSE_NO;  
		memset(pAss->AssIn_sensor[i], 0, 4*sizeof(TYPE_CAL));
		pAss->AssCrCheckFlg =NO_CC;			
	}
	pAss->Ass_SunVecb[0]= 0;						//模拟太敏本体系太阳矢量XYZ
	pAss->Ass_SunVecb[1]= 0;						//模拟太敏本体系太阳矢量XYZ
	pAss->Ass_SunVecb[2]= 0;						//模拟太敏本体系太阳矢量XYZ
	pAss->Ass_SunVecVld= POSE_NO;					//模拟太敏太阳矢量有效标志
	pAss->Ass_SunVecbF[0]= 0;						//模拟太敏帆板系太阳矢量XYZ
	pAss->Ass_SunVecbF[1]= 0;						//模拟太敏帆板系太阳矢量XYZ
	pAss->Ass_SunVecbF[2]= 0;						//模拟太敏帆板系太阳矢量XYZ
	pAss->Ass_SunATT[0] = 0;
	pAss->Ass_SunATT[1] = 0;
	pAss->Ass_SunOK= POSE_NO;
	pAss->ADIn_Date= POSE_OK;
			
	//磁强计	
	for (i = 0; i < MAG_NUM; i++)
	{								
		pMag->MagIn_Valid[i]= POSE_NO;              //模拟磁强计A/B有效标志
		//输出量
		memset(pMag->Mag_Bc_MeaAB[i],0,3*sizeof(TYPE_CAL));
		memset(pMag->Mag_Bb_MeaAB[i],0,3*sizeof(TYPE_CAL));	
	}
	pMag->MagIn_Valid[2]= POSE_NO;								//模拟磁强计A/B有效标志	
	pMag->MagIn_DataSta= 0;		
	pMag->MagUseSwich= 0;	
	pMag->Mag_Bb_MeaZH[0] =0;
	pMag->Mag_Bb_MeaZH[1] =0;
	pMag->Mag_Bb_MeaZH[2] =0;
	for (i = 0; i < MAG_NUM; i++)
	{								
		pMag->MagCrCheckFlg[i]=	NO_CC;
		pMag->MagAvailableFlg[i] =	POSE_OK;
	}		
	memset(pMag->Mag_UBb,0,3*sizeof(TYPE_CAL));

	//飞轮
	for (i = 0; i < WHEEL_NUM; i++)
	{
		PWhl->WhlIn_DataSta[i] = 0;
		PWhl->WhlIn_Valid[i] = POSE_NO;	
		PWhl->Whl_Current[i]= 0.0f;
		PWhl->Whl_Tmper[i] = 0.0f;
		PWhl->Whl_Momentum[i]= 0;			//四个飞轮的角动量	
	}
	for(i=0;i<3;i++)
	{
		PWhl->Whl_Momentum_XYZ[i]= 0.0; 	//飞轮三轴的角动量
	}
	PWhl->Whl_Momentum_Sum = 0;

#ifndef  MINMODULE_TYPE	
	//电推
	PPPU->PPUIn_Valid = POSE_NO;			//PPU数据有效标志
	PPPU->PPUIn_DataSta = 0;				//PPU 数据无效原因

	PPPU->PPUIn_ReCnt= 0;					//PPU遥测请求计数
	PPPU->PPUIn_AVoltage = 0;				//推进阳极电源电压
	PPPU->PPUIn_ACurrent = 0;				//推进阳极电源电流

	PPPU->PPUT_BOTTLE_Tmper1 = 0.0f;
	PPPU->PPUT_BOTTLE_Tmper2 = 0.0f;
	PPPU->PPUT_PIPE_Tmper1 = 0.0f;
	PPPU->PPUT_PIPE_Tmper2 = 0.0f;

#endif
}

/***********************************************
说明：获取星敏数据，注意星敏A\B原包数据均为小端
***********************************************/
void Ss_DataGet(void )   //ST-APS2-2B(X)星敏感器
{
	UINT8	sum = 0;
	UINT8	i = 0;
	UINT8	j = 0;
	UINT16	tmpHEAD[3] = {0,0,0};
	UINT16	tmpINFIN[3] ={0,0,0};
	INT32	tempQdata[4] = {0,0,0,1};
	INT16	tempWdata = 0;
	INT32	tempQdataC = 0;
	INT16	tempWdataC = 0;
	sAttPriData *tmpAtt = NULL;
	sDevInfo * tmpDevInfo[3]= {NULL};
	SsPara_t *PStar[STAR_NUM]= {NULL};	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if(NULL==tmpAtt)
	{
		return;		
	}

	//获取设备数据地址
	tmpDevInfo[0] = GETDEVINFO(DEV_NO_UART15);  //星敏A（803）
	tmpDevInfo[1] = GETDEVINFO(DEV_NO_UART16);  //星敏B（803）
	tmpDevInfo[2] = GETDEVINFO(DEV_NO_UART4);	//星敏C（天银）
		
	PStar[0] = &tmpAtt->sPerPara.SsPara[0];
	PStar[1] = &tmpAtt->sPerPara.SsPara[1];
	PStar[2] = &tmpAtt->sPerPara.SsPara[2];
	
	//记录前次原包数据
	for (i = 0; i < STAR_NUM; i++)
	{
		memcpy(PStar[i]->ssIn_Qpre, PStar[i]->ssIn_Q, 4*sizeof(TYPE_CAL));
		//初始化
		PStar[i]->ssIn_Q[0] = 0;
		PStar[i]->ssIn_Q[1] = 0;
		PStar[i]->ssIn_Q[2] = 0;
		PStar[i]->ssIn_Q[3] = 1;if(i==STAR_NUM-1){i--;}		
	}
	
	//获取星敏单机包头
	for (i = 0; i < STAR_NUM; i++)
	{
		tmpHEAD[i] = (tmpDevInfo[i]->cDevYCBuffer[0 + 20]<<8)|tmpDevInfo[i]->cDevYCBuffer[0 + 20+1];
	}
	//获取星敏单机信息字
	tmpINFIN[0] = (tmpDevInfo[0]->cDevYCBuffer[0 + 20 +2]<<8)|tmpDevInfo[0]->cDevYCBuffer[0 + 20+3];
	tmpINFIN[1] = (tmpDevInfo[1]->cDevYCBuffer[0 + 20 +2]<<8)|tmpDevInfo[1]->cDevYCBuffer[0 + 20+3];
	tmpINFIN[2] = tmpDevInfo[2]->cDevYCBuffer[0 + 20+2];

	//星敏AB数据获取
	for (i = 0; i < (STAR_NUM -1); i++)
	{
		if  (INFO_SIG_CHANGE == tmpDevInfo[i] ->cDevYCBuffer[0])
		{	
			if ((STARAB_HEAD != tmpHEAD[i]) || (STARAB_ID != tmpINFIN[i]))
			{
				PStar[i]->ssIn_AttVld	= POSE_NO;
				PStar[i]->ssIn_DataSta  = ZERO_TO_ONE(PStar[i]->ssIn_DataSta , 1, 1 ); /* errNo=0,星敏包头|ID号错误   */
			}
			else
			{
				sum = 0;
				/*判断校验和*/
				for(j = 0; j <  (STARAB_LEN - 1); j++)
				{
					sum += tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+j];
				}
				if ((0xFF & sum) != tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+STARAB_LEN-1])
				{
					PStar[i]->ssIn_AttVld	= POSE_NO;
					PStar[i]->ssIn_DataSta  = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 2, 1 ); /* errNo=0,星敏数据校验和不对  */
				}
				else
				{
					//星敏数据包中状态字1判断
					if (0x20 == (tmpDevInfo[i]->cDevYCBuffer[20+20] & 0x30))
					{
						PStar[i]->ssIn_AttVld	= POSE_NO;
						PStar[i]->ssIn_DataSta  = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 3, 1 ); /* 星敏感器状态字1中数据无效*/
					}
					else
					{
						PStar[i]->ssIn_AttVld	= POSE_OK;			
					}
				}
			}
		}
		else
		{
			PStar[i]->ssIn_AttVld	= POSE_NO;
			PStar[i]->ssIn_DataSta  = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 0, 1 ); /* errNo=0,星敏数据不更新  */
		}

		//解析星敏AB的数据
		if (POSE_OK == PStar[i]->ssIn_AttVld)
		{
			//四元数
			for(j = 0; j < 4; j++)
			{
				tempQdata[j] = DoGetInt32From8(&(tmpDevInfo[i]->cDevYCBuffer[20+4*j+4]));
			}
			PStar[i]->ssIn_Q[3] = tempQdata[0]/2147483647.5f;
			PStar[i]->ssIn_Q[0] = tempQdata[1]/2147483647.5f;
			PStar[i]->ssIn_Q[1] = tempQdata[2]/2147483647.5f;
			PStar[i]->ssIn_Q[2] = tempQdata[3]/2147483647.5f;
				
			//角速度
			for(j = 0; j < 3; j++)
			{
				tempWdata = DoGetInt16From8(&tmpDevInfo[i]->cDevYCBuffer[20+2*j+45]);
				PStar[i]->ssIn_W[j] = ((float)tempWdata)*ANG2RADIAN*POSE_2T13;
			}
			PStar[i]->ssIn_W[2] = - PStar[i]->ssIn_W[2];
		}
	}

	//星敏C数据获取
	if  (INFO_SIG_CHANGE == tmpDevInfo[2] ->cDevYCBuffer[0])
	{
		if ((STARC_HEAD != tmpHEAD[2]) || (STARC_ID != tmpINFIN[2]))
		{
			PStar[2]->ssIn_AttVld	= POSE_NO;
			PStar[2]->ssIn_DataSta  = ZERO_TO_ONE(PStar[2]->ssIn_DataSta , 1, 1 ); /* errNo=0,星敏包头|ID号错误   */
		}
		else
		{
			sum = 0;
			/*判断校验和*/
			for(j = 2; j < (STARC_LEN - 1); j++)
			{sum += tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+j];}
			if ((0xFF & sum) != tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+STARC_LEN - 1])
			{
				PStar[2]->ssIn_AttVld	= POSE_NO;
				PStar[2]->ssIn_DataSta  = ZERO_TO_ONE(PStar[2]->ssIn_DataSta, 2, 1 ); /* errNo=0,星敏数据校验和不对  */
			}
			else
			{
				//星敏数据包中状态字1判断
				if ((tmpDevInfo[2]->cDevYCBuffer[20+33] & 0x01) != 0x01)
				{
					PStar[2]->ssIn_AttVld	= POSE_NO;
					PStar[2]->ssIn_DataSta  = ZERO_TO_ONE(PStar[2]->ssIn_DataSta, 3, 1 ); /* 星敏感器状态字1中数据无效*/
				}
				else
				{
					PStar[2]->ssIn_AttVld	= POSE_OK;			
				}
			}
		}
	}
	else
	{
		PStar[2]->ssIn_AttVld	= POSE_NO;
		PStar[2]->ssIn_DataSta  = ZERO_TO_ONE(PStar[2]->ssIn_DataSta, 0, 1 ); /* errNo=0,星敏数据不更新  */
	}

	//解析星敏C的数据
	if (POSE_OK == PStar[2]->ssIn_AttVld)
	{
		//四元数
		for(j = 0; j < 4; j++)
		{
			tempQdataC = DoGetInt32From8(&tmpDevInfo[2]->cDevYCBuffer[20+4*j+3]);
			PStar[2]->ssIn_Q[j] = ((float)tempQdataC)/2147483647.0f;
		}
		//角速度
		for(j = 0; j < 3; j++)
		{
			tempWdataC = DoGetInt16From8(&tmpDevInfo[2]->cDevYCBuffer[20+2*j+42]);
			PStar[2]->ssIn_W[j] = ((float)tempWdataC)*ANG2RADIAN*POSE_2T11;
		}
	}
}

/***********************************************
说明：星敏数据处理
***********************************************/
void Ss_DataPre(void)
{
	UINT8 i	= 0;
	UINT8 j	= 0;
	TYPE_CAL	tmpRbs[9] = {0.0};
	TYPE_CAL	tmpRsi[9] = {0.0};
	TYPE_CAL	tmpRbi[9] = {0.0};
	TYPE_CAL 	tmp_SS[3][3][3] = {0.0};			//星敏安装矩阵
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	SsPara_t *PStar[STAR_NUM] = {NULL};	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;	
	if((NULL==tmpAtt)||(NULL==tmpConst))
	return;
		
	PStar[0] = &tmpAtt->sPerPara.SsPara[0];
	PStar[1] = &tmpAtt->sPerPara.SsPara[1];
	PStar[2] = &tmpAtt->sPerPara.SsPara[2];
	
	memcpy(&(tmp_SS[0][0][0]), &(tmpConst->AttCmdFlashPara.M_SSA[0][0]), 9*sizeof(TYPE_CAL));
	memcpy(&(tmp_SS[1][0][0]), &(tmpConst->AttCmdFlashPara.M_SSB[0][0]), 9*sizeof(TYPE_CAL));
	memcpy(&(tmp_SS[2][0][0]), &(tmpConst->AttCmdFlashPara.M_SSC[0][0]), 9*sizeof(TYPE_CAL));

	for (i = 0; i < STAR_NUM; i++)
	{
		if ((POSE_OK ==PStar[i]->ssIn_AttVld))
		{
			if (POSE_ABSF(PStar[i]->ssIn_Qpre[0]-PStar[i]->ssIn_Q[0])< SENSOR_ZERO
			&&POSE_ABSF(PStar[i]->ssIn_Qpre[1]-PStar[i]->ssIn_Q[1])< SENSOR_ZERO
			&&POSE_ABSF(PStar[i]->ssIn_Qpre[2]-PStar[i]->ssIn_Q[2])< SENSOR_ZERO
			&&POSE_ABSF(PStar[i]->ssIn_Qpre[3]-PStar[i]->ssIn_Q[3])< SENSOR_ZERO)
			{
				if(PStar[i]->ssExpose_cnt<255)
				{
					PStar[i]->ssExpose_cnt++;
				}
			}
			else
			{
				PStar[i]->ssExpose_cnt =0;
			}
			
			if (PStar[i]->ssExpose_cnt >= 5)
			{
				PStar[i]->ssIn_AttVld	= POSE_NO;
				PStar[i]->ssIn_DataSta  = ZERO_TO_ONE(PStar[i]->ssIn_DataSta, 4, 1 );
			}
			else
			{
				if(PStar[i]->ssIn_Q[3]<0)
				{
					for (j = 0; j < 4; j++)
					{
						PStar[i]->ssIn_Q[j] = - PStar[i]->ssIn_Q[j];
					}
				}
				
				Q2Att(PStar[i]->ssIn_Q, tmpRsi);
				memcpy(tmpRbs, &(tmp_SS[i][0][0]), 9 * sizeof(TYPE_CAL));
				MatrixProductHL(tmpRbs, tmpRsi, tmpRbi, 3, 3, 3);
				Att2Q(tmpRbi, PStar[i]->ssExpose_Qbi);
				MatrixProductHL(tmpRbs, PStar[i]->ssIn_W, PStar[i]->ssExpose_Wbi, 3, 3, 1);
				PStar[i]->ssIn_AttVld=POSE_OK;
			}
		}
	}
}


/***********************************************
说明：获取陀螺数据
***********************************************/
void 	Gyro_DataGet(void)
{
	UINT8 i = 0;
	UINT8 j = 0;
	UINT8 k = 0;
	INT32 tmpDtInt = 0;
	INT16 tmpDtTmper = 0;
	UINT8 sum[GYRO_NUM] = {0,0,0};
	UINT16 tmpHEAD[GYRO_NUM] = {0,0,0};
	UINT8  tmpLONG[GYRO_NUM] = {0,0,0};
	UINT16 tmpDATAHEAD[GYRO_NUM] = {0,0,0};
	TYPE_CAL	tmpGyroIn_Speed[3]= {0.0,0.0,0.0};
	TYPE_CAL	tmpkGyroIn_Speed[3]= {0.0,0.0,0.0};
	UINT8 tmpcnt[GYRO_NUM][3] = {{POSE_OK,POSE_OK,POSE_OK},{POSE_OK,POSE_OK,POSE_OK},{POSE_OK,POSE_OK,POSE_OK}};
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	sDevInfo * tmpDevInfo[GYRO_NUM] = {NULL};	
	GyroPara_t *PGyro[GYRO_NUM] = {NULL};	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL==tmpAtt)||(NULL==tmpConst))
	{
		return;		
	}

	PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
	PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
	PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];

    //获取陀螺地址
	tmpDevInfo[0] = GETDEVINFO(DEV_NO_UART5) ;
	tmpDevInfo[1] = GETDEVINFO(DEV_NO_UART6) ;
	tmpDevInfo[2] = GETDEVINFO(DEV_NO_UART7) ;
	//获取数据包头
	tmpHEAD[0]=(tmpDevInfo[0]->cDevYCBuffer[0 + INFO_ADDR_OFF]<<8)|tmpDevInfo[0]->cDevYCBuffer[0 + INFO_ADDR_OFF+1];
	tmpHEAD[1]=(tmpDevInfo[1]->cDevYCBuffer[0 + INFO_ADDR_OFF]<<8)|tmpDevInfo[1]->cDevYCBuffer[0 + INFO_ADDR_OFF+1];
	tmpHEAD[2]=(tmpDevInfo[2]->cDevYCBuffer[0 + INFO_ADDR_OFF]<<8)|tmpDevInfo[2]->cDevYCBuffer[0 + INFO_ADDR_OFF+1];
	tmpDATAHEAD[0] = GYRO_DATA_HEADA;
	tmpDATAHEAD[1] = GYRO_DATA_HEADA;
	tmpDATAHEAD[2] = GYRO_DATA_HEADC;
	//获取数据长
	tmpLONG[0] = GYRO_DATA_LENA;
	tmpLONG[1] = GYRO_DATA_LENA;
	tmpLONG[2] = GYRO_DATA_LENC;

	//记录前次原包数据
	for (i = 0; i < GYRO_NUM; i++)
	{
		memcpy(PGyro[i]->GyroIn_SpeedPre, PGyro[i]->GyroIn_Speed, 3*sizeof(TYPE_CAL));
		//初始化
		memset(PGyro[i]->GyroIn_Speed, 0, 3*sizeof(TYPE_CAL));
	}
	
	for (i = 0; i < GYRO_NUM ; ++i)
	{
		if (INFO_SIG_CHANGE == tmpDevInfo[i]->cDevYCBuffer[0])
		{
			if (tmpHEAD[i] == tmpDATAHEAD[i])
			{   
                /*判断校验和*/
                for(j = 0; j < tmpLONG[i] - 1; j++)
                {
	                sum[i] += tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+j];//陀螺的包长
                }
				
                if ((0xFF & sum[i]) == tmpDevInfo[i]->cDevYCBuffer[INFO_ADDR_OFF+tmpLONG[i] - 1])
                {
					PGyro[i]->GyroIn_AttVld = POSE_OK;
				}
				else
				{
					PGyro[i]->GyroIn_AttVld	 = POSE_NO;
					PGyro[i]->GyroIn_DataSta = ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta , 2, 1 ); /* errNo=0,陀螺A数据校验和错误  */
				}				
			} 
			else
			{
				PGyro[i]->GyroIn_AttVld	= POSE_NO;
				PGyro[i]->GyroIn_DataSta= ZERO_TO_ONE(  PGyro[i]->GyroIn_DataSta, 1, 1 ); /* errNo=0,陀螺A包头|包长错误 */
			}
		}
		else
		{
            PGyro[i]->GyroIn_AttVld	= POSE_NO;
            PGyro[i]->GyroIn_DataSta= ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta , 0, 1 ); /* errNo=0,陀螺A数据不更新  */
		}
	}

	//陀螺AB数据解析
	for (j = 0; j < 2 ; ++j)
	{
		if (POSE_OK ==PGyro[j]->GyroIn_AttVld)
		{
			for (i = 0; i < 3 ; ++i)
			{
				//XYZ轴角速度,单位：°/s
				tmpDtInt = DoGetInt32From8(&(tmpDevInfo[j]->cDevYCBuffer[INFO_ADDR_OFF+4*i+9]));
				tmpGyroIn_Speed[i] = (float)tmpDtInt  * (1.0E-5)*ANG2RADIAN  ;
				//XYZ轴角温度，单位：℃
				tmpDtTmper= tmpDevInfo[j]->cDevYCBuffer[INFO_ADDR_OFF+2*i+21]<<8|tmpDevInfo[j]->cDevYCBuffer[INFO_ADDR_OFF+2*i+22];
				PGyro[j]->GyroIn_Tmper[i]  = (float)(tmpDtTmper)*(1.0E-2);
			}
			MatrixProductHL(tmpConst->AttCmdFlashPara.Gyro_Comd_K[j][0] , tmpGyroIn_Speed, tmpkGyroIn_Speed, 3, 3, 1);
			for (i = 0; i < 3 ; ++i)
			{
				//XYZ轴角速度,单位：°/s
				PGyro[j]->GyroIn_Speed[i] = tmpkGyroIn_Speed[i] + tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[j][i] ;
			}			
		}		
	}

	//陀螺C数据解析
	if (POSE_OK == PGyro[2]->GyroIn_AttVld)
	{
		for (i = 0; i < 3 ; ++i)
		{
			//XYZ轴角速度,单位：°/s
			tmpGyroIn_Speed[i] = ((PoseGetInt32From24(&(tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+3*i+9]))))*POSE_POW(2,-18)*ANG2RADIAN ;
			//XYZ轴角温度，单位：℃
			tmpDtTmper= tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+2*i+19]<<8|tmpDevInfo[2]->cDevYCBuffer[INFO_ADDR_OFF+2*i+20];
			PGyro[2]->GyroIn_Tmper[i]  = (float)(tmpDtTmper)*POSE_POW(2,-8);	
		}
		MatrixProductHL(tmpConst->AttCmdFlashPara.Gyro_Comd_K[2][0] , tmpGyroIn_Speed, tmpkGyroIn_Speed, 3, 3, 1);		
		for (i = 0; i < 3 ; ++i)
		{
			//XYZ轴角速度,单位：°/s
			PGyro[2]->GyroIn_Speed[i] = tmpkGyroIn_Speed[i] + tmpConst->AttCmdFlashPara.Gyro_Comd_Bias[2][i] ;
		}
	}	

    //陀螺数据判断
    for (i = 0; i < GYRO_NUM ; ++i)
    {
	    if (POSE_OK == PGyro[i]->GyroIn_AttVld)
	    {   for (k = 0; k < 3 ; ++k)
		    {
				if (POSE_ABSF(PGyro[i]->GyroIn_SpeedPre[k]  - PGyro[i]->GyroIn_Speed[k]) < POSE_ZERO)
			    {
					if (PGyro[i]->Gyro_ComCnt[k] < 60000)
					{
						PGyro[i]->Gyro_ComCnt[k]++;
					}
			    }
			    else
			    {
				    PGyro[i]->Gyro_ComCnt[k] =0;
			    }
				if (POSE_ABSF(PGyro[i]->GyroIn_Speed[k]) > 0.436)
			    {
				    tmpcnt[i][k] = POSE_NO;
			    }
			    else
			    {
				    tmpcnt[i][k] = POSE_OK;
			    }
			    
				if ((PGyro[i]->Gyro_ComCnt[k] < 5)&& (tmpcnt[i][k] == POSE_OK))
			    {
				    PGyro[i]->Gyro_ComTHUse[k] = POSE_OK;
			    }
			    else
			    {
				    PGyro[i]->Gyro_ComTHUse[k] = POSE_NO;
					PGyro[i]->GyroIn_DataSta = ZERO_TO_ONE( PGyro[i]->GyroIn_DataSta , 3+k, 1 ); 
			    }
		    }		
	    }
		else
		{
			PGyro[i]->Gyro_ComTHUse[0] = POSE_NO;
			PGyro[i]->Gyro_ComTHUse[1] = POSE_NO;
			PGyro[i]->Gyro_ComTHUse[2] = POSE_NO;
		}
		
	    if ((POSE_NO == PGyro[i]->Gyro_ComTHUse[0])||(POSE_NO == PGyro[i]->Gyro_ComTHUse[1])||(POSE_NO == PGyro[i]->Gyro_ComTHUse[2]))
	    {
		    PGyro[i]->GyroIn_AttVld= POSE_NO;
	    }
    }		
}

/***********************************************
说明：陀螺数据处理
***********************************************/
void Gyro_DataPre(void)
{
	TYPE_CAL tmpRbs[9]= {0.0};
	TYPE_CAL tmpRbi[3]= {0.0,0.0,0.0};//陀螺输出角速度XYZ
	UINT8 i = 0;
	UINT8 k = 0;
	UINT8 tmpGyro = POSE_NO;
	UINT8 tmpComTHUse[3] = {0,0,0};
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	GyroPara_t *PGyro[GYRO_NUM] = {NULL};	
	AttIMPTPara_t 	*pIMU = NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL==tmpAtt)||(NULL==tmpConst))
	{
		return;		
	}

	pIMU=&tmpAtt->sIMPTPara;
	
	PGyro[0] = &tmpAtt->sPerPara.GyroPara[0];
	PGyro[1] = &tmpAtt->sPerPara.GyroPara[1];
	PGyro[2] = &tmpAtt->sPerPara.GyroPara[2];

	if ((0x55 == PGyro[0]->GyroIn_AttVld) || (0x55 == PGyro[1]->GyroIn_AttVld) || (0x55 == PGyro[2]->GyroIn_AttVld))
	{
		for (i = 0; i < GYRO_NUM ; ++i)
		{
			tmpGyro = POSE_NO;
			if (POSE_OK == PGyro[i]->GyroIn_AttVld)
			{
				for (k = 0; k < 3 ; ++k)
				{
					tmpRbi[k] = PGyro[i]->GyroIn_Speed[k];
				}
				tmpGyro = POSE_OK;
			}
			memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_GYRO[i][0][0]), 9 * sizeof(TYPE_CAL));

			if (tmpGyro == POSE_OK)
			{
				MatrixProductHL(tmpRbs, tmpRbi, PGyro[i]->Gyro_Wi, 3, 3, 1);
			}
		}			
	} 
	
	if((POSE_NO == pIMU->GyroUseState[0]) && (POSE_NO == pIMU->GyroUseState[1]) && (POSE_NO == pIMU->GyroUseState[2])) 
	{
		if (0x11 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[0])
		{
			tmpRbs[0] = tmpConst->AttCmdFlashPara.M_GYRO[0][0][0];
			tmpRbs[3] = tmpConst->AttCmdFlashPara.M_GYRO[0][1][0];
			tmpRbs[6] = tmpConst->AttCmdFlashPara.M_GYRO[0][2][0];
			tmpRbi[0] = PGyro[0]->GyroIn_Speed[0];
			tmpComTHUse[0] 	= 0x55;
		}
		else if (0x22 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[0])
		{
			tmpRbs[0] = tmpConst->AttCmdFlashPara.M_GYRO[1][0][0];
			tmpRbs[3] = tmpConst->AttCmdFlashPara.M_GYRO[1][1][0];
			tmpRbs[6] = tmpConst->AttCmdFlashPara.M_GYRO[1][2][0];
			tmpRbi[0] = PGyro[1]->GyroIn_Speed[0];
			tmpComTHUse[0] 	= 0x55;			
		}
		else if (0x44 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[0])
		{
			tmpRbs[0] = tmpConst->AttCmdFlashPara.M_GYRO[2][0][0];
			tmpRbs[3] = tmpConst->AttCmdFlashPara.M_GYRO[2][1][0];
			tmpRbs[6] = tmpConst->AttCmdFlashPara.M_GYRO[2][2][0];
			tmpRbi[0] = PGyro[2]->GyroIn_Speed[0];
			tmpComTHUse[0] 	= 0x55;			
		}

		if (0x11 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[1])
		{
			tmpRbs[1] = tmpConst->AttCmdFlashPara.M_GYRO[0][0][1];
			tmpRbs[4] = tmpConst->AttCmdFlashPara.M_GYRO[0][1][1];
			tmpRbs[7] = tmpConst->AttCmdFlashPara.M_GYRO[0][2][1];
			tmpRbi[1] = PGyro[0]->GyroIn_Speed[1];
			tmpComTHUse[1] 	= 0x55;
		}
		else if (0x22 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[1])
		{
			tmpRbs[1] = tmpConst->AttCmdFlashPara.M_GYRO[1][0][1];
			tmpRbs[4] = tmpConst->AttCmdFlashPara.M_GYRO[1][1][1];
			tmpRbs[7] = tmpConst->AttCmdFlashPara.M_GYRO[1][2][1];
			tmpRbi[1] = PGyro[1]->GyroIn_Speed[1];
			tmpComTHUse[1] 	= 0x55;
		}
		else if (0x44 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[1])
		{
			tmpRbs[1] = tmpConst->AttCmdFlashPara.M_GYRO[2][0][1];
			tmpRbs[4] = tmpConst->AttCmdFlashPara.M_GYRO[2][1][1];
			tmpRbs[7] = tmpConst->AttCmdFlashPara.M_GYRO[2][2][1];
			tmpRbi[1] = PGyro[2]->GyroIn_Speed[1];
			tmpComTHUse[1] 	= 0x55;
		}
				
		if (0x11 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[2])
		{
			tmpRbs[2] = tmpConst->AttCmdFlashPara.M_GYRO[0][0][2];
			tmpRbs[5] = tmpConst->AttCmdFlashPara.M_GYRO[0][1][2];
			tmpRbs[8] = tmpConst->AttCmdFlashPara.M_GYRO[0][2][2];
			tmpRbi[2] = PGyro[0]->GyroIn_Speed[2];
			tmpComTHUse[2] 	= 0x55;
		}
		else if (0x22 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[2])
		{
			tmpRbs[2] = tmpConst->AttCmdFlashPara.M_GYRO[1][0][2];
			tmpRbs[5] = tmpConst->AttCmdFlashPara.M_GYRO[1][1][2];
			tmpRbs[8] = tmpConst->AttCmdFlashPara.M_GYRO[1][2][2];
			tmpRbi[2] = PGyro[1]->GyroIn_Speed[2];
			tmpComTHUse[2] 	= 0x55;
		}
		else if (0x44 == tmpConst->AttCmdFlashPara.Gyro_ComRESW[2])
		{
			tmpRbs[2] = tmpConst->AttCmdFlashPara.M_GYRO[2][0][2];
			tmpRbs[5] = tmpConst->AttCmdFlashPara.M_GYRO[2][1][2];
			tmpRbs[8] = tmpConst->AttCmdFlashPara.M_GYRO[2][2][2];
			tmpRbi[2] = PGyro[2]->GyroIn_Speed[2];
			tmpComTHUse[2] 	= 0x55;
		}
		
		if ((0x55 == tmpComTHUse[0])&&(0x55 == tmpComTHUse[1])&&(0x55 == tmpComTHUse[2]) )
		{
			tmpAtt->sPerPara.GyroIn_Comb = POSE_OK;
			MatrixProductHL(tmpRbs, tmpRbi, tmpAtt->sPerPara.GyroIn_CombWi, 3, 3, 1);	
		} 
		else
		{
			tmpAtt->sPerPara.GyroIn_Comb = POSE_NO;
		}
	}
}


/***********************************************
说明：获取模拟太敏数据
***********************************************/
void Ass_DataGet(void )
{
	UINT32 i = 0;
	UINT32 j = 0;
	INT16 tmpDtInt = 0;
	INT16 *pAss16 = NULL;
	sDevInfo * tmpDevInfo = NULL;
	sAttPriData *tmpAtt = NULL;
	AssPara_t *pAss = NULL;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if(NULL==tmpAtt)
	{
		return;		
	}

	pAss = &tmpAtt->sPerPara.AssPara;

	//UINT32 ID[6] = {97,113,101,117,121,125};	
	UINT32 ID[6] = {SA1_TM_XP1-1, SA9_TM_YN1-1,SA5_TM_XN1-1,SA13_TM_YP1-1,SA17_TM_ZN1-1,SA21_TM_P1-1};	
	
	//获取AD采集数据
	tmpDevInfo = GETDEVINFO(DEV_NO_AD) ;
	pAss16 =  (INT16 *)(&tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]);
	//模拟太敏有效性判断
	if (INFO_SIG_CHANGE ==tmpDevInfo->cDevYCBuffer[0])
	{
		for (i= 0; i < ASS_NUM; i++)
		{
			for (j= 0; j < 4; j++)
			{
				//获取模拟太敏6*4电池片电压
				tmpDtInt = *(pAss16 + ID[i] +j);				
				pAss->AssIn_sensor[i][j] = (((TYPE_CAL)(tmpDtInt))*10/4095.0-5.0)/966.0*1000.0 ;
			}		
		}	
		pAss->ADIn_Date = POSE_OK;
	}
	else
	{
		pAss->ADIn_Date = POSE_NO;		
	}	
}


/***********************************************
说明：太敏数据处理
***********************************************/
void Ass_DataPre(void)
{
	UINT32		i = 0;
	UINT32		j = 0;
	UINT32		k = 0;
	UINT32		iMax = 0;
	UINT8		tempAssUseState[ASS_NUM]= {0,0,0,0,0,0};;             //单个太敏可用标志
	TYPE_CAL 	tmpSumMax = 0.0;
	TYPE_CAL    tmpAss_data_SUM[ASS_NUM] = {0.0,0.0,0.0,0.0,0.0,0.0};
	TYPE_CAL 	tmpU[4] = {0.0,0.0,0.0,0.0};
	TYPE_CAL	tmpRbs[9]= {0.0};
	TYPE_CAL 	tmpSm[3]= {0.0};
	TYPE_CAL 	tmpXs = 0.0;
	TYPE_CAL 	tmpYs = 0.0;
	TYPE_CAL    tmpX = 1.0;
	TYPE_CAL    tmpY = 1.0;
	TYPE_CAL	tmpa=5.0;//电池片宽度
	TYPE_CAL	tmpH=1.95;//光栅距离电池面距离
	TYPE_CAL	tmpTheta = 0.0;
	TYPE_CAL	tmpGamma = 0.0;

	sAttPriData *tmpAtt = NULL; 
	AttCtrlConst_t *tmpConst = NULL; 
	AssPara_t *pAss = NULL; 
	AttIMPTPara_t *pImpt = NULL; 
	sAttModPara_t *pWMod = NULL; 
				
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL==tmpAtt || NULL==tmpConst)
	{
		return;		
	}

	pAss = &tmpAtt->sPerPara.AssPara;
	pImpt=&tmpAtt->sIMPTPara;
	pWMod=&tmpAtt->sModePara;	
	
	if (POSE_OK == pAss->ADIn_Date)
	{
		for (i= 0; i < 4; i++)
		{
			for (j= 0; j < 4; j++)
			{
				tmpAss_data_SUM[i] += pAss->AssIn_sensor[i][j];
			}
			if ((tmpAss_data_SUM[i] < tmpConst->Ass_MaxFour_limt[0] )&&(tmpAss_data_SUM[i] > tmpConst->Ass_MinFour_limt[0]))
			{
				pAss->AssIn_AttVld[i] = POSE_OK;
			}
			else
			{
				pAss->AssIn_AttVld[i] = POSE_NO;	
			}
		}
		for (i= 4; i < ASS_NUM; i++)
		{
			for (j= 0; j < 4; j++)
			{
				tmpAss_data_SUM[i] += pAss->AssIn_sensor[i][j];
			}
			if ((tmpAss_data_SUM[i] < tmpConst->Ass_MaxFour_limt[1] )&&(tmpAss_data_SUM[i] > tmpConst->Ass_MinFour_limt[1]))
			{
				pAss->AssIn_AttVld[i] = POSE_OK;
			}
			else
			{
				pAss->AssIn_AttVld[i] = POSE_NO;
			}
		}
	}
	
	if ((0x55 == pWMod->WModSadaOpen)&& (0x55 != pWMod->WModSadaOpenPre))
	{
		pImpt->AssUseState[4] = POSE_NO;	
	} 
	
	//选择当前使用的模拟太敏，如果均不可用，则没有太敏可用于计算太阳矢量，输出模拟太敏矢量无效
	for (k= 0; k < ASS_NUM -1; k++)
	{
		if ((POSE_OK == pAss->AssIn_AttVld[k])&& (POSE_OK == pImpt->AssUseState[k]))
		{
			if(tmpAss_data_SUM[k]>tmpSumMax)
			{
				tmpSumMax=tmpAss_data_SUM[k];
				iMax=k;
			}
			tempAssUseState[k] = 0x55;
		}
	}

	if((0 == tempAssUseState[0])&&(0 == tempAssUseState[1])&&(0 == tempAssUseState[2])&&(0 == tempAssUseState[3])&&(0 == tempAssUseState[4]))//太敏均无效
	{
		pAss->Ass_SunVecVld = POSE_NO;
	}
	else
	{

		if(0 == iMax)
		{
			memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL));
			memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSA[0][0]), 9 * sizeof(TYPE_CAL));
		}
		else if(1 == iMax)
		{
			memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL));
			memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSB[0][0]), 9 * sizeof(TYPE_CAL));
		}
		else if(2 == iMax)
		{
			memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL));
			memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSC[0][0]), 9 * sizeof(TYPE_CAL));
		}
		else if(3 == iMax)
		{
			memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL));
			memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSD[0][0]), 9 * sizeof(TYPE_CAL));
		}
		else if(4 == iMax)
		{
			memcpy(tmpU, &(pAss->AssIn_sensor[iMax][0]), 4*sizeof(TYPE_CAL));
			memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSE[0][0]), 9 * sizeof(TYPE_CAL));
		}

		if ((iMax>=0)&&(iMax<4))
		{
			tmpH = 1.95;
		}
		else 
		{
			tmpH = 4.0;
		}

		tmpXs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpH;
		if(tmpXs!=0)
		{
			tmpX=tmpa*(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpXs;
		}
	
		tmpYs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpH;
		if(tmpYs!=0)
		{
			tmpY=tmpa*(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpYs;
		}

		//根据坐标值求出太阳矢量方位角θ、虚余仰角r
		tmpTheta = POSE_ATAN2F(tmpY, tmpX);
		tmpGamma = POSE_ATANF((POSE_SQRTF(tmpX*tmpX+tmpY*tmpY))/tmpH);
		tmpSm[0] = -POSE_COSF(tmpTheta)*POSE_SINF(tmpGamma);
		tmpSm[1] = -POSE_SINF(tmpTheta)*POSE_SINF(tmpGamma);
		tmpSm[2] = POSE_COSF(tmpGamma);
		MatrixProductHL(tmpRbs, tmpSm, pAss->Ass_SunVecb, 3, 3, 1);
		pAss->Ass_SunVecVld= POSE_OK;
		
	}


	//计算帆板模拟太敏方位角θ、虚余仰角r
	if ((POSE_OK == pAss->AssIn_AttVld[5])&& (POSE_OK == pImpt->AssUseState[5]))
	{
		tmpH = 4.0;
		memcpy(tmpU, &(pAss->AssIn_sensor[5][0]), 4*sizeof(TYPE_CAL));
		memcpy(tmpRbs, &(tmpConst->AttCmdFlashPara.M_aSSF[0][0]), 9 * sizeof(TYPE_CAL));
		tmpXs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpH;
		if(tmpXs!=0)
		{
			tmpX=tmpa*(tmpU[0]-tmpU[1]-tmpU[2]+tmpU[3])/tmpXs;
		}
	
		tmpYs=2.0*(tmpU[0]+tmpU[1]+tmpU[2]+tmpU[3])+0.2*fabs(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpH;
		if(tmpYs!=0)
		{
			tmpY=tmpa*(tmpU[0]+tmpU[1]-tmpU[2]-tmpU[3])/tmpYs;
		}
		//根据坐标值求出太阳矢量方位角θ、虚余仰角r
		tmpTheta = POSE_ATAN2F(tmpY, tmpX);
		tmpGamma = POSE_ATANF((POSE_SQRTF(tmpX*tmpX+tmpY*tmpY))/tmpH);	
		pAss->Ass_SunATT[0] = tmpTheta;
		pAss->Ass_SunATT[1] = tmpGamma;
		tmpSm[0] = -POSE_COSF(tmpTheta)*POSE_SINF(tmpGamma);
		tmpSm[1] = -POSE_SINF(tmpTheta)*POSE_SINF(tmpGamma);
		tmpSm[2] = POSE_COSF(tmpGamma);
		MatrixProductHL(tmpRbs, tmpSm, pAss->Ass_SunVecbF, 3, 3, 1);
		pAss->Ass_SunOK = POSE_OK;		
	}
	else
	{
		pAss->Ass_SunOK = POSE_NO;	
	}
}

/***********************************************
说明：获取磁强计数据
***********************************************/
void Mag_DataGet(void)
{
	TYPE_CAL	tmpMag_Bb_Limit = 55000.0;                          //sjd20231123

	INT16 tmpDtInt = 0;
	INT16 *pMag16 = NULL;
	UINT32 i = 0;
	UINT32 j = 0;
	TYPE_CAL tmpVm[MAG_NUM][3] = {{0,0,0},{0,0,0}};
	UINT32 ID = 2;
	ID = SV3_CQJA_X -1 ;
		
	sDevInfo * tmpDevInfo = NULL;
	sAttPriData *tmpAtt= NULL;
	AttCtrlConst_t *tmpConst= NULL;
	MagPara_t *pMag= NULL;	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL==tmpAtt || NULL==tmpConst)
	return;
	pMag = &tmpAtt->sPerPara.MagPara;

	//获取AD采集数据
	tmpDevInfo = GETDEVINFO(DEV_NO_AD) ;
	pMag16 = (INT16 *)(&tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]);
	
	//模拟磁强计的补偿矩阵计算
	if (INFO_SIG_CHANGE == tmpDevInfo -> cDevYCBuffer[0])
	{
		for (i = 0; i < MAG_NUM; ++i)
		{
			//计算Vm
			for (j = 0; j< 3; j++)
			{
				tmpDtInt = *(pMag16 + ID +j + 3*i);
				tmpVm[i][j] = tmpConst->AttCmdFlashPara.MAG_LK[i][j] * (((float)(tmpDtInt))*10/4095 - 5 ) + tmpConst->AttCmdFlashPara.MAG_LB[i][j];    //MAG_LK   24000
			}
		}
		if ((POSE_ABSF(tmpVm[0][0]) >tmpMag_Bb_Limit)|| (POSE_ABSF(tmpVm[0][1]) >tmpMag_Bb_Limit)|| (POSE_ABSF(tmpVm[0][2]) >tmpMag_Bb_Limit))
		{	
			if (POSE_ABSF(tmpVm[0][0]) >tmpMag_Bb_Limit)
			{
				pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 1, 1 );  //磁强计A测量值超阈值
			}
			if (POSE_ABSF(tmpVm[0][1]) >tmpMag_Bb_Limit)
			{
				pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 2, 1 );  //磁强计A测量值超阈值
			}
			if (POSE_ABSF(tmpVm[0][2]) >tmpMag_Bb_Limit)
			{
				pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 3, 1 );  //磁强计A测量值超阈值
			}
			pMag->MagIn_Valid[0] = POSE_NO;
		}
		else
		{
			memcpy(pMag->Mag_Bc_MeaAB[0], tmpVm[0], 3*sizeof(TYPE_CAL));
			pMag->MagIn_Valid[0] = POSE_OK;
		}
		
		if ((POSE_ABSF(tmpVm[1][0]) >tmpMag_Bb_Limit) || (POSE_ABSF(tmpVm[1][1]) >tmpMag_Bb_Limit)||(POSE_ABSF(tmpVm[1][2]) >tmpMag_Bb_Limit))
		{
			if (POSE_ABSF(tmpVm[1][0]) >tmpMag_Bb_Limit)
			{
				pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 4, 1 );  //磁强计A测量值超阈值
			}
			if (POSE_ABSF(tmpVm[1][1]) >tmpMag_Bb_Limit)
			{			
				pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 5, 1 );  //磁强计A测量值超阈值
			}
			if (POSE_ABSF(tmpVm[1][2]) >tmpMag_Bb_Limit)
			{			
				pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 6, 1 );  //磁强计A测量值超阈值
			}

			pMag->MagIn_Valid[1] = POSE_NO;
		}
		else
		{
			memcpy(pMag->Mag_Bc_MeaAB[1], tmpVm[1], 3*sizeof(TYPE_CAL));
			pMag->MagIn_Valid[1] = POSE_OK;
		}
	}
	else
	{
		pMag->MagIn_DataSta  = ZERO_TO_ONE( pMag->MagIn_DataSta, 0, 1 );   //数据不更新
		pMag->MagIn_Valid[0] = POSE_NO;
		pMag->MagIn_Valid[1] = POSE_NO;
	}		
}


/***********************************************
说明：磁强计数据处理
***********************************************/
void Mag_DataPre(void)
{
	UINT8 i = 0;
	TYPE_CAL	tmKm[3][3] = {{0.0,0.0,0.0},{0.0,0.0,0.0},{0.0,0.0,0.0}};
	TYPE_CAL	tmpMag_Bc_MeaAB[3]= {0.0,0.0,0.0};
	UINT8 tmpComTHUse[3] = {0,0,0};
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	MagPara_t *pMag = NULL;
	AttIMPTPara_t 	*pIMU = NULL;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL==tmpAtt) || (NULL==tmpConst))
	{
		return;		
	}

	pMag = &tmpAtt->sPerPara.MagPara;
	pIMU=&tmpAtt->sIMPTPara;
		
	//测量系磁强计A磁矢量
	if (POSE_OK == pMag->MagIn_Valid[0])
	{
		memcpy( tmKm[0], tmpConst->AttCmdFlashPara.M_MAG[0], 9 * sizeof(TYPE_CAL));
		MatrixPlusVectorN( tmKm[0],  pMag->Mag_Bc_MeaAB[0], pMag->Mag_Bb_MeaAB[0], 3, 3 );
	}
	if (POSE_OK ==pMag->MagIn_Valid[1])
	{
		memcpy( tmKm[0], tmpConst->AttCmdFlashPara.M_MAG[1], 9 * sizeof(TYPE_CAL));
		MatrixPlusVectorN( tmKm[0],  pMag->Mag_Bc_MeaAB[1], pMag->Mag_Bb_MeaAB[1], 3, 3 );
	}

	if ((POSE_NO == pIMU->MagUseState[0])&&(POSE_NO == pIMU->MagUseState[1]))
	{
		for (i = 0; i < 3; ++i)
		{
			if (0x11 == tmpConst->AttCmdFlashPara.Mag_ComRESW[i])
			{
				tmKm[0][i] = tmpConst->AttCmdFlashPara.M_MAG[0][0][i];
				tmKm[1][i] = tmpConst->AttCmdFlashPara.M_MAG[0][1][i];
				tmKm[2][i] = tmpConst->AttCmdFlashPara.M_MAG[0][2][i];
				tmpMag_Bc_MeaAB[i] =pMag->Mag_Bc_MeaAB[0][i];
				tmpComTHUse[i] = 0x55;
			}
			else if (0x22 == tmpConst->AttCmdFlashPara.Mag_ComRESW[i])
			{
				tmKm[0][i] = tmpConst->AttCmdFlashPara.M_MAG[1][0][i];
				tmKm[1][i] = tmpConst->AttCmdFlashPara.M_MAG[1][1][i];
				tmKm[2][i] = tmpConst->AttCmdFlashPara.M_MAG[1][2][i];
				tmpMag_Bc_MeaAB[i] =pMag->Mag_Bc_MeaAB[1][i];
				tmpComTHUse[i] = 0x55;		
			}

		}
		if ((0x55 == tmpComTHUse[0])&&(0x55 == tmpComTHUse[1])&&(0x55 == tmpComTHUse[2]))
		{
			MatrixPlusVectorN( tmKm[0],  tmpMag_Bc_MeaAB, pMag->Mag_Bb_MeaZH, 3, 3 );
			pMag->MagIn_Valid[2] = POSE_OK;				
		}
		else
		{
			pMag->MagIn_Valid[2] = POSE_NO;		
		}	
	}
}

/***********************************************
说明：获取飞轮数据
***********************************************/
void Whl_DataGet(void)
{

	UINT8 sum= 0;
	UINT32 i = 0;
	UINT32 j = 0;
	UINT16 tmpU16=0;
	INT16  tmpI16=0;
	UINT8 tmpWhlHEAD = 0;
	UINT8 tmpWhlHEADP = 0;
	UINT8 tmpWhlHEADID[4]={0};
	UINT16 tmpWhlEnd = 0;
	sDevInfo * tmpDevInfo = NULL;
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	WhlPara_t *PWhl = NULL;			
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL==tmpAtt) || (NULL==tmpConst))
	{
		return;			
	}

	PWhl = &tmpAtt->sPerPara.WhlPara;	
	
    tmpWhlHEADID[0] = tmpConst->Whl_ID[0];
	tmpWhlHEADID[1] = tmpConst->Whl_ID[1];
	tmpWhlHEADID[2] = tmpConst->Whl_ID[2];
	tmpWhlHEADID[3] = tmpConst->Whl_ID[3];
	
	//记录数据
	memcpy(PWhl->Whl_RatePre,PWhl->Whl_Rate,4*sizeof(TYPE_CAL));
	memcpy(PWhl->Whl_TimePRE,PWhl->Whl_Time,4*sizeof(UINT32));

	for (i = 0; i < (WHEEL_NUM); ++i)
	{
		tmpDevInfo = GETDEVINFO(i+ DEV_NO_UART8) ;
		tmpWhlHEAD = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF];
		tmpWhlHEADP = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+1];
		tmpWhlEnd = (tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+32]<<8)|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+33];

		/*飞轮数据更新*/
		if  (INFO_SIG_CHANGE == tmpDevInfo->cDevYCBuffer[0])
		{
			sum = 0;
			for(j = 2; j < WHL_DATA_LEN -1; j++)
			{sum += tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF  +j];}
			sum = 0xFF - sum;
				
			if((WHL_DATA_END != tmpWhlEnd)||(WHL_CMD_CODE_REQ!=tmpWhlHEADP)||(tmpWhlHEADID[i]!=tmpWhlHEAD))
			{
					PWhl->WhlIn_Valid[i] = POSE_NO;
					PWhl->WhlIn_DataSta[i]      = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 1, 1 ); /* errNo=0,飞轮包头|包长错误   */	
			}
			else
			{
				
				if (tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+ WHL_DATA_LEN  -1]!=sum)
				{
					PWhl->WhlIn_Valid[i] = POSE_NO;
					PWhl->WhlIn_DataSta[i]      = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 2, 1 ); /* errNo=0,飞轮包头|包长错误   */	
				} 
				else
				{
					PWhl->Whl_Time[i]=DoGetInt32From8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF +2]));
					tmpI16 = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+22]<<8|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+23];
					tmpU16 = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+24]<<8|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+25];
					PWhl->Whl_Rate[i] = DoGetFloatFrom8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+10]))*RADS2RPM;
					PWhl->Whl_Current[i]  = tmpI16;
					PWhl->Whl_Tmper[i]  = 0.4863 * (TYPE_CAL)(tmpU16) - 273.15	; 	
					PWhl->WhlIn_Valid[i] = POSE_OK;
				}				
			}					
		}
		else
		{
			PWhl->WhlIn_Valid[i]	= POSE_NO;
			PWhl->WhlIn_DataSta[i]  = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 0, 1 ); /* errNo=0,飞轮转速不更新  */
		}
	}	
}


/***********************************************
说明：飞轮数据处理
***********************************************/
void  Whl_DataPre(void)
{
	UINT8 i = 0;
	sAttPriData *tmpAtt = NULL;
	WhlPara_t *PWhl = NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if(NULL == tmpAtt)
	{
		return;		
	}

	PWhl = &tmpAtt->sPerPara.WhlPara;

	for (i = 0; i < WHEEL_NUM; ++i)
	{
		if (POSE_OK == PWhl->WhlIn_Valid[i])
		{	
			if (POSE_ABSF( PWhl->Whl_Rate[i]- PWhl->Whl_RatePre[i] ) > 100*RADS2RPM)  //200t230
			{
				PWhl->WhlIn_DataSta[i]      = ZERO_TO_ONE( PWhl->WhlIn_DataSta[i], 4, 1 ); 
				PWhl->WhlIn_Valid[i] = POSE_NO;
			}
			else
			{
				PWhl->WhlIn_Valid[i] = POSE_OK;
			}
		}
	}
}


/***********************************************
说明：霍尔电推数据处理
***********************************************/
void  PPU_DataPre(void)
{
	UINT16	tmpPPUHEAD = 0;
	UINT8	tmpPPSUM = 0;
	UINT8	sum = 0;
	UINT8	i = 0;
	UINT32 TempSatTime[2] ={0,0};
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;	
	sDevInfo * tmpDevInfo = NULL;
	PPUPara_t *PPPU = NULL;	
	sAttOrbitCtlInfo_t *pOrb = NULL;
	sAttModPara_t *pWMod= NULL;	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL==tmpAtt) || (NULL==tmpConst))
	{
		return;		
	}

	pWMod=&tmpAtt->sModePara;	
	PPPU = &tmpAtt->sPerPara.PPUPara;
	pOrb=&tmpAtt->sOrbitInp;	
	
	tmpDevInfo = GETDEVINFO(DEV_NO_CAN0) ;
	tmpPPUHEAD = (tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF]<<8)|tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+1];
	tmpPPSUM = 	tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF + PPU_CMD_LEN +1];
	
	/*获取星上时*/
	GetTime(TempSatTime);
	
	/*PPU单机数据更新判断*/
	if(INFO_SIG_CHANGE == tmpDevInfo->cDevYCBuffer[0])
	{
		for(i = 0; i < PPU_CMD_LEN+1 ; i++)
		{sum += tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF +i];}
		/*PPU数据有效判断*/
		if((PPU_CMD_LEN == tmpPPUHEAD )&&(sum == tmpPPSUM))
		{
			/*PPU数据有效更新上一拍、当前拍的请求计数（单机包中返回请求计数）*/
			PPPU->PPUIn_ReCntPre = PPPU->PPUIn_ReCnt;
			PPPU->PPUIn_ReCnt= tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+3];
			
			/*PPU数据上一拍、当前拍数据 不更新，则PPU数据无效 ？？？？*/
			if (PPPU->PPUIn_ReCntPre == PPPU->PPUIn_ReCnt)
			{
				PPPU->PPUIn_Valid	= POSE_NO;
				PPPU->PPUIn_DataSta  = ZERO_TO_ONE( PPPU->PPUIn_DataSta, 2, 1 );
			} 
			else
			{
				/*PPU数据上一拍、当前拍数据更新，则PPU数据有效*/
				PPPU->PPUIn_AVoltage=tmpConst->AttCmdFlashPara.PPUPVK *DoGetInt16From8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+15])) + tmpConst->AttCmdFlashPara.PPUPVB;				//推进阳极电源电压
				PPPU->PPUIn_ACurrent=tmpConst->AttCmdFlashPara.PPUPAK *DoGetInt16From8(&(tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+17])) + tmpConst->AttCmdFlashPara.PPUPAB;				//推进阳极电源电流
				
				/*跟新上一拍、当前拍的点火标志（单机数据包中的点火标志）*/
				PPPU->PPUIn_FIREOKPre = PPPU->PPUIn_FIREOK;
				PPPU->PPUIn_FIREOK = tmpDevInfo->cDevYCBuffer[INFO_ADDR_OFF+24];	//点火成功标志
				PPPU->PPUIn_Valid	= POSE_OK;
			}
		}
		else
		{
			/*PPU数据校验不通过，设置PPU数据无效*/
			PPPU->PPUIn_Valid	= POSE_NO;
			PPPU->PPUIn_DataSta  = ZERO_TO_ONE( PPPU->PPUIn_DataSta, 1, 1 );
			///*PPU数据校验不通过，设置上一拍、当前拍点火成功标志 为 未点火*/
			//PPPU->PPUIn_FIREOKPre = 0x00;
			//
			///*因PPU单机数据校验不通过，如果上一拍的点火成功，当前拍点火标志清零认为点火结束？？？，记录点火结束时间*/
			//if(0x01 == PPPU->PPUIn_FIREOK)
				//PPPU->PPUT_FIR_EndLast = TempSatTime[0];
			//
			//PPPU->PPUIn_FIREOK = 0x00;
			//
			//return;
		}
	}
	else
	{
		/*PPU单机数据不更新，设置PPU数据无效*/
		PPPU->PPUIn_Valid	= POSE_NO;
		PPPU->PPUIn_DataSta  = ZERO_TO_ONE( PPPU->PPUIn_DataSta, 0, 1 );
		///*PPU数据校验不通过，设置上一拍、当前拍点火成功标志 为 未点火*/
		//PPPU->PPUIn_FIREOKPre = 0x00;
		//
		///*因PPU单机数据未更新，如果上一拍的点火成功，当前拍点火标志清零认为点火结束？？？，记录点火结束时间*/
		//if(0x01 == PPPU->PPUIn_FIREOK)
			//PPPU->PPUT_FIR_EndLast = TempSatTime[0];
		//
		//PPPU->PPUIn_FIREOK = 0x00;
//
		//return;
	}
	
	/*PPU点火成功 总次数 不清除 一直记录*/
	if(0x01 == PPPU->PPUIn_FIREOK)
	{
		if (PPPU->PPUT_FIR_Sum< 0xFFFFFFFE)
		{
			PPPU->PPUT_FIR_Sum++ ;
		}
		else
		{
			PPPU->PPUT_FIR_Sum= 0;
		}
	}

	/*PPU从 点火 到 未点火，数据记录*/
	if ((0x01 == PPPU->PPUIn_FIREOKPre)&&(0x01 != PPPU->PPUIn_FIREOK))
	{
		if(PPPU->PPUT_FIR_Cnt>0)
		PPPU->PPUT_FIR_Cnt--;		
	}

	/*PPU从未点火 到 点火，数据记录*/
	if ((0x01 != PPPU->PPUIn_FIREOKPre)&&(0x01 == PPPU->PPUIn_FIREOK))
	{
		//if(PPPU->PPUT_FIR_Cnt>0)
			//PPPU->PPUT_FIR_Cnt--;
			
		if(PPPU->PPUT_FIR_SumCnt < 60000)
		{
			PPPU->PPUT_FIR_SumCnt++;
		}
		else
		{
			PPPU->PPUT_FIR_SumCnt = 0;
		}
		
		if((pOrb->CurOrbCtrlPcak_ID >= 0) &&(pOrb->CurOrbCtrlPcak_ID< 50))
		{
			PPPU->PPUT_FIR_Start[pOrb->CurOrbCtrlPcak_ID] = TempSatTime[0];
		}
	}/*PPU从点火 到 未点火，数据记录*/
	else if((0x01 == PPPU->PPUIn_FIREOKPre)&&(0x01 != PPPU->PPUIn_FIREOK))
	{
		tmpConst->AttCmdFlashPara.PPUT_FIR_EndLast = TempSatTime[0] ;
		pWMod->ATTFlashSwitch = POSE_OK;
		
		if(((pOrb->CurOrbCtrlPcak_ID  >= 1) &&(pOrb->CurOrbCtrlPcak_ID <= 50)))
		{
			PPPU->PPUT_FIR_End[pOrb->CurOrbCtrlPcak_ID - 1] = TempSatTime[0];
		}
		else if(0==pOrb->CurOrbCtrlPcak_ID)
		{
			if((PPPU->PPUT_FIR_CntS >= 1) &&(PPPU->PPUT_FIR_CntS <= 50))
			{
				PPPU->PPUT_FIR_End[PPPU->PPUT_FIR_CntS - 1] = TempSatTime[0];
				PPPU->PPUT_FIR_CntS =0;
			}
		}
	}
	else
	{;} /*不做处理*/
}

/***********************************************
说明：星敏互校验
***********************************************/
void SSABC_CC(void)
{
	UINT8 		i=0;
	UINT8 		tmpCheckCnt=0;
	TYPE_CAL	tmpLb[3][3] ={{0.0,0.0,0.0}, {0.0,0.0,0.0}, {0.0,0.0,0.0}};
	TYPE_CAL	tmpLi[3][3] ={{0.0,0.0,0.0}, {0.0,0.0,0.0}, {0.0,0.0,0.0}};
	TYPE_CAL	tmpRbs[3][9]={
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
							};
	TYPE_CAL	tmpAab_b = 0.0;
	TYPE_CAL	tmpAbc_b = 0.0;
	TYPE_CAL	tmpAac_b = 0.0;
	TYPE_CAL	tmpAab_i = 0.0;
	TYPE_CAL	tmpAbc_i= 0.0;
	TYPE_CAL	tmpAac_i= 0.0;
	TYPE_CAL	tmpRsi[3][9]={
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
							};
	TYPE_CAL	tmpRis[3][9]={
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
								{0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
							};
	UINT8		Valid[3]={0};
	UINT8		ssA_CCFlg=0;
	UINT8		ssB_CCFlg=0;
	UINT8		ssC_CCFlg=0;
	sAttPriData *tmpAtt = NULL;
	AttCtrlConst_t *tmpConst = NULL;
	SsPara_t *ssA = NULL;
	SsPara_t *ssB = NULL;
	SsPara_t *ssC = NULL;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if((NULL==tmpAtt) ||( NULL==tmpConst))
	{
		return;		
	}
	ssA=&tmpAtt->sPerPara.SsPara[0];
	ssB=&tmpAtt->sPerPara.SsPara[1];
	ssC=&tmpAtt->sPerPara.SsPara[2];
		
	Valid[0]=ssA->ssIn_AttVld;
	Valid[1]=ssB->ssIn_AttVld;
	Valid[2]=ssC->ssIn_AttVld;
	
	memcpy(tmpRbs[0], &(tmpConst->AttCmdFlashPara.M_SSA[0][0]), 9 * sizeof(TYPE_CAL));
	memcpy(tmpRbs[1], &(tmpConst->AttCmdFlashPara.M_SSB[0][0]), 9 * sizeof(TYPE_CAL));
	memcpy(tmpRbs[2], &(tmpConst->AttCmdFlashPara.M_SSC[0][0]), 9 * sizeof(TYPE_CAL));
	
	//计算星敏本体系光轴矢量
	for(i=0;i<3;i++)
	{
		tmpLb[i][0]=tmpRbs[i][2];
		tmpLb[i][1]=tmpRbs[i][5];
		tmpLb[i][2]=tmpRbs[i][8];
	}
	//计算星敏本体系光轴矢量夹角
	CalVecArc(tmpLb[0], tmpLb[1], &tmpAab_b);
	CalVecArc(tmpLb[0], tmpLb[2], &tmpAac_b);
	CalVecArc(tmpLb[1], tmpLb[2], &tmpAbc_b);
	
	//计算惯性系光轴矢量
	Q2Att(ssA->ssIn_Q, tmpRsi[0]);
	Q2Att(ssB->ssIn_Q, tmpRsi[1]);
	Q2Att(ssC->ssIn_Q, tmpRsi[2]);
	for(i=0;i<3;i++)
	{
		MatrixTransposeHL(tmpRsi[i], tmpRis[i],3, 3);
		tmpLi[i][0]=tmpRis[i][2];
		tmpLi[i][1]=tmpRis[i][5];
		tmpLi[i][2]=tmpRis[i][8];
	}
	//计算惯性系光轴矢量夹角
	CalVecArc(tmpLi[0], tmpLi[1], &tmpAab_i);
	CalVecArc(tmpLi[0], tmpLi[2], &tmpAac_i);
	CalVecArc(tmpLi[1], tmpLi[2], &tmpAbc_i);
	
	if (0x55 == Valid[0])
	{
		ssA_CCFlg=CC_UNCERTAIN;
	}
	else
	{
		ssA_CCFlg=NO_CC;		
	}	

	if (0x55 == Valid[1])
	{
		ssB_CCFlg=CC_UNCERTAIN;
	}
	else
	{
		ssB_CCFlg=NO_CC;
	}	
	if (0x55 == Valid[2])
	{
		ssC_CCFlg=CC_UNCERTAIN;
	}
	else
	{
		ssC_CCFlg=NO_CC;
	}
		
	if((0x55 == Valid[0])&&(0x55 == Valid[1]))
	{
		if(POSE_ABSF(tmpAab_i-tmpAab_b)<(tmpConst->SS_SS_CThr))
		{
			ssA_CCFlg=CC_CORRECT;
			ssB_CCFlg=CC_CORRECT;
			tmpCheckCnt++;
		}
	}
	
	if((0x55 == Valid[0])&&(0x55 == Valid[2]))
	{
		if(POSE_ABSF(tmpAac_i-tmpAac_b)<(tmpConst->SS_SS_CThr))
		{
			ssA_CCFlg=CC_CORRECT;
			ssC_CCFlg=CC_CORRECT;
			tmpCheckCnt++;
		}
	}
	
	if((0x55 == Valid[1])&&(0x55 == Valid[2]))
	{
		if(POSE_ABSF(tmpAbc_i-tmpAbc_b)<(tmpConst->SS_SS_CThr))
		{
			ssB_CCFlg=CC_CORRECT;
			ssC_CCFlg=CC_CORRECT;
			tmpCheckCnt++;
		}
	}

	if(tmpCheckCnt>0)//存在校验正确的星敏
	{
		if(ssA_CCFlg==CC_UNCERTAIN) ssA_CCFlg=CC_ERROR;
		if(ssB_CCFlg==CC_UNCERTAIN) ssB_CCFlg=CC_ERROR;
		if(ssC_CCFlg==CC_UNCERTAIN) ssC_CCFlg=CC_ERROR;
	}
	ssA->ssCrCheckFlg=ssA_CCFlg;
	ssB->ssCrCheckFlg=ssB_CCFlg;
	ssC->ssCrCheckFlg=ssC_CCFlg;
}


/***********************************************
说明：星敏+太敏互校验
***********************************************/
void StarSun_CC(void)
{
	UINT8 i,tmpCheckCnt=0;
	UINT8		ssA_CCFlg, ssB_CCFlg, ssC_CCFlg, Sun_CCFlg;
	TYPE_CAL	tmpRbi[3][9];
	TYPE_CAL	tmpSb[3][3];
	TYPE_CAL	tmpAam,tmpAbm,tmpAcm;
	sAttPriData *tmpAtt;
	AttCtrlConst_t *tmpConst;
	SsPara_t *ssA, *ssB, *ssC;
	AssPara_t *pASS;
	sAttOrbitGetPara_t *pOrbit = NULL;
			
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL==tmpAtt || NULL==tmpConst)
		return;

	ssA=&tmpAtt->sPerPara.SsPara[0];
	ssB=&tmpAtt->sPerPara.SsPara[1];
	ssC=&tmpAtt->sPerPara.SsPara[2];
	pASS=&tmpAtt->sPerPara.AssPara;
	pOrbit = &tmpAtt->sOrbitPara;	
	
	//校验条件判断（这里应该不判断也可）
	if((CC_CORRECT == ssA->ssCrCheckFlg)||(CC_CORRECT == ssB->ssCrCheckFlg)||(CC_CORRECT == ssC->ssCrCheckFlg))
		return;
	if(0x00 == pASS->Ass_SunVecVld)
		return;
	if((0x00 == ssA->ssIn_AttVld)&&(0x00 == ssB->ssIn_AttVld)&&(0x00 == ssC->ssIn_AttVld))
		return;
	if(POSE_NO == pOrbit->MJCLv)
	{
		return;
	}
	
	ssA_CCFlg=CC_UNCERTAIN;
	ssB_CCFlg=CC_UNCERTAIN;
	ssC_CCFlg=CC_UNCERTAIN;
	Sun_CCFlg=CC_UNCERTAIN;
	
	//计算本体系太阳矢量
	Q2Att(ssA->ssExpose_Qbi, tmpRbi[0]);
	Q2Att(ssB->ssExpose_Qbi, tmpRbi[1]);
	Q2Att(ssC->ssExpose_Qbi, tmpRbi[2]);
	for(i=0;i<3;i++)
		MatrixProductHL(tmpRbi[i], tmpAtt->sEnvPara.SunVecI, tmpSb[i], 3, 3, 1);
	
	//计算本体系下星敏太阳矢量和太敏太阳矢量夹角
	CalVecArc(tmpSb[0], pASS->Ass_SunVecb, &tmpAam);
	CalVecArc(tmpSb[1], pASS->Ass_SunVecb, &tmpAbm);
	CalVecArc(tmpSb[2], pASS->Ass_SunVecb, &tmpAcm);
	
	if((0x55 == ssA->ssIn_AttVld)&&(tmpAam<tmpConst->SS_ASS_CCThr))
	{
		ssA_CCFlg=CC_CORRECT;
		Sun_CCFlg=CC_CORRECT;
		tmpCheckCnt++;
	}
	
	if((0x55 == ssB->ssIn_AttVld)&&(tmpAbm<tmpConst->SS_ASS_CCThr))
	{
		ssB_CCFlg=CC_CORRECT;
		Sun_CCFlg=CC_CORRECT;
		tmpCheckCnt++;
	}
	
	if((0x55 == ssC->ssIn_AttVld)&&(tmpAcm<tmpConst->SS_ASS_CCThr))
	{
		ssC_CCFlg=CC_CORRECT;
		Sun_CCFlg=CC_CORRECT;
		tmpCheckCnt++;
	}
	
	if(tmpCheckCnt>0)
	{
		if(ssA_CCFlg==CC_UNCERTAIN) ssA_CCFlg=CC_ERROR;
		if(ssB_CCFlg==CC_UNCERTAIN) ssB_CCFlg=CC_ERROR;
		if(ssC_CCFlg==CC_UNCERTAIN) ssC_CCFlg=CC_ERROR;
	}
	else
		Sun_CCFlg=CC_UNCERTAIN;
	
	ssA->ssCrCheckFlg=ssA_CCFlg;
	ssB->ssCrCheckFlg=ssB_CCFlg;
	ssC->ssCrCheckFlg=ssC_CCFlg;
	pASS->AssCrCheckFlg=Sun_CCFlg;
}

/***********************************************
说明：星敏校太敏
***********************************************/
void StarCheckSun(void)
{
	TYPE_CAL	tmpQbi[4];
	TYPE_CAL	tmpRbi[9];
	TYPE_CAL	tmpSb[3];
	TYPE_CAL	tmpAsm;
	sAttPriData *tmpAtt;
	AttCtrlConst_t *tmpConst;	
	SsPara_t *ssA, *ssB, *ssC;
	AssPara_t *pASS;	

	sAttOrbitGetPara_t *pOrbit = NULL;

	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	
	if(NULL==tmpAtt || NULL==tmpConst)
		return;
		
	ssA=&tmpAtt->sPerPara.SsPara[0];
	ssB=&tmpAtt->sPerPara.SsPara[1];
	ssC=&tmpAtt->sPerPara.SsPara[2];
	pASS=&tmpAtt->sPerPara.AssPara;
	pOrbit = &tmpAtt->sOrbitPara;

	if((0x00 == pASS->Ass_SunVecVld)||(POSE_NO == pOrbit->MJCLv))
	{
		pASS->AssCrCheckFlg=NO_CC;
		return;
	}

	//利用星敏计算本体系太阳矢量
	if(CC_CORRECT == ssA->ssCrCheckFlg)
	{
		memcpy(tmpQbi, ssA->ssExpose_Qbi, 4 * sizeof(TYPE_CAL));
	}
	else if(CC_CORRECT == ssB->ssCrCheckFlg)
	{
		memcpy(tmpQbi, ssB->ssExpose_Qbi, 4 * sizeof(TYPE_CAL));
	}
	else if(CC_CORRECT == ssC->ssCrCheckFlg)
	{
		memcpy(tmpQbi, ssC->ssExpose_Qbi, 4 * sizeof(TYPE_CAL));
	}
	else
	{
		return;
	}
		
	Q2Att(tmpQbi, tmpRbi);
	MatrixProductHL(tmpRbi, tmpAtt->sEnvPara.SunVecI, tmpSb, 3, 3, 1);
	//判断夹角
	CalVecArc(tmpSb, pASS->Ass_SunVecb, &tmpAsm);
	if(tmpAsm<tmpConst->SS_ASS_CThr)
		pASS->AssCrCheckFlg=CC_CORRECT;
	else
		pASS->AssCrCheckFlg=CC_ERROR;
}


/***********************************************
说明：星敏校陀螺
因为进入的条件是必有正常星敏，那么该星敏一定校验为1且角速度有效，该子函数中不再进行判断
***********************************************/
void StarCheckGyro(void)
{
	UINT8 i, j;
	TYPE_CAL	deltaA[GYRO_NUM][3];//三轴角速度偏差
	sAttPriData *tmpAtt;
	AttCtrlConst_t *tmpConst;
	SsPara_t *ssA, *ssB, *ssC;
	GyroPara_t *pGyro[3];
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;				
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL==tmpAtt || NULL==tmpConst)
	return;
	
	ssA=&tmpAtt->sPerPara.SsPara[0];
	ssB=&tmpAtt->sPerPara.SsPara[1];
	ssC=&tmpAtt->sPerPara.SsPara[2];

	pGyro[0]=&tmpAtt->sPerPara.GyroPara[0];
	pGyro[1]=&tmpAtt->sPerPara.GyroPara[1];
	pGyro[2]=&tmpAtt->sPerPara.GyroPara[2];
	
	//校陀螺
	if(CC_CORRECT ==ssA->ssCrCheckFlg)
	{
		for(i=0;i<GYRO_NUM;i++)
		{
			for (j=0;j<3;j++)
			{
				deltaA[i][j]=POSE_ABSF(pGyro[i]->Gyro_Wi[j]-ssA->ssExpose_Wbi[j]);
			}
		}
	}
	else if(CC_CORRECT ==ssB->ssCrCheckFlg)
	{
		for(i=0;i<GYRO_NUM;i++)
		{
			for (j=0;j<3;j++)
			{
				deltaA[i][j]=POSE_ABSF(pGyro[i]->Gyro_Wi[j]-ssB->ssExpose_Wbi[j]);
			}
		}		
	}
	else if(CC_CORRECT ==ssC->ssCrCheckFlg)
	{
		for(i=0;i<GYRO_NUM;i++)
		{
			for (j=0;j<3;j++)
			{
				deltaA[i][j]=POSE_ABSF(pGyro[i]->Gyro_Wi[j]-ssC->ssExpose_Wbi[j]);
			}
		}
	}
	else
	{
		return;
	}

	for(i=0;i<GYRO_NUM; i++)
	{
		if (POSE_NO == pGyro[i]->GyroIn_AttVld)
			pGyro[i]->GyroCrCheckFlg=NO_CC;
		else if((deltaA[i][0]<tmpConst->SS_GYRO_CThr)&&(deltaA[i][1]<tmpConst->SS_GYRO_CThr)&&(deltaA[i][2]<tmpConst->SS_GYRO_CThr))
			pGyro[i]->GyroCrCheckFlg=CC_CORRECT;
		else
			pGyro[i]->GyroCrCheckFlg=CC_ERROR;
	}
}

/***********************************************
说明：星敏校磁强计
***********************************************/
void StarCheckMag(void)
{
	UINT8 i;
	TYPE_CAL	deltaA[MAG_NUM];
	TYPE_CAL	tmpQbi[4];
	TYPE_CAL	tmpRbi[9];
	TYPE_CAL	tmpSb[3];

	sAttPriData *tmpAtt;
	AttCtrlConst_t *tmpConst;
	SsPara_t *ssA, *ssB, *ssC;
	MagPara_t *pMag;
	sAttEnvPara_t *pEnv;
	sAttOrbitGetPara_t *pObtIn;
					
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL==tmpAtt || NULL==tmpConst)
		return;
	
	pObtIn = &tmpAtt->sOrbitPara;
	ssA=&tmpAtt->sPerPara.SsPara[0];
	ssB=&tmpAtt->sPerPara.SsPara[1];
	ssC=&tmpAtt->sPerPara.SsPara[2];
	pMag=&tmpAtt->sPerPara.MagPara;
	pEnv=&tmpAtt->sEnvPara;	

	if(0x00 == pObtIn->OrbitVld)
	{
		pMag->MagCrCheckFlg[0]=NO_CC;
		pMag->MagCrCheckFlg[1]=NO_CC;
		return;
	}

	//利用星敏计算本体系太阳矢量
	if(CC_CORRECT == ssA->ssCrCheckFlg)
	{
		memcpy(tmpQbi, ssA->ssExpose_Qbi, 4 * sizeof(TYPE_CAL));
	}
	else if(CC_CORRECT == ssB->ssCrCheckFlg)
	{
		memcpy(tmpQbi, ssB->ssExpose_Qbi, 4 * sizeof(TYPE_CAL));
	}
	else if(CC_CORRECT == ssC->ssCrCheckFlg)
	{
		memcpy(tmpQbi, ssC->ssExpose_Qbi, 4 * sizeof(TYPE_CAL));
	}
	else
	{
		return;
	}
		
	Q2Att(tmpQbi, tmpRbi);
	MatrixProductHL(tmpRbi, pEnv->fvBi, tmpSb, 3, 3, 1);

	//校磁强计
	for(i=0;i<MAG_NUM;i++)
	{
		if(POSE_OK == pMag->MagIn_Valid[i])
		{
			CalVecArc(tmpSb, pMag->Mag_Bb_MeaAB[i], &deltaA[i]);

			if(deltaA[i]<tmpConst->AttCmdFlashPara.SS_MAG_CThr)
			{
				pMag->MagCrCheckFlg[i]=CC_CORRECT;				
			}
			else
			{
				pMag->MagCrCheckFlg[i]=CC_ERROR;					
			}
		}
		else
		{
			pMag->MagCrCheckFlg[i]=NO_CC;
		}
	}
}

/***********************************************
说明：陀螺互校验
***********************************************/
void Gyro_CC(void)
{
	UINT8 	i=0;
	UINT8	Valid[3];
	UINT8   tmpCnt = 0;
	sAttPriData *tmpAtt;
	AttCtrlConst_t *tmpConst;
	GyroPara_t *pGyro[3];
	
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	
	if(NULL==tmpAtt || NULL==tmpConst)
	return;

	pGyro[0]=&tmpAtt->sPerPara.GyroPara[0];
	pGyro[1]=&tmpAtt->sPerPara.GyroPara[1];
	pGyro[2]=&tmpAtt->sPerPara.GyroPara[2];
	
	for(i=0;i<GYRO_NUM;i++)
	{
		pGyro[i]->GyroCrCheckFlg=NO_CC;
		
		Valid[i]=pGyro[i]->GyroIn_AttVld;
		if (0x55 == Valid[i])
		{
			pGyro[i]->GyroCrCheckFlg=CC_UNCERTAIN;
		}
	}
	
	if((0x55 == Valid[0])&&(0x55 ==Valid[1]))
	{
		if((POSE_ABSF(pGyro[0]->Gyro_Wi[0]-pGyro[1]->Gyro_Wi[0])<tmpConst->GYRO_GYRO_CThr)
		&&(POSE_ABSF(pGyro[0]->Gyro_Wi[1]-pGyro[1]->Gyro_Wi[1])<tmpConst->GYRO_GYRO_CThr)
		&&(POSE_ABSF(pGyro[0]->Gyro_Wi[2]-pGyro[1]->Gyro_Wi[2])<tmpConst->GYRO_GYRO_CThr)
		)
		{
			pGyro[0]->GyroCrCheckFlg=CC_CORRECT;
			pGyro[1]->GyroCrCheckFlg=CC_CORRECT;
			tmpCnt++;
		}
		else
		{
			;/*不做处理*/
		}
	}
	
	if((0x55 == Valid[0])&&(0x55 == Valid[2]))
	{
		if((POSE_ABSF(pGyro[0]->Gyro_Wi[0]-pGyro[2]->Gyro_Wi[0])<tmpConst->GYRO_GYRO_CThr)
		&&(POSE_ABSF(pGyro[0]->Gyro_Wi[1]-pGyro[2]->Gyro_Wi[1])<tmpConst->GYRO_GYRO_CThr)
		&&(POSE_ABSF(pGyro[0]->Gyro_Wi[2]-pGyro[2]->Gyro_Wi[2])<tmpConst->GYRO_GYRO_CThr)
		)
		{
			pGyro[0]->GyroCrCheckFlg=CC_CORRECT;
			pGyro[2]->GyroCrCheckFlg=CC_CORRECT;
			tmpCnt++;
		}
		else
		{
			;/*不做处理*/
		}
	}
	
	if((0x55 == Valid[1])&&(0x55 == Valid[2]))
	{
		if((POSE_ABSF(pGyro[1]->Gyro_Wi[0]-pGyro[2]->Gyro_Wi[0])<tmpConst->GYRO_GYRO_CThr)
		&&(POSE_ABSF(pGyro[1]->Gyro_Wi[1]-pGyro[2]->Gyro_Wi[1])<tmpConst->GYRO_GYRO_CThr)
		&&(POSE_ABSF(pGyro[1]->Gyro_Wi[2]-pGyro[2]->Gyro_Wi[2])<tmpConst->GYRO_GYRO_CThr)
		)
		{
			pGyro[1]->GyroCrCheckFlg=CC_CORRECT;
			pGyro[2]->GyroCrCheckFlg=CC_CORRECT;
			tmpCnt++;
		}
		else
		{
			;/*不做处理*/
		}
	}
	
	for(i=0; i<3; i++)
	{
		if((NO_CC == pGyro[i]->GyroCrCheckFlg)
		||(CC_CORRECT == pGyro[i]->GyroCrCheckFlg)
		)
		continue;
		
		if(tmpCnt > 0)
		pGyro[i]->GyroCrCheckFlg = CC_ERROR;
	}
}


/***********************************************
说明：磁强计互校验
***********************************************/
void Mag_CC(void)
{
	UINT8 i;
	TYPE_CAL	deltaA[3];
	sAttPriData *tmpAtt;
	AttCtrlConst_t *tmpConst;
	MagPara_t *pMag;
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL==tmpAtt || NULL==tmpConst)
	return;
	pMag=&tmpAtt->sPerPara.MagPara;

	if((POSE_OK == pMag->MagIn_Valid[0])&&(POSE_OK ==pMag->MagIn_Valid[1]))
	{
		for(i=0;i<3;i++)
		{
			deltaA[i]=POSE_ABSF(pMag->Mag_Bb_MeaAB[0][i]-pMag->Mag_Bb_MeaAB[1][i]);
		}
		if((deltaA[0]<tmpConst->MAG_MAG_CThr)&&(deltaA[1]<tmpConst->MAG_MAG_CThr)&&(deltaA[2]<tmpConst->MAG_MAG_CThr))
		{
			pMag->MagCrCheckFlg[0]=CC_CORRECT;
			pMag->MagCrCheckFlg[1]=CC_CORRECT;
		}
		else
		{
			pMag->MagCrCheckFlg[0]=CC_UNCERTAIN;
			pMag->MagCrCheckFlg[1]=CC_UNCERTAIN;
		}
	}
	else
	{
		pMag->MagCrCheckFlg[0]=NO_CC;
		pMag->MagCrCheckFlg[1]=NO_CC;
	}
}


/***********************************************
说明：单机互校验
***********************************************/
void Att_CrossCheck(void)
{
	UINT8	tmpValidSum;
	sAttPriData *tmpAtt;
	SsPara_t *ssA, *ssB, *ssC;
	AssPara_t *pASS;
		
	tmpAtt=(sAttPriData *)ATTCLT_DATA1_ADDR;
	if(NULL ==tmpAtt)
	return;
	
	ssA=&tmpAtt->sPerPara.SsPara[0];
	ssB=&tmpAtt->sPerPara.SsPara[1];
	ssC=&tmpAtt->sPerPara.SsPara[2];

	pASS=&tmpAtt->sPerPara.AssPara;
		
	tmpValidSum=ssA->ssIn_AttVld+ssB->ssIn_AttVld+ssC->ssIn_AttVld;
	
	if((0xAA ==tmpValidSum)||(0xFF ==tmpValidSum))//2或3个星敏有效
	{
		SSABC_CC();//2、3个星敏间互校验
		if((CC_CORRECT ==ssA->ssCrCheckFlg)||(CC_CORRECT ==ssB->ssCrCheckFlg)||(CC_CORRECT ==ssC->ssCrCheckFlg))//有校验正常星敏
		{
			StarCheckSun();//正常星敏校太敏
			StarCheckGyro();//正常星敏校陀螺
			StarCheckMag();//正常星敏校磁强计
		}
		else
		{
			if(0x55 == pASS->Ass_SunVecVld)//太敏有效
			{
				StarSun_CC();//星敏太敏互校验
				if((CC_CORRECT ==ssA->ssCrCheckFlg)||(CC_CORRECT ==ssB->ssCrCheckFlg)||(CC_CORRECT ==ssC->ssCrCheckFlg))//有校验正常星敏
				{
					StarCheckGyro();//正常星敏校陀螺
					StarCheckMag();//正常星敏校磁强计					
				}
				else
				{
					Gyro_CC();
					Mag_CC();	
				}
			}
			else
			{
				Gyro_CC();
				Mag_CC();
			}
		}
	}
	else if(0x55 ==tmpValidSum)//单星敏有效
	{
		if(0x55 ==pASS->Ass_SunVecVld)//太敏有效
		{
			StarSun_CC();//星敏太敏互校验
			if((CC_CORRECT ==ssA->ssCrCheckFlg)||(CC_CORRECT == ssB->ssCrCheckFlg)||(CC_CORRECT ==ssC->ssCrCheckFlg))//有校验正常星敏
			{
				StarCheckGyro();//正常星敏校陀螺
				StarCheckMag();//正常星敏校磁强计
			}
			else
			{
				Gyro_CC();
				Mag_CC();
			}
		}
		else
		{
			Gyro_CC();
			Mag_CC();
		}
	}
	else if(0 ==tmpValidSum)//没有有效星敏
	{
		Gyro_CC();
		Mag_CC();
	}	
}

/************************************************
 说明：数据预处理模块每周期调用操作
 输入：		
 输出：
************************************************/
void 	ZKDPAction(void)
{

	AttCtrlConst_t *tmpConst;
	tmpConst=(AttCtrlConst_t *)ATTCLT_DATA2_ADDR;
	if(NULL == tmpConst)
	return;
	//初始化
	ZKDPInit();

	//星敏
	Ss_DataGet();
	Ss_DataPre();
	
	//陀螺
	Gyro_DataGet();
	Gyro_DataPre();
	
	//模拟太敏
	Ass_DataGet();
	Ass_DataPre();
	
	//磁强计
	Mag_DataGet();
	Mag_DataPre();

	//飞轮
	Whl_DataGet();
	Whl_DataPre();

#ifndef  MINMODULE_TYPE	
	//电推
	PPU_DataPre();	
	//互校验
	if (tmpConst->Allow_Sensor_CThr == 0x55 )
	{
		Att_CrossCheck();	
	}	
#endif
}

