masstechtask.c

来自「uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在M」· C语言 代码 · 共 345 行

C
345
字号
#include <includes.h>

extern OS_EVENT* MboxCmd_TechStart,*MboxTechFinish;

void SetSpeed(INT8U spd_lvl,INT16U *run_cell,INT16U *stp_cell,INT8U *spd_tbl);
void WidthAdjWaite(INT8U width);

void  MassTechTask(void *p_arg)
{
    void *msg;
    (void)p_arg;
    while (TRUE) 
    {  
        OSMboxPend(MboxCmd_TechStart,0,&Err);
        //手技开始
        {
        	//设置移动开始信息
        	MsgTech_SurMove.MsgClass=TECH_SUR_MOVE_BEGIN;
        	
        	//设置信息中的升降手技形式
        	if((MassTech.MassMode==TECH_MODE_SHDR_PRS_WTH_DTCT) 
        		||(MassTech.MassMode==TECH_MODE_BODY_DTCT)) 
        		MsgTech_SurMove.MsgSurTech=TECH_SUR_MASSMODE_SHDR_DTCT;
        	else
        		MsgTech_SurMove.MsgSurTech=MassTech.MassMode;
        	
        	//发布移动开始信息	
            OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        		
        	if(
        		(MassTech.MassMode==TECH_MODE_MOMI_PRS)
        		||
        		((MassTech.MassMode!=TECH_MODE_SHDR_PRS_WTH_DTCT)
        		&&(MassTech.MassMode!=TECH_MODE_BODY_DTCT)
        		&&(MassTech.MassMode!=TECH_VOID))
        	  )
        	{   
        		//等待宽度调整完成
        	    if(MassTech.MassMode==TECH_MODE_MOMI_PRS)
        		    WidthAdjWaite(TECH_WIDTH_WIDE);
        		else
        		    WidthAdjWaite(MassTech.ActWidth);
        	}
        }

        //等待升降出退信息
        msg=OSMboxPend(MboxSurMove_Nose,0,&Err);  
        
        while((((MSG_SUR_TECH_STRUCT*)msg)->MsgClass)!=SUR_TECH_MOVE_END)
        {
        	switch(((MSG_SUR_TECH_STRUCT*)msg)->MsgClass)
        	{
        		case SUR_TECH_UD_FINISH:
    				//发布归位通知信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_RST_NOSE;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
    				//宽度调整到宽
        		    WidthAdjWaite(TECH_WIDTH_WIDE);
        			break;
        		case SUR_TECH_POINT_CHK_FINISH:
        			//捶打停止
    				OSMboxPost(MboxTech_Tataki,TECH_MBOX_STOP_RUN);
    				//等待捶打完成
    				OSMboxPend(MboxTataki_Finish,0,&Err);
    				//发布移动通知信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_MOVE_NOSE;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        			break;
        		case SUR_TECH_SURFACE_ARRIVE:
    				//发布出退通知信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_FB_NOSE;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
    				
        	        if(MassTech.MassMode==TECH_MODE_MOMI_PRS)
        	        {
    					//设置有限揉捏信息
    					MsgTech_Momi.MsgClass=TECH_MOMI_RPT;
    					MsgTech_Momi.MassWidth=TECH_WIDTH_NARROW;
    					MsgTech_Momi.MomiDirect=TECH_MOMI_CW;
    					MsgTech_Momi.MomiRptNum=0x01;
    					MsgTech_Momi.MomiSpeed=MassTech.MomiSpeed;
    					
    					//发布揉捏作动通知信息	
    					OSMboxPost(MboxTech_Momi,&MsgTech_Momi);
    					//等待揉捏作动完成信息
    					OSMboxPend(MboxMomi_Finish,0,&Err);
    			    }
        			break;
        		case SUR_TECH_STRENG_ARRIVE:
    				//发布移动通知信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_MOVE_NOSE;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        			break;
        		case SUR_TECH_A_PRESS_FINISH:
    				//发布出退通知信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_FB_NOSE;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        			break;
        		case SUR_TECH_SHDR_CHK_START:
    				//宽度调整到宽
        		    WidthAdjWaite(TECH_WIDTH_WIDE);
    				//设置单一捶打信息
    				MsgTech_Tataki.FollowMode=TECH_FLW_SYNCH;
    				MsgTech_Tataki.TatakiMode=TECH_TATAKI_SIMPLE;
    				MsgTech_Tataki.TatakiLSpeed=MassTech.TatakiLSpeed;
    				
    				//发布捶打作动通知信息	
    				OSMboxPost(MboxTech_Tataki,&MsgTech_Tataki);
    				
    				//发布检测开始信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_CHECK_START;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        			break;
        		case SUR_TECH_SHDR_PRS_PREPARE:
    				//宽度调整
        		    WidthAdjWaite(MassTech.ActWidth);
    				//发布肩压启动信息	
    				MsgTech_SurMove.MsgClass=TECH_SUR_SHDR_PRS_START;
    				OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        			break;
        		case SUR_TECH_SHDR_CHK_FINISH:
        			//捶打停止
    				OSMboxPost(MboxTech_Tataki,TECH_MBOX_STOP_RUN);
    				//等待捶打完成
    				OSMboxPend(MboxTataki_Finish,0,&Err);
    				
    				if(MassTech.MassMode==TECH_MODE_SHDR_PRS_WTH_DTCT)
    				{
        				MsgTech_SurMove.MsgSurTech=TECH_SUR_MASSMODE_SHDR_PRS;
        		    	WidthAdjWaite(MassTech.ActWidth);
        			}
        			else if(MassTech.MassMode==TECH_MODE_BODY_DTCT)
        			{
        				MassTech.FollowMode=TECH_FLW_ALTER;
        				MassTech.RepeatMode=TECH_RPT_DIRECT;
        				MassTech.YBegin=TECH_BOUND_EAR;
        				MassTech.YEnd=TECH_BOUND_LIMIT;
        				MassTech.AreaDivNum=0x05;
        				MassTech.RepeatNum=0x01;
        				MsgTech_SurMove.MsgSurTech=TECH_SUR_MASSMODE_BODY_DTCT;
        		    	WidthAdjWaite(TECH_WIDTH_NARROW);
        			}
        			//发布移动开始信息	
            		OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        			break;
        		case SUR_TECH_POSIT:
        			switch(MassTech.MassMode)
        			{
        				case TECH_MODE_ROLL:
    				        //发布移动通知信息	
    				        MsgTech_SurMove.MsgClass=TECH_SUR_MOVE_NOSE;
    				        OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        					break;
        				case TECH_MODE_BODY_DTCT:
    						//发布出退通知信息	
    						MsgTech_SurMove.MsgClass=TECH_SUR_FB_NOSE;
    						OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
    						//设置单一捶打信息
    						MsgTech_Tataki.FollowMode=TECH_VOID;
    						MsgTech_Tataki.TatakiMode=TECH_TATAKI_SIMPLE;
    						MsgTech_Tataki.TatakiLSpeed=MassTech.TatakiLSpeed;
    						//发布捶打作动通知信息	
    						OSMboxPost(MboxTech_Tataki,&MsgTech_Tataki);
        					break;
        				case TECH_MODE_MOMI_PRS:
    						//发布出退通知信息	
    						MsgTech_SurMove.MsgClass=TECH_SUR_FB_NOSE;
    						OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
    						//设置有限揉捏信息
    						MsgTech_Momi.MsgClass=TECH_MOMI_RPT;
    						MsgTech_Momi.MassWidth=TECH_WIDTH_WIDE;
    						MsgTech_Momi.MomiDirect=TECH_MOMI_CW;
    						MsgTech_Momi.MomiRptNum=0x01;
    						MsgTech_Momi.MomiSpeed=MassTech.MomiSpeed;
    						
    						//发布揉捏作动通知信息	
    						OSMboxPost(MboxTech_Momi,&MsgTech_Momi);
    						//等待揉捏作动完成信息
    						OSMboxPend(MboxMomi_Finish,0,&Err);
        					break;
        				case TECH_MODE_PRS:
        				case TECH_MODE_FB_PRS:
    						//发布出退通知信息	
    						MsgTech_SurMove.MsgClass=TECH_SUR_FB_NOSE;
    						OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        					break;
        				case TECH_MODE_MOMI_CW:
        				case TECH_MODE_MOMI_CCW:
        					if(MassTech.MassMode==TECH_MODE_MOMI_CW)
    							MsgTech_Momi.MomiDirect=TECH_MOMI_CW;
    						else
    							MsgTech_Momi.MomiDirect=TECH_MOMI_CCW;
        				case TECH_MODE_TATAKI:
        				case TECH_MODE_RUB:
        				case TECH_MODE_MOMI_TATAKI:
        					switch(MassTech.FollowMode)
        					{
        						case TECH_FLW_ALTER:
    								MsgTech_Momi.MomiRptNum=0x01;
        						case TECH_VOID:
        							if(MassTech.FollowMode==TECH_FLW_ALTER)
    									MsgTech_Momi.MsgClass=TECH_MOMI_RPT;
    								else
    									MsgTech_Momi.MsgClass=TECH_MOMI_FRVR;
        							if(MassTech.MomiSpeed!=0x00)
        							{
    									//设置揉捏信息
    									MsgTech_Momi.MassWidth=MassTech.ActWidth;
    									MsgTech_Momi.MomiSpeed=MassTech.MomiSpeed;
    									
    									//发布揉捏作动通知信息	
    									OSMboxPost(MboxTech_Momi,&MsgTech_Momi);
        							}
        							if(MassTech.TatakiLSpeed!=0x00)
        							{
        								switch(((MSG_SUR_TECH_STRUCT*)msg)->MsgParam)
        								{
        									case SUR_TECH_POSIT_INIT:
        									case SUR_TECH_POSIT_RANGE_BEGIN:
    											MsgTech_Tataki.SpeedPtr=0x00;
        										break;
        								}
    									//设置捶打信息
    									MsgTech_Tataki.FollowMode=MassTech.FollowMode;
    									MsgTech_Tataki.TatakiMode=MassTech.TatakiMode;
    									MsgTech_Tataki.TatakiHSpeed=MassTech.TatakiHSpeed;
    									MsgTech_Tataki.TatakiLSpeed=MassTech.TatakiLSpeed;
    									MsgTech_Tataki.KeepTime=MassTech.KeepTime;
    									//发布捶打作动通知信息	
    									OSMboxPost(MboxTech_Tataki,&MsgTech_Tataki);
    									//等待锤打作动完成信息
    									OSMboxPend(MboxTataki_Finish,0,&Err);
        							}
        							if(MassTech.MomiSpeed!=0x00)
        							{
    									//等待揉捏作动完成信息
    									OSMboxPend(MboxMomi_Finish,0,&Err);
        							}
    				        		//发布移动通知信息	
    				        		MsgTech_SurMove.MsgClass=TECH_SUR_MOVE_NOSE;
    				        		OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        							break; 
        						case TECH_FLW_SYNCH:
        							switch(((MSG_SUR_TECH_STRUCT*)msg)->MsgParam)
        							{
        								case SUR_TECH_POSIT_RANGE_BEGIN:
        									if(MassTech.RepeatMode==TECH_RPT_BIDIRECT)
        										break;
        								case SUR_TECH_POSIT_INIT:
        									if(MassTech.MomiSpeed!=0x00)
        									{
    											//设置揉捏信息
    											MsgTech_Momi.MsgClass=TECH_MOMI_FRVR;
    											MsgTech_Momi.MassWidth=MassTech.ActWidth;
    											MsgTech_Momi.MomiSpeed=MassTech.MomiSpeed;
    											
    											//发布揉捏作动通知信息	
    											OSMboxPost(MboxTech_Momi,&MsgTech_Momi);
        									}
        									if(MassTech.TatakiLSpeed!=0x00)
        									{
    											//设置捶打信息
    											MsgTech_Tataki.SpeedPtr=0x00;
    											MsgTech_Tataki.FollowMode=MassTech.FollowMode;
    											MsgTech_Tataki.TatakiMode=MassTech.TatakiMode;
    											MsgTech_Tataki.TatakiHSpeed=MassTech.TatakiHSpeed;
    											MsgTech_Tataki.TatakiLSpeed=MassTech.TatakiLSpeed;
    											MsgTech_Tataki.KeepTime=MassTech.KeepTime;
    											//发布捶打作动通知信息	
    											OSMboxPost(MboxTech_Tataki,&MsgTech_Tataki);
        									}
        									break;
        								case SUR_TECH_POSIT_RANGE_END:
        									if(MassTech.RepeatMode==TECH_RPT_BIDIRECT)
        										break;
        								case SUR_TECH_POSIT_FINISH:
        									if(MassTech.MomiSpeed!=0x00)
        									{
    											//发布揉捏作动停止信息	
    											OSMboxPost(MboxTech_Momi,TECH_MBOX_STOP_RUN);
        									}
        									if(MassTech.TatakiLSpeed!=0x00)
        									{
    											//发布捶打作动停止信息	
    											OSMboxPost(MboxTech_Tataki,TECH_MBOX_STOP_RUN);
    											//等待锤打作动完成信息
    											OSMboxPend(MboxTataki_Finish,0,&Err);
        									}
        									if(MassTech.MomiSpeed!=0x00)
        									{
    											//等待揉捏作动完成信息
    											OSMboxPend(MboxMomi_Finish,0,&Err);
        									}
        									break;
        							}
        							
    				        		//发布移动通知信息	
    				        		MsgTech_SurMove.MsgClass=TECH_SUR_MOVE_NOSE;
    				        		OSMboxPost(MboxTech_SurMove,&MsgTech_SurMove);
        							break; 
        					}  
        					break;
        			}
        			break;
        	}
            msg=OSMboxPend(MboxSurMove_Nose,0,&Err);  
        } 
        
        MassStat.MassRun=0;//设置指令运行状态为完成 
        OSMboxPost(MboxTech_Finish,MBOX_VALID);//通知指令处理任务已完成目前手技
    }
}

//
void SetSpeed(INT8U spd_lvl,INT16U *run_cell,INT16U *stp_cell,INT8U *spd_tbl)
{
    if(VALID_LEVEL(spd_lvl))
    {
        if(stp_cell!=(void*)0)
        	*stp_cell = 0x0000;
        *run_cell =(INT32U)PR3*spd_tbl[spd_lvl-1]/100;
    }
    else if(spd_lvl==TECH_SPEED_STOP)
    {
        if(stp_cell!=(void*)0)
        	*stp_cell = 0x0000;
        *run_cell =0x0000;
    }		
}

void WidthAdjWaite(INT8U width)
{
    //设置宽度调整信息
    MsgTech_Momi.MsgClass=TECH_MOMI_WID_ADJ;
    
    MsgTech_Momi.MassWidth=width;
        
    MsgTech_Momi.MomiSpeed=DEFAULT_SPEED_MOMI;
    
    //发布揉捏作动通知信息	
    OSMboxPost(MboxTech_Momi,&MsgTech_Momi);
    //等待揉捏作动完成信息
    OSMboxPend(MboxMomi_Finish,0,&Err);
}

⌨️ 快捷键说明

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