====== Emulator für logische Schaltungen ====== ===== Auftrag ===== {{ :schule:prog:logikemulator_kundenauftrag.png?nolink|}} Sie haben den Auftrag erhalten, für die Elektro-Fachabteilung eines mittelständischen Unternehmens ein Programm zur Emulation logischer Schaltungen zu entwickeln. Die verschiedenen Grundbausteine können nach Eingabe von Wertbelegungen für die Eingänge getestet werden. Stelle Sie durch ein Objekt-Orientiertes Design des Programms sicher, dass auch komplexe Schaltungen simuliert werden können. ===== Wertetabelle ===== - Erstelle eine Wertetabelle für alle [[wpde>Logikgatter]]. - Das XOR hat in der Kryptographie eine besondere Bedeutung. Es kommt bei sogenannten One-Time-Pads zum Einsatz. Diese werden in dem PDF von [[http://www.crypto101.io/|Crypto 101]] gut beschrieben.\\ Wie funktionieren One-Time Pads? Welche Angriffsmöglichkeiten bzw. Schwachstellen gibt es und wie funktionieren diese? - Weitere Anwendungen von XOR beschreibt der Artikel [[https://florian.github.io//xor-trick/|The XOR Trick]] Das Wissen können wir gemeinsam in einem [[https://play.kahoot.it/#/k/8e8b2ecd-ae34-4695-b73c-189b5ce61de0|Kahoot]] überprüfen. ===== Und-Gatter ===== - Wie könnte eine Klasse für ein UND-Gatter aufgebaut sein? - Welche Attribute und [[Methoden]] gibt es? - Implementiere die Klasse ''UndGatter'' und die anderen Gatter. ===== Vererbung ===== - Bei der Implementierung gibt es Wiederholungen im Quelltext. An welchen Stellen? - Wie können solche Wiederholungen vermieden werden? - Nutze Vererbung, um die Wiederholungen zu vermeiden. - Bearbeite das //Arbeitsblatt Vererbung// Das Wissen können wir gemeinsam in einem [[https://play.kahoot.it/#/k/00feb39d-6c52-4272-a390-f601a5c730e1|Kahoot]] überprüfen. ===== Tests ===== Die Gatter sollen getestet werden. - Welches Ziel verfolgt ein [[wpde>Komponententest]]? - Was ist der Unterschied zwischen einem Blackbox- und einem Whitebox-Test? - Erstelle ein neues Projekt "LogikgatterTest" in der selben Projektmappe. - Füge als Verweis das bisherige Projekt hinzu. - Erstelle für jedes Gatter einen Testklasse: Für das ''UndGatter'' also z.B. ''UndGatterTest'' und teste darin das Und-Gatter mit allen möglichen Eingabe. Ein [[https://media.giphy.com/media/3o7rbPDRHIHwbmcOBy/giphy.gif|lustiges kurzes Video]], das den Unterschied zwischen einem Unit-Test und einem Integrationstest visualisiert. ===== Komposition und Aggregation ===== Einige Gatter können die Funktionalität anderer Gatter wiederverwenden. So kann das Nicht-Und-Gatter z.B. aus einem Nicht- und einem Und-Gatter aufgebaut werden. - Skizziere ein Klassendiagramm, das die Wiederverwendung nutzt. - Stelle deine Implementierung auf die Verwendung von Aggregation um und veröffentliche den Quelltext unten. - Was ist der Unterschied zwischen Aggregation und Komposition? Wie wird dies im Klassendiagramm verdeutlicht? - Was sind Multiplizitäten? - Bearbeite das {{:schule:prog:arbeitsblatt_klassenbeziehungen.pdf|Arbeitsblatt Klassenbeziehungen}} ===== Halb-Addierer und Addierer ===== Oben ist ein [[wpde>Halbaddierer]] dargestellt. Er kann einstellige 1-Bit-Zahlen addieren. In dem Video [[https://www.youtube.com/watch?v=lNuPy-r1GuQ|Domino Addition (Kanal Numberphile)]] wird der Halbaddierer mit Dominosteinen nachgebaut und damit //begreifbar// gemacht. In einem [[https://www.youtube.com/watch?v=OpLU__bhu2w|weiteren Video]] werden sogar noch größere Zahlen mit 10000 Dominosteinen addiert. - Informiere dich über die Funktionsweise eines Halbaddierers und implementiere ihn als neue Klasse ''Halbaddierer'' mit Hilfe der vorhandenen Klassen. - Teste ihn in dem Testprojekt. - Veröffentliche deinen Quelltext. - Du kannst aus zwei Halbaddierern und einem weiteren Gatter einen [[wpde>Volladdierer]] konstruieren. Damit kann ein Addierwerk für z.B. zwei 2-Bit-Zahlen erstellt werden. Gelingt es dir? ===== Unterschiedliche Ausgaben der Gatter mit Hilfe des Strategy-Patterns ===== Das Gatter soll bei der Ausgabe des Ergebnisses (z.B. über eine Methode ''public string showResult()'') unterschiedliche Ausgaben unterstützen. Bitausgabe:1,0 und Boolsche Ausgabe:true, false **Vorgehen** - Informiere dich über das //Strategy Pattern//. - Entwickle ein Klassendiagramm für das Logikgatterprojekt. - (Wir vergleichen) - Setze das Klassendiagramm in Quelltext um. - In welchen Situationen kommt das Strategy Pattern zum Einsatz? - Welche anderen Entwurfsmuster (Pattern) findest du noch? vgl. z.B. [[https://dzone.com/refcardz/design-patterns|Refcard Designpatterns]] oder [[http://www.heise.de/developer/artikel/Episode-1-Ueber-den-Einsatz-von-Patterns-353072.html|Episode 1 - Über den Einsatz von Patterns]] vom heise developer podcast. ===== GUI für die Logikgatter ===== Das Projekt soll um eine GUI ergänzt werden, so dass der Benutzer Gatter mit der Maus auswählen und die Eingänge selbst setzen kann. Entwirf eine einfache GUI und veröffentliche sie. Eine mögliche GUI und die zugehörige Klasse: {{:schule:prog:klasse_multifenster.png?direct&200|}} ===== Hardware-Ansteuerung ===== Die Logikgatter können auch über ein Hardwaremodul über den [[Raspberry Pi]] angesteuert werden. Das zugehörige Python-Modul heißt [[https://github.com/pintman/ea_rpi_modul|eapi]]. - Installiere das Modul ''eapi''. - Steuere das Modul so an, dass die beiden Taster mit den Eingängen und die LEDs mit den Ausgängen verschiedener Gatter wie folgt verbunden werden: rot=Und-Gatter, gelb=Oder-Gater, grün=XOder-Gatter. - Verbinde die Module über das Netzwerk (''pydoc3 eapi.net'' gibt hierzu Hilfestellungen), so dass weitere Gatter mit LEDs auf den anderen PIs verbunden werden. ===== Webinterface ===== Webseiten können auf zwei Arten ausgeliefert werden: //statisch// und //dynamisch//. Statisch bedeutet dabei, dass lediglich Dateien auf dem Webserver an den Client (z.B. Browser) gesendet werden. Bei dynamischen Seiten werden die Ergebnisse "berechnet" und an den Client gesendet -- die Seite wird dynamisch erzeugt und liegt nicht bereits irgendwo auf dem Server. Die Logikgatter sollen nun dynamisch über ein Webinterface zugänglich gemacht werden. Hierfür bieten sich drei unterschiedliche Ansätze an. - Einen bestehenden Webserver wie Apache verwenden und das Programm über ein [[wpde>Common Gateway Interface]] (CGI) ansteuern. - Einen eigenen [[Webserver programmieren]]. - Ein Webframework für Python benutzen wie z.B. Django oder [[http://bottlepy.org/|Bottle]]. Findest du in ''bottle.py'' die Stellen, die Aufgaben realisieren, die wir schon selbst programmiert haben: Socket erstellen, an Adresse binden, auf request reagieren? ===== MVC Muster ===== Das MVC-Muster ([[wpde>Model View Controller]]) wird für viele Anwendungen verwendet. - Informiere dich darüber, was die Begriffe und Pfeile jeweils bedeuten und erstelle eine kurze Präsentation, die MVC am Beispiel der Logikgatter vorstellt. - Finden sich die Bereiche Model, View und Controller in eurer Anwendung wieder? Falls ja, stelle dies dar. //Literatur//: Kapitel zu MVC aus //Patterns kompakt-Entwurfsmuster für effektive Software Entwicklung-MVC//. ===== Links ===== * Mit Hilfe von Minecraft lassen sich die Schaltkreise auch mit Redstone nachbilden -- sogenannte [[http://technic-de.gamepedia.com/Redstone-Schaltkreise|Redstone-Schaltkreise]]. Auch dort findet man eine [[http://technic-de.gamepedia.com/Redstone-Schaltkreise/Logikgatter|Liste mit verschiedenen Logikgattern]].