User Tools

Site Tools


de:doc:webui_tutorial

This is an old revision of the document!


WebUI

Moderne Webbrowser bieten fazinierende Möglichkeiten, dem Benutzer alle möglichen Arten der Darstellung anzubieten und ihn interaktiv Dinge verändern zu lassen. Es es gibt kaum etwas, was ein Browser mit HTML, Javascript und WebGL nicht irgendwie anzeigen könnte.

Anzeigen und verändern ist natürlich auch letztlich der Sinn und Zweck von OOBD, so dass der Gedanke nicht weit weg ist, dies auch für OOBD über eine Weboberfläche zu realisieren.

Diese Seite beschreibt, was der Webdesigner wissen muss, um seine Fantasien der Webdarstellung letztlich per OOBD mit dem Auto zu verbinden.

Zuerst einmal ist das alles viel einfacher als gedacht, denn OOBD und die oobd.js- Library kapseln alles das, was der Webdesigner nicht kennt. Wer schon mal mit CSS und javascript in Berührung kam, hat eigentlich schon gewonnen.

Das Prinzip

Zuerst einmal arbeiten die Website und OOBD selber asynchron, d.h. jeder schickt Daten, wann er lustig ist. Dies geschieht per Websocket, aber da braucht sich der Designer nicht drum zu kümmern, das passiert alles im Hintergrund über die oobd.js Library. Der Designer muß nur dafür sorgen, dass seine Elemente (Visualizer) eine Callback- Funktion haben, die ankommene Daten auswertet, also z.B. den reinkommenden Zahlenwert anzeigt, den Zeiger passend stellt oder die Farbe ändert, wie auch immer, und selbst das erledigt oobd.js für bekannte Visualizer- Typen selber.

Ein Schritt-für-Schritt Beispiel

Nehmen wir mal eine komplette Webseite und zerpflücken sie in ihre Bestandteile

<!DOCTYPE html>
 
<html lang="en">
 
<head>
	<meta charset="utf-8">
	<script type="text/javascript" src="../libs/oobd/1/oobd.js"></script>
 
</head>
 
<body>
 
<button onclick="Oobd.update()">Update</button><label><input type='checkbox' onclick='Oobd.timer(this.checked);'>Timer</label>
 
	<h3>Click on the circle to cycle its state<h3>
	<object class="OOBDMap" data="imagetest.svg" type="image/svg+xml"></object>
	<h3>Click on the arrow to turn it's angle<h3>
	<object class="OOBDMap" data="arrow.svg" type="image/svg+xml"></object>
	<h3>System Info:</h3>
 
	<table>
		<tr class="OOBD" oobd:type="te" oobd:fc="interface_serial:" oobd:value="A3-4711" oobd:click="yes" id="Serial_number">
			<td class="name">Serial</td>
			<td class="value">Click for Update</td>
		</tr>
		<tr class="OOBD" oobd:type="te" oobd:fc="interface_version:" oobd:value="CANINVADER" oobd:click="yes" id="interface_Version">
			<td class="name">BIOS</td>
			<td class="value">Click for Update</td>
		</tr>
		<tr class="OOBD" oobd:type="te" oobd:fc="interface_voltage:" oobd:value="14.0 Volt" oobd:click="yes" id="voltage">
			<td class="name">Voltage</td>
			<td class="value">Click for Update</td>
		</tr>
		<tr class="OOBD" oobd:type="te" oobd:fc="interface_bus:" oobd:value="CAN" oobd:click="yes" id="bustype">
			<td class="name">Bus</td>
			<td class="value">Click for Update</td>
		</tr>
		<tr class="OOBD" oobd:type="te" oobd:fc="greet:" oobd:click="yes" id="greetings">
			<td class="name">Bus</td>
			<td class="value">Click for Update</td>
		</tr>
	</table>
	<p>Outputs</p>
	<p />
	<textarea id="textoutput"></textarea>
 
 
 
	<script>
		// put here inits here as browser independent, pure javascript solution for document.ready
		(function() {
			// your page initialization code here
			// the DOM will be available here
			Oobd.writeString = function addText(text) {
				document.getElementById("textoutput").value += text;
			}
			Oobd.start();
		})();
	</script>
</body>
 
</html>

Am Anfang findet sich die Definition des Character-Sets. Dies ist wichtig, weil OOBD mit utf8 arbeitet, Javascript aber defaultmäßig mit utf16. Ohne diese Definition würden Sonderzeichen ziemlich komisch aussehen.

<!DOCTYPE html>
 
<html lang="en">
<head><meta charset="utf-8">

Hier laden wir die oobd.js dazu. Sie wird nach dem kompletten Laden automatisch aktiv und scannt das Document nach den Elementen, die es verwalten soll

<script type="text/javascript" src="../libs/oobd/1/oobd.js"></script>

Hier kommt was Anwendungsspezifisches: OOBD erzeugt ja Textausgaben. Wenn man diese sichtbar machen oder sonstwie nutzen möchte, weist man Oobd.writeString die Funktion zu, die aufgerufen werden soll, wenn ein Text eintrudelt.

In unserem Beispiel hier wird der Text dann an ein Textfeld der Seite angehängt.

<script type="text/javascript">
Oobd.writeString=function addText(text) {
    document.getElementById("textoutput").value += text;
}
</script>

Als besonderes Schmankerl kann oobd.js direkt in svg eingebettete grafische Elemente und javascript verwalten, d.h. man braucht am eigentlichen Seitenquelltext nichts ändern, sondern “schreibt” nur das Bild neu, wenn sich darin Elemente oder Funktionen ändern.

Das es sich um ein solches spezielles Bild handelt, erkennt oobd.js daran, dass das Object die Klasse “OOBDMap” hat.

<object class="OOBDMap" data="imagetest.svg" type="image/svg+xml"></object>

Hier nun ein Typ, den oobd.js selbstständig verwalten kann. Die grundsätzliche Identifizerung erfolgt über die Klasse “OOBD”, der Typ über das Attribut “oobd:type”, hier “te”. Weiterhin besitzt das Element zwei Unterelemente der Klassen “name” und “value”.

oobd.js erkennt das alles und macht selbstständig folgendes:

  • das ganze Element bekommt einen onclick()- Handler, der ausgelöst wird, sobald der User draufklickt. Dies wird über das Attribut oobd:click=“yes” ausgelöst
  • wenn ein neuer Wert für dieses Element ankommt, wird es der Eigenschaft “innerhtml” des “Value” Elements zugewiesen und so dann dargestellt
<tr class="OOBD" oobd:type="te" oobd:fc="greet:" id="greetings"><td class="name">Bus</td>         <td class="value">Click for Update</td></tr>

Und im Attribut “oobd:fc” (fc steht für Function Call) liegt auch schon das ganze Geheimnis: Dies ist der Name der Lua- Funktion im OOBD backbone, der dieses Element quasi zugeordnet ist. Wird das Element “betätigt”, wird die Lua Funktion aufgerufen, liefert die Funktion ein Erbebnis zurück, geht dies an dieses Element.

Und am Ende vom Code dann noch eben das text-Ausgabefeld.

<p>Outputs<p>
    <textarea id="textoutput"></textarea>

In SVG eingebettete Funktionen

SVG ist, vereinfacht ausgedrückt, auch bloß HTML, allerdings mit Bildelementen statt mit Texten und Tabellen. Aber auch hier gibt es einzelne Unterelemente, Ereignishandler und Javascript.

Nehmen wir mal das Beispielbild aus dem Git-Repository, hier allerdings etwas eingekürzt. Solche Bilder lassen sich prima erst mit Inkscape malen und dann mit einem Texteditor tunen

Hier der Kopf der Datei. Wichtig sind drei Stellen

  • der svg Tag bekommt einen onLoad()- Event
  • der zusätzliche Namespace xmlns:oobd=“http://www.oobd.org/namespaces/oobd” wird deklariert
  • das Bild bekommt mit <script type/… sein eigenes Javascript. Darin wird jedem Bild-Element der Klasse “oobd” die Funktion “oobdupdate” verpasst. Die wird dann später aufgerufen, wenn für das Element Daten ankommen.
<svg  onload="init(evt)"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   xmlns:oobd="http://www.oobd.org/namespaces/oobd"
   width="332.4375"
   height="426.71875"
   id="svg2"
   version="1.1"
   inkscape:version="0.48.4 r9939"
   sodipodi:docname="imagetest.svg">
 
<script type="text/ecmascript"><![CDATA[
function init(evt) {
	svgDocument = evt.target.ownerDocument;
	var svgItem = svgDocument.getElementsByClassName("oobd");
		for (i2 = 0; i2 < svgItem.length; ++i2) {
		svgItem[i2].oodbupdate= function(input){
			var value=atob(input.value);
			if (value=="i"){ // no anser from module, so ignored
				this.setAttribute("style", "fill:#75A3A3");
			} else if (value=="n"){ // no errors, so green
					this.setAttribute("style", "fill:#66FF33");
			} else if (value=="y"){ //  errors, so orange
				this.setAttribute("style", "fill:#FF9933");
			} else { // any kind of fatal error, so red
				this.setAttribute("style", "fill:#FF0000");
			}
		};
	}
}
 
 
]]></script>

Der Rest bei den jeweiligen grafischen Elementen innerhalb des Bildes ist dann sehr einfach, weil genauso wie schon den HTML-Elementen weiter oben

  • class=oobd ist die grundlegende Identifierung
  • oobd:type=ci (ci= clickable image) löst die Einrichtung des onclick()-Handlers usw. aus

oobd:click=“yes”

  • ''oobd:fc=“dtcStatus:125b11_741” beinhaltet die korrospondierende Lua funktion und hinter dem : zusätzliche Funktionsparameter
    <path
       ...
       oobd:type="ci"
       oobd:fc="dtcStatus:125b11_741"
       class="oobd" />

In SVG eingebettete Funktionen

In SVG eingebettete Funktionen

 
 
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
de/doc/webui_tutorial.1442406399.txt.gz · Last modified: 2015/09/16 14:26 by admin