Kochbuch: Tap starten ohne zu blockieren?

Zusatz-Programme für Receiver der 5000er und 6000er Serie.

Hier geht's um alles, was mit den TAP Anwendungen für den PVR5x00/6000 zu tun hat.
ICTag
Erfahrener Benutzer
Erfahrener Benutzer
Beiträge: 154
Registriert: Fr 9. Dez 2005, 12:38
Receivertyp: Topfield 5000 PVR (and no looking back)
Receiverfirmware: Sept 2005ph Firmware wieder
Wohnort: Baden-Württemberg

Kochbuch: Tap starten ohne zu blockieren?

#1

Beitrag von ICTag » Di 21. Mär 2006, 22:41

Hallo,


Diese Vorschlag ist in einem anderen Forum entstanden als wir diskutierten wie man einem Tap erstellen könnten, der andere Taps startet. Aber der Grund für diese Wünsch ist eigentlich, dass man den Topf sofort bedienen will, ohne auf den Auto-startendem Taps zu warten. :zzz:

Diese Vorschlag beschreibt wie man ein Tap leicht umprogrammieren kann, damit es unauffällig startet.

Es basiert auf folgenden Prämisse:
  1. Ein Tap hat ein Initialisierungsroutine der lange dauern darf, solange es die Bedienung der Topf nicht verhindert
  2. Dieses kann man ermöglichen, in dem man bei jedem Zeit-intensiven Aktion die Kontrolle an der Topf OS zurückgibt damit Tastendrücke von Topf abarbeitet werden. z.B. Wenn innerhalb eine Schleife bei jedem Durchlauf die Kontrolle an der Topf OS kurzzeitig übergeben wird.
  3. Der Tap selbst darf nicht normal arbeiten (also keine Tastendrücke selbst bearbeiten) bis der Initialisierung vorbei ist
  4. Am Ende der Initialisierung schaltet der Tap um und funktioniert wie normal.
Und hier der Rezept:

1) Man erstellt einen Ersatz-Funktion für einer (oder mehrere) verwendeten TAP APIs (z.B. TAP_MemAlloc oder TAP_HDD_Fread) und macht ein Redirect auf diesem Funktion. Es macht nur Sinn ein TAP API zu wählen der innerhalb einem Schleife aufgerufen wird. Diese neue Routine enthält einem Aufruf von TAP_SystemProc damit die Kontrolle kurzzeitig an der Topf OS geht.

Code: Alles auswählen

new_TAP_HDD_Fread(..)
{
   TAP_SystemProc();
   orig_TAP_HDD_Fread(...);
}
2) Man erstellt ein Redirekt auf diesem neuen Funktion.

Code: Alles auswählen

TAP_main
{
orig_TAP_HDD_Fread = &TAP_HDD_Fread;
TAP_HDD_Fread = &new_TAP_HDD_Fread;
...
}
3. Man erstellt ein Idle_Handler extra für das Initialisierung, der nichts tut außer der Initialisierung aufzurufen. Der Key_Handler tut nichts. Ein Funktionspointer erlaubt, dass dieses nach der Initialisierung ersetzt wird.

Code: Alles auswählen

TAP_main
{ 
   g_Idle_handler = &init_idle_handler;
   g_Key_handler = &init_key_handler;
}

TAP_EventHandler( ... )
{
	if ( event == EVT_IDLE )
		return g_Idle_Handler( ...);

	if ( event == EVT_KEY )
		return g_Key_Handler( ...);

	return dwParam1;
}

init_key_handler (..)
{
}

init_event_handler (..)
{
   if !g_started // forbid reentry
      init( );
}

init()
{ 
   g_started = TRUE;
   for ...
      ...
      TAP_HDD_Fread(..);
      ....
}
4. Am ende der Initialisierungsroutine werden alle Redirects gelöscht.

Code: Alles auswählen

init
{
....
// init aufraümen
g_Idle_Handler  = &normal_idle_handler;
g_ Key_Handler = &normal_key_handler;
TAP_HDD_Fread = old_TAP_hdd_Fread;
}
----------------------------


Das gute an diesem Algorithmus ist, dass man eine bestehende Tap schnell ändern kann ohne in der Tap-Logik einzugreifen. Es ist generisch anwendbar.

Ich habe es mit Lucky B's Geburtstagskalendar Tap ausprobiert um zu sehen ob es wirkt und es hat doch funktioniert. Ich konnte der Tap Bedienung während die Initialisierung lief :hello: Übrigens, ich habe diese Tap nur verwendet, weil der Source-Code verfügbar ist, nicht weil es der Topf beim Starten verhindert. Ich musste soger eine zusätzliche Schleife einbauen, damit Lucky's Initialisierung langsam genug war um es zu merken.


(An dieser Stelle eine dicke Willkommen an Lucky zu diese Forum :troet: Ich habe zufällig gesehen, dass er vor einer Woche hier angemeldet hat. Geburtstagkalendar war das erste Tap das ich ausprobiert habe und es ist immer noch in meinem Autostart)

Also, jetzt - Frage an Euch. Es ist immer komplizierte als man denkt. Was habe ich in diesem Methodik übersehen?

Gruß,
ICTag

PS: Es könnte sein, dass ein billig Version diese Algorithmus wäre einfach eine TAP_SystemProc aufzurufen innerhalb jedem Schleife im Initialisierungsroutine?
Zuletzt geändert von ICTag am Di 21. Mär 2006, 22:58, insgesamt 1-mal geändert.
Auto TAPs : Fastskip, Geburtstag, JAG_EPG, Improbox Premium, TF5000 Display, Filer.
Sonstige TAPs: UK OZ Surfer, Plasma EPG,
TAP commander.

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

#2

Beitrag von Harvey » Mi 22. Mär 2006, 09:30

ICTag hat geschrieben:PS: Es könnte sein, dass ein billig Version diese Algorithmus wäre einfach eine TAP_SystemProc aufzurufen innerhalb jedem Schleife im Initialisierungsroutine?
Innerhalb von TAP_EventHandler wäre das ein Ersatz.
Was innerhalb von TAP_Main passieren würde weiß ich nicht.
Laut Doku sollte man übrigens TAP_SystemProc in TSR-TAPs nicht aufrufen (also solche, die TAP_EventHandler aufrufen).
Gruss
Harvey

Benutzeravatar
Happy
TAP-Guru
TAP-Guru
Beiträge: 5718
Registriert: Fr 9. Dez 2005, 09:32
Receivertyp: TF4000-5500-6000-TMS
Wohnort: bei Karlsruhe
Kontaktdaten:

#3

Beitrag von Happy » Mi 22. Mär 2006, 10:32

Harvey hat geschrieben:Innerhalb von TAP_EventHandler wäre das ein Ersatz.
Was innerhalb von TAP_Main passieren würde weiß ich nicht.
Laut Doku sollte man übrigens TAP_SystemProc in TSR-TAPs nicht aufrufen (also solche, die TAP_EventHandler aufrufen).
Hallo,
wenn man TAP_SystemProc im TAP_Main ausführt wird der Eventhandler ausgeführt, sowohl des aufrufenden TAPs als auch der anderen TAPs.

Man kann auf diese Weise eine TSR schreiben, welches offiziell kein TSR ist. Diese ruft TAP_SystemProc in einer Schleife auf bis im Eventhandler eine Bedingung, z.B. durch Tastendruck , gesetzt wird. Da habe ich mal ein Beispielprogramm zu gesehen.
TAP_SystemProc im Eventhandler aufzurufen ist wahrscheinlich weniger ratsam. Evtl wird der Eventhandler schon wieder aufgerufen, während das TAP eigentlich noch in diesem drinhängt. Habe ich aber nie probiert.
Außerdem, wenn der Eventhandler mal läuft reagiert die FB ja auch wieder.

zu ICTags Vorschlag:
Nach einigen Versuchen scheint mir, dass der Eventhandler aller Autostart-TAPs zum ersten Mal aufgerufen wird, nachdem alle TAP_Mains abgearbeitet worden sind. Diese werden wohl nacheinander so wie sie aufgerufen gestartet.

Was passiert aber nun, wenn ich TAP_SystemProc im TAP_Main verwende?
Wird dann die Eventhandlerroutine schon früher aufgerufen ? Das wäre dann günstig für TAPs, die schon gestartet sind.
Wie verhält sich das mit den TAPs, die noch zu starten sind. Werden diese trotzdem erst nach dem Ende der anderen TAP_Mains gestartet ? Dann würde sich der Start insgesamt verzögern, bei wahrscheinlich besser Bedienbarkeit der FB. Oder führt dies dazu, dass das TAP_Main des nächsten TAPs durch Aufruf von TAP_SystemProc im vorigen TAP gestartet wird.

Mein persönlicher Vorschlag dazu wäre die TAP_Mains extrem kurz zu halten.
Man kann auch die Initialisierung eines TAPs in den Eventhandler legen und evtl über einen längeren Zeitraum verteilen. Dann erreicht man auch eine besser und frühere Reaktion der FB nach dem Starten des Topfs.
Denn wenn man eine lange Routine durch TAP_SystemProc unterbrechen kann, dann kann man sie auch auf mehrere Eventhandlerdurchläufe verteilen.

Vorteil des Vorschlags ist wohl eher, dass man die vorhandenen TAPs leichter umstricken kann.

Gruß,
Happy
:type: Meine TAPs und Tools

TF5500 PVR (Fw Jan. 2007 P)- 400GB Samsung - AC light 1.05 - Yamaha RX-V 1500
- LAN: Asus WL-500g Deluxe mit ftpd-topfield 0.7.4
TAPs: Quicktimer, Autodelete, Standby, 3PG, Automove, NiceDisplay, PowerRestore, WSS Killer, Eurostirf, Overfly
TV: Sony KDL-46W4500
TF6000 PVR (Fw Okt. 2008)- 160GB Samsung SV1604N
TAPs: iTina, Autodelete, Automove, Autoresume, NiceDisplay, WSS Killer
SRP-2100 (Fw Okt. 2009)
TAPs: SmartEPG, ChangePreview, Autodelete, Automove, BackupSettings,RescueRecs, MySkip, NiceDisplay

ICTag
Erfahrener Benutzer
Erfahrener Benutzer
Beiträge: 154
Registriert: Fr 9. Dez 2005, 12:38
Receivertyp: Topfield 5000 PVR (and no looking back)
Receiverfirmware: Sept 2005ph Firmware wieder
Wohnort: Baden-Württemberg

#4

Beitrag von ICTag » Mi 22. Mär 2006, 12:22

Happy hat geschrieben:Vorteil des Vorschlags ist wohl eher, dass man die vorhandenen TAPs leichter umstricken kann.
Das war genau meine Denkrichtung.
Happy hat geschrieben:Mein persönlicher Vorschlag dazu wäre die TAP_Mains extrem kurz zu halten.
Sehe ich auch so. Das habe ich im Geburtstagkalendar so gemacht und der läuft bei mir seit 3 Tage ohne Probleme (mit TAP_SystemProc nur im Initalizierungsroutine im EventHandler ).
Harvey hat geschrieben:Laut Doku sollte man übrigens TAP_SystemProc in TSR-TAPs nicht aufrufen (also solche, die TAP_EventHandler aufrufen).
xwiki TAP_SystemProc
xwiki hat geschrieben: It is legitimate to call this function in a TAP in TSR mode and doing so will not (by itself) cause problems.

If you do this you must be particularly careful to avoid infinite recursion (a call to TAP_SystemProc will re-enter your TAP via TAP_EventHandler, and if that in turn calls TAP_SystemProc and the cycle repeats the Toppy will crash due to a stack overflow).
Das habe ich versucht zu verhindern mit der g_started Abfrage (Punkt 3).
Gruß,
ICTag
Auto TAPs : Fastskip, Geburtstag, JAG_EPG, Improbox Premium, TF5000 Display, Filer.
Sonstige TAPs: UK OZ Surfer, Plasma EPG,
TAP commander.

Antworten

Zurück zu „TF 5x00/6000 PVR TAP“