G240mode.cpp

 

 

 

 

 

 


Dieses Programm demonstriert Funktionen des grafikfähigen Touchdisplays EAeDIP240 in seinem Grafikmodus. Benutzt werden können die serielle RS232-Schnittstelle, der I2C-Bus oder der SPI-Bus. Hierzu muss im unteren Programm eine der Headerdateien dip240x.h aktiviert werden (x= i|s|p). Sie bedienen die fünf im Datenblatt der Anzeige aufgeführten Protokolle.
Die eigentlichen Grafikfunktionen und die der Touchfolie die auf diesen Protokollen fussen und im Datenblatt beschrieben werden, sind in zwei weiteren Headerdateien mit den Namen G240dip.h und F240dip.h untergebracht. Auch sie müssen im unteren Programm eingebunden sein.

Hinweise
Die main() Startfunktion gibt zunächst ein Touchmenü aus, über welches die weiteren Programmteile erreichbar sind.

Anschlüsse
Das Programm geht davon aus, dass der IPC@CHIP Webserver wie üblich über seine serielle Schnittstelle COM mit einem PC und dem dort arbeitenden Terminalprogramm verbunden ist. Das Touchdisplay muss dem entsprechend, bei Verwendung einer seriellen Schnittstelle oder des SPI-Busses, an EXT betrieben werden. Ansonsten ist es am I2C-Bus anzuschliessen. Wie die Jumper des Touchdisplays bei der Verwendung einer dieser Schnittstellen zu setzen sind, muss der Beschreibung des Anzeige-Modells entnommen werden.

Spannungsversorgung des Modells
Wird die 5V Versorgungsgleichspannung über den jeweiligen Schnittstellenanschluss übertragen, kann das Display ohne Benutzung der 2,1mm Klinkenbuchse betrieben werden. (Hierzu ist bei der seriellen Verbindung der Pin RI hierfür vorgesehen, es muss im Display der Drahtschalter geschlossen sein). Es ist zwingend darauf zu achten, dass nur eine Spannungsversorgung aktiv ist.

Einzubindende Includedateien
Bei Verwendung der seriellen Schnittstelle geht das Programm davon aus, das die Schnittstelle EXT und das Display mit einer Baudrate von 115200 Baud miteinander kommunizieren. Dieser Parameter kann in der Includedatei dip240s.h geändert werden. Die seriellen Schnittstellentreiber aus serial.h werden ebenfalls in der Includedatei dip240s.h geladen, so wie dip240i.h die Headerdatei i2c.h einbindet. Bei der Benutzung von dip240p.h ist es die zusätzliche Headerdatei spi.h.
Damit die in main() benutzten Steuerfunktionen der Grafikanzeige und der Touchfolie verfügbar werden müssen zudem die Includedateien G240dip.h (Grafikfunktionen) und F240dip.h (Funktionen der Touchfolie) eingebunden werden.


 

 

 


Headerdateien
Die in diesem Programm verwendeten Treiber-Includedateien für die IPC@CHIP Webserver sind, dem benutzten Bus entsprechend, durch Setzen oder Entfernen der Kommentarstriche im Programm unten zu aktivieren oder zu deaktivieren. Alle benutzten Headerdateien sollten grundsätzlich im gleichen Verzeichnis wie das Hauptprogramm liegen.




.. serielle RS 232 Schnittstelle



dip240s.h

Protokoll- und Schnittstellentreiber für RS232 Schnittstelle des Touchdisplay. Diese Datei lädt die serial.h Includedatei.




serial.h Treiber für die RS232-Schnittstellen am IPC@CHIP Webserver


 

 

.. I2C-Bus

 


dip240i.h

Protokoll- und Schnittstellentreiber für die I2C-Bus Schnittstelle des Touchdisplay. Diese Datei lädt die i2c.h Includedatei.




i2c.h Treiber für den I2C-Bus am IPC@CHIP Webserver


 

 

.. SPI-Bus

 


dip240p.h

Protokoll- und Schnittstellentreiber für die SPI-Bus Schnittstelle des Touchdisplay. Diese Datei lädt die spi.h Includedatei.




spi.h Treiber für den SPI-Bus am IPC@CHIP Webserver


 

 

 

 







.. Funktionensammlung für Grafikdisplay und Touchfolie



Gdip240.h

Funktionen zur Ansteuerung der Grafikeigenschaften der EA eDIP240 Anzeige. Diese Programme wirken über die zuvor aufgeführten Treibern der Schnittstellen.



Fdip240.h

Funktionen zur Ansteuerung der Touchfolie der EA eDIP240 Anzeige. Diese Programme wirken über die zuvor aufgeführten Treibern der Schnittstellen.









// g240mode.cpp
// ------------  Version 10.04.2007
//               Borland IDE C++ 3.1 oder 5.02
//               Model:  SMALL
//               Char:   unsigned
//               bearbeitet: www.GoBlack.de, D.Schwarzer
// ----------------------------------------------------------------

// Testprogramm für die Grafikanzeige und die Touchfolie des
// TouchDisplays EA eDIP240-7 ..
// .. an einer der Schnittstellen: I2C-Bus| serielle Schnittstelle|
//    SPI-Bus

// Die Schnittstellentreiber für das TouchDisplay befinden sich in
// einer der Include-Dateien 'dip240x.h'. Eine dieser Dateien muss
// aktiviert sein.

  #include "dip240s.h"       // RS232-Schnittst, (benöt serial.h)
//#include "dip240i.h"       // I2C-Bus,         (benötigt i2c.h)
//#include "dip240p.h"       // SPI-Bus,         (benötigt spi.h)

// Die Steuerfunktionen für die Anzeige und die Touchfolie befinden
// sich in den nachfolgenden Include-Dateien ..
  #include "Fdip240.h"        // Steuerfkt. für die Touchfolie
  #include "Gdip240.h"        // Steuerfkt. für die Grafikanzeige


  #include <stdio.h>          // C-Bibliothek für printf()
  #include <stdlib>           // randomize() und random()



// GoBlack()
// gibt das Normalmakro 0 aus und wartet 5Sekunden. Kehrt dann
// automatisch zum Hauptmenü zurück. Das Normalmakro 0 welches
// auch als ResetMakro benutzt wird, ruft zudem das Makro 1 auf
// Beide müssen zuvor über die Kit-Editor IDE geladen worden sein
void GoBlack(void)
{
 G240reset();                 // Anzeige zurücksetzen
 G240beep(2);                 // Pieper 2/10s ein
 G240makro('N',0);            // Normal-Macro 0 starten
                              // (wenn vorhanden)
 api_sleep(5000);             // 5s warten
}

// textraus()
// einfache Textausgabe bei 0° und bei 90°, sowie Test der Sequenz
// warte t/10 Sekunden, die bis 37/10 Sekunden fehlerfrei operiert
// Die Funktion beendet sich nach 3,7 Sekunden
void textraus(void)
{
 char txt[]= "Text aus laufendem Programm"
             "|---------------------------"
             "|Dieser Text wurde unter ei-"
             "|nem Winkel von ~ 0 Grad ~"
             "|ausgegeben"
             "|Es können mit G240txtout()"
             "|max.@ 255 Zeichen @ausge-"
             "|geben werden."
             "|"
             "|     Umlaute: ÄÖÜäöüß°"
             "|..........................";

  char txt90[]= "Dieser Text wurde um"
                "|90° gedreht. Die Ko-"
                "|ordinat. entsprechen"
                "|weiterhin denen bei"
                "|0° .. oben,rechts"
                "|ist nun bei 0,127";

 F240clrbut(0,1);               // alle Touchber.unsichtbar löschen
 G240reset();                   // Anzeige reset
 G240txtfont(2);                // Font 2 aktiviern
 G240txtspc(3);                 // 3 Pixel Abstand plus
 G240txtout(2,0,'L',txt);       // Text linksbündig ausgeben

 G240txtarc(1);                 // Text um 90° drehen
 G240txtspc(0);                 // 0 Pixel Abstand plus
 G240txtout(180,64,'C',txt90);  // Text zentriert
 G240wait(30);                  // 30*1/10s= 3s warten
}

// picture()
// Es wird ein kleines Bild im BLH-Format zur Anzeige gesendet und
// an der Position (x,y) angezeigt
void picture(char x, char y)
{
 char pic[] ={      // Daten des Bildes im BLH-Format
              0x12, 0x14, 0xFF, 0xFF, 0xC0, 0x80, 0x00, 0x40,
              0x87, 0xE0, 0x40, 0x87, 0xF8, 0x40, 0x8F, 0xFC, 0x40,
              0x9F, 0x3C, 0x40, 0x9F, 0x9E, 0x40, 0x9C, 0x1E, 0x40,
              0x9F, 0x7F, 0x40, 0xBF, 0x6F, 0x40, 0xB8, 0x0F, 0x40,
              0xBC, 0xCF, 0x40, 0x9C, 0xEF, 0x40, 0x8F, 0xFE, 0x40,
              0x8F, 0x1E, 0x40, 0x87, 0xFE, 0x40, 0x87, 0xFC, 0x40,
              0x9E, 0x7F, 0x40, 0x80, 0x00, 0x40, 0xFF, 0xFF, 0xC0
              };

 G240piczoom(1,1);              // Bildzoom auf zx=1, zy=1
 G240picmode(4);                // Bildhintergrund löschen
 G240upldpic(x, y, pic);        // Bild bei x|y zeichnen
}

// muster()
// stellt die anzeigeninternen Muster 2-15 dar. Einmal Fläche ohne
// Rand typ='F' und einmal als Fläche mit Rand (Bereich) typ='B'
void muster(void)
{
 G240clear();                   // Anzeige löschen
 F240clrbut(0,1);               // alle Touchber.unsichtbar löschen

 G240box('F',  0,  0,  30, 50, 2);
 G240box('F', 35,  0,  65, 50, 3);
 G240box('F', 70,  0, 100, 50, 4);
 G240box('F',105,  0, 135, 50, 5);
 G240box('F',140,  0, 170, 50, 6);
 G240box('F',175,  0, 205, 50, 7);
 G240box('F',210,  0, 240, 50, 8);

 G240box('B',  0, 55,  30,110, 9);
 G240box('B', 35, 55,  65,110,10);
 G240box('B', 70, 55, 100,110,11);
 G240box('B',105, 55, 135,110,12);
 G240box('B',140, 55, 170,110,13);
 G240box('B',175, 55, 205,110,14);
 G240box('B',210, 55, 240,110,15);

 F240defbut('T',146, 109, 237, 125, ESC ,0, 'C', "Ende");
 waitTouch('T');
}

// bargraph()
// Es werden zwei Bargraphen definiert, von denen einer die Werte
// val ausgibt und der zweite als Touch-Eingabebargraph definiert
// ist. Er kann durch Berühren verändert werden. Die von ihm
// entgegengenommenen Werte werden nicht benutzt
// Über eine Touchtaste kann die Funktion beendet werden.
void bargraph(void)
{
 char n=0, m=0;
 char val[]={5,7,10,40,60,55,50,47,80,33,12,7,6,5,4,3,3,5,0,4,
             7,15,39,45,55,80,87,90,100,115,120,128,90,60,75,
             80,77,72,71,70,74,60,51,40,45,55,30,22,17,6,5 };

 G240clear();                   // Anzeige löschen
 F240clrbut(0,1);               // alle Touchber.unsichtbar löschen

 G240bar('O',1,  20,  0,  35, 127, 0, 127, 3, 5);
 G240bar('O',2,  50,  0,  70, 127, 0, 127, 1, 1);
 G240barval(2,40);
 F240defbar(2,0);

 F240defbut('T',146, 109, 237, 125, ESC ,0, 'C', "Ende");
 while(1){
   if(n>=51) n=0;
   G240barval(1,val[n]);
   n++;
   for(m=0; m<5;m++){
     if(isTouch('T')) return;
     api_sleep(5);
   }
  }
}

// zeichnen()
// es wird ein umrandetes Eingabefeld definiert in dem manuell
// gezeichnet werden kann. Über eine Touchtaste kann die Funktion
// beendet werden. Eine zweite Touch Taste kann die Zeichnung
// löschen. Mit der Taste Save wird das gezeichnete Bild zum
// Steuerrechner übertragen und hernach von diesem aus, nach 2s,
// automatisch wieder zurückgesendet und angezeigt.
void zeichnen (void)
{
 char picbuf[3842]="";          // Buffer für kompletten Bildschirm
 char c=0;
 start:
 G240clear();                   // Anzeige löschen
 F240clrbut(0,1);               // alle Touchber.unsichtbar löschen
 G240txtout(2,0,'L',"malen auf der umrandeten Fläche ..");
 G240draw('R',0,10,239,105);
 F240defdraw(0,10,239,105,1);

 F240frame(11);
 F240defbut('T', 90, 109, 144, 125, 'L' ,0, 'C', "löschen");
 F240defbut('T', 32, 109,  86, 125, 'S' ,0, 'C', "save");
 F240frame(12);
 F240defbut('T',148, 109, 237, 125, ESC ,0, 'C', "Ende");
 wait:
 c=waitTouch('T');
 if(c=='L') goto start;
 if(c=='S'){
  getBLHpic(0,10,239,105,picbuf);  // Bild von Anzeige holen
  G240txtout(2,0,'L',"Bild wieder zurückspeichern ......");
  G240box('B',0,10,239,105,4);
  api_sleep(2000);                 // warten
  G240upldpic(0,10, picbuf);       // Bild bei x|y wieder zeichnen
  goto wait;
 }
}

// pingpong()
// Ein mit invertiertem Bereich überlagerter Rahmen wird zum
// Reflektionsrand eines um den Faktor 5 vergrösserten Punktes.
// Die Zufallsfunktionen der C-Bibliothek verändern die
// Reflektionswinkel, so dass der Flug des Balls etwas unvorher-
// sehbarer wird.
// Bemerkenswert ist die schlechte Anzeigequalität des 'Balls'
// bei kurzen Ausgabezeiten.
// Über eine Touchtaste kann die Funktion beendet werden.
void pingpong(void)
{
 char n=0;
 unsigned char xmi=40, ymi=20, xma=177, yma=87;
 unsigned char  xb=50, yb=50;
 signed char    dx=-3, dy=-3;
 F240clrbut(0,1);               // alle Touchber.unsichtbar löschen
 G240reset();                   // Anzeige zurücksetzen

 randomize();                   // Zufallszahlengeneratior init
 xb=45+random(127);             // xb-Anfang 45-172
 yb=25+random( 57);             // yb-Anfang 25- 82

 F240defbut('T',146, 109, 237, 125, ESC ,0, 'C', "Ende");

 G240drwmode(1);                // zeichnen ein
 G240drwzoom(5,5);              // linienstärke 5,5
 G240draw('R',xmi,ymi,xma,yma); // Rechteck zeichnen
 G240fill('I',xmi,ymi,xma,yma); // invertierter Bereich
 G240draw('P',xb,yb,0,0);       // ersten Punkt zeichnen

 // Bewegungssteuerung des 'Balls'
 while(1){
   G240drwmode(1);              // zeichnen aus
   G240draw('P',xb,yb,0,0);     // Punkt löschen
   xb+=dx; yb+=dy;
   if(xb<=(xmi+5)){xb=xmi+3+2; dx= random(3)+5;}
   if(xb>=(xma-5)){xb=xma-3-2; dx= random(3)-8;}
   if(yb<=(ymi+5)){yb=ymi+3+2; dy= random(5)+2;}
   if(yb>=(yma-5)){yb=yma-3-2; dy= random(5)-6;}

   G240drwmode(3);              // zeichnen ein
   G240draw('P',xb,yb,0,0);     // Punkt zeichnen

   for(n=0; n<5; n++){
    if(isTouch('T')) return;    // Touch-Taste abfragen
    api_sleep(5);               // und 5x5ms warten
   }
  }
}


// touchmenü()
// Funktion erzeugt zwei Touch-Menüs und hinterlegt diese mit einem
// BLH-Bild, das in der Art von Kacheln angeordnet wird. Die Menü-
// einträge weren abgefragt und der von ihnen zurückgegebene Code
// auf dem Terminalbildschirm angezeigt.
// zwei Codes besitzen Funktionen ..
// Version: der Versionstring der Anzeige wird ausgegeben
// Quit:    das Unterprogramm wird verlassen
void touchmenu (void)
{
 char xp=20, yp=22, x=0, y=17;
 F240clrbut(0,1);               // alle Touchber.unsichtbar löschen
 G240reset();

 // Kachelbild als Hintergrund. Beispiel für das Senden eines BLH-
 // Bildes. Das Bild ist in der Funktion picture() definiert.
 while(y<=127-yp){
   for(x=1; x<=221; x=x+xp) picture(x,y);
   y=y+yp;
 }

 // Aufbau zweier Touch-Menüs, mit den Kennummern 0x10 und 0x20,die
 // bei der Betätigung piepen. Die Rückgabewerte der Menüzeilen
 // sind in den Zeilen angegeben.
 G240drwzoom(1,1);              // Grafikzoom auf zx=1, zy=1
 F240tsmfont(2,2);              // Font Tast/Schalt, Font Tastmenü
 F240tsmspc(1,4);               // zusätzliche Pixel zw.Zeilen
 F240beep(1);                   // beep bei einem Tastendruck ein
 F240frame(1);                  // benutzte Touchfeld-Umrandung

 F240defbut('M',  1,  0,  78, 14, 0, 0, 0x10,
              "UCMenü  1-h|"    // U-Menü unten, C-Text mittig
              "Eintrag 10h|"
              "Eintrag 11h|"
              "Eintrag 12h|"
              "Eintrag 13h|"
              "Eintrag 14h ");
 F240defbut('M', 81,  0, 159, 14, 0, 0, 0x20,
              "UCMenü  2-h|"    // U-Menü unten, C-Text mittig
              "Eintrag 20h|"
              "Version 21h|"
              "Quit    22h ");

 // warten auf Eingaben von den Menüs
 menuloop:
 printf("\r\nCode: %0.2X-%0.2X-%0.2X-%0.2X-%0.2X\r\n",
        dipin[0],dipin[1],dipin[2],dipin[3],dipin[4]);
 switch (waitTouch('M')){
   case 0x22:  goto tmende;
   case 0x21:  G240version();
               G240txtout(120,115,'C',version);
   default:    goto menuloop;
 }
 tmende:
 F240beep(0);                   // beep bei einem Tastendruck aus
}


// main()
// Dieses Testprogramm initialisiert die benutzte Schnittstelle,
// (RS232, I2C-Bus oder SPI-Bus) und nimmt lesend und schreibend
// Kontakt zu einem EA eDIP240-7 Touchdisplay im Grafik und im
// Touchmodus auf.
// Es werden zur Eingabe einige Touch-Taster benutzt.

void main(void)
{
  // Meldungen die zum Terminalbildschirm gesendet werden
 printf("\r\n [Start] .. EAeDIP240 GrafikModus");
 printf("\r\n ----------------------------------\r\n");
 setStdio(2);

 // EAeDIP240-Display bezüglich der verwendeten Schnittstelle
 // initialisieren (in dip240x.h)
 if(!dip240init()){
   printf("\r\n         .. Anzeige nicht erreicht"); goto ende;
 }

 // Sendebuffer des TouchDisplay durch lesen ohne nachfolgende
 // Verwertung leeren. Normalerweise sollte der Buffer leer sein.
 isTouch('T');                   // Sendebuffer d.Anzeige lesen
                                 // Lesetyp, hier 'T' ist egal.

 // ---------------------------------------------------------------
 // 90° gedrehte Internetadresse von GoBlack ausgeben und ein
 // Menü aus Tasten aufbauen. Aus diesem Menü wird in die obigen
 // Funktionen verzweigt.

 start:
 F240reset();                   // Touchfolie zurücksetzen
 G240reset();                   // Anzeige zurücksetzen

 // rechter Seitentext mit Bild, 90° gedreht
 G240txtarc(1);                 // 90°Winkel bei Textausgabe
 G240txtfont(4);                // Textfont 4 aktiviern
 G240txtout(227,116,'L',"www.");
 G240picarc(1);                 // 90°Winkel bei Bildausgabe
 G240intpic(215,25,1);          // internes Bild 1 darstellen
 G240txtout(227, 23,'L',".de");



 // Menü mit Touch-Tastern darstellen, zunächst die Eigenschaften
 // setzen, dann Tasten dfinieren
 G240picarc(0);                 // 0° Winkel bei Bildasugabe
 G240txtarc(0);                 // 0° Winkel bei Textausgabe
 G240txtfont(2);                // Textfont aktiviern
 F240tsmfont(2,2);              // Tast/Schalt.font u. Tastmenü
 F240frame(11);                 // normale Touchfeld-Umrandung

 F240defbut('T',  5,  10,  95,  26, '1', 0, 'C', "TextRaus");
 F240defbut('T',  5,  30,  95,  46, '2', 0, 'C', "Muster");
 F240defbut('T',  5,  50,  95,  66, '3', 0, 'C', "Bargraph");
 F240defbut('T',  5,  80,  95,  96, '4', 0, 'C', "PingPong");
 F240defbut('T',  5, 100,  95, 116, '5', 0, 'C', "TouchMenü");

 F240defbut('T',105,  50, 195,  66, '6', 0, 'C', "Malen");
 F240defbut('T',105,  80, 195,  96, '7', 0, 'C', "GoBlack");

 F240frame(12);                 // invertierte Touchfeld-Umrandung
 F240defbut('T',105, 100, 195, 116, ESC ,0, 'C', "Pgm-Ende");

 // warten auf Eingaben von den Drucktasten und Verzweigungen
 loop:
 switch (waitTouch('T')){
   case '1': textraus();  goto start;
   case '2': muster();    goto start;
   case '3': bargraph();  goto start;
   case '4': pingpong();  goto start;
   case '5': touchmenu(); goto start;
   case '6': zeichnen();  goto start;
   case '7': GoBlack();   goto start;
   case ESC: goto ende;
   default:  goto loop;
 }

 // ---------------------------------------------------------------
 ende:
 
 G240dimm(5);                  // Anzeige auf 5% Leuchtkraft
 dip240release();              // Schnittstelle abmelden
 printf("\r\n [Ende]  .. EAeDIP240 GrafikModus\r\n");
 setStdio(3);
}


www..de