summaryrefslogtreecommitdiff
path: root/lcdproc.c
diff options
context:
space:
mode:
authorMartin Hammerschmid <linux@home.pages.at>2002-07-21 19:46:06 +0200
committerMartin Hammerschmid <linux@home.pages.at>2002-07-21 19:46:06 +0200
commitb49a01e5a6304aeb0b6ad20c4d74468e7d19ef47 (patch)
tree95ff43114959fe9d1df1ebda272fc901e9781d65 /lcdproc.c
downloadvdr-plugin-lcdproc-release/v0.0.1.tar.gz
vdr-plugin-lcdproc-release/v0.0.1.tar.bz2
Diffstat (limited to 'lcdproc.c')
-rw-r--r--lcdproc.c299
1 files changed, 299 insertions, 0 deletions
diff --git a/lcdproc.c b/lcdproc.c
new file mode 100644
index 0000000..d20ff80
--- /dev/null
+++ b/lcdproc.c
@@ -0,0 +1,299 @@
+/*
+ * status.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+
+#include <getopt.h>
+#include <ctype.h>
+#include <vdr/plugin.h>
+#include <vdr/status.h>
+#include <vdr/recording.h>
+#include "lcd.h"
+
+static const char *VERSION = "0.0.1";
+static const char *MAINMENUENTRY = NULL;
+#ifdef LCD_hd44780
+static const char *DESCRIPTION = "LCDproc using hd44780 output-mapping";
+#endif
+#ifdef LCD_CFontz
+static const char *DESCRIPTION = "LCDproc using CFontz output-mapping";
+#endif
+#ifdef LCD_nomap
+static const char *DESCRIPTION = "LCDproc using no output-mapping";
+#endif
+
+cLcd *LCDproc = new cLcd;
+bool replaymode=false;
+bool menumode=false;
+bool switched=false;
+bool group=false;
+char tempstringbuffer[80];
+char *LCDprocHOST=LCDHOST;
+unsigned int LCDprocPORT=LCDPORT;
+
+// ---
+
+class cLcdFeed : public cStatus {
+protected:
+ virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
+ virtual void Recording(const cDevice *Device, const char *Name);
+ virtual void Replaying(const cControl *DvbPlayerControl, const char *Name);
+ virtual void SetVolume(int Volume, bool Absolute);
+ virtual void OsdClear(void);
+ virtual void OsdTitle(const char *Title);
+ virtual void OsdStatusMessage(const char *Message);
+ virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue);
+ virtual void OsdCurrentItem(const char *Text);
+ virtual void OsdTextItem(const char *Text, bool Scroll);
+ virtual void OsdChannel(const char *Text);
+ virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle);
+ };
+
+
+void cLcdFeed::ChannelSwitch(const cDevice *Device, int ChannelNumber)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::ChannelSwitch %d %d", Device->CardIndex(), ChannelNumber);
+ if (ChannelNumber) {
+ LCDproc->SetLine(1,2," ");
+ LCDproc->SetLine(1,3," ");
+ switched = true;
+ } else switched = false;
+ if (Device) LCDproc->SetPrimaryDevice( (cDevice *) Device );
+}
+
+void cLcdFeed::Recording(const cDevice *Device, const char *Name)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::Recording %d %s", Device->CardIndex(), Name);
+ if (Name)
+ LCDproc->SetCardStat(Device->CardIndex(),2);
+ else
+ LCDproc->SetCardStat(Device->CardIndex(),1);
+}
+
+void cLcdFeed::Replaying(const cControl *DvbPlayerControl, const char *Name)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::Replaying %s", Name);
+ replaymode=(Name)?true:false;
+ if ( replaymode ) {
+ LCDproc->SetReplayDevice( (cDvbPlayerControl *) DvbPlayerControl);
+ LCDproc->SetMain(2, Name);
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 2); // Replaying
+ } else {
+ LCDproc->SetReplayDevice(NULL);
+ LCDproc->SetProgress(NULL);
+ LCDproc->SetLineC(1,1,tempstringbuffer);
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 1); // Title
+ }
+ menumode=false;
+}
+
+void cLcdFeed::SetVolume(int Volume, bool Absolute)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::SetVolume %d %d", Volume, Absolute);
+ LCDproc->ShowVolume( Volume, Absolute );
+}
+
+void cLcdFeed::OsdClear(void)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdClear");
+
+ if (replaymode)
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 2); // Replaying
+ else
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 1); // Title
+ menumode=false;
+ if (group) {LCDproc->SetLineC(1,1,tempstringbuffer); group=false; }
+}
+
+void cLcdFeed::OsdTitle(const char *Title)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdTitle '%s'", Title);
+ LCDproc->Clear(0);
+ LCDproc->SetTitle(Title);
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 0); // MENU
+ menumode=true;
+}
+
+void cLcdFeed::OsdStatusMessage(const char *Message)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdStatusMessage '%s'", Message);
+ if ( Message )
+ if ( menumode )
+ LCDproc->SetStatus(Message);
+ else
+ LCDproc->SetWarning(Message);
+}
+
+void cLcdFeed::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue);
+ LCDproc->SetHelp(0,Red, Green, Yellow, Blue);
+}
+
+void cLcdFeed::OsdCurrentItem(const char *Text)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdCurrentItem %s", Text);
+ LCDproc->SetMain(0,Text);
+}
+
+void cLcdFeed::OsdTextItem(const char *Text, bool Scroll)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdTextItem %s %d", Text, Scroll);
+ if (Text)
+ LCDproc->SummaryInit( (char *) Text);
+ else if (Scroll)
+ LCDproc->SummaryUp();
+ else
+ LCDproc->SummaryDown();
+ LCDproc->SummaryDisplay();
+}
+
+void cLcdFeed::OsdChannel(const char *Text)
+{
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdChannel %s", Text);
+ LCDproc->SetLineC(1,1,Text);
+
+ bool switching = group = !isdigit(Text[0]);
+ if (!group) strcpy(tempstringbuffer,Text);
+ for (unsigned int i=0; ( i<strlen(Text)-1 ) && !switching ; i++) {
+ switching= isdigit(Text[i]) && Text[i+1]=='-' ;
+ }
+
+ if (switched || switching)
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 1); // TITLE
+ else
+ LCDproc->SetThreadState( (cLcd::ThreadStates) 3); // MISC
+
+ switched=false; menumode=false;
+}
+
+void cLcdFeed::OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle)
+{
+ char buffer[25];
+ struct tm tm_r;
+ syslog(LOG_INFO, "lcdproc: cLcdFeed::OsdProgramme");
+ strftime(buffer, sizeof(buffer), "%R", localtime_r(&PresentTime, &tm_r));
+ syslog(LOG_INFO, "%5s %s", buffer, PresentTitle);
+ syslog(LOG_INFO, "%5s %s", "", PresentSubtitle);
+
+
+ if ( (!isempty(PresentTitle)) && (!isempty(PresentSubtitle)) )
+ LCDproc->SetRunning(false,buffer,PresentTitle,PresentSubtitle);
+ else if (!isempty(PresentTitle)) LCDproc->SetRunning(false,buffer,PresentTitle);
+
+
+ strftime(buffer, sizeof(buffer), "%R", localtime_r(&FollowingTime, &tm_r));
+ syslog(LOG_INFO, "%5s %s", buffer, FollowingTitle);
+ syslog(LOG_INFO, "%5s %s", "", FollowingSubtitle);
+
+ if ( (!isempty(FollowingTitle)) && (!isempty(FollowingSubtitle)) )
+ LCDproc->SetRunning(true,buffer,FollowingTitle,FollowingSubtitle);
+ else if (!isempty(FollowingTitle)) LCDproc->SetRunning(true,buffer,FollowingTitle);
+
+}
+
+// ---
+
+class cPluginLcd : public cPlugin {
+private:
+ // Add any member variables or functions you may need here.
+ cLcdFeed *lcdFeed;
+public:
+ cPluginLcd(void);
+ virtual ~cPluginLcd();
+ virtual const char *Version(void) { return VERSION; }
+ virtual const char *Description(void) { return DESCRIPTION; }
+ virtual const char *CommandLineHelp(void);
+ virtual bool ProcessArgs(int argc, char *argv[]);
+ virtual bool Start(void);
+ virtual void Housekeeping(void);
+ virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
+ virtual cOsdMenu *MainMenuAction(void);
+ virtual cMenuSetupPage *SetupMenu(void);
+ virtual bool SetupParse(const char *Name, const char *Value);
+ };
+
+cPluginLcd::cPluginLcd(void)
+{
+ // Initialize any member varaiables here.
+ // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
+ // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
+ lcdFeed = NULL;
+
+}
+
+cPluginLcd::~cPluginLcd()
+{
+ // Clean up after yourself!
+ delete lcdFeed;
+ delete LCDproc;
+}
+
+const char *cPluginLcd::CommandLineHelp(void)
+{
+ // Return a string that describes all known command line options.
+ return " -h <host>, --host <host> LCDproc host (default=localhost)\n -p <port>, --port <port> LCDproc port (default=13666)\n";
+
+}
+
+bool cPluginLcd::ProcessArgs(int argc, char *argv[])
+{
+ // Implement command line argument processing here if applicable.
+
+ static struct option long_options[] = {
+ { "host", required_argument, NULL, 'h' },
+ { "port", required_argument, NULL, 'p' },
+ { NULL }
+ };
+
+ int c;
+ while ((c = getopt_long(argc, argv, "h:p:", long_options, NULL)) != -1) {
+ switch (c) {
+ case 'h': LCDprocHOST=optarg;
+ break;
+ case 'p': LCDprocPORT=atoi(optarg);
+ break;
+ default: return false;
+ }
+ }
+ return true;
+}
+
+bool cPluginLcd::Start(void)
+{
+ // Start any background activities the plugin shall perform.
+ lcdFeed = new cLcdFeed;
+ if ( LCDproc->Connect(LCDprocHOST,LCDprocPORT) ) {
+ syslog(LOG_INFO, "connection to LCDd at %s:%d established.",LCDprocHOST,LCDprocPORT);
+ return true;
+ }
+ return false;
+}
+
+void cPluginLcd::Housekeeping(void)
+{
+ // Perform any cleanup or other regular tasks.
+}
+
+cOsdMenu *cPluginLcd::MainMenuAction(void)
+{
+ // Perform the action when selected from the main VDR menu.
+ return NULL;
+}
+
+cMenuSetupPage *cPluginLcd::SetupMenu(void)
+{
+ // Return a setup menu in case the plugin supports one.
+ return NULL;
+}
+
+bool cPluginLcd::SetupParse(const char *Name, const char *Value)
+{
+ // Parse your own setup parameters and store their values.
+ return false;
+}
+
+VDRPLUGINCREATOR(cPluginLcd); // Don't touch this!