![]() |
|
|
Wer sich mit der Programmierung von TAPs beschäftigen will, sollte ein gewisses Grundwissen in C-Programmierung mitbringen: TAPs werden in C programmiert und können mit einer kostenlosen Entwicklungsumgebung am PC erstellt werden.
Ihr findet hier eine geniale Anleitung von Gerti zum Einrichten der Entwicklungsumgebung. Ich gehe aufgrund der Vollständigkeit von Gertis Anleitung hier nicht auf die Einrichtung ein, sondern setze voraus, daß das alles geklappt hat und ihr das dort beschriebene Testfile compiliert und getestet habt.
Wenn ihr euch in die Programmierung einarbeiten wollt, nehmt ihr euch sinnvollerweise einen dokumentierten Sourcecode vor und versucht ihn zuerst soweit zu verstehen, daß ihr kleine Änderungen vornehmen könnt. Dann experimentiert ihr ein wenig damit herum und versucht dann Stück für Stück auch größere Modifikationen vorzunehmen und letztendlich den gesamten Code zu verstehen.
Ich habe mir die Mühe gemacht, FreeSpaceBar 1.1 detailliert und in deutsch zu dokumentieren. Da die umfangreiche Dokumentation aber den Rahmen des Code-Files sprengen und es sehr unübersichtlich machen würden, habe ich den Code in der folgenden Liste dokumentiert.
Um Loszulegen, solltet ihr euch erstmal die zur Dokumentation passende Codefassung herunterladen:
Den Inhalt dieses Zipfiled entpackt ihr nach "c:\work\tap\fspacebar". Dann versucht ihr gleich mal, das File zu compilieren, indem ihr in der Kommandozeile BUILD.BAT ausführt. Hat alles geklappt (keine Fehlermeldungen des Compilers), übertragt ihr das .TAP-File auf den Topf und startet es dort. Beim Aufrufen des Festplattenmenüs sollte dann der Balken angezeigt werden.
Jetzt könnt ihr anfangen euch den Code anzuschauen - ich empfehle zuerstmal mittendrin anzufangen - und zwar beim Abschnitt "void DrawPie". Dieser Codeteil ist für das Erzeugen des Balkens zuständig und sollte weitestgehend verständlich sein. Versucht einfach mal, den Balken zu verschieben oder schmaler zu machen. Wenn das geklappt hat, könnt ihr mal mit der Höhe des Balkens experimentieren oder die Textanzeigen verändern - einfach probieren. Insbesondere der TAP_Event-Handler ist extrem unübersichtlich und schwer verständlich. Ich würde daher empfehlen, ihn erst ganz zum Schluß genauer anzuschauen.
Viel Spaß!
| #include "tap.h" | |
| #define ID_FREESPACEPIE 0x807A10B4 | |
| #define COLOR_CustomYellow RGB(28,28,7) | |
| TAP_ID (ID_FREESPACEPIE); | |
| TAP_PROGRAM_NAME ("FreeSpaceBar 1.1"); | |
| TAP_AUTHOR_NAME ("Judy (modified by Marc)"); | |
| TAP_DESCRIPTION ("Shows Free HD-Space as Bar"); | |
| TAP_ETCINFO (__DATE__); | |
| static int exitMenuShow = FALSE; | Speichert den Zustand, wenn innerhalb des Exit-Fensters |
| static TYPE_Window win; | Speichert den win-handle des Exit-Fensters |
| static int rgn; | Speichert den rgn-handle des Exit-Fensters |
| static int isPieDrawn = FALSE; | Speichert das gezeichnet-Flag des Balkens |
| static int lastwf = -1; | Speichert den letzten Übergangswert für die Neuzeichnen-Überprüfung |
| static int updatePie = FALSE; | Speichert, ob die Grafik neu gezeichnet werden muß |
| static byte *savedBox; | Speichert die letzte Bitmap |
| static dword nextTick = 0; | Speichert den tick-wert für das nächste Update |
| #define COLOR_FRed RGB(
23, 0, 0 ) #define COLOR_BRed RGB( 15, 0, 0 ) #define COLOR_FGreen RGB( 0, 23, 0 ) #define COLOR_BGreen RGB( 0, 15, 0 ) #define COLOR_LGrey RGB(160,160,160) #define COLOR_MGrey RGB(128,128,128) #define COLOR_DGrey RGB( 90, 90, 90) |
Farben für die Grafik und den Text (einige derzeit ungenutzt) |
| #define ABS(x) (((x)>0)?(x):(-(x))) | Definition der ABS-Funktion (Diese Funktion entfernt das Vorzeichen bei negativen Zahlen) |
| void DrawLine( word rgn, int Ax, int Ay, int Bx, int By, int Color ) | Diese Funktion zeichnet eine Linie in die angegebene rgn von Ax,Ay nach Bx,By in der Farbe Color |
| { | |
|
Horizontale Differenz in dX ablegen |
|
Vertikale Differenz in dY ablegen |
|
Linienanfang als CurrentX... |
|
...und CurrentY (aktuelle Position) speichern |
|
Speichert die Schrittweite in X- und Y-Richtung |
|
Legt Xincr entsprechend der benötigten Richtung für X fest |
|
Legt Yincr entsprechend der benötigten Richtung für Y fest |
|
Ist horizontal die größere Distanz zu überbrücken ? |
|
|
|
Wert für das Hochzählen, wenn "rechts" gewählt wird |
|
Wert für das Hochzählen, wenn "hoch" gewählt wird |
|
Startwert für die Entscheidung |
|
Jeden Punkt der Line auf Basis eines Zählers bis dX abarbeiten |
|
|
|
Pixel an die aktuelle Position zeichnen |
|
Geht's weiter mit "rechts" UND "hoch" ? |
|
|
|
aktuelle X- und... |
|
...Y-Positon hochzählen |
|
Entscheidungswert hochzählen (für "hoch") |
|
|
|
geht's weiter mit "rechts" ? |
|
|
|
aktuelle X-Position hochzählen |
|
Entscheidungswert hochzählen (für "rechts") |
|
|
|
|
|
|
|
Wenn vertikal die größere Distanz zu überbrücken ist: |
|
|
|
Wert für das Hochzählen, wenn "rechts" gewählt wird |
|
Wert für das Hochzählen, wenn "hoch" gewählt wird |
|
Startwert für die Entscheidung |
|
Jeden Punkt der Line auf Basis eines Zählers bis dY abarbeiten |
|
|
|
Pixel an die aktuelle Position zeichnen |
|
Geht's weiter mit "rechts" UND "hoch" ? |
|
|
|
aktuelle X- und... |
|
...Y-Positon hochzählen |
|
Entscheidungswert hochzählen (für "hoch") |
|
|
|
geht's weiter mit "hoch" ? |
|
|
|
aktuelle Y-Position hochzählen |
|
Entscheidungswert hochzählen (für "rechts") |
|
|
|
|
|
|
| } | |
| void DrawPie (void) | Hier wird der eigentliche Balken gezeichnet |
| { | |
|
Speichert den Zähler für die Zeilen |
|
Speichert die relative Position für den Übergang von rot nach grün innerhalb des Balkens |
|
Speichert den Prozentwert für den freie Platz |
|
Speichert die verbleibende Aufzeichnungszeit in Sekunden |
|
Speichert die verbleibende Aufzeichnungszeit in Minuten (derzeit nicht verwendet) |
|
Speichert die verbleibende Aufzeichnungszeit in Stunden |
|
Derzeit ungenutzt |
|
Derzeit ungenutzt |
|
Speichert die horizontale Startposition des Balkens |
|
Speichert die Breite des Balkens |
|
Zwischenspeicher für die Textausgaben |
|
rgn zurücksetzen |
|
horizontale Startposition und... |
|
...Breite des Balkens festlegen |
|
Prozentwert für freien Speicher berechnen |
|
Verbleibende Aufzeichnungsdauer in Sekunden bei 5MBit Datenrate berechnen |
|
Verbleibende Aufzeichnungsdauer auf Stunden umrechnen |
|
relative Position des Übergangs von rot nach grün bestimmen |
|
Prüfen, ob Neuzeichnen notwendig ist (Hat sich die Übergangsposition seit dem letzten Neuzeichnen verändert ?) |
|
|
|
aktuelle Übergangsposition für nächsten Neuzeichnen-Check zwischenspeichern |
|
Schleife für die einzelnen Linien des Balkens starten und bis 20 Linien hochzählen |
|
|
|
Wird die obere Hälfte des Balkens gezeichnet ? |
|
|
|
roten Teil der aktuellen Linie zeichnen, Farbwert abhängig von der Linienposition heller werden lassen (obere Hälfte des Balkens) und... |
|
...den entsprechenden grünen Rest der Linie zeichnen. |
|
|
|
untere Hälfte des Balkens: |
|
|
|
roten Teil der aktuellen Linie zeichnen, Farbwert abhängig von der Linienposition dunkler werden lassen (untere Hälfte des Balkens) und... |
|
...den entsprechenden grünen Rest der Linie zeichnen. |
|
|
|
|
|
3D-Rahmen um den Balken zeichnen |
|
Text für verbleibende Aufzeichnungszeit formatieren |
|
verbleibende Aufzeichnungszeit ausgeben. Dabei zuerst zweimal... |
|
...den Text jeweils nach links und rechts versetzt in Schwarz ausgeben und... |
|
...dann in der gewünschten Farbe drüber (so ist's besser lesbar) |
|
Text für Prozentwert formatieren |
|
Prozentwert ausgeben. Dabei zuerst zweimal... |
|
...den Text jeweils nach links und rechts versetzt in Schwarz ausgeben und... |
|
...dann in der gewünschten Farbe drüber (so ist's besser lesbar) |
|
Text für Frei/Gesamtplatz formatieren |
|
Text für Frei/Gesamtplatz ausgeben. Dabei zuerst zweimal... |
|
...den Text jeweils nach links und rechts versetzt in Schwarz ausgeben und... |
|
...dann in der gewünschten Farbe drüber (so ist's besser lesbar) |
|
Den gesamten Balken für schnelles Neuzeichnen im Puffer ablegen |
|
|
|
Werte haben sich seit den letzten Neuzeichnen nicht verändert: |
|
Zuvor gespeicherte Grafik des Balkens aus dem Puffer ausgeben |
| } | |
| void ShowMessageWin (char* lpMessage) | Nachrichtenfenster ausgeben |
| { | |
|
Speichert den rgn-handle |
|
Speichert die Breite der Nachricht |
|
rgn-Handle erzeugen |
|
Breite der Nachricht berechnen |
|
Breite abschneiden, wenn Nachricht zu lang |
|
Hintergrundkasten für das Fenster zeichnen |
|
Nachricht ausgeben |
|
1,5 Sekunden anzeigen |
|
rgn-handle wieder freigeben (und damit Fenster entfernen) |
| } | |
| void ShowExitMenuWin (char* lpTitle) | Fenster für Programmende anzeigen |
| { | |
|
Speichert die Breite des Titel-Textes |
|
rgn-handle für Fenster erzeugen |
|
Standardfarbe im Fenster verwenden |
|
Breite des Fensters berechnen |
|
Fenster erzeugen |
|
Fenstertitel setzen |
|
Yes-Item erzeugen |
|
No-Item erzeugen |
|
No-Item als Standard festlegen |
| } | |
| int IsAnythingShown (void) | Stellt fest, ob etwas angezeigt wird |
| { | |
|
Speichert OSD-BaseInfo |
|
Speichert die vertikale Adresse |
|
Speichert die Schleifenvariable für die Adresserzeugung |
|
Speichert die x-Position für Bildschirm-Scan |
|
Speicher die y-Position für Bildschirm-Scan |
|
Basisadresse des Screenbuffers ermitteln. |
|
Schleife zum Speichern der vertikalen Adressen |
|
|
|
Vertikale Adressen auslesen für 1. und... |
|
... 2. Halbbild |
|
|
|
Schleife zum scannen der Zeilen des Screenbuffers |
|
|
|
Schleife für die Spalten |
|
|
|
Wenn ein Wert zurückgemeldet wird, ist irgendetwas auf den Bildschirm gezeichnet - dann TRUE zurückmelden |
|
|
|
|
|
FALSE zurückmelden, da nichts gefunden wurde |
| } | |
| dword TAP_EventHandler (word wEvent, dword dwParam1, dword dwParam2) | Event-Handler |
| { | |
|
Speichert die States der Firmware |
|
Wenn keine Taste gedrückt ist (d.h. Event "IDLE" wird zurückgemeldet): |
|
|
|
Firmware-States abfragen |
|
Befindet sich der Balken auf dem Bildschirm ? |
|
|
|
Hat der Benutzer das Festplattenmenü verlassen ? |
|
|
|
Hat der Benutzer irgendein Menü verlassen ? |
|
|
|
Die gespeicherte Bitmap im Puffer freigeben, da Balken nicht mehr gebraucht wird. |
|
Balken-gezeichnet-Flag zurücksetzen |
|
|
|
|
|
Muß die Grafik neu gezeichnet werden ? |
|
|
|
Flag für Grafikneuzeichnung zurücksetzen |
|
Grafik neu zeichnen |
|
|
|
Ist es Zeit, die Grafik neu zu zeichnen ? |
|
|
|
Grafik neu zeichnen |
|
Zeitpunkt für nächstes Zwangsneuzeichnen festlegen (1 Sekunde weiter) |
|
|
|
|
|
Balken befindet sich nicht auf dem Bildschirm: |
|
|
|
Befinden wir uns im Festplattenmenü ? |
|
|
|
Neuzeichnen-Flag setzen |
|
Grafik neu zeichnen |
|
|
|
|
|
|
|
Hat der Benutzer eine Taste gedrückt ? |
|
|
|
Firmware-State ermitteln |
|
Befindet sich die Grafik auf dem Bildschirm ? |
|
|
|
Hat der Benutzer OK, Zurückspulen oder Vorspulen gedrückt ? Dann Flag setzen, damit Grafik im nächsten Durchlauf neu gezeichnet wird |
|
|
|
Befinden wir uns in einem Menü ? |
|
Keycode unverändert an die Firmware zurückliefern |
|
Befinden wir uns in einem Untermenü ? |
|
Keycode unverändert an die Firmware zurückliefern |
|
Wird das TAP-Exit-Menü nicht angezeigt ? |
|
|
|
Benutzer hat EXIT-Taste gedrückt und es befindet sich nichts auf dem Bildschirm: |
|
|
|
Flag zum Anzeigen des Exit-Menüs setzen |
|
Exit Menü anzeigen... |
|
...und raus hier |
|
|
|
|
|
Exit Menü wird bereits angezeigt: |
|
|
|
Benutzer hat OK gedrückt |
|
|
|
Speichert den gewählten Menüpunkt |
|
Gewählten Menüpunkt ermitteln |
|
Das Exit-Fenster entfernen |
|
rgn-Handle freigeben |
|
Flag für Exit-Fenster zurücksetzen |
|
Der Benutzer hat "Yes" gewählt: |
|
|
|
TAP beenden... |
|
...und raus hier |
|
|
|
Der Benutzer hat "No" gewählt: |
|
|
|
Exit-Tastendruck an ggf. vorhandene andere TAP's weiterleiten und raus hier |
|
|
|
|
|
Hat der Benutzer "Exit" gedrückt: |
|
|
|
Exit-Fenster entfernen |
|
rgn-Handle freigeben |
|
Flag für Exit-Fenster zurücksetzen |
|
und raus hier |
|
|
|
Der Benutzer hat irgendeine andere Taste gedrückt: |
|
|
|
Keycode an das Exit-Fenster senden... |
|
...und raus hier |
|
|
|
|
|
|
|
unverändert an die Firmware weitergeben |
| } | |
| int TAP_Main (void) | Hauptroutine für FreeSpaceBar |
| { | |
|
Startbestätigung anzeigen... |
|
...und TSR-Modus vor verlassen festlegen |
| } |
![]()
|
|
