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 = ""; }