PI4J GPIO getInstance - Aufbau des Programmcodes

  • Hallo und guten Tag,

    ich benötige Starthilfe. Ich bin Neuling bei JAVA und PI4J und habe Bedarf an Grundlagen...

    Ich kann eine Klasse anlegen und in der MAIN-Methode den Raspberry Pi initialisieren und einige angeschlossene LEDs blinken lassen :bravo2:

    Ich möchte nun aber aus unterschiedlichen Methoden heraus (ggf. aus unterschiedlichen Klassen?) den RPI ansteuern (z.B. Methode1:Pins setzen, Methode2:I2C ansteuern, Methode3:Pins abfragen, Methode4:PWM nutzen, etc.).

    Das klappt gerade nicht. Geht das überhaupt?

    Grundlegende Fragen:
    - Darf es nur eine einzige "GpioFactory.getInstance" zur selben Zeit geben?
    - Wie kann ich den PRI über mehrere Methoden/Klassen hinaus ansprechen?

    Beste Grüße
    Ocram


    Aufbau ist aktuell so:

    KLASSE {
    METHODE_MAIN {
    ....GpioFactory.getInstance();
    ...GPIO initialisierung;
    ...sende-was-über-I2C;
    ....blink-mal-lustig...;
    ...Instanz.shutdown;
    }
    }


    Ich möchte aber sowas:
    KLASSE_A {
    METHODE_MAIN {
    KLASSE_RPI.METHODE1;
    KLASSE_RPI.METHODE3;
    KLASSE_RPI.METHODE2;
    }

    KLASSE_B {
    METHODE_X {
    KLASSE_RPI.METHODE2;
    KLASSE_RPI.METHOD(n);
    KLASSE_RPI.METHODE_shutdown;
    }
    }

    KLASSE_RPI {
    METHODE1 { //initialisiere den RPI
    ....GpioFactory.getInstance();
    }

    METHODE2 { // setze GPIOS
    ...hier werden irgendwelche PINs gesetzt
    }

    METHODE3 { // sende über I2C
    ...hier werden ein ende_I2C
    }

    METHODE(n) {
    ...
    }

    METHODE_shutdown{
    ...Instanz.shutdown;
    }
    }

  • Hallo,

    verstehe nicht ganz worauf du mit den Klassen hinaus willst. Was spricht dagegen einfach unterhalb der Mainklasse deine Methoden zu definieren?

  • Hmm, habe das bestimmt zu unverständlich erklärt. Hier ein neuer Versuch um mein Problem zu transportieren :)

    Der Code "gpio0.low();" klappt in Funktion1. Was muss ich machen um das in Funktion2 auszuführen?

  • Es ist erst mal haesslich dass alles statisch ist !


    Aber so muesste es so gehen:

    Einmal editiert, zuletzt von Tell (6. Februar 2015 um 21:20)

  • Nach deiner Schilderung wird das etwas komplizierter.
    Ich weiß nicht inwiefern du mit dem Klassenkonzept vertraut bist, aber ich würde das so realisieren:


    Da du sagst du bist ein Anfänger in Sachen Java:
    Die Zusätze throws InterruptedException benötigt man für die Sleep-Befehle.

    Was hier passiert:

    Es wird eine Klasse angelegt (hier myclass.java). Am Anfang werden die GPIO's initialisiert.

    Darunter hast du die Methoden, die du dann aus der Mainklasse aufrufen kannst, nachdem du dort ein Objekt der Klasse myclass erzeugt hast.

    Hier die zugehörige Main-Klasse Test.java:

    Hier wird am Anfang ein Objekt namens buzzer erzeugt (An meinem GPIO hängt ein Buzzer).

    Der Aufruf der Methoden erfolgt dann nach dem Prinzip objekt.methode();

    Das Kompilieren von einem aus mehreren .java Dateien bestehenden Programm ist ähnlich wie mit nur einer .java Datei:

    Code
    cd /Pfad/zum/Verzeichnis
    javac -classpath .:classes:/opt/pi4j/lib/'*' -d . *.java


    Aufruf:

    Code
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test
  • Danke an euch!! Thema erledigt!

    Zusammenfassung "Methoden aus anderen Klassen aufrufen":

    Um eine Methode (Methode2) einer Klasse (myClass) aufzurufen muss man, in dem Programmteil in dem man sich befindet, ein neues OBJEKT der Klasse (myClass) erzeugen.

    myClass myObject = new myClass();

    Dann mit

    myObject.Methode2();

    die Methode aufrufen.

    Was nicht geht: eine Methode einer anderen Klasse zu nutzen, ohne zuvor ein (neues) Objekt dieser anderen Klasse zu erzeugen.


  • Was nicht geht: eine Methode einer anderen Klasse zu nutzen, ohne zuvor ein (neues) Objekt dieser anderen Klasse zu erzeugen.


    außer du markierst diese als Klassenmethode, auch statische Methode. Keyword hierfür ist static.
    Um static-(Klassenmethoden) zu nutzen, musst du nicht zuerst ein Objekt der Klasse erzeugen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!