summaryrefslogtreecommitdiff
path: root/seduatmo.c
diff options
context:
space:
mode:
Diffstat (limited to 'seduatmo.c')
-rw-r--r--seduatmo.c510
1 files changed, 510 insertions, 0 deletions
diff --git a/seduatmo.c b/seduatmo.c
new file mode 100644
index 0000000..2764603
--- /dev/null
+++ b/seduatmo.c
@@ -0,0 +1,510 @@
+/*
+ * seduatmo.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: seduatmo.c,v 1.64 2012/11/28 06:29:24 wendel Exp $
+ */
+
+#include <vdr/plugin.h>
+
+#include "seduthread.h"
+#include "config.h"
+#include "ledsconf.h"
+
+//***************************************************************************
+//
+//***************************************************************************
+
+static const char *VERSION = "0.0.3";
+static const char *DESCRIPTION = "sedu ambi light control with data from softhddevice";
+static const char *MAINMENUENTRY = "Seduatmo";
+
+//***************************************************************************
+// Setup
+//***************************************************************************
+
+class cSeduSetup : public cMenuSetupPage, public cSeduService
+{
+ public:
+
+ cSeduSetup();
+
+ protected:
+
+ virtual void Setup();
+ virtual eOSState ProcessKey(eKeys Key);
+ virtual void Store();
+
+ const char* seduModes[smCount];
+ const char* cineBars[cbCount];
+ const char* seduRGBOrders[6];
+ int rgbOrderIndex;
+
+ cSeduConfig data;
+};
+
+//***************************************************************************
+// Plugin
+//***************************************************************************
+
+class cPluginSeduatmo : public cPlugin
+{
+ public:
+
+ cPluginSeduatmo(void);
+ virtual ~cPluginSeduatmo();
+ virtual const char* Version(void) { return VERSION; }
+ virtual const char* Description(void) { return DESCRIPTION; }
+ virtual const char* CommandLineHelp(void) { return 0; }
+ virtual bool ProcessArgs(int argc, char* argv[]);
+ virtual bool Initialize(void);
+ virtual bool Start(void);
+ virtual void Stop(void);
+ virtual void Housekeeping(void) { };
+ virtual void MainThreadHook(void) { };
+ virtual cString Active(void);
+ virtual time_t WakeupTime(void);
+ virtual const char* MainMenuEntry(void) { return cfg.showMainmenu ? MAINMENUENTRY : 0; }
+ virtual cOsdObject* MainMenuAction(void);
+ virtual cMenuSetupPage* SetupMenu(void) { return new cSeduSetup; }
+ virtual bool SetupParse(const char* Name, const char* Value);
+ virtual bool Service(const char* Id, void* Data = NULL);
+ virtual const char** SVDRPHelpPages(void);
+ virtual cString SVDRPCommand(const char* Command, const char* Option, int &ReplyCode);
+
+ int startAtmo();
+ int stopAtmo();
+ cSeduThread* update;
+
+ int isRunning()
+ {
+ if (!update)
+ return no;
+
+ return update->isRunning();
+ }
+
+ private:
+
+ cLedConfs ledConfs;
+};
+
+//***************************************************************************
+// Plugins Main Menu
+//***************************************************************************
+
+class cSeduPluginMenu : public cMenuSetupPage
+{
+ public:
+
+ cSeduPluginMenu(const char* title, cPluginSeduatmo* aPlugin);
+ virtual ~cSeduPluginMenu() { };
+
+ virtual eOSState ProcessKey(eKeys key);
+
+ protected:
+
+ void Store();
+ cPluginSeduatmo* plugin;
+ int effectSpeed;
+};
+
+cSeduPluginMenu::cSeduPluginMenu(const char* title, cPluginSeduatmo* aPlugin)
+{
+ SetTitle(title ? title : "");
+ plugin = aPlugin;
+ effectSpeed = cfg.effectSpeed;
+
+ Clear();
+
+ cOsdMenu::Add(new cMenuEditStraItem(tr("View Mode"),
+ (int*)&cfg.viewMode,
+ (int)cSeduService::vmCount,
+ cSeduService::viewModes));
+
+ Add(new cMenuEditIntItem(tr("Fixed Color Red"), &cfg.fixedR, 0, 255));
+ Add(new cMenuEditIntItem(tr("Fixed Color Green"), &cfg.fixedG, 0, 255));
+ Add(new cMenuEditIntItem(tr("Fixed Color Blue"), &cfg.fixedB, 0, 255));
+
+ Add(new cMenuEditIntItem(tr("Effect Speed [ms]"), &effectSpeed, 100, 5000));
+
+ SetHelp(0, 0, 0, 0);
+
+ Display();
+}
+
+//***************************************************************************
+// Process Key
+//***************************************************************************
+
+eOSState cSeduPluginMenu::ProcessKey(eKeys key)
+{
+ eOSState state = cOsdMenu::ProcessKey(key);
+
+ if (key == kLeft || key == kRight)
+ {
+ if (cfg.viewMode == cSeduService::vmDetached && plugin->isRunning())
+ plugin->stopAtmo();
+ else if (cfg.viewMode != cSeduService::vmDetached && !plugin->isRunning())
+ plugin->startAtmo();
+
+ Display();
+ }
+
+ if (key == kOk)
+ {
+ cfg.effectSpeed = effectSpeed;
+ Store();
+
+ return osEnd;
+ }
+
+ return state;
+}
+
+void cSeduPluginMenu::Store()
+{
+ plugin->SetupStore("FixedColorRed", cfg.fixedR);
+ plugin->SetupStore("FixedColorGreen", cfg.fixedG);
+ plugin->SetupStore("FixedColorBlue", cfg.fixedB);
+ plugin->SetupStore("ViewMode", (int)cfg.viewMode);
+ plugin->SetupStore("EffectSpeed", cfg.effectSpeed);
+
+ Setup.Save();
+}
+
+//***************************************************************************
+// Plugin
+//***************************************************************************
+
+cPluginSeduatmo::cPluginSeduatmo(void)
+{
+ update = 0;
+}
+
+cPluginSeduatmo::~cPluginSeduatmo()
+{
+ stopAtmo();
+}
+
+bool cPluginSeduatmo::ProcessArgs(int argc, char* argv[])
+{
+ return true;
+}
+
+bool cPluginSeduatmo::Initialize(void)
+{
+ char* tmp;
+
+ asprintf(&tmp, "%s/%s", cPlugin::ConfigDirectory("seduatmo"), "seduatmo.conf");
+
+ if (!ledConfs.Load(tmp, true))
+ {
+ free(tmp);
+ return fail;
+ }
+
+ free(tmp);
+
+ cfg.createLeds(&ledConfs);
+
+ return true;
+}
+
+bool cPluginSeduatmo::Start(void)
+{
+ startAtmo();
+
+ return true;
+}
+
+int cPluginSeduatmo::startAtmo()
+{
+ if (update)
+ {
+ update->Stop();
+ delete update;
+ }
+
+ update = new cSeduThread();
+
+ if (cfg.grabWidth <= 0 || cfg.grabHeight <= 0 || !cfg.ledCount)
+ tell(0, "Error: Invalid configuration in seduatmo.conf, aborting");
+ else
+ update->Start();
+
+ return done;
+}
+
+int cPluginSeduatmo::stopAtmo()
+{
+ if (update)
+ update->Stop();
+
+ delete update;
+ update = 0;
+
+ return done;
+}
+
+void cPluginSeduatmo::Stop(void)
+{
+ stopAtmo();
+}
+
+cString cPluginSeduatmo::Active(void)
+{
+ return 0;
+}
+
+time_t cPluginSeduatmo::WakeupTime(void)
+{
+ return 0;
+}
+
+cOsdObject* cPluginSeduatmo::MainMenuAction(void)
+{
+ return new cSeduPluginMenu(MAINMENUENTRY, this);
+}
+
+bool cPluginSeduatmo::SetupParse(const char* Name, const char* Value)
+{
+ if (!strcasecmp(Name, "LogLevel")) cfg.loglevel = atoi(Value);
+ else if (!strcasecmp(Name, "ShowMainmenu")) cfg.showMainmenu = atoi(Value);
+ else if (!strcasecmp(Name, "ViewMode")) cfg.viewMode = (cSeduService::ViewMode)atoi(Value);
+
+ else if (!strcasecmp(Name, "DetectCineBars")) cfg.detectCineBars = (cSeduService::Cinebars)atoi(Value);
+
+ else if (!strcasecmp(Name, "Threshold")) cfg.threshold = atoi(Value);
+ else if (!strcasecmp(Name, "Gamma")) cfg.gamma = atoi(Value);
+ else if (!strcasecmp(Name, "Frequence")) cfg.frequence = atoi(Value);
+ else if (!strcasecmp(Name, "Blacklevel")) cfg.black = atoi(Value);
+ else if (!strcasecmp(Name, "Smoothness")) cfg.average = atoi(Value);
+
+ else if (!strcasecmp(Name, "HorizontalDepth")) cfg.xDeep = atoi(Value);
+ else if (!strcasecmp(Name, "VerticalDepth")) cfg.yDeep = atoi(Value);
+
+ else if (!strcasecmp(Name, "LevelRed")) cfg.adjRed = atoi(Value);
+ else if (!strcasecmp(Name, "LevelGreen")) cfg.adjGreen = atoi(Value);
+ else if (!strcasecmp(Name, "LevelBlue")) cfg.adjBlue = atoi(Value);
+
+ else if (!strcasecmp(Name, "FixedColorRed")) cfg.fixedR = atoi(Value);
+ else if (!strcasecmp(Name, "FixedColorGreen")) cfg.fixedG = atoi(Value);
+ else if (!strcasecmp(Name, "FixedColorBlue")) cfg.fixedB = atoi(Value);
+ else if (!strcasecmp(Name, "EffectSpeed")) cfg.effectSpeed = atoi(Value);
+
+ else if (!strcasecmp(Name, "SeduMode")) cfg.seduMode = (cSeduService::SeduMode)atoi(Value);
+ else if (!strcasecmp(Name, "SeduRGBOrder")) strcpy(cfg.seduRGBOrder, Value);
+
+ else
+ return false;
+
+ return true;
+}
+
+bool cPluginSeduatmo::Service(const char* Id, void* Data)
+{
+ return false;
+}
+
+cString cPluginSeduatmo::SVDRPCommand(const char* Command, const char* Option, int &ReplyCode)
+{
+ if (!strcasecmp(Command, "MODE"))
+ {
+ if (Option && strcasecmp(Option, "atmo") == 0)
+ {
+ cfg.viewMode = cSeduService::vmAtmo;
+ startAtmo();
+ ReplyCode = 550;
+ return "atmo mode activated";
+ }
+ else if (Option && strcasecmp(Option, "fixed") == 0)
+ {
+ cfg.viewMode = cSeduService::vmFixedCol;
+ startAtmo();
+ ReplyCode = 550;
+ return "fixed color activated";
+ }
+ else if (Option && strcasecmp(Option, "rainbow") == 0)
+ {
+ cfg.viewMode = cSeduService::vmRainbow;
+ startAtmo();
+ ReplyCode = 550;
+ return "rainbow effect activated";
+ }
+ else if (Option && strcasecmp(Option, "wheel") == 0)
+ {
+ cfg.viewMode = cSeduService::vmColorWheel;
+ startAtmo();
+ ReplyCode = 550;
+ return "color wheel effect activated";
+ }
+ else if (Option && strcasecmp(Option, "wheelstatic") == 0)
+ {
+ cfg.viewMode = cSeduService::vmColorWheelStatic;
+ startAtmo();
+ ReplyCode = 550;
+ return "static color wheel activated";
+ }
+ else if (Option && strcasecmp(Option, "black") == 0)
+ {
+ cfg.viewMode = cSeduService::vmBlack;
+ startAtmo();
+
+ ReplyCode = 550;
+ return "stripes black";
+ }
+ else if (Option && strcasecmp(Option, "detach") == 0)
+ {
+ cfg.viewMode = cSeduService::vmDetached;
+ stopAtmo();
+
+ ReplyCode = 550;
+ return "stripes detached";
+ }
+ else
+ {
+ ReplyCode = 901;
+ return "Error: Unexpected option";
+ }
+ }
+
+ return 0;
+}
+
+const char** cPluginSeduatmo::SVDRPHelpPages(void)
+{
+ static const char* HelpPages[] =
+ {
+ "MODE <mode>\n"
+ " Set mode {atmo|fixed|rainbow|wheel|wheelstatic|black|detach}\n",
+ 0
+ };
+
+ return HelpPages;
+}
+
+//***************************************************************************
+// Class Setup Menu
+//***************************************************************************
+//***************************************************************************
+// Object
+//***************************************************************************
+
+cSeduSetup::cSeduSetup()
+{
+ data = cfg;
+ data.copyLeds(&cfg);
+
+ // sedu mode
+
+ seduModes[0] = "miniDMX";
+ seduModes[1] = "tpm2";
+
+ // rgb order
+
+ seduRGBOrders[0] = "RGB";
+ seduRGBOrders[1] = "RBG";
+ seduRGBOrders[2] = "BGR";
+ seduRGBOrders[3] = "BRG";
+ seduRGBOrders[4] = "GBR";
+ seduRGBOrders[5] = "GRB";
+
+ for (rgbOrderIndex = 0; rgbOrderIndex < 6; rgbOrderIndex++)
+ {
+ if (strcasecmp(seduRGBOrders[rgbOrderIndex], data.seduRGBOrder) == 0)
+ break;
+ }
+
+ if (rgbOrderIndex >= 6)
+ rgbOrderIndex = 0;
+
+ // Cinema Bars
+
+ cineBars[0] = "Horizontal";
+ cineBars[1] = "Vertical";
+ cineBars[2] = "Both";
+
+ Setup();
+}
+
+//***************************************************************************
+// Setup
+//***************************************************************************
+
+void cSeduSetup::Setup()
+{
+ Clear();
+
+ Add(new cMenuEditIntItem(tr("Log level"), &data.loglevel, 0, 3));
+ Add(new cMenuEditBoolItem(tr("Show mainmenu"), &data.showMainmenu));
+
+ Add(new cMenuEditIntItem(tr("Frequence [Hz]"), &data.frequence, 1, 100));
+
+ Add(new cMenuEditStraItem(tr("Detect cinema bars"), (int*)&data.detectCineBars, 3, cineBars));
+
+ Add(new cMenuEditIntItem(tr("Threshold"), &data.threshold, 0, 255));
+ Add(new cMenuEditIntItem(tr("Gamma (10-30)"), &data.gamma, 10, 30));
+ Add(new cMenuEditIntItem(tr("Horizontal depth"), &data.xDeep, 0, 5));
+ Add(new cMenuEditIntItem(tr("Vertical depth"), &data.yDeep, 0, 5));
+ Add(new cMenuEditIntItem(tr("Smoothness"), (int*)&data.average, 1, 100));
+ Add(new cMenuEditIntItem(tr("Blacklevel"), &data.black, 0, 255));
+
+ Add(new cMenuEditIntItem(tr("Level red [%]"), &data.adjRed, 0, 100));
+ Add(new cMenuEditIntItem(tr("Level green [%]"), &data.adjGreen, 0, 100));
+ Add(new cMenuEditIntItem(tr("Level blue [%]"), &data.adjBlue, 0, 100));
+
+ Add(new cMenuEditStraItem(tr("SEDU mode"), (int*)&data.seduMode, 2, seduModes));
+ Add(new cMenuEditStraItem(tr("SEDU RGB order"), &rgbOrderIndex, 6, seduRGBOrders));
+}
+
+eOSState cSeduSetup::ProcessKey(eKeys Key)
+{
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ // nothing yet ..
+
+ return state;
+}
+
+void cSeduSetup::Store()
+{
+ strcpy(data.seduRGBOrder, seduRGBOrders[rgbOrderIndex]);
+
+ cfg = data;
+ cfg.copyLeds(&data);
+
+ SetupStore("LogLevel", data.loglevel);
+ SetupStore("ShowMainmenu", data.showMainmenu);
+ SetupStore("ViewMode", (int)data.viewMode);
+
+ SetupStore("DetectCineBars", data.detectCineBars);
+
+ SetupStore("Frequence", data.frequence);
+ SetupStore("Threshold", data.threshold);
+ SetupStore("Gamma", data.gamma);
+ SetupStore("Blacklevel", data.black);
+ SetupStore("Smoothness", data.average);
+
+ SetupStore("HorizontalDepth", data.xDeep);
+ SetupStore("VerticalDepth", data.yDeep);
+
+ SetupStore("LevelRed", data.adjRed);
+ SetupStore("LevelGreen", data.adjGreen);
+ SetupStore("LevelBlue", data.adjBlue);
+
+ SetupStore("FixedColorRed", data.fixedR);
+ SetupStore("FixedColorGreen", data.fixedG);
+ SetupStore("FixedColorBlue", data.fixedB);
+ SetupStore("EffectSpeed", data.effectSpeed);
+
+ SetupStore("SeduMode", data.seduMode);
+ SetupStore("SeduRgbOrder", data.seduRGBOrder);
+}
+
+//***************************************************************************
+// VDR Internal
+//***************************************************************************
+
+VDRPLUGINCREATOR(cPluginSeduatmo);