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 + -
显示快捷键?