Oszilloskop in Java

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Oszilloskop in Java

    Ich möchte eine Art Oszilloskop mit Java realisieren.
    Momentan mache ich es so, dass ich auf einem Panel ein Image plaziere und auf dessen Graphics (Content) Punkte zeichne und dann halt nach jedem Durchlauf des Thread, Graphics nach links verschiebe und den nächsten Punkt an der "gleichen" x-Position zeichne.
    Das ganze bewegt sich also scheinbar von rechts nach links.

    Soo, nun ist die Sache mit dem Image zeichnen natürlich ziemlich speicherfressend und braucht jedesmal ca. 5 ms. Ich suche evtl. nach einer Alternative.

    Hat jemand von Euch eine Idee, wie man sowas noch realiseren kann?
    Allerdings auch so, dass es im Hintergrund (nicht ständig sichtbar) laufen kann.

  • #2
    Hi!

    Also was die Geschwindigkeit angeht, da ist Java vielleicht die falsche Wahl.
    Echtzeitdarstellungen in der Messtechnik sollten vielleicht in compilierten Sprachen dargestellt werden.
    In denen würde ich vielleicht eine auf JNI basierte Bridge zu Java bilden.
    Dann ist allerdings die Typensicherheit von Java zum Teufel - ist klar.

    Was Darstellung angeht so fallen mir zwei Möglichkeiten ein:
    java 2D (java.awt.Graphics2D)
    Also für Fourier-Transformationen würde ich Bezierkurven wählen. Dabei werden zwei Endpunkte festgelegt und mit Kontollpunkten Amplitude bzw. Elongation festgelgt. (java.awt.geom.CubicCurve2D.*)

    Die zweite Idee wäre eine Polygon-Darstellung
    (java.awt.geom.Polygon), wobei Du den funktionalen Zusammenhang explizit selbst deklarieren kannst.

    Hoffe, konnte Dir helfen.

    Blaster

    P.S.: " Für solche 'Hardcore'-Fragen kann ich Dir
    www.c-plusplus.de/forumstart.htm -"Rund um die Programmierung" empfehlen.
    Yuppi, endlich Elite ...

    Kommentar


    • #3
      Nicht nur vielleicht ... Blaster ... nicht nur vielleicht ...
      carpe noctem

      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

      Kommentar


      • #4
        @goth: Hmmpf...

        http://www.rtj.org/doc/index.html

        http://www.c-plusplus.de/ubb/cgi-bin...6&t=001758&p=1
        Yuppi, endlich Elite ...

        Kommentar


        • #5
          Ich denke das gerade der Thread im c-plusplus Forum relativ klare Auskünfte gibt ... ich habe bisher noch nie ein Java - Programm gesehen das schnell war ...

          und ich habe mehrere Jahre im Bereich In-Circuit-Emulatoren RT-Software entwickelt ... auf Java wäre dabei mit Sicherheit niemals meine Wahl gefallen ... da hilft auch keine RT-Spec ...
          carpe noctem

          [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
          [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

          Kommentar


          • #6
            @goth:
            Ich bin eigentlich auch chronischer C++-ler ... bin deshalb wohl befangen ...
            Yuppi, endlich Elite ...

            Kommentar


            • #7
              Also es ist so, dass die Darstellung schon in Java erfolgen MUSS. Festlegung, nicht meine Idee!
              Was ich darstelle sind Messwerte, die ich mir per JNI aus einer Karte hole.

              Momentane mache ich es so, dass ich alle 20 ms einen Wert aus der Karte hole und ihn auf Graphics2D eines VolatileImage zeichne.
              Dann verschieb ich Graphics über copyArea quasi und zeichne das VolatileImage über drawImage neu.
              Da es sich nach einiger Zeit um tausende Messwerte handelt, will und kann ich diese nicht irgendwie speichern, heisst ich kann das gesamt Plot nicht rekonstruieren.

              Jetzt ist die Frage, ob ihr vielleicht eine Idee für einen komplett anderen Ansatz habt unter der Maßgabe, dass es eben so viele Meßwerte sind?

              Für das bisherige Kopfzerbrechen schonmal danke.

              Kommentar


              • #8
                Mir sind jetzt so einige Sache nicht klar :

                1) Warum gehst Du nicht über BufferedImage (java.awt.image.BufferedImage) und schenkst Dir die copyArea Geschichte und und implementierst Arbeits-Iterator, der Dir das aktuelle Signal anzeigt und dann erst drawed? Außerhalb der Bereiches setzt Du den Iterator wieder auf 0 (zurück)

                2) Soll die Oszillation eine stehende Welle anzeigen? Wenn ja, lass doch das drawImage routieren. So vermeidest Du auch ein Memory-Overflow und die Geschwindigkeit bleibt konstant.

                3) Bei laufender Welle: Mein vorgeschlagen Polygon-Ansatz bringt einen Area -Begrenzung. Jeder Messpunkt ist eine Ecke. Der letzte Punkt wird auf der Nulllinie zurückgezeichnet.

                4) Mit Bezierkurven sieht es noch schöner aus. Ist aber schwerer zu coden.

                5) VolatileImage ?!

                6) Für eine Rekonstruktion musst Du schon eine Persistenz einfügen.

                </brain storming>

                Blaster
                Yuppi, endlich Elite ...

                Kommentar


                • #9
                  hmm ..
                  zu 1.) damit weiß ich leider nicht viel anzufangen
                  zu 3.) ja, es ist eine laufende Welle.

                  und ich hab es bisher so gemacht, weil ich leider, leider noch nicht allzuviel mit Java gemacht habe und mir die meisten Basis-klassen bisher verschlossen geblieben sind.

                  Wenn es Dir nichts ausmachst ... könntest Du mir evtl. ein paar mehr Hinweise geben, wie Du die Sache mit den Polygonen oder Bezierkurven angedacht hast? Dann könnte ich ich damit näher beschäftigen.

                  Kommentar


                  • #10
                    Eigentlich bin ich gerade dabei die "Putzfrau-Sperrzonen" in meinen Büro sauber zu machen. Ist mega überfällig ...

                    http://java.sun.com/j2se/1.3/docs/gu...image.fm3.html

                    http://java.sun.com/j2se/1.3/search.html

                    Ja, ja! - Wer nicht mindests 3-4 Jahre Javaerfahrung hat und meint er könne Java .... (ich kann somit auch kein Java )

                    Vielleicht habe ich heute Abend ein bischen Zeit ... kommt darauf an wie es hier staubt ...

                    *huhst*

                    Blaster
                    Yuppi, endlich Elite ...

                    Kommentar


                    • #11
                      Wäre toll, allerdings ist ab und zu aufräumen auch toll.

                      Ich lese derweil einfach mal.

                      Kommentar


                      • #12
                        So! - Kein Bock mehr ...


                        zu 1) Ein BufferedImage repräsentiert ein Bild als rechteckiges Array von Pixeln in einen Raster-Objekt und einen ColorModel-Objekt, das die Pixelwerte des Raster-Obj interpretieren kann. Ein BuffererdImage speichert seine Daten jedoch immer im Speicher.

                        Nachdem ein BufferedImage-Obj erzeugt wurde, erhält man duch Aufruf von createGraphics() ein Graphics2D-Objekt, mit dem man in das Bild (z.B. Koordinatenlinien) zeichen kann (drawImage()) Ein B.I. - Obj kann bearbeitet werden, indem die filter() Methode eines beliebigen BufferedImageOp-Obj übergeben wird.

                        Schließlich können einzelne Pixel oder Pixelblöcke eines Bufferedimage mit getRGB() und setRGB() bearbeitet werden.

                        B.I. implementiert das Interface WritableRenderedImage, das seinerseits RenderImage implementiert. Dieses Interface wird in erster Linie vom Java-Advanced-Imaging-API (javax.jai.* [jdk 1.4] ) verwendet. Mit dessen Methoden kann ein Bild in mehrere rechteckige Kacheln zerlegt werden.
                        Die klasse B.I. definiert jedes Bild als eine einzelne Kachel, so dass diese Methode triviale Implementierungen besitzen.

                        Glossar:
                        Raster -Die Klasse repräsentiert ein rechteckiges Array von Pixeln. Das Raster besteht einen DataBuffer, der die "rohen" Pixeldaten enthält, und einen passenden SampleModel, mit dem die Pixeldaten aus dem DataBuffer extrahiert werden können.
                        Raster besitzt verschiedene methoden, um einzelne Pixel oder Pixelblöcke auszulesen. Es gibt jedoch keine Methode zu setzen, dazu muss die Unterklasse WritableRaster verwendet werden.

                        BufferImageOp - Die beschreibt eine Operation, die verschiedene B.I.-Obj verarbeiten kann. filter () bildet aus dem Source B.I. eine Destiantion Graphics2D
                        Für mehr Details siehe package java.awt.image.Bufferedimage
                        etc.
                        http://java.sun.com/j2se/1.3/docs/api/
                        Meine Idee war das B.I. , das deine aktuellen Messwerte enthält, in Pixelblöcken zerlegt wird z.B.:
                        x 0 1 2 3 4 5 6 ...
                        y 5 6 8 7 5 3 2 ...

                        Unter der Annahme, das x=6 der letzte Messwert ist, liegt der Iterator = 6;
                        U. d. A. einer rechtsläufigen Welle werden, dann die Blöcke:
                        x 6 5 4 3 2 1 in der Graphics2D gebildet.
                        Hat ein Block den Rand des Oszilloskops erreicht, kann x=0 überschieben werden, indem der Iterator = 0 wird. So bleibt der Heap und die Laufzeit konstant.

                        to be continue ...
                        Yuppi, endlich Elite ...

                        Kommentar


                        • #13
                          zu 3) Die Klasse java.awt.Polygon definiert ein Array von Punkten(x,y). Diese können mit der Methode addPoint() angegeben werden. Sie können dann mit der Methode drawPolygon() von Graphics(2D) gezeichnet werden.

                          Meine Überlegung war den ersten und letzten Punkt als (0, x) auf der x-Achse zu verbinden. Dabei soll neue Punkte in (x=1,y) eingeführt werden und alle anderen werden eine Einheit nach rechts verschoben (x++, y) der Punkt (x=n-1,y) ist der Punkt wo das Polygon den Sichtbereich verlassen würden und der Punkt kann überschrieben werden.

                          Da die Ansicht von Polygonen etwas "eckig" ist, kam mir die Idee zu den Bezierkurven:

                          zu 4) Bezierkurven "glätten" das Krümmungsverhalten zwischen zwei Punkten, wie bei einen Kurvenlinial. Die Klasse
                          java.awt.geom.CubicCurve2D.* ist eine abstrakte Klasse eines java.awt.Shape-Obj, das eine glatte kubische Bezierkurve zwischen zwei Endpunkten p1(x1,y1) und P2 (x2,y2) repräsentiert. Die genaue Form der Kurve wird durch zwei Kontollpunkte cp1(cx1,cy1) und cp2 (cx2, cy2) definiert. Die konkreten Unterklassen lauten CubicCurve2D.Double bzw. .float

                          Für Details siehe wieder in die API-DOC.

                          zu 6) Wenn Du ein "ScreenShot" der B.I. speichern willst (zur Auswertung) , empfehle ich das graphics2D ein als JavaBean auszulagern.

                          So - Ich habe fertig

                          Noch frohe Ostern und dicke Eier!

                          Blaster
                          Yuppi, endlich Elite ...

                          Kommentar


                          • #14
                            Wow,
                            normalerweise würde ich jetzt ein bis 16 Bier ausgeben. Also vielen Dank (erstmal?).
                            Ich werd's mir das ganze jetzt genau anschauen und sehen, wie ich es verwerten kann (versprochen, die Arbeit war nicht umsonst).
                            Vielleicht kann ich ja, wenns fertig ist, einen screenshot präsentieren.

                            PS: drawImage() ... ist das so rechenintensiv oder war es mein altes copyArea()?

                            Kommentar


                            • #15
                              Jau ... der ist schon Klasse ... der Blaster ...
                              carpe noctem

                              [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                              [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                              Kommentar

                              Lädt...
                              X