Skip to content

Commit

Permalink
Add support for activating/deactivating server on-the-fly.
Browse files Browse the repository at this point in the history
  • Loading branch information
rofafor committed Jun 22, 2016
1 parent 4e9b6f1 commit cede474
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 6 deletions.
7 changes: 7 additions & 0 deletions discover.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,13 @@ cString cSatipDiscover::GetServerList(void)
return serversM.List();
}

void cSatipDiscover::ActivateServer(cSatipServer *serverP, bool onOffP)
{
debug16("%s (, %d)", __PRETTY_FUNCTION__, onOffP);
cMutexLock MutexLock(&mutexM);
serversM.Activate(serverP, onOffP);
}

void cSatipDiscover::AttachServer(cSatipServer *serverP, int deviceIdP, int transponderP)
{
debug16("%s (, %d, %d)", __PRETTY_FUNCTION__, deviceIdP, transponderP);
Expand Down
1 change: 1 addition & 0 deletions discover.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class cSatipDiscover : public cThread, public cSatipDiscoverIf {
cSatipServer *GetServer(cSatipServer *serverP);
cSatipServers *GetServers(void);
cString GetServerString(cSatipServer *serverP);
void ActivateServer(cSatipServer *serverP, bool onOffP);
void AttachServer(cSatipServer *serverP, int deviceIdP, int transponderP);
void DetachServer(cSatipServer *serverP, int deviceIdP, int transponderP);
bool IsServerQuirk(cSatipServer *serverP, int quirkP);
Expand Down
17 changes: 14 additions & 3 deletions server.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ cSatipServer::cSatipServer(const char *addressP, const int portP, const char *mo
portM(portP),
quirkM(eSatipQuirkNone),
hasCiM(false),
activeM(true),
createdM(time(NULL)),
lastSeenM(0)
{
Expand Down Expand Up @@ -297,11 +298,11 @@ cSatipServer *cSatipServers::Find(int sourceP)

cSatipServer *cSatipServers::Assign(int deviceIdP, int sourceP, int transponderP, int systemP)
{
for (cSatipServer *s = First(); s; s = Next(s)) {
for (cSatipServer *s = First(); s && s->IsActive(); s = Next(s)) {
if (s->Matches(deviceIdP, sourceP, systemP, transponderP))
return s;
}
for (cSatipServer *s = First(); s; s = Next(s)) {
for (cSatipServer *s = First(); s && s->IsActive(); s = Next(s)) {
if (s->Assign(deviceIdP, sourceP, systemP, transponderP))
return s;
}
Expand All @@ -319,6 +320,16 @@ cSatipServer *cSatipServers::Update(cSatipServer *serverP)
return NULL;
}

void cSatipServers::Activate(cSatipServer *serverP, bool onOffP)
{
for (cSatipServer *s = First(); s; s = Next(s)) {
if (s == serverP) {
s->Activate(onOffP);
break;
}
}
}

void cSatipServers::Attach(cSatipServer *serverP, int deviceIdP, int transponderP)
{
for (cSatipServer *s = First(); s; s = Next(s)) {
Expand Down Expand Up @@ -413,7 +424,7 @@ cString cSatipServers::List(void)
{
cString list = "";
for (cSatipServer *s = First(); s; s = Next(s))
list = cString::sprintf("%s%s|%s|%s\n", *list, s->Address(), s->Model(), s->Description());
list = cString::sprintf("%s%c %s|%s|%s\n", *list, s->IsActive() ? '+' : '-', s->Address(), s->Model(), s->Description());
return list;
}

Expand Down
4 changes: 4 additions & 0 deletions server.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class cSatipServer : public cListObject {
int portM;
int quirkM;
bool hasCiM;
bool activeM;
time_t createdM;
cTimeMs lastSeenM;

Expand All @@ -87,6 +88,7 @@ class cSatipServer : public cListObject {
int GetModulesDVBT2(void);
int GetModulesDVBC(void);
int GetModulesDVBC2(void);
void Activate(bool onOffP) { activeM = onOffP; }
const char *Address(void) { return *addressM; }
const char *Model(void) { return *modelM; }
const char *Description(void) { return *descriptionM; }
Expand All @@ -95,6 +97,7 @@ class cSatipServer : public cListObject {
bool Quirk(int quirkP) { return ((quirkP & eSatipQuirkMask) & quirkM); }
bool HasQuirk(void) { return (quirkM != eSatipQuirkNone); }
bool HasCI(void) { return hasCiM; }
bool IsActive(void) { return activeM; }
void Update(void) { lastSeenM.Set(); }
uint64_t LastSeen(void) { return lastSeenM.Elapsed(); }
time_t Created(void) { return createdM; }
Expand All @@ -108,6 +111,7 @@ class cSatipServers : public cList<cSatipServer> {
cSatipServer *Find(int sourceP);
cSatipServer *Assign(int deviceIdP, int sourceP, int transponderP, int systemP);
cSatipServer *Update(cSatipServer *serverP);
void Activate(cSatipServer *serverP, bool onOffP);
void Attach(cSatipServer *serverP, int deviceIdP, int transponderP);
void Detach(cSatipServer *serverP, int deviceIdP, int transponderP);
bool IsQuirk(cSatipServer *serverP, int quirkP);
Expand Down
20 changes: 17 additions & 3 deletions setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ eOSState cSatipEditSrcItem::ProcessKey(eKeys Key)
class cSatipServerInfo : public cOsdMenu
{
private:
cSatipServer *serverM;
int activeM;
cString addressM;
cString modelM;
cString descriptionM;
Expand All @@ -101,6 +103,8 @@ class cSatipServerInfo : public cOsdMenu

cSatipServerInfo::cSatipServerInfo(cSatipServer *serverP)
: cOsdMenu(tr("SAT>IP Server"), 20),
serverM(serverP),
activeM(serverP && serverP->IsActive()),
addressM(serverP ? serverP->Address() : "---"),
modelM(serverP ? serverP->Model() : "---"),
descriptionM(serverP ? serverP->Description() : "---"),
Expand All @@ -118,6 +122,7 @@ cSatipServerInfo::~cSatipServerInfo()

void cSatipServerInfo::Setup(void)
{
Add(new cMenuEditBoolItem(trVDR("Active"), &activeM));
Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Address"), *addressM), osUnknown, false));
Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Model"), *modelM), osUnknown, false));
Add(new cOsdItem(cString::sprintf("%s:\t%s", tr("Description"), *descriptionM), osUnknown, false));
Expand All @@ -127,6 +132,7 @@ void cSatipServerInfo::Setup(void)

eOSState cSatipServerInfo::ProcessKey(eKeys keyP)
{
int oldActive = activeM;
eOSState state = cOsdMenu::ProcessKey(keyP);

if (state == osUnknown) {
Expand All @@ -135,6 +141,12 @@ eOSState cSatipServerInfo::ProcessKey(eKeys keyP)
default: state = osContinue; break;
}
}

if (keyP != kNone && oldActive != activeM) {
cSatipDiscover::GetInstance()->ActivateServer(serverM, activeM);
Setup();
}

return state;
}

Expand All @@ -155,7 +167,7 @@ cSatipServerItem::cSatipServerItem(cSatipServer *serverP)
{
SetSelectable(true);
// Must begin with a '#' character!
SetText(*cString::sprintf("# %s (%s)\t%s", serverM->Address(), serverM->Model(), serverM->Description()));
SetText(*cString::sprintf("%s %s (%s)\t%s", serverM->IsActive() ? "+" : "-", serverM->Address(), serverM->Model(), serverM->Description()));
}

void cSatipServerItem::SetMenuItem(cSkinDisplayMenu *displayMenuP, int indexP, bool currentP, bool selectableP)
Expand Down Expand Up @@ -468,10 +480,12 @@ eOSState cSatipPluginSetup::ProcessKey(eKeys keyP)
int oldNumDisabledFilters = numDisabledFiltersM;
eOSState state = cMenuSetupPage::ProcessKey(keyP);

// Ugly hack with hardcoded '#' character :(
// Ugly hack with hardcoded '+/-' characters :(
const char *p = Get(Current())->Text();
if (!hadSubMenu && !HasSubMenu() && (*p == '#') && (keyP == kOk))
if (!hadSubMenu && !HasSubMenu() && p && (*p == '+' || *p == '-') && (keyP == kOk))
return DeviceInfo();
if (hadSubMenu && !HasSubMenu())
Setup();

if (state == osUnknown) {
switch (keyP) {
Expand Down

0 comments on commit cede474

Please sign in to comment.