CPX-Grundmodul: Einfach, sicher, gut

Jede neue Konfiguration einer Soft- oder Hardware erfordert ein spezielles Programm, Accessory oder CPX, wobei letzteres selten anzutreffen ist. Dies liegt mit Sicherheit am unangemessen hohen Arbeitsaufwand, den man für ein CPX-Modul aufbringen muß. Denn meistens besitzt man schon fertig programmierte Routinen, die man zur sofortigen Erstellung eines Accessorys oder Programms einbinden kann. Außerdem gibt es noch das ACS (pro), mit dem sich leicht und schnell ein solches Programm entwerfen läßt.

Warum sollte man dann nicht auf die Idee kommen, ein Grundmodul zu schaffen, bei dem man nur noch die Konfigurationsparameter ändert? So schwer es auch klingen mag, so einfach ist die Verwirklichung. Als Voraussetzung benötigt man allerdings die Hauptroutinen der CPX-Modul-Programmierung, wie sie in der ST-Computer abgedruckt worden sind [1]. Bei dem Beispiel handelt es sich um eine Druckerkonfiguration, die sich von den üblichen unterscheidet. Es zeigt die einfache Programmierung eines CPX-Moduls, wenn man die Grundroutinen schon besitzt. Der Hauptdialog besteht aus einer Überschrift, vier Menüpunkten inkl. jeweils eines Auswahlfeldes, einem Slider mit Pfeilen und den üblichen drei Bestätigungs-Buttons (s. Abb.). In den vier Menüpunkten stehen jeweils Überschriften neben jedem Auswahlpunkt, d. h. in unserem Beispiel steht „Language Char Set“ als Überschrift für „USA,Dabei werden natürlich nicht alle möglichen Auswahlpunkte gleichzeitig angezeigt, sondern immer nur der angewählte. Der Slider dient zum Scrollen der verschiedenen Einstellungen. Somit sind sehr viele Einträge möglich, auch wenn nicht alle auf einmal im Modul angezeigt werden. Mit „Sichern“ können die Einstellungen im Modul gespeichert werden. In unserem Beispiel leitet der Button aber auch noch das Kommando für die Druckereinstellung ein. Das CPX-Modul speichert erst die Einstellung in sich, nachdem die Initialisierung des Druckers mit den entsprechenden Parametern erfolgt ist. An dieser Stelle ist es sinnvoll, aber in vielen anderen Modulprogrammierungen ist es nicht notwendig. Die Buttons „Ok“, „Abbruch“ und der Closer erfüllen ihren vorgegebenen Zweck.

Bei der Programmierung des ersten CPX-Moduls sollte man am Anfang den RSC-Dialog in einem Resource Construction Set, wie man ihn auf PD-Disketten finden kann, erstellen. Als Orientierung dient die in der Abbildung dargestellte Box, die man mit allen ihren Buttons und Texten vollständig übernehmen sollte. Ihre jeweiligen Namen und Typen stehen an den Objekten, so daß das Hauptprogramm ohne Veränderungen darauf zurückgreifen kann.

Das hier beschriebene Programm „NEC Power“ nutzt eine undokumentierte Eigenschaft der Drucker P20, P30, P60 und P70 der Firma NEC. Es ist ab der Zehner-Serie der Pinwriter-Serie möglich, die DIP-Schalter dieser Drucker über Software zu verstellen. Aus diesem Grund kann man beim Hersteller ein entsprechendes Programm beziehen, jedoch ist dieses nicht als CPX-Modul erhältlich. Einmal den Befehl gewußt, kann er somit in jedes Programm aufgenommen werden. Die notwendigen Parameter sind aus der Tabelle leicht zu entnehmen. Es sei erwähnt, daß jeder Druckertyp eine andere Parameterisierung benötigt. Eine falsche Ansteuerung kann zu Fehlern führen. Seien Sie sich deshalb sicher, welchen Druckertyp Sie ansteuern möchten. Die Parameter setzen sich aus dem Menü zusammen, das man beim Ausdruck der „Printer Memory Settings“ erhält. Dieser Ausdruck dient als Vorlage für die Programmierung, da er fast wörtlich in das Programm übernommen wird. Eine ausführlichere Beschreibung finden Sie auf der MegaDisk.

Die Grundlage für das Hauptprogramm ist geschaffen. Die eigentliche Programmierung gestaltet sich sehr einfach. Als Grundlage sind unbedingt die Routinen aus [1] erforderlich. Nachdem Sie nun das RSC-File erstellt haben, sollten Sie sich die wichtigsten Daten in Arrays sichern. In das erste Array, das Sie z. B. nec_max nennen, schreiben Sie die Anzahl der möglichen Wahlfelder pro Eintrag auf. Dies wäre bei der Wahl der voreingestellten Sprachen gerade 19. Als zweites Array sollten Sie die Zeichenketten für die Pop-Ups definieren. Dabei empfiehlt es sich, die doppelte Anzahl für alle möglichen Einträge zu reservieren. Denn es kann sich ruhig die Anzeige zwischen der Anwahlmöglichkeit im Pop-Up und des angewählten Eintrages unterscheiden. Letzteres ist natürlich erheblich kürzer. In der Programmiersprache C ist das Array als Char-Pointer-Array gut aufgehoben. Das dritte und letzte Array besteht aus den Namen der Konfigurationsparameter.

Die eigentlichen Routinen füllt man in gewohnter Weise aus. Die init-Funktion kann fast wörtlich aus [1] abgeschrieben werden. Die main-Funktion ist schon etwas länger. Beim Schreiben sollten folgende Punkte erfüllt werden:

Zum anderen sollten Sie die Routinen get_traddr, redraw_object, init_slider, pos_vslider, srcoll_up, scroll_down, pull_down, button_click und wind_center selbstverständlich gemäß ihres Zweckes schreiben. Dazu kommt noch die Routine into_resource, die die neuen Angaben in das Resource einträgt. Sie ist eigentlich die wichtigste, da sie nach jeder Veränderung, d. h. nach dem Aufruf des CPX-Moduls, der Anwahl von Pop-Ups und dem Bewegen des Sliders, aufgerufen wird.

Es kann nicht alles auf einmal in der Box angezeigt werden, denn es sind genau nur vier Titel in der Anzeige zulässig. Darum müssen bei der Wahl des „Arrows nach unten“ die Werte von Feld 2 bis 4 um ein Feld nach oben kopiert und in das Feld 4 der nachfolgende Eintrag mit den aktuellen Werten gesetzt werden.

Der Builder unterscheidet sich kaum von den in [1] verwendeten. Die Angaben über die wichtigsten Parameter finden Sie im angefügten Listing. Hier sind auch alle wichtigen Parameter für das Hauptprogramm aufgeführt.

Sollten Sie nicht der versierteste Programmierer sein, so gibt es das komplette Listing, alle Projekt-Files, alle Resource-Dateien und natürlich das fertige CPX-Modul auf der Monatsdiskette. Das Listing ist so kommentiert, daß sich selbst Anfänger leicht einarbeiten können. Es sind alle Stellen markiert, die beim Schreiben einer anderen Applikation geändert werden müssen. Eine Änderung dürfte in einer minimalen Zeit erledigt sein. Als Beispiel ist auch eine erhebliche Erweiterung des Moduls auf der Diskette vorhanden. An dieser Erweiterung kann man die Möglichkeiten eines CPX-Moduls genau erkennen und natürlich für die eigenen Zwecke verwenden. Mit diesem universellen CPX-Modul dürfte in Zukunft die Programmierung eines CPX-Moduls zur Konfiguration eines Programmes oder Gerätes ein zumutbarer zeitlicher Aufwand für den Programmierer darstellen.

Literatur:

[1] Uwe Hax, Oliver Scholz:

CPX: Dem variablen Kontrollfeld auf der Spur Teil 1-4, ST-Computer 3/91, S. 95ff; ST-Computer 4/91, S. 98jf; ST-Computer 5/91, S. 101 ff; ST-Computer 9/91, S. 99ff.


/**********************************************/
/* BEISPIEL für universielles CPX-Modul 	  */
/**********************************************/
/* CPX-Modul:   NEC-POWER                     */
/* ------------------------------------------ */
/* Funktionen: 	                              */
/* 	  DIP-Schalterkonfiguration für NEC P20/30*/
/* Ersteller:                                 */
/* 	  Hartmut Klindtworth                     */
/* Copyright 1993 by MAXON Computer, Eschborn */ 
/**********************************************/

/* sonstige globale Variablen -------------- */
WORD    errno;      /* Damit der Linker Ruhe gibt!*/ 
WORD    _FilSysV;   /*        "             "     */
CPX_PARAMS *params;
                    /* vom Kontrollfeld übergebe- */
                    /* ner Zeiger auf die Kon- */
                    /* trollfeld-Funktionen */
WORD actlines[VISIBLE]=
            { ZEILE1, ZEILE2, ZEILE3, ZEILE4 }; 
WORD actbut[VISIBLE]=
            { BUTTON1, BUTTON2, BUTTON3, BUTTON4 };

/**********************************************/
/* CPX-BUILDER:     NEC-BUILD                 */
/* ------------------------------------------ */
/* Funktionen:                                */
/*    Erstellt aus NECPOWER.PRG ein CPX       */
/* Ersteller:                                 */
/*    Hartmut Klindtworth, 11.04.1993         */
/* Copyright 1993 by MAXON Computer, Eschborn */ /**********************************************/

struct foobar
{   /* ist normalerweise in "*.rsh" definiert */
    /* und wird in "xcontrol.h" benötigt.     */
    WORD dummy;
    WORD *image;};

/* Definitionen zur besseren Lesbarkeit ----- */
#define FARBEN    0x1280
#define PRG_NAME  "MAXON NEC Power"
#define ICON_INFO 0x4000 /* Farbe 4,no Letter */
#define ICONJNAME "NEC P20/30"
#define VERSION   0x100  /* Version 1.00      */
#define CPX_ID    "MNEC" /* NUR 4 Zeichen     */

/* ACHTUNG !!!! - Anpassung erforderlich!     */ 
#define SOURCE    "MAXNECPO.PRG"
#define DESTINATION "C:\\CPX\\MAXONNEC.CPX"
#define TRUE      1
#define FALSE     0

/**********************************************/
/* Globale Variablen ------------------------ */
CPX_HEADER  header;     /* Header-Definition  */ 
LONG data[24]={         /* Image-Daten        */
0x0L,       0x0L,       0x07FFFFF8L,0x04000008L,
0X05BFFC68L,0x04000008L,0x05FFF7E8L,0x04000008L, 0x058FF1E8L,0x04000008L,0x04000008L,0x0FFFFFFCL, 0x1FFFFFFEL,0x10000002L,0x724624F2L,0x72893482L, 0X73092CE2L,0x72892482L,0xl2462482L,0x10000002L, 
0x1FFFFFFEL,0x0L,       0x0L,       0x0L };
# Printer Memory Settings, Befehlssequenz
  1. 109, DRUCKER, Menüpunkt, Unterpunkt. Einstellung, ... letzter Menüpunkt, Unterpunkt, Einstellung, 0

also:

28, 109, DRUCKER, 1, 1, X, 1, 2, X, 1, 3, X, ...,
                  2, 1, X, 2, 2, X, 2, 3, X, ....
                  3, 1, X, 3, 2, X, 3, 3, X,
                  4, 1, X, 4, 2, X, 4, 3, X, ..., 0

X = Einstellung, ACHTUNG! Alle Werte dezimal, nicht in ASCII.

DRUCKER hat beim P20 und P30 den Wert 2 und beim P60 und P70 den Wert 0.


Hartmut Klindtworth
Aus: ST-Computer 06 / 1994, Seite 61

Links

Copyright-Bestimmungen: siehe Über diese Seite