# Category=Video # # matrix.pl # Brian Rudy (brudyNO@SPAMpraecogito.com) # # Manages Setsnest's 'Matrix' 20x20 AV matrix switch. # Allows users to select input/output combinations and # scan all inputs for video. # # 0.01 12-19-2002 # First working version. my @vi_alias; my $vi_aliases; my @vo_alias; my $vo_aliases; my @matrix = (0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); my %icon_names = (1 => 'video-off', 2 => 'video-off', 3 => 'video-off', 4 => 'video-off', 5 => 'video-off', 6 => 'video-off', 7 => 'video-off', 8 => 'video-off', 9 => 'video-off', 10 => 'video-off', 11 => 'video-off', 12 => 'video-off', 13 => 'video-off', 14 => 'video-off', 15 => 'video-off', 16 => 'video-off', 17 => 'video-off', 18 => 'video-off', 19 => 'video-off', 20 => 'video-off', 21 => 'video-off' ); # pre-filling this hash may not be required... my %vidstat = (1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 10 => 0, 11 => 0, 12 => 0, 13 => 0, 14 => 0, 15 => 0, 16 => 0, 17 => 0, 18 => 0, 19 => 0, 20 => 0); # Look Up Table for input channels my @channelLUT = (0,120,121,122,123, 116,117,118,119, 108,109,110,111, 92,93,94,95, 60,61,62,63); # Populate the arrays before the Item declarations # noloop=start my $i; for $i (1 .. 21) { my $vostring = "vo_" . $i . "_alias"; my $vistring = "vi_" . $i . "_alias"; if ($i == 20) { $vi_alias[$i] = $config_parms{$vistring}; $vi_aliases .= $config_parms{$vistring}; } elsif ($i < 20) { $vi_alias[$i] = $config_parms{$vistring}; $vi_aliases .= $config_parms{$vistring} . ","; } if ($i == 21) { $vo_alias[$i] = $config_parms{$vostring}; $vo_aliases .= $config_parms{$vostring}; } else { $vo_alias[$i] = $config_parms{$vostring}; $vo_aliases .= $config_parms{$vostring} . ","; } } # noloop=stop # Convert from alias to numeric channel value sub getchannel { my ($direction,$alias) = @_; my $a; if ($direction eq "input") { for $a (1 .. 20) { if ($vi_alias[$a] eq $alias) { return $a; } } } elsif ($direction eq "output") { for $a (1 .. 21) { if ($vo_alias[$a] eq $alias) { return $a; } } } # bogus request print "Error! No alias match found for $alias!\n"; } # Item definitions $matrix_dev = new Matrix; $v_vid_out1 = new Voice_Cmd "Set video output $vo_alias[1] to [$vi_aliases]"; $v_vid_out1 -> set_info('Set video output 1'); $v_vid_out1 -> tie_event('&update_all'); $v_vid_out2 = new Voice_Cmd "Set video output $vo_alias[2] to [$vi_aliases]"; $v_vid_out2 -> set_info('Set video output 2'); $v_vid_out2 -> tie_event('&update_all'); $v_vid_out3 = new Voice_Cmd "Set video output $vo_alias[3] to [$vi_aliases]"; $v_vid_out3 -> set_info('Set video output 3'); $v_vid_out3 -> tie_event('&update_all'); $v_vid_out4 = new Voice_Cmd "Set video output $vo_alias[4] to [$vi_aliases]"; $v_vid_out4 -> set_info('Set video output 4'); $v_vid_out4 -> tie_event('&update_all'); $v_vid_out5 = new Voice_Cmd "Set video output $vo_alias[5] to [$vi_aliases]"; $v_vid_out5 -> set_info('Set video output 5'); $v_vid_out5 -> tie_event('&update_all'); $v_vid_out6 = new Voice_Cmd "Set video output $vo_alias[6] to [$vi_aliases]"; $v_vid_out6 -> set_info('Set video output 6'); $v_vid_out6 -> tie_event('&update_all'); $v_vid_out7 = new Voice_Cmd "Set video output $vo_alias[7] to [$vi_aliases]"; $v_vid_out7 -> set_info('Set video output 7'); $v_vid_out7 -> tie_event('&update_all'); $v_vid_out8 = new Voice_Cmd "Set video output $vo_alias[8] to [$vi_aliases]"; $v_vid_out8 -> set_info('Set video output 8'); $v_vid_out8 -> tie_event('&update_all'); $v_vid_out9 = new Voice_Cmd "Set video output $vo_alias[9] to [$vi_aliases]"; $v_vid_out9 -> set_info('Set video output 9'); $v_vid_out9 -> tie_event('&update_all'); $v_vid_out10 = new Voice_Cmd "Set video output $vo_alias[10] to [$vi_aliases]"; $v_vid_out10 -> set_info('Set video output 10'); $v_vid_out10 -> tie_event('&update_all'); $v_vid_out11 = new Voice_Cmd "Set video output $vo_alias[11] to [$vi_aliases]"; $v_vid_out11 -> set_info('Set video output 11'); $v_vid_out11 -> tie_event('&update_all'); $v_vid_out12 = new Voice_Cmd "Set video output $vo_alias[12] to [$vi_aliases]"; $v_vid_out12 -> set_info('Set video output 12'); $v_vid_out12 -> tie_event('&update_all'); $v_vid_out13 = new Voice_Cmd "Set video output $vo_alias[13] to [$vi_aliases]"; $v_vid_out13 -> set_info('Set video output 13'); $v_vid_out13 -> tie_event('&update_all'); $v_vid_out14 = new Voice_Cmd "Set video output $vo_alias[14] to [$vi_aliases]"; $v_vid_out14 -> set_info('Set video output 14'); $v_vid_out14 -> tie_event('&update_all'); $v_vid_out15 = new Voice_Cmd "Set video output $vo_alias[15] to [$vi_aliases]"; $v_vid_out15 -> set_info('Set video output 15'); $v_vid_out15 -> tie_event('&update_all'); $v_vid_out16 = new Voice_Cmd "Set video output $vo_alias[16] to [$vi_aliases]"; $v_vid_out16 -> set_info('Set video output 16'); $v_vid_out16 -> tie_event('&update_all'); $v_vid_out17 = new Voice_Cmd "Set video output $vo_alias[17] to [$vi_aliases]"; $v_vid_out17 -> set_info('Set video output 17'); $v_vid_out17 -> tie_event('&update_all'); $v_vid_out18 = new Voice_Cmd "Set video output $vo_alias[18] to [$vi_aliases]"; $v_vid_out18 -> set_info('Set video output 18'); $v_vid_out18 -> tie_event('&update_all'); $v_vid_out19 = new Voice_Cmd "Set video output $vo_alias[19] to [$vi_aliases]"; $v_vid_out19 -> set_info('Set video output 19'); $v_vid_out19 -> tie_event('&update_all'); $v_vid_out20 = new Voice_Cmd "Set video output $vo_alias[20] to [$vi_aliases]"; $v_vid_out20 -> set_info('Set video output 20'); $v_vid_out20 -> tie_event('&update_all'); $v_vid_out21 = new Voice_Cmd "Detect video on [$vi_aliases]"; $v_vid_out21 -> set_info('Detect video on input'); $v_vid_out21 -> tie_event('&update_all'); # testing #$v_vid_out21 -> set_icon('video-on'); $v_vid_scan = new Voice_Cmd "Scan video inputs"; $v_vid_scan -> set_info('Detect video on all inputs'); $v_vid_scan -> tie_event('&scanvid'); sub push_matrix { # repopulate the active matrix array with new/saved states # and update icons with video status of inputs # Strict refs won't let us do this the easy way... #my $j; #for $j (1 .. 21) { # $matrix[$j] = getchannel("input", state ${'$v_vid_out' . $j}); # print "\$matrix[$j]=" . $matrix[$j] . ".\n"; #} $matrix[1] = getchannel("input", state $v_vid_out1); $matrix[2] = getchannel("input", state $v_vid_out2); $matrix[3] = getchannel("input", state $v_vid_out3); $matrix[4] = getchannel("input", state $v_vid_out4); $matrix[5] = getchannel("input", state $v_vid_out5); $matrix[6] = getchannel("input", state $v_vid_out6); $matrix[7] = getchannel("input", state $v_vid_out7); $matrix[8] = getchannel("input", state $v_vid_out8); $matrix[9] = getchannel("input", state $v_vid_out9); $matrix[10] = getchannel("input", state $v_vid_out10); $matrix[11] = getchannel("input", state $v_vid_out11); $matrix[12] = getchannel("input", state $v_vid_out12); $matrix[13] = getchannel("input", state $v_vid_out13); $matrix[14] = getchannel("input", state $v_vid_out14); $matrix[15] = getchannel("input", state $v_vid_out15); $matrix[16] = getchannel("input", state $v_vid_out16); $matrix[17] = getchannel("input", state $v_vid_out17); $matrix[18] = getchannel("input", state $v_vid_out18); $matrix[19] = getchannel("input", state $v_vid_out19); $matrix[20] = getchannel("input", state $v_vid_out20); $matrix[21] = getchannel("input", state $v_vid_out21); for my $a (1 .. 21) { $icon_names{$a} = 'video-' . getvid($matrix[$a]); } $v_vid_out1->{icon} = $icon_names{1}; $v_vid_out2->{icon} = $icon_names{2}; $v_vid_out3->{icon} = $icon_names{3}; $v_vid_out4->{icon} = $icon_names{4}; $v_vid_out5->{icon} = $icon_names{5}; $v_vid_out6->{icon} = $icon_names{6}; $v_vid_out7->{icon} = $icon_names{7}; $v_vid_out8->{icon} = $icon_names{8}; $v_vid_out9->{icon} = $icon_names{9}; $v_vid_out10->{icon} = $icon_names{10}; $v_vid_out11->{icon} = $icon_names{11}; $v_vid_out12->{icon} = $icon_names{12}; $v_vid_out13->{icon} = $icon_names{13}; $v_vid_out14->{icon} = $icon_names{14}; $v_vid_out15->{icon} = $icon_names{15}; $v_vid_out16->{icon} = $icon_names{16}; $v_vid_out17->{icon} = $icon_names{17}; $v_vid_out18->{icon} = $icon_names{18}; $v_vid_out19->{icon} = $icon_names{19}; $v_vid_out20->{icon} = $icon_names{20}; $v_vid_out21->{icon} = $icon_names{21}; } # Returns last known state of specified video input sub getvid { my ($vin) = @_; if ($vidstat{$vin}) { return "on"; } else { return "off"; } } # Scan all inputs for video signals # This function takes a while to finish sub scanvid { $matrix_dev->scanvid('binary',@matrix); } if (state_now $matrix_dev eq "scanned") { print "Updating the icons.\n"; %vidstat = $matrix_dev->getvidhash(); &push_matrix; } # send all 21 matrix channel settings sub update_matrix { my ($mode) = @_; $matrix_dev->update_matrix($mode,@matrix); } sub update_all { &push_matrix; &update_matrix("binary"); } if ($Reload) { print_log "Initializing The Matrix."; &push_matrix; &scanvid; }