mardi 21 juillet 2015

Potentiomètre vectoriel

Cette page http://sin.nexgate.ch/slid2/slid.html illustre le résultat du code qui suit. La position du potentiomètre est enregistrée ici http://sin.nexgate.ch/slid2/slid.txt. Le script php invoqué n'est pas présenté ici. Voir billet Un potentiomètre sur une page web.
Le potentiomètre n'a de vectoriel que les images qui le composent. Ce sont des fichiers au format svg produits à l'aide l'éditeur en ligne SVG-Edit.
Le code suivant ne traite pas le tiré-glissé mais le clic de la souris seulement. L'essai intégrant ces deux évènements n'ayant pas donné satisfaction. Avis aux commentaires...
<!doctype html>  
<html>  
  <head>  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>slider</title>  
    <style>  
      #sli {  
        width:40px;
        height:40px;
        left:10px;
        position:absolute;
        top:150px;
      }  
       #plast {
        width:30px;
        height:180px;
        position:absolute;
        left:15px;
      }
       #inf {
        position:absolute;
        left:60px;
        top:10px;
        background-color: #00b300;    
        border-radius: 5px;    
        box-shadow: 4px 4px 2px #373737;    
        color:white;      
        font-family:verdana;      
        text-align: center;
        width:50px;
      }
      #ghost {
        width:30px;
        height:180px;
        position:absolute;
        left:15px;
        //border-style: solid;
        //border-width: 1px;
      }
    </style>  
  </head>  
  <body >  
    <img id="plast" src="./slid.svg">
    <img id="sli" src="./butg.svg">
    <span id="inf">0</span>
    <img id="ghost" src="./ghost2.gif">
    <div></div>
    <script>  
      document.getElementById("ghost").addEventListener("mousedown", addevent);
      document.getElementById("ghost").addEventListener("mouseup", removeevent);
      function putslide() {   
        var y = event.clientY-20;
        if (y>150) y=150;
        if (y<10) y=10;
        var ind=150-y;
        document.getElementById("inf").innerHTML=ind;
        var but=document.getElementById("sli");
        but.style.top = y + "px";
        window.location.href="./test.php?ind="+ind; 
      }
      function addevent() {

        document.getElementById("ghost").addEventListener("mousemove", putslide);
      
        putslide();
      }
      function removeevent() {
        document.getElementById("ghost").removeEventListener("mousemove", putslide);
      }
    </script>   
</html>      
Lecture du code à suivre

samedi 18 juillet 2015

Commutateur animé à 3 positions

Cette page http://sin.nexgate.ch/knb3/knb.html illustre le résultat du code qui suit. La position du commutateur - 0, 1 ou 2 - est enregistrée ici http://sin.nexgate.ch/knb3/knb.txt. Le script php invoqué et réalisant l'enregistrement est similaire à celui du billet Un potentiomètre sur une page web.
<!doctype html>    
<html>    
 <head>    
  <meta name="viewport" content="width=device-width, initial-scale=1.0">    
  <title>Commutator</title>    
  <style>  
    #cmt {    
      left: 20px;     
      position: absolute;   
      top: 60px;    
      width:120px;       
    }    
    #lef {    
      left: 7px;    
      top:50px;   
      width:30px;    
    }  
    #med {    
      left: 65px;    
      top:25px;   
      width:30px;    
    }  
    #rig {    
      left: 130px;  
      top:50px;   
      width:50px;    
    }  
    .lab {    
      background-color: grey;  
      border-color: black;  
      border-radius: 15px;  
      box-shadow: 4px 4px 2px #373737;  
      color:white;    
      font-family:verdana;    
      position: absolute;    
      text-align: center;  
    }   
    @-webkit-keyframes clk1 {    
      from  {-webkit-transform: rotate(-45deg);}    
      to {-webkit-transform: rotate(0deg);}    
    }    
    @-webkit-keyframes clk2 {    
      from  {-webkit-transform: rotate(0deg);}    
      to {-webkit-transform: rotate(45deg);}    
    }    
    @-webkit-keyframes aclk1 {    
      from  {-webkit-transform: rotate(45deg);}    
      to {-webkit-transform: rotate(0deg);}    
    }  
    @-webkit-keyframes aclk2 {    
      from  {-webkit-transform: rotate(0deg);}    
      to {-webkit-transform: rotate(-45deg);}    
    }  
  </style>    
 </head>    
  <body>    
    <img id="cmt" src="./cmt.jpg" onclick="rot(event)">    
    <span class="lab" id="med">1</span>    
    <span class="lab" id="lef">0</span>  
    <span class="lab" id="rig">Auto</span>    
    <script>    
      var but=document.getElementById("cmt").style;
      but.WebkitAnimation = "aclk2 0.2s linear 1 forwards";
      window.location.href="./knb.php?mod=0";  
      var pos=0;
      function rot(event) {    
        var x = event.clientX;  
        switch(pos) {  
          case 0:  
            if(x>80 ) {     
              but.WebkitAnimation = "clk1 0.2s linear 1 forwards";     
              pos++;     
              }    
              break;  
          case 1:  
            if(x>80 ) {     
              but.WebkitAnimation = "clk2 0.2s linear 1 forwards";     
              pos++;     
              }    
            else {     
              but.WebkitAnimation = "aclk2 0.2s linear 1 forwards";     
              pos--;     
              }   
              break;  
          case 2:  
              if(x<80 ) {     
                but.WebkitAnimation = "aclk1 0.2s linear 1 forwards";     
                pos--;     
              }    
              break;  
        }  
      window.location.href="./knb.php?mod=" + pos;  
     }   
    </script>    
  </body>
</html>     
Lecture du code à suivre

vendredi 17 juillet 2015

Commutateur 3 positions

Cette page http://sin.nexgate.ch/knb2/knb.html illustre le résultat du code qui suit. La position du commutateur - 0, 1 ou 2 - est enregistrée ici http://sin.nexgate.ch/knb2/knb.txt. Le script php invoqué et réalisant l'enregistrement est similaire à celui du billet Un potentiomètre sur une page web.
<!doctype html> 
<html> 
 <head> 
  <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
  <title>knob</title> 
  <style> 
    #cmt { 
      left: 20px;  
      top: 60px; 
      position: absolute;
      width:120px;    
    } 
    #lef { 
      left: 7px; 
      top:50px;
      width:20px; 
    }
    #med { 
      left: 53px; 
      top:25px;
      width:50px; 
    }
    #rig { 
      left: 130px; 
      top:50px;
      width:20px; 
    }
    .lab { 
      background-color: grey;
      border-color: black;
      border-radius: 15px;
      color:white; 
      font-family:verdana; 
      position: absolute; 
      text-align: center;
      box-shadow: 4px 4px 2px #373737;
    } 
  </style> 
 </head> 
  <body onload="rot2php(event)"> 
    <img id="cmt" src="http://sin.nexgate.ch/knb2/knb.jpg" onclick="rot2php(event)"> 
    <span class="lab" id="med">Auto</span> 
    <span class="lab" id="lef">0</span>
    <span class="lab" id="rig">1</span> 
    <script> 
    var pos=0; 
    function rot2php(event) { 
      var x = event.clientX; 
      var but=document.getElementById("cmt").style; 
      if(x<80 && pos>0) { 
        but.WebkitTransform += "rotate(-45deg)"; 
        pos--; 
      }
      else
        if(x>80 && pos<2) { 
          but.WebkitTransform += "rotate(45deg)"; 
          pos++; 
      } 
      window.location.href="./knb.php?mod=" + pos; 
    } 
    </script> 
  </body> 
</html> 
Lecture du code à suivre

Interrupteur animé à glissière sur une page web

Le code suivant affiche un interrupteur cliquable et changeant de position graduellement. Ceci est facilité avec les scripts CSS3 et Javascript. La position, 0 ou 1, est enregistrée dans le fichier texte: http://sin.nexgate.ch/bt3/bts.txt. Rendu ici: http://sin.nexgate.ch/bt3/bts.html.
La technique consiste à afficher une partie de cette image dans un cadre de dimensions données.
<!doctype html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>switch slide</title>
    <style>
      #sw {
        height:52px;
        background-repeat:no-repeat;
        border-radius: 5px;
        width: 176px;
      }
      @-webkit-keyframes on2off {
        from  {background: url(./sw10.jpg) -13px -18px;}
        to {background: url(./sw10.jpg) -114px -18px;}
      }
      @-webkit-keyframes off2on {
        from {background: url(./sw10.jpg) -114px -18px;}
        to  {background: url(./sw10.jpg) -13px -18px;}
      }
    </style>
  </head>
  <body onload="tog()">
    <div id="sw" onclick="tog()"></div>
    <script> 
      var key=0;
      function tog() { 
        var but=document.getElementById("sw").style; 
        if(key==1) but.WebkitAnimation = "off2on 0.5s forwards";
          else but.WebkitAnimation = "on2off 0.5s forwards"; 
        window.location.href="./bts.php?st=" + key;
        key= (++key & 1);
      }
    </script> 
  </body>
</html>
Lecture du code bientôt

jeudi 16 juillet 2015

Potentiomètre rotatif sur page web

Le rotation est rendue possible avec le style CSS3. Javascript ajoute le dynamisme en modifiant l'angle de rotation au clic sur le bouton. Puis un autre script semblable à celui du billet Un potentiomètre sur une page web est invoqué pour enregistrer la position du potentiomètre. Ces pages web compatibles avec le navigateur Chrome illustrent cela : http://sin.nexgate.ch/knb/knb.html et http://sin.nexgate.ch/knb/knb.txt
<!doctype html>
<html>
 <head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>knob</title>
  <style>
    #knb {
      left: 39px; 
      position: absolute; 
      top: 34px; 
      width:120px;   
    }
    #inf {
      background-color: grey;
      color:white;
      font-family:verdana;
      left: 85px;
      position: absolute;
      top:165px;
      width:20px;
    }
  </style>
 </head>
  <body>
    <img id="plast" width="180px" src="http://sin.nexgate.ch/knb/ech.jpg">
    <img id="knb" src="http://sin.nexgate.ch/knb/knob.png" onclick="rot2php(event)">
    <span id="inf">0</span>
    <script>
    var cnt=0;
    function rot2php(event) {
      var x = event.clientX;
      var but=document.getElementById("knb").style;
      if(x<100 && cnt>0) {
        but.WebkitTransform += "rotate(-15deg)";
        cnt += -1;
      }
      if(x>100 && cnt<16 ) {
        but.WebkitTransform += "rotate(15deg)";
        cnt += 1;
      }
      document.getElementById("inf").innerHTML=cnt;
      window.location.href="./knb.php?st="+cnt;
    }
    </script>
  </body>
</html>

Lecture du script HTML

Il y a 3 éléments visibles sur la page web :
  • Ligne 25, une image qui représente la graduation
  • Ligne 26, une image représentant le bouton rotatif
  • Ligne 27, une étiquette, position de 0 à 16, déclarée par l'élément <span>. Sa largeur est déterminée via le script CSS
Le bouton déclaré en second est posé sur la graduation et sera donc cliquable. Et lorsqu'il le sera, son attribut onclick déclenchera l'exécution de la fonction rot2php() décrite ensuite.

Lecture du script CSS

En lignes 7 à 12, les attributs position, left et top du bouton identifié knb le superposent sur l'image de la graduation. La largeur du bouton est déterminée par l'attribut width. Inutile de déterminer sa hauteur car le navigateur s'en charge adoptant ainsi les proportions d'image.

Lecture du script Javascript

En ligne 29, la variable globale cnt contient le nombre qui s'affichera dans l'élément <span>. C'est la position horaire du bouton. Ex : à 0 correspond à la position de butée gauche et à 16 la position de butée droite.

A partir de la ligne 30 est déclarée la fonction rot2php(). Elle fait tourner le bouton selon la valeur de la variable cnt et selon le clic.

Cette fonction accepte le paramètre event, intégrant les coordonnées de la souris. En effet selon l'endroit du clic, le bouton tournera dans un sens ou dans l'autre. En ligne 31, la variable locale x est affectée de l'abscisse (distance horizontale) de l'endroit du clic. La distance est mesurée en pixels depuis le bord gauche de l'image du bouton.

En ligne 32 la variable but représente l'attribut style de l'élément identifié knb : le bouton. On racccourcit le code qui suit ainsi.

Vient la première alternative en ligne 33. Si x<100 c'est à dire clic sur la partie gauche du bouton et si cnt>0 c'est à dire le bouton n'est pas un butée gauche alors :
  • Ligne 34 on fait tourner le bouton de 15 degrés dans le sens anti-horaire
  • Ligne 35, on retranche 1 de la variable cnt
L'autre alternative en lignes 27 à 40 s'interpréte de façon similaire. 

Ligne 41 actualisation de l'affichage de la variable cnt dans l'élément <span> : l'étiquette.

Ligne 42, transmission de la variable cnt au script knb.php qui se charge de l'enregistrer sur le serveur distant. Voir script semblable sur le billet Un potentiomètre sur une page web 

mardi 14 juillet 2015

Un bouton sur une page web (encore)

On reprend le billet "Un bouton sur une page web" mais la technique ici est différente car elle met le Javascript à l'honneur avec pour résultat davantage de réactivité en cas de connexion lente. Le script délivré plus bas est illustré ici http://sin.nexgate.ch/bt2/bt.html et le résultat, l'état du bouton : 0 ou 1, est enregistré sur le serveur ici http://sin.nexgate.ch/bt2/bt.txt pour un usage ultérieur. Le script bt.php invoqué plus bas et réalisant l'enregistrement de l'état du bouton n'est pas le propos mais reste consultable sur l'autre billet.
<!doctype html>
<html>
 <head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>button</title>
 </head>
  <body onload="togphp()">
    <img id="btn" width="80">
    <script>
      document.getElementById("btn").addEventListener("click", togphp);
      function togphp() {
        var imgon="http://sin.nexgate.ch/bt2/btnon.jpg";
        var imgoff="http://sin.nexgate.ch/bt2/btnoff.jpg";
        var img=document.getElementById("btn");
        if(img.src==imgoff) {
            img.src=imgon;         
            window.location.href="./bt.php?st=1";
        }
        else {
          img.src=imgoff;
          window.location.href="./bt.php?st=0";
        }
      }
    </script>
  </body>
</html>

Lecture du code HTML

Il n'y a qu'un seul élément visible sur la page, déclaré par la balise<img> en ligne 8. Son attribut src définissant l'URL de l'image sera affecté plus bas par le code Javascript. C'est lui qui la déterminera selon les clics de souris sur ordinateur ou les touches sur smartphone. Son autre attribut width="80" détermine la largeur de l'image. Sa hauteur non définie est laissée au choix du navigateur qui gardera alors ses proportions intactes.

L'attribut onload de l'élément <body> en ligne 7, lance la fonction tophp() quand le chargement de la page est terminé. Cette fonction Javascript est décrite ensuite. Elle détermine l'attribut src, URL de l'image à associer à l'élément <img>.

Lecture du code Javascript

Donné aux lignes 9 à 24, il change l'image de l'interrupteur à chaque clic et lance l'enregistrement de son état en invoquant le script bt.php.

La ligne 10 s'exécute au chargement de la page, elle associe l'image identifiée "btn" à la fonction nommée togphp() et détaillée quelques lignes en-dessous. Celle-ci sera appelée à l'instant du clic (click). 

La ligne 11 est la déclaration de la fonction togphp(). Cette fonction s'exécutera lorsqu'elle sera invoquée. Deux variables imgon et imgoff  y sont d'abord déclarées et affectées en lignes 12 et 13. Il s'agit des URL correspondant aux deux images, une pour chaque état de l'interrupteur : btnon.jpg et btnoff.jpg. La troisième variable img représente l'élément <img> identifié par son attribut id="btn". Ceci simplifie les scripts qui suivent.

Et on termine par l'alternative if else. Sa condition en ligne 15 compare la valeur de img.src - URL de l'image cliquée - à l'URL correspondant à l'état off. Si il y a égalité, ==,  alors on change l'image avec l'URL imgon : ligne 16. On appelle en ligne 17 ensuite le script bt.php en lui transmettant à la suite de son URL le paramètre st affecté de 1 qui est bien l'état de l'interrupteur suivant le clic. Ce script se charge d'enregistrer le 1 sur le serveur distant comme indiqué auparavant.

Ce qui suit le else en ligne 19 est alors facile à interpréter.




Lire un nombre décimal depuis une page web

Il s'agit d'importer un octet dans une carte Yun Arduino et enregistré sur la page web http://sin.nexgate.ch/slid/slid.txt. Cette autre page http://sin.nexgate.ch/slid/sligau.html détermine le nombre décimal. La carte est programmée en langage C++, programme simple livré dessous, et met à profit ses structures de communication avec le web via wifi. Son intégration dans un réseau local n'est pas traitée ici et l'application intégrant cette fonction n'est pas le propos du billet.
#include <Bridge.h>  
#include <HttpClient.h>  
void setup() {  
  Serial.begin(9600);  
  Bridge.begin();  
}  
void loop() {  
  HttpClient client;  
  float n = 0;  
  client.get("http://sin.nexgate.ch/slid/slid.txt");  
  while (client.available()) {  
    n = client.parseFloat();  
  }  
  Serial.println(n, 1);  
  delay(5000);  
}

Lecture du code

  • En ligne n°1 on déclare la bibliothèque Bridge.h. Elle comporte les fonctions de communication entre les deux processeurs de la carte. Il y a celui qui exécute le programme décrit au-dessus et l'autre qui s'occupe de la communication avec le web.
  • Le seconde ligne déclare la bibliothèque HttpClient.h qui assure la mise en oeuvre des protocoles de communication avec le web.
  • Le segment setup() commence à la ligne 3 et ne s'exécute qu'une seule fois
    • Ligne 4, déclaration de la bibliothèque Serial, et configuration à 9600 bits par seconde, de la liaison série entre carte Yun et ordinateur via cordon USB
    • Ligne 5, déclaration de la liaison série entre processeurs de la carte
Le segment loop() est une boucle s'exécutant indéfiniment
  • Ligne 8, déclaration d'un objet nommé client selon la classe HttpClient. Préférer les variables à portée locale.
  • Ligne 9, variable n est un nombre à virgule flottante initialisé à 0
  • Ligne 10, envoi d'une requête au fichier enregistré à l'URL http://sin.nexgate.ch/slid/slid.txt. Ce fichier texte contient une chaîne de caractères, image d'un nombre compris entre 0 et 255.
  • Lignes 11, 12 et 13 : boucle s'exécutant si un caractère au moins est reçu par la liaison série entre processeurs (réponse venant du web). En ligne 12 tous les caractères issus de cette liaison sont lus et interprétés ensemble, fonction parseFloat(), comme un nombre décimal. Ce nombre est alors affecté à la variable n. La fonction available() est le nombre de caractères reçus et décrémenté jusqu'à 0, par la fonction client.parseFloat(). La boucle while s'interrompt alors car il n'y a plus de caractère à lire c'est à dire quand available() égale 0.
  • En ligne 14 on affiche le nombre n issu du web dans le terminal de l'IDE Arduino. Le second paramètre, 1, est le nombre de ses décimales que l'on souhaite voir afficher. Cette ligne pourra être placée en commentaire en la faisant précéder de // car elle n'a d'intérêt qu'en phase de développement pour s'assurer que le nombre n est correctement affecté. On fera de même avec la ligne 4 qui empêche le fonctionnement du programme dans le cas où la carte ne serait pas reliée à l'ordinateur !
  • delay(5000) est une pause de 5s. Sans cette instruction une nouvelle requête suivrait immédiatement et dans ce cas le serveur hébergeant le fichier texte ne tarderait pas à refuser de répondre : Error 403