001package ca.bc.webarts.tools.mythtv;
002
003import ca.bc.webarts.widgets.Util;
004
005import com.dpillay.tools.tail4j.model.TailContents;
006import com.dpillay.tools.tail4j.core.TailListener;
007
008public class TailDoerTailReseter<T> implements TailDoer<T>
009{
010  private String version_ = "0.6";
011  private TailListener<T> listener = null;
012  private boolean doReset_ = false;
013  private boolean immediateReset_ = false;
014  private String resetCommand = "/home/tgutwin/bin/setupHDPVRandLirc.sh";
015
016
017  public TailDoerTailReseter()
018  {
019    super();
020  }
021
022
023  public TailDoerTailReseter(TailListener<T> listener)
024  {
025    super();
026    this.listener = listener;
027  }
028
029
030  public TailListener<T> getListener() {
031    return listener;
032  }
033
034
035  public void setListener(TailListener<T> listener)
036  {
037    this.listener = listener;
038  }
039
040
041  @Override
042  public void doer(TailContents<T> tailContents)
043  {
044    long resetWaitTime = 15000;
045    String currDump = (String) tailContents.getContents();
046    //System.out.println(currDump);
047    System.out.print((doReset_?"!":"."));
048    if (   currDump.indexOf( "Tuning => Recorder Failed") >-1
049        || currDump.indexOf( "Error: Start encoding failed") >-1
050        || currDump.indexOf( "Stop(): Not running.") >-1)
051    {
052      immediateReset_ = true;
053      System.out.println("\n"+Util.createCurrentDateTimeStamp()+" Matched Recorder Error. Will reset immediately.");
054    }
055    // Check for "Error: Device error detected"
056    else if ( !doReset_ && currDump.indexOf( "Error: Device error detected") >-1 )
057    {
058      doReset_ = true;
059      System.out.println("\n"+Util.createCurrentDateTimeStamp()+" Matched Error. Will reset when done recording");
060    }
061
062    // then wait until current recording is done
063    // Check for "Finished Recording"
064    if (!immediateReset_ && doReset_ && currDump.indexOf( "Finished recording") >-1)
065    {
066      // wait 30 seconds then and reset
067      //call the reset
068      System.out.println("\n"+Util.createCurrentDateTimeStamp()+" Matched Done Recording. I will reset in "+(resetWaitTime/1000)+" seconds. then Ka-POW.\n");
069      Util.sleep(resetWaitTime);
070      System.out.println("\n"+Util.createCurrentDateTimeStamp()+" *!*!*! Ka-POW.\n");
071      Util.executeNativeApp(resetCommand, (java.util.Vector) null, false );
072      doReset_ = false;
073      System.out.println("\n\n"+Util.createCurrentDateTimeStamp()+" Reset Complete. I Will continue watching.");
074    }
075
076    if (immediateReset_ )
077    {
078      System.out.println("\n"+Util.createCurrentDateTimeStamp()+" ^%^%^% Ka-POW.\n");
079      Util.executeNativeApp(resetCommand, (java.util.Vector) null, false );
080      doReset_ = false;
081      immediateReset_ = false;
082      System.out.println("\n\n"+Util.createCurrentDateTimeStamp()+" Reset Complete. I Will continue watching.");
083    }
084
085  }
086
087
088  @Override
089  public T call() throws Exception {
090    TailContents<T> tailContents = null;
091    System.out.println("\n\nInitiating MythTVWatchdog (v"+version_+")...");
092    while ((tailContents = this.listener.poll()) != null)
093    {
094      this.doer(tailContents);
095    }
096    return null;
097  }
098}