Neil Bird wrote:

Around about 09/08/05 02:29, Craig Tinson typed ...

I use redeye serial too.. but with a *very* simple one line bash script.. would be interested in what you've done with redeye.c and the script too..


Okey-doke. I make no pretention that I'm the original author/modifier! The 'digibox.c' [née red_eye.c] and its Makefile I purloined from somewhere and then fine-tuned to speed it up (near-instant channel changes now).

The skychannel bash script (which does the deed from Myth & uses digibox) is pretty much my own, but with some file-locking thrown in. I did purloin the file locking originally, but I think I completely re-wrote the mechanism after a while.


  usage: skychannel <channum>    [100 <= channum <= 999]

Copes with turning on the digibox if its off, and also (as it's once happened to me while I was hammering another remote at the exact same time the script ran) tries turning it on a second time in case the first power-on got missed.

  Also blats the zap-banner upon channel change (as Myth provides one).

[don't forget Sky now has a setup option to timeout the little red dot interactive logo things]

Also hangs about for a little over 4 hours and turns the box off (unless called again in the meantime) to 'reduce' power and ensure the box gets resets to cope with S/W updates, etc. It's a timeout as I couldn't easily tell when progs. finished and deserved a power-off. 4 hours seemed enough (if you think you'll record individual progs. longer that that, change the timeout).

------------------------------------------------------------------------

#include <unistd.h>
#include <stdio.h>                /* Standard input/output definitions */
#include <string.h>               /* String function definitions */
#include <unistd.h>               /* UNIX standard function definitions */
#include <fcntl.h>                /* File control definitions */
#include <errno.h>                /* Error number definitions */
#include <asm/ioctls.h>
#include <asm/termios.h>  /* POSIX terminal control definitions */
#include <time.h>

#ifndef COM_PORT
# define COM_PORT               "/dev/ttyS0"
#endif

#ifndef WAIT_TIME
# define WAIT_TIME              2
#endif

#ifndef DEBUG
# define DEBUG                  0
#endif

static int debug = DEBUG;

/* the "RTS" line is actually the DTR line in linux */
#ifdef linux
# define BIT_TO_TWIDDLE         TIOCM_DTR
#else
# define BIT_TO_TWIDDLE         TIOCM_RTS
#endif

/*
* open_port() - Open serial port
* returns the file descriptor on success or -1 on error
*/
int open_port(char *com_port)
{
 int fd;                        /* file descriptor for the port */
 struct termios options;

 fd = open (com_port, O_WRONLY | O_NOCTTY | O_NDELAY);
 if (fd == -1)
 {
   /* Could not open the port. */
   perror ("open_port(): unable to open com port");
   exit (-1);
 }
 else
 {
   fcntl (fd, F_SETFL, 0);
 }

 /* get the current options for the port */
 tcgetattr (fd, &options);

 /* Set the baud rates to 9600 */
 cfsetispeed (&options, B9600);
 cfsetospeed (&options, B9600);

 /* enable the receiver and set local mode */
 options.c_cflag |= (CLOCAL);
 options.c_cflag &= ~PARENB;
 options.c_cflag &= ~CSTOPB;
 options.c_cflag &= ~CSIZE;
 options.c_cflag |= CS8;
 options.c_cflag &= ~CREAD;
 options.c_cflag &= ~CRTSCTS;
 options.c_iflag &= ~(IXON | IXOFF | IXANY);

 /* set the new options for the port */
 tcsetattr (fd, TCSANOW, &options);
 return (fd);
}

void set_rts(int fd)
{
 int status;
 int bitset = BIT_TO_TWIDDLE;
 ioctl (fd, TIOCMGET, &status);
 if (debug)
 {
   if (status & bitset)
   {
     printf("RTS bit is set\n");
   }
   else
   {
     printf("RTS bit is unset\n");
   }
 }
 status |= bitset;
 ioctl (fd, TIOCMSET, &status);
 ioctl (fd, TIOCMGET, &status);
 if (status & bitset)
 {
   if (debug) printf("RTS bit set ok\n");
 }
 else
 {
   perror("set_rts(): failed to set RTS bit");
   exit(-1);
 }
}

int main (int argc, char **argv)
{
 int fd;
 char *com_port = COM_PORT;
 int n;
 char *data;
 int wait_time = WAIT_TIME;

 if (argc == 1 || argc > 4)
 {
     printf("usage: digibox codestring [waittime [device]]\n");
     return -1;
 }

 data = argv[1];
 if (argc > 2)
     wait_time = atoi(argv[2]);
 if (argc > 3)
     com_port = argv[3];

 if (debug) printf("opening port for %s and setting RTS\n", com_port);
 fd = open_port(com_port);
 set_rts (fd);

 /* needed to power up the IR system */
 {
   int done = 0;
   struct timespec poweruptime;
   poweruptime.tv_sec = 0;
   poweruptime.tv_nsec = 20000000;
   while (!done)
   {
     int status = nanosleep(&poweruptime,&poweruptime);
     if (status == 0)
     {
       done = 1;
     }
     else if (status == -1)
     {
       if (errno != EINTR)
       {
         sleep(1);
         done = 1;
       }
     }
   }
 }

 if (debug) printf("writing data (\"%s\") now\n",data);
 n = write (fd, data, strlen (data));
 if (n < 0)
 {
   perror("main(): write failed");
   exit(-1);
 }
 if (debug) printf("data written\n");
 tcdrain (fd);
 if (wait_time > 0)
 {
   if (debug) printf("sleeping for %d seconds\n",wait_time);
   sleep (wait_time);
 }
 if (debug) printf("start close\n");
 close (fd);
 if (debug) printf("finished\n");

 return 0;
}
------------------------------------------------------------------------

#
# Makefile to build digibox interface
#

#
# where to install binary
#
INSTALLDIR=/usr/local/bin

#
# which serial port the device is connected to
#
COM_PORT=\"/dev/ttyS0\"

#
# seconds to wait after sending the command before finishing
# see comment about about milliseconds
#
WAIT_TIME=2

#
# this should be fairly obvious!
# do you want debugging output
# 0=none, 1=some
#
DEBUG=0

CFLAGS=-DCOM_PORT=${COM_PORT} -DWAIT_TIME=${WAIT_TIME} -DDEBUG=${DEBUG}

all: digibox

digibox: digibox.o
        cc -o digibox digibox.o

install: digibox
        install digibox ${INSTALLDIR}

clean:
        rm digibox.o

------------------------------------------------------------------------

#!/bin/bash

# Debug
##exec 1>/tmp/skychannel.dbg
##exec 2>&1
##set -x -v
##chmod a+rw /tmp/skychannel


# Locking functions
LOCKFILE=/tmp/skychannel.lock

function locksc()  {
   if lockfile -1 -r 10 $LOCKFILE >/dev/null 2>&1;  then
       return 0
   else
       exit 1
   fi
}

function unlocksc()  {
   rm -f $LOCKFILE >/dev/null 2>&1;
}


# Exit if no args.
[ -z "$1" ] && exit 1

# Jump into b/g for Myth
(
   subpid=$!

   STAT=/tmp/skychannel
   PATH=${PATH}:/usr/local/bin


   # Turn off?
   if [ "$1" = "off" ]; then

       # Wait 4 mins., then find out time
       sleep $((4*30))
       now=`date '+%s'`

       # Get last channel-change
       locksc
       . $STAT
       echo "$2" > /tmp/skychannel-off

       # Is it more than 25 mins, ago?
       # TBD

       unlocksc


   # Cope with Sky channels
   elif [ $1 -ge 100 -a $1 -lt 1000 ]; then

       # Break down channel digits
       channel=`printf '%03d' $1`
       chno=$channel
       d1=$((chno/100))
       chno=$(( chno-(d1*100) ))
       d2=$((chno/10))
       chno=$(( chno-(d2*10) ))
       d3=$chno

       # Assert ownership
       locksc
       [ -f $STAT ] && . $STAT
       echo -e "SCPID=$subpid\nSCCHAN=$channel\nSCTIME=`date '+%s'`" > $STAT

       # Kill previous script
       [ "$SCPID" != ""  -a  -d /proc/$SCPID ]  &&  kill -9 $SCPID >/dev/null 
2>&1

       # Change channel, or power up
       digibox "${d1}${d2}${d3}KT"
       unlocksc

       # Wait a bit then check to see if we've been called since
       sleep 1
       locksc
       . $STAT
       # Called again since?
       if [ $SCPID -ne $subpid ]; then
           # Yep;  abort
           unlocksc
           exit 0
       fi

       # Nope, our channel still stands (also try powering up again just in 
case last code got missed)
       digibox "K${d1}${d2}${d3}KT"
       unlocksc

       # Wait a bit more then check to see if we've been called since
       sleep 5
       locksc
       . $STAT
       # Called again since?
       if [ $SCPID -ne $subpid ]; then
           # Yep;  abort
           unlocksc
           exit 0
       fi

       # Nope, our channel still stands
       digibox "K${d1}${d2}${d3}K"
       unlocksc

       # Turn off in 4:05
       sleep $((4*60*60+5*60))
       locksc
       . $STAT
       # Called again since?
       if [ $SCPID -eq $subpid ]; then
           # Nope;  turn off box (4 s. sequence)
           digibox 'T!!!!K!!!!P' 4
       fi
       unlocksc
   fi
) &

# vim: set et sts=4 ts=4 sw=4 ai :
------------------------------------------------------------------------

_______________________________________________
mythtv-users mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users

Hi Neil

Hope you can help - the program you attached doesn't compile under FC4.. with the following:

[EMAIL PROTECTED] video]# make
cc -DCOM_PORT=\"/dev/ttyS0\" -DWAIT_TIME=2 -DDEBUG=0 -c -o digibox.o digibox.c
digibox.c: In function âopen_portâ:
digibox.c:46: warning: incompatible implicit declaration of built-in function âexitâ
digibox.c: In function âset_rtsâ:
digibox.c:101: warning: incompatible implicit declaration of built-in function âexitâ
digibox.c: In function âmainâ:
digibox.c:158: warning: incompatible implicit declaration of built-in function âexitâ
cc -o digibox digibox.o
[EMAIL PROTECTED] video]#


to try it out I removed the exit calls and it then compiles.. but when I try to run it it seg faults.

any ideas? would love to use this rather than the one that comes with the redeye.. *much* quicker and more reliable

Thanks

Craig


_______________________________________________
mythtv-users mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users

Reply via email to