kramann.info
© Guido Kramann

Login: Passwort:










Informatik3
1 Vom_struct_zur_Klasse
..1.1 Vom_struct_zur_Klasse
..1.2 struct_Programm
..1.3 Klassen_Programm
..1.4 Offene_Fragen
..1.5 Historie
..1.6 Objektabstraktion
..1.7 OO_Kundenverwaltung
..1.8 Objektfaehigkeiten
..1.9 Formatierung
..1.10 Motivation
..1.11 Uebung1
..1.12 Uebung2
2 UML
..2.1 Volumenberechnung
..2.2 UML_Klassendiagramm
..2.3 Konstruktor
..2.4 Statische_Variable
3 Strings
..3.1 Klassenbibliotheken
..3.2 stringUML
..3.3 Uebung3
4 Initialisierungen
4 bluej
5 Zeiger_und_Arrays
..5.1 Zeiger
..5.2 Zeiger_und_Funktion
..5.3 Uebung4
6 Vererbung
..6.1 MesswerteUML
..6.2 MesswerteProgramm
..6.3 VererbungsProgramm
..6.4 Vector
..6.5 Uebung
7 Modifikatoren
..7.1 public_Vererbung
..7.2 protected_Vererbung
8 Listen_und_Templates
..8.1 Containertypen
....8.1.1 ListeUML
....8.1.2 ListeProgramm
..8.2 Templates
....8.2.1 Listentemplate
....8.2.2 STLvectorTemplate
..8.3 Uebung5
..8.4 Uebung6
..8.5 Uebung7
9 Java
..9.1 Uebung
..9.2 GettingStarted
..9.3 Animation
..9.4 Hybrid
..9.5 Threads
10 Delegation
11 LayoutProjekt
12 Fenster
13 Uebung
14 Zwischenprojekt
..14.1 Befehle
..14.2 Planung
..14.3 JNI
..14.4 JNIumsetzen
..14.5 Anwendungsklasse
..14.6 GUI01
..14.7 GUI02
15 Rasterlayout
..15.1 Bilder_Packages
..15.2 interfaces
..15.3 ArrayList
..15.4 clone
..15.5 Uebung
16 Nuetzliches
..16.1 Threads
..16.2 Animation
..16.3 RungeKutta
..16.4 Loesungsansatz
..16.5 Internetprogrammierung
....16.5.1 Codegenerierung
....16.5.2 PHP_Programmierung
....16.5.3 PHP_OOP
....16.5.4 Java
17 Algorithmen
..17.1 RungeKutta
..17.2 Loesungsansatz
..17.3 Evoopt
..17.4 Uebung12
..17.5 Uebung8_2014
..17.6 Ausdruecke
18 Uebung10
19 UML_ALT
..19.1 Flaechenberechnung
..19.2 UML_Flaechenberechnung
..19.3 Implementierung
..19.4 ListeUML
..19.5 ListenImplementierung
..19.6 Anwendung

14.5 Anwendungsklasse

14.5 application class (EN google-translate)

14.5 klasa aplikacji (PL google-translate)

Bevor eine GUI erstellt wird, wird typitscherweise zunächst die Funktionalität des Programms realisiert, die dann von der GUI angesteuert werden soll. Eine Klasse die dies realisiert wird oft mit Anwendungsklasse bezeichnet.

Before a GUI is created, the functionality of the program is typically realized first then be controlled by the GUI. A class that realizes this is often referred to as an application class.

Przed utworzeniem GUI, funkcjonalność programu jest zazwyczaj realizowana w pierwszej kolejności następnie kontrolowane przez GUI. Klasa, która to realizuje, jest często nazywana klasą aplikacji.

Die Anwendungsklasse erhält die Befehle lesen(..), kompilieren(..), wandeln(), flashen(), laden(), speichern(). alles(...) führt nach Bedarf alles aus, was notwendig ist.

The application class receives the commands read (..), compile (..), convert (), flash (), load (), save (). everything (...) does everything that is necessary as needed.

Klasa aplikacji otrzymuje komendy read (..), compile (..), convert (), flash (), load (), save (). wszystko (...) robi wszystko, co konieczne.

Methode Beschreibung Nativ-Aufruf
boolean lesen() Liest den Status des Mikrocontrollers aus. avrdude -c ponyser -p m32 -P /dev/ttyS0 -v
boolean kompilieren(String quelltext) Maschinencode aus Quelltext erzeugen (.elf-Datei) avr-gcc -O2 -mmcu=atmega32 /mnt-system/avrprg.c -o /mnt-system/avrprg.elf
boolean wandeln() .elf-Datei in .hex-Datei wandeln avr-objcopy -O ihex -j .text -j .data /mnt-system/avrprg.elf /mnt-system/avrprg.hex
boolean flashen() Übertragen einer .hex-Datei auf den Mikrocontroller avrdude -c ponyser -p m32 -P /dev/ttyS0 -U flash:w:/mnt-system/avrprg.hex:a
laden() Einen Quelltext von /mnt-system/avrprg.c laden -
speichern() Einen Quelltext nach /mnt-system/avrprg.c speichern -
alles() Alles, was nötig ist, um einen Quelltext auf den Mikrocontroller zu bekommen ausführen. -

Tabelle 14.5-1: Umzusetzende Methoden in der Anwendungsklasse.

Hinzu kommen noch einige Hilfsmethoden, z.B. um wieder das String aus out.txt von dem aus err.txt zu trennen.

In addition, there are some auxiliary methods, e.g. again to separate the string from out.txt from that from err.tx

Ponadto istnieje kilka metod pomocniczych, np. ponownie, aby oddzielić ciąg od out.txt od tego z err.tx

Die Anwendungsklasse soll mit AVReditor.java bezeichnet werden:

The application class should be named AVReditor.java:

Klasa aplikacji powinna mieć nazwę AVReditor.java:

import nativ.generalcall.Generalcall;

//Die dynamischen shared libraries
//Laden.so und Speichern.so wurden auf gleiche Weise erstellt, wie Generalcall.so
//Sie müssen ebenfalls nach /mnt-system/fhb_knoppix/start_skripte kopiert werden.
import nativ.laden.Laden;
import nativ.speichern.Speichern;

public class AVReditor
{
    public boolean TEST_KOMPILIEREN = false;
    public boolean TEST_WANDELN     = false;
    public boolean TEST_LESEN       = false;
    public boolean TEST_FLASHEN     = false;

    public String COMSCHNITTSTELLE = "/dev/ttyS0";

    public String outtxt,errtxt;

    public String HFUSE_SOLL = "D9";
    public String LFUSE_SOLL = "FD";

    public String HFUSE_IST = "D9";
    public String LFUSE_IST = "FD";

    public String beispielquelltext = 
    "#include <avr/io.h>               \n"+
    "int main(void)                    \n"+
    "{                                 \n"+
    "   DDRD |= 0b00100000;            \n"+
    "   long pause;                    \n"+
    "   while(1)                       \n"+
    "   {                              \n"+
    "       PORTD |= 0b00100000;       \n"+
    "       for(pause=0;pause<50000;pause++)   \n"+
    "           DDRD |= 0b00100000;    \n"+
    "       PORTD &= 0b11011111;       \n"+
    "       for(pause=0;pause<50000;pause++)   \n"+
    "           DDRD |= 0b00100000;    \n"+        
    "   }                              \n"+
    "}";

    private void extrahiereFuses()
    {
        String[] zeilen = outtxt.split("\n");
        if(zeilen==null || zeilen.length<2)
            return;
        String[] spl    = zeilen[0].split(" ");
        String[] sph    = zeilen[1].split(" ");

        if(spl==null || sph==null || spl.length==0 || sph.length==0)
            return;

        HFUSE_IST = sph[sph.length-1];
        LFUSE_IST = spl[spl.length-1];        

        System.out.println("HFUSE_IST = "+HFUSE_IST);
        System.out.println("LFUSE_IST = "+LFUSE_IST);
    } 

    private void zerlegen(String text)
    {
        if(text.length()<=5)
        {
            outtxt = "";
            errtxt = "";
            return;
        }        
        
        for(int i=0;i<text.length()-4;i++)
        {
            if(text.substring(i,i+5).equals("!&$%#"))
            {
                outtxt = text.substring(0,i);
                errtxt  = text.substring(i+5,text.length());

                extrahiereFuses();

                return;
            }
        }
        outtxt = "";
        errtxt = "";
        return;
    }

    public AVReditor(String COMSCHNITTSTELLE)
    {
        this.COMSCHNITTSTELLE = COMSCHNITTSTELLE;
    }

    public AVReditor()
    {
    }  

    public void zeigeStatus()
    {
        System.out.println("TEST_KOMPILIEREN:  "+TEST_KOMPILIEREN);
        System.out.println("TEST_WANDELN:      "+TEST_WANDELN);
        System.out.println("TEST_LESEN:        "+TEST_LESEN);
        System.out.println("TEST_FLASHEN:      "+TEST_FLASHEN);
    }

    public boolean lesen()
    {
        String ergebnis = Generalcall.generalcall("avrdude -c ponyser -p m32 -P "+COMSCHNITTSTELLE
                                                 +" -v > /mnt-system/out.txt 2> /mnt-system/err.txt");
        zerlegen(ergebnis);

        //System.out.println("out.txt:\n"+outtxt);
        //System.out.println("err.txt:\n"+errtxt);

        if(outtxt.length()>0)
            return true;
        else
            return false;
    }

    public void sendeLFUSE()
    {
        Generalcall.generalcall("avrdude -c ponyser -p m32 -P "+COMSCHNITTSTELLE
                               +" -U lfuse:w:0x"+LFUSE_SOLL+":m -u");    
        System.out.println("LFUSE 0x"+LFUSE_SOLL+" gesendet.");
    }

    public void sendeHFUSE()
    {
        Generalcall.generalcall("avrdude -c ponyser -p m32 -P "+COMSCHNITTSTELLE
                               +" -U hfuse:w:0x"+HFUSE_SOLL+":m -u");    
        System.out.println("HFUSE 0x"+HFUSE_SOLL+" gesendet.");
    }

    public boolean kompilieren(String quelltext)
    {
        if(quelltext==null || quelltext.length()==0 || quelltext.trim().length()==0)
            return false;

        //Quelltext abspeichern:
        String erg = Speichern.speichern(quelltext);

        String ergebnis = Generalcall.generalcall("avr-gcc -O2 -mmcu=atmega32 /mnt-system/avrprg.c -o /mnt-system/avrprg.elf");

        String elf = Laden.laden("/mnt-system/avrprg.elf");        

        if(elf==null || elf.length()==0)
            return false;

        return true;
    }

    public boolean wandeln()
    {
        String ergebnis = Generalcall.generalcall("avr-objcopy -O ihex -j .text -j .data /mnt-system/avrprg.elf /mnt-system/avrprg.hex");

        String hex = Laden.laden("/mnt-system/avrprg.hex");        

        if(hex==null || hex.length()==0)
            return false;

        return true;
    }

    public boolean flashen()
    {
        String ergebnis = Generalcall.generalcall("avrdude -c ponyser -p m32 -P "+COMSCHNITTSTELLE
             +" -U flash:w:/mnt-system/avrprg.hex:a > /mnt-system/out.txt 2> /mnt-system/err.txt");

        //System.out.println("FLASHEN:\n"+ergebnis+"ENDE FLASHEN");

        zerlegen(ergebnis);

        if(errtxt==null || errtxt.length()==0)
            return false;

        return errtxt.contains("bytes of flash verified");
    }

    public boolean alles(String quelltext)
    {
        TEST_KOMPILIEREN = false;
        TEST_WANDELN     = false;
        TEST_LESEN       = false;
        TEST_FLASHEN     = false;

        //Versuch zu kompilieren:
        TEST_KOMPILIEREN = kompilieren(quelltext);
        if(TEST_KOMPILIEREN==false)
            return false;

        //Versuch .hex-Datei zu erstellen:
        TEST_WANDELN = wandeln();
        if(TEST_WANDELN==false)
            return false;
        
        TEST_LESEN = lesen();
        if(TEST_LESEN==false)
            return false;

        //Nötigenfalls Fuses setzen:
        if(!HFUSE_IST.equals(HFUSE_SOLL))
            sendeHFUSE();
        if(!LFUSE_IST.equals(LFUSE_SOLL))
            sendeLFUSE();

        //Flashen:
        TEST_FLASHEN = flashen();
        if(TEST_FLASHEN==false)
            return false;

        return true;
    }


    public static void main(String[] args)
    {
        AVReditor avreditor = new AVReditor();

        avreditor.alles(avreditor.beispielquelltext);
        avreditor.zeigeStatus();
    }
}

Code 14.5-1: AVReditor.java - Anwendungsklasse zum Mikrocontroller-Projekt.

Entwicklung der GUI in der Klasse GUIAVReditor.java

Development of the GUI in class GUIAVReditor.java

Opracowanie GUI w klasie GUIAVReditor.java


Die Entwicklung der GUI erfolgt in der Vorlesung.