Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
tempos [2017/03/17 17:51] huwaldttempos [2019/07/25 21:45] (aktuell) – [Erweiterung] huwi
Zeile 14: Zeile 14:
 Im zweiten Schritt ist der Speaker zu realisieren. Diesem ist eine LED zuzuordnen welche solange blinkt, wie der Speaker aktiv ist. Durch das Klicken des Tasters soll der Speaker aktiviert werden. Das Halten setzt den Speaker wieder zurück. Im zweiten Schritt ist der Speaker zu realisieren. Diesem ist eine LED zuzuordnen welche solange blinkt, wie der Speaker aktiv ist. Durch das Klicken des Tasters soll der Speaker aktiviert werden. Das Halten setzt den Speaker wieder zurück.
  
->>{{:temposaufgabe.jpg?700|}}+>{{:temposaufgabe.jpg?700|}}
  
 ===== Vorbereitung ===== ===== Vorbereitung =====
 Falls Sie jetzt noch das Klassendiagramm geöffnet haben, wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Sollte das Projekt nicht mehr geöffnet sein öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache //ARM C++//. Beachten Sie die Einstellungen für die Zielplattform STM32F4-Discovery. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage //Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)//. Weisen Sie das Treiberpaket für STM32F4 zu.  Falls Sie jetzt noch das Klassendiagramm geöffnet haben, wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Sollte das Projekt nicht mehr geöffnet sein öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache //ARM C++//. Beachten Sie die Einstellungen für die Zielplattform STM32F4-Discovery. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage //Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)//. Weisen Sie das Treiberpaket für STM32F4 zu. 
  
->>{{:neueskldtempos.PNG?280|}}            {{:umlprojekt10gg.jpg?350|}}+>{{:neueskldtempos.PNG?280|}}            {{:umlprojekt10gg.jpg?350|}}
  
 ===== Lösungsansatz ===== ===== Lösungsansatz =====
Zeile 28: Zeile 28:
 Wir können mit dem was wir bisher über die UML wissen bereits ablesen, dass der //PecButtonClickAndHold// sowie die //PecLed// über eine Reihe von wichtigen Operationen verfügen und über alle Eigenschaften eines //PecAppModul// und des //PecPinInput// bzw. //PecPinOutput//. Besonders beim //PecButtonClickAndHold// fällt auf, dass es Operationen gibt die öffentlich (public) sind. Wir können mit dem was wir bisher über die UML wissen bereits ablesen, dass der //PecButtonClickAndHold// sowie die //PecLed// über eine Reihe von wichtigen Operationen verfügen und über alle Eigenschaften eines //PecAppModul// und des //PecPinInput// bzw. //PecPinOutput//. Besonders beim //PecButtonClickAndHold// fällt auf, dass es Operationen gibt die öffentlich (public) sind.
  
->>>+isPressd() +>+isPressd() 
->>>+waitForPress()+>+waitForPress()
  
 Und es gibt Operationen, die geschützt (protected) sind und demzufolge nicht von außen sondern nur intern in der Klasse oder deren Ableitungen benutzt werden können. Ein weiterer auffälliger Umstand ist, dass diese Operationen auch noch kursiv gestellt sind. Das bedeutet in diesem Fall, dass diese Operationen virtueller Natur sind und überschrieben werden können. Sie sind vom Anwendungsentwickler in einer eigenen Realisierung des //PecButtonClickAndHold// zu überschreiben. Damit werden dann die Eventhandler für die Ereignisse "Taste klicken" und "Taste halten" implementiert. Und es gibt Operationen, die geschützt (protected) sind und demzufolge nicht von außen sondern nur intern in der Klasse oder deren Ableitungen benutzt werden können. Ein weiterer auffälliger Umstand ist, dass diese Operationen auch noch kursiv gestellt sind. Das bedeutet in diesem Fall, dass diese Operationen virtueller Natur sind und überschrieben werden können. Sie sind vom Anwendungsentwickler in einer eigenen Realisierung des //PecButtonClickAndHold// zu überschreiben. Damit werden dann die Eventhandler für die Ereignisse "Taste klicken" und "Taste halten" implementiert.
  
->>>//#onClick()// +>//#onClick()// 
->>>//#onHoldStart()// +>//#onHoldStart()// 
->>>//#onHolding()// +>//#onHolding()// 
->>>//#onHoldEnd()//+>//#onHoldEnd()//
  
 Der //PecButtonClickAndHold// weist neben dem Sterotyp //<<template>>// und den aufgeführten Merkmalen noch eine weitere Besonderheit auf. Er verfügt über ein Attribut mit dem merkmal //**{sm}**//. Folgen wir diesem Zustandsattribut "nach unten" finden wir das Verhaltensmodell des Buttons als Zustandsmaschine. Der //PecButtonClickAndHold// weist neben dem Sterotyp //<<template>>// und den aufgeführten Merkmalen noch eine weitere Besonderheit auf. Er verfügt über ein Attribut mit dem merkmal //**{sm}**//. Folgen wir diesem Zustandsattribut "nach unten" finden wir das Verhaltensmodell des Buttons als Zustandsmaschine.
  
->>>{{:smbutton.jpg?500|}}+>{{:smbutton.jpg?500|}}
  
 Damit haben wir uns einen kurzen Überblick zu den vorhandenen Lösungen für Taster und LED verschafft.  Damit haben wir uns einen kurzen Überblick zu den vorhandenen Lösungen für Taster und LED verschafft. 
 Die nächste Überlegung zielt auf die Struktur der Komponente "Taster mit Beleuchtung". Zunächst geben wir dem Ding einen Namen und legen für den Button eine entsprechende Klasse an: //LightedButton//. Er hat offensichtlich eine eigene (blaue) LED. Diesen Umstand würdigen wir mit der Aggregation (Ganz-Teil-Beziehung) einer LED in der Buttonklasse; ändern Sie dabei manuell auf //#led// Die nächste Überlegung zielt auf die Struktur der Komponente "Taster mit Beleuchtung". Zunächst geben wir dem Ding einen Namen und legen für den Button eine entsprechende Klasse an: //LightedButton//. Er hat offensichtlich eine eigene (blaue) LED. Diesen Umstand würdigen wir mit der Aggregation (Ganz-Teil-Beziehung) einer LED in der Buttonklasse; ändern Sie dabei manuell auf //#led//
  
->>>{{:beleuchtetertastergrob.jpg?150|}}+>{{:beleuchtetertastergrob.jpg?150|}}
  
 Zur schnellen Suche und zum Einfügen der Templates können Sie im Navigator auf UML-Klassen wechseln. Um die vorhandenen Lösungen für unsere neue Komponente wiederzuverwenden ziehen wir den //PecButtonClickAndHold// sowie die //PecLed// in das Diagramm und verknüpfen diese mit den Bausteinen unserer Komponente. Als Verbindungstyp wählen wir die Realisierung. Die Zuordnung der konkreten Port-Pins (pinD15 und pinA0) erfolgt ebenfalls über Templates die wir im UML-Ordner //Pec/PinList// finden.  Zur schnellen Suche und zum Einfügen der Templates können Sie im Navigator auf UML-Klassen wechseln. Um die vorhandenen Lösungen für unsere neue Komponente wiederzuverwenden ziehen wir den //PecButtonClickAndHold// sowie die //PecLed// in das Diagramm und verknüpfen diese mit den Bausteinen unserer Komponente. Als Verbindungstyp wählen wir die Realisierung. Die Zuordnung der konkreten Port-Pins (pinD15 und pinA0) erfolgt ebenfalls über Templates die wir im UML-Ordner //Pec/PinList// finden. 
  
->>>{{:beleuchtetertasterfein.png?400|}}+>{{:beleuchtetertasterfein.png?400|}}
  
 Die Operationen //onClick// und //onHoldStart// fügen wir aus der Objektbibliothek in die Klasse ein. Dabei bietet uns das Werkzeug die vorhandenen virtuellen Operationen zum Überschreiben an. Es lohnt sich jetzt schon mal den Code für diese Komponente zu generieren und anzuschauen. Das Generieren des Codes erfolgt über das Aktionsmenü in der Objektbibliothek (nur Erstellen). Um den Quellcode einzusehen selektieren Sie die Klasse //LightedButton// und betätigen die Taste **F3**. Die Operationen //onClick// und //onHoldStart// fügen wir aus der Objektbibliothek in die Klasse ein. Dabei bietet uns das Werkzeug die vorhandenen virtuellen Operationen zum Überschreiben an. Es lohnt sich jetzt schon mal den Code für diese Komponente zu generieren und anzuschauen. Das Generieren des Codes erfolgt über das Aktionsmenü in der Objektbibliothek (nur Erstellen). Um den Quellcode einzusehen selektieren Sie die Klasse //LightedButton// und betätigen die Taste **F3**.
  
-<code c>+><code c>
 class LightedButton : public PecAppModul class LightedButton : public PecAppModul
 // implements ButtonClickAndHold, pinA00 // implements ButtonClickAndHold, pinA00
Zeile 91: Zeile 91:
  
 Klassenmodell der Anwendung in der ersten Ausbaustufe: Klassenmodell der Anwendung in der ersten Ausbaustufe:
->>>{{:temposarm1.png?500|}}+ 
 +>{{:temposarm1.png?500|}}
  
 ===== Realisierung ===== ===== Realisierung =====
Zeile 97: Zeile 98:
  
 **//LightedButton::onClick://:** **//LightedButton::onClick://:**
->>><code cpp>+><code cpp>
 led.flash(); led.flash();
 </code> </code>
  
->>>{{:clickseq1.jpg?300|}}+>{{:clickseq1.jpg?300|}}
  
 **//LightedButton::onHoldStart//:** **//LightedButton::onHoldStart//:**
->>><code cpp>+><code cpp>
 led.flash(); led.flash();
 </code> </code>
Zeile 122: Zeile 123:
 Eine vorgefertigte einfache Lösung für den Speaker ist in der hier verwendeten Bibliothek nicht enthalten. Somit setzen wir diese Komponente aus den verfügbaren Bausteinen zusammen und ergänzen die fehlende Funktionalität, einen beliebigen Pin mit einer bestimmten Frequenz umzuschalten (toggeln). Wenn dieser Baustein gut funktioniert können wir den so erstellten  einfachen Speaker als Lösungsmuster (Template) zum Beispiel in unsere Bibliothek aufnehmen. Dazu legen wir uns ein Paket "eigene Muster" an. Achten sie darauf, dass die Option "fast UML" deaktiviert ist. Öffnen Sie das Paket. Laden Sie keine Vorlage aus dem SiSy LibStore und führen Sie die nachfolgenden Operationen aus. Eine vorgefertigte einfache Lösung für den Speaker ist in der hier verwendeten Bibliothek nicht enthalten. Somit setzen wir diese Komponente aus den verfügbaren Bausteinen zusammen und ergänzen die fehlende Funktionalität, einen beliebigen Pin mit einer bestimmten Frequenz umzuschalten (toggeln). Wenn dieser Baustein gut funktioniert können wir den so erstellten  einfachen Speaker als Lösungsmuster (Template) zum Beispiel in unsere Bibliothek aufnehmen. Dazu legen wir uns ein Paket "eigene Muster" an. Achten sie darauf, dass die Option "fast UML" deaktiviert ist. Öffnen Sie das Paket. Laden Sie keine Vorlage aus dem SiSy LibStore und führen Sie die nachfolgenden Operationen aus.
  
->>>{{:paketeigenemuster.jpg?650|}}+>{{:paketeigenemuster.jpg?650|}}
  
 Der einfache Speaker ist ein Ausgabe-Pin und der Einfachheit halber ein PecAppModul. Wir können dann das 10 Millisekunden Ereignis zum Umschalten des Pins benutzen. Der Speaker soll mit der Operation //start// aktiviert werden und mit der Operation //stop// wieder angehalten werden. Das Ereignis //onTimer10ms// des //PecAppModuls// überschreiben wir. Der einfache Speaker ist ein Ausgabe-Pin und der Einfachheit halber ein PecAppModul. Wir können dann das 10 Millisekunden Ereignis zum Umschalten des Pins benutzen. Der Speaker soll mit der Operation //start// aktiviert werden und mit der Operation //stop// wieder angehalten werden. Das Ereignis //onTimer10ms// des //PecAppModuls// überschreiben wir.
Zeile 138: Zeile 139:
  
 **//SimpleSpeaker::start//:** **//SimpleSpeaker::start//:**
->>><code cpp>+><code cpp>
 isActive=true; isActive=true;
 </code> </code>
  
 **//SimpleSpeaker::stop//:** **//SimpleSpeaker::stop//:**
->>><code cpp>+><code cpp>
 isActive=false; isActive=false;
 </code> </code>
  
 **//SimpleSpeaker::onTimer10ms//:** **//SimpleSpeaker::onTimer10ms//:**
->>><code cpp>+><code cpp>
 if (isActive) if (isActive)
    this->toggle();    this->toggle();
Zeile 155: Zeile 156:
 </code> </code>
  
->>>{{:simplespkseq.jpg?200|}}+>{{:simplespkseq.jpg?200|}}
  
 Das von uns vorbereitete Muster können wir jetzt in unserer Anwendung benutzen. Sie finden dies genau wie alle anderen Templates über den Navigator "UML-Pakete" unter dem Paket //eigene_Muster//. Das von uns vorbereitete Muster können wir jetzt in unserer Anwendung benutzen. Sie finden dies genau wie alle anderen Templates über den Navigator "UML-Pakete" unter dem Paket //eigene_Muster//.
Zeile 165: Zeile 166:
  
 **//LightedButton::onClick//:** **//LightedButton::onClick//:**
->>><code cpp>+><code cpp>
 led.flash(); led.flash();
 app.speaker.start(); app.speaker.start();
Zeile 173: Zeile 174:
  
 **//LightedButton::onHoldStart//:** **//LightedButton::onHoldStart//:**
->>><code cpp>+><code cpp>
 led.flash(); led.flash();
 app.speaker.stop(); app.speaker.stop();
 </code> </code>
  
->>>{{:clickseq3.jpg?320|}}+>{{:clickseq3.jpg?320|}}
  
 ===== Test der Erweiterung ===== ===== Test der Erweiterung =====
Zeile 185: Zeile 186:
   - Brennen   - Brennen
  
->>>>{{:erstellenbrennen.png?350|}}  +>{{:erstellenbrennen.png?350|}}  
 **Gratulation!** Sie haben ihr erstes eigenes UML-Template erstellt. Verbinden Sie den Speaker auf dem Zusatzboard mit dem Pin PE5 auf dem STM32F4-Discovery. **Gratulation!** Sie haben ihr erstes eigenes UML-Template erstellt. Verbinden Sie den Speaker auf dem Zusatzboard mit dem Pin PE5 auf dem STM32F4-Discovery.
  
->>>{{:patchSpeaker.png?400|}}+>{{:patchSpeaker.png?400|}}
  
 Sie können jetzt per Click den Speaker einschalten, dabei blinkt die rote LED; mit langem Drücken des Tasters schalten Sie den Speaker wieder ab und die LED aus.  Sie können jetzt per Click den Speaker einschalten, dabei blinkt die rote LED; mit langem Drücken des Tasters schalten Sie den Speaker wieder ab und die LED aus. 
Zeile 211: Zeile 212:
 Und hier diesen Abschnitt wiederum als Videozusammenfassung. Und hier diesen Abschnitt wiederum als Videozusammenfassung.
  
->>><html><iframe width="640" height="480" src="https://www.youtube.com/embed/jFf6AO0bbg0" frameborder="0" allowfullscreen></iframe></html>+><html><iframe width="700" height="480" src="https://www.youtube.com/embed/jFf6AO0bbg0" frameborder="0" allowfullscreen></iframe></html>
  
 ===== Übung ===== ===== Übung =====