summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoranbr <vdr07@deltab.de>2009-06-03 13:56:16 +0200
committeranbr <vdr07@deltab.de>2009-06-03 13:56:16 +0200
commit603be1f41b0703d35dba6ba512a0d0893a69ecb9 (patch)
treec256da81e100c6efe8982de30e6760bf03f6eda1
parentf7474de7957369a17754f558890d803ce9d5dc0f (diff)
downloadvdr-plugin-imonlcd-603be1f41b0703d35dba6ba512a0d0893a69ecb9.tar.gz
vdr-plugin-imonlcd-603be1f41b0703d35dba6ba512a0d0893a69ecb9.tar.bz2
Add svdrp command 'ICON'
-rw-r--r--README29
-rw-r--r--imon.c6
-rw-r--r--imon.h6
-rw-r--r--imonlcd.c204
-rw-r--r--watch.c59
-rw-r--r--watch.h14
6 files changed, 277 insertions, 41 deletions
diff --git a/README b/README
index 8ef41ed..9b55214 100644
--- a/README
+++ b/README
@@ -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
diff --git a/imon.c b/imon.c
index d34cd49..ab850ce 100644
--- a/imon.c
+++ b/imon.c
@@ -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;
diff --git a/imon.h b/imon.h
index e9309ff..36f705f 100644
--- a/imon.h
+++ b/imon.h
@@ -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
diff --git a/imonlcd.c b/imonlcd.c
index b1782ad..472a60b 100644
--- a/imonlcd.c
+++ b/imonlcd.c
@@ -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!
diff --git a/watch.c b/watch.c
index e2a68d1..544d369 100644
--- a/watch.c
+++ b/watch.c
@@ -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;
+}
+
diff --git a/watch.h b/watch.h
index 7beabf8..8ff9843 100644
--- a/watch.h
+++ b/watch.h
@@ -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