Ankündigung

Einklappen
Keine Ankündigung bisher.

4 Taster navigation

Einklappen

Neue Werbung 2019

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

  • 4 Taster navigation

    Hallo
    Ich benötige etwas Starthilfe.
    Ich habe ein Display (1-wire) und 4 Taster.
    Taster Links
    Taster Rechts
    Taster Esc
    Taster Enter
    Mit den Tastern möchte ich durch ein Menu navigieren um Zustände abzufragen.
    Das Menu ist auf der ersten Ebene mit ca. 20 Einträgen,
    auf der zweiten Ebene hat jedes Element bis max. 10 weitere Unterpunkte.
    Jeder dieser Punkte auf der 3 Ebene hat einen Parameter welchen man abrufen kann.
    Ebene1
    --------Raum1
    --------------Temperatur
    --------------Feuchte
    --------------Licht
    --------Raum 2
    --------------Wasserstand
    --------------Schalter Notaus
    Ebene x

    Ich denke, dass dafür eine caseabfrage geeignet ist, aber ich habe noch nicht so richtig die Idee wie ich die Navigation mit den 4 Tastern am einfachsten gestalte.
    Jeder Taster ist eine eigene Variable und ich denke das man am besten mit dem Taster so etwas wie eine Rechenoperation gestaltet um sich in den Ebenen zu bewegen, Habe aber nichts ähnliches als ein Muster gefunden.

    Ich denke das so etwas nichts besonderes sein kann, oder liege ich da falsch?

  • #2
    Zitat von marc_tobien Beitrag anzeigen
    Taster Links
    Taster Rechts
    Taster Esc
    Taster Enter
    Mit Tasten dieser „Bedeutung“ lässt sich kaum vernünftig in einem solchen Menü navigieren - da musst du also erst mal welche „umdefinieren“.
    Welche Bedeutung hast du dir also vorgestellt?

    Jeder Taster ist eine eigene Variable
    Bitte deutlicher ausdrücken.

    „Variable“ in welchem Umfeld - PHP?

    und ich denke das man am besten mit dem Taster so etwas wie eine Rechenoperation gestaltet um sich in den Ebenen zu bewegen
    Was willst du denn da rechnen?
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Hallo ChrisB

      OK sagen wir, ich habe 4 Taster wo PHP deren Status kennt.

      Rechnen könnte man z.B.
      wenn jede Ebene eine Nummer hat könne man z.B. mit den Tatern eine Variable erhöhen bzw verringern. und somit mit einer case Abfrage das Gewünschte Ergebniss abfragen.

      Genau aus diesem Grund frage ich ob jemand einen guten Lösungsansatz hat, welcher keine seitenweise Code benötigt.

      Übrigens kann man sehr wohl mit diesen Bedeutungen auf den Tastern arbeiten. Dieses wird in MSA diskarrays von HP, SPS von Siemens, FU´s von straschu , Brandmeldetablos von Minimax und vielen anderen Abfrageterminals so benutzt. Es kommt immer au die Anzeige im Display an was dort steht und was man machen soll.
      Aber ich kann den ganzen auch einfach nur Nummern geben, T1 T2 T3 T4.
      Marc

      Kommentar


      • #4
        Zitat von marc_tobien Beitrag anzeigen
        Rechnen könnte man z.B.
        wenn jede Ebene eine Nummer hat könne man z.B. mit den Tatern eine Variable erhöhen bzw verringern.
        Mir war nicht klar, dass du sowas simples schon als „rechnen“ bezeichnest
        Was du da mit Case willst, ist mir aber noch nicht klar.

        Übrigens kann man sehr wohl mit diesen Bedeutungen auf den Tastern arbeiten.
        Das habe ich ja nicht bestritten.
        Nur für die Navigation in einem Menü ist "ESC" keine gängige Funktion. Man kann es natürlich benutzen, um wieder eine Ebene nach oben zu kommen - und das wäre eine Umdefinidition der Bedeutung dieser Taste.

        Deshalb, noch mal: Überlege dir, welche Bedeutung welcher Taste zukommen soll.
        Und dann, mach PHP-Code draus.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          Hallo,

          ich kann mit deiner Beschreibung garnichts anfangen, auch dein zweiter Post beantwortet eigentlich wenig die Fragen, die ChrisB gestellt hat.

          Du hast ein HTML-Menü und möchtest nun mit der Tastatur durch die Navigation navigieren? Oder was sind Taster im Zusammenhang mit PHP?

          Beschreib doch mal das größere Ganze. Ich versteh echt nur Bahnhof.
          "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

          Kommentar


          • #6
            Hallo Chriz

            Ich habe ein 4 Zeilen 20 Zeichen Display, wie es z.B. Alarmanlagen haben.
            Am Displaygehäuse sind 4 Tasten angebracht.
            Das ist der mechanische Aufbau. Keine Tastatur, Maus, Bildschirm oder etwas anderes.
            Nur 2 Dräte und ein Kasten.

            Im Hintergrund ist ein 1-wire System mit etlichen 100 Sensoren und cd 80 rrd Datenbanken auf einem Linux Server. Per PHP werden auf einen apatche Webserver Seiten erzeugt, welche die Auswertungen in unterschiedlichsten Darstellungen und Übersichtsdiagamme wiedergeben. Vom Server werden auch über das 1-wire System unterschiedliche Aktionen gestartet.


            Das oben genannte Display ist für externe Personen, die damit bestimte Parameter abfragen bzw angezeigt bekommen.

            eine Ausgabe sieht z.B. so aus:

            10.10.2010 20:22 ALARM
            Ebene 1 Raum 1
            Temperatur 99,99 C
            (leere 4. Zeile)
            Jetzt möchte ich das Display so erweitern, dass mit Hilfe der 4 Taster sich der Benutzer durch das Menü navigieren kann und z.B. sich einen Raum in einer anderen Ebene ansehne kann.
            Aufgrund der vielen Werte ist es viel zu Zeitaufwändig ein einfaches "Nächster Wert" zu benutzen. Da bekommt er Bediener einen lahmen Finger und der Taster ist in ein paar Monaten hinüber.

            Für einen Test habe ich auf die schnelle mir bein shell Script geschrieben.

            Code:
            #!/bin/bash
            # loop wo sind die switche
            for x in /var/1-wire/mnt/1F*/*/29.* ; do
            echo "133333333" > $x/set_alarm 
            echo "0" > $x/PIO.BYTE 
            done
            
            #Loop forever
            while : ; do
            for x in /var/1-wire/mnt/1F*/*/29.* ; do
            if [ $(basename $x) = "29.219309000000" ]
            then
            	case $(cat $x/latch.BYTE | sed 's/\s//g') in
            	0)
            		echo "keine Änderung"
            		;;	
            	1)
            		echo "Taster1"
            		;;
            	2)
            		echo "Taster2"
            		;;
            	4)
            		echo "Taster3"
            		;;	
            	9)
            		echo "keine Aktion"
            		;;
            	esac
            fi
            echo "1" > $x/latch.BYTE
            done
            # pause ? 
            done
            So bin ich auf die Idee gekommen, die ganze Navigation über case zu steuern.
            Es ist eigentlich egal ob in schell oder Python oder PHP das Program geschrieben wird, ich bin ein Hardwareentwickler und kann von allen etwas. Da die ganzen rrd Auswertungen und Wertezuordnungen in php Datein abgelegt sind, währe es warscheinlich am schönsten in php weiter zu machen.
            Ich suche halt eine Idee wie ich einfach zu einer Lösung komme.

            Marc


            Terminal ist ähnlich wie diese Abbildung

            Kommentar


            • #7
              Zitat von marc_tobien Beitrag anzeigen
              Ich suche halt eine Idee wie ich einfach zu einer Lösung komme.
              Na ja aber wo ist denn jetzt dein eigentliches Problem?

              Definiere, welche Taste was bewirken soll in deinem Menü - und dann setze es um.
              [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

              Kommentar


              • #8
                Hallo marc,

                danke für deine Erklärung, der Umstand ist jetzt schon einmal klarer.

                Mir ist allerdings einiges noch unklar:

                - dein Menü wird niemals angezeigt, man navigiert sich anhand dieser Info ("Ebene 1 Raum 1") durch das nicht-sichtbare Menü? (Taster Rechts soll nun Raum 2 anzeigen? Taster Unten würde Ebene 2 anzeigen?) Wie definierst du die Taster, welche Taste soll welchen "Sprung" in der Navigation ausführen?
                - wie sieht der Request genau aus, wenn du eine Taste drückst?
                - hast du Sessions zur Verfügung oder benutzt du die Konsolenvariante von PHP? (du musst dir ja irgendwie merken, welches die aktuelle Ansicht ist, um durch die Taster relativ davon weiterzunavigieren)
                - Wie sieht der Aufruf in PHP denn aus, um den Wasserstand, Raum 2, Ebene 1 anzuzeigen? Ist das eine Variable (wie heißt sie, sind sie nach Schema benannt oder frei, woher stammen sie?) oder sind es Funktionsaufrufe?

                Wenn ich mir vorstelle, deine Werte (entsprechend des Menüs) liegen als Array vor und du könntest dir "irgendwo" (siehe Frage mit Sessions) die aktuelle Position merken, könnte dein Skript vielleicht so aussehen?

                PHP-Code:
                <?php
                // hier ist dein imaginäres Menü mit allen notwendigen Bezeichnern und Werten
                $ebenen = array(
                  
                "Ebene 1" => array(
                    
                "Raum 1" => array(
                      
                "Temperatur" => "18°",
                      
                "Feuchte" => "60%",
                      
                "Licht" => false
                    
                ),
                    
                "Raum 2" => array(
                      
                // etc.
                    
                )
                  ),
                  
                "Ebene 2" => array(
                    
                // etc.
                  
                )
                );

                // diese Werte musst du passend durch die entsprechenden Taster erhöhen
                $ebeneIndex 0// dein Ebenen-Index
                $raumIndex 0// ..
                $eigenschaftIndex 0;

                $maxEbenen count($ebenen); // wieviel Ebenen gibt es?
                $ebeneIndex $ebeneIndex $maxEbenen// 10 mal drücken, aber nur 9 Ebenen, Restrechnen um keinen Überlauf zu produzieren

                reset($ebenen); // array pointer zurücksetzen

                while ($ebeneIndex-- > 0) { // unseren Ebenenarray solange durchlaufen, wie der $ebenenIndex groß ist
                  
                next($ebenen); // pointer eins weiter
                }

                $ebeneName key($ebenen); // Name der Ebene im aktuellen Pointerelement abholen
                $raeume current($ebenen); // wert abholen

                // jetzt folgt eine Wiederholung des obigen Skriptparts für Räume und Werte

                $maxRaeume count($raeume);
                $raumIndex $raumIndex $maxRaeume;

                reset($raeume);

                while (
                $raumIndex-- > 0) {
                  
                next($raeume);
                }

                $raumName key($raeume);
                $eigenschaften current($raeume);

                $maxEigenschaften count($eigenschaften);
                $eigenschaftIndex $eigenschaftIndex $maxEigenschaften;

                reset($eigenschaften);

                while (
                $eigenschaftIndex-- > 0) {
                  
                next($eigenschaften);
                }

                $eigenschaftName key($eigenschaften);
                $eigenschaftWert current($eigenschaften);

                // so jetzt alles ausgeben

                echo date("d.m.Y H:i"), " Uhr ALARM"PHP_EOL;
                echo 
                $ebeneName" "$raumNamePHP_EOL;
                echo 
                $eigenschaftName" "$eigenschaftWertPHP_EOL;
                echo 
                "leere 4. Zeile";
                ?>
                (ungetestet)

                Jetzt müssen deine Taster irgendwie $ebeneIndex, $raumIndex oder $eigenschaftIndex "hochzählen", so dass die höheren Index-Werte "länger" über die jeweiligen Arrays iteriert wird (siehe while-Schleife und next) und entsprechend andere Werte gezogen wird. Das % ist Restrechnen (Modulo), damit es keinen Indexüberlauf gibt.

                Wenn du aber freie Wahl beim definieren des Menü-Arrays hast, ist auch ein viel einfacheres Skript möglich. Ein switch-brauchst du dabei jeweils nicht.

                Aber vielleicht habe ich dich auch komplett falsch verstanden?!
                "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                Kommentar


                • #9
                  Also wenns dir nur um ein Menü geht wo du navigieren willst würde ich dir vielleicht sowas empfehlen:
                  Dynamic Drive DHTML Scripts- Smooth Navigational Menu
                  "My software never has bugs, it just develops random features."
                  "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                  Kommentar


                  • #10
                    Links/rechts wählt Punkt aus aktueller Menüebene, Enter lädt diesen Punkt, Esc wechselt in die nächsthöhere Ebene. Wo ist nun die Frage?
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      @Chriz

                      Das ist nen Infinity Loop kein One Way Script, das das script nur einmal aufgerufen wird gehe ich davon aus das er auf irgend ein systemdevice verbindet und dort innerhalb dieser schleife daten auffängt.

                      Hier meine Idee

                      PHP-Code:

                      $xml 
                      "
                      <navigation>
                       <item1>
                        <item2 />
                        <item3 />
                        <item4 />
                        <item5 />
                        <item6 />
                        <item7 />
                       </item1>
                       <item8>
                        <item9 />
                        <item10 />
                        <item11 />
                       </item8>
                      </navigation>"
                      ;

                      $runner domxml_open_mem($xml);

                      while ( 
                      $con GiveMeTheStream() ) {
                        switch (
                      $con) {
                          
                        
                      # ---> Cases => TastenEvents <---
                        # jedes tastenevent tut das was du willst
                        # Esc ( versucht ) ein parent im xml baum hochzuwandern
                        # left ( versucht ) ein element im xml baum innerhalb der node hoch zu gehen
                        # right ( versucht ) ein element im xml baum innerhalb der node runter zu gehen
                        # enter ( versucht ) das child zu betreten sofern es denn da ist (hasChilds)
                        
                      }

                      Warum XML ?
                      Ich spar mir das loggen, in der while schleife pack ich gleich die log als attribute auf die tags drauf, relativ unlimitiert und kann solange laufen wie es will, ist der "service" fertig speicher ich die xml ab, ggf. kann ich den "laufweg" auch durch effektives zulassen bestimmter tags zum betreten dazu nutzen zu navigieren, das loggen dann in einem anderen unterzweig parse-fähiger für bspw. xsl-stylesheets zu machen

                      Array-Walks würden auch funktionieren, nur ist das aufwändiger als wenn ich die xml-funktionen verwenden würde ( in meinen Augen )

                      cheers

                      Nachtrag: da fällt mir grad noch ein: In die XML würd ich auch die Daten die ans Interface geliefert werden sollen packen, die dann gleich zusenden. quasi der dom-walk direkt auf dem storage ^^
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Ich begreife die Endlosschleife nicht. PHP arbeitet von Aufruf zu Aufruf, im Normalfall jeweils einen Request an den Webserver ab. Endlosschleifen dürften Dir schnell auf die Füße fallen, wenn der Speicher volläuft.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          Warum scripte mehrmals aufrufen wenn einmal reicht ? Es bräuchte theoretisch nur ein datenstream abgearbeitet werden, ergo eine php-cli Anwendung kein Webserver nötig. Endlosschleifen fallen dir nur dann auf die füße wenn du den speicher auch vollwirfst, simple array-movements oder xml-tree movements tun das nicht. Ich hatte beispielsweise eine DataFetch-App gebaut die permanent meta-daten von mehreren videostreams auswertete, das script läuft seitdem durchgehend und wird nur neugestartet wenn der Server neustartet oder der Admin es will. Anderes beispiel sind in PHP realisierte IRC-(ro)bots. Auch PHP-CLI, läuft ewig.
                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar


                          • #14
                            Zitat von tr0y Beitrag anzeigen
                            Das ist nen Infinity Loop
                            Ich habs nicht getestet, ich hab ja absolut keine Ahnung wie seine "Basis" aussieht. Da er sich nicht mehr meldet, will ich jetzt keine Mühe in den Thread investieren oder etwas korrigieren, aber danke dass du es getan hast
                            "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                            Kommentar

                            Lädt...
                            X