Die Anleitung gilt für alle Dreamboxen die einen DVB-S Tuner mit einem STV0299B-Chip (also für die meisten Satelliten-Dreamboxen) haben.
Teil 1
Zuerst bauen wir den Satfinder um (geht am schnellsten).
In der Datei satfind.cpp ist folgendes zu finden
void eSatfind::update()
{
int snr=fe->SNR(),
agc=fe->SignalStrength(),
ber=fe->BER();
eDebug("[Satfind] SNR %d(%s) AGC %d(%s) BER %d(%s) %s %s",
snr,
lsnr_num->getText().c_str(),
agc,
lsync_num->getText().c_str(),
ber,
lber_num->getText().c_str(),
c_lock->isChecked()?"LOCK":"NOLOCK",
c_sync->isChecked()?"SYNC":"NOSYNC");
snr=snr*100/65535;
agc=agc*100/65535;
p_agc->setPerc(agc);
p_snr->setPerc(snr);
p_ber->setPerc((int)log2(ber));
lsnr_num->setText(eString().sprintf("%d%%",snr));
lsync_num->setText(eString().sprintf("%d%%",agc));
lber_num->setText(eString().sprintf("%d",ber));
status=fe->Status();
c_lock->setCheck(!!(status & FE_HAS_LOCK));
c_sync->setCheck(!!(status & FE_HAS_SYNC));
#ifndef DISABLE_LCD
eZapLCD::getInstance()->lcdSatfind->update(snr,agc);
#endif
updateTimer.start(250,true);
}
Alles anzeigen
Für die Ausgabe in dB sieht die Funktion so aus:
void eSatfind::update()
{
int snr=fe->SNR(),
agc=fe->SignalStrength(),
ber=fe->BER();
eDebug("[Satfind] SNR %d(%s) AGC %d(%s) BER %d(%s) %s %s",
snr,
lsnr_num->getText().c_str(),
agc,
lsync_num->getText().c_str(),
ber,
lber_num->getText().c_str(),
c_lock->isChecked()?"LOCK":"NOLOCK",
c_sync->isChecked()?"SYNC":"NOSYNC");
float snr_db=(snr-39075)/1764.7; //die DMM(ver-)rechnung rückgänig mache
snr=(int)(snr_db*100/19.2); // die Balkenanzeige auf 0dB bis 19.2dB skalieren
if (snr<0) snr=0; // negative dB-Werte nict an die Balkenanzeige weiterreichen
agc=agc*100/65535;
p_agc->setPerc(agc);
p_snr->setPerc(snr);
p_ber->setPerc((int)log2(ber));
lsnr_num->setText(eString().sprintf("% 2.1f dB",snr_db));
lsync_num->setText(eString().sprintf("%d%%",agc));
lber_num->setText(eString().sprintf("%d",ber));
status=fe->Status();
c_lock->setCheck(!!(status & FE_HAS_LOCK));
c_sync->setCheck(!!(status & FE_HAS_SYNC));
#ifndef DISABLE_LCD
eZapLCD::getInstance()->lcdSatfind->update(snr,agc);
#endif
updateTimer.start(250,true);
}
Alles anzeigen
Wozu ist das nun gut?
Na ganz einfach, die Werte entsprechen jetzt genau dennen die man mit einen Profimessgerät (damit misst man Profis ) zB. MSK33 auch erhält. Mit 0.1dB Auflösung kann man einen Spiegel wirklich genau ausrichten.
Ausserdem ist die Balkenanzeige jetzt aussagekräftiger. Wer weis den schon wieso man kein Bild bekommt, obwohl "50%" SNR da ist, und überhaupt von was hat man den da 50%.
So nun noch ein paar Tips zu den dB-Werten:
<-1dB da ist igendwas oberfaul (!!! Kabel, LNB und Multischalter prüfen !!!), mit angeschlossenem LNB sollten es mindestens 0dB sein, auch wenn der Spiegel noch nicht auf den Satelliten ausgerichtet ist
-1dB ... 5dB Signal zu schwach
5... 7dB schwaches Signal, neigt zu Klötzchenbildung
>7dB sollte ohne Probleme zu empfangen sein.
Mit meiner Antenne bekomme ich auf Astra ARD 11.836GHz ca. 10.7 dB, den Maximalwert von 19.2dB bekommt man wahrscheinlich nur im Meßlabor zu Weihnachten.
Wie man die dB-Ausgabe in der den Menüs der Sendersuche ändert folgt morgen in Teil 2.
Teil 2
Heute sind die SNR-Werte für manuelle und automatische Sendersuche drann:
In der Datei enigma_main.cpp ist die Funktion eZapMain::showSNR() wie folgt zu änder:
Originalcode
/* SNR,AGC,BER DISPLAY begin */
void eZapMain::showSNR()
{
int snr=eFrontend::getInstance()->SNR()*100/65536;
int agc=eFrontend::getInstance()->SignalStrength()*100/65536;
int ber=eFrontend::getInstance()->BER();
p_agc->setPerc((agc));
p_snr->setPerc((snr));
p_ber->setPerc((int)log2(ber));
lsnr_num->setText(eString().sprintf("%d%%",snr));
lsync_num->setText(eString().sprintf("%d%%",agc));
lber_num->setText(eString().sprintf("%d",ber));
}
/* SNR,AGC,BER DISPLAY end */
Alles anzeigen
Auf dB umgeschriebener Code
/* SNR,AGC,BER DISPLAY begin */
void eZapMain::showSNR()
{
float snr_db=(eFrontend::getInstance()->SNR()-39075)/1764.7;
int snr=(int)(snr_db*100/19.2);
if(snr<0)snr=0;
int agc=eFrontend::getInstance()->SignalStrength()*100/65536;
int ber=eFrontend::getInstance()->BER();
p_agc->setPerc((agc));
p_snr->setPerc((snr));
p_ber->setPerc((int)log2(ber));
lsnr_num->setText(eString().sprintf("% 2.1f db",snr_db));
lsync_num->setText(eString().sprintf("%d%%",agc));
lber_num->setText(eString().sprintf("%d",ber));
}
/* SNR,AGC,BER DISPLAY end */
Alles anzeigen
Bei der Gelegenheit sollte auch gleich die Zeile 4132 geändert werden, weil durch die "hardgecodeten" Umlaute einige Editoren aus dem konzept gebracht werden (z.B KDevelop). Um das zu umgehen werden einfach die ASCII-Codes im Oktalcode als Steuerzeichen an den String übergeben.
So sollte die Zeile aussehen
TextEditWindow wnd(_("Enter new Filename:"),"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 -_\344\366\374\304\326\334");
Originalcode
static eString satFinder(eString request, eString dirpath, eString opts, eHTTPConnection *content)
{
if (opts != lastTransponder)
tuneTransponder(opts);
content->local_header["Content-Type"]="text/html; charset=utf-8";
eString result = readFile(TEMPLATE_DIR + "satFinder.tmp");
eFrontend *fe = eFrontend::getInstance();
int snr = fe->SNR();
int agc = fe->SignalStrength();
unsigned int ber = fe->BER();
int status = fe->Status();
bool lock = status & FE_HAS_LOCK;
bool sync = status & FE_HAS_SYNC;
result.strReplace("#SNR#", eString().sprintf("%d", snr * 100 / 65535));
result.strReplace("#SNRBAR#", genBar(snr * 100 / 65535));
result.strReplace("#AGC#", eString().sprintf("%d", agc * 100 / 65535));
result.strReplace("#AGCBAR#", genBar(agc * 100 / 65535));
result.strReplace("#BER#", eString().sprintf("%d", ber));
result.strReplace("#BERBAR#", genBar(ber));
result.strReplace("#LOCK#", (lock) ? "checked" : "");
result.strReplace("#SYNC#", (sync) ? "checked" : "");
return result;
}
Alles anzeigen
Auf dB umgeschriebener Code
static eString satFinder(eString request, eString dirpath, eString opts, eHTTPConnection *content)
{
if (opts != lastTransponder)
tuneTransponder(opts);
content->local_header["Content-Type"]="text/html; charset=utf-8";
eString result = readFile(TEMPLATE_DIR + "satFinder.tmp");
eFrontend *fe = eFrontend::getInstance();
float snr_db = (fe->SNR()-39075)/1764.7;
int snr_perc = (snr_db * 100) / 19.2;
if (snr_perc<0)snr_perc=0;
int agc = fe->SignalStrength();
unsigned int ber = fe->BER();
int status = fe->Status();
bool lock = status & FE_HAS_LOCK;
bool sync = status & FE_HAS_SYNC;
result.strReplace("#SNR#", eString().sprintf("% 2.1f dB",snr_db));
result.strReplace("#SNRBAR#", genBar(snr_perc));
result.strReplace("#AGC#", eString().sprintf("%d", agc * 100 / 65535));
result.strReplace("#AGCBAR#", genBar(agc * 100 / 65535));
result.strReplace("#BER#", eString().sprintf("%d", ber));
result.strReplace("#BERBAR#", genBar(ber));
result.strReplace("#LOCK#", (lock) ? "checked" : "");
result.strReplace("#SYNC#", (sync) ? "checked" : "");
return result;
}
Alles anzeigen
Ebenfalls in der Datei enigma_dyn.cpp in der Funktion eString getBoxStatus(eString format) die Zeile
suchen (das ist etwa die 2620. Zeile) und austauschen gegen
In der Datei enigma_dyn_xml.cpp machen wir das gleiche mit der Zeile 484 nochmal.
Nun noch in der Datei dvbwidgets.cpp die Funktion FEStatusWidget::update() bearbeiten
Originalcode
void eFEStatusWidget::update()
{
int snr=fe->SNR()*100/65536,
agc=fe->SignalStrength()*100/65536,
ber=fe->BER();
p_agc->setPerc((agc));
p_snr->setPerc((snr));
p_ber->setPerc((int)log2(ber));
lsnr_num->setText(eString().sprintf("%d%%",snr));
lsync_num->setText(eString().sprintf("%d%%",agc));
lber_num->setText(eString().sprintf("%d",ber));
int status=fe->Status();
c_lock->setCheck(!!(status & FE_HAS_LOCK));
c_sync->setCheck(!!(status & FE_HAS_SYNC));
}
Alles anzeigen
Auf dB umgeschriebener Code
void eFEStatusWidget::update()
{
float snr_db=(fe->SNR()-39075)/1764.7;
int agc=fe->SignalStrength()*100/65536;
int ber=fe->BER();
int snr_perc=(int)((snr_db*100)/19.2);
if (snr_perc<0)snr_perc=0;
p_agc->setPerc((agc));
p_snr->setPerc((snr_perc));
p_ber->setPerc((int)log2(ber));
lsnr_num->setText(eString().sprintf("% 2.1f dB",snr_db));
lsync_num->setText(eString().sprintf("%d%%",agc));
lber_num->setText(eString().sprintf("%d",ber));
int status=fe->Status();
c_lock->setCheck(!!(status & FE_HAS_LOCK));
c_sync->setCheck(!!(status & FE_HAS_SYNC));
}
Alles anzeigen
Wenn in der Anzeige die Buchstaben von"dB" oben abgeschnitten werden, dann ist in der jewiligen Skin-Datei im Objekt "eFEStatusWidget" die Ausgabehöhe für das eLable "snr_num" um 2 zu erhöhen.
Für default.esml sieht das so aus (ca. Zeile 671):
Original
<eLabel name="snr_num" position="310:0" size="80:15" font="eFEStatus.values" vcenter="on" align="right" />
Für dB-Ausgabe
<eLabel name="snr_num" position="310:0" size="80:17" font="eFEStatus.values" vcenter="on" align="right" />
So, das wärs. Wenn ich nichts übersehen habe müsste jetzt überall das SNR in dB ausgegeben werden.
Und nun noch ein kleiner Bugfix in der Manuellen Sendersuche:
Wenn man im Menü der Manuellen Sendersuche ist, sich einen Transponder ausgewählt hat und LOCK sowie SYNCK ok sind und nun für ca. 10 Sekunden das Satellitensignal unterbricht (Hand vor's LNB halten oder Kabel abziehen), dann wird in den meisten Fällen, wenn das Signal wieder zu empfangen sein sollte LOCK und SYNC nicht gefunden werden.
Der eigendliche Grund dafür ist der nicht besonders clever programmierte Tunertreiber (zB. könnte der Fangbereich der AFC +/-6 MHz betragen und nicht nur die jetzigen +/-3MHz,(bitte nicht mit dem Haltebereich verwechseln oder der dynamischen Anpassung der Tunerfrequenz)), besonders die Eigenheiten des Derotators, wenn kein Signal da ist oder [Gottheit ihrer Wahl einsetzen] bewahre, gar die "magische" 3MHz-Grenze überschritten wird.
Mit viel Aufwand muß ENIGMA abfragen ob mit dem Signal und dem Tuner alles ok ist, das wäre alles Sache des Tunertreibers und würde automatisch erfolgen. Nun dem ist aber nicht so, deswegen gibt es die
in der Datei frontend.cpp die folgende Funktion (die einen kleinen Fehler hat).
Original
void eFrontend::tuneFailed()
{
if (!transponder || type == eSystemInfo::feUnknown)
return;
if (type==eSystemInfo::feSatellite)
{
eSatellite * sat = eTransponderList::getInstance()->findSatellite(transponder->satellite.orbital_position);
if (sat)
{
eLNB *lnb = sat->getLNB();
if ( lnb && lnb->getDiSEqC().DiSEqCMode == eDiSEqC::V1_2 )
{
if (curRotorPos==5000) // rotor running in input power mode
{
eDebug("[FE] ignore .. rotor is running");
return;
}
if ( curRotorPos==11000 )
{
eDebug("[FE] RotorPos uninitialized (%d)", tries);
// check every transponder two times..
if (eDVB::getInstance()->getScanAPI() && ++tries > 1)
{
tries=0;
eDebug("[FE] don't set this TP to error");
// eDebug("!!!!!!!!!!!!!!!! TUNED IN EAGAIN 2 !!!!!!!!!!!!!!!!");
/*emit*/ tunedIn(transponder, -EAGAIN); // nextTransponder
return;
}
setFrontend();
return;
}
}
}
}
// eDebug("!!!!!!!!!!!!!!!! TUNED IN ETIMEDOUT 1 !!!!!!!!!!!!!!!!");
if ( !eDVB::getInstance()->getScanAPI() )
{
if (++lostlockcount > 5)
{
needreset=2;
lostlockcount=0;
transponder->tune();
}
else
setFrontend();
}
/*emit*/ tunedIn(transponder, -ETIMEDOUT);
return;
}
Alles anzeigen
So funktioniert die Behandlung der Signalunterbrechungbei "Manueller Sendersuche"
void eFrontend::tuneFailed()
{
if (!transponder || type == eSystemInfo::feUnknown)
return;
if (type==eSystemInfo::feSatellite)
{
eSatellite * sat = eTransponderList::getInstance()->findSatellite(transponder->satellite.orbital_position);
if (sat)
{
eLNB *lnb = sat->getLNB();
if ( lnb && lnb->getDiSEqC().DiSEqCMode == eDiSEqC::V1_2 )
{
if (curRotorPos==5000) // rotor running in input power mode
{
eDebug("[FE] ignore .. rotor is running");
return;
}
if ( curRotorPos==11000 )
{
eDebug("[FE] RotorPos uninitialized (%d)", tries);
// check every transponder two times..
if (eDVB::getInstance()->getScanAPI() && ++tries > 1)
{
tries=0;
eDebug("[FE] don't set this TP to error");
// eDebug("!!!!!!!!!!!!!!!! TUNED IN EAGAIN 2 !!!!!!!!!!!!!!!!");
/*emit*/ tunedIn(transponder, -EAGAIN); // nextTransponder
return;
}
setFrontend();
return;
}
}
}
}
// eDebug("!!!!!!!!!!!!!!!! TUNED IN ETIMEDOUT 1 !!!!!!!!!!!!!!!!");
if ( !eDVB::getInstance()->getScanAPI() )
{
if (++lostlockcount > 5)
{
needreset=2;
lostlockcount=0;
transponder->tune();
}
else
setFrontend();
}
else // dieses "else setFrontend()" hat gefehlt
setFrontend();
/*emit*/ tunedIn(transponder, -ETIMEDOUT);
return;
}
Alles anzeigen
!!!Auf eigene Gefahr!!! Und NUR für CVS-Image!!!
Einfachhalber hab ich mal meine enigma Datei hier angehängt. Wenn ihr ein CVS-Image verwendet, sollte ein einfacher Test möglich sein.
So geht's:
1. FTP-Verbindung zu Box herstellen
2. die Datei usr/bin/enigma sichern (das ist euer Original und kann später wieder auf die Box)
3. Über Telnet init4 und dann killall enigma eingeben (das init4 verhindert, dass enigma nach dem killall-Befehl automatisch neu gestartet wird)
4. das entpackte enigma nach usr/bin kopieren und s das Original ersetzten (ihr habt doch hoffentlich Punkt 2 ausgefüht => Sicherheitskopie)
5. Über Telnet enigma starten
Auf die gleiche Weise kann später das Original zurückkopiert werden.
(Behauptungen, dass der enthaltene Bundestrojaner mitzählt wie oft und wie lange ihr die feindlichen Teletubbis klotzt sind natürlich vollkommen wahr )
Ich haben fertig.
viel Spaß,
adenin
PS: alle Dateien befinden sich im Archiv apps.tuxbox.enigma_cvs.tuxbox.org_20070327.tar.gz in eurem CVS sources Verzeichnis
Ah, und zu guterletzt:
Dieser Text enthält garantiert irgendwelche Fehler. Wenn es was schwerwiegendes ist, bitte melden.
Teil 3 (13.05.2007)
Ich haben doch noch nicht fertig.
Nun hab ich mein erstes Plugin geschrieben, oder besser gesagt zusammengeklaut. Genaugennommen handelt es sich um den enigma-eigene Satfinder, den ich allerding modifiziert habe.
1. die SNR-Ausgabe ist in dB (das war ja der Sinn der Sache)
2. Bug beseitigt: wenn eine Listbox geöffnet wird (Sat- oder Transponder-Auswahl), und der BER-Wert ändert sich, dann wird im Original-Satfinder die Liste gnadenlos überschrieben, so das man deren Einträge nicht mehr lesen kann. Tipp an die Entwickler: macht doch einfach ein updateTimer.stop(), wenn eine Listbox bzw. eComboBox selected ist.
Einfach die das Plugin adenin-Satfinder.ipk installieren
viel Spaß.
[EDIT 20070515]
adenin_Satfinder_20070515:
Bug beim reaktivieren der Messung nach verlassen der Satelliten- bzw. Transponderliste über EXIT-Taste beseitigt.
[EDIT 20070519]
- Anzeige der tatsächlich im Tuner eingestellten Frequenz
- Anzeige des LNB-Offset
- nach verlassen des Plugin wird der vor Benutzung des Satfinder eingestellte Sender wieder hergestellt
-Install für Gemini (Bug: Deinstallscript deinstaliert (noch) nicht, aber wer will das schon )
[EDIT 20070609]
-Soundausgabe