kramann.info
© Guido Kramann

Login: Passwort:










4.5 Anwendungsklasse

4.5 (EN google-translate)

4.5 (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.

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

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 4.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.

Die Anwendungsklasse soll mit AVReditor.java bezeichnet werden:

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 4.5-1: AVReditor.java - Anwendungsklasse zum Mikrocontroller-Projekt.

Entwicklung der GUI in der Klasse GUIAVReditor.java


Die Entwicklung der GUI erfolgt in der Vorlesung.