From 7aba35c03cf4837c9e98fe1442c5becce8ed7f39 Mon Sep 17 00:00:00 2001 From: mabula Date: Wed, 8 Jan 2020 10:10:07 +0000 Subject: [PATCH] 70_Viera: new commands git-svn-id: https://svn.fhem.de/fhem/trunk@20914 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 3 + fhem/FHEM/70_VIERA.pm | 688 ++++++++++++++++++++++++------------------ 2 files changed, 393 insertions(+), 298 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index de13674b9..7fd56b0e6 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,8 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 70_VIERA: new commands, direct access to apps, commands had + to be changed, if necessary reload RC layout + - bugfix: 70_VIERA: patch by nestor - new: 98_MAX_Temperature.pm: new modul - bugfix: 73_AutoShuttersControl: fix SelfDefense then drive day open - bugfix: 73_AutoShuttersControl: fix adv icon for devStateIcon diff --git a/fhem/FHEM/70_VIERA.pm b/fhem/FHEM/70_VIERA.pm index 744c83cd0..d3e3a5bbe 100644 --- a/fhem/FHEM/70_VIERA.pm +++ b/fhem/FHEM/70_VIERA.pm @@ -9,9 +9,13 @@ # since version 1.25 modified by mabula # # -# Version = 1.28 +# Version = 1.30 # # Version History: +# - 1.30 - 2020-01-10 Dr. H-J Breymayer +# -- implemented additional commands, changed definition of commands +# -- bugfix patch from Nestor +# # - 1.28 - 2019-12-14 Dr. H-J Breymayer # -- correction of "Rolling Key" in case of bad command # -- GetStatus call after on_off command @@ -87,66 +91,93 @@ sub VIERA_RClayout_TV(); sub VIERA_RClayout_TV_SVG(); my %VIERA_remoteControl_args = ( - "NRC_CH_DOWN-ONOFF" => "Channel down", - "NRC_CH_UP-ONOFF" => "Channel up", - "NRC_VOLUP-ONOFF" => "Volume up", - "NRC_VOLDOWN-ONOFF" => "Volume down", - "NRC_MUTE-ONOFF" => "Mute", - "NRC_TV-ONOFF" => "TV", - "NRC_CHG_INPUT-ONOFF" => "AV", - "NRC_RED-ONOFF" => "Red", - "NRC_GREEN-ONOFF" => "Green", - "NRC_YELLOW-ONOFF" => "Yellow", - "NRC_BLUE-ONOFF" => "Blue", - "NRC_VTOOLS-ONOFF" => "VIERA tools", - "NRC_CANCEL-ONOFF" => "Cancel / Exit", - "NRC_SUBMENU-ONOFF" => "Option", - "NRC_RETURN-ONOFF" => "Return", - "NRC_ENTER-ONOFF" => "Control Center click / enter", - "NRC_RIGHT-ONOFF" => "Control RIGHT", - "NRC_LEFT-ONOFF" => "Control LEFT", - "NRC_UP-ONOFF" => "Control UP", - "NRC_DOWN-ONOFF" => "Control DOWN", - "NRC_3D-ONOFF" => "3D button", - "NRC_SD_CARD-ONOFF" => "SD-card", - "NRC_DISP_MODE-ONOFF" => "Display mode / Aspect ratio", - "NRC_MENU-ONOFF" => "Menu", - "NRC_INTERNET-ONOFF" => "VIERA connect", - "NRC_VIERA_LINK-ONOFF"=> "VIERA link", - "NRC_EPG-ONOFF" => "Guide / EPG", - "NRC_TEXT-ONOFF" => "Text / TTV", - "NRC_STTL-ONOFF" => "STTL / Subtitles", - "NRC_INFO-ONOFF" => "Info", - "NRC_INDEX-ONOFF" => "TTV index", - "NRC_HOLD-ONOFF" => "TTV hold / image freeze", - "NRC_R_TUNE-ONOFF" => "Last view", - "NRC_POWER-ONOFF" => "Power off", - "NRC_REW-ONOFF" => "Rewind", - "NRC_PLAY-ONOFF" => "Play", - "NRC_FF-ONOFF" => "Fast forward", - "NRC_SKIP_PREV-ONOFF" => "Skip previous", - "NRC_PAUSE-ONOFF" => "Pause", - "NRC_SKIP_NEXT-ONOFF" => "Skip next", - "NRC_STOP-ONOFF" => "Stop", - "NRC_REC-ONOFF" => "Record", - "NRC_D1-ONOFF" => "Digit 1", - "NRC_D2-ONOFF" => "Digit 2", - "NRC_D3-ONOFF" => "Digit 3", - "NRC_D4-ONOFF" => "Digit 4", - "NRC_D5-ONOFF" => "Digit 5", - "NRC_D6-ONOFF" => "Digit 6", - "NRC_D7-ONOFF" => "Digit 7", - "NRC_D8-ONOFF" => "Digit 8", - "NRC_D9-ONOFF" => "Digit 9", - "NRC_D0-ONOFF" => "Digit 0", - "NRC_P_NR-ONOFF" => "P-NR (Noise reduction)", - "NRC_R_TUNE-ONOFF" => "Seems to do the same as INFO", - "NRC_HDMI1" => "Switch to HDMI input 1", - "NRC_HDMI2" => "Switch to HDMI input 2", - "NRC_HDMI3" => "Switch to HDMI input 3", - "NRC_HDMI4" => "Switch to HDMI input 4", + channel_down => "CH_DOWN", + channel_up => "CH_UP", + volume_up => "VOLUP", + volume_down => "VOLDOWN", + mute => "MUTE", + TV => "TV", + AV => "CHG_INPUT", + red_button => "RED", + green_button => "GREEN", + yellow_button => "YELLOW", + blue_button => "BLUE", + VIERA_tools => "VTOOLS", + cancel => "CANCEL", + exit => "CANCEL", + option => "SUBMENU", + return => "RETURN", + home => "HOME", + program => "PROG", + enter => "ENTER", + right => "RIGHT", + left => "LEFT", + up => "UP", + down => "DOWN", + "3D_button" => "3D", + SD_card => "SD_CARD", + display_mode => "DISP_MODE", + menu => "MENU", + VIERA_connect => "INTERNET", + VIERA_link => "VIERA_LINK", + EPG => "EPG", + guide => "GUIDE", + videotext => "TEXT", + subtitle => "STTL", + info => "INFO", + index => "INDEX", + hold => "HOLD", + last_view => "R_TUNE", + on_off => "POWER", + rewind => "REW", + play => "PLAY", + fast_forward => "FF", + skip_previous => "SKIP_PREV", + pause => "PAUSE", + skip_next => "SKIP_NEXT", + stop => "STOP", + record => "REC", + apps => "APPS", + aspect => "ASPECT", + favorite => "FAVORITE", + game => "GAME", + digit_1 => "D1", + digit_2 => "D2", + digit_3 => "D3", + digit_4 => "D4", + digit_5 => "D5", + digit_6 => "D6", + digit_7 => "D7", + digit_8 => "D8", + digit_9 => "D9", + digit_0 => "D0", + noise_reduction => "P_NR", + tune => "R_TUNE", + HDMI_1 => "HDMI1", + HDMI_2 => "HDMI2", + HDMI_3 => "HDMI3", + HDMI_4 => "HDMI4", ); +my %VIERA_remoteControl_apps = ( + netflix => "0010000200000001", + youtube => "0070000200180001", + shoutcast => "0070000400000001", + calendar => "0387878700150020", + browser => "0077777700160002", + amazonprime => "0010000100180001", + iplayer => "0020000A00000010", + bbc_iplayer => "0020000A00000010", + itv => "0387878700000124", + all_4 => "0387878700000125", + demand_5 => "0387878700000125", + recorded_tv => "0387878700000013", + multi_window => "0387878700000050", + bbc_news => "0020000A00000006", + bbc_sport => "0020000A00000007", + weather => "0070000C00000001", + developer => "0077777777777778", +); # Initialize the module and tell FHEM name of additional functions # Param1: Hash of FHEM-Device @@ -278,14 +309,16 @@ sub VIERA_Set($@) { "volume:slider,0,1,100 ". "channel ". "remoteControl:" . join(",", sort keys %VIERA_remoteControl_args) . " " . - "input:hdmi1,hdmi2,hdmi3,hdmi4,sdCard,tv"; + "remoteControlApp:" . join(",", sort keys %VIERA_remoteControl_apps) . " " . + "input:HDMI_1,HDMI_2,HDMI_3,HDMI_4,SD_card,TV ". + "statusRequest:noArg "; $usage =~ s/(NRC_|-ONOFF)//g; - my $what = lc($a[0]); + my $what = $a[0]; return "\"set $name\" needs at least one argument" if(!defined($a[0])); return "Unknown value $a[0] Device is not present or reachable (power on or check ethernet connection)" if(ReadingsVal($name,"state","off") eq "off" && $what ne "?"); return "Unknown value $a[0] use set $name on_off, choose one of on_off ?" if(ReadingsVal($name,"state","off") eq "dormant" && $what ne "on_off"); - my $state = lc($a[1]) if(defined($a[1])); + my $state = $a[1] if(defined($a[1])); if ($what eq "mute"){ Log3 $name, 3, "$name: Set mute $state"; @@ -301,7 +334,7 @@ sub VIERA_Set($@) { } elsif ($what eq "on_off"){ Log3 $name, 3, "$name: Set on_off"; - VIERA_Encrypted_Command($hash, "POWER"); + VIERA_Encrypted_Command($hash, "POWER", "key"); VIERA_Encrypt_Answer($hash); sleep 0.6; VIERA_GetStatus($hash, 1); @@ -310,39 +343,49 @@ sub VIERA_Set($@) { return "$name: Channel is too high or low!" if($state < 1 || $state > 9999); Log3 $name, 3, "$name: Set channel $state"; for(my $i = 0; $i <= length($state)-1; $i++) { - VIERA_Encrypted_Command($hash, "D".substr($state, $i, 1)); + VIERA_Encrypted_Command($hash, "D".substr($state, $i, 1), "key"); sleep 0.1; VIERA_Encrypt_Answer($hash); } - VIERA_Encrypted_Command($hash, "ENTER"); + VIERA_Encrypted_Command($hash, "ENTER", "key"); VIERA_Encrypt_Answer($hash); } - elsif ($what eq "remotecontrol"){ - if($state eq "?"){ - $usage = "choose one of the states:\n"; - foreach $key (sort keys %VIERA_remoteControl_args){ - if(length($key) < 17){ $tab = "\t\t"; }else{ $tab = "\t"; } - $usage .= "$key $tab=> $VIERA_remoteControl_args{$key}\n"; + elsif ($what eq "remoteControl"){ + Log3 $name, 3, "$name: Set remoteControl $state"; + + if( defined($VIERA_remoteControl_args{$state}) ) { + $state = $VIERA_remoteControl_args{$state}; + Log3 $name, 4, "$name: Set remoteControl $state"; } - $usage =~ s/(NRC_|-ONOFF)//g; - return $usage; - } - else{ - $state = uc($state); - Log3 $name, 3, "$name: Set remoteControl $state"; - VIERA_Encrypted_Command($hash, $state); + else {return "Unknown argument $what, $usage"} + + VIERA_Encrypted_Command($hash, $state, "key"); VIERA_Encrypt_Answer($hash); + } + elsif ($what eq "remoteControlApp"){ + Log3 $name, 3, "$name: Set remoteControlApp $state"; + + if( defined($VIERA_remoteControl_apps{$state}) ) { + $state = $VIERA_remoteControl_apps{$state}; + Log3 $name, 4, "$name: Set remoteControlApp $state"; } + else {return "Unknown argument $what, $usage"} + + VIERA_Encrypted_Command($hash, $state, "app"); + VIERA_Encrypt_Answer($hash); } elsif ($what eq "input"){ - $state = uc($state); - return "$name: Input $state isn't available." if($state ne "HDMI1" && $state ne "HDMI2" && $state ne "HDMI3" && $state ne "HDMI4" && $state ne "SDCARD" && $state ne "TV"); - $state = "SD_CARD" if ($state eq "SDCARD"); - Log3 $name, 3, "$name: Set input $state"; - VIERA_Encrypted_Command($hash, $state); + Log3 $name, 3, "$name: Set input $state"; + if( defined($VIERA_remoteControl_args{$state}) ) { + $state = $VIERA_remoteControl_args{$state}; + Log3 $name, 4, "$name: Set remoteControl $state"; + } + else {return "Unknown argument $what, $usage"} + + VIERA_Encrypted_Command($hash, $state, "key"); VIERA_Encrypt_Answer($hash); } - elsif ($what eq "statusrequest"){ + elsif ($what eq "statusRequest"){ Log3 $name, 3, "$name: Set statusRequest"; VIERA_GetStatus($hash, 1); } @@ -369,7 +412,7 @@ sub VIERA_Get($@) { return "$name: No argument given, $usage" if(int(@a) != 2); - $what = lc($a[1]); + $what = $a[1]; if($what =~ /^(volume|mute|presence)$/) { if (defined($hash->{READINGS}{$what})) { @@ -540,7 +583,9 @@ sub VIERA_connection($$) { Log3 $name, 5, "$name [$blocking]: Send Data to $hash->{helper}{HOST}:$hash->{helper}{PORT}:\n$data"; print $sock $data; - while ((read $sock, $buff, 1024) > 0){ + while (1){ + my $res = read $sock, $buff, 1024; + last if (not defined($res) or $res == 0); $buffer .= $buff; } @@ -556,48 +601,6 @@ sub VIERA_connection($$) { } -# Create RAW Data to sent pressed keys of remoteControl to device. -# Param1: Hash of FHEM-Device -# Param2: Name of key to send -# Return: RAW html request for xml soap -sub VIERA_BuildXML_NetCtrl($$) { - my ($hash, $command) = @_; - - my $host = $hash->{helper}{HOST}; - my $port = $hash->{helper}{PORT}; - - my $callsoap = ""; - my $message = ""; - my $head = ""; - my $blen = ""; - - $callsoap .= "\r\n"; - $callsoap .= "\r\n"; - - $callsoap .= "\r\n"; - $callsoap .= "\r\n"; - $callsoap .= "NRC_$command-ONOFF\r\n"; - $callsoap .= "\r\n"; - $callsoap .= "\r\n"; - $callsoap .= "\r\n"; - - $blen = length($callsoap); - - $head .= "POST /nrc/control_0 HTTP/1.1\r\n"; - $head .= "Host: $host:$port\r\n"; - $head .= "Content-Type: text/xml; charset=\"utf-8\"\r\n"; - $head .= "SOAPAction: \"urn:panasonic-com:service:p00NetworkControl:1#X_SendKey\"\r\n"; - $head .= "Content-Length: $blen\r\n"; - $head .= "\r\n"; - - $message .= $head; - $message .= $callsoap; -# Log3 $name, 5, "$name: Building XML SOAP (NetworkControl) for command $command to host $host:\n$message"; - return $message; -} - - # Create RAW Data to send or get volume/mute state # Param1: Hash of FHEM-Device # Param2: get|set @@ -887,11 +890,13 @@ sub VIERA_GetAbortFn($) { ###################################################################################################################### -sub VIERA_Encrypted_Command($$) { - my ($hash, $command) = @_; +sub VIERA_Encrypted_Command($$$) { + my ($hash, $command, $type) = @_; my $i = 0; my $message = ""; + my $params = ""; + my $task = ""; if ($hash->{helper}{ENCRYPTION} eq "yes") { @@ -900,26 +905,27 @@ sub VIERA_Encrypted_Command($$) { if ($hash->{helper}{stop} eq "yes") {return 0 if (!VIERA_authorize_pin_code($hash))}; if ($hash->{helper}{session_seq_num} eq "None") {return 0 if (!VIERA_request_session_id($hash))}; + } - - my $params = "NRC_$command-ONOFF"; - $message = VIERA_Build_soap_message_Encrypt($hash, "X_SendKey", $params, "u"); - $hash->{helper}{BUFFER} = ""; - if (exists($hash->{helper}{RUNNING_PID_GET}) and $i < 5) { - sleep (0.1); - $i += 1; - } - VIERA_connection($hash, $message); - } - else { - $message = VIERA_BuildXML_NetCtrl($hash, $command); - $hash->{helper}{BUFFER} = ""; - if (exists($hash->{helper}{RUNNING_PID_GET}) and $i < 5) { - sleep (0.1); - $i += 1; - } - VIERA_connection($hash, $message); + if ( $type eq "key" ) { + $params = "NRC_$command-ONOFF"; + $task = "X_SendKey"; + } + elsif ( $type eq "app" ) { + $params = "vc_app"; + $params .= "product_id=$command"; + $task = "X_LaunchApp"; + } + else {return}; + + $message = VIERA_Build_soap_message_Encrypt($hash, $task, $params, "u"); + $hash->{helper}{BUFFER} = ""; + if (exists($hash->{helper}{RUNNING_PID_GET}) and $i < 5) { + sleep (0.1); + $i += 1; } + VIERA_connection($hash, $message); + return; } @@ -937,8 +943,15 @@ sub VIERA_Encrypt_Answer($) { if (index($answer, "Bad Request") != -1) { if ($hash->{helper}{session_seq_num} ne "None") { $hash->{helper}{session_seq_num} -= 1; + readingsSingleUpdate($hash, "Sequence", $hash->{helper}{session_seq_num},1); } } + elsif (index($answer, "Internal Server Error") != -1) { + $hash->{helper}{session_seq_num} = "None"; + readingsSingleUpdate($hash, "Sequence", $hash->{helper}{session_seq_num},1); + Log3 $name, 4, "$name reset of Rolling Key"; + } + Log3 $name, 3, "$name wrong encrypted VIERA command: \r\n\"$answer\""; return undef; } @@ -966,9 +979,8 @@ sub VIERA_CeckEncryption($) { $hash->{helper}{BUFFER} = ""; - VIERA_connection($hash, VIERA_BuildXML_NetCtrl($hash, "INFO")); + VIERA_Encrypted_Command($hash, "INFO", "key"); - if ($hash->{helper}{BUFFER} ne "") { $answer = $hash->{helper}{BUFFER} ; $iS = index($answer, "401"); @@ -1296,26 +1308,26 @@ sub VIERA_RClayout_TV() { my @row; my $i = 0; - $row[$i++]="power:POWEROFF2, TV, CHG_INPUT:HDMI"; - $row[$i++]="MENU, disp_mode:ASPECT, epg:GUIDE"; - $row[$i++]="VIERA_LINK, VTOOLS, INTERNET"; - $row[$i++]=":blank, :blank, :blank"; - $row[$i++]="INFO:INFO2, UP, cancel:EXIT"; - $row[$i++]="LEFT, ENTER, RIGHT"; - $row[$i++]="SUBMENU, DOWN, RETURN"; - $row[$i++]="red:RED, :blank, green:GREEN"; - $row[$i++]="yellow:YELLOW, :blank, blue:BLUE"; - $row[$i++]="d1:1, d2:2, d3:3"; - $row[$i++]="d4:4, d5:5, d6:6"; - $row[$i++]="d7:7, d8:8, d9:9"; - $row[$i++]="MUTE, d0:0, r_tune:PRECH"; - $row[$i++]=":blank, :blank, :blank"; - $row[$i++]="VOLUP, :blank, ch_up:CHUP"; - $row[$i++]=":VOL, :blank, :PROG"; - $row[$i++]="VOLDOWN, :blank, ch_down:CHDOWN"; - $row[$i++]=":blank, :blank, :blank"; - $row[$i++]="rew:REWIND, PLAY, FF"; - $row[$i++]="STOP, PAUSE, REC"; + $row[$i++]="on_off:POWEROFF2, TV:TV, AV:HDMI"; + $row[$i++]="menu:MENU, display_mode:ASPECT, EPG:GUIDE"; + $row[$i++]="VIERA_link:VIERA_LINK, VIERA_tools:VTOOLS, VIERA_connect:INTERNET"; + $row[$i++]=":blank, :blank, :blank"; + $row[$i++]="info:INFO2, up:UP, cancel:EXIT"; + $row[$i++]="left:LEFT, enter:ENTER, right:RIGHT"; + $row[$i++]="option:SUBMENU, down:DOWN, return:RETURN"; + $row[$i++]="red:RED, :blank, green:GREEN"; + $row[$i++]="yellow:YELLOW, :blank, blue:BLUE"; + $row[$i++]="digit_1:1, digit_2:2, digit_3:3"; + $row[$i++]="digit_4:4, digit_5:5, digit_6:6"; + $row[$i++]="digit_7:7, digit_8:8, digit_9:9"; + $row[$i++]="mute:MUTE, digit_0:0, tune:PRECH"; + $row[$i++]=":blank, :blank, :blank"; + $row[$i++]="volume_up:VOLUP, :blank, channel_up:CHUP"; + $row[$i++]=":VOL, :blank, :PROG"; + $row[$i++]="volume_down:VOLDOWN, :blank, channel_down:CHDOWN"; + $row[$i++]=":blank, :blank, :blank"; + $row[$i++]="rewind:REWIND, play:PLAY, fast_foreward:FF"; + $row[$i++]="stop:STOP, pause:PAUSE, record:REC"; # Replace spaces with no space for (@row) {tr/ //d} @@ -1331,29 +1343,30 @@ sub VIERA_RClayout_TV_SVG() { my @row; my $i = 0; - $row[$i++]="power:rc_POWER.svg, TV:rc_TV2.svg, CHG_INPUT:rc_AV.svg"; - $row[$i++]="MENU:rc_MENU.svg, disp_mode:rc_ASPECT.svg, epg:rc_EPG.svg"; - $row[$i++]="VIERA_LINK:rc_VIERA_LINK.svg, VTOOLS:rc_VIERA_TOOLS.svg, INTERNET:rc_WEB.svg"; - $row[$i++]=":rc_BLANK.svg, :rc_BLANK.svg, :rc_BLANK.svg"; - $row[$i++]="INFO:rc_INFO2.svg, UP:rc_UP.svg, cancel:rc_EXIT.svg"; - $row[$i++]="LEFT:rc_LEFT.svg, ENTER:rc_dot.svg, RIGHT:rc_RIGHT.svg"; - $row[$i++]="SUBMENU:rc_OPTIONS.svg, DOWN:rc_DOWN.svg, RETURN:rc_BACK.svg"; - $row[$i++]="red:rc_RED.svg, :rc_BLANK.svg, green:rc_GREEN.svg"; - $row[$i++]="yellow:rc_YELLOW.svg, :rc_BLANK.svg, blue:rc_BLUE.svg"; - $row[$i++]="d1:rc_1.svg, d2:rc_2.svg, d3:rc_3.svg"; - $row[$i++]="d4:rc_4.svg, d5:rc_5.svg, d6:rc_6.svg"; - $row[$i++]="d7:rc_7.svg, d8:rc_8.svg, d9:rc_9.svg"; - $row[$i++]="MUTE:rc_MUTE.svg, d0:rc_0.svg, r_tune:rc_BACK.svg"; - $row[$i++]=":rc_BLANK.svg, :rc_BLANK.svg, :rc_BLANK.svg"; - $row[$i++]="VOLUP:rc_UP.svg, :rc_BLANK.svg, ch_up:rc_UP.svg"; - $row[$i++]=":rc_VOL.svg, :rc_BLANK.svg, :rc_PROG.svg"; - $row[$i++]="VOLDOWN:rc_DOWN.svg, :rc_BLANK.svg, ch_down:rc_DOWN.svg"; - $row[$i++]=":rc_BLANK.svg, :rc_BLANK.svg, :rc_BLANK.svg"; - $row[$i++]="rew:rc_REW.svg, PLAY:rc_PLAY.svg, FF:rc_FF.svg"; - $row[$i++]="STOP:rc_STOP.svg, PAUSE:rc_PAUSE.svg, REC:rc_REC.svg"; + $row[$i++]="on_off:rc_POWER.svg, TV:rc_TV2.svg, AV:rc_AV.svg"; + $row[$i++]="menu:rc_MENU.svg, display_mode:rc_ASPECT.svg, EPG:rc_EPG.svg"; + $row[$i++]="VIERA_link:rc_VIERA_LINK.svg, VIERA_tools:rc_VIERA_TOOLS.svg, VIERA_connect:rc_WEB.svg"; + $row[$i++]=":rc_BLANK.svg, :rc_BLANK.svg, :rc_BLANK.svg"; + $row[$i++]="info:rc_INFO2.svg, up:rc_UP.svg, cancel:rc_EXIT.svg"; + $row[$i++]="left:rc_LEFT.svg, enter:rc_dot.svg, right:rc_RIGHT.svg"; + $row[$i++]="option:rc_OPTIONS.svg, down:rc_DOWN.svg, return:rc_BACK.svg"; + $row[$i++]="red:rc_RED.svg, :rc_BLANK.svg, green:rc_GREEN.svg"; + $row[$i++]="yellow:rc_YELLOW.svg, :rc_BLANK.svg, blue:rc_BLUE.svg"; + $row[$i++]="digit_1:rc_1.svg, digit_2:rc_2.svg, digit_3:rc_3.svg"; + $row[$i++]="digit_4:rc_4.svg, digit_5:rc_5.svg, digit_6:rc_6.svg"; + $row[$i++]="digit_7:rc_7.svg, digit_8:rc_8.svg, digit_9:rc_9.svg"; + $row[$i++]="mute:rc_MUTE.svg, digit_0:rc_0.svg, tune:rc_BACK.svg"; + $row[$i++]=":rc_BLANK.svg, :rc_BLANK.svg, :rc_BLANK.svg"; + $row[$i++]="volume_up:rc_UP.svg, :rc_BLANK.svg, channel_up:rc_UP.svg"; + $row[$i++]=":rc_VOL.svg, :rc_BLANK.svg, :rc_PROG.svg"; + $row[$i++]="volume_down:rc_DOWN.svg, :rc_BLANK.svg, channel_down:rc_DOWN.svg"; + $row[$i++]=":rc_BLANK.svg, :rc_BLANK.svg, :rc_BLANK.svg"; + $row[$i++]="rewind:rc_REW.svg, play:rc_PLAY.svg, fast_foreward:rc_FF.svg"; + $row[$i++]="stop:rc_STOP.svg, pause:rc_PAUSE.svg, record:rc_REC.svg"; # Replace spaces with no space for (@row) {tr/ //d} + return @row; } @@ -1431,61 +1444,100 @@ sub VIERA_RClayout_TV_SVG() {