📄 yztask.c
字号:
#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 + -