core_com.c

来自「嵌入式开发 嵌入式开发 嵌入式开发」· C语言 代码 · 共 1,744 行 · 第 1/5 页

C
1,744
字号
        break;
    case 2: // 主界面
        if( (VarST3000.SubIDSEL==3) && (rCNL==UnitSEL-1) )
        {   // 当前通道
            if( unit[rCNL].submenu1.bitfield.hcontrol )
            {   DispHErr_M23(vRealErr[rCNL], hRealErr[rCNL]);}
            else
            {   DispVErr_M23(vRealErr[rCNL]);}
        }
        break;
    default:
        break;
    }
}

/******************************
 描述: 接收通道上报的状态 2005-11-25 最终更新
 参数: iCNL通道号; rDAT接收到的CAN信息数据
******************************/
void SyncRcvCmd5(const int rCNL, const unsigned char *rDAT)
{
    unsigned char Bjob=unit[rCNL].submenu1.unitworksnum.i;
    CtrlUnitFlags[rCNL].B=rDAT[0];
    if( WhetherCUAuto(rCNL) && (CtrlUnitFlags[rCNL].bits.bit1) )
    {   SetEntireFlags(rCNL, ((Bjob==1) ? 0x30:0x31), 1);}
    else
    {   SetEntireFlags(rCNL, ((Bjob==1) ? 0x30:0x31), 0);}
    // 报警喇叭控制
    ST3000AlarmCtrl(Bjob);
    // 刷新界面相关
    switch(VarST3000.MenuIDSEL)
    {
    case 3: // 调节界面
    case 4: // 误差曲线
        SyncLMark_M34(rCNL, CtrlUnitFlags[rCNL].bits.bit1);
        break;
    case 2: // 主界面
        if( (VarST3000.SubIDSEL==3) && (rCNL==UnitSEL-1) )
        {   SyncLapseMark(CtrlUnitFlags[rCNL].bits.bit1);}
        break;
    case 1: // 静止画面
        if( CtrlUnitFlags[rCNL].bits.bit1 )
        {
            DispVLapse_M1(rCNL);
            if( unit[rCNL].submenu1.bitfield.hcontrol )
            {   DispHLapse_M1(rCNL);}
        }
        break;
    default:
        break;
    }
}

/******************************
 描述: 接收下位机修改的工作设置命令
 参数: iCNL通道号; rDAT接收到的CAN信息数据
 详细: 由于特别说明过多 60行文字描述 如果要了解详细情况 请查看 [.\附加说明1.txt]
 特别声明: 如果在判断的过程中最终对需要判断的状态都一样的话
           就认为可能在某些不能被认可的非安全因素存在
           按照现在正常的命令强行同步控制单元 (11/26/2005)
           (2).之所以分开对屏幕号判断 为了更快的节省处理时间
               条件不满足的时候 节省一次条件的与运算.
******************************/
void SyncRcvCmd6(const int rCNL, const unsigned char *rDAT)
{
    int jCnl;
    int tEntireAuto,tEntireShape;
    unsigned char Bjob=unit[rCNL].submenu1.unitworksnum.i; // 记录上报通道的系属
    unsigned char arSYNCFlags[MAXCNL_3K]={0};
        /* 通道命令需要同步更新的标志 (=0表示不用更新; 否则需要更新) */
    unsigned char bREQUEST=0;
        /* 设置请求的范围 bit0=1表示要求查询整个系属的状态 */
    unsigned char bCtrlUnitTurns,BEntireTurns;
    unsigned char ttB1,ttB2;
    BITFlags hjBYTE;
    /*
    B2
    包含内容
    bit0=系属; bit1=本组智能; bit2=整机智能; bit3=主控机有无
    */
    if( (CommandData[rCNL].Cmd6[1]&0x06)!=(rDAT[1]&0x06) )
    {
        hjBYTE.B=rDAT[1];
        /*
        检查整机智能状态是否发生改变
        */
        ttB1 = ((Bjob==1)? EntireStatus.EntireIntelligent_A : EntireStatus.EntireIntelligent_B);
        if( (ttB1!=hjBYTE.bits.bit2) )
        {   // 确实发生改变
            // 判断更改整机智能是否可以被认可
            /*jCnl=hjGetNextProc(Bjob);
            if( (jCnl>0) && (jCnl<rCNL) )
            {
                arSYNCFlags[rCNL]=1;
                goto end_ProcCmd61BIT0;
            }*/
            /*
            被认可的情况下
            更改整机的智能状态并且同步到其他系属内的通道
            */
            if( hjBYTE.bits.bit2 )
            {   // 开整机智能
                if( Bjob==1 )
                {   EntireStatus.EntireIntelligent_A=1;}
                else
                {   EntireStatus.EntireIntelligent_B=1;}
                // 确认更新到每个通道
                for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
                {
                    if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
                        unit[jCnl].submenu1.unitworksnum.j )
                    {
                        unit[jCnl].submenu1.bitfield.autowork=1;
                        hjSACmdBuffers[jCnl]=CommandData[jCnl].Cmd6[1];
                        hjSACmdBuffers[jCnl]|=0x06; // bit2bit1=11 整机本组智能开
                        SetwjrSearAddrFlags(jCnl, 1);
                        
                    }
                }              
	            //一次下发给下位机进行智能通知
                for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
	            {
	                if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
	                    unit[jCnl].submenu1.unitworksnum.j )
	                {
	                	CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
	                	SendCnlData(jCnl, 0x06);
	                }
	            }
	            
            }
            else
            {   // 关整机智能
                if( Bjob==1 )
                {   EntireStatus.EntireIntelligent_A=0;}
                else
                {   EntireStatus.EntireIntelligent_B=0;}
                // 确认更新到每个通道
                for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
                {
                    if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
                        unit[jCnl].submenu1.unitworksnum.j )
                    {
                        unit[jCnl].submenu1.bitfield.autowork=0;
                        CommandData[jCnl].Cmd6[1]&=0xf9; //bit2bit1=00 整机本组智能关
                        SetwjrSearAddrFlags(jCnl, 0); //已经处理完成
                        arSYNCFlags[jCnl]=1;
                    }
                }
            }
            /*
            波形界面所包含的整机和本组 智能状态图标
            */
            if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) && (Bjob==VarST3000.jobAB) )
            {
                _SetCnlSA_M23(); // 本组智能
                _SetAllSA_M23(); // 整机智能
            }
            //end_ProcCmd61BIT0: ;
        }
        // 判断本组智能状态是否改变
        else if( (unit[rCNL].submenu1.bitfield.autowork!=hjBYTE.bits.bit1) )
        {   // 确实本组智能发生改变
            // 查询本系属等待处理的智能通道
           /* jCnl=hjGetNextProc(Bjob);
            // 判断是否被认可修改 如果有在做寻址但是还未到此通道 不认可
            if( (jCnl>0) && (rCNL>jCnl) )
            {
                arSYNCFlags[rCNL]=1;
                goto end_ProcCmd61BIT1;
            }*/
            // 更新本组智能状态
            unit[rCNL].submenu1.bitfield.autowork=hjBYTE.bits.bit1;
            SetwjrSearAddrFlags(rCNL, hjBYTE.bits.bit1);
            if( unit[rCNL].submenu1.bitfield.autowork )
            {CommandData[rCNL].Cmd6[1]|=0x02;}
           	else
         	{CommandData[rCNL].Cmd6[1]&=0x0d;}

            // 更新波形界面选中通道的本组智能
            if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) &&
            	(Bjob==VarST3000.jobAB) && (rCNL==(UnitSEL-1) ) )
            {   _SetCnlSA_M23();}
            
            // 看是否影响到整机的智能工作
            if( GetEntireIntelligent(Bjob) )
            {   // 整机智能状态发生改变
                ttB1=((Bjob==1) ? EntireStatus.EntireIntelligent_A : EntireStatus.EntireIntelligent_B);
	            if( ttB1 )
	            {   // 整机智能开
	                for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
	                {
	                    if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
	                        unit[jCnl].submenu1.unitworksnum.j )
	                    {
	                        hjSACmdBuffers[jCnl]=CommandData[jCnl].Cmd6[1];
	                        hjSACmdBuffers[jCnl]|=0x04; //bit2=1 整机智能开
	                        SetwjrSearAddrFlags(jCnl, 1);
	                    }
	                }          
		            for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
		            {
		                if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
		                    unit[jCnl].submenu1.unitworksnum.j )
		                {
		                	CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
		                	SendCnlData(jCnl, 0x06);
		                }
		            }
		        }
	            else 
	            {   //整机智能关 保留本组下发给系属内所有通道
	                for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
	                {
	                    if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
	                        unit[jCnl].submenu1.unitworksnum.j)
	                    {   CommandData[jCnl].Cmd6[1]&=0xfb; //清bit2整机智能关
	                        SetwjrSearAddrFlags(jCnl, 0);
	                        SendCnlData(jCnl, 0x06);
	                    }
	                }
	            }
	        }
	        //_____更新主界面整机智能按钮显示
            if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) && (Bjob==VarST3000.jobAB) )
            {   _SetAllSA_M23();}
            
            //end_ProcCmd61BIT1:;
        }
    }
    /*
    B3
    包含内容
    bit0=本机自/手动; bit1=整机自/手动 (整机优先)
    */
    else if( (CommandData[rCNL].Cmd6[2]&0x03)!=(rDAT[2]&0x03) )
    {
        hjBYTE.B=rDAT[2];
        //___判断整机状态是否发生改变
        ttB1=((Bjob==1) ? EntireStatus.EntireAuto_A : EntireStatus.EntireAuto_B);
        if( (ttB1!=hjBYTE.bits.bit1) )
        {   //___确认整机自手动发生改变
            if( Bjob==1 )
            {   EntireStatus.EntireAuto_A=hjBYTE.bits.bit1;}
            else
            {   EntireStatus.EntireAuto_B=hjBYTE.bits.bit1;}
            //___确认更新每个通道
            for(jCnl=1; jCnl<VarST3000.UnitCounts; jCnl++)
            {
                if( unit[jCnl].submenu1.unitworksnum.i==Bjob &&
                    unit[jCnl].submenu1.unitworksnum.j)
                {   unit[jCnl].submenu1.bitfield.hand_auto=hjBYTE.bits.bit1;
                    if(hjBYTE.bits.bit1)
                    {   CommandData[jCnl].Cmd6[2]|=0x03;} //bit1bit0=11 整机本组自动
                    else
                    {   CommandData[jCnl].Cmd6[2]&=0x00;} //bit1bit0=00 整机本组手动
                    if( unit[jCnl].submenu1.bitfield.hcontrol )
                    {   unit[jCnl].submenu1.bitfield.h_motorruning=hjBYTE.bits.bit1;
                        if(hjBYTE.bits.bit1)
                        {   CommandData[jCnl].Cmd6[6]|=0x20;} //bit5=1 横向自动
                        else
                        {   CommandData[jCnl].Cmd6[6]&=0xdf;} //bit5=0 横向手动
                    }
                    //___更新和纵横向自手动按钮和图标的刷新
                    switch(VarST3000.MenuIDSEL)
                    {
                    case 3: //误差调节
                    case 4: //误差曲线
                        SyncWMark_V34(jCnl);
                        if(unit[jCnl].submenu1.bitfield.hcontrol)
                        {   SyncWMark_H34(jCnl);}
                        break;
                    case 2: //主界面
                        if( (VarST3000.SubIDSEL==3) &&
                            (Bjob==VarST3000.jobAB) )
                        {   SetWrkMark23(jCnl, 1);}
                        break;
                    default:
                        break;
                    }
                    //___
                    REC_Sub1(jCnl, 8);
                    //
                    arSYNCFlags[jCnl]=1;
                }
            }
            //___刷新波形界面的整机自手动按钮状态
            if( (VarST3000.MenuIDSEL==2) && (VarST3000.SubIDSEL==3) && (Bjob==VarST3000.jobAB) )
            {   _SetAllWS_M23();
                SyncLapseMark(0); //___隐藏丢失色杠
                //___刷新本组通道工作状态图标
                _SetVWS_M23();
                if( unit[UnitSEL-1].submenu1.bitfield.hcontrol )
                {   _SetHWS_M23();}
            }
        }
        //___判断本组自动手动是否发生改变
        else if( (unit[rCNL].submenu1.bitfield.hand_auto!=hjBYTE.bits.bit0) )
        {   //___确认本组自手动发生改变
            unit[rCNL].submenu1.bitfield.hand_auto=hjBYTE.bits.bit0;
            if(unit[rCNL].submenu1.bitfield.hand_auto)
            {   CommandData[rCNL].Cmd6[2]|=0x01;} //bit0=1 本组自动
            else
            {   CommandData[rCNL].Cmd6[2]&=0xfe;} //bit0=0 本组手动
            //___
            REC_Sub1(rCNL, 8);
            //___由于本组状态和横向自动手动有些地方相关所以一并考虑
            if( unit[rCNL].submenu1.bitfield.hcontrol )
            {   BITFlags hjBEX;
                hjBEX.B=rDAT[6];
                if( unit[rCNL].submenu1.bitfield.h_motorruning!=hjBEX.bits.bit5 )
                {   unit[rCNL].submenu1.bitfield.h_motorruning=hjBEX.bits.bit5;
                    if(unit[rCNL].submenu1.bitfield.h_motorruning)
                    {   CommandData[rCNL].Cmd6[6]|=0x20;} //bit5=1 横向自动
                    else
                    {   CommandData[rCNL].Cmd6[6]&=0xdf;} //bit5=0 横向手动
                }
            }
            //___看是否属于智能寻址等待的上报
            if( (hjGetNextProc(Bjob)==rCNL) &&
                (WhetherCUAuto(rCNL)) ) 
            {   //___是
                SetwjrSearAddrFlags(rCNL, 0);
                jCnl=hjGetNextProc(Bjob);
                if(jCnl)
                {   //___表示下一个有效
                    CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
                    SendCnlData(jCnl, 0x06);
                Do_NextSA_SyncRcvCmd6_002: //循环处理入口
                    if( WhetherCUAuto(jCnl) )
                    {   SetwjrSearAddrFlags(jCnl, 0);
                        jCnl=hjGetNextProc(Bjob);
                        if(jCnl)
                        {   CommandData[jCnl].Cmd6[1]=hjSACmdBuffers[jCnl];
                            SendCnlData(jCnl, 0x06);
                            goto Do_NextSA_SyncRcvCmd6_002;
                        }
                        else
                        {   bREQUEST|=0x01;} //___请求查询整机的工作状态
                    }
                }
                else
                {   bREQUEST|=0x01;} //___请求查询整机的工作状态
            }
            else
            {   bREQUEST|=0x01;} //___请求查询整机的工作状态
            //___更新和本组工作自手动状态相关的图标和按钮显示
            switch

⌨️ 快捷键说明

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