summaryrefslogtreecommitdiff
path: root/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugin.c')
-rw-r--r--plugin.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/plugin.c b/plugin.c
new file mode 100644
index 0000000..293f6c9
--- /dev/null
+++ b/plugin.c
@@ -0,0 +1,246 @@
+/*
+ * GraphLCD plugin for the Video Disk Recorder
+ *
+ * plugin.c - main plugin class
+ *
+ * This file is released under the GNU General Public License. Refer
+ * to the COPYING file distributed with this package.
+ *
+ * (c) 2001-2004 Carsten Siebholz <c.siebholz AT t-online.de>
+ * (c) 2004 Andreas Regel <andreas.regel AT powarman.de>
+ */
+
+#include <getopt.h>
+
+#include <glcddrivers/config.h>
+#include <glcddrivers/drivers.h>
+
+#include "display.h"
+#include "global.h"
+#include "i18n.h"
+#include "menu.h"
+
+#include <vdr/plugin.h>
+
+
+static const char *VERSION = "0.1.5";
+static const char *DESCRIPTION = "Output to graphic LCD";
+static const char *MAINMENUENTRY = NULL;
+
+static const char * kDefaultConfigFile = "/etc/graphlcd.conf";
+
+
+class cPluginGraphLCD : public cPlugin
+{
+private:
+ // Add any member variables or functions you may need here.
+ std::string mConfigName;
+ std::string mDisplayName;
+ GLCD::cDriver * mLcd;
+ cGraphLCDDisplay * mDisplay;
+
+public:
+ cPluginGraphLCD();
+ virtual ~cPluginGraphLCD();
+ virtual const char * Version() { return VERSION; }
+ virtual const char * Description() { return tr(DESCRIPTION); }
+ virtual const char * CommandLineHelp();
+ virtual bool ProcessArgs(int argc, char * argv[]);
+ virtual bool Initialize();
+ virtual bool Start();
+ virtual void Housekeeping();
+ virtual void MainThreadHook(void);
+ virtual const char * MainMenuEntry() { return MAINMENUENTRY; }
+ virtual cOsdObject * MainMenuAction();
+ virtual cMenuSetupPage * SetupMenu();
+ virtual bool SetupParse(const char * Name, const char * Value);
+};
+
+cPluginGraphLCD::cPluginGraphLCD()
+: mConfigName(""),
+ mDisplayName("")
+{
+ mLcd = NULL;
+}
+
+cPluginGraphLCD::~cPluginGraphLCD()
+{
+ delete mDisplay;
+ if (mLcd)
+ mLcd->DeInit();
+ delete mLcd;
+}
+
+const char * cPluginGraphLCD::CommandLineHelp()
+{
+ return " -c CFG, --config=CFG use CFG as driver config file\n"
+ " -d DISP, --display=DISP use display DISP for output\n";
+}
+
+bool cPluginGraphLCD::ProcessArgs(int argc, char * argv[])
+{
+ static struct option long_options[] =
+ {
+ {"config", required_argument, NULL, 'c'},
+ {"display", required_argument, NULL, 'd'},
+ {NULL}
+ };
+
+ int c;
+ int option_index = 0;
+ while ((c = getopt_long(argc, argv, "c:d:", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ mConfigName = optarg;
+ break;
+
+ case 'd':
+ mDisplayName = optarg;
+ break;
+
+ default:
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool cPluginGraphLCD::Initialize()
+{
+ unsigned int displayNumber = 0;
+ const char * cfgDir;
+
+ RegisterI18n(Phrases);
+
+ if (mConfigName.length() == 0)
+ {
+ mConfigName = kDefaultConfigFile;
+ isyslog("graphlcd plugin: No config file specified, using default (%s).\n", mConfigName.c_str());
+ }
+ if (GLCD::Config.Load(mConfigName) == false)
+ {
+ esyslog("graphlcd plugin: Error loading config file!\n");
+ return false;
+ }
+ if (GLCD::Config.driverConfigs.size() > 0)
+ {
+ if (mDisplayName.length() > 0)
+ {
+ for (displayNumber = 0; displayNumber < GLCD::Config.driverConfigs.size(); displayNumber++)
+ {
+ if (GLCD::Config.driverConfigs[displayNumber].name == mDisplayName)
+ break;
+ }
+ if (displayNumber == GLCD::Config.driverConfigs.size())
+ {
+ esyslog("graphlcd plugin: ERROR: Specified display %s not found in config file!\n", mDisplayName.c_str());
+ return false;
+ }
+ }
+ else
+ {
+ isyslog("graphlcd plugin: WARNING: No display specified, using first one (%s).\n", GLCD::Config.driverConfigs[0].name.c_str());
+ displayNumber = 0;
+ mDisplayName = GLCD::Config.driverConfigs[0].name;
+ }
+ }
+ else
+ {
+ esyslog("graphlcd plugin: ERROR: No displays specified in config file!\n");
+ return false;
+ }
+
+ mLcd = GLCD::CreateDriver(GLCD::Config.driverConfigs[displayNumber].id, &GLCD::Config.driverConfigs[displayNumber]);
+ if (!mLcd)
+ {
+ esyslog("graphlcd plugin: ERROR: Failed creating display object %s\n", mDisplayName.c_str());
+ return false;
+ }
+
+ cfgDir = ConfigDirectory(PLUGIN_NAME);
+ if (!cfgDir)
+ return false;
+
+ mDisplay = new cGraphLCDDisplay();
+ if (!mDisplay)
+ return false;
+ if (mDisplay->Init(mLcd, cfgDir) != 0)
+ return false;
+
+ return true;
+}
+
+bool cPluginGraphLCD::Start()
+{
+ int count;
+
+ dsyslog("graphlcd plugin: waiting for display thread to get ready");
+ for (count = 0; count < 1200; count++)
+ {
+ if (mDisplay->Active())
+ {
+ dsyslog ("graphlcd plugin: display thread ready");
+ return true;
+ }
+#if VDRVERSNUM < 10314
+ usleep(100000);
+#else
+ cCondWait::SleepMs(100);
+#endif
+ }
+ dsyslog ("graphlcd plugin: timeout while waiting for display thread");
+ return false;
+}
+
+void cPluginGraphLCD::Housekeeping()
+{
+}
+
+void cPluginGraphLCD::MainThreadHook()
+{
+ if (mDisplay)
+ mDisplay->Tick();
+}
+
+cOsdObject * cPluginGraphLCD::MainMenuAction()
+{
+ return NULL;
+}
+
+cMenuSetupPage * cPluginGraphLCD::SetupMenu()
+{
+ return new cGraphLCDMenuSetup();
+}
+
+bool cPluginGraphLCD::SetupParse(const char * Name, const char * Value)
+{
+ if (!strcasecmp(Name, "PluginActive")) GraphLCDSetup.PluginActive = atoi(Value);
+ else if (!strcasecmp(Name, "ShowDateTime")) GraphLCDSetup.ShowDateTime = atoi(Value);
+ else if (!strcasecmp(Name, "ShowChannel")) GraphLCDSetup.ShowChannel = atoi(Value);
+ else if (!strcasecmp(Name, "ShowLogo")) GraphLCDSetup.ShowLogo = atoi(Value);
+ else if (!strcasecmp(Name, "ShowSymbols")) GraphLCDSetup.ShowSymbols = atoi(Value);
+ else if (!strcasecmp(Name, "ShowETSymbols")) GraphLCDSetup.ShowETSymbols = atoi(Value);
+ else if (!strcasecmp(Name, "ShowProgram")) GraphLCDSetup.ShowProgram = atoi(Value);
+ else if (!strcasecmp(Name, "ShowTimebar")) GraphLCDSetup.ShowTimebar = atoi(Value);
+ else if (!strcasecmp(Name, "ShowMenu")) GraphLCDSetup.ShowMenu = atoi(Value);
+ else if (!strcasecmp(Name, "ShowMessages")) GraphLCDSetup.ShowMessages = atoi(Value);
+ else if (!strcasecmp(Name, "ShowColorButtons")) GraphLCDSetup.ShowColorButtons = atoi(Value);
+ else if (!strcasecmp(Name, "ShowVolume")) GraphLCDSetup.ShowVolume = atoi(Value);
+ else if (!strcasecmp(Name, "ShowNotRecording")) GraphLCDSetup.ShowNotRecording = atoi(Value);
+ else if (!strcasecmp(Name, "IdentifyReplayType")) GraphLCDSetup.IdentifyReplayType = atoi(Value);
+ else if (!strcasecmp(Name, "ModifyReplayString")) GraphLCDSetup.ModifyReplayString = atoi(Value);
+ else if (!strcasecmp(Name, "ReplayLogo")) GraphLCDSetup.ReplayLogo = atoi(Value);
+ else if (!strcasecmp(Name, "ScrollMode")) GraphLCDSetup.ScrollMode = atoi(Value);
+ else if (!strcasecmp(Name, "ScrollSpeed")) GraphLCDSetup.ScrollSpeed = atoi(Value);
+ else if (!strcasecmp(Name, "ScrollTime")) GraphLCDSetup.ScrollTime = atoi(Value);
+ else if (!strcasecmp(Name, "BrightnessActive")) GraphLCDSetup.BrightnessActive = atoi(Value);
+ else if (!strcasecmp(Name, "BrightnessIdle")) GraphLCDSetup.BrightnessIdle = atoi(Value);
+ else if (!strcasecmp(Name, "BrightnessDelay")) GraphLCDSetup.BrightnessDelay = atoi(Value);
+ else return false;
+ return true;
+}
+
+VDRPLUGINCREATOR(cPluginGraphLCD); // Don't touch this!