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

📄 yztask.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
#define YZ_TASK
#include <includes.h>

//升降初始值是为了在系统复位时升降到原点
INT8U UDNowPst = PB(0),UDAimPst=0x00,UDAimSpd=DEFAULT_SPEED_UD;
//出退初始值是为了在系统复位时出退到原点
INT8U FBNowPst=PF(CNT_FB_LIMIT_DIST),FBAimPst=0x00,FBAimSpd=DEFAULT_SPEED_FB;

INT8U EnDtct=DIS_DTCT;
INT8U UDDivPtr,UDDivEndPtr=0,UDRpdNum,BodyDtctPtr=0xFF;//表示检测结束
void YZMove(void (*hook)(INT8U));
void UDUnitHook(INT8U ud_en);
void PrsUnitHook(INT8U ud_en);
void PostPosit(INT8U posit);

#define UD_IN_ERR(ud_pst) ((UDNowPst <= (ud_pst)+CNT_UD_ERROR)&&(UDNowPst+CNT_UD_ERROR >= (ud_pst)))
#define FB_IN_ERR(fb_pst) ((FBNowPst <= (fb_pst)+CNT_FB_ERROR)&&(FBNowPst+CNT_FB_ERROR >= (fb_pst)))

#define UD_FB(ud_pst,fb_pst) \
		PositionMove(ud_pst,fb_pst,PARAM_VOID,PARAM_VOID,PARAM_VOID,PARAM_VOID,PARAM_VOID)

void  YZTask(void *p_arg)
{
    void *msg;
    (void)p_arg;
    
    if(BodyDtctPtr!=0xFF)//上次体型检测未结束
    {
    	INT8U i;
    	//恢复以前检测结果
		for(i=0;i<(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1;i++)
		{
			AllSurPstDist[i][0]=AllSurPstDistBak[i][0];
			AllSurPstDist[i][1]=AllSurPstDistBak[i][1];
		}
    }
    else	
    {
    	INT8U i;
    	//每次重新建立任务时都备份一次上次检测结果,以防上次删除任务时没有备份完成
		for(i=0;i<(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1;i++)
		{
			AllSurPstDistBak[i][0]=AllSurPstDist[i][0];
			AllSurPstDistBak[i][1]=AllSurPstDist[i][1];
		}
    }	
    
    //根据肩膀点备份值设置体位点数组,以防上次肩膀检测时遭任务删除未完成体位数组设置
    {
		BodyPointHeight[CNT_UD_NECK-1]=ShdrPointBak-PD(CNT_NECK_LENGTH);
		BodyPointHeight[CNT_UD_SHOULDER-1]=ShdrPointBak;
		BodyPointHeight[CNT_UD_BACK-1]=ShdrPointBak+(PD(CNT_UD_LIMIT_HEIGHT)-ShdrPointBak)/3;
		BodyPointHeight[CNT_UD_WAIST-1]=ShdrPointBak+(PD(CNT_UD_LIMIT_HEIGHT)-ShdrPointBak)*2/3;
	}

    
    while (TRUE) 
    {  
    	INT8U en_rst=1;//归位动作使能标志
        //等待移动开始信息
        msg=OSMboxPend(MboxTech_SurMove,0,&Err);  
        switch(((MSG_TECH_SUR_STRUCT*)msg)->MsgSurTech)
        {
        	case TECH_SUR_MASSMODE_BODY_DTCT:
        		BodyDtctPtr=0;//初始化检测指针
        	case TECH_SUR_MASSMODE_PRS:
        	case TECH_SUR_MASSMODE_MOMI_PRS:
        	case TECH_SUR_MASSMODE_FB_PRS:
				if(MassTech.FollowMode==TECH_VOID) 
				{
					UD_FB(PARAM_VOID,0x00); //出退复位到原点 
					UD_FB(BodyPointHeight[MassTech.YBegin-1],PARAM_VOID); //升降到起点
					
					UDRpdNum=0x00;//反复计数初始化为0

					//发布初始位置到信息
					PostPosit(SUR_TECH_POSIT_INIT);
    				
					while((UDRpdNum<MassTech.RepeatNum)||(MassTech.RepeatNum==TECH_RPT_FOREVER))
					{
						UDRpdNum++;//反复计数增一
						
    					OneFBAct();
	
						//发布单次指压结束信息
    					MsgSurMove_Nose.MsgClass=SUR_TECH_A_PRESS_FINISH;
    					OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
					
						//等待手技处理任务信息
    					OSMboxPend(MboxTech_SurMove,0,&Err);
					}
    		
					//发布升降结束信息
    				MsgSurMove_Nose.MsgClass=SUR_TECH_UD_FINISH;
    				OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
					
				}
				else
				{ 
					YZMove(PrsUnitHook); 
				}
				
				//当前为体型检测
				if((((MSG_TECH_SUR_STRUCT*)msg)->MsgSurTech)==TECH_SUR_MASSMODE_BODY_DTCT)
        		{
					BodyDtctPtr=0xff;//标识检测结束
        		}	
        		break;
        	case TECH_SUR_MASSMODE_SHDR_PRS:
				//发布肩压准备信息
    			MsgSurMove_Nose.MsgClass=SUR_TECH_SHDR_PRS_PREPARE;
    			OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
        		
        		if(!UD_IN_ERR(BodyPointHeight[CNT_UD_SHOULDER-1]-PD(CNT_SHDR_RST)))
        		{
        			UD_FB(PARAM_VOID,0x00);        
					UD_FB(BodyPointHeight[CNT_UD_SHOULDER-1]-PD(CNT_SHDR_RST),PARAM_VOID);        
        		}
        		UD_FB(PARAM_VOID,PF(CNT_FB_LIMIT_DIST));        
        	
				//等待手技处理任务信息
    			OSMboxPend(MboxTech_SurMove,0,&Err);
    			
				UDRpdNum=0x00;//反复计数初始化为0
    			
				while((UDRpdNum<MassTech.RepeatNum)||(MassTech.RepeatNum==TECH_RPT_FOREVER))
				{
					UDRpdNum++;//反复计数增一
					
    				OneShdrAct();
				}
    		
				//发布升降结束信息
    			MsgSurMove_Nose.MsgClass=SUR_TECH_UD_FINISH;
    			OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
        		
        		break;
        	case TECH_SUR_MASSMODE_SHDR_DTCT:
        		
				UD_FB(PARAM_VOID,0x00);        
				UD_FB(0x00,PARAM_VOID);        
				
				//发布肩膀检测起始信息
    			MsgSurMove_Nose.MsgClass=SUR_TECH_SHDR_CHK_START;
    			OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
				
				UD_FB(PARAM_VOID,PF(CNT_FB_LIMIT_DIST)); 
        	
				//等待手技处理任务信息
    			OSMboxPend(MboxTech_SurMove,0,&Err);
    			
				PositionMove(PB(0),PARAM_VOID,MassTech.UpDownSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID,TECH_SUR_MASSMODE_SHDR_DTCT);
				
				//发布肩膀检测结束信息
    			MsgSurMove_Nose.MsgClass=SUR_TECH_SHDR_CHK_FINISH;
    			OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
				
				if(UDNowPst<PB(CNT_SHDR_DTCT_MIN))
				{
					ShdrPointBak=UDNowPst;//备份肩膀检测结果
					BodyPointHeight[CNT_UD_NECK-1]=UDNowPst-PD(CNT_NECK_LENGTH);
					BodyPointHeight[CNT_UD_SHOULDER-1]=UDNowPst;
					BodyPointHeight[CNT_UD_BACK-1]=UDNowPst+(PD(CNT_UD_LIMIT_HEIGHT)-UDNowPst)/3;
					BodyPointHeight[CNT_UD_WAIST-1]=UDNowPst+(PD(CNT_UD_LIMIT_HEIGHT)-UDNowPst)*2/3;
				}
				
				en_rst=0;    //禁止归位动作 
				
        		break;
        	default:
				if(MassTech.FollowMode==TECH_VOID) 
				{
        			if(!UD_IN_ERR(BodyPointHeight[MassTech.YBegin-1]))
        			{
						UD_FB(PARAM_VOID,0x00);        
						UD_FB(BodyPointHeight[MassTech.YBegin-1],PARAM_VOID); 
					}       
					UD_FB(PARAM_VOID,GetStrngDist(MassTech.ActStrength)); 
    		
					//发布移动结束信息
    				MsgSurMove_Nose.MsgClass=SUR_TECH_MOVE_END;
    				OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);

					en_rst=0;    //禁止归位动作 
				}
				else
				{ 
					YZMove(UDUnitHook); 
					 
				}     
        		break;
        }
        if(en_rst==1)//手技归位
        {
        	
			//等待手技处理任务信息
    		OSMboxPend(MboxTech_SurMove,0,&Err);
    		
        	UD_FB(PARAM_VOID,0x00);        
    		
			//发布移动结束信息
    		MsgSurMove_Nose.MsgClass=SUR_TECH_MOVE_END;
    		OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);

        }
    }
}

#define  UNIT_ACT  		0x01 //分割点处的单次作动表示
#define  UNIT_UD  		0x02 //分割点处的单次位置移动表示
#define  UNIT_ACT_UD  	0x03 //分割点处的单次作动和位置移动表示

void UDUnitHook(INT8U ud_en)
{
	switch(ud_en)
	{
		case UNIT_ACT:
			break;
		default:
			PositionMove(DivisPoint[UDDivPtr],GetStrngDist(MassTech.ActStrength),MassTech.UpDownSpeed,MassTech.FrontBackSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID); 
			break;
	}
}

void PrsUnitHook(INT8U ud_en)
{
	switch(ud_en)
	{
		case UNIT_ACT:
			OneFBAct();//上一分割点作动
			break;
		case UNIT_UD:
			PositionMove(DivisPoint[UDDivPtr],0x00,MassTech.UpDownSpeed,MassTech.FrontBackSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID); 
			break;
		default:
			OneFBAct();//上一分割点作动
			PositionMove(DivisPoint[UDDivPtr],0x00,MassTech.UpDownSpeed,MassTech.FrontBackSpeed,PARAM_VOID,PARAM_VOID,PARAM_VOID); 
			break;
	}
}
    
void PostPosit(INT8U posit)
{
	//发布初始位置到信息
    MsgSurMove_Nose.MsgClass=SUR_TECH_POSIT;
    MsgSurMove_Nose.MsgParam=posit;
    OSMboxPost(MboxSurMove_Nose,&MsgSurMove_Nose);
	
	//等待手技处理任务信息
    OSMboxPend(MboxTech_SurMove,0,&Err);
}

void YZMove(void (*hook)(INT8U))
{
	INT8U posit,dir=1;
	
	//初始化分割点
	DivisPointSet();
	UDDivPtr=0x00;
	UDRpdNum=0x00;
	
	UD_FB(PARAM_VOID,0x00);        
	UD_FB(BodyPointHeight[MassTech.YBegin-1],PARAM_VOID); 
	       
	//执行分割点升降动作
    (*hook)(UNIT_UD);
	//PostPosit(SUR_TECH_POSIT_INIT);//发布初始位置到信息
	posit=SUR_TECH_POSIT_INIT;

	//未到反复次数
	while((UDRpdNum<MassTech.RepeatNum)||(MassTech.RepeatNum==TECH_RPT_FOREVER))
	{
		//将预设的信息发布出去
		//不可在预设处发布信息,因为当预设终点或起点信息时,可能反复次数已到,就不应发布预设的信息
		//而应先判断循环条件,若为终止点到,则应退出循环发布终止点到信息
    	PostPosit(posit);
		
		//分割点指针调整,反复次数计数
		//根据条件预设需要发布的信息,并进行相应的作动和位置调整
		if(dir==1)//正向移动
		{
			UDDivPtr++;//指向下一分割点
			
			if(UDDivPtr>UDDivEndPtr)//范围终点後处理
			{
				

⌨️ 快捷键说明

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