信号自动切换的功能

发布时间 2023-12-04 20:12:22作者: zp0513

1、需求说明

  需求:
        很多时候会遇到矩阵的自动切换逻辑的问题,以下分享两个比较常用的宏模块说明
       自动切换信号源
  •     当检测到有1路信号输入时,两个输出为复制模式
  •     当检测到有2路信号输入时,两个输出分别输出2路信号
  •     当检测到有第3路信号输入时,两个输出显示2和3
  •     当拔掉第3路信号输入时,两个输出为复制模式显示
  • 分析:
  •  

     

   代码实例如下
#DEFINE_CONSTANT num 9
    DIGITAL_INPUT Video_Source_Detected[num];
    ANALOG_OUTPUT Video_out[2];

integer saved[2];

//定义一个方法,
function dispaly()
{
    Video_out[1] = saved[0];

    Video_out[2] = saved[1];    
}

//事件
push Video_Source_Detected
{
    integer i;    
    i = GetLastModifiedArrayIndex();
    if(saved[1] = 0)           //如果第二个屏没信号,把push得到的信号给到屏上,i表示按下的是第几个
    {
        saved[1] = i;
    }
    saved[0] = saved[1];      //
    saved[1] = i;
    dispaly();
}
//事件释放
release Video_Source_Detected
{
    integer i, j;
    i = GetLastModifiedArrayIndex();       //记录释放位置
    for(j = 0 to 1)                    
    {
        if(saved[j] = i)                  //信号记录在数组save里了,可以循环save数组找到释放的位置,把当前的信号为0
        {
            saved[j] = 0;
        }        
    }
    if(saved[0] = 0)                     //save[0] = 0 没有信号
    {
        saved[0] = saved[1];
    }
    else if(saved[1] = 0)
    {
        saved[1] = saved[0];
    }
    dispaly();
}

2、用字符串来记录方式

  •  在此之前先明白一个概念:1、byte表示的是字符 2、integer表十进制的整形数据 

  •  

    代码如下:

    DIGITAL_INPUT Signal_Async[4];
    ANALOG_OUTPUT Source_Left,Source_Right;
    STRING_OUTPUT DEBUG;
    STRING order[4];  //记录
    //定义方法
    Function switchSignal()
    {
        integer length;
        DEBUG = order;
        length = len ( order );          //判断数据长度就可以知道当前信号源数量
        if ( length >= 2 )
        {
            Source_Left = atoi ( mid ( order , length - 1 , 1 ) );
            Source_Right = atoi ( right ( order , 1 ) );            
        }
        else if ( length = 1 )
        {
            Source_Left = atoi ( order );
            Source_Right = atoi ( order );
        }
        else if ( length = 0 )
        {
            Source_Left = 0;
            Source_Right = 0;
        }
    }
    PUSH Signal_Async
    {
        integer mark;
        mark = getlastmodifiedarrayindex();
        order = order + itoa(mark);
        switchSignal();
    }
    RELEASE Signal_Async
    {
        integer i,length,mark;
        mark = getlastmodifiedarrayindex();
        length = len ( order );
        if ( length = 1 || length = 0 )
            order = "";
        else
        {
            for ( i = 1 to length )
            {
                if ( byte ( order , i ) - 48 = mark )
                    break;        
            }
            order = left ( order , i - 1 ) + right ( order , length - i );
        }
        switchSignal();
    }
    
    Function Main()
    {
        order = "";
    }