Index: Slim/Hardware/IR.pm =================================================================== --- Slim/Hardware/IR.pm (revision 9061) +++ Slim/Hardware/IR.pm (working copy) @@ -388,6 +388,11 @@ } } + if ($code =~ /(.*?)\.(down)$/) { + print "fixing to $1\n"; + $code = $1; + } + if (defined $modifier) { $code .= '.' . $modifier; } @@ -534,7 +539,7 @@ my $timediff = $irTime - $client->lastirtime(); if ($timediff < 0) {$timediff += (0xffffffff / $client->ticspersec());} - if (($timediff < $Slim::Hardware::IR::IRMINTIME) && ($irCodeBytes ne $client->lastircodebytes)) { + if (($code !~ /(.*?)\.(up|down)$/) && ($timediff < $Slim::Hardware::IR::IRMINTIME) && ($irCodeBytes ne $client->lastircodebytes)) { #received oddball code in middle of repeat sequence, drop it $::d_ir && msg("Received $irCodeBytes while expecting " . $client->lastircodebytes . ", dropping code\n"); return; @@ -553,8 +558,10 @@ msg("$irCodeBytes\t$irTime\t".Time::HiRes::time()."\n"); } - - if (($irCodeBytes eq ($client->lastircodebytes())) #same button press as last one + if ($code =~ /(.*?)\.(up|down)$/) { + $client->lastircodebytes($irCodeBytes); + processFrontPanel($client, $1, $2, $irTime); + } elsif (($irCodeBytes eq ($client->lastircodebytes())) #same button press as last one && ( ($client->irtimediff < $Slim::Hardware::IR::IRMINTIME) #within the minimum time to be considered a repeat || (($client->irtimediff < $client->irrepeattime * 2.02) #or within 2% of twice the repeat time && ($client->irtimediff > $client->irrepeattime * 1.98))) #indicating that a repeat code was missed @@ -575,12 +582,51 @@ Slim::Utils::Timers::setTimer($client,Time::HiRes::time()+($Slim::Hardware::IR::IRSINGLETIME),\&checkRelease ,'single',$irTime,$irCodeBytes,$irTime + $Slim::Hardware::IR::IRSINGLETIME) } - my $irCode = lookup($client,$irCodeBytes); + my $irCode = lookupFunction($client,$code); $::d_ir && msg("irCode = [$irCode] timer = [$irTime] timediff = [" . $client->irtimediff . "] last = [".$client->lastircode()."]\n"); processCode($client, $irCode, $irTime); } } +sub processFrontPanel { + my $client = shift; + my $code = shift; + my $dir = shift; + my $irTime = shift; + + if ($dir eq 'down') { + $::d_ir && msg("Down press on $code\n"); + my $irCode = lookupFunction($client,$code); + $client->lastirbutton($irCode); + + Slim::Utils::Timers::setTimer($client,Time::HiRes::time()+($Slim::Hardware::IR::IRHOLDTIME), \&fireHold, $1.'.hold', $client->lastirtime); + } else { + $::d_ir && msg("Release on $code\n"); + + my $irCode; + if ($irTime - $client->lastirtime() > $Slim::Hardware::IR::IRHOLDTIME) { + $irCode = lookupFunction($client,$code.'.hold_release'); + $client->lastirbutton($code.'.hold_release'); + processCode( $client,$irCode, $client->lastirtime); + } else { + $irCode = lookupFunction($client,$code.'.single'); + $client->lastirbutton($code.'.single'); + processCode($client,$irCode,$irTime); + } + } +} + +sub fireHold { + my $client = shift; + my $irCode = shift; + my $irTime = shift; + + my $last = lookupCodeBytes($client,$client->lastircodebytes); + return if ($last =~ /\.up$/); + $::d_ir && msg("IR: Hold Time Expired - irCode = [$irCode] timer = [$irTime] timediff = [" . $client->irtimediff . "] last = [".$last."]\n"); + processCode($client, $irCode, $irTime); +} + # utility functions used externally sub resetHoldStart { my $client = shift;