[mythtv-users] FW: RCA DTV script

Dave de Leon Manaloto dave_manaloto at hotmail.com
Thu Sep 11 23:42:55 EDT 2003


Try this one.. I've put it online at http://www.practicecode.com/RCA.pl I 
works on my DRD420RE.  I modified it to turn on the ird, and try and clear 
the banner on top after changing the channel.  Hope it works for you.

Dave

>From: "Jason Dupree" <jdupree at tampabay.rr.com>
>Reply-To: jdupree at tampabay.rr.com,   Discussion about mythtv 
><mythtv-users at mythtv.org>
>To: <mythtv-users at mythtv.org>
>Subject: [mythtv-users] FW: RCA DTV script
>Date: Thu, 11 Sep 2003 21:59:49 -0400
>
>Does anyone have a script to control channel changing on a newer RCA
>receiver? Mine is a DRD480RE and I have tried some of the modified RCA
>sripts listing in the mythtv docs and they don't seem to work, even
>though commands are being output the serial port fine, and I can control
>my receiver fine with the cable I made using the DTV serial control with
>windows at www.pcmx.net/dtvcon. Would appreciate if anybody has one that
>is working with a newer receiver.
>
>
>
>
>
>
>_______________________________________________
>mythtv-users mailing list
>mythtv-users at mythtv.org
>http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users

_________________________________________________________________
Need more e-mail storage? Get 10MB with Hotmail Extra Storage.   
http://join.msn.com/?PAGE=features/es
-------------- next part --------------
#!/usr/bin/perl

# This is only the necessary parts of the original script (found in the link 
bellow) necessary to change the channels in the box.
# dss_control:  Remote control of a Sony DSS unit via the serial port
# By Josh Wilmes (http://www.hitchhiker.org/dss)
# Based on info from http://www.isd.net/mevenmo/audiovideo.html
#
# I take no responsibility for any damage this script might cause.
# Feel free to modify and redistribute this as you see fit, but please 
retain
# the comments above.

# Modified 12-05-02 by Jason Richmond (jason at jgrichmond.com) to control RCA 
DirecTV reciever.
#Usage:
#      RCA.pl <channel number>
#Notes:
# Com port is set to COM 2 (cua1)
# Just make this file executable (chmod 755) and call it.


$|=1;
use POSIX qw(:termios_h);
use FileHandle;

$verbose=0;

%pkt_decode=("0xF0" => "START PKT",
            "0xF1" => "ERR 1",
            "0xF2" => "GOT EXTENDED",
            "0xF4" => "END PKT",
            "0xF5" => "ERR 2",
            "0xFB" => "PROMPT");

%terminal=("0xF1" => -1,
          "0xF4" => 1,
          "0xF5" => -1);


%cmds=("on" => \&on,
      "off" => \&off,
      "get_channel" => \&get_channel,
      "text" => \&text,
      "scroll" => \&scroll,
      "hide" => \&hide,
      "show" => \&show,
      "get_signal" => \&get_signal,
      "channel" => \&change_channel,
      "key" => \&key,
      "verbose" => \&toggle_verbose
      );

# done
%keymap=(right => "0xa8",
           left => "0xa9",
           up => "0xa6",
         down => "0xa7",
     favorite => "0x9e",
       select => "0xc3",
         exit => "0xf9",
            9 => "0xc6",
            8 => "0xc7",
            7 => "0xc8",
            6 => "0xc9",
            5 => "0xca",
            4 => "0xcb",
            3 => "0xcc",
            2 => "0xcd",
            1 => "0xce",
            0 => "0xcf",
        ch_up => "0xd2",
        ch_dn => "0xd3",
        power => "0xd5",
         jump => "0xac",
        guide => "0xe5",
         menu => "0xf7");

my $serial=init_serial("/dev/ttyS0","9600");

# Make sure reciever is on
turn_on_ird();

$channel = $ARGV[0];

# Change the channel
foreach (@ARGV) {
printf($_) if ($verbose);
change_channel($_);
}

system("sleep 1");
clear_osd();

exit(0);

sub turn_on_ird {
  printf("Turning on ird") if ($verbose);
  simple_command("0x02");
}

sub clear_osd {
  printf("Clearing OSD") if ($verbose);
  simple_command("0x45","0x00","0x00","0xf9");
}

sub change_channel {
   my ($channel)=@_;

   $_=sprintf("%4.4x",$channel);
   ($n1,$n2)=/(..)(..)/;

   simple_command("0x46",$n1,$n2);
}


sub simple_command {
   if (defined(dss_command(@_))) {
	return(1);
   } else {
	return(undef);
   }
}
##looks right
sub dss_command {
   sendbytes("0xFA", at _);
   return get_reply();
}

sub sendbytes {
   (@send)=@_;
   foreach (@send) { s/^0x//g; $_=hex($_); }
   print " SEND: " if ($verbose);
   foreach $num (@send) {
       $str=pack('C',$num);
       printf("0x%X [%s] ", $num, $str) if ($verbose);
     syswrite($serial,$str,length($str));
   }
   print "\n" if ($verbose);
}

sub get_reply {
   my $starttime=time();
   my ($last,$ok, at ret);

   print "  RECV: " if ($verbose);

   while (1) {
      $ret=sysread($serial,$buf,1);
      $str=sprintf("0x%2.2X", ord($buf));

      # busy wait bad!
      die ("Error ($str)\n") if (time() - $starttime > 8);
      next if $str eq "0x00";

      if ($pkt_decode{$str}) {
          print $str if ($verbose);
          print "[$pkt_decode{$str}] " if ($verbose);
      } else {
          $_=$str; s/^0x//g; $_=hex($_);
          printf("$str(%3.3s) ",$_) if ($verbose);
          push (@ret,$_);
      }

      $ok=1 if ($terminal{$str} > 0);
      last if ($terminal{$str});
      last if ($last eq "0xFB" && $str eq "0xFB");
      $last=$str;
  }
  print "\n\n" if ($verbose);

  return @ret if ($ok);
  return undef;
}

sub init_serial {
   my($port,$baud)=@_;
   my($termios,$cflag,$lflag,$iflag,$oflag);
   my($voice);

my $serial=new FileHandle("+>$port") || die "Could not open $port: $!\n";

   $termios = POSIX::Termios->new();
   $termios->getattr($serial->fileno()) || die "getattr: $!\n";
   $cflag= 0 | CS8 | HUPCL | CREAD | CLOCAL;
   $lflag= 0;
   $iflag= 0 | IGNBRK | IGNPAR | IXON | IXOFF;
   $oflag= 0;

   $termios->setcflag($cflag);
   $termios->setlflag($lflag);
   $termios->setiflag($iflag);
   $termios->setoflag($oflag);
   $termios->setattr($serial->fileno(),TCSANOW) || die "setattr: $!\n";
   eval qq[
     \$termios->setospeed(POSIX::B$baud) || die "setospeed: \$!\n";
     \$termios->setispeed(POSIX::B$baud) || die "setispeed: \$!\n";
   ];

   die $@ if $@;

   $termios->setattr($serial->fileno(),TCSANOW) || die "setattr: $!\n";

   # This gets rid of all the special characters..
   $termios->getattr($serial->fileno()) || die "getattr: $!\n";
   for (0..NCCS) {
	if ($_ == NCCS) { last; }

	# Dont mess up XON/XOFF..
	if ($_ == VSTART || $_ == VSTOP) { next; }

	$termios->setcc($_,0);
   }
   $termios->setattr($serial->fileno(),TCSANOW) || die "setattr: $!\n";

   return $serial;
}



More information about the mythtv-users mailing list