def createGUIScreen(self, parent):
for (name, val) in self.items():
self.data[name] = { }
- val.GUIcreate(self.data[name], parent, None)
+ if isinstance(val, GUIComponent):
+ val.GUIcreate(self.data[name], parent, None)
def deleteGUIScreen(self):
for (name, val) in self.items():
- w = self.data[name]["instance"]
- val.GUIdelete(self.data[name])
+ if isinstance(val, GUIComponent):
+ w = self.data[name]["instance"]
+ val.GUIdelete(self.data[name])
+ try:
+ val.fix()
+ except:
+ pass
del self.data[name]
# note: you'll probably run into this assert. if this happens, don't panic!
x()
return 0
-# html:
+ def disable(self):
+ pass
+
+ def enable(self):
+ pass
+
+# html:
def produceHTML(self):
return "<input type=\"submit\" text=\"" + self.getText() + "\">\n"
def GUIdeleteInstance(self, g):
g.selected.get().remove(self.push)
+class Label(HTMLComponent, GUIComponent, VariableText):
+ def __init__(self, text=""):
+ GUIComponent.__init__(self)
+ VariableText.__init__(self)
+ self.setText(text)
+
+# html:
+ def produceHTML(self):
+ return self.getText()
+
+# GUI:
+ def GUIcreateInstance(self, priv, parent, skindata):
+ g = eLabel(parent)
+ return g
+
class Header(HTMLComponent, GUIComponent, VariableText):
def __init__(self, message):
g.setRange(0, 100)
return g
+# a general purpose progress bar
+class ProgressBar(HTMLComponent, GUIComponent, VariableValue):
+ def __init__(self):
+ GUIComponent.__init__(self)
+ VariableValue.__init__(self)
+
+ def GUIcreateInstance(self, priv, parent, skindata):
+ g = eSlider(parent)
+ g.setRange(0, 100)
+ return g
+
class MenuList(HTMLComponent, GUIComponent):
def __init__(self, list):
GUIComponent.__init__(self)
def setRoot(self, root):
self.l.setRoot(root)
+
+class ServiceScan:
+
+ Idle = 1
+ Running = 2
+ Done = 3
+ Error = 4
+
+ def scanStatusChanged(self):
+ if self.state == self.Running:
+ self.progressbar.setValue(self.scan.getProgress())
+ if self.scan.isDone():
+ self.state = self.Done
+ else:
+ self.text.setText("scan in progress - %d %% done!\n%d services found!" % (self.scan.getProgress(), self.scan.getNumServices()))
+
+ if self.state == self.Done:
+ self.text.setText("scan done!")
+
+ if self.state == self.Error:
+ self.text.setText("ERROR - failed to scan!")
+
+ def __init__(self, progressbar, text):
+ self.progressbar = progressbar
+ self.text = text
+ self.scan = eComponentScan()
+ if self.scan.start():
+ self.state = self.Error
+ else:
+ self.state = self.Running
+ self.scan.statusChanged.get().append(self.scanStatusChanged)
+ self.scanStatusChanged()
+
+ def isDone(self):
+ return self.state == self.Done
+
+ def fix(self):
+ self.scan.statusChanged.get().remove(self.scanStatusChanged)
+
\ No newline at end of file
lib/network/Makefile
lib/python/Makefile
lib/service/Makefile
+lib/components/Makefile
main/Makefile
])
-
--- /dev/null
+INCLUDES = \
+ -I$(top_srcdir)/include
+
+noinst_LIBRARIES = libenigma_components.a
+
+libenigma_components_a_SOURCES = scan.cpp
+
\ No newline at end of file
--- /dev/null
+#include <lib/dvb/dvb.h>
+#include <lib/dvb/db.h>
+#include <lib/components/scan.h>
+#include <lib/base/eerror.h>
+#include <lib/dvb/scan.h>
+
+DEFINE_REF(eComponentScan);
+
+void eComponentScan::scanEvent(int evt)
+{
+ eDebug("scan event %d!", evt);
+
+ if (evt == eDVBScan::evtFinish)
+ {
+ m_done = 1;
+ ePtr<iDVBChannelList> db;
+ ePtr<eDVBResourceManager> res;
+
+ int err;
+ if ((err = eDVBResourceManager::getInstance(res)) != 0)
+ {
+ eDebug("no resource manager");
+ return;
+ }
+ if ((err = res->getChannelList(db)) != 0)
+ {
+ eDebug("no channel list");
+ return;
+ }
+
+ m_scan->insertInto(db);
+
+ eDebug("scan done!");
+ }
+
+ statusChanged();
+}
+
+eComponentScan::eComponentScan(): m_done(-1)
+{
+}
+
+eComponentScan::~eComponentScan()
+{
+}
+
+int eComponentScan::start()
+{
+ if (m_done != -1)
+ return -1;
+
+ m_done = 0;
+ ePtr<eDVBResourceManager> mgr;
+
+ eDVBResourceManager::getInstance(mgr);
+
+ eDVBFrontendParametersSatellite fesat;
+
+ fesat.frequency = 11817000; // 12070000;
+ fesat.symbol_rate = 27500000;
+ fesat.polarisation = eDVBFrontendParametersSatellite::Polarisation::Vertical;
+ fesat.fec = eDVBFrontendParametersSatellite::FEC::f3_4;
+ fesat.inversion = eDVBFrontendParametersSatellite::Inversion::Off;
+ fesat.orbital_position = 192;
+
+ eDVBFrontendParameters *fe = new eDVBFrontendParameters();
+
+ fe->setDVBS(fesat);
+
+ ePtr<iDVBChannel> channel;
+
+ if (mgr->allocateRawChannel(channel))
+ eDebug("scan: allocating raw channel failed!");
+
+ std::list<ePtr<iDVBFrontendParameters> > list;
+
+ list.push_back(fe);
+
+ m_scan = new eDVBScan(channel);
+ m_scan->start(list);
+ m_scan->connectEvent(slot(*this, &eComponentScan::scanEvent), m_scan_event_connection);
+
+ return 0;
+}
+
+int eComponentScan::getProgress()
+{
+ if (!m_scan)
+ return 0;
+ int done, total, services;
+ m_scan->getStats(done, total, services);
+ if (!total)
+ return 0;
+ return done * 100 / total;
+}
+
+int eComponentScan::getNumServices()
+{
+ if (!m_scan)
+ return 0;
+ int done, total, services;
+ m_scan->getStats(done, total, services);
+ return services;
+}
+
+int eComponentScan::isDone()
+{
+ return m_done;
+}
--- /dev/null
+#ifndef __lib_components_scan_h
+#define __lib_components_scan_h
+
+#include <lib/base/object.h>
+
+class eDVBScan;
+
+class eComponentScan: public Object, public iObject
+{
+DECLARE_REF;
+private:
+ void scanEvent(int event);
+ ePtr<eConnection> m_scan_event_connection;
+ ePtr<eDVBScan> m_scan;
+
+ int m_done;
+public:
+ eComponentScan();
+ ~eComponentScan();
+
+ PSignal0<void> statusChanged;
+
+ /* progress between 0 and 100 */
+ int getProgress();
+
+ /* get number of services */
+ int getNumServices();
+
+ /* true when done. */
+ int isDone();
+
+ int start();
+};
+
+#endif
}
/* set console mode */
- struct termios t,ot;
+ struct termios t;
tcgetattr(handle, &t);
- t.c_lflag &= ~(ECHO | ICANON | ECHOK | ECHOE | ECHONL);
ot = t;
+ t.c_lflag &= ~(ECHO | ICANON | ECHOK | ECHOE | ECHONL);
tcsetattr(handle, TCSANOW,&t);
}
class iDVBChannelList: public iObject
{
public:
+ virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
+ virtual RESULT removeChannel(const eDVBChannelID &id)=0;
+
virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
+
+ virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
+
virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query)=0;
};
nextChannel();
}
-void eDVBScan::insertInto(eDVBDB *db)
+void eDVBScan::insertInto(iDVBChannelList *db)
{
for (std::map<eDVBChannelID, ePtr<iDVBFrontendParameters> >::const_iterator
ch(m_new_channels.begin()); ch != m_new_channels.end(); ++ch)
connection = new eConnection(this, m_event.connect(event));
return 0;
}
+
+void eDVBScan::getStats(int &transponders_done, int &transponders_total, int &services)
+{
+ transponders_done = m_ch_scanned.size() + m_ch_unavailable.size();
+ transponders_total = m_ch_toScan.size() + transponders_done;
+ services = m_new_services.size();
+}
#include <lib/dvb_si/nit.h>
#include <lib/dvb_si/sdt.h>
#include <lib/dvb_si/bat.h>
+#include <lib/dvb/isection.h>
+#include <lib/dvb/esection.h>
#include <lib/dvb/db.h>
class eDVBScan: public Object, public iObject
enum { evtUpdate, evtFinish };
RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
- void insertInto(eDVBDB *db);
+ void insertInto(iDVBChannelList *db);
+
+ void getStats(int &transponders_done, int &transponders_total, int &services);
};
#endif
- /* written by: Felix Domke <tmbinc@elitedvb.net> */
#include <lib/gui/elistbox.h>
#include <lib/gui/elistboxcontent.h>
#include <lib/gui/elistbox.h>
#include <lib/gui/elistboxcontent.h>
#include <lib/service/listboxservice.h>
+#include <lib/components/scan.h>
extern void runMainloop();
+extern void quitMainloop();
extern PSignal1<void,int> &keyPressedSignal();
%}
RefCount(eListboxPythonStringContent)
RefCount(eListboxServiceContent)
+RefCount(eComponentScan)
#define DEBUG
%include "stl.i"
%include <lib/service/service.h>
%template(eServiceCenterPtr) ePtr<eServiceCenter>;
+
+// TODO: embed these...
%immutable eButton::selected;
+%immutable eComponentScan::statusChanged;
%include <lib/gdi/epoint.h>
%include <lib/gdi/erect.h>
%include <lib/gui/elistbox.h>
%include <lib/gui/elistboxcontent.h>
%include <lib/service/listboxservice.h>
+%include <lib/components/scan.h>
template<class R> class PSignal0
{
/************** debug **************/
void runMainloop();
+void quitMainloop();
%immutable keyPressed;
PSignal1<void,int> &keyPressedSignal();
enigma2_LDADD_WHOLE = \
$(top_builddir)/lib/base/libenigma_base.a \
+ $(top_builddir)/lib/components/libenigma_components.a \
$(top_builddir)/lib/driver/libenigma_driver.a \
$(top_builddir)/lib/dvb/libenigma_dvb.a \
$(top_builddir)/lib/dvb_si/libenigma_dvb_si.a \
}
/************************************************/
+#include <unistd.h>
+#include <lib/components/scan.h>
+#include <lib/dvb/idvb.h>
#include <lib/dvb/dvb.h>
#include <lib/dvb/db.h>
-#include <lib/dvb/isection.h>
-#include <lib/dvb/esection.h>
-#include <lib/dvb_si/pmt.h>
-#include <lib/dvb/scan.h>
-#include <unistd.h>
class eMain: public eApplication, public Object
{
eInit init;
- ePtr<eDVBScan> m_scan;
-
ePtr<eDVBResourceManager> m_mgr;
- ePtr<iDVBChannel> m_channel;
ePtr<eDVBDB> m_dvbdb;
- void scanEvent(int evt)
- {
- eDebug("scan event %d!", evt);
- if (evt == eDVBScan::evtFinish)
- {
- m_scan->insertInto(m_dvbdb);
- quit(0);
- }
- }
- ePtr<eConnection> m_scan_event_connection;
+ ePtr<eComponentScan> m_scan;
+
public:
eMain()
{
init.setRunlevel(eAutoInitNumbers::main);
-#if 0
+ /* TODO: put into init */
m_dvbdb = new eDVBDB();
m_mgr = new eDVBResourceManager();
-
- eDVBFrontendParametersSatellite fesat;
- fesat.frequency = 11817000; // 12070000;
- fesat.symbol_rate = 27500000;
- fesat.polarisation = eDVBFrontendParametersSatellite::Polarisation::Vertical;
- fesat.fec = eDVBFrontendParametersSatellite::FEC::f3_4;
- fesat.inversion = eDVBFrontendParametersSatellite::Inversion::Off;
- fesat.orbital_position = 192;
-
- eDVBFrontendParameters *fe = new eDVBFrontendParameters();
+ m_mgr->setChannelList(m_dvbdb);
- fe->setDVBS(fesat);
+// m_scan = new eComponentScan();
+// m_scan->start();
- if (m_mgr->allocateRawChannel(m_channel))
- eDebug("shit it failed!");
-
- eDebug("starting scan...");
-
- std::list<ePtr<iDVBFrontendParameters> > list;
-
- list.push_back(fe);
-
- m_scan = new eDVBScan(m_channel);
- m_scan->start(list);
- m_scan->connectEvent(slot(*this, &eMain::scanEvent), m_scan_event_connection);
-#endif
}
~eMain()
{
eApp->exec();
}
+
+void quitMainloop()
+{
+ eApp->quit(0);
+}
from components import *
import sys
+from enigma import quitMainloop
# some screens
def doGlobal(screen):
def goHDTV(self):
self["title"].setText("HDTV GREEN FLASHES: ENABLED")
+ def goScan(self):
+ self.session.open(serviceScan())
+
def goClock(self):
self.session.open(clockDisplay(Clock()))
self["title"] = Header("Main Menu! - press ok to leave!")
self["menu"] = MenuList(
[
+ ("Close Main Menu", self.close),
+ ("Service Scan", self.goScan),
+ ("Quit", quitMainloop),
("EMU SETUP", self.goEmu),
("TIMESHIFT SETUP", self.goTimeshift),
("HDTV PIP CONFIG", self.goHDTV),
self["okbutton"] = b
self["title"] = Header("clock dialog: here you see the current uhrzeit!")
+
+class serviceScan(Screen):
+ def ok(self):
+ if self["scan"].isDone():
+ self.close()
+
+ def __init__(self):
+ GUISkin.__init__(self)
+
+ self["scan_progress"] = ProgressBar()
+ self["scan_state"] = Label("scan state")
+ self["scan"] = ServiceScan(self["scan_progress"], self["scan_state"])
+
+ self["okbutton"] = Button("ok", [self.ok])
+ self["okbutton"].disable()
<widget name="title" position="10,120" size="280,50" />
<widget name="theClock" position="10,60" size="280,50" />
</screen>
- <screen name="infoBar" position="100,100" size="500,400" title="InfoBar">
+ <screen name="infoBar" position="100,100" size="300,400" title="InfoBar">
<widget name="channelSwitcher" position="10,190" size="280,50" />
</screen>
<screen name="channelSelection" position="300,100" size="300,300" title="Channel Selection">
<widget name="okbutton" position="10,190" size="280,50" />
<widget name="list" position="10,30" size="280,140" />
</screen>
+ <screen name="serviceScan" position="150,100" size="300,200" title="Service Scan">
+ <widget name="scan_progress" position="10,10" size="280,50" />
+ <widget name="scan_state" position="10,60" size="280,30" />
+ <widget name="okbutton" position="10,100" size="280,40" />
+ </screen>
</skin>
""")