LUA Scripting sur V2.1.x
+4
JimboFarrar
Eric84AMC
Kilrah
Heisenberg
8 participants
Page 3 sur 7
Page 3 sur 7 • 1, 2, 3, 4, 5, 6, 7
Re: LUA Scripting sur V2.1.x
J'essaye d'utiliser ce code sans succès pour le moment:
J'en suis là, ç'est Ok pour GPS-T mais je n'arrive à rien avec GPS-LL:
- Code:
void FrSkySportSensorGps::setData(float lat, float lon, float alt, float speed, float cog, uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
{
FrSkySportSensorGps::lat = setLatLon(lat, true);
FrSkySportSensorGps::lon = setLatLon(lon, false);
FrSkySportSensorGps::cog = cog * 100;
FrSkySportSensorGps::speed = speed * 1944; // Convert m/s to knots
FrSkySportSensorGps::alt = alt * 100;
FrSkySportSensorGps::date = setDateTime(year, month, day, true);
FrSkySportSensorGps::time = setDateTime(hour, minute, second, false);
}
uint32_t FrSkySportSensorGps::setLatLon(float latLon, bool isLat)
{
uint32_t data = (uint32_t)((latLon < 0 ? -latLon : latLon) * 60 * 10000) & 0x3FFFFFFF;
if(isLat == false) data |= 0x80000000;
if(latLon < 0) data |= 0x40000000;
return data;
}
J'en suis là, ç'est Ok pour GPS-T mais je n'arrive à rien avec GPS-LL:
- Code:
bool isDate=true;
_int32 data = 1; //YearorHour;
data <<= 8;
data |= 2; //monthOrMinute;
data <<= 8;
data |= 10; //dayOrSecond;
data <<= 8;
if(isDate == true) data |= 0xFF;
// return data;
bool isLat=true;
float latLon=45;
data = (_int32)((latLon < 0 ? -latLon : latLon) * 60 * 10000) & 0x3FFFFFFF;
if(isLat == false) data |= 0x80000000;
if(latLon < 0) data |= 0x40000000;
return data;
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
ça progresse du coté de github, mon cas alimente un appel ouvert par et il reprend mes arguments.
Donc il n'y aura peut-être plus besoin de coder-décoder pour utiliser un truc qui devrait être simple
projectkk2glider a écrit:commented 4 minutes agoWhy we don't have the simple possibility to enter until 6 cells values separated by a semicolumn in CELLS and a converter will crunch this string to create the right s.port format internally. And at the other side, getValue able to have a second optionnal parameter, an indice to get the simple value : eg getValue("Cels",4) to get the value of Cels number 4.
GPS-LL, 2 values, longitude;latitude, GPS-T, 6 values, H;M;S;Y;M;D. Something like that.
Nice idea, I've added it to the #2447
Donc il n'y aura peut-être plus besoin de coder-décoder pour utiliser un truc qui devrait être simple
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
Chouette, c'est une bonne idée que tu as eue.
Pour le getValue, j'imagine que ce serait mieux d'avoir un getCellValue("Cels", 4), au moins c'est ambiguité.
En attendant, ce n'est pas complqué de l'écrire en LUA :
Pour le getValue, j'imagine que ce serait mieux d'avoir un getCellValue("Cels", 4), au moins c'est ambiguité.
En attendant, ce n'est pas complqué de l'écrire en LUA :
- Code:
local function getCellValue(name, position)
local values = getValue(name)
if type(values) == "table" and position >= 1 and position <= #values then
return values[position]
else
return nil -- ou tout autre valeur indiquant qu'on n'a rien trouvé
end
end
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: LUA Scripting sur V2.1.x
dev.fred a écrit:... mais je n'arrive à rien avec GPS-LL ...
Le problème, c'est que GPS envoie la latitude et la longitude séparément.
Alors j'ai essayé d'envoyé deux valeurs, séparée par un espace, par une virgule, par un point-virgule ou même à tour de rôle mais ça ne marche pas :
Latitude 45° -> 0x019BFFC0
Longitude 45° -> 0x819BFCC0
[EDIT]
En fait ça marche à moitié, la latitude est bien renseignée mais la longitude pas du tout.
[/EDIT]
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: LUA Scripting sur V2.1.x
dev.fred a écrit:ça progresse du coté de github, mon cas alimente un appel ouvert par et il reprend mes arguments.projectkk2glider a écrit:commented 4 minutes agoWhy we don't have the simple possibility to enter until 6 cells values separated by a semicolumn in CELLS and a converter will crunch this string to create the right s.port format internally. And at the other side, getValue able to have a second optionnal parameter, an indice to get the simple value : eg getValue("Cels",4) to get the value of Cels number 4.
GPS-LL, 2 values, longitude;latitude, GPS-T, 6 values, H;M;S;Y;M;D. Something like that.
Nice idea, I've added it to the #2447
Donc il n'y aura peut-être plus besoin de coder-décoder pour utiliser un truc qui devrait être simple
Ahhh là, ce sera opé pour tous !!
Tu causais de synergie, ça paye.
Re: LUA Scripting sur V2.1.x
Sacre100 a écrit:En fait ça marche à moitié, la latitude est bien renseignée mais la longitude pas du tout.
Que nenni, ça peut marcher
1) Il faut utiliser la valeur décimale, la longitude n'aime pas l'hexadécimal
Longitude 45 => -2120483648 au lieu de 0x819bfcc0
Latitude 45 => 27000000 au lieu de 0x19bfcc0
2) Tu rentres la 1ere, le GPS reste muet mais l’Édition du capteur la voit bien, mais dés que tu rentres, à la place, la 2eme valeur le GPS affiche le tout et l"*" clignote:
Les devs ont beau mettre plein d'obstacles pour qu'on ne puisse pas simuler les capteurs à valeurs multiples, mais rien ne résiste !
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
dev.fred a écrit:...
Les devs ont beau mettre plein d'obstacles pour qu'on ne puisse pas simuler les capteurs à valeurs multiples, mais rien ne résiste !
Trop fort, bravo, fallait le trouver.
Je me suis fait un petit utilitaire en Robol qui me fait les calculs et les copie dans le presse-papiers, ça simplifie la vie. Le voici si par hasard d'autres utilisent ce langage.
- Code:
lat: func [value [number! unset!]][
if unset? get/any 'value [value: attempt [to-decimal trim read clipboard://]]
if value [write clipboard:// mold value: 1073741823 and to-integer (value * 60 * 10000)]
value
]
lon: func [value [number! unset!]][
if unset? get/any 'value [value: attempt [to-decimal trim read clipboard://]]
if value [write clipboard:// mold value: (1073741823 and to-integer (value * 60 * 10000)) or -2147483648]
value
]
Sinon, voici un jeu test avec deux coordonnées converties distantes de 790m environ (celle où je décolle et celle quand je pose au trou)
- Code:
46.515826, 6.999142 -> 27909495 -2143284163
46.510178, 6.992867 -> 27906106 -2143287928
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: LUA Scripting sur V2.1.x
Hello tertous.
Ça avance bien tout ça, et je commence à arriver à sortir qqch de pas trop mal sur mon écran grâce à vos lumières.
Pour le moment, je n'en suis qu'au stade du script télémétrique, je n'ai pas encore étudié les autres types de scripts et j'ai encore une chose que je ne parviens pas à faire : Stocker une info sur l'écran.
Exemple : J'arrive à récupérer la position de mon manche de gaz et ma conso. Maintenant, je veux connaitre ma position de ce manche à un certain seuil de conso.
Concrètement avec un seuil défini à 20A :
Jusque là tout va bien, j'ai créé ma variable "positiongaz" mais comment la conserver pour une lecture après vol ? (hormis logs).
----
2eme question : Est-ce qu'un script télémétrique permet de faire un setGlobalVariable ? Je n'y parviens pas, et soit j'ai un problème de syntaxe, soit j'essaie quelque-chose d'impossible.
Et enfin, sans vouloir abuser, quelle est l'exacte formule de calcul pour obtenir ce résultat : [Longitude 45 => -2120483648 & Latitude 45 => 27000000]
Je ne pige pas comment vous avez fait.
Je sais que 3 questions dans un seul message ça fait beaucoup, la plus importante pour moi est la 1ere, et les 2 suivantes vont très vite m'être utiles, et comme c'est le sujet le plus approprié
Ça avance bien tout ça, et je commence à arriver à sortir qqch de pas trop mal sur mon écran grâce à vos lumières.
Pour le moment, je n'en suis qu'au stade du script télémétrique, je n'ai pas encore étudié les autres types de scripts et j'ai encore une chose que je ne parviens pas à faire : Stocker une info sur l'écran.
Exemple : J'arrive à récupérer la position de mon manche de gaz et ma conso. Maintenant, je veux connaitre ma position de ce manche à un certain seuil de conso.
Concrètement avec un seuil défini à 20A :
- Code:
if (CURRENT >2000) and (CURRENT <2100) then
local positiongaz = getValue(MIXSRC_Thr)
lcd.drawNumber(30, 30, positiongaz,0)
end
Jusque là tout va bien, j'ai créé ma variable "positiongaz" mais comment la conserver pour une lecture après vol ? (hormis logs).
----
2eme question : Est-ce qu'un script télémétrique permet de faire un setGlobalVariable ? Je n'y parviens pas, et soit j'ai un problème de syntaxe, soit j'essaie quelque-chose d'impossible.
Et enfin, sans vouloir abuser, quelle est l'exacte formule de calcul pour obtenir ce résultat : [Longitude 45 => -2120483648 & Latitude 45 => 27000000]
Je ne pige pas comment vous avez fait.
Je sais que 3 questions dans un seul message ça fait beaucoup, la plus importante pour moi est la 1ere, et les 2 suivantes vont très vite m'être utiles, et comme c'est le sujet le plus approprié
Re: LUA Scripting sur V2.1.x
Dans une VGn par exemple.1eme question : comment la conserver pour une lecture après vol ?
2eme question : Est-ce qu'un script télémétrique permet de faire un setGlobalVariable ? Je n'y parviens pas, et soit j'ai un problème de syntaxe, soit j'essaie quelque-chose d'impossible.
J'avais fait ça : on ajoute la ligne
--model.setGlobalVariable(gvar, flightmode, value)
model.setGlobalVariable(0, 0, percent)
flightmode= la phase de vol
gvar=0->VG1
Que l'on peut exploiter en utilisant le couple inters logiques/fonctions spéciales
Et enfin, sans vouloir abuser, quelle est l'exacte formule de calcul pour obtenir ce résultat : [Longitude 45 => -2120483648 & Latitude 45 => 27000000]
Je ne pige pas comment vous avez fait.
J'ai utilisé MVC++ express que j'ai installé pour créer l’environnement de build et le code je l'ai trouvé sur un forum.
Le code utilisé est très proche du C, ici, on n'est pas dans les concepts abstraits du C++, c'est lisible facilement.
Il est brut de pomme, pour avoir les 2 valeurs lat et lon, il faut faire islLat=true; noter la valeur de lat et isLat=false; et relancer pour noter lon!
- Code:
bool isLat=true;
float latLon=45;
_int32 data = 0;
data = (_int32)((latLon < 0 ? -latLon : latLon) * 60 * 10000) & 0x3FFFFFFF;
if(isLat == false) data |= 0x80000000;
if(latLon < 0) data |= 0x40000000;
return data
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
Il est possible de créer un ficher sur la carte SD et d'écrire/relire ce qu'on veut dedans depuis lua.
Kilrah- Messages : 2181
Date d'inscription : 28/01/2014
Localisation : Suisse
Re: LUA Scripting sur V2.1.x
Kilrah a écrit:Il est possible de créer un ficher sur la carte SD et d'écrire/relire ce qu'on veut dedans depuis lua.
Je ne connaissais pas, je vais aussi explorer ce domaine.
@Dev.fred : Je vais re-tenter les GV dans ce cas
Sinon, pour la formule, selon ta réponse, elle n'est pas possible à définir dans un doc Excel si je ne me trompe (?)
Re: LUA Scripting sur V2.1.x
Avant de faire un petit outil sous MVC++, j'ai regardé la fonction de décalage de mon excel qui est en version 2007 et je ne l'ai pas.
Par contre elle existe sous Excel 2016, Excel 2013, Excel Online, Excel 2016 for Mac, Excel for Mac 2011.
https://support.office.com/fr-ca/article/BITDECALG-BITDECALG-fonction-c55bb27e-cacd-4c7c-b258-d80861a03c9c
Maintenant, j'ai fini mon ciment ce matin, je peux ajouter le gps dans l'outil, je trouve ça fun
Par contre elle existe sous Excel 2016, Excel 2013, Excel Online, Excel 2016 for Mac, Excel for Mac 2011.
https://support.office.com/fr-ca/article/BITDECALG-BITDECALG-fonction-c55bb27e-cacd-4c7c-b258-d80861a03c9c
Maintenant, j'ai fini mon ciment ce matin, je peux ajouter le gps dans l'outil, je trouve ça fun
Dernière édition par dev.fred le Jeu 24 Sep 2015 - 19:28, édité 1 fois (Raison : orto)
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
Qui aurait pu être fait directement dans le simu de télémétrie
Kilrah- Messages : 2181
Date d'inscription : 28/01/2014
Localisation : Suisse
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
Je ne sais faire que des soins palliatifs .Kilrah a écrit:Qui aurait pu être fait directement dans le simu de télémétrie
Dernière édition par dev.fred le Ven 25 Sep 2015 - 3:02, édité 1 fois
dev.fred- Messages : 760
Date d'inscription : 07/02/2014
Localisation : Paimpol (22)
Re: LUA Scripting sur V2.1.x
Tu me trouverais casse-c... Si je te disais que tu approcherais la perfection si tu pouvais ajouter encore 4 à 6 cellules de plus de batteries pour couvrir 95% des besoins du modelisme ?
Oui ? Bon, je sors.
Blague à part, je te tire ma révérence pour cet utilitaire qui vient combler ce manque dans companion !
Bravo.
Oui ? Bon, je sors.
Blague à part, je te tire ma révérence pour cet utilitaire qui vient combler ce manque dans companion !
Bravo.
Re: LUA Scripting sur V2.1.x
Heisenberg a écrit:...
Jusque là tout va bien, j'ai créé ma variable "positiongaz" mais comment la conserver pour une lecture après vol ? (hormis logs).
...
La 2.1 offre quelques possibilités d'accès aux fichiers sur la SD :
- io.open(filename, options)
- io.seek(file, position)
- io.read(file)
- io.write(file, value)
- io.close(file)
Je ne peux pas t'en dire plus, je n'ai pas testé.
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: LUA Scripting sur V2.1.x
Ce topic et d'autres infos glanées ici et outre Atlantique m'a permit de réaliser un très joli écran de télémétrie en version bêta, pas encore totalement terminé, pas encore optimisé, et avec des jauges verticales, des aides aux réglages de modèle, des interactions etc... le tout en respectant une certaine organisation du script comme suggérée par Sacre100. Sans vous, je n'y serais pas arrivé, et je suis encore médiocre.
Pour garder une valeur affichée à l'écran, c'était tout simple, il suffisait de déclarer la locale variable avant la boucle et ensuite de jouer avec dans la boucle.
Erreur de débutant, tout mon script était dans la boucle, les variables étaient re-déclarées à chaque passage et il ne m'était pas possible de faire des moyennes, garder des maxima/minima etc... J'en apprend un peu plus chaque jour et ce n'est pas très compliqué, ça se rapproche un peu du Perl. Vos réponses sur la conservation d'une valeur m'a été instructive car ça va me permettre de faire des moyennes sur plusieurs vols, sur un pack de batterie qui va dans plusieurs zincs etc...
A présent, je recherche à faire une jauge de fuel basée sur le restant en mAh.
- Une variable fixe à 3000 pour un accu de 3000.
- Une variable proportionnelle de 100 à 0% selon ce qui a été pompé dans l'accu.
Je pensais y-être arrivé mais mon calcul est faux.
Au début, j'ai pensé simplement à ça :
... mais c'est bcp trop simple.
Je ne vois qu'une possibilité : C'est de sampler Curr et incrémenter une variable à chaque fois, ou me servir d'un timer pour ensuite recalculer.
J'ai donc encore 3 questions :
1) Suis-je passé à côté de qqch de plus simple déjà natif dans OpenTX pour le calcul de la jauge fuel ?
2) Comment savoir combien de fois est exécuté un Lua en 1 seconde ?
3) Comment savoir quelle quantité de ressources en mémoire et processeur que prend un Lua ? (Le mien fait + de 600 lignes et à l'air bien lourd car les annonces vocales sont saccadées)
Pour garder une valeur affichée à l'écran, c'était tout simple, il suffisait de déclarer la locale variable avant la boucle et ensuite de jouer avec dans la boucle.
Erreur de débutant, tout mon script était dans la boucle, les variables étaient re-déclarées à chaque passage et il ne m'était pas possible de faire des moyennes, garder des maxima/minima etc... J'en apprend un peu plus chaque jour et ce n'est pas très compliqué, ça se rapproche un peu du Perl. Vos réponses sur la conservation d'une valeur m'a été instructive car ça va me permettre de faire des moyennes sur plusieurs vols, sur un pack de batterie qui va dans plusieurs zincs etc...
A présent, je recherche à faire une jauge de fuel basée sur le restant en mAh.
- Une variable fixe à 3000 pour un accu de 3000.
- Une variable proportionnelle de 100 à 0% selon ce qui a été pompé dans l'accu.
Je pensais y-être arrivé mais mon calcul est faux.
Au début, j'ai pensé simplement à ça :
... mais c'est bcp trop simple.
Je ne vois qu'une possibilité : C'est de sampler Curr et incrémenter une variable à chaque fois, ou me servir d'un timer pour ensuite recalculer.
J'ai donc encore 3 questions :
1) Suis-je passé à côté de qqch de plus simple déjà natif dans OpenTX pour le calcul de la jauge fuel ?
2) Comment savoir combien de fois est exécuté un Lua en 1 seconde ?
3) Comment savoir quelle quantité de ressources en mémoire et processeur que prend un Lua ? (Le mien fait + de 600 lignes et à l'air bien lourd car les annonces vocales sont saccadées)
Re: LUA Scripting sur V2.1.x
1) Oui, faut utiliser la formule "consommation", pas "totalisation".
2) - 3) Page statistiques/debug
2) - 3) Page statistiques/debug
Kilrah- Messages : 2181
Date d'inscription : 28/01/2014
Localisation : Suisse
Re: LUA Scripting sur V2.1.x
Heisenberg a écrit:... Pour garder une valeur affichée à l'écran, c'était tout simple, il suffisait de déclarer la locale variable avant la boucle et ensuite de jouer avec dans la boucle.
Erreur de débutant, tout mon script était dans la boucle, les variables étaient re-déclarées à chaque passage et il ne m'était pas possible de faire des moyennes, garder des maxima/minima etc...
Juste pour préciser :
- les variables "local xxx ..." déclarées dans une fonction sont disponible uniquement dans la fonction et sont réinitialisées à chaque appel de la fonction.
- les variables "local xxx ..." déclarées en dehors des fonctions sont disponibles dans tout le script et sont crées au chargement du script.
- les variables "xxx ..." (celles qui ne sont pas déclarées "local", utilisées aussi bien à l'intérieur qu'à l'extérieur d'une fonction) sont disponibles dans tous les scripts chargés dans l'environnement LUA et sont crées au chargement du premier script qui les utilise.
Ce qu'il faut savoir, c'est que les model (mixer) script, function script et telemetry script sont chargés dans le même environnement LUA. Lorsqu'un one-time script (dont font partie les wizard), les model, function et telemetry script sont déchargés, l'environnement LUA est recrée et seul le one-time script est chargé dans cet environnement. L'opération inverse est effectuée lorsque le one-time script est terminé. C'est important de le savoir car cela permet de partager des variables globales (et donc échanger des données) entre les model, function et telemtry script, mais il n'est pas possible d'échanger des données entre ces script et un one-time script.
Autre chose qu'il faut savoir, c'est que si tu déclares une fonction qui fait usage d'une variable qui n'est pas encore déclarée "local", la fonction va toujours accéder à une variable globale. Puis si tu déclares "local" une variable avec le même nom dans ton script et que tu écris ensuite une fonction qui accède à cette variable, même si elle portent le même nom, ce sont deux variables différentes autrement dit, pour la fonction écrite avant la déclaration, elle va accéder à la variable globale et pour celles écrite après la déclaration, elle va accéder à la variable locale. Ceci s'explique par le fait que LUA "compile" le script au moment du chargement et résout l'accès aux variable à ce moment là, pas lors de l'exécution.
Exemple de code pour illustrer cela :
- Code:
local function f1 ()
return (v) -- v n'est pas encore déclarée alors retourne la variable globale
end
v = 1 -- initialise v globale avec 1
local v -- déclaration locale de v
local function f2 ()
return (v) -- v est déclarée local alors retourne la variable locale
end
v = 2 -- initialise v locale avec 2
print("f1 : ", f1()) -- Appel de f1() -> donne 1 (variable globale)
print("f2 : ", f2()) -- Appel de f2() -> donne 2 (variable locale)
Ce script va donner dans la console :
- Code:
f1 : 1
f2 : 2
J'en parle parce que cela m'est arrivé et que j'ai mis beaucoup, beaucoup de temps à comprendre où était le problème.
Sacre100- Messages : 1889
Date d'inscription : 30/11/2013
Age : 67
Localisation : Blonay - Suisse
Re: LUA Scripting sur V2.1.x
Salut à tous,
Question simple : comment récupérer pour un script la tension des batteries du Tx ? ça marchait pour 2.0.17 avec "tx-voltage", mais en 2.1.3, pas moyen.
J'ai écrit un joli script spécial planeur electrique qui reprend les différentes tension, les niveaux Rx et le vario pour 2.0.x, mais il me manque ça pour finir la conversion.
C'est un peu relou ce manque de doc, officielle ou pas, sur le scriptage en 2.1.x
Au secours !
Merci d'avance,
Jimbo
Question simple : comment récupérer pour un script la tension des batteries du Tx ? ça marchait pour 2.0.17 avec "tx-voltage", mais en 2.1.3, pas moyen.
J'ai écrit un joli script spécial planeur electrique qui reprend les différentes tension, les niveaux Rx et le vario pour 2.0.x, mais il me manque ça pour finir la conversion.
C'est un peu relou ce manque de doc, officielle ou pas, sur le scriptage en 2.1.x
Au secours !
Merci d'avance,
Jimbo
JimboFarrar- Messages : 22
Date d'inscription : 17/12/2014
Age : 64
Localisation : Bordeaux
Re: LUA Scripting sur V2.1.x
J'ai eu pas mal de soucis de script en 2.1.3, et la conclusion empirique a laquelle je suis arrivé, c'est que souvent, les capteurs avec 'unité' ("v", "mah",...) posent des soucis. Essaye de créer un capteur calculé qui reprend la valeur mais sans unité (mais je n'ai pas testé spécifiquement pour tx batt).
G
G
Invité- Invité
Page 3 sur 7 • 1, 2, 3, 4, 5, 6, 7
Page 3 sur 7
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum