aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFraxinas <andreas.frisch@multimedia-labs.de>2008-11-10 10:18:28 +0100
committerFraxinas <andreas.frisch@multimedia-labs.de>2008-11-10 10:18:28 +0100
commit4c2cba9ccb6f754aac9378e2fc2c7b546e6d589c (patch)
tree1ae11748c8a14720c98fb666ffaf8615fd5ff038 /lib
parentacbad24424304473f967b678bd9deb51f73acf27 (diff)
parent752d9da39e993387fefbd9ccbf39e5cb8f85735e (diff)
downloadenigma2-4c2cba9ccb6f754aac9378e2fc2c7b546e6d589c.tar.gz
enigma2-4c2cba9ccb6f754aac9378e2fc2c7b546e6d589c.zip
Merge branch 'master' of fraxinas@git.opendreambox.org:/git/enigma2
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/db.cpp4
-rw-r--r--lib/dvb/decoder.cpp2
-rw-r--r--lib/dvb/dvb.cpp22
-rw-r--r--lib/dvb/dvb.h4
-rw-r--r--lib/dvb/frontend.cpp93
-rw-r--r--lib/dvb/idvb.h2
-rw-r--r--lib/dvb/pmt.cpp98
-rw-r--r--lib/dvb/pmt.h2
-rw-r--r--lib/gdi/lcd.cpp8
-rw-r--r--lib/gui/epositiongauge.cpp6
-rw-r--r--lib/python/Components/Lcd.py10
-rw-r--r--lib/python/Components/NimManager.py21
-rw-r--r--lib/python/Components/TimerSanityCheck.py54
-rwxr-xr-xlib/python/Components/config.py5
-rwxr-xr-xlib/python/Screens/NetworkSetup.py42
-rw-r--r--lib/python/Screens/TimerEdit.py23
-rw-r--r--lib/python/enigma_python.i4
-rw-r--r--lib/service/iservice.h2
-rw-r--r--lib/service/service.cpp2
-rw-r--r--lib/service/servicedvb.cpp4
-rw-r--r--lib/service/servicedvb.h2
21 files changed, 295 insertions, 115 deletions
diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp
index 02ecc1d2..c6c2e855 100644
--- a/lib/dvb/db.cpp
+++ b/lib/dvb/db.cpp
@@ -151,7 +151,7 @@ RESULT eDVBService::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &
return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
}
-int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate)
{
ePtr<eDVBResourceManager> res_mgr;
if ( eDVBResourceManager::getInstance( res_mgr ) )
@@ -161,7 +161,7 @@ int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReferenc
eDVBChannelID chid, chid_ignore;
((const eServiceReferenceDVB&)ref).getChannelID(chid);
((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
- return res_mgr->canAllocateChannel(chid, chid_ignore);
+ return res_mgr->canAllocateChannel(chid, chid_ignore, simulate);
}
return 0;
}
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp
index 0ce59d01..5fa59ed4 100644
--- a/lib/dvb/decoder.cpp
+++ b/lib/dvb/decoder.cpp
@@ -1069,6 +1069,7 @@ RESULT eTSMPEGDecoder::setFastForward(int frames_to_skip)
m_is_ff = frames_to_skip != 0;
setState();
+ unfreeze(); // audio might be restarted and still in preroll (freezed) state.
if (m_video)
return m_video->setFastForward(frames_to_skip);
@@ -1081,6 +1082,7 @@ RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
m_is_sm = repeat != 0;
setState();
+ unfreeze(); // audio might be restarted and still in preroll (freezed) state.
if (m_video)
return m_video->setSlowMotion(repeat);
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 68d9a0dd..e04caa00 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -713,12 +713,13 @@ RESULT eDVBResourceManager::connectChannelAdded(const Slot1<void,eDVBChannel*> &
return 0;
}
-int eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm)
+int eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm, bool simulate)
{
+ eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_simulate_frontend : m_frontend;
ePtr<eDVBRegisteredFrontend> best;
int bestval = 0;
- for (eSmartPtrList<eDVBRegisteredFrontend>::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i)
+ for (eSmartPtrList<eDVBRegisteredFrontend>::iterator i(frontends.begin()); i != frontends.end(); ++i)
if (!i->m_inuse)
{
int c = i->m_frontend->isCompatibleWith(feparm);
@@ -755,10 +756,11 @@ int tuner_type_channel_default(ePtr<iDVBChannelList> &channellist, const eDVBCha
return 0;
}
-int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore)
+int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore, bool simulate)
{
+ std::list<active_channel> &active_channels = simulate ? m_active_simulate_channels : m_active_channels;
int ret=0;
- if (m_cached_channel)
+ if (!simulate && m_cached_channel)
{
eDVBChannel *cache_chan = (eDVBChannel*)&(*m_cached_channel);
if(channelid==cache_chan->getChannelID())
@@ -767,7 +769,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
/* first, check if a channel is already existing. */
// eDebug("allocate channel.. %04x:%04x", channelid.transport_stream_id.get(), channelid.original_network_id.get());
- for (std::list<active_channel>::iterator i(m_active_channels.begin()); i != m_active_channels.end(); ++i)
+ for (std::list<active_channel>::iterator i(active_channels.begin()); i != active_channels.end(); ++i)
{
// eDebug("available channel.. %04x:%04x", i->m_channel_id.transport_stream_id.get(), i->m_channel_id.original_network_id.get());
if (i->m_channel_id == channelid)
@@ -780,8 +782,9 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
int *decremented_cached_channel_fe_usecount=NULL,
*decremented_fe_usecount=NULL;
- for (std::list<active_channel>::iterator i(m_active_channels.begin()); i != m_active_channels.end(); ++i)
+ for (std::list<active_channel>::iterator i(active_channels.begin()); i != active_channels.end(); ++i)
{
+ eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_simulate_frontend : m_frontend;
// eDebug("available channel.. %04x:%04x", i->m_channel_id.transport_stream_id.get(), i->m_channel_id.original_network_id.get());
if (i->m_channel_id == ignore)
{
@@ -795,7 +798,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
ePtr<iDVBFrontend> fe;
if (!i->m_channel->getFrontend(fe))
{
- for (eSmartPtrList<eDVBRegisteredFrontend>::iterator ii(m_frontend.begin()); ii != m_frontend.end(); ++ii)
+ for (eSmartPtrList<eDVBRegisteredFrontend>::iterator ii(frontends.begin()); ii != frontends.end(); ++ii)
{
if ( &(*fe) == &(*ii->m_frontend) )
{
@@ -822,7 +825,8 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
ePtr<iDVBFrontend> fe;
if (!channel->getFrontend(fe))
{
- for (eSmartPtrList<eDVBRegisteredFrontend>::iterator ii(m_frontend.begin()); ii != m_frontend.end(); ++ii)
+ eSmartPtrList<eDVBRegisteredFrontend> &frontends = simulate ? m_simulate_frontend : m_frontend;
+ for (eSmartPtrList<eDVBRegisteredFrontend>::iterator ii(frontends.begin()); ii != frontends.end(); ++ii)
{
if ( &(*fe) == &(*ii->m_frontend) )
{
@@ -852,7 +856,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
goto error;
}
- ret = canAllocateFrontend(feparm);
+ ret = canAllocateFrontend(feparm, simulate);
error:
if (decremented_fe_usecount)
diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h
index 1a773efa..13556c26 100644
--- a/lib/dvb/dvb.h
+++ b/lib/dvb/dvb.h
@@ -184,7 +184,7 @@ public:
};
RESULT connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &connection);
- int canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore);
+ int canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore, bool simulate=false);
/* allocate channel... */
RESULT allocateChannel(const eDVBChannelID &channelid, eUsePtr<iDVBChannel> &channel, bool simulate=false);
@@ -206,7 +206,7 @@ public:
#ifdef SWIG
public:
#endif
- int canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm);
+ int canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm, bool simulate=false);
bool canMeasureFrontendInputPower();
PSignal1<void,int> frontendUseMaskChanged;
SWIG_VOID(RESULT) allocateRawChannel(eUsePtr<iDVBChannel> &SWIG_OUTPUT, int slot_index);
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index 635de8f5..27ea66ec 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -81,22 +81,26 @@
if (!m_simulate) \
eDebug(x); \
} while(0)
-// else \
-// { \
-// eDebugNoNewLine("SIMULATE:"); \
-// eDebug(x); \
-// } \
+#if 0
+ else \
+ { \
+ eDebugNoNewLine("SIMULATE:"); \
+ eDebug(x); \
+ }
+#endif
#define eDebugNoSimulateNoNewLine(x...) \
do { \
if (!m_simulate) \
eDebugNoNewLine(x); \
} while(0)
-// else \
-// { \
-// eDebugNoNewLine("SIMULATE:"); \
-// eDebugNoNewLine(x); \
-// } \
+#if 0
+ else \
+ { \
+ eDebugNoNewLine("SIMULATE:"); \
+ eDebugNoNewLine(x); \
+ }
+#endif
void eDVBDiseqcCommand::setCommandString(const char *str)
{
@@ -725,34 +729,58 @@ int eDVBFrontend::readFrontendData(int type)
if (!strcmp(m_description, "BCM4501 (internal)"))
{
unsigned int SDS_SNRE = snr << 16;
+ float snr_in_db;
- static float SNR_COEFF[6] = {
- 100.0 / 4194304.0,
- -7136.0 / 4194304.0,
- 197418.0 / 4194304.0,
- -2602183.0 / 4194304.0,
- 20377212.0 / 4194304.0,
- -37791203.0 / 4194304.0,
- };
-
- float fval1, fval2, snr_in_db;
- int i;
- fval1 = 12.44714 - (2.0 * log10(SDS_SNRE / 256.0));
- fval2 = pow(10.0, fval1)-1;
- fval1 = 10.0 * log10(fval2);
-
- if (fval1 < 10.0)
+ if (parm_u_qpsk_fec_inner <= FEC_AUTO) // DVB-S1 / QPSK
{
- fval2 = SNR_COEFF[0];
- for (i=0; i<6; ++i)
+ static float SNR_COEFF[6] = {
+ 100.0 / 4194304.0,
+ -7136.0 / 4194304.0,
+ 197418.0 / 4194304.0,
+ -2602183.0 / 4194304.0,
+ 20377212.0 / 4194304.0,
+ -37791203.0 / 4194304.0,
+ };
+ float fval1 = 12.44714 - (2.0 * log10(SDS_SNRE / 256.0)),
+ fval2 = pow(10.0, fval1)-1;
+ fval1 = 10.0 * log10(fval2);
+
+ if (fval1 < 10.0)
{
- fval2 *= fval1;
- fval2 += SNR_COEFF[i];
+ fval2 = SNR_COEFF[0];
+ for (int i=0; i<6; ++i)
+ {
+ fval2 *= fval1;
+ fval2 += SNR_COEFF[i];
+ }
+ fval1 = fval2;
}
- fval1 = fval2;
+ snr_in_db = fval1;
}
- snr_in_db = fval1;
+#if HAVE_DVB_API_VERSION >= 3
+ else
+ {
+ float fval1 = SDS_SNRE / 268435456.0,
+ fval2, fval3, fval4;
+ if (parm_u_qpsk_fec_inner <= FEC_S2_QPSK_9_10) // DVB-S2 QPSK
+ {
+ fval2 = 6.76;
+ fval3 = 4.35;
+ }
+ else // 8PSK
+ {
+ fval1 *= 0.5;
+ fval2 = 8.06;
+ fval3 = 6.18;
+ }
+ fval4 = -10.0 * log10(fval1);
+ fval1 = fval4;
+ for (int i=0; i < 5; ++i)
+ fval1 = fval4 - fval2 * log10(1.0+pow(10.0, (fval3-fval1)/fval2));
+ snr_in_db = fval1;
+ }
+#endif
return (int)(snr_in_db * 100.0);
}
else if (strstr(m_description, "Alps BSBE1 C01A") ||
@@ -781,7 +809,6 @@ int eDVBFrontend::readFrontendData(int type)
i;
if(INRANGE(CN_lookup[Imin][REGVAL],regval,CN_lookup[Imax][REGVAL]))
{
- long val;
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index a2cce94d..cda05894 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -315,7 +315,7 @@ public:
// iStaticServiceInformation
RESULT getName(const eServiceReference &ref, std::string &name);
RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
- int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+ int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
PyObject *getInfoObject(const eServiceReference &ref, int); // implemented in lib/service/servicedvb.h
/* for filtering: */
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 692428d7..842d6979 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -1,3 +1,4 @@
+#include <lib/base/nconfig.h> // access to python config
#include <lib/base/eerror.h>
#include <lib/dvb/pmt.h>
#include <lib/dvb/specs.h>
@@ -6,6 +7,7 @@
#include <lib/dvb_ci/dvbci.h>
#include <lib/dvb/epgcache.h>
#include <lib/dvb/scan.h>
+#include <lib/dvb_ci/dvbci_session.h>
#include <dvbsi++/ca_descriptor.h>
#include <dvbsi++/ca_program_map_section.h>
#include <dvbsi++/teletext_descriptor.h>
@@ -14,7 +16,6 @@
#include <dvbsi++/stream_identifier_descriptor.h>
#include <dvbsi++/subtitling_descriptor.h>
#include <dvbsi++/teletext_descriptor.h>
-#include <lib/base/nconfig.h> // access to python config
eDVBServicePMTHandler::eDVBServicePMTHandler()
:m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF)
@@ -677,7 +678,7 @@ ChannelMap eDVBCAService::exist_channels;
ePtr<eConnection> eDVBCAService::m_chanAddedConn;
eDVBCAService::eDVBCAService()
- : m_prev_build_hash(0), m_sendstate(0), m_retryTimer(eTimer::create(eApp))
+ :m_buffer(512), m_prev_build_hash(0), m_sendstate(0), m_retryTimer(eTimer::create(eApp))
{
memset(m_used_demux, 0xFF, sizeof(m_used_demux));
CONNECT(m_retryTimer->timeout, eDVBCAService::sendCAPMT);
@@ -864,19 +865,100 @@ channel_data *eDVBCAService::getChannelData(eDVBChannelID &chid)
}
// end static methods
+#define CA_REPLY_DEBUG
+#define MAX_LENGTH_BYTES 4
+#define MIN_LENGTH_BYTES 1
+
void eDVBCAService::socketCB(int what)
{
- if (what & eSocketNotifier::Read)
- /*eDebug("[eDVBCAService] data to read\n")*/;
- if (what & eSocketNotifier::Priority)
- /*eDebug("[eDVBCAService] priority data to read\n")*/;
+ if (what & (eSocketNotifier::Read | eSocketNotifier::Priority))
+ {
+ char msgbuffer[4096];
+ ssize_t length = read(m_sock, msgbuffer, sizeof(msgbuffer));
+ if (length == -1)
+ {
+ if (errno != EAGAIN && errno != EINTR && errno != EBUSY)
+ {
+ eDebug("[eSocketMMIHandler] read (%m)");
+ what |= eSocketNotifier::Error;
+ }
+ } else if (length == 0)
+ {
+ what |= eSocketNotifier::Hungup;
+ } else
+ {
+ int len = length;
+ unsigned char *data = (unsigned char*)msgbuffer;
+ int clear = 1;
+ // If a new message starts, then the previous message
+ // should already have been processed. Otherwise the
+ // previous message was incomplete and should therefore
+ // be deleted.
+ if ((len >= 1) && ((data[0] & 0xFF) != 0x9f))
+ clear = 0;
+ if ((len >= 2) && ((data[1] & 0x80) != 0x80))
+ clear = 0;
+ if ((len >= 3) && ((data[2] & 0x80) != 0x00))
+ clear = 0;
+ if (clear)
+ {
+ m_buffer.clear();
+#ifdef CA_REPLY_DEBUG
+ eDebug("clear buffer");
+#endif
+ }
+#ifdef CA_REPLY_DEBUG
+ eDebug("Put to buffer:");
+ for (int i=0; i < len; ++i)
+ eDebugNoNewLine("%02x ", data[i]);
+ eDebug("\n--------");
+#endif
+ m_buffer.write( data, len );
+
+ while ( m_buffer.size() >= (3 + MIN_LENGTH_BYTES) )
+ {
+ unsigned char tmp[3+MAX_LENGTH_BYTES];
+ m_buffer.peek(tmp, 3+MIN_LENGTH_BYTES);
+ if (((tmp[0] & 0xFF) != 0x9f) || ((tmp[1] & 0x80) != 0x80) || ((tmp[2] & 0x80) != 0x00))
+ {
+ m_buffer.skip(1);
+#ifdef CA_REPLY_DEBUG
+ eDebug("skip %02x", tmp[0]);
+#endif
+ continue;
+ }
+ if (tmp[3] & 0x80)
+ {
+ int peekLength = (tmp[3] & 0x7f) + 4;
+ if (m_buffer.size() < peekLength)
+ continue;
+ m_buffer.peek(tmp, peekLength);
+ }
+ int size=0;
+ int LengthBytes=eDVBCISession::parseLengthField(tmp+3, size);
+ int messageLength = 3+LengthBytes+size;
+ if ( m_buffer.size() >= messageLength )
+ {
+ unsigned char dest[messageLength];
+ m_buffer.read(dest, messageLength);
+#ifdef CA_REPLY_DEBUG
+ eDebug("dump ca reply:");
+ for (int i=0; i < messageLength; ++i)
+ eDebugNoNewLine("%02x ", dest[i]);
+ eDebug("\n--------");
+#endif
+// /*emit*/ mmi_progress(0, dest, (const void*)(dest+3+LengthBytes), messageLength-3-LengthBytes);
+ }
+ }
+ }
+ }
if (what & eSocketNotifier::Hungup) {
- /*eDebug("[eDVBCAService] connection closed\n")*/;
+ /*eDebug("[eDVBCAService] connection closed")*/;
m_sendstate=1;
sendCAPMT();
}
if (what & eSocketNotifier::Error)
- /*eDebug("[eDVBCAService] connection error\n")*/;
+ eDebug("[eDVBCAService] connection error");
}
void eDVBCAService::Connect()
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index 107b071a..ff0ef046 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -3,6 +3,7 @@
#ifndef SWIG
#include <map>
+#include <lib/base/buffer.h>
#include <lib/dvb/idvb.h>
#include <lib/dvb/dvb.h>
#include <lib/dvb/idemux.h>
@@ -35,6 +36,7 @@ typedef std::map<iDVBChannel*, channel_data*> ChannelMap;
class eDVBCAService: public Object
{
+ eIOBuffer m_buffer;
ePtr<eSocketNotifier> m_sn;
eServiceReferenceDVB m_service;
uint8_t m_used_demux[32];
diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp
index 39117194..ecc19b53 100644
--- a/lib/gdi/lcd.cpp
+++ b/lib/gdi/lcd.cpp
@@ -166,8 +166,14 @@ void eDBoxLCD::update()
memset(raw, 0, 64*64);
for (y=0; y<64; y++)
{
+ int pix=0;
for (x=0; x<128 / 2; x++)
- raw[y*64+x] = (_buffer[y*132 + x * 2 + 2] & 0xF0) |(_buffer[y*132 + x * 2 + 1 + 2] >> 4);
+ {
+ pix = (_buffer[y*132 + x * 2 + 2] & 0xF0) |(_buffer[y*132 + x * 2 + 1 + 2] >> 4);
+ if (inverted)
+ pix = 0xFF - pix;
+ raw[y*64+x] = pix;
+ }
}
if (lcdfd >= 0)
write(lcdfd, raw, 64*64);
diff --git a/lib/gui/epositiongauge.cpp b/lib/gui/epositiongauge.cpp
index 4785d7af..b3ee5111 100644
--- a/lib/gui/epositiongauge.cpp
+++ b/lib/gui/epositiongauge.cpp
@@ -126,13 +126,17 @@ int ePositionGauge::event(int event, void *data, void *data2)
continue;
} else if (i->what == 1) /* out */
out = i++->where;
- else /* mark */
+ else if (i->what == 2) /* mark */
{
int xm = scale(i->where);
painter.setForegroundColor(gRGB(0xFF8080));
painter.fill(eRect(xm - 2, 0, 4, s.height()));
i++;
continue;
+ } else /* other marker, like last position */
+ {
+ ++i;
+ continue;
}
}
diff --git a/lib/python/Components/Lcd.py b/lib/python/Components/Lcd.py
index 0471843c..0e501237 100644
--- a/lib/python/Components/Lcd.py
+++ b/lib/python/Components/Lcd.py
@@ -44,9 +44,14 @@ def InitLcd():
ilcd = LCD()
- config.lcd.bright = ConfigSlider(default=10, limits=(0, 10))
+ config.lcd.standby = ConfigSlider(default=0, limits=(0, 10))
+ config.lcd.standby.addNotifier(setLCDbright);
+ config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby)
+
+ config.lcd.bright = ConfigSlider(default=5, limits=(0, 10))
config.lcd.bright.addNotifier(setLCDbright);
config.lcd.bright.apply = lambda : setLCDbright(config.lcd.bright)
+ config.lcd.bright.callNotifiersOnSaveAndCancel = True
if not ilcd.isOled():
config.lcd.contrast = ConfigSlider(default=5, limits=(0, 20))
@@ -54,9 +59,6 @@ def InitLcd():
else:
config.lcd.contrast = ConfigNothing()
- config.lcd.standby = ConfigSlider(default=0, limits=(0, 10))
- config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby)
-
config.lcd.invert = ConfigYesNo(default=False)
config.lcd.invert.addNotifier(setLCDinverted);
else:
diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py
index 3c7a147e..32fca47f 100644
--- a/lib/python/Components/NimManager.py
+++ b/lib/python/Components/NimManager.py
@@ -1,3 +1,5 @@
+from Tools.HardwareInfo import HardwareInfo
+
from config import config, ConfigSubsection, ConfigSelection, ConfigFloat, \
ConfigSatlist, ConfigYesNo, ConfigInteger, ConfigSubList, ConfigNothing, \
ConfigSubDict, ConfigOnOff, ConfigDateTime
@@ -153,6 +155,7 @@ class SecConfigure:
for slot in nim_slots:
x = slot.slot
nim = slot.config
+ hw = HardwareInfo()
if slot.isCompatible("DVB-S"):
print "slot: " + str(x) + " configmode: " + str(nim.configMode.value)
if nim.configMode.value in [ "loopthrough", "satposdepends", "nothing" ]:
@@ -185,7 +188,7 @@ class SecConfigure:
loValue = rotorParam.EAST
else:
loValue = rotorParam.WEST
- inputPowerDelta=50
+ inputPowerDelta=hw.get_device_name() == "dm8000" and 15 or 50
useInputPower=False
turning_speed=0
if nim.powerMeasurement.value:
@@ -656,7 +659,7 @@ class NimManager:
def canEqualTo(self, slotid):
type = self.getNimType(slotid)
- if self.getNimConfig(slotid) == "DVB-S2":
+ if type == "DVB-S2":
type = "DVB-S"
nimList = self.getNimListOfType(type, slotid)
for nim in nimList[:]:
@@ -664,10 +667,10 @@ class NimManager:
if mode.configMode.value == "loopthrough" or mode.configMode.value == "satposdepends":
nimList.remove(nim)
return nimList
-
+
def canDependOn(self, slotid):
type = self.getNimType(slotid)
- if self.getNimConfig(slotid) == "DVB-S2":
+ if type == "DVB-S2":
type = "DVB-S"
nimList = self.getNimListOfType(type, slotid)
positionerList = []
@@ -680,6 +683,13 @@ class NimManager:
if lnb != 0:
nimHaveRotor = True
break
+ if not nimHaveRotor:
+ for sat in mode.advanced.sat.values():
+ lnb_num = int(sat.lnb.value)
+ diseqcmode = lnb_num and mode.advanced.lnb[lnb_num].diseqcMode.value or ""
+ if diseqcmode == "1_2":
+ nimHaveRotor = True
+ break
if nimHaveRotor:
alreadyConnected = False
for testnim in nimList:
@@ -842,6 +852,7 @@ def InitSecParams():
def InitNimManager(nimmgr):
InitSecParams()
+ hw = HardwareInfo()
config.Nims = ConfigSubList()
for x in range(len(nimmgr.nim_slots)):
@@ -972,7 +983,7 @@ def InitNimManager(nimmgr):
nim.advanced.lnb[x].latitude = ConfigFloat(default = [50,767], limits = [(0,359),(0,999)])
nim.advanced.lnb[x].latitudeOrientation = ConfigSelection(choices = [("north", _("North")), ("south", _("South"))], default = "north")
nim.advanced.lnb[x].powerMeasurement = ConfigYesNo(default=True)
- nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=50, limits=(0, 100))
+ nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100))
nim.advanced.lnb[x].turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch"))], default = "fast")
btime = datetime(1970, 1, 1, 7, 0);
nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 600)
diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py
index e793cdcd..031c9cae 100644
--- a/lib/python/Components/TimerSanityCheck.py
+++ b/lib/python/Components/TimerSanityCheck.py
@@ -1,9 +1,7 @@
-import string
import NavigationInstance
from time import localtime
-from Components.NimManager import nimmanager
from ServiceReference import ServiceReference
-from enigma import iServiceInformation, eServiceCenter
+from enigma import iServiceInformation, eServiceCenter, eServiceReference
class TimerSanityCheck:
def __init__(self, timerlist, newtimer=None):
@@ -54,6 +52,7 @@ class TimerSanityCheck:
# index -1 for the new Timer, 0..n index of the existing timers
# count of running timers
+ serviceHandler = eServiceCenter.getInstance()
print "checkTimerlist"
# create a list with all start and end times
# split it into recurring and singleshot timers
@@ -149,9 +148,7 @@ class TimerSanityCheck:
fakeRecList = []
ConflictTimer = None
ConflictTunerType = None
- ConflictSlot = None
newTimerTunerType = None
- newTimerTunerSlot = None
cnt = 0
idx = 0
overlaplist = []
@@ -162,24 +159,45 @@ class TimerSanityCheck:
else:
timer = self.timerlist[event[2]]
if event[1] == self.bflag:
- fakeRecService = NavigationInstance.instance.recordService(timer.service_ref)
- fakeRecResult = fakeRecService.start(True)
- feinfo = fakeRecService.frontendInfo().getFrontendData()
- tunerType = feinfo.get("tuner_type")
- tunerSlot = feinfo.get("tuner_number")
+ tunerType = [ ]
+ fakeRecService = NavigationInstance.instance.recordService(timer.service_ref, True)
+ if fakeRecService:
+ fakeRecResult = fakeRecService.start(True)
+ else:
+ fakeRecResult = -1
+ if not fakeRecResult: # tune okay
+ feinfo = fakeRecService.frontendInfo().getFrontendData()
+ tunerType.append(feinfo.get("tuner_type"))
+ else: # tune failed.. so we must go another way to get service type (DVB-S, DVB-T, DVB-C)
+
+ def getServiceType(ref): # helper function to get a service type of a service reference
+ serviceInfo = serviceHandler.info(ref)
+ serviceInfo = serviceInfo and serviceInfo.getInfoObject(ref, iServiceInformation.sTransponderData)
+ if serviceInfo:
+ return { "Satellite" : "DVB-S", "Cable" : "DVB-C", "Terrestrial" : "DVB-T"}[serviceInfo["type"]]
+
+ ref = timer.service_ref.ref
+ if ref.flags & eServiceReference.isGroup: # service group ?
+ serviceList = serviceHandler.list(ref) # get all alternative services
+ if serviceList:
+ for ref in serviceList.getContent("R"): # iterate over all group service references
+ type = getServiceType(ref)
+ if not type in tunerType: # just add single time
+ tunerType.append(type)
+ else:
+ tunerType.append(getServiceType(ref))
+
if event[2] == -1: # new timer
newTimerTunerType = tunerType
- newTimerTunerSlot = tunerSlot
- overlaplist.append((fakeRecResult, timer, tunerType, tunerSlot))
+ overlaplist.append((fakeRecResult, timer, tunerType))
fakeRecList.append((timer, fakeRecService))
if fakeRecResult:
if ConflictTimer is None: # just take care of the first conflict
ConflictTimer = timer
ConflictTunerType = tunerType
- ConflictTunerSlot = tunerSlot
elif event[1] == self.eflag:
for fakeRec in fakeRecList:
- if timer == fakeRec[0]:
+ if timer == fakeRec[0] and fakeRec[1]:
NavigationInstance.instance.stopRecordService(fakeRec[1])
fakeRecList.remove(fakeRec)
del fakeRec
@@ -211,7 +229,6 @@ class TimerSanityCheck:
if nt and kt:
ConflictTimer = self.newtimer
ConflictTunerType = newTimerTunerType
- ConflictSlot = newTimerTunerSlot
break
self.simultimer = [ ConflictTimer ]
@@ -223,8 +240,11 @@ class TimerSanityCheck:
else:
continue
for entry in event[4]:
- if not self.simultimer.count(entry[1]) and (entry[2] == ConflictTunerType or entry[3] == ConflictTunerSlot):
- self.simultimer.append(entry[1])
+ if not entry[1] in self.simultimer:
+ for x in entry[2]:
+ if x in ConflictTunerType:
+ self.simultimer.append(entry[1])
+ break
if len(self.simultimer) < 2:
print "Bug: unknown Conflict!"
diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py
index c21a9192..4ddcabec 100755
--- a/lib/python/Components/config.py
+++ b/lib/python/Components/config.py
@@ -34,6 +34,7 @@ class ConfigElement(object):
self.save_disabled = False
self.notifiers = []
self.enabled = True
+ self.callNotifiersOnSaveAndCancel = False
# you need to override this to do input validation
def setValue(self, value):
@@ -66,9 +67,13 @@ class ConfigElement(object):
self.saved_value = None
else:
self.saved_value = self.tostring(self.value)
+ if self.callNotifiersOnSaveAndCancel:
+ self.changed()
def cancel(self):
self.load()
+ if self.callNotifiersOnSaveAndCancel:
+ self.changed()
def isChanged(self):
sv = self.saved_value
diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py
index 887e1674..580673e4 100755
--- a/lib/python/Screens/NetworkSetup.py
+++ b/lib/python/Screens/NetworkSetup.py
@@ -50,8 +50,8 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
Screen.__init__(self, session)
HelpableScreen.__init__(self)
- self.wlan_errortext = _("No working wireless networkadapter found.\nPlease verify that you have attached a compatible WLAN USB Stick and your Network is configured correctly.")
- self.lan_errortext = _("No working local networkadapter found.\nPlease verify that you have attached a network cable and your Network is configured correctly.")
+ self.wlan_errortext = _("No working wireless network adapter found.\nPlease verify that you have attached a compatible WLAN device and your network is configured correctly.")
+ self.lan_errortext = _("No working local network adapter found.\nPlease verify that you have attached a network cable and your network is configured correctly.")
self.oktext = _("Press OK on your remote control to continue.")
self.restartLanRef = None
@@ -67,18 +67,18 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
{
- "cancel": (self.close, _("exit networkinterface list")),
+ "cancel": (self.close, _("exit network interface list")),
"ok": (self.okbuttonClick, _("select interface")),
})
self["ColorActions"] = HelpableActionMap(self, "ColorActions",
{
- "red": (self.close, _("exit networkinterface list")),
+ "red": (self.close, _("exit network interface list")),
})
self["DefaultInterfaceAction"] = HelpableActionMap(self, "ColorActions",
{
- "blue": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more then one interface is active.")] ),
+ "blue": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more than one interface is active.")] ),
})
self.list = []
@@ -273,13 +273,18 @@ class NameserverSetup(Screen, ConfigListScreen, HelpableScreen):
self.createSetup()
class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
- def __init__(self, session, iface,essid=None, aplist=None):
+ def __init__(self, session, networkinfo, essid=None, aplist=None):
Screen.__init__(self, session)
HelpableScreen.__init__(self)
self.session = session
- self.iface = iface
- self.essid = essid
- self.aplist = aplist
+ if isinstance(networkinfo, (list, tuple)):
+ self.iface = networkinfo[0]
+ self.essid = networkinfo[1]
+ self.aplist = networkinfo[2]
+ else:
+ self.iface = networkinfo
+ self.essid = essid
+ self.aplist = aplist
self.extended = None
self.applyConfigRef = None
self.finished_cb = None
@@ -290,19 +295,19 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
{
- "cancel": (self.cancel, _("exit networkadapter setup menu")),
+ "cancel": (self.cancel, _("exit network adapter setup menu")),
"ok": (self.ok, _("select menu entry")),
})
self["ColorActions"] = HelpableActionMap(self, "ColorActions",
{
- "red": (self.cancel, _("exit networkadapter configuration")),
+ "red": (self.cancel, _("exit network adapter configuration")),
"blue": (self.KeyBlue, _("open nameserver configuration")),
})
self["VirtualKB"] = HelpableActionMap(self, "ColorActions",
{
- "green": (self.KeyGreen, [_("open virtual keyboard input help"),_("* Only available when entering hidden ssid or network key")] ),
+ "green": (self.KeyGreen, [_("open virtual keyboard input help"),_("* Only available when entering hidden SSID or network key")] ),
})
self["actions"] = NumberActionMap(["SetupActions"],
@@ -516,7 +521,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
if self.iface == "wlan0" or self.iface == "ath0" :
if self["config"].getCurrent() == self.hiddenSSID:
if config.plugins.wlan.essid.value == 'hidden...':
- self.session.openWithCallback(self.VirtualKeyBoardSSIDCallback, VirtualKeyBoard, title = (_("Enter WLAN networkname/SSID:")), text = config.plugins.wlan.essid.value)
+ self.session.openWithCallback(self.VirtualKeyBoardSSIDCallback, VirtualKeyBoard, title = (_("Enter WLAN network name/SSID:")), text = config.plugins.wlan.essid.value)
if self["config"].getCurrent() == self.encryptionKey:
self.session.openWithCallback(self.VirtualKeyBoardKeyCallback, VirtualKeyBoard, title = (_("Enter WLAN passphrase/key:")), text = config.plugins.wlan.encryption.psk.value)
@@ -600,7 +605,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
iNetwork.deactivateInterface(self.iface)
iNetwork.writeNetworkConfig()
iNetwork.restartNetwork(self.applyConfigDataAvail)
- self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait while activating your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait for activation of your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False)
else:
self.cancel()
@@ -616,10 +621,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
if data is True:
num_configured_if = len(iNetwork.getConfiguredAdapters())
if num_configured_if >= 2:
- self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("Your network configuration has been activated.\nA second configured interface has been found.\n\nDo you want to disable the second networkinterface?"), default = True)
+ self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("Your network configuration has been activated.\nA second configured interface has been found.\n\nDo you want to disable the second network interface?"), default = True)
else:
if self.finished_cb:
- self.session.openWithCallback(self.finished_cb, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
+ self.session.openWithCallback(lambda x : self.finished_cb(), MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
else:
self.session.openWithCallback(self.ConfigfinishedCB, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
@@ -695,7 +700,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
self.oktext = _("Press OK on your remote control to continue.")
self.reboottext = _("Your Dreambox will restart after pressing OK on your remote control.")
- self.errortext = _("No working wireless interface found.\n Please verify that you have attached a compatible WLAN device or enable you local network interface.")
+ self.errortext = _("No working wireless network interface found.\n Please verify that you have attached a compatible WLAN device or enable your local network interface.")
self["WizardActions"] = HelpableActionMap(self, "WizardActions",
{
@@ -1404,4 +1409,5 @@ class NetworkAdapterTest(Screen):
except ImportError:
pass
else:
- iStatus.stopWlanConsole() \ No newline at end of file
+ iStatus.stopWlanConsole()
+
diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py
index 800bab33..aae345db 100644
--- a/lib/python/Screens/TimerEdit.py
+++ b/lib/python/Screens/TimerEdit.py
@@ -317,6 +317,7 @@ class TimerSanityConflict(Screen):
EMPTY = 0
ENABLE = 1
DISABLE = 2
+ EDIT = 3
def __init__(self, session, timer):
Screen.__init__(self, session)
@@ -338,10 +339,11 @@ class TimerSanityConflict(Screen):
self["key_red"] = Button("Edit")
self["key_green"] = Button(" ")
- self["key_yellow"] = Button("Edit")
+ self["key_yellow"] = Button(" ")
self["key_blue"] = Button(" ")
self.key_green_choice = self.EMPTY
+ self.key_yellow_choice = self.EMPTY
self.key_blue_choice = self.EMPTY
self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ShortcutActions", "TimerEditActions"],
@@ -415,9 +417,14 @@ class TimerSanityConflict(Screen):
self["actions"].actions.update({"green":self.toggleTimer1})
self["key_green"].setText(_("Disable"))
self.key_green_choice = self.DISABLE
+
if len(self.timer) > 1:
x = self["list"].getSelectedIndex()
if self.timer[x] is not None:
+ if self.key_yellow_choice == self.EMPTY:
+ self["actions"].actions.update({"yellow":self.editTimer2})
+ self["key_yellow"].setText(_("Edit"))
+ self.key_yellow_choice = self.EDIT
if self.timer[x].disabled and self.key_blue_choice != self.ENABLE:
self["actions"].actions.update({"blue":self.toggleTimer2})
self["key_blue"].setText(_("Enable"))
@@ -432,9 +439,11 @@ class TimerSanityConflict(Screen):
self.key_blue_choice = self.DISABLE
else:
#FIXME.... this doesnt hide the buttons self.... just the text
- self.removeAction("yellow")
- self["key_yellow"].setText(" ")
- self.key_yellow_choice = self.EMPTY
- self.removeAction("blue")
- self["key_blue"].setText(" ")
- self.key_blue_choice = self.EMPTY
+ if self.key_yellow_choice != self.EMPTY:
+ self.removeAction("yellow")
+ self["key_yellow"].setText(" ")
+ self.key_yellow_choice = self.EMPTY
+ if self.key_blue_choice != self.EMPTY:
+ self.removeAction("blue")
+ self["key_blue"].setText(" ")
+ self.key_blue_choice = self.EMPTY
diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i
index 8f05d53d..7de05d2b 100644
--- a/lib/python/enigma_python.i
+++ b/lib/python/enigma_python.i
@@ -282,9 +282,9 @@ PyObject *New_iRecordableServicePtr(const ePtr<iRecordableService> &ptr)
/* needed for service groups */
-PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore);
+PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore, bool simulate=false);
%{
-PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore)
+PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore, bool simulate=false)
{
eStaticServiceDVBBouquetInformation info;
if (info.isPlayable(bouquet_ref, ignore))
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index 0385b9c2..02fc4508 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -240,7 +240,7 @@ public:
virtual int getLength(const eServiceReference &ref);
virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=-1);
// returns true when not implemented
- virtual int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+ virtual int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
virtual int getInfo(const eServiceReference &ref, int w);
virtual std::string getInfoString(const eServiceReference &ref,int w);
diff --git a/lib/service/service.cpp b/lib/service/service.cpp
index f34237d2..eb2757ab 100644
--- a/lib/service/service.cpp
+++ b/lib/service/service.cpp
@@ -239,7 +239,7 @@ int iStaticServiceInformation::getLength(const eServiceReference &ref)
return -1;
}
-int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate)
{
return 0;
}
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 954a3964..2f98ed6b 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -412,7 +412,7 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref
return -1;
}
-int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate)
{
if (ref.flags & eServiceReference::isGroup)
{
@@ -453,7 +453,7 @@ int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref
{ 2, 1, 3 } // -T -S -C
};
((const eServiceReferenceDVB&)*it).getChannelID(chid);
- int tmp=res->canAllocateChannel(chid, chid_ignore);
+ int tmp=res->canAllocateChannel(chid, chid_ignore, simulate);
switch(tmp)
{
case 0:
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index 85e97ea1..d19b92d6 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -293,7 +293,7 @@ public:
eServiceReference &getPlayableService() { return m_playable_service; }
RESULT getName(const eServiceReference &ref, std::string &name);
int getLength(const eServiceReference &ref);
- int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+ int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
};