kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Day by Day

(EN google-translate)

(PL google-translate)

Nachfolgend wird chronologisch verzeichnet, welche Inhalte in den Einzellehrveranstaltungen im Entwurf fehlertoleranter Software für eingebettete Echtzeitsysteme für den Master Maschinenbau im Wintersemester 2021/22 behandelt wurden.




#1 Dienstag 28.09.2021



Einführung: Welche Eigenschaften sollte ein engebettetes Echtzeitsystem haben?

  • autark: Bootet nach dem Einschalten ohne Benutzerinteraktion
  • robust: kontrolliert eigenen Systemzustand und versucht Probleme still zu lösen. Erst bei Versagen der Selbstreparatur erfolgt eine Rückmeldung an den Nutzer
  • einfach: Das System ist einfach zu benutzen und vermittelt intuitiv, wie das geschehen kann
  • zeitlich korrekt: genügt dem Anspruch zeitlicher Korrektheit
  • nicht terminierend: kann dauerhaft laufen. Es tritt insbesondere kein Speicherüberlauf auf. Basiskonzept: setup() loop()
  • Wartungsschnittstelle: liefert bei Wunsch dem versierten Anwender Informationen über seinen inneren Zustand
  • Kausalität: eindeutiger kausaler Zusammenhang zwischen Verhalten und der Kombination aus innerem Zustand und äußerer Situation (Sensorinput)
Echtzeit im Sinne von "schnell": 67_Echtzeitsysteme/01_Einfuehrung/01_Echtzeit
Echtzeit im Sinne von "zeitlich korrekt": 67_Echtzeitsysteme/01_Einfuehrung/02_Korrektheit #aeint 67_Echtzeitsysteme/01_Einfuehrung/03_Hardware 67_Echtzeitsysteme/01_Einfuehrung/03_Hardware Hardware-Plattformen: 67_Echtzeitsysteme/01_Einfuehrung/03_Hardware
State-machine / Zustandsmmaschine: 67_Echtzeitsysteme/12_Zustandsmaschine

Einführung: Was sind Voraussetzungen für die effiziente Entwicklung engebetteter Echtzeitsysteme?

  • Bereitstellung modularisierter Teilfunktionen, die beliebig kombinierbar sind, ohne sich gegenseitig zu stören
  • Ein tragfähiges Konzept für das Scheduling der einzelnen Tasks (beispielsweise durch ein Echtzeitbetriebssystem, oder Threads)
  • Übersichtlicher Aufbau der Software-Architektur, beispielsweise durch einen objektorientierten Ansatz
Java Threads: 67_Echtzeitsysteme/02_Threads

Beispiele eingebetteter Echtzeitsysteme (Prototypen / Funktionsstudien aus vergangenen Lehrveranstaltungen)

15_Einachser -- Einachser auf kramann.info
Elektrokutsche, Personenkutschfahrt auf kramann.info
Physikalische Echtzeitsimulation einer mechanischen Rassel mit einem Smartphone
Vernetztes Smartphone zur Steuerung einer Elektromechanischen melodischen Trommel
KIBA (Kamerasystem segmentiert Spielchips auf Leuchttisch, absolute Positionen werden als Tonereignis in einer zyklischen Phrase interpretiert)
Lichtharfe: Handpositionen der Benutzer erzeugen Klangereignisse
Masken: elektronische Skulpturen
mechatronical_mantra.mp4

Beispiele eingebetteter Echtzeitsysteme (Professionelle Produkte)

  • Alle regelungstechnischen Systeme mit Mikroprozessor-basierten elektronischen Komponenten
  • Alle autonomen KI-Systeme
  • Alle Haushaltsgeräte mit Mikroprozessor-basierten elektronischen Komponenten
Grey Walter's tortoises (historisch)
"Rocket Lab"



Teil 1: Überblick zum Ablauf des Kurses

  1. Theorievermittlung in der ersten Semesterhälfte: Java-Programmierung, Fehlertoleranter Software-Entwurf, Begriff der Lebenswelt
  2. Umsetzung eines eigenen Software-Projektes in der zweiten Semesterhälfte in Zweiergruppen für ein Android-Device

Teil 2: Einblick in die drei Bereiche: Begriff der Lebenswelt, Fehlertoleranter Software-Entwurf, Java-Programmierung

kramann.info/kaleidophone

Teil 3: Entwicklung einer Wasserwaage auf der Grundlage eines Android-Devices

processing.org -- Bitte laden Sie sich die Java-Entwicklungsumgebung Processing herunter und installieren se
  • Bitte laden Sie sich die Java-Entwicklungsumgebung Processing herunter und installieren diese.
  • Führen Sie das ebenso für Android-Processing durch.



#1 Dienstag 05.10.2021


TEIL 1: Theorie -- Einführung in die Software-Muster für fehlertoleranten Software-Entwurf

81_FTSD (Einführendes Beispiel)
81_FTSD/05_Fehlertoleranz (Übersicht der Muster)
81_FTSD/06_Seriell_Audio/06_Fehlertoleranz (Hinweise zu einer sauberen Codierung)

TEIL 2: Praxis -- Gemeinsame Umsetzung einer Android-App, die als Wasserwaage funktioniert



FRAGEN
  • Was ist Komplexität?
  • Warum sind komplexe Systeme anfällig für Fehler?
  • Wie kann die Komplexität eines Systems verringert werden?

78_Processing (Einführung in Processing))
93_Android_Proc (Einführung zu Android-Processing)

Im Verlauf der LV entstandene Software

Wasserwaage001.zip
Wasserwaage002.zip
Wasserwaage003.zip
Wasserwaage004k.zip
Wasserwaage005k.zip (bitte auf Ihr Android Device übertragen)



#3 Dienstag 12.10.2021


TEIL 1: Theorie -- Fortsetzung zur Einführung in die Software-Muster für fehlertoleranten Software-Entwurf

81_FTSD (Einführendes Beispiel)
81_FTSD/05_Fehlertoleranz (Übersicht der Muster)
81_FTSD/06_Seriell_Audio/06_Fehlertoleranz (Hinweise zu einer sauberen Codierung)

  1. Wiederholung wichtiger Begriffe: fault, error, failure | logische und zeitliche Korrektheit | Mitigation
  2. Übersicht der Muster zur fehlertoleranten Softwareentwicklung
  3. Behandlung von Mitigation, Redundancy und Recovery Block

TEIL 2: Praxis -- Fortsetzung der Einführung in Android Processing -- Erste Gehversuche ;-)

Übung
Aufgabe 1 -- Verwendung von Sensoren

Nehmen Sie sich aus der Ketai-Library die Beispiele Accelerometer und MultipleSensors vor, um zu ergründen, wie Sensordaten verschiedener Art benutzt werden können.


Achtung: Bei der Verwendung des Mikrofons, der Kamera oder Internet-Funktionalität muß bei Android->Sketch Permissions erst für die App erlaubt werden.


Prüfen Sie nach, welche Sensoren Ihr Device zur Verfügung hat.

Sprechen Sie mindestens zwei andere, als die in den Beispielen an und überprüfen die dann hereinkommenden Daten.

Aufgabe 2 -- Datenaustausch über WiFi
  • Installieren Sie die Library oscP5.
  • Analysieren und testen Sie die Beispiele oscP5message und oscP5parsing.
  • Wählen Sie sich mit Ihrem Laptop und Ihrem Android-Gerät in einem bereit gestellten WiFi-Router an.
  • Modifizieren Sie die beiden Beispiele So, dass die beiden Geräte in diesem Netz abwechselnd zu Sender und Empfänger werden.
  • Entwickeln Sie die Wasserwaage aus der vorangehenden LV so weiter, dass die Daten und später auch die Luftblase auch am Laptop so zu sehen ist, wie im Android-Device, indem die Daten vom Android-Gerät an den Laptop gesendet werden.
WLAN_Wasserwaage.zip -- studentische Lösung
Audgabe 3 -- Android VR

Es gibt eine besondere Library um Android-Smartphones unter Verwendung einer entsprechenden Optik als VR-Brillen einsetzen zu können.

Insbesondere wird dort Headtracking auf einfache Weise bereit gestellt.

Eine Einführung und einige einführende Beispiele finden sich hier:

https://android.processing.org/tutorials/vr_intro/index.html

Um Ihre Möglichkeiten für Ihr Projekt etwas aufzuweiten, sollten Sie den Zusatz-Mode VR mit diesen Beispielen einmal ausprobieren und im Idealfall etwas variieren.

Objektorientierte Programmierung

  • Wie schreibt man selber eine Klasse in Processing
  • Methoden, Attribute und ihre Modifikatoren
  • Vererbung und Interfaces


#4 Dienstag 19.10.2021

Teil 1: Besprechung der Pattern Mitigation, Redundancy und Recovery-Block

Teil 2: Brainstorming und Sammlung möglicher Projektthemen und dabei denkbarer fehlertoleranter Programmstrukturen

Teil 3: Vertiefung der Programmierkenntnisse mit Processing und Processing-Android anhand von Beispiel-Snippets

Übung 1 Bilder anzeigen

Folgender Sketch zeigt, wie Bilder geladen und angezeigt werden können:

92_Soundinstallation/03_material/11_Snippets/01_Images_with_Processing
  • Testen Sie das Programm sowohl am PC, als auch mit einem Android-Gerät.
  • Suchen Sie die Methoden loadStrings() und saveStrings() aus der Referenz heraus.
  • Statt eines Bildes soll nun die Hintergrundfarbe des Fensters als Parameterliste in einer Datei abgelegt werden und beim Start des Programms automatisch geladen und benutzt werden.

Hinweise:


//Laden einer Datei in ein Array, das die Zeilen der Datei dann enthält:
String[] werte = loadStrings("meinedatei.txt");

//Umwandeln eines Strings in eine Zahl:
double zahl = Double.parseDouble("56.5");
int z = (int)Double.parseDouble("56.5");


Code 0-1: Hinweise

Übung 2 Call-Back-Methoden

Folgender erster Sketch definiert einen quadratischen Bereich als Button.

92_Soundinstallation/03_material/11_Snippets/10_Interaction
  • Analysieren Sie das Programm
  • Programmieren Sie möglichst effizient eine Anwendung, bei der es 8 mal 8 gleich grosse Felder gibt, die den ganzen Bildschirm ausfüllen und jeweils beim Anklicken ihre Farbe ändern sollen.
Übung 3 Vernetzung / UDP

UDP ist ein gegenüber TCP/IP wesentlich schlankeres Internet-Protokoll und eignet sich gut für Streaming, aber auch dazu, Daten zwischen Geräten auszutauschen.

Installieren Sie die UDP-Library und testen das Library-Beispiel mit dem Namen "udp".

Versuchen Sie das Programm auf zwei Devices so zu verteilen, dass zuerst das eine Sender und das andere Empfänger ist und schließlich, dass sich beide Geräte wechselseitig Nachrichten schicken können.

Verwenden Sie als Zielplattformen einen PC und ein Android-Gerät.

Anstatt keyPressed() können Sie auf der Android-Seite mousePressed() verwenden und einen Wechsel der gesendeten Nachrichten mit Hilfe eine Zähler bewerkstelligen.

Übung 4 Modularisierung

Die folgende komplexe Anwendung ermöglicht den Datenaustausch diverser Geräte untereinander. Insbesondere wurde eine Klasse "Briefkasten" implementiert, die es dem Anwendungsprogrammierer ein wenig erleichtern soll, Geräte miteinander zu vernetzen.

92_Soundinstallation/03_material/11_Snippets/11_UDP
  • Analysieren und testen Sie das Processing- und das Arduino-Programm.
  • Schreiben Sie ein Android-Programm, das sich genau so verhält, wie das Arduino-Programm und auch die gleichen Klassen besitzt.
  • Ersetzen Sie das Arduino-basierte Gerät durch ein Android-Gerät. Statt eine LED zu schalten soll die Hintergrundfarbe sich ändern.

Teil 4: Interfaces in Java als mögliche Methode zur Trennung zwischen Fähigkeiten und Implementierung und als Grundlage für Recovery-Blocks

Bei Recovery-Blocks kann es Sinn machen mehrere Entwicklerteams möglichst unabhängig voneinander mit der Implementierung der gleichen Programmmodule zu beauftragen.

Damit die Module auch untereinander ausgetauscht werden können, wäre ein praktischer Ansatz, Interfaces für die geforderte Funtionalität zu vereinbaren.

Dies soll hier an einem konkreten Beispiel durchgespielt werden.

Screenshot einer Warnapp, die reagiert, wenn mit der Maus die verbotene Zone betreten wird.

Bild 0-1: Screenshot einer Warnapp, die reagiert, wenn mit der Maus die verbotene Zone betreten wird.

Vorarbeit -- das Rahmenprogramm zur Erfassung der Aufenthaltsdauer in der verbotenen Zone
Vorarbeit -- Verwendung eines Interfaces, um zwei Varianten der Warnung implementieren zu können, die untereinander leicht austauschbar sind.
Vorarbeit -- 3. Implementierung mit Warnton ergänzt.
Aufgaben
  • Ergänzen Sie eine weitere Warn-Implementierung und fügen Sie diese auch so ein, dass sie berücksichtigt wird.
  • Übertragen Sie das Ganze so auf ein Android-Gerät, dass statt der verbodenen Zone, geprüft wird, ob es gerade gehalten wird. Stellen Sie sich vor, es sei ein Tablett, von dem Sachen rutschen würden, wenn man es länger schief hält.

Warnapp4_pde.zip -- Beispielhafte studentische Lösung, bei der die Zusatzwarnung durch Vibration bei einem Android-Gerät erfolgt (Processing-Android).

Nachfolgend finden Sie ergänzende Beispiele zur Verwendung von Interfaces (Schnittstellen) in Java:

73_COACH3/09_Algorithmen -- Verständnis entwickeln anhand der Konzepte "Integrator" und "Modell" bei einem Simulationssystem
30_Informatik3/15_Rasterlayout/02_interfaces -- komplexes Beispiel
30_Informatik3/07_Modifikatoren -- ergänzende Hinweise zu Modifikatioren
HAUSAUFGABE: Lesen Sie zu den Pattern Minimize Human Intervention, Maximize Human Participation, Escalation


#5 Dienstag 26.10.2021

Heute die LV läuft hybrid. Dies ist aber in Zukunft nicht möglich, weil ich Einblick in den Fortgang Ihrer Projektarbeiten erhalten muß, um Ihre Leistung in diesem Fach bewerten zu können.


Zudem sollten Sie sich bitte mit Headset anmelden, um aktiv teilnehmen zu können.




Teil 1: Ergänzende Basics zu Java

30_Informatik3/09_Java -- Vergleich zwischen Java und C++
30_Informatik3/09_Java/02_GettingStarted -- Elementare Datentypen in Java und main-Methode.

Teil 2: Weitere Beispiele zur Verwendung von Sensoren mit Android-Geräten

Demonstrationen zur Verwendung von

  • Kamera
  • Mikrofon
  • Headtracking (Sensor Fusion)

Verwendung von Headtracking mit Hilfe von Android-Processing-VR:

94_VSI/01_Snippets

weitere interessante Möglichkeiten:

  • Bild oder Kamerabild als Pixel-Array laden.
  • Text-to-Speech (TTS)
  • Erzeugen von Sound
CameraGettingStarted2.zip
CameraGettingStarted3.zip
if (cam!=null && cam.isStarted()) 
{
    cam.read();
    cam.updatePixels();
    cam.loadPixels();
    int[] newpix = cam.pixels;
    if(newpix!=null)
       for(int i=0;i<newpix.length;i++)
        pix[i] = newpix[i];
...
}

Code 0-2: pixels aus Kamerabild -- Siehe beispielsweise in die Klasse CamAndroid der Library ComposingForEveryone

    public void step()
    {
        int count = 0;
        for(int i=0;i<pix.length;i++)
        {
                int c = pixsource[i];
                int RED   = c >> 16 & 0xFF;
                int GREEN = c >> 8 & 0xFF;
                int BLUE  = c & 0xFF;
                
                int REDCOMP = 2*RED - GREEN - BLUE;                                
                int GREENCOMP = 2*GREEN - RED - BLUE;                                
                int BLUECOMP = 2*BLUE - RED - GREEN;                                
                int YELLOWCOMP = RED+GREEN - 2*BLUE;                
                
                int RC = REDCOMP;
                int GC = GREENCOMP;
                int BC = BLUECOMP;
                
                if(RC<0) RC=0;
                if(RC>255) RC=255;
                if(GC<0) GC=0;
                if(GC>255) GC=255;
                if(BC<0) BC=0;
                if(BC>255) BC=255;
                
                int GREYCOMP = (RC+GC+BC)/3;                                
                
                if(GREYCOMP<threshold)     
                {
                    pix[i]=0;
                    
                    count++;
                }
                else
                {
                    if(YELLOWCOMP>BLUECOMP+YOFF && YELLOWCOMP>GREENCOMP+YOFF && YELLOWCOMP>REDCOMP+YOFF)
                    {
                        pix[i] = 4;
                    }    
                    else if(BLUECOMP>YELLOWCOMP+BOFF && BLUECOMP>GREENCOMP+BOFF && BLUECOMP>REDCOMP+BOFF)
                    {
                        pix[i] = 3;
                    }    
                    else if(GREENCOMP>YELLOWCOMP+GOFF && GREENCOMP>BLUECOMP+GOFF && GREENCOMP>REDCOMP+GOFF)
                    {
                        pix[i] = 2;
                    }    
                    else if(REDCOMP>YELLOWCOMP+ROFF && REDCOMP>BLUECOMP+ROFF && REDCOMP>GREENCOMP+ROFF)
                    {
                        pix[i] = 1;
                    }    
                    else
                    {
                        pix[i] = 0;
                        count++;
                    }
                }
        }
        if(successor!=null)
            successor.step();           
    }

Code 0-3: pixel in Farbanteile umwandeln -- Siehe beispielsweise in die Klasse RGBY der Library ComposingForEveryone

94_VSI/03_TTS -- TTS, einführendes Beispiel.
94_VSI/06_Erweitern/01_sprich
92_Soundinstallation/03_material/11_Snippets/05_VR_Playing_Sound/01_Soundsource_Android -- Erzeugen eines Sinustones.


Teil 3: Neben Schnittstellen stellen Exceptions ein weiteres Sprachelement von Java dar, das wir zur Implementierung fehlertoleranter Pattern nutzen wollen

  • Schnittstellen wurden als adäquates Mittel identifiziert, Eigenschaften von Modulen verbindlich festlegen zu können, so, dass beispielsweise mehrere Teams unabhängig an alternativen Implementierungen der gleichen Funktionalität arbeiten können.
  • Exceptions nun ermöglichen die Handhabung von Code-Teilen, von denen von vorne herein klar ist, dass diese bei der Ausführung mit einem ERROR enden könnten.
//Selber Exceptions schreiben:

public class LeereDateiException extends RuntimeException
{
     public LeereDateiException() 
     {
          super("Datei ist leer!");
     }     
}
String[] data;
public void laden() throws LeereDateiException
{
     data = loadStrings("test.txt");
     if(data==null || data.length==0)
        throw new LeereDateiException();
}

public void setup()
{
  try
  {
       laden();
  }
  catch(Exception e)
  {
    println(e.toString());
  }
  
}

Code 0-4: Kleines Beispiel

Übung NEU
  • Schreiben Sie eine Anwendung mit einer MausZuWeitLinksException
  • Immer, wenn die Maus zu weit links ist (über die Hälfte der Bildschirmbreite), soll diese selbst geschriebene Exception ausgeworfen werden.
  • Ist das der Fall, färbt sich der Bildschirmhintergrund ROT.
//Selber Exceptions schreiben:
int i=0;
public class zuweitLinks extends RuntimeException
{
    public zuweitLinks()
    {
        super("Maus zu weit links!");
    }
}
String[] data;
public void laden() throws zuweitLinks
{
    line(mouseX, 20, mouseX, 80);
    if(mouseX<width/2)
         throw new zuweitLinks();
}

public void setup()
{
    size(1000,1000);
}
int ROT = 0;
public void draw()
{
    ROT = 0;
    try
    {
        laden();
    }
    catch(Exception e)
    {
       i++;
       println(e.toString());
       println(i);
       ROT = 255;
    }
    background(ROT, 30, 30);
}

Code 0-5: Studentische Lösung.


S001 Someone in Charge -> Verantwortlicher bekommt eine Meldung per Exception 
                          und kümmert sich um den Fehler z.B.
                          "schiebt Maus in richtige Position"

S002 Minimize human interaction -> Möglich: Fehler wird durch Maschine behoben,
                                   statt durch Menschen, wenn Exception auftritt.

S003 Escalation -> if  else if  else if else -Struktur oder 
                   ineinander geschachtelte Exceptions

S004 Recovery-Blocks -> Exception... um Modul zu testen und zu reagieren,
                        also hier ein alternatives Modul zu verwenden.
                        Schnittstellen, um die Module zusammenzufassen 

S005 Software-Update -> 1. Mögl.: Redundanz, ein System herunterfahren und Code
                           austauschen.
                        2. Skriptsprache verwenden, hier Code-Tausch
                           on-the-fly möglich.
                        3. Klassen in Java austauschen und von der virtual Machine
                           neu laden lassen.

S006 Fault Observer -> Fehler erkennen und weiterleiten, Exception wichtiges Element dafür
                       Konzept-Beispiel: Berichterstatter-Klasse, von der alle
                       Exception-Klassen erben.

S007 Maximize human participation -> Informationen zum Systemzusatnd auf Bildschirm
                                     beispielsweise

S008 Correcting Audits -> static   .. 
                        / dynamic  ..


Code 0-6: Anwendbarkeit von Exception oder Schnittstellen zur Implementierung der Pattern.

Übung

Nennen Sie Anwendungsbeispiele, in denen Software-Teile vorstellbar sind, die nicht immer fehlerfrei ablaufen, aber dies auch nicht durch besseren Code behoben werden kann.

Hier folgen Verweise auf vorhandene Darstellungen zu Exceptions:

81_FTSD/07_Processing/01_Exceptions -- vordefinierte selbst geschriebene Exceptions
67_Echtzeitsysteme/09_Internetprogrammierung/04_Java -- Einsatz von Exceptions im Bereich Internet-Programmierung
77_Android/11_Tonerkennung/03_Java_Threads -- Thread.sleep(...) als Beispiel einer Methode im Bereich Threadding, die eine Exception auswirft.
Saalübung: Steuerung der Warnmodule mit Hilfe selbst geschriebener Exceptions
Warnapp5_TimeoutException.zip -- beispielhafte Lösung.

Teil 5: Durchgang durch alle Entwurfspattern zu fehlertolerantem Software-Entwurf

In diesem Teil stellen die Studierenden die einzelnen Pattern für ihre Mitstudierenden dar. Vorab wurde vereinbart, wer für welches Pattern verantwortlich ist.

Diskutieren Sie für welche Fehlertoleranz-Pattern try-catch-Blöcke eine gute Grundlage bilden könnten.

Teil 6: Wie lassen sich die Fehlertoleranz-Pattern praktisch mit Android (Java)-Processing umsetzen?

  • Beispiele mit Code-Skizzen zu jedem einzelnen Pattern.
  • Soll im Verlauf der nächsten Unterrichtseinheiten vervollständigt werden.



#6 Dienstag 02.11.2021



Teil 1: Ergänzung zu Java: Threads

Verwendung nebenläufiger Prozesse, welche Typen es gibt und was bei ihrer Verwendung beachtet werden sollte.

77_Android/11_Tonerkennung/03_Java_Threads -- Methoden der Klasse Thread.
77_Android/04_Threads -- Threads mit Hilfe der Schnittstelle Runnable erstellen
67_Echtzeitsysteme/02_Threads/02_Synchronisierung -- Bedeutung des Modifikators synchronized
92_Soundinstallation/03_material/11_Snippets/05_VR_Playing_Sound/01_Soundsource_Android -- Echtzeit-Thread mit ScheduledExecutorService
94_VSI/05_OSC/02_i2audiolab -- weiteres Beispiel zu Echtzeit-Thread, siehe Klasse Performance in Code 0-3.

Teil 2: Übung -- Wie lassen sich die Fehlertoleranz-Pattern praktisch mit Android (Java)-Processing umsetzen?

Beispiele mit Code-Skizzen zu jedem einzelnen Pattern als Übung:

  • Diskutieren Sie in Zweiergruppen die Möglichkeit, ein einfaches Java-Beispiel zu schreiben, das die beiden Fehlertoleranz-Pattern umsetzt, die Sie übernommen haben.
  • Helfen Sie sich gegenseitig dabei.
  • Überlegen Sie auch, ob Ihnen konkrete Beispiele aus der Praxis einfallen, in denen diese Pattern umgesetzt wurden.
  • Präsentieren Sie Ihr Beispiel den anderen Studierenden.

Thread003.zip -- 1. Beispiel zu Thread mit Vererbung
Thread004_Runnable.zip -- 2. Beispiel mit Schnittstelle Runnable
Thread005_Echtzeit.zip -- 3. Beispiel Echtzeitprozess
Thread006_sync.zip -- 4. Beispiel: Vermeiden eines verschränkten Aufrufs einer Methode mit synchronized


#7 Dienstag 09.11.2021

Um weiter in die Praxis zu kommen, werden wir die konkrete Umsetzung der Fault-tolerant Pattern an kleinen Beispielen fortsetzen. Doch zuvor soll ein Anwendungsfall auf Fehlertoleranz-Möglichkeiten hin untersucht werden:

Während in diesem Jahr die Wahl eines Systems, das umgesetzt wird bei den Studierenden liegt, wurde in den vergangenen Jahren verlangt, dass Fehlertoleranz-Pattern in einem Sprachsynthesizer für eine in ihrer Bewegung beeinträchtigte Person entwickelt werden sollte.

Teil 1: Fehlertoleranz für bei einem Sprachsynthesizer für eine in ihren Bewegungen beeinträchtigte Person

Für eine Person mit spastischen Lähmungen, die nur ihren Kopf kontrolliert bewegen kann, soll ein Sprachsynthesizer entwickelt werden. Der soll durch Kopfbewegungen gesteuert werden: Die Person schaut mittels einer 3D-Brille (Halterung für eingesetztes Smartphone) auf eine Tafel mit Buchstaben. Das längere Anblicken eines Buchstaben, wählt diesen aus.

Sprachsynth002.zip
Sprachsynth004.zip
94_VSI/03_TTS -- einfache Version eines Android-Smartphone basierten, Kopf gesteuerten Sprachsynthesizers
94_VSI/09_Hybrid/05_Uebung -- etwas elaboriertere Version, bei der durch Blick nach rechts abgerufene Buchstaben als Wort ausgesprochen werden, aber mit Blick nach rechts die gemerkten Buchstaben wieder vergessen werden.

Ergänzende Hinweise:

https://android.processing.org/tutorials/vr_intro/index.html -- Hinweise zu Android-Processing-VR auf processing.org
https://android.processing.org/tutorials/vr_advanced/index.html -- Hinweise zu Android-Processing-VR auf processing.org "advanced"
94_VSI/06_Erweitern/01_sprich -- vereinfachte Benutzung von Text-to-Speech (TTS) durch Entwicklung einer Klasse mit der Methode "sprich(...)".
94_VSI/01_Snippets -- einführende Beispiele zu Headtracking und Android-VR
Teil 1B: Übung

Stellen Sie sich die Lebensumstände einer Person vor, die nur ihren Kopf kontrolliert bewegen kann und identifizieren Sie vor diesem Hintergrund sinnvolle Fehlertoleranz-Features für den Sprachsynthesizer. Die Ideen werden im großen Kreis diskutiert.

Teil 2: Übung 2 -- Entwicklung kleiner Beispiele zu jedem Fehlertoleranz-Pattern

Fortsetzung der Umsetzung konkreter Beispiele für Fehlertoleranz.

Wichtig: Bei der Erfindung von Anwendungsbeispielen ist es wichtig, sich in eine lebensnahe Situation zu versetzen und sich die Möglichkeiten zu vergegenwärtigen, die Smartphones mit all ihren Sensopren und ihrer Vernetzungsmöglichkeit bieten. Zur Demonstration kann eine vereinfachte Version implementiert werden, die auch auf einem PC läuft.

81_FTSD/01_Fehlertoleranz -- hier noch einmal die Übersicht der Fehlertoleranz-Muster
81_FTSD/05_Fehlertoleranz -- Variante
Im Unterricht entstandene Programme:
MultipleSensors2_licht.zip -- Smartphone als Umgebungslicht-empfindliche Lampe
MultipleSensors3_licht.zip -- ... mit Fehlertoleranz-Verhalten: TTS / unwirksame Lampe, weil umgedreht


#7 Dienstag 16.11.2021


Prolog: Fehlertoleranz im All, siehe Moodle

Themen:

  1. Datenübertragung per W-LAN / Maintenance-Interface / Someone in Charge ...
  2. Ideenfindung: Exkurs in die Phänomenologie als Vorbereitung der Ideenfindung für Projektthemen

Thema 1: Datenübertragung per W-LAN / Maintenance-Interface / Someone in Charge ...



Neue Technik: Hotspot auf Android-Gerät einrichten, PC dort anmelden, PC und Android-Gerät benutzen beide die Broadcast-Adresse.


Vorteile dieses Vorgehens:

  • Kein W-LAN Router notwendig
  • Android-Gerät selbst muß sich nicht extra anmelden
  • Keine Anpassung der IP-Adresse nötig bei Beteiligung weiterer Geräte. Auswahl des Zielgerätes kann über Namen des gesendeten Befehls erfolgen.
Screenshot zur Aktivierung des W-LAN-Hotspots (keine Internetverbindung nötig, d.h. W-LAN selbst darf aus sein!)

Bild 0-2: Screenshot zur Aktivierung des W-LAN-Hotspots (keine Internetverbindung nötig, d.h. W-LAN selbst darf aus sein!)


Ein wichtiges Thema in der derzeitigen technischen Entwicklung ist IoT, also "Internet of Things".

Gebrauchsgegenständen werden neue Fähigkeiten verliehen, wenn sie in ein Funknetzwerk eingebunden und über dieses überwacht und gesteuert werden können. Besonders wichtig ist dabei, dass diese Einbindung einfach erfolgt und keiner großen Anstrengungen von Seiten des Benutzers bedarf.

Beispiel: Leuchtmittel mit integriertem W-LAN. Hier einige Anbieterseiten dazu:

https://www.wizconnected.com/de-DE/verbraucher/technologie/
https://www.highlight-web.de/3464/praktisch-led-lampe-mit-wlan-repeater/
https://de.sengled.com/de/produkte/connectivity/boost/index.html

Dabei scheinen folgende Funktionserweiterung der Leuchtmittel auf:

  1. Steuerung über Bewegungsmelder
  2. Steuerung über Sprache
  3. Wecken durch Licht
  4. Automatische Zeitsteuerung
  5. Lichtstimmungen einstellen
  6. Alarm
  7. W-LAN-Repeater
Projekt: Winkel der Smartphone-Drehung am PC visualisieren / Helligkeitsregelung ferngesteuert

In einem minimalistischen Projekt, soll einerseits der Winkel um eine der möglichen Achsen, um die ein Smartphone gedreht am PC angezeigt werden. Zum zweiten soll vom PC aus mit der Maus die Helligkeit des Bildschirmhintergrundes beim Smartphone eingestellt werden können. Das Beispielprojekt fasst verschiedene Features noch einmal zusammen, die Smartphones bieten und soll als Anregung für eigene Projektideen dienen.

Wie bereits zuvor erfolgt die Umsetzung in mehreren aufeinander aufbauenden Stufen.

Stufe 1: Helligkeit einstellen

Für den Datenaustausch über W-LAN dienen die Beispiele oscP5massage und oscP5parsing aus der Processing-Library oscP5. Diese funktioniert auf dem PC und auf dem Smartphone gleichermaßen.


ACHTUNG: Vergessen Sie nicht bei dem Sketch für das Smartphone "INTERNET" bei den Sketch-Permissions zu aktivieren!


Sketch-Permission INTERNET.

Bild 0-3: Sketch-Permission INTERNET.

IOT001pc.zip
//PC seitig
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int hell=0;
int hellandroid=0;
public void setup()
{
  size(400,400);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,12000);
  
  /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
   * an ip address and a port number. myRemoteLocation is used as parameter in
   * oscP5.send() when sending osc packets to another computer, device, 
   * application. usage see below. for testing purposes the listening port
   * and the port of the remote location address are the same, hence you will
   * send messages back to this sketch.
   */  
  myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots!
  
}

public void draw()
{
     fill(hell);
     noStroke();
     rect(0,0,width/2,height);
     fill(hellandroid);
     noStroke();
     rect(width/2,0,width/2,height);
     
     fill(255,0,0);
     stroke(255,0,0);
     strokeWeight(height/150);
     line(width/2,0,width/2,height);
     textSize(32);
     text("PC",50,50);
     text("ANDROID",width/2+50,50);
}


public void mouseDragged()
{
      hell = (int)(255.0*mouseY/height);
      OscMessage myMessage = new OscMessage("/hellpc");  
      myMessage.add(hell); /* add an int to the osc message */
      oscP5.send(myMessage, myRemoteLocation);       
}

/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) 
{
  /* print the address pattern and the typetag of the received OscMessage */
  print("### received an osc message.");
  print(" addrpattern: "+theOscMessage.addrPattern());
  println(" typetag: "+theOscMessage.typetag());
  if(theOscMessage.checkAddrPattern("/hellandroid")==true) 
  {
       hellandroid = theOscMessage.get(0).intValue();
  }
}

Code 0-7: IOT001pc -- PC-seitiges Programm. Sendet Helligkeitswert an Broadcast-Adresse unter dem Namen "hellpc" und empfängt als Rückmeldung "hellandroid".

IOT001android.zip
//ANDROID seitig
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int hell=0;
int hellalt=0;
public void setup()
{
  fullScreen();
  orientation(LANDSCAPE);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,12000);
  
  /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
   * an ip address and a port number. myRemoteLocation is used as parameter in
   * oscP5.send() when sending osc packets to another computer, device, 
   * application. usage see below. for testing purposes the listening port
   * and the port of the remote location address are the same, hence you will
   * send messages back to this sketch.
   */  
  myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots!
  
}

public void draw()
{
     fill(hell);
     noStroke();
     rect(0,0,width/2,height);
     
     if(hell!=hellalt)
     {
          //testweise Wert zurück senden
          hellalt = hell;
          OscMessage myMessage = new OscMessage("/hellandroid");  
          myMessage.add(hell); /* add an int to the osc message */
          oscP5.send(myMessage, myRemoteLocation);       
          
     }
}



/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) 
{
  /* print the address pattern and the typetag of the received OscMessage */
  print("### received an osc message ANDROID.");
  print(" addrpattern ANDROID: "+theOscMessage.addrPattern());
  println(" typetag ANDROID: "+theOscMessage.typetag());
  if(theOscMessage.checkAddrPattern("/hellpc")==true) 
  {
       hell = theOscMessage.get(0).intValue();
  }
}

Code 0-8: IOT001android -- Android-seitiges Programm. Empfängt "hellpc" und sendet "hellandroid" zur Kontrolle zurück.

Projekt zweiter Teil: Erweiterung des vorangehenden Programms um die Übertragung eines Winkels

Nun weiß man bereits, dass die bidirektionale Datenübertragung funktioniert und kann sich auf Anderes konzentrieren.

Die neuen Programmteile lehnen sich an dem beispiel "Accelerometer" aus der Ketai-Library an.

Screenshot der Programmerweiterung PC-seitig.

Bild 0-4: Screenshot der Programmerweiterung PC-seitig.

//PC seitig
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int hell=0;
int hellandroid=0;
float phi;
public void setup()
{
  size(400,400);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,12000);
  
  /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
   * an ip address and a port number. myRemoteLocation is used as parameter in
   * oscP5.send() when sending osc packets to another computer, device, 
   * application. usage see below. for testing purposes the listening port
   * and the port of the remote location address are the same, hence you will
   * send messages back to this sketch.
   */  
  myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots!
    
}

public void draw()
{
     fill(hell);
     noStroke();
     rect(0,0,width/2,height);
     fill(hellandroid);
     noStroke();
     rect(width/2,0,width/2,height);
     
     fill(255,0,0);
     stroke(255,0,0);
     strokeWeight(height/150);
     line(width/2,0,width/2,height);
     textSize(32);
     text("PC",50,50);
     text("ANDROID",width/2+50,50);
     text("phi="+(180.0*phi/PI),width/2+10,150);
}


public void mouseDragged()
{
      hell = (int)(255.0*mouseY/height);
      OscMessage myMessage = new OscMessage("/hellpc");  
      myMessage.add(hell); /* add an int to the osc message */
      oscP5.send(myMessage, myRemoteLocation);       
}

/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) 
{
  /* print the address pattern and the typetag of the received OscMessage */
  print("### received an osc message.");
  print(" addrpattern: "+theOscMessage.addrPattern());
  println(" typetag: "+theOscMessage.typetag());
  if(theOscMessage.checkAddrPattern("/hellandroid")==true) 
  {
       hellandroid = theOscMessage.get(0).intValue();
  }
  if(theOscMessage.checkAddrPattern("/phiandroid")==true) 
  {
       int PHI = theOscMessage.get(0).intValue();
       phi = (float)PHI/100.0;
  }
}

Code 0-9: PC-seitige Erweiterung

IOT002pc.zip
//ANDROID seitig
import oscP5.*;
import netP5.*;
import ketai.sensors.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int hell=0;
int hellalt=0;

int PHI=0;

KetaiSensor sensor;
float accelerometerX, accelerometerY, accelerometerZ;

public void setup()
{
  sensor = new KetaiSensor(this);
  sensor.start();
  
  fullScreen();
  orientation(LANDSCAPE);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,12000);
  
  /* myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
   * an ip address and a port number. myRemoteLocation is used as parameter in
   * oscP5.send() when sending osc packets to another computer, device, 
   * application. usage see below. for testing purposes the listening port
   * and the port of the remote location address are the same, hence you will
   * send messages back to this sketch.
   */  
  myRemoteLocation = new NetAddress("192.168.252.255",12000); //senden an Broadcast-Adresse meines Hotspots!
  
}



public void draw()
{
     fill(hell);
     noStroke();
     rect(0,0,width/2,height);
     
     if(hell!=hellalt)
     {
          //testweise Wert zurück senden
          hellalt = hell;
          OscMessage myMessage = new OscMessage("/hellandroid");  
          myMessage.add(hell); /* add an int to the osc message */
          oscP5.send(myMessage, myRemoteLocation);       
          
     }
}



/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) 
{
  /* print the address pattern and the typetag of the received OscMessage */
  print("### received an osc message ANDROID.");
  print(" addrpattern ANDROID: "+theOscMessage.addrPattern());
  println(" typetag ANDROID: "+theOscMessage.typetag());
  if(theOscMessage.checkAddrPattern("/hellpc")==true) 
  {
       hell = theOscMessage.get(0).intValue();
  }
}

void onAccelerometerEvent(float x, float y, float z)
{
  accelerometerX = x;
  accelerometerY = y;
  accelerometerZ = z;
  
  //    Drehung in xy-Ebene:
  //    cos phi = v1*v2 / (|v1|*|v2|)
  //    v1 = [x,y]
  //    v2 = [1,0]
  
  float[] v1 = new float[] {x,y};
  float[] v2 = new float[] {1,0};
  
  float betragV1 = sqrt(v1[0]*v1[0]+v1[1]*v1[1]);
  float betragV2 = sqrt(v2[0]*v2[0]+v2[1]*v2[1]);
  
  float phi = acos( x / (betragV1*betragV2)  );
  if(y<0)
    phi = -phi;
    
  PHI = (int)(phi*100.5);  
    
  OscMessage myMessage = new OscMessage("/phiandroid");  
  myMessage.add(PHI); /* add an int to the osc message */
  oscP5.send(myMessage, myRemoteLocation);       
    
}

Code 0-10: Android-seitige Erweiterung

IOT002android.zip
ÜBUNG in Gruppenarbeit
  • Bringen Sie obige Programme auf Ihrem System zum Laufen.
  • Erweitern Sie IOT002pc um eine Visualisierung des Winkels. Der soll als Zeiger dargestellt werden.
  • Erweiterung2: Senden Sie den Winkel vom PC wieder an das Android-Gerät zurück. Zeigen Sie auf dem Android-Gerät den eigenen Winkel als grünen Zeiger, den vom PC zurück gesendeten als roten Zeiger an.

Ideenfindung: Exkurs in die Phänomenologie als Vorbereitung der Ideenfindung für Projektthemen


Folien: Siehe Moodle!


Im Verlauf unserer Arbeit tauchte die Schwierigkeit auf, zu sinnvollen Projektthemen zu gelangen. Hierzu soll im folgenden versucht werden, etwas Unterstützung zu geben.

2a -- Das Problem, ein einführendes Video

https://www.youtube.com/watch?v=qHhhjuVp9R0 -- Vorfilm: Philosophie für Anfänger - Heidegger
Fragen zum Video:
  • Warum war es so schwierig auf die dargestellte Idee zu kommen?
  • Was war nötig, um zu der dargestellten Idee zu kommen?
  • Entwickeln Sie Ideen dazu, wie man womöglich "trainieren" kann, besser zu solchen Ideen zu kommen.

2b -- Der Begriff der Lebenswelt und seine Konstitution

  • Die Lebenswelt bei Tieren und Menschen nach Jakob von Uexküll
  • Konstitution der menschlichen Lebenswelt nach Edmund Husserl

2c -- Von Abstraktionen und Kategorisierungen absehen: Auf dem Weg zur phänomenologischen Epoché

2d -- Fazit

  • Durch unsere Fixierung auf Lösungen ist uns ein großer Teil der mannigfaltigen Erscheinungen in der Welt verborgen.
  • Erst durch vorurteilsfreie nicht Ziel-gerichtete Wahrnehmung der unterschiedlichen lebensweltlichen Bereiche kommen wir zu neuen Informationen über das, was uns schon immer umgibt.
  • Hieraus erschließt sich für uns die vorgeschaltete Aufgabe, überhaupt einmal das eigene Leben mit seinen verschiedenen Lebenssituationen in unserer Vorstellung entstehen zu lassen und zu protokollieren.
2e -- ÜBUNG
  • Lassen Sie vor Ihrem geistigen Auge einen Tag, oder eine Woche Revue passieren.
  • In welchen Lebensbereichen / Lebenssituationen / in welchen Lebenszusammenhängen befinden Sie sich da jeweils?
  • Protokollieren Sie ausschnittsweise, mit welchen Sachen Sie in den verschiedenen Bereichen zu tun haben.
  • Können Sie Konfliktsituationen / Störsituationen / Situationen, in denen etwas schiefläuft innerhalb der bereits identifizierten Situationen ausmachen?
  • Fiele Ihnen ein, ob diese Schwierigkeiten durch Unterstützung eines wie auch immer gearteten eingebetteten Systems verbessert werden könnte?
  • Beschreiben Sie mindestens drei fiktive Geräte, die irgend eine Alltagssituation erleichtern könnte.
  • Prüfen die die drei Ideen auf folgende Punkte hin:
  1. Echte Sinnhaftigkeit
  2. Umsetzbarkeit innerhalb des Kurses
  3. Potential für fehlertolerante Pattern



#7 Dienstag 23.11.2021


Festlegen der Zweiergruppen und der Projektthemen

Grundlage bildet die Übung von letzter Woche, die als Hausaufgabe gestellt wurde:

2e -- ÜBUNG (gleich wie oben)
  • Lassen Sie vor Ihrem geistigen Auge einen Tag, oder eine Woche Revue passieren.
  • In welchen Lebensbereichen / Lebenssituationen / in welchen Lebenszusammenhängen befinden Sie sich da jeweils?
  • Protokollieren Sie ausschnittsweise, mit welchen Sachen Sie in den verschiedenen Bereichen zu tun haben.
  • Können Sie Konfliktsituationen / Störsituationen / Situationen, in denen etwas schiefläuft innerhalb der bereits identifizierten Situationen ausmachen?
  • Fiele Ihnen ein, ob diese Schwierigkeiten durch Unterstützung eines wie auch immer gearteten eingebetteten Systems verbessert werden könnte?
  • Beschreiben Sie mindestens drei fiktive Geräte, die irgend eine Alltagssituation erleichtern könnte.
  • Prüfen die die drei Ideen auf folgende Punkte hin:
  1. Echte Sinnhaftigkeit
  2. Umsetzbarkeit innerhalb des Kurses
  3. Potential für fehlertolerante Pattern

Entscheidung über Format für den Rest des Semesters: Online / Offline


Ab KW 48 / Dienstag 30.11. findet innerhalb der LV eine individuelle Betreuung der Projekte statt.



Ein Projekt kann nur bewertet werden, wenn eine regelmäßige Vorstellung des Projektstandes in der zweiten Semesterhälfte stattfindet.