Lichtsteuerung issueshttps://git.rwth-aachen.de/leander.schulten/Lichtsteuerung/-/issues2020-07-08T00:54:32+02:00https://git.rwth-aachen.de/leander.schulten/Lichtsteuerung/-/issues/21New Module System2020-07-08T00:54:32+02:00Leander SchultenNew Module SystemIn der Lichtsteuerung sollen dynamisch Programme geschrieben werden können, um die LEDs und die DMX Geräte anzusteuern . Alternativ wären alle Programme fest in der Lichtsteuerung verankert und das Entwickeln und Verteilen neuer oder ver...In der Lichtsteuerung sollen dynamisch Programme geschrieben werden können, um die LEDs und die DMX Geräte anzusteuern . Alternativ wären alle Programme fest in der Lichtsteuerung verankert und das Entwickeln und Verteilen neuer oder veränderter Programme wäre sehr aufwendig. Man soll aber nicht in der Lichtsteuerung lange komplizierte Programme schreiben, die unübersichtlich und nicht wiederverwertbar sind. Deshalb soll ein Module System verwendet werden, bei welchem man sich Programme aus verschiedenen Modules zusammenstellen kann. Sodass die Module selber einfacher werden und die Wiederverwendbarkeit steigt.
Das aktuelle Module System könnte durch ein Component and Connector (C&C) System ersetzt werden. Dabei werden Module als Komponenten realisiert, welche Ein- und Ausgänge haben. Es gibt atomare Komponenten, welche keine Subkomponenten besitzen und zusammengesetzte Komponenten, in welchen die Ein- und Ausgänge der Komponenten miteinander verbunden werden. Das C&C System würde sich dabei an [MontiArc](http://www.se-rwth.de/publications/AH_JOR_BR_MontiArc_TechReport_2012.pdf) anlehnen. Die Syntax ist ähnlich zu der von QML. Im Folgenden werden mehrere mögliche Designs verwendet, die sich von Beispiel zu Beispiel ändern. Komponenten könnte z.B. so aussehen:
```c++
package filter;
component Blur{
port in brightness_t[] input;
port in float power, min 0, max 1.0, default 0.5;
port out brightness_t output[input.length]; // der output ist immer so groß wie der input. Auch möglich: input.length*2 oder floor(sqrt(input.length))
void onPowerChange(){ // auf jeden in port kann bei einer Änderung reagiert werden.
// maybe compute something
}
// oder vielleicht alternativ:
onPowerChange: {
// maybe compute something
}
void compute(float diff_ms){ // hier kann der Blur berechnet werden.
// do computation
}
}
```
```c++
package programs;
component Lauflicht{
const property int outputLength, min 0; // eigentlich das gleiche wie port in, kann sich aber nicht mehr ändern und muss im Konstruktor gesetzt werden.
port in brightness_t power, default 255; // brightness_t kann sowieso nur Werte von 0 bis 255 abbilden.
port out brightness_t output[outputLength];
int currentIndex = 0; // Wir können auch ganz normale c++ Objekte anlegen
void compute(float diff_ms){
output[currentIndex] = 0;
++currentIndex;
currentIndex %= outputLength;
output[currentIndex] = power;
}
}
```
Diese Komponente könnte man im ControlPanal als Programm hinzufügen und ausführen lassen.
```c++
package deploy;
import filter.Blur; // wir können andere Komponenten importieren
import programs.Lauflicht;
export component TestProgramm{ // vielleicht ein export hier um zu signalisieren das diese Komponente für den Einsatz in der GUI geeigent ist. (Alternativ deploy, gui, show, visible, controlPane, program oder was ganz anderes).
component Lauflicht lauflicht(outputLength=30, power=200);
component Blur blur(power=0.7); // wir können im Konstruktor Werte für einen Port setzten
component BrightnessRbgStribe rgb;
compute lauflicht -> blur -> rgb; // wir geben hier an, in welcher Reihenfolge die Componenten berechnet werden sollen, da wir in einem Durchlauf der Blur Komponente schon das Ergebnis der Lauflicht Komponente benutzten wollen und nicht erst im nächsten Durchlauf.
connect lauflicht.output -> blur.input; // Wir können output ports einer Komponente mit input ports einer anderen Verbinden
connect blur.output -> rgb.input;
export rgb.comPort as "Com Port des Rgb Streifens"; // Wir können in ports als Eigenschaft in die Oberfläche exportieren, sodass dieser vom Nutzer eingestellt werden können.
export blur.power as "Blurstärke";
}
```
Hier nochmal die Gleiche Komponente wie oben, nur wird jetzt ein Design wie bei Qt/QML gewählt, wo ports/properties durch properties bindings gesetzt werden. Diese funtionieren wie ports, wenn sich der Wert eines out-Ports ändert, wird auch der damit verbundene Port aktualisiert.
```c++
package deploy;
import filter.Blur; // wir können andere Komponenten importieren
import programs.Lauflicht;
export component TestProgramm{ // vielleicht ein export hier um zu signalisieren das diese Komponente für den Einsatz in der GUI geeigent ist. (Alternativ deploy, gui, show, visible, controlPane, program oder was ganz anderes).
component Lauflicht lauflicht(outputLength=30, power=200){ /* oder man schreibt die Werte weiter in den Konstruktor?*/ Das component könnte man sich eigentlich auch sparen?
outputLength = 30; // Vielleicht? = für konstanten und : für ports benutzten. Oder man erlaubt beides für beides. Ein = würde signalisieren, dass der Wert nur ein mal gesetzt wird, ein : dass eine Verbindung aufgebaut wird, sodass wenn sich der Wert der rechte Seite ändert, die Variable mit geändert wird, was passieren kann wenn auf der rechten Seite keine fixe Zahl sondern eine Variable steht.
power = 200;
}
Blur blur(power=0.7){ // Das Komponent könnte man sich eigentlich auch sparen?
input: lauflicht.output; // alternative zum connect. Der input der Blur Komponenten ist der Output der Lauflicht Komponente
export power as "Blurstärke", description "Die stärke des Blurs";
}
BrightnessRbgStribe{
id: rgb; // das wäre der QML style. Man setzt eine id um die Komponente zu referenzieren. Sonst schreibt man das wie eine normale Deklaration
input: blur.output;
foo: Math.min(blur.testProperty * 2, 200); // diese notation hat den vorteil, dass komplexere ausdrücke möglich sind
connect blur.output -> input; // kann man vielleicht als alternative erlauben
}
compute lauflicht -> blur -> rgb; // wir geben hier an, in welcher Reihenfolge die Componenten berechnet werden sollen, da wir in einem Durchlauf der Blur Komponente schon das Ergebnis der Lauflicht Komponente benutzten wollen und nicht erst im nächsten Durchlauf.
export rgb.comPort as "Com Port des Rgb Streifens"; // Wir können in ports als Eigenschaft in die Oberfläche exportieren, sodass dieser vom Nutzer eingestellt werden können.
}
```https://git.rwth-aachen.de/leander.schulten/Lichtsteuerung/-/issues/23CodeClimate2019-07-01T11:38:52+02:00Leander SchultenCodeClimateVielleicht kann man so wie [hier](https://stackoverflow.com/questions/56493468/codeclimate-report-in-gitlab-for-c-not-showing) CppCheck oder Clang-Tidy laufen lassen um den Code zu bewerten und Fehler zu finden.Vielleicht kann man so wie [hier](https://stackoverflow.com/questions/56493468/codeclimate-report-in-gitlab-for-c-not-showing) CppCheck oder Clang-Tidy laufen lassen um den Code zu bewerten und Fehler zu finden.