diff options
author | anbr <vdr07@deltab.de> | 2009-06-03 13:56:16 +0200 |
---|---|---|
committer | anbr <vdr07@deltab.de> | 2009-06-03 13:56:16 +0200 |
commit | 603be1f41b0703d35dba6ba512a0d0893a69ecb9 (patch) | |
tree | c256da81e100c6efe8982de30e6760bf03f6eda1 | |
parent | f7474de7957369a17754f558890d803ce9d5dc0f (diff) | |
download | vdr-plugin-imonlcd-603be1f41b0703d35dba6ba512a0d0893a69ecb9.tar.gz vdr-plugin-imonlcd-603be1f41b0703d35dba6ba512a0d0893a69ecb9.tar.bz2 |
Add svdrp command 'ICON'
-rw-r--r-- | README | 29 | ||||
-rw-r--r-- | imon.c | 6 | ||||
-rw-r--r-- | imon.h | 6 | ||||
-rw-r--r-- | imonlcd.c | 204 | ||||
-rw-r--r-- | watch.c | 59 | ||||
-rw-r--r-- | watch.h | 14 |
6 files changed, 277 insertions, 41 deletions
@@ -114,25 +114,32 @@ Possible options are: Plugin SVDRP commands --------------------- +* HELP - List known commands * OFF - Suspend driver of display. * ON - Resume driver of display. +* ICON [name] [on|off|auto] - Force state of icon. -Use this commands like +Use this commands like follow samples #> svdrpsend.pl PLUG imonlcd OFF 220 vdr SVDRP VideoDiskRecorder .... 250 driver suspended 221 vdr closing connection + #> svdrpsend.pl PLUG imonlcd HELP ICON + 214-ICON [name] [on|off|auto] + 214- Force state of icon. Names of icons are: + 214- Music,Movie,Photo,DVD,TopTV,Web,News + ... + This commands can have follow responses -OFF : - 250 driver suspended - 251 driver already suspended - -ON : - 250 driver resumed - 251 driver already resumed - 554 driver could not resumed -* - 501 unknown command +OFF : 250 driver suspended + 251 driver already suspended +ON : 250 driver resumed + 251 driver already resumed + 554 driver could not resumed +ICON : 250 icon state 'auto' + 251 icon state 'on' + 252 icon state 'off' +* 501 unknown command @@ -349,7 +349,7 @@ int ciMonLCD::DrawText(int x, int y, const char* string) * * \param state This symbols to display. */ -bool ciMonLCD::icons(int state) +bool ciMonLCD::icons(unsigned int state) { uint64_t icon = 0x0; @@ -466,8 +466,8 @@ bool ciMonLCD::icons(int state) } icon |= ((state & eIconVolume) != 0) ? ICON_VOL : 0; - icon |= ((state & eIconTIME) != 0) ? ICON_TIME : 0; - icon |= ((state & eIconALARM) != 0) ? ICON_ALARM : 0; + icon |= ((state & eIconTime) != 0) ? ICON_TIME : 0; + icon |= ((state & eIconAlarm) != 0) ? ICON_ALARM : 0; icon |= ((state & eIconRecording) != 0) ? ICON_REC : 0; icon |= ((state & eIconRepeat) != 0) ? ICON_REP : 0; icon |= ((state & eIconShuffle) != 0) ? ICON_SFL : 0; @@ -69,8 +69,8 @@ enum eIcons { eIconBL_Mask = (eIconBL_MPG|eIconBL_DIVX|eIconBL_XVID|eIconBL_WMV), eIconVolume = 1 << 22, - eIconTIME = 1 << 23, - eIconALARM = 1 << 24, + eIconTime = 1 << 23, + eIconAlarm = 1 << 24, eIconRecording = 1 << 25, @@ -127,7 +127,7 @@ public: int DrawText(int x, int y, const char* string); bool flush (); - bool icons(int state); + bool icons(unsigned int state); virtual bool SetFont(const char *szFont); }; #endif @@ -31,9 +31,15 @@ private: ciMonWatch m_dev; eProtocol m_Protocol; bool m_bSuspend; + char* m_szIconHelpPage; protected: bool resume(); bool suspend(); + + const char* SVDRPCommandOn(const char *Option, int &ReplyCode); + const char* SVDRPCommandOff(const char *Option, int &ReplyCode); + const char* SVDRPCommandIcon(const char *Option, int &ReplyCode); + public: cPluginImonlcd(void); virtual ~cPluginImonlcd(); @@ -63,6 +69,7 @@ cPluginImonlcd::cPluginImonlcd(void) m_bSuspend = true; statusMonitor = NULL; m_szDevice = NULL; + m_szIconHelpPage = NULL; } cPluginImonlcd::~cPluginImonlcd() @@ -77,6 +84,11 @@ cPluginImonlcd::~cPluginImonlcd() free(m_szDevice); m_szDevice = NULL; } + + if(m_szIconHelpPage) { + free(m_szIconHelpPage); + m_szIconHelpPage = NULL; + } } const char *cPluginImonlcd::CommandLineHelp(void) @@ -235,23 +247,8 @@ bool cPluginImonlcd::Service(const char *Id, void *Data) return false; } -const char **cPluginImonlcd::SVDRPHelpPages(void) +const char* cPluginImonlcd::SVDRPCommandOn(const char *Option, int &ReplyCode) { - // Return help text for SVDRP commands this plugin implements - static const char *HelpPages[] = { - "ON\n" - " Resume driver of display.", - "OFF\n" - " Suspend driver of display.", - NULL - }; - return HelpPages; -} - -cString cPluginImonlcd::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) -{ - // Process SVDRP commands this plugin implements - if(!strcasecmp(Command, "ON")) { if(!m_bSuspend) { ReplyCode=251; return "driver already resumed"; @@ -263,7 +260,10 @@ cString cPluginImonlcd::SVDRPCommand(const char *Command, const char *Option, in ReplyCode=554; return "driver could not resumed"; } - } else if(!strcasecmp(Command, "OFF")) { +} + +const char* cPluginImonlcd::SVDRPCommandOff(const char *Option, int &ReplyCode) +{ if(suspend()) { ReplyCode=250; return "driver suspended"; @@ -271,12 +271,174 @@ cString cPluginImonlcd::SVDRPCommand(const char *Command, const char *Option, in ReplyCode=251; return "driver already suspended"; } - } else { - ReplyCode=501; - return "unknown command"; +} + +static const struct { + unsigned int nIcon; + const char* szIcon; +} icontable[] = { + { eIconTopMusic , "Music" }, + { eIconTopMovie , "Movie" }, + { eIconTopPhoto , "Photo" }, + { eIconTopDVD , "DVD" }, + { eIconTopTV , "TopTV" }, + { eIconTopWeb , "Web" }, + { eIconTopNews , "News" }, + { eIconSpeakerL , "SpeakerL" }, + { eIconSpeakerR , "SpeakerR" }, + { eIconSpeakerLR , "SpeakerLR" }, + { eIconSpeaker51 , "Speaker51" }, + { eIconSpeaker71 , "Speaker71" }, + { eIconSPDIF , "SPDIF" }, + { eIconMute , "MUTE" }, + { eIconDiscSpin|eIconDiscRunSpin|eIconDiscEllispe , "DISC" }, + { eIconTV , "TV" }, + { eIconHDTV , "HDTV" }, + { eIconSRC , "SRC" }, + { eIconSRC1 , "SRC1" }, + { eIconSRC2 , "SRC2" }, + { eIconFIT , "FIT" }, + { eIconBL_MPG , "MPG" }, + { eIconBL_DIVX , "DIVX" }, + { eIconBL_XVID , "XVID" }, + { eIconBL_WMV , "WMV" }, + { eIconBM_MPG , "MPGA" }, + { eIconBM_AC3 , "AC3" }, + { eIconBM_DTS , "DTS" }, + { eIconBM_WMA , "WMAA" }, + { eIconBR_MP3 , "MP3" }, + { eIconBR_OGG , "OGG" }, + { eIconBR_WMA , "WMA" }, + { eIconBR_WAV , "WAV" }, + { eIconVolume , "VOL" }, + { eIconTime , "TIME" }, + { eIconAlarm , "ALARM" }, + { eIconRecording , "REC" }, + { eIconRepeat , "REP" }, + { eIconShuffle , "SFL" } +}; + +const char* cPluginImonlcd::SVDRPCommandIcon(const char *Option, int &ReplyCode) +{ + if(m_bSuspend) { + ReplyCode=251; + return "driver suspended"; } + if( Option && strlen(Option) < 256) { + char* request = strdup(Option); + char* cmd = NULL; + if( request ) { + char* tmp = request; + eIconState m = eIconStateQuery; + cmd = strtok_r(request, " ", &tmp); + if(cmd) { + char* param = strtok_r(0, " ", &tmp); + if(param) { + if(!strcasecmp(param,"ON")) { + m = eIconStateOn; + } else if(!strcasecmp(param,"OFF")) { + m = eIconStateOff; + } else if(!strcasecmp(param,"AUTO")) { + m = eIconStateAuto; + } else { + ReplyCode=501; + free(request); + return "unknown icon state"; + } + } + } - return NULL; + ReplyCode=501; + const char* szReplay = "unknown icon title"; + if(cmd) { + unsigned int i; + for(i = 0; i < (sizeof(icontable)/sizeof(*icontable));++i) + { + if(0 == strcasecmp(cmd,icontable[i].szIcon)) + { + eIconState r = m_dev.ForceIcon(icontable[i].nIcon, m); + switch(r) { + case eIconStateAuto: + ReplyCode=250; + szReplay = "icon state 'auto'"; + break; + case eIconStateOn: + ReplyCode=251; + szReplay = "icon state 'on'"; + break; + case eIconStateOff: + ReplyCode=252; + szReplay = "icon state 'off'"; + break; + default: + break; + } + break; + } + } + } + free(request); + return szReplay; + } + } + ReplyCode=501; + return "wrong parameter"; +} + +cString cPluginImonlcd::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) +{ + ReplyCode=501; + const char* szReplay = "unknown command"; + + if(!strcasecmp(Command, "ON")) { + szReplay = SVDRPCommandOn(Option,ReplyCode); + } else if(!strcasecmp(Command, "OFF")) { + szReplay = SVDRPCommandOff(Option,ReplyCode); + } else if(!strcasecmp(Command, "ICON")) { + szReplay = SVDRPCommandIcon(Option,ReplyCode); + } + + dsyslog("iMonLCD: SVDRP %s %s - %d (%s)", Command, Option, ReplyCode, szReplay); + return szReplay; } +const char **cPluginImonlcd::SVDRPHelpPages(void) +{ + if(!m_szIconHelpPage) { + unsigned int i,l,k; + for(i = 0,l = 0, k = (sizeof(icontable)/sizeof(*icontable)); i < k;++i) { + l += strlen(icontable[i].szIcon); + l += 2; + } + l += 80; + + m_szIconHelpPage = (char*) calloc(l + 1,1); + if(m_szIconHelpPage) { + strncat(m_szIconHelpPage, "ICON [name] [on|off|auto]\n Force state of icon. Names of icons are:", l); + for(i = 0; i < k;++i) { + if((i % 7) == 0) { + strncat(m_szIconHelpPage, "\n ", l - (strlen(m_szIconHelpPage) + 5)); + } else { + strncat(m_szIconHelpPage, ",", l - (strlen(m_szIconHelpPage) + 1)); + } + strncat(m_szIconHelpPage, icontable[i].szIcon, + l - (strlen(m_szIconHelpPage) + strlen(icontable[i].szIcon))); + } + } + } + + // Return help text for SVDRP commands this plugin implements + static const char *HelpPages[] = { + "ON\n" + " Resume driver of display.\n", + "OFF\n" + " Suspend driver of display.\n", + "ICON [name] [on|off|auto]\n" + " Force state of icon.\n", + NULL + }; + if(m_szIconHelpPage) + HelpPages[2] = m_szIconHelpPage; + return HelpPages; +} VDRPLUGINCREATOR(cPluginImonlcd); // Don't touch this! @@ -37,6 +37,10 @@ ciMonWatch::ciMonWatch() : cThread("iMonLCD: watch thread") , m_bShutdown(false) { + m_nIconsForceOn = 0; + m_nIconsForceOff = 0; + m_nIconsForceMask = 0; + unsigned int n; for(n=0;n<memberof(m_nCardIsRecording);++n) { m_nCardIsRecording[n] = 0; @@ -129,7 +133,7 @@ void ciMonWatch::close() { localtime_r(&tt, &l); cString topic = cString::sprintf("%d. %02d:%02d %s", l.tm_mday, l.tm_hour, l.tm_min, t->File()); this->DrawText(0,0,topic); - this->icons(eIconALARM); + this->icons(eIconAlarm); } else { this->DrawText(0,0,tr("None active timer")); this->icons(0); @@ -160,7 +164,7 @@ void ciMonWatch::close() { void ciMonWatch::Action(void) { - int nLastIcons = -1; + unsigned int nLastIcons = -1; int nContrast = -1; unsigned int n; @@ -178,7 +182,7 @@ void ciMonWatch::Action(void) LOCK_THREAD; - int nIcons = 0; + unsigned int nIcons = 0; bool bUpdateIcons = false; bool bFlush = false; if(m_bShutdown) @@ -314,6 +318,15 @@ void ciMonWatch::Action(void) Contrast(nContrast); } + //Force icon state (defined by svdrp) + nIcons &= ~(m_nIconsForceMask); + nIcons |= (m_nIconsForceOn); + nIcons &= ~(m_nIconsForceOff); + if(m_nIconsForceOn & eIconDiscRunSpin) { + bUpdateIcons |= (0 == (nCnt % 4)); + nIcons &= ~(eIconDiscSpinBackward); + } + if(bUpdateIcons || nIcons != nLastIcons) { icons(nIcons); nLastIcons = nIcons; @@ -794,3 +807,43 @@ bool ciMonWatch::SetFont(const char *szFont) { } + + +eIconState ciMonWatch::ForceIcon(unsigned int nIcon, eIconState nState) { + + unsigned int nIconOff = nIcon; + if(nIconOff & eIconTopMask) + nIconOff |= eIconTopMask; + else if(nIconOff & eIconSpeakerMask) + nIconOff |= eIconSpeakerMask; + else if(nIconOff & eIconBR_Mask) + nIconOff |= eIconBR_Mask; + else if(nIconOff & eIconBM_Mask) + nIconOff |= eIconBM_Mask; + else if(nIconOff & eIconBL_Mask) + nIconOff |= eIconBL_Mask; + + switch(nState) { + case eIconStateAuto: + m_nIconsForceOn &= ~(nIconOff); + m_nIconsForceOff &= ~(nIconOff); + m_nIconsForceMask &= ~(nIconOff); + break; + case eIconStateOn: + m_nIconsForceOn |= nIcon; + m_nIconsForceOff &= ~(nIconOff); + m_nIconsForceMask |= nIconOff; + break; + case eIconStateOff: + m_nIconsForceOff |= nIcon; + m_nIconsForceOn &= ~(nIconOff); + m_nIconsForceMask |= nIconOff; + break; + default: + break; + } + if(m_nIconsForceOn & nIcon) return eIconStateOn; + if(m_nIconsForceOff & nIcon) return eIconStateOff; + return eIconStateAuto; +} + @@ -67,6 +67,14 @@ enum eAudioMode { eAudioWAV = 1 << 6 }; +enum eIconState { + eIconStateQuery, + eIconStateOn, + eIconStateOff, + eIconStateAuto +}; + + class ciMonWatch : public ciMonLCD , protected cThread { @@ -85,6 +93,10 @@ private: int m_nCardIsRecording[16]; + unsigned int m_nIconsForceOn; + unsigned int m_nIconsForceOff; + unsigned int m_nIconsForceMask; + const cControl *m_pControl; tChannelID chID; @@ -129,6 +141,8 @@ public: void OsdStatusMessage(const char *sz); virtual bool SetFont(const char *szFont); + + eIconState ForceIcon(unsigned int nIcon, eIconState nState); }; #endif |