[mythtv-users] Re: add skybox to my MythTV system
Craig Tinson
craig at 8010.co.uk
Tue Sep 6 16:52:30 UTC 2005
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
>mythtv-users at mythtv.org
>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:
[root at mythtv 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
[root at mythtv 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
More information about the mythtv-users
mailing list