⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yztask.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
				if(MassTech.RepeatMode==TECH_RPT_BIDIRECT) //双向
				{
					dir=0;//改为反向移动
					UDDivPtr=UDDivEndPtr;//分割点指针设置为终点指针
				}
				else//单向
				{
					UDDivPtr=0x00;//分割点指针设置为起点
	    	
					(*hook)(UNIT_ACT);//先完成本次的作动(终点)
					UD_FB(PARAM_VOID,0x00);   //出退复位到原点    
					UD_FB(BodyPointHeight[MassTech.YBegin-1],PARAM_VOID); //升降到起点 
					posit=SUR_TECH_POSIT_RANGE_BEGIN;//预设起点到信息
					(*hook)(UNIT_UD);//最后完成本次的位置调整
				}
				
    		
    		}
			else if(UDDivPtr==UDDivEndPtr)//到达范围终点
			{
    			
				UDRpdNum++;//反复次数递增
				
				posit=SUR_TECH_POSIT_RANGE_END;//预设终点到信息
				(*hook)(UNIT_ACT_UD);//进行上一分割点作动及本次的位置调整
				
			}
			else//到达中间分割点
			{
	    	
				posit=SUR_TECH_POSIT_DIVIS;//预设分割点到信息
				(*hook)(UNIT_ACT_UD);//进行上一分割点作动及本次的位置调整
			}
		}
		if(dir==0)//反向移动
		{
			UDDivPtr--;//指向上一分割点
			if(UDDivPtr==0x00)//到达范围起点
			{
				UDRpdNum++;//反复次数递增
				
				posit=SUR_TECH_POSIT_RANGE_BEGIN;//预设起点到信息
				(*hook)(UNIT_ACT_UD);//进行上一分割点作动及本次的位置调整
				dir=1;//改为正向移动
			}
			else//到达中间分割点
			{
	    	
				posit=SUR_TECH_POSIT_DIVIS;//预设分割点到信息
				(*hook)(UNIT_ACT_UD);//进行上一分割点作动及本次的位置调整
			}
		}
	}
	
	PostPosit(SUR_TECH_POSIT_FINISH);//发布终止点到信息
	
	//执行无升降的分割点动作
    (*hook)(UNIT_ACT);
    		
	//发布升降结束信息
    MsgSurMove_Nose.MsgClass=SUR_TECH_UD_FINISH;
    OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
}

void DivisPointSet(void)
{
	INT8U i,large,small,tmp_part,div_base,div_num;
	if((MassTech.YBegin<CNT_UD_NECK)||(MassTech.YBegin>CNT_UD_LIMIT)||(MassTech.YEnd<CNT_UD_NECK)||(MassTech.YEnd>CNT_UD_LIMIT)||(MassTech.AreaDivNum>CNT_PART_DIVIS_NUM))
		return;
		
	if(MassTech.AreaDivNum==TECH_VOID)
		div_num=CNT_PART_DIVIS_NUM;
	else
		div_num=MassTech.AreaDivNum;
		
	for(i=0;i<(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1;i++)
	{
		DivisPoint[i]=0x00;
	}
	if(MassTech.YBegin==MassTech.YEnd)
	{
		DivisPoint[0]=BodyPointHeight[MassTech.YBegin-1];
		UDDivEndPtr=0x00;
		return;
	}
	else if(MassTech.YBegin<MassTech.YEnd)
	{
		large=MassTech.YEnd;
		small=MassTech.YBegin;
	}
	else
	{
		large=MassTech.YBegin;
		small=MassTech.YEnd;
	}
	
	DivisPoint[0]=BodyPointHeight[small-1];
	div_base=0x00;
	
	for(tmp_part=small;tmp_part<large;tmp_part++)
	{
		for(i=1;i<div_num;i++)
		{
			DivisPoint[div_base+i]=DivisPoint[div_base]+(INT16U)i*(BodyPointHeight[tmp_part]-BodyPointHeight[tmp_part-1])/div_num;
		}
		div_base=div_base+i;
		DivisPoint[div_base]=BodyPointHeight[tmp_part];
	}
	UDDivEndPtr=div_base;
	
	if(MassTech.YBegin>MassTech.YEnd)
	{
		INT8U tmp_sml;
		for(i=0;i<((UDDivEndPtr+1)>>1);i++)
		{
			tmp_sml=DivisPoint[i];
			DivisPoint[i]=DivisPoint[UDDivEndPtr-i];
			DivisPoint[UDDivEndPtr-i]=tmp_sml;
		}
	}
	
}

void PositionMove(INT8U ud_pst,INT8U fb_pst,INT8U ud_spd,INT8U fb_spd,INT8U ud_dly,INT8U fb_dly,INT8U bd_chk)
{
	//清空所使用邮箱以前的信息
	OSMboxAccept(MboxUD_Sur);
	OSMboxAccept(MboxFB_Sur);
	
	if(ud_pst!=PARAM_VOID)
	{
		//if(UD_IN_ERR(ud_pst))
		if(ud_pst==UDNowPst)
            OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);
        else if VALID_LEVEL(ud_spd)
        {
        	UDAimSpd=ud_spd;
        }
        else
        {
        	UDAimSpd=DEFAULT_SPEED_UD;
        }
		UDAimPst=ud_pst;	
	}
	if(fb_pst!=PARAM_VOID)
	{
		//if(FB_IN_ERR(fb_pst))
		if(fb_pst==FBNowPst)
            OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
        else if VALID_LEVEL(fb_spd)
        {
        	FBAimSpd=fb_spd;
        }
        else
        {
        	FBAimSpd=DEFAULT_SPEED_FB;
        }
		FBAimPst=fb_pst;	
	}
	if(bd_chk!=PARAM_VOID)
	{
		if(bd_chk==TECH_SUR_MASSMODE_SHDR_DTCT)
		{
			EnDtct=EN_SHDR_DTCT;
        	OSMboxPend(MboxUD_Sur,0,&Err);
			EnDtct=DIS_DTCT;
			UDAimPst=UDNowPst;
        	OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);
        }
		else if(bd_chk==TECH_SUR_MASSMODE_BODY_DTCT)
		{
			EnDtct=EN_BODY_DTCT;
        	OSMboxPend(MboxFB_Sur,0,&Err);
			EnDtct=DIS_DTCT;
			FBAimPst=FBNowPst;
        	OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
        }
	}
	if(ud_dly!=PARAM_VOID)
	{
		OSTimeDly(TICKS(ud_dly));
		UDAimPst=UDNowPst;
        OSMboxPost(MboxUD_Sur,YZ_MBOX_PST_ARRV);
	}
	if(fb_dly!=PARAM_VOID)
	{
		OSTimeDly(TICKS(fb_dly)); 
		FBAimPst=FBNowPst;
        OSMboxPost(MboxFB_Sur,YZ_MBOX_PST_ARRV);
	}
	if(ud_pst!=PARAM_VOID)
	{
        OSMboxPend(MboxUD_Sur,0,&Err);
	}
	if(fb_pst!=PARAM_VOID)
	{
        OSMboxPend(MboxFB_Sur,0,&Err);
	}
	
}

void OneShdrAct(void)
{
	PositionMove(BodyPointHeight[CNT_UD_SHOULDER-1],PARAM_VOID,MassTech.UpDownSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID,PARAM_VOID); 
	OSTimeDly(TICKS(SHDR_KEP_TIME));       
    if (VALID_LEVEL(MassTech.ActStrength) && VALID_LEVEL(MassTech.KeepTime))
    {
		PositionMove(BodyPointHeight[CNT_UD_SHOULDER-1]+ShdrPrsStrDistTab[MassTech.ActStrength-1],PARAM_VOID,MassTech.UpDownSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID,PARAM_VOID); 
		OSTimeDly(TICKS(PrsKeepTimeTab[MassTech.KeepTime-1]));
	}
	PositionMove(BodyPointHeight[CNT_UD_SHOULDER-1]-PD(CNT_SHDR_SUP),PARAM_VOID,MassTech.UpDownSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID,PARAM_VOID); 
}

void OneFBAct(void)
{
	if(MsgTech_SurMove.MsgSurTech==TECH_SUR_MASSMODE_BODY_DTCT)
	{
		PositionMove(PARAM_VOID,PF(CNT_FB_LIMIT_DIST),PARAM_VOID,MassTech.FrontBackSpeed,PARAM_VOID,PARAM_VOID,TECH_SUR_MASSMODE_BODY_DTCT);
		       
        MsgSurMove_Nose.MsgClass=SUR_TECH_POINT_CHK_FINISH;
        OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
        
        AllSurPstDist[BodyDtctPtr][0]=UDNowPst;
        AllSurPstDist[BodyDtctPtr][1]=FBNowPst;
        
        //检测指针递增
        if(BodyDtctPtr<(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM)
        	BodyDtctPtr++;
    	
    	OSMboxPend(MboxTech_SurMove,0,&Err);
	}
	else
	{
		UD_FB(PARAM_VOID,GetSurPstDist(UDAimPst));        
        
        MsgSurMove_Nose.MsgClass=SUR_TECH_SURFACE_ARRIVE;
        OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
        
        OSMboxPend(MboxTech_SurMove,0,&Err);
        
		UD_FB(PARAM_VOID,GetStrngDist(MassTech.ActStrength));        
        
        MsgSurMove_Nose.MsgClass=SUR_TECH_STRENG_ARRIVE;
        OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
    	OSMboxPend(MboxTech_SurMove,0,&Err);
        
        if (VALID_LEVEL(MassTech.KeepTime)&& VALID_LEVEL(MassTech.FrontBackSpeed))
        {
        	if((MsgTech_SurMove.MsgSurTech==TECH_SUR_MASSMODE_PRS)||(MsgTech_SurMove.MsgSurTech==TECH_SUR_MASSMODE_MOMI_PRS))
        		OSTimeDly(TICKS(PrsKeepTimeTab[MassTech.KeepTime-1]));
			else if(MsgTech_SurMove.MsgSurTech==TECH_SUR_MASSMODE_FB_PRS)
				PositionMove(PARAM_VOID,GetStrngDist(TECH_FB_LIMIT),PARAM_VOID,MassTech.FrontBackSpeed,PARAM_VOID,PrsKeepTimeTab[MassTech.KeepTime-1],PARAM_VOID);
		}
	}
        
	UD_FB(PARAM_VOID,0x00);        
}

//获得体型面位移距离
INT8U GetSurPstDist(INT8U ud_pst)
{
	INT8U i;
	if(AllSurPstDist[0][0]>=ud_pst)
		return AllSurPstDist[0][1];
	for(i=1;i<(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1;i++)
	{
		if(AllSurPstDist[i][0]>=ud_pst)
			return AllSurPstDist[i-1][1]+(AllSurPstDist[i][1]-AllSurPstDist[i-1][1])*(ud_pst-AllSurPstDist[i-1][0])/(AllSurPstDist[i][0]-AllSurPstDist[i-1][0]);
	}
}

//获得各按摩强度位移距离
INT8U GetStrngDist(INT8U strng)
{
	if(strng==TECH_FB_BASE)
		return 0x00;
	if(strng==TECH_FB_SUR)
		return GetSurPstDist(UDAimPst);
	if VALID_LEVEL(strng)
		return GetSurPstDist(UDAimPst)+StrDistTab[strng-1];
	if(strng==TECH_FB_LIMIT)
		return PF(CNT_FB_LIMIT_DIST);
	return 0x00;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -