OTX LUA Scripts zum testen

JoeBuster

Erfahrener Benutzer
Ich dachte Analog geht von -1024 bis 1024. Da S1 der sechs Stufen Schalter ist werden damit sechs Funktionen angefahren, die auch alle per Text angezeigt werden sollen.

Verwende ich kleiner als, schreibt er den zu verwendenden Text über den darunter befindlichen. Bei unterschiedlich langen Wörtern sieht man dann immer noch das Ende des längsten Wortes :(
 
@ JoeBuster

typischer Syntax-Fehler. Schau mal in das OpenTX-LUAReferenceGuide.pdf. Dort wirst du in den vielen kleinen Beispielen die Lösung finden. = ist eine Zuweisung, == ist der Vergleich.
 

Jorge

Erfahrener Benutzer
moin, gestern war ich krank zu Hause und habe wegen akuter Langeweile mir mal LUA angeschaut...
Zwei Fragen habe ich da
1) nach dem hier
https://github.com/opentx/opentx/issues/2043
soll das automatische starten eines LUA Skriptes erst mit 2.1 kommen, ist das noch korrekt so oder hat sich inzwischen was getan? Wir sind ja erst bei 2.0.15
2) ist die LUA Simulation über companion wirklich nur über die Sender Simulation / Page Taste lange drücken möglich oder gibt es eine "schnellere" variante ein LUA Skript beim Testen zu starten?
 

JoeBuster

Erfahrener Benutzer
hmmmm - sorry - ich bin zu blöd für dieses LUA Zeug :(

Kann mir einer sagen warum das so nicht funktioniert? Ich bekomme da einfach nix angezeigt (Simulator & Funke). Die Werte sind vom 6-Stufen Poti. Aber auch mit den µS als Werte klappt es nicht.

----------------------------------------------- LED Anzeige
if getValue("s1") == -100 then -- Anzeige LED Mode
lcd.drawText(7, 43, "AUS" ,MIDSIZE)
end
if getValue("s1") == -60 then -- Anzeige LED Mode
lcd.drawText(7, 43, "Dauer",MIDSIZE)
end
if getValue("s1") == -20 then -- Anzeige LED Mode
lcd.drawText(7, 43, "Flash",MIDSIZE)
end
if getValue("s1") == 20 then -- Anzeige LED Mode
lcd.drawText(7, 43, "Blink",MIDSIZE)
end
if getValue("s1") == 60 then -- Anzeige LED Mode
lcd.drawText(7, 43, "Polizei",MIDSIZE)
end
if getValue("s1") == 100 then -- Anzeige LED Mode
lcd.drawText(7, 43, "Dauer",MIDSIZE)
end
------------------------------------------------------
 

Kaldi

...es funktioniert!
hmmmm - sorry - ich bin zu blöd für dieses LUA Zeug :(

Kann mir einer sagen warum das so nicht funktioniert? Ich bekomme da einfach nix angezeigt (Simulator & Funke). Die Werte sind vom 6-Stufen Poti. Aber auch mit den µS als Werte klappt es nicht.
schick mal das ganze script...

ich denke mal, dass es die "==" Angaben sind. Probier mal einen zwischenbereich zu definieren.
welche Werte werden im "Servomonitor" angezeigt bei den verschiedenen Schalterpositionen


gib mal < und > ein, dann wird auch was angezeigt
 
Zuletzt bearbeitet:

JoeBuster

Erfahrener Benutzer
Das ganze Skript ist eine Aneinanderreihung von allen möglichen Code Schnippseln. Das funktioniert ja auch alles, nur eben diese Text Anzeige der sechs Positionen nicht.

Verwende ich statt == größer als oder kleiner als, werden zumindest drei der sechs Wörter dagestellt. Ich raff das einfach nicht.
 

Jorge

Erfahrener Benutzer
das hatten wir ein paar Seiten vorher. Das sind analoge Geber (S1) und da wackelt der Wert einfach, so dass "=" nie bis selten auftritt. Deshalb verwendet man in der normalen Programmierung der Taranis ja auch lieber "~". Also sollte es mit > und < besser klappen.
Lass dir in deinem Skript doch den wert von S1 ausgeben, dann kannst du es besser überprüfen.

EDIT; ach so, und Werte der Geber werden von -1024 bis 1024 ausgegeben...das merkst du wenn du meinen Tipp beherzigst oder die Anleitung liest :D

Analogue values such as sticks and sliders have value in percent multiplied by 10.24:

Aileron Stick Value
Input Value to Script
0% 0
60.6% 620
100.0% 1024
-100.0% -1024
 
Zuletzt bearbeitet:

Kaldi

...es funktioniert!
das hatten wir ein paar Seiten vorher. Das sind analoge Geber (S1) und da wackelt der Wert einfach, so dass "=" nie bis selten auftritt. Deshalb verwendet man in der normalen Programmierung der Taranis ja auch lieber "~". Also sollte es mit > und < besser klappen.
Lass dir in deinem Skript doch den wert von S1 ausgeben, dann kannst du es besser überprüfen.
Jepp - wollte ich gerade schreiben...

das sollte Dir helfen (die Werte gehen von -1024 bis +1024):

die roten Werte musst Du halt entsprechend anpassen. Script auf den Sender laden, Schalter drehen, Werte notieren und dann immer etwas drüber gehen...

Code:
local function run(event)

lcd.drawText (7,30, getValue("s1"), MIDSIZE)

if getValue("s1") < [COLOR=#ff0000]-90[/COLOR] then -- Anzeige LED Mode
   lcd.drawText(7, 43, "AUS" ,MIDSIZE)

elseif getValue("s1") < [COLOR=#ff0000]-60[/COLOR] then -- Anzeige LED Mode
  lcd.drawText(7, 43, "Dauer",MIDSIZE)

elseif getValue("s1") < [COLOR=#ff0000]-20[/COLOR] then -- Anzeige LED Mode
  lcd.drawText(7, 43, "Flash",MIDSIZE)

elseif getValue("s1") < [COLOR=#ff0000]20 [/COLOR]then -- Anzeige LED Mode
  lcd.drawText(7, 43, "Blink",MIDSIZE)

elseif getValue("s1") < [COLOR=#ff0000]60[/COLOR] then -- Anzeige LED Mode
  lcd.drawText(7, 43, "Polizei",MIDSIZE)

else   -- Anzeige LED Mode
  lcd.drawText(7, 43, "Dauer",MIDSIZE)
end


end

return { run=run }
sieht dann so aus:
6-stufenschalter.png
 
Zuletzt bearbeitet:

JoeBuster

Erfahrener Benutzer
Vielen Dank Euch beiden - so gaaaaanz langsam komme ich dahinter.

Was ICH mir persönlich noch wünschen würde, wäre ein WYSIWYG Editor. Neben vielen Grundsätzlichen LUA Programmaufrufen tue ich mich mitunter sehr schwer mit der korrekten Größe und Position von mehreren geometrischen Formen, speziell wenn dieses Leer bzw. ausgefüllt und verschachtelt in einander greifen.
 

Jorge

Erfahrener Benutzer
Mal dir das auf Karo Papier auf, so ein Kästchen für 10 Pixel z.b.
Hab ich früher immer gemacht als man 8bit Zeichen Grafik programmieren musste...Ach lang ist das her.
Wie war nochmal die Auflösung des Taranis Displays? 212x64 Pixel glaube ich.
 
Ja, die Auflösung ist 212x64 Pixel

Das mit dem Zeichnen würde mich ebenfalls interessieren.
Benötigt Ihr bmp Dateien oder die Zeichnungsfunktion?
Für eine kleine simple Grafik habe ich nun bereits relativ fiel Text benötigt.

https://www.dropbox.com/s/gwbae1ho1qjja2i/telem3.lua?dl=0

Ich haben noch einen Befehl gesucht um Rechtecke blinken zu lassen. Leider habe ich nichts gefunden.
Als alternative wäre für mich auch eine Warte-Funktion von Nutzen, mit Welchem ich das Blinken ebenfalls hin bekomme.
Gibt es diese Befehle?
 
Zuletzt bearbeitet:

JoeBuster

Erfahrener Benutzer
Kann mal bitte jemand checken, wo mein Fehler liegt - ich bin hier schon echt am verzweifeln :(

Also Schalter SA soll mir im Mittelteil des Display drei Verschiedene Anzeige Screen zur Verfügung stellen.

Aktuell habe ich erst zwei "Bildschirme" fertig aber die funktionieren mit der Umschaltung schon nicht, als habe ich den dritten erst einmal weg gelassen.

"current" zeigt mit zudem auch noch völlige falsche Werte an. In anderen LUA Skripten wird für Current immer 5.5A ausgegeben. Hier springt der Current Wert im 10er Schritt hoch. Auch die Einheit für den Strom (mAh und A) wird bei Schalter Betätigung nicht ersetzt sondern überschrieben.

Ich bin seit Stunden schon am probieren und machen. Habe schon alles mögliche versucht mit <>= 0,-1024, 1024 usw. Ich bekomme es einfach nicht hin.

Vielen Dank

Hier mal der Code:

-- ############## Anzeige Strom ###############

if getValue(92) >= -1024 and getValue("consumption") >= 1000 then
lcd.drawNumber(148, 4, getValue("consumption"), DBLSIZE+1)
else
lcd.drawNumber(148, 4, getValue("consumption"), DBLSIZE)
lcd.drawText(83, 2, "CNSP", SMLSIZE)
lcd.drawText(150, 13, "mAh", SMLSIZE)
end

if getValue(92) == 0 then
lcd.drawNumber(148, 4, getValue("current"), DBLSIZE)
lcd.drawText(83, 2, "Curr", SMLSIZE)
lcd.drawText(150, 13, "A", SMLSIZE)
end

-- ################# Anzeige Höhe (Baro) ######################

if getValue(92) >= -1024 and (getValue("altitude") >= 400) then
lcd.drawNumber(156, 25, getValue("altitude"), XXLSIZE+1)
lcd.drawText(157, 56, "m", 0)
end
if getValue(92) >= -1024 and (getValue("altitude") <= 400) then
lcd.drawNumber(156, 25, getValue("altitude"), XXLSIZE)
lcd.drawText(157, 56, "m", 0)
end


-- ##################### Anzeige Werte ###################

if getValue(92) == 0 then
lcd.drawNumber(145, 23, getValue ("distance"), MIDSIZE)
lcd.drawPixmap(82, 21, "/SCRIPTS/BMP/distkl.bmp")
lcd.drawText(146, 28, "m", SMLSIZE, LEFT)

lcd.drawNumber(145, 38, getValue("altitude"), MIDSIZE)
lcd.drawPixmap(82, 34, "/SCRIPTS/BMP/hgt.bmp")
lcd.drawText(146, 43, "m", SMLSIZE, LEFT)

lcd.drawNumber(145, 52, getValue("gps-speed"), MIDSIZE)
lcd.drawPixmap(82, 50, "/SCRIPTS/BMP/tacho.bmp")
lcd.drawText(146, 57, "km/h", SMLSIZE, LEFT)
end
 

JoeBuster

Erfahrener Benutzer
So, ich habe nochmal rumprobiert. Bin jetzt bei diesem Code gelandet. Ich weiß jetzt auch woher die eigenartigen Strom Werte kommen. Beim umschalten werden die Bilder nicht ausgetauscht, sondern überschrieben.

D.h. also im Hintergrund läuft z.B. der Strom Verbrauchszähler weiter und sobald der Wert dort mehr Ziffern anzeigt als der Wert im Vordergrundfenster, tauchen da dann seltsame Zahlenwerte auf.

Kann man das irgendwie realisieren, das beim umschalten die "alten" Screens ersetzt und nicht nur überschrieben werden?

-- ############## Anzeige Strom ###############
if (showvalue > -1024) and (showvalue < 1024) and getValue("consumption") >= 1000 then
lcd.drawChannel(148, 4, "consumption", DBLSIZE+1)
lcd.drawText(83, 2, "CNSP", SMLSIZE)
else
lcd.drawChannel(148, 4, "consumption", DBLSIZE)
lcd.drawText(83, 2, "CNSP", SMLSIZE)
end

if (showvalue > 0) then
lcd.drawChannel(148, 4, "current", DBLSIZE)
lcd.drawText(83, 2, "Curr", SMLSIZE)
end

-- ################# Anzeige Höhe (Baro) ######################

if (showvalue > -1024) and (showvalue < 1024) and (getValue("altitude") >= 400) then
lcd.drawNumber(156, 25, getValue("altitude"), XXLSIZE+1)
lcd.drawText(157, 56, "m", 0)
end
if (showvalue > -1024) and (showvalue < 1024) and (getValue("altitude") <= 400) then
lcd.drawNumber(156, 25, getValue("altitude"), XXLSIZE)
lcd.drawText(157, 56, "m", 0)
end


-- ##################### Anzeige Werte ###################

if (showvalue > 0) then
lcd.drawNumber(145, 23, getValue ("distance"), MIDSIZE)
lcd.drawPixmap(82, 21, "/SCRIPTS/BMP/distkl.bmp")
lcd.drawText(146, 28, "m", SMLSIZE, LEFT)

lcd.drawNumber(145, 38, getValue("altitude"), MIDSIZE)
lcd.drawPixmap(82, 34, "/SCRIPTS/BMP/hgt.bmp")
lcd.drawText(146, 43, "m", SMLSIZE, LEFT)

lcd.drawNumber(145, 52, getValue("gps-speed"), MIDSIZE)
lcd.drawPixmap(82, 50, "/SCRIPTS/BMP/tacho.bmp")
lcd.drawText(146, 57, "km/h", SMLSIZE, LEFT)
end
 

JoeBuster

Erfahrener Benutzer
Gleich die nächste doofe Frage hinten dran: Wie kann ich einen Logischen Schalter (L16 = 115) abfragen? "getvalue" funktioniert nicht.

OK, ich beantworte mir die Frage gerade mal selber - da ich es jetzt doch hinbekommen habe :D

local telemetrie = getValue("115")
if telemetrie > 0 then
lcd.drawPixmap(170, 2, "/SCRIPTS/BMP/save.bmp")
end
 
Zuletzt bearbeitet:

JoeBuster

Erfahrener Benutzer
So dann mache ich mal weiter mit meiner Fragerunde :rot:

Im Taranis eigenen Menü werden mir die GPS Koordinaten in Grad-Minuten ausgegeben. Verwende ich aber den Aufruf

getValue("latitude")
getValue("longitude")

bekomme ich die Angaben in - keine Ahnung wie das heißt - einer "endlos" langen Zahlenreihe. Was muss ich machen, damit die GPS Koordinaten auch in LUA als Grad Minuten ausgegeben werden?
 

coolchaos

Erfahrener Benutzer
Ja @JoeBuster

Leider kommen die Daten unformatiert da raus

Du musst Sie leider erst umwandeln "In "Bogen-Stunden, Bogenminuten und Bogensekunden"
____________________________________________________________________________________________

:cool:
--Latitude Longitude -Start GPS-Koordinaten (nach Share Alike)
function split_raw_gps(in_c) -- errechnet die Bogenminuten/sekunden aus den Nachkommastellen einer Koordinate
return ((math.abs(in_c)-math.abs(math.floor(in_c)))*60)
end


function format_raw_gps(in_coordinate, in_longlatt)
local hour = 0.0
local minute = 0.0
local second = 0.0
local orientation = ""
local out = ""
if in_coordinate > 0 then -- Quadrant auf dem Globus aus den Koordinaten erschließen
orientation = (in_longlatt=="long" and "E" or "N")
else
orientation = (in_longlatt=="long" and "W" or "S")
end


hour = math.abs(math.floor(in_coordinate)) -- Bogenstunde
hour = (hour<10 and " "..hour or hour) -- für Bogen-h <10 einen Platzhalter anfügen
minute = split_raw_gps(in_coordinate) -- Bogenminute aus den Nachkommastellen der Koordinaten errechnen
second = math.abs(split_raw_gps(minute)) -- Bogensekunde aus den Nachkommastellen der Bogenminute errechnen
minute = math.abs(math.floor(minute)) -- Bogenminute als Ganzzahl konvertieren
second = math.floor(second*1000)/1000 -- Bogensekunde mit drei Dezimalstellen konvertieren (lua hat keine Rundungsfunktion)
out = hour .. orientation .. minute .. "'" .. second .. '"'
return out
-- Funktioniert leider nicht - vielleicht bekommt es ja jemand besser hin:
--return string.format("%s%s%s'%s%c",hour,orientation,minute,second,34)
end


gps_raw_long = getValue("longitude") -- Längengrad vom Kopter (dezimal)
gps_raw_latt = getValue("latitude") -- Breitengrad vom Kopter (dezimal)


-- Konvertierung der Raw-Daten in gewöhnliche Koordinaten-Darstellung:
if math.floor(gps_raw_latt)==0 and math.floor(gps_raw_long)==0 then
lcd.drawText(gvorn+4 ,oben+4, " KEIN GPS! ", SMLSIZE+ BLINK)
else
lcd.drawText(gvorn ,oben, format_raw_gps(gps_raw_long, "long"), SMLSIZE)
lcd.drawText(gvorn,oben+8, format_raw_gps(gps_raw_latt, "latt"), SMLSIZE)
end

____________________________________________________________________________________________
:eek:
Sieht dann so aus tele-gps.jpg
 
Zuletzt bearbeitet:

JoeBuster

Erfahrener Benutzer
@ coolchaos -VIELEN VIELEN DANK !!!

Ich habe es gleich mal für meine Verhältnisse angepasst und eingebaut. So langsam nimmt der LUA Bildschirm Gestallt an. Auch wenn ich mir viele Dinge aus anderen schon bestehenden LUA Bildern zusammen "gemopst" habe, so ist es für mich, wie man an meinen Fragen oben sehen kann, nicht so ganz trivial diese ganzen Code Fetzen zu einem Bild zusammen zu setzen.

Wenn es dann fertig ist, werde ich es hier posten. Wahrscheinlich werden die Experten wegen meinem "Source Code" die Hände über den Kopf zusammen schlagen, aber ich bin ganz happy das ich das so einigermaßen auf die Kette bekommen habe.

Hier mal eine kleine Vorschau auf die Bilder: Ziel war es in EINEM Skript via 3-fach Schalter so viel wie möglich da zu stellen. Ich habe dazu den Schalter "SA" verwendet. Aktuell werden im Mittelteil entsprechend der Schalterstellung verschiedene Werte angezeigt. Das RSSI Bild soll in dieses Vorhaben ebenfalls mit eingebunden werden und mir dort z.B. die Funktionen des 6-fach Schalters anzeigen - aber soweit bin ich noch nicht.

Auch habe ich aktuell noch ein paar Schwierigkeiten mit der Funktion IF-THEN-ELSE. Interessanter Weise funktioniert das bei mir nicht - fragt nicht warum - ich habe keine Ahnung. Somit muss ich alle IF_THEN_ELSE Funktionen in zwei mal IF -THEN -END mit entsprechender Negierung umwandeln. Anders geht es bei mir irgendwie nicht.

Wie geagt, eine saubere Programmierung sieht sicherlich anders aus :

telem1_2.jpg

telem1_1.jpg

telem1_0.jpg
 

coolchaos

Erfahrener Benutzer
Hi @JoeBuster

Das kann sich doch schon GUT sehen lassen.

Lass die Hände über dem Kopf zusammenschlagen wer will.
Wichtig für Dich muss es sein was zur Funke zu bringen was läuft
und auf was Du Dich verlassen kannst.


Codeoptimierung kann mann dann immer noch machen.
Und da werden die Meinungen weit auseinander gehen, was Optimierung angeht.

Das "Zusammenmopsen" ..... ist denke ich ok ... warum das Rad 2x erfinden .... nur so kommen wir
immer wieder ein Stück weiter nach vorn .... Im Hause LUA-OpenTX

Ich habe nichts dagegen wenn aus "meinen" Scripten jemand was mopst.
 
Zuletzt bearbeitet:

JoeBuster

Erfahrener Benutzer
.... und weil ich ja noch nicht fertig bin, gleich die nächste Frage :rolleyes:

Kann man mit LUA einen Treppenhauslicht Schalter programmieren? Also Taster "SH" an der Funke betätigen löst unter LUA einen Impus aus welcher dann für eine frei einstellbare Zeit im Anzeigebild (nicht durch die Funke - das ist klar), gehalten wird. Ist die Zeit abgelaufen, erlischt auf dem Bildschirm das gesetze Zeichen/Pixel.

Wenn sowas gehen sollte, gibt es dafür einen Code Schnipsel :cool:
 
FPV1

Banggood

Oben Unten