Edip Funktionen

Hallo

bin gerade am Experimentieren mit edip und da wurde es mir irgendwann zu blöd immer alle Zahlen mit chr umrechnen zu lassen. Und wenn man mit zwei edips schafft, von denen einer mit xbee verbunden ist, der andere aber am comport hängt muss man jedes überarbeitete Script von Hand wieder neu anpassen.
Ausserdem verliert man bei den langen reihen leicht den Überblick. Jeder der mit edip schafft weiß was ich meine :wink:

RegVar_SendText(20289 /*[Diverse\Edip 1\Register Xbee]*/,chr(27)."AT".chr(0).chr(0).chr(120).chr(20).chr(154).chr(0)."$titel".chr(0)); //Titel anzeigen

Also hab ich mir gedacht bau dir doch ne edip Funktion. Gesagt getan.

Nach einigen Tests hat sich nun diese Funtion ergeben.
Somit sieht das Beispiel von oben nun so aus:

edip("AT,0,0,120,20,154,0,$titel");

Wichtig ist hier das man nur " benutzt. Bei ’ würde statt dem Inhalt von $titel wirklich $titel ausgegeben.

function edip($input)
{
$input=split(",",$input); //$input in ein array umwandeln
$daten = chr(27);//erstes Zeichen #
switch (strtoupper($input[0])) // Sonderfälle für AT und ZL wenn man "nur" eine Zahl ausgeben möchte
{
case "AT":
$daten .= "AT";
for ($i=1;$i<7;$i++)
	{
			$daten .= chr($input[$i]);
	}
	$daten .= vokal($input[7]);

   $daten.=chr(0);
break;
case "AU":
$daten .= "AU";
for ($i=1;$i<6;$i++)
	{
			$daten .= chr($input[$i]);
	}

	$daten.=chr(0);
break;
case "AK":
$daten .= "AK";
for ($i=1;$i<7;$i++)
	{
			$daten .= chr($input[$i]);
	}

	$daten .= vokal($input[7]);
	$daten.=chr(0);
break;
case "AJ":
$daten .= "AJ";
for ($i=1;$i<7;$i++)
	{
			$daten .= chr($input[$i]);
	}

	$daten .= vokal($input[7]);
	$daten.=chr(0);
break;
case "ZL":

$daten .= "ZL".chr($input[1]).chr($input[2]).vokal($input[3]);
$daten.=chr(0);
break;
case "ZC":

$daten .= "ZC".chr($input[1]).chr($input[2]).vokal($input[3]);
$daten.=chr(0);
break;
case "ZR":

$daten .= "ZR".chr($input[1]).chr($input[2]).vokal($input[3]);
$daten.=chr(0);
break;
Default:
for ($i=0;$i<count($input);$i++)
	{
	if (is_numeric($input[$i])) // überprüfen ob Text oder Zahl
		$daten .= chr($input[$i]);
	else
		$daten .= $input[$i];
 	}

break;
}
//echo $daten;

RegVar_SendText(20289 /*[Diverse\Edip 1\Register Xbee]*/,$daten); //daten ans edip senden über xbee

//COMPort_SendText(46080 /*[Objekt #46080 existiert nicht]*/,$daten); //daten an edip übertragen


}

function vokal($text)
{
   $text = str_replace("Ä", "\x8E", $text);
	$text = str_replace("ä", "\x84", $text);
	$text = str_replace("Ö", "\x99", $text);
	$text = str_replace("ö", "\x94", $text);
	$text = str_replace("ü", "\x81", $text);
	$text = str_replace("Ü", "\x9A", $text);
	$text = str_replace("ß", "\xE1", $text);
return $text;
}

Musste leider für AT und ZL eine eigene Abfrage einbauen, da der Text wenn er nur aus einer Zahl besteht auch umgerechnet wird.

Hab erst gedacht das die Funktion grössere Programme langsamer macht, also schnell eine schleife, 100 Durchgänge, gebaut und einige Daten ans edip gesendet. Die Laufzeit ist bei AT und ZL bis auf ein paar ms gleich, erst bei BA und BR ist mir ein Unterschied von 100 ms aufgefallen. Aber damit kann ich gut leben, sende ja selten innerhalb von 10 Sekunden 400 Befehle ans edip. :smiley:

Vielleicht kanns ja jemand brauchen.

Gruß Jannis

Hallo Jannis,

vielen Dank für die Funktion, werde ich bei meinem bald anstehenden Edip-Projekt einmal anwenden.

Vielleicht kann es Ferengi an die Skriptbeispiele hängen.

Hallo

wollte eigentlich nur „schnell“ nen Screenshot von meinem edip haben um ne Frage verständlicher zu formulieren, aber da ich zu faul war :smiley: das edip abzufotografieren dachte ich mir machs doch schnell mal mit IPS.
Naja schnell wars nich aber immerhin funktionierts jetzt ganz gut.

Der Befehl den man ans edip senden muss ist

COMPort_SendText(46080 /*[Serial Port]*/,chr(27)."UH".chr(10).chr(15).chr(50).chr(55)); //daten an edip übertragen

wobei 10,15 die erste Ecke ist und 50,55 die zweite Ecke(immer x,y) ist.

Soweit so klar.
Das edip antwortet dann mit ESC UL 40,40 und dann die BHL daten.
Das Auslesen übernimmt dieses Skript für die Registervariable, wobei Ihr natürlich nur die Caseanweisung für U(85) braucht und sie bei eurem Programm einfügen müsst.

$id_Register = 15719 /*[edip\Register Variable]*/;
$buf = RegVar_GetBuffer($id_Register); //Puffer einlesen
if ($IPS_SENDER == "RegisterVariable")
$buf .=  $IPS_VALUE; // neuen Wert hinzufügen
$id = ord(substr($buf,0,1)); //ersten wert auslesen
print $id."  ";

if ($id == "27")  //27 = ESC
	{
	switch (ord(substr($buf,1,1)))
	{
	case "85":
	$breite = ord(substr($buf,5,1)); //breite der blh datei
	$hoch =ord(substr($buf,6,1)); //höhe
	$max = intval(($breite+7)/8)*$hoch; //Anzahl der Bytes (formel ausm edip handbuch)
	if ((strlen($buf))>($max+5))  //Schauen ob alles empfangen wurde 
		{
		$buf= substr($buf,5,($max+2)); //ESC UL und startwerte abziehen

		$Pfad = "c:/test1.blh"; //Dateiname
		unlink($Pfad); //alte datei löschen
	  $Attribut = "ab";
     $open = fopen($Pfad,$Attribut);          //Öffnen
  		fwrite($open,$buf);                   //schreiben
   	fclose($open);                           //schließen
	   RegVar_SetBuffer($id_Register,"");  // Puffer löschen
		IPS_SetScriptTimer($IPS_SELF,0);
  		}
	else
		{
		RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
       }
	break;
	case "65": //A befehle auslesen
   if ((strlen($buf))>3)  //Schauen ob alles empfangen wurde
		{
		$id = ord(substr($buf,3,1)); // 4 zahl ist die NR.
		print "erfolgreich ".$id;
		setvalue(35128 /*[edip\Taste]*/,$id);
		if ((strlen($buf))>4)
		{
		   RegVar_SetBuffer($id_Register,substr($buf,4,10));
		   IPS_SetScriptTimer($IPS_SELF,2);
		}
		else
		{
		RegVar_SetBuffer($id_Register,"");  // Puffer löschen
		IPS_SetScriptTimer($IPS_SELF,0);
		}
		}
	else
		{
		RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
		IPS_SetScriptTimer($IPS_SELF,2);
      print "nochnicht1";
      }
	break;
   case "66": //Bargrafen auslesen

		if ((strlen($buf))>4)  //Schauen ob alles empfangen wurde
		{
		$id = ord(substr($buf,3,1)); // 4 zahl ist die NR.
		$wert = ord(substr($buf,4,1));
		print "erfolgreich ".$id." Wert: ".$wert;
		setvalue(19564 /*[edip\Schieber]*/,$id);
		setvalue(51784 /*[edip\Wert]*/,$wert);
		if ((strlen($buf))>5)
		{   RegVar_SetBuffer($id_Register,substr($buf,5,20));
		   IPS_SetScriptTimer($IPS_SELF,2);
		}
		else
		RegVar_SetBuffer($id_Register,"");  // Puffer löschen
		}
		else
		{
		RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
      IPS_SetScriptTimer($IPS_SELF,2);
		print "nochnicht2";
      }
	break;
   default:
	if ((strlen($buf))==1)
		{RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
		print "nur 1 empfangen";
		}
	else
		{
		RegVar_SetBuffer($id_Register,""); // Puffer rücksetzten
		IPS_SetScriptTimer($IPS_SELF,0);
      print "Fehler";
      }
	}
	}
else     // Sonstige Taste gesendet
	{ if ((strlen($buf))>1)
		{
		 RegVar_SetBuffer($id_Register,"");  // Puffer löschen
		 IPS_SetScriptTimer($IPS_SELF,0);
		print "Overflow";

		}
setvalue(38542 /*[edip\Befehl]*/,$id);
IPS_SetScriptTimer($IPS_SELF,0);
}

Manchmal klappts nicht auf Anhieb , denn wenn nur ein byte fehlt/zuviel ist öffnet der Bitmapeditor vom edip die Datei nicht mehr. Deswegen auch der

substr($buf,5,($max+2));

$max anzahl der Bytes plus je ein byte für Breite und Höhe.
Dann einfach nochmal probieren oder IPS die anzahl der bytes überprüfen lassen und wenn da was nicht passt dann nochmal senden.

Was ich noch nicht ausprobiert hab wie ich die BLH datei automatisch in bmp umwandle, aber den arbeitsschritt kann man ja noch von Hand machen. (oder hat jemand n Tip dazu?)

Vielleicht kanns ja jemand gebrauchen z.B. um den Zeichenbereich auszulesen und abzuspeichern.

Gruß Jannis

So bin endlich dazugekommen die Function mal zu überarbeiten(siehe erster Beitrag) da ÄÖÜ nicht richtig dargestellt wurden.

Gruß Jannis

P.S. Danke RWN hab die Lösung bei Deinem Newstickerbeitrag abgeschaut.

Hallo Jannis,

… sollte im Text oder in einer auszugebenden Zahl jedoch ein „,“ vorkommen, so wird Text abgeschnitten.

Ich habe das mit Deinen Funktionen so gelöst:

1.) die vokal-Funktion rufe ich extra auf (nicht gemeinsam mit edip), und wandle ein „,“ in das Zeichen \xFB um.

2.) in der edip-Funktion , eine Zeile vor der Ausgabe auf dem EDIP mache ich eine Rückumwandlung aller \xFB in „,“

Klappt perfekt :slight_smile:

Gruss NBA

Hallo NBA,

stehe gerade genau vor dem gleichem Kommaproblem.

Kannst du evtl. nochmal genau erläutern, wie du was geändert hast.
Evtl. ein Beispiel deiner Function?

Danke u. Gruß,
Doc

Hallo,

also ich mache das so:

1.) Janis ursprüngliche edip-Funktion ist an der markierten Stelle erweitert:


<?
// require("29316.ips.php"); //Edip-Funktion

function edip($input)

{
$input=split(",",$input); //$input in ein array umwandeln
$daten = chr(27);            //erstes Zeichen #
switch ($input[0])         // Sonderfälle für AT und ZL wenn man "nur" eine Zahl ausgeben möchte
{
case "AT":
$daten .= "AT";
for ($i=1;$i<7;$i++)
    {
            $daten .= chr($input[$i]);
    }
    $daten .= $input[7];

break;
case "ZL":
$daten .= "ZL".chr($input[1]).chr($input[2]).$input[3];

break;
Default:
for ($i=0;$i<count($input);$i++)
    {
    if (is_numeric($input[$i])) // überprüfen ob Text oder Zahl
        $daten .= chr($input[$i]);
    else
         $daten .= $input[$i];
    }
break;
}
$daten.=chr(0); // NUL hintenanfügen


//--- ## Änderung 24.10.2009 ---------------------------------
// Sonderzeichen durch Komma ersetzen
$daten = str_replace("\xFB", ",", $daten);  // Rückumwandlung FB in Komma ","
// -----------------------------------------------------------

//RegVar_SendText(40644 /*[edip]*/,$daten); //daten ans edip senden über xbee
COMPort_SendText(40644 /*[edip]*/,$daten); //daten an edip mit comport übertragen
}

?>

dann habe ich mir eine extra-Funktion zur Ausgabe von Texten gemacht:
An der Stelle „Komma in Sonderzeichen“ wandle ich das Komma in das Sonderzeichen um.


<?

// require("24170.ips.php"); //Texte umwandeln

function edip_texte($inputx)
{
// $inputx = str_replace('+', ' ',$inputx);
$inputx = str_replace("Ä","Ä",$inputx);
$inputx = str_replace("ä","ä",$inputx);
$inputx = str_replace("Ö","Ö",$inputx);
$inputx = str_replace("ö","ö",$inputx);
$inputx = str_replace("%F6","ö",$inputx);
$inputx = str_replace("%FC","ü",$inputx);
$inputx = str_replace("Ãœ","Ü",$inputx);
$inputx = str_replace("ü","ü",$inputx);
$inputx = str_replace("ß","ß",$inputx);
$inputx = str_replace("Ä", "\x8E", $inputx);
$inputx = str_replace("ä", "\x84", $inputx);
$inputx = str_replace("Ö", "\x99", $inputx);
$inputx = str_replace("ö", "\x94", $inputx);
$inputx = str_replace("ü", "\x81", $inputx);
$inputx = str_replace("Ü", "\x9A", $inputx);
$inputx = str_replace("ß", "\xE1", $inputx);
$inputx = str_replace(",", "\xFB", $inputx);   // Komma in Sonderzeichen

//mehrfache Leerzeichen raus
$inputx = str_replace("  ", " ", $inputx);
$inputx = str_replace("  ", " ", $inputx);
$inputx = str_replace("  ", " ", $inputx);
$inputx = str_replace("  ", " ", $inputx);

return $inputx;

}

?>

Die Anwendung erfolgt so:

require("29316.ips.php"); //Edip-Funktion
require("24170.ips.php"); //Texte umwandeln

$R=edip_texte("Äääh, es ist jetzt: 10,3 Grad heiß !!");
edip("ZL,20,80,$R") ;

Viel Spass
Gruss NBA

Hallo NBA,

danke für die schnelle Antwort, werde ich heute mal testen.

@Jannis
Ist es mit deiner Funktion auch so möglich, Bitmaps zum eDip hochzuladen (zur direkten Anzeige)?
Irgendwie kommt da bei mir nur Datenmüll an.
Hattest du das evtl. mal getestet?

Viele Grüße,
Doc