DIY - Simhub Dash Displays

U

User 19771

Zur .ini: ich will es den Nutzern des Dashes vereinfachen, die Beschriftung der Funktionen einfach zu editieren. Selbstverständlich ginge das auch easy mit einer case-Abfrage, aber dann wurschtelt sich der Nutzer halt durch zig Codezeilen.
Das mache ich bei meinem Dashboard auch für verschiedene Einstellungen. Man kann Dateien über die Funktion readtextfile() auslesen. Hier ein schnell geschustertes Beispiel:
Screenshot 2021-10-20 181718.png

Mit readtextfile() wird die Datei gelesen. Bei left_01 und left_02 habe ich mal eine relative Pfadangabe gemacht. Dabei geht SimHub immer von seinem Installationsverzeichnis aus. Bei left_03 habe ich eine absolute Pfadangabe verwendet. Ich verwende eigentlich ausschließlich die relative Pfadangabe, da diese in meinen Augen am meisten Sinn macht. Bei der absoluten müsste die Datei immer an exakt der selben Stelle auf dem selben Laufwerk liegen. Gerade wenn auch andere das Dashboard nutzen macht das eigentlich keinen Sinn mehr.
Das left(, X, Y) darum gibt an, von welchem Zeichen an, wieviel genommen und in die Variable left_0x geschrieben werden soll. Anhand von left_01 wäre das also ab dem 36. Zeichen die nächsten 3 Zeichen lesen und in die Variable left_01 übernehmen. Hierbei gilt, dass ein Zeilenumbruch i.d.R. 2 Zeichen ausmacht (CR + LF).

Da man bei dieser Lösung aber immer die exakte Position und Anzahl der einzulesenden Zeichen angeben muss, ist man etwas eingeschränkt. Denkbar wäre hierbei z.B. eine Schleife zu machen. Also die Datei als ganzes in eine Variable zu übernehmen und dort dann Zeichen für Zeichen durchgehen und z.B. nach dem ersten ' suchen. Das wäre dann der Startpunkt. Das nächste ' wäre dann der Endpunkt und man könnte jetzt variabel auslesen, was dazwischen steht. Das habe ich selbst aber noch nicht ausprobiert, in wie weit das tatsächlich auch in SimHub funktioniert.
Eine andere Möglichkeit wäre für jede Position eine eigene Datei anzulegen. Also z.B. left_01.ini, left_02.ini, left_03.ini usw. Dann muss auch einfach nur die Datei als ganzes eingelesen werden und man kann sich das left(, X, Y) um das readtextfile() herum sparen. Das ist z.B. der Weg, den ich immer gehe. Das macht es dann einfach etwas einfacher zu handeln, allerdings hat man dann halt u.U. viele INI-Dateien.

Eine weitere Krux bei der Sache, die man zu bedenken hat, ist, was passiert wenn nicht das drin steht, was man erwartet. Bei einem reinen Text, der nur als Beschriftung dienen soll ist das halb so wild. Wenn aber Zahlen oder ähnliches eingelesen werden, die z.B. als Grenzwerte für Berechnungen dienen sollen, wird es da schon schwieriger. Wenn man eine Zahl erwartet, aber "1a89" drin steht kommt wahrscheinlich nicht mehr das raus, was man wollte.
Ich prüfe bei mir daher zusätzlich immer den Inhalt ab und wenn der nicht passt zeigt mein Dashboard für 10 Sek. einen Fehler, was wo nicht passt und nimmt anschließend einen von mir hart codierten Backup-Wert.
 
U

User 26065

Wow, danke für das Minitutorial, Björn!
Und ich Eumel hab' mir letzte Woche noch gedacht, "Wofür sollte man eigentlich readtextfile() brauchen?" :D :D

Was mich ein Wenig "stört" (nicht wirklich, aber mein Programmiererherz stöhnt da ein Wenig) ist die Tatsache, dass es ja AFAIK keine echte "init"-Routine in Simhub gibt, mit der man diese Werte nur 1x auslesen könnte.
Wenn ich das richtig sehe, wird bei deinem Beispiel quasi jedes Mal, wenn ein Control upgedated wird, das Textfile ausgelesen, oder?

Da denk' ich bei mir dann immer, was das an Ressourcen benötigt, wenn das 30-50x/Sekunde passiert, wenn ein Element recht aktuell ist...

lg
m
 
U

User 561

Mit readtextfile() wird die Datei gelesen. [..]
Sehr ausführlich beschrieben, danke!

Ich denke, es könnte recht easy funktionieren, wenn man den ausgelesenen Text als Programmcode in die .js einbetten könnte. Wenn im .ini-File z. B. steht
INI:
[left rotary functions]
l_01 = "ABS",
l_02 = "TCC",
l_03 = "TCR",
...

[right rotary functions]
r_01 = "Sys Vol",
r_02 = "FOV"
r_03 = "VChat Vol",
...
dann entspricht der Inhalt der .ini ja quasi 1:1 eine Variablendefinition im Javascript. Man müsste dann eigentlich alles zwischen [left rotary functions] und [right rotary functions] einlesen und als Code verwenden. Das müsste mit
Javascript:
simpleString.lastIndexOf("[left rotary functions]")
und
Javascript:
simpleString.IndexOf("[right rotary functions]")
als Start und Endpunkt irgendwie realisierbar sein.
 
U

User 19771

Was mich ein Wenig "stört" (nicht wirklich, aber mein Programmiererherz stöhnt da ein Wenig) ist die Tatsache, dass es ja AFAIK keine echte "init"-Routine in Simhub gibt, mit der man diese Werte nur 1x auslesen könnte.
Wenn ich das richtig sehe, wird bei deinem Beispiel quasi jedes Mal, wenn ein Control upgedated wird, das Textfile ausgelesen, oder?
Ja, es wird jedes mal gelesen. Ich behelfe mir da damit, dass ich eine root Variable abfrage, ob sie einen Wert hat. Wenn nicht wurde das Dashboard gestartet und ich lade die Datei(en) und weise der Variable einen Wert zu.
Root Variablen haben den Vorteil, dass sie ihren Wert behalten, auch wenn sie nur einmal beschrieben werden. Die Variable verliert ihren Wert erst, wenn das Dashboard beendet wird.

Sieht dann so aus:
Javascript:
if (isnull(root.xConfigRead,false) != true)
{
  if (root.fSpeedThreshold == null)
  {
    root.fSpeedThreshold = readtextfile('DashTemplates\\RaceDash\\config\\functional\\AcclerationMeasureSpeedThreshold.ini');
  }
 
  root.xConfigRead = true;
}
 
U

User 26065

Aaaaah, das ist ein netter Trick, danke!
Ich kannte zwar die Root-Variablen, aber der Workaround, die zum 1x-read-only zu benutzen, ist schon genial.

Wieder was gelernt, vielen Dank!
 
Oben