/* * vdrboblight.c * * Copyright (C) 2013 - Christian Völlinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "config.h" #include "ambiservice.h" #include "ambithread.h" //*************************************************************************** // //*************************************************************************** static const char *VERSION = "0.0.1"; static const char *DESCRIPTION = "Boblight with data from softhddevice"; static const char *MAINMENUENTRY = "Boblight"; //*************************************************************************** // Setup //*************************************************************************** class cAmbiSetup : public cMenuSetupPage, public cAmbiService { public: cAmbiSetup(); protected: virtual void Setup(); virtual eOSState ProcessKey(eKeys Key); virtual void Store(); const char* cineBars[cbCount]; const char* seduRGBOrders[6]; int rgbOrderIndex; }; //*************************************************************************** // Plugin //*************************************************************************** class cPluginBoblight : public cPlugin { public: cPluginBoblight(void); virtual ~cPluginBoblight(); 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 cAmbiSetup; } 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(); cAmbiThread* update; int isRunning() { if (!update) return no; return update->isRunning(); } }; //*************************************************************************** // Plugins Main Menu //*************************************************************************** class cSeduPluginMenu : public cMenuSetupPage { public: cSeduPluginMenu(const char* title, cPluginBoblight* aPlugin); virtual ~cSeduPluginMenu() { }; virtual eOSState ProcessKey(eKeys key); protected: void Store() { } cPluginBoblight* plugin; }; cSeduPluginMenu::cSeduPluginMenu(const char* title, cPluginBoblight* aPlugin) { SetTitle(title ? title : ""); plugin = aPlugin; Clear(); cOsdMenu::Add(new cMenuEditStraItem(tr("View Mode"), (int*)&cfg.viewMode, (int)cAmbiService::vmCount, cAmbiService::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)); 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 == cAmbiService::vmDetached && plugin->isRunning()) plugin->stopAtmo(); else if (cfg.viewMode != cAmbiService::vmDetached && !plugin->isRunning()) plugin->startAtmo(); } if (state != osUnknown) return state; if (key == kOk) { SetupStore("FixedColorRed", cfg.fixedR); SetupStore("FixedColorGreen", cfg.fixedG); SetupStore("FixedColorBlue", cfg.fixedB); SetupStore("ViewMode", (int)cfg.viewMode); return osEnd; } return state; } //*************************************************************************** // Plugin //*************************************************************************** cPluginBoblight::cPluginBoblight(void) { update = 0; } cPluginBoblight::~cPluginBoblight() { stopAtmo(); } bool cPluginBoblight::ProcessArgs(int argc, char* argv[]) { return true; } bool cPluginBoblight::Initialize(void) { return true; } bool cPluginBoblight::Start(void) { startAtmo(); return true; } int cPluginBoblight::startAtmo() { if (update) { update->Stop(); delete update; } update = new cAmbiThread(); update->Start(); return done; } int cPluginBoblight::stopAtmo() { if (update) update->Stop(); delete update; update = 0; return done; } void cPluginBoblight::Stop(void) { stopAtmo(); } cString cPluginBoblight::Active(void) { return 0; } time_t cPluginBoblight::WakeupTime(void) { return 0; } cOsdObject* cPluginBoblight::MainMenuAction(void) { return new cSeduPluginMenu(MAINMENUENTRY, this); } bool cPluginBoblight::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 = (cAmbiService::ViewMode)atoi(Value); else if (!strcasecmp(Name, "DetectCineBars")) cfg.detectCineBars = (cAmbiService::Cinebars)atoi(Value); else if (!strcasecmp(Name, "Frequence")) cfg.frequence = atoi(Value); else if (!strcasecmp(Name, "Threshold")) cfg.threshold = atoi(Value); else if (!strcasecmp(Name, "Value")) cfg.value = atoi(Value); else if (!strcasecmp(Name, "Saturation")) cfg.saturation = atoi(Value); else if (!strcasecmp(Name, "Speed")) cfg.speed = atoi(Value); else if (!strcasecmp(Name, "Autospeed")) cfg.autospeed = atoi(Value); else if (!strcasecmp(Name, "Interpolation")) cfg.interpolation = atoi(Value); else if (!strcasecmp(Name, "Priority")) cfg.priority = 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 return false; return true; } bool cPluginBoblight::Service(const char* Id, void* Data) { return false; } cString cPluginBoblight::SVDRPCommand(const char* Command, const char* Option, int &ReplyCode) { if (!update) return "Error: Plugin not initialized!"; if (!strcasecmp(Command, "MODE")) { if (Option && strcasecmp(Option, "atmo") == 0) { cfg.viewMode = cAmbiService::vmAtmo; startAtmo(); ReplyCode = 550; return "atmo mode activated"; } else if (Option && strcasecmp(Option, "fixed") == 0) { cfg.viewMode = cAmbiService::vmFixedCol; startAtmo(); ReplyCode = 550; return "fixed color activated"; } else if (Option && strcasecmp(Option, "black") == 0) { cfg.viewMode = cAmbiService::vmBlack; startAtmo(); ReplyCode = 550; return "stripes black"; } else if (Option && strcasecmp(Option, "detach") == 0) { cfg.viewMode = cAmbiService::vmDetached; stopAtmo(); ReplyCode = 550; return "stripes detached"; } else { ReplyCode = 901; return "Error: Unexpected option"; } } return 0; } const char** cPluginBoblight::SVDRPHelpPages(void) { static const char* HelpPages[] = { "MODE \n" " Set mode {atmo|fixed|black|detach}\n", 0 }; return HelpPages; } //*************************************************************************** // Class Setup Menu //*************************************************************************** //*************************************************************************** // Object //*************************************************************************** cAmbiSetup::cAmbiSetup() { cineBars[0] = "Horizontal"; cineBars[1] = "Vertical"; cineBars[2] = "Both"; Setup(); } //*************************************************************************** // Setup //*************************************************************************** void cAmbiSetup::Setup() { Clear(); Add(new cMenuEditIntItem(tr("Log level"), &cfg.loglevel, 0, 3)); Add(new cMenuEditBoolItem(tr("Show mainmenu"), &cfg.showMainmenu)); Add(new cMenuEditIntItem(tr("Updaterate [Hz]"), &cfg.frequence, 1, 100)); Add(new cMenuEditStraItem(tr("Detect cinema bars"), (int*)&cfg.detectCineBars, 3, cineBars)); Add(new cMenuEditIntItem(tr("Threshold (0-255)"), &cfg.threshold, 0, 255)); Add(new cMenuEditIntItem(tr("Gamma (0-10.0)"), &cfg.gamma, 0, 100)); Add(new cMenuEditIntItem(tr("Value (0-20.0)"), &cfg.value, 0, 200)); Add(new cMenuEditIntItem(tr("Saturation (0-20.0)"), &cfg.saturation, 0, 200)); Add(new cMenuEditIntItem(tr("Speed (0-100)"), &cfg.speed, 0, 100)); Add(new cMenuEditIntItem(tr("Autospeed (0-100)"), &cfg.autospeed, 0, 100)); Add(new cMenuEditBoolItem(tr("Interpolation"), &cfg.interpolation)); Add(new cMenuEditIntItem(tr("Priority 0=Highest, 255=Lowest"), &cfg.priority, 0, 255)); } eOSState cAmbiSetup::ProcessKey(eKeys key) { eOSState state = cMenuSetupPage::ProcessKey(key); return state; } void cAmbiSetup::Store() { cfg.dirty = 1; SetupStore("LogLevel", cfg.loglevel); SetupStore("ShowMainmenu", cfg.showMainmenu); SetupStore("ViewMode", (int)cfg.viewMode); SetupStore("DetectCineBars", cfg.detectCineBars); SetupStore("Updaterate", cfg.frequence); SetupStore("Threshold", cfg.threshold); SetupStore("Gamma", cfg.gamma); SetupStore("Value", cfg.value); SetupStore("Saturation", cfg.saturation); SetupStore("Speed", cfg.speed); SetupStore("Autospeed", cfg.autospeed); SetupStore("Interpolation", cfg.interpolation); SetupStore("Priority", cfg.priority); SetupStore("FixedColorRed", cfg.fixedR); SetupStore("FixedColorGreen", cfg.fixedG); SetupStore("FixedColorBlue", cfg.fixedB); } //*************************************************************************** // VDR Internal //*************************************************************************** VDRPLUGINCREATOR(cPluginBoblight);