#include <malloc.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#include <linux/fb.h>
#include <linux/vt.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/perm.h>

#include <vdr/plugin.h>
#include <vdr/thread.h>
#include <vdr/menuitems.h>

#include <asm/io.h>

static const char *VERSION        = "0.0.1";
static const char *DESCRIPTION    = "An automagic line-selector";

#define PARALLELPORT 0x378
#define VDRTERMINAL 8

class cWorkThread : public cThread {

 public:

  cWorkThread()
  {
  }

  ~cWorkThread()
  {
   Cancel();
   ioperm(PARALLELPORT,1,1);
   outb(0, PARALLELPORT);
  }
  void Action(void);
 };

void cWorkThread::Action(void)
{
 int tty_file_descriptor;
 struct vt_stat terminal_status;

 tty_file_descriptor = open("/dev/tty0", O_RDWR);
 if (tty_file_descriptor == -1)
 {
  return;
 }

 ioperm(PARALLELPORT,1,1);

 while(1) 
 {

  usleep(100000);

  if (ioctl (tty_file_descriptor, VT_GETSTATE, &terminal_status) == -1) 
  {
   return;
  }

  if( terminal_status.v_active == VDRTERMINAL )
  {
   outb(0xff, PARALLELPORT);
  }
  else
  {
   outb(0, PARALLELPORT);
  }
 }
}

class cPluginSignal : public cPlugin {

protected:
 cWorkThread *w;

public:
  cPluginSignal(void);
  virtual ~cPluginSignal();
  virtual const char *Version(void) { return VERSION; }
  virtual const char *Description(void) { return DESCRIPTION; }
  virtual bool Start(void);
  };

cPluginSignal::cPluginSignal(void)
{
}

cPluginSignal::~cPluginSignal()
{
}

bool cPluginSignal::Start(void)
{
  w=new cWorkThread();
  w->Start();
  return true;
}

VDRPLUGINCREATOR(cPluginSignal); // Don't touch this!


