Vous n'êtes pas identifié(e).
@ Pat :
Mon RadioPanel.lua ne pouvait pas fonctionner, et pour cause ! Les valeurs testées étaient erronées ...
Je m'étais basé sur un document déjà cité ici, et trouvé sur le forum de Pete. Du coup, un utilisant les logs de fsX, plus la méthode de la calculatrice ( ... merci ! ...) j'ai pu faire un too des valeurs à scanner :
Bouton Valeur Bit
Commandes du haut
Com1 129 0+7 2^0 + 2^7 = 1 + 129 = 129
Com2 130 1+7 2^1 + 2^7 = 2 + 128 = 130
Na1 132 2+7 2^2 + 2^7 = 4 + 128 = 132
Nav2 136 3+7 2^3 + 2^7 = 8 + 128 = 136
Adf 144 4+7 2^4 + 2^7 = 16 + 128 = 144
Dme 160 5+7 2^5 + 2^7 = 32 + 128 = 160
XPDR 192 6+7 2^6 + 2^7 = 64 + 128 = 192
Outer ho 524417 1+7+19 2^1 + 2^7 + 2^19 = 1 + 128 + 524288 = 524417
Outer aho 262273 1+7+18 2^1 + 2^7 + 2^18 = 1 + 128 + 262144 = 262273
Inner ho 65665 1+7+16 2^1 + 2^7 + 2^16 = 1 + 128 + 65536 = 65665
Inner aho 131201 1+7+17 2^1 + 2^7 + 2^17 = 1 + 128 + 131072 = 131201
StdBy 16576 6+7+14 2^6 + 2^7 + 2^14 = 64 + 128 + 16384 = 16576Commandes du bas
Com1 129 0+7 2^0 + 2^7 = 1 + 128 = 129
Com2 257 0+8 2^0 + 2^8 = 1 + 256 = 257
Na1 513 0+9 2^0 + 2^9 = 1 + 512 = 513
Nav2 1025 0+10 2^0 + 2^10 = 1 + 1024 = 1025
Adf 2049 0+11 2^0 + 2^11 = 1 + 2048 = 2049
Dme 4097 0+12 2^0 + 2^12 = 1 + 4096 = 4097
XPDR 8193 0+13 2^0 + 2^13 = 1 + 8192 = 8193
Outer ho 4194433 0+7+22 2^0 + 2^7 + 2^22 = 1 + 128 + 4194304 = 4194433
Outuer aho 8388737 0+7+23 2^0 + 2^7 + 2^23 = 1 + 128 + 8388608 = 8388737
Inner ho 2097281 0+7+21 2^0 + 2^7 + 2^21 = 1 + 128 + 2097152 = 2097281
Inner aho 1048705 0+7+20 2^0 + 2^7 + 2^20 = 1 + 128 + 1048576 = 1048705
StdBy 32897 1+7+15 2^1 + 2^7 + 2^15 = 2 + 128 + 32768 = 32898
Il y a deux valeurs qui ne coîncident pas, C'est le Stand-by du bas ...
En revanche, dans la console de linda (et dans le log FSX), les valeurs sont correctes si je "descends" de com1 à xpdr. Mais si je "remonte" de xpdr à com1, un décalage se crée.
Par exemple si je suis sur COM2, c'est NAV1 qui s'affiche. Et quand je reviens en COM1, c'est l'affichage du knob du haut qui s'affiche ...
Mon script RadioPanel.lua :
Dernière modification par Oliver77 (14-11-2014 17:14:39)
Hors ligne
@ Pat :
Tu m'en vois très heureux car sans matériel pour pouvoir tester (malgré la proposition de Phillipe), j'en étais resté aux conjectures.
C'est agaçant !!! Même sans le matériel tu y arrives ... ...
Moi je l'ai sous la main et je rame pour allumer trois pauvres leds !
Dernière modification par Oliver77 (14-11-2014 17:21:46)
Hors ligne
@ Pat :
Tu m'en vois très heureux car sans matériel pour pouvoir tester (malgré la proposition de Phillipe), j'en étais resté aux conjectures.
C'est agaçant !!! Même sans le matériel tu y arrives ... ...
Moi je l'ai sous la main et je rame pour allumer trois pauvres leds !
Pendant que je t'ai sous la main pour effectuer les tests, peux-tu me dire si tu allumes les Led en rouge et vert à la fois (valeur 63 pour le deuxième octet) celles-ci changent-elles réellement de couleur? (Peut-être en ambre).
En partant de ce principe, je pense qu'on peut gérer ton BIP panel directement en LUA. C'est pas totalement gagné et il faudra sûrement plusieurs tests mais c'est fort intéressant.
Concernant ton RadioPanel.lua, j'ai besoin de connaître la façon dont le HIDradio.lua stocke les valeurs renvoyées (pourquoi ne pas prendre l'offset 0x66C4).
Pour le moment, je ne vois pas trop d'incohérence (quoique) mais il faut que je me fasse une idée de comment sont gérés les switchs. Je demanderai sans doute d'autre précision (à moins que Philippe ne me prête un Radio Panel ).
Bonne continuation.
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Bonjour Olivier,
Il y a un problème avec ton script. Tu compares plusieurs bits en même temps.
Par exemple dans cette ligne : StdBy 32897 1+7+15 2^1 + 2^7 + 2^15 = 2 + 128 + 32768 = 32898
le bit 1 est à 1 (le bouton haut est sur com2), le bit 7 est à 1 (le bouton bas est sur com1) et le bit 15 est à 1 (appui sur le StandBy du bas.
Suivant la position des boutons, tu n'auras jamais le même résultat.
Le bon tableau est le suivant :
Bouton Valeur Bit
Commandes du haut
Com1 1 0
Com2 2 1
Nav1 4 2
Nav2 8 3
Adf 16 4
Dme 32 5
XPDR 64 6
Outer ho 524288 19
Outer aho 262144 18
Inner ho 65536 16
Inner aho 131072 17
StdBy 16384 14Commandes du bas
Com1 128 7
Com2 256 8
Nav1 512 9
Nav2 1024 10
Adf 2048 11
Dme 4096 12
XPDR 8192 13
Outer ho 4194304 22
Outuer aho 8388608 23
Inner ho 2097152 21
Inner aho 1048576 20
StdBy 32768 15
Edit : Le copier-coller a supprimer la mise en colonne (dommage).
J'ai modifié ton script, fais des essais et dis-moi quoi. On va s'amuser quand il faudra mettre des fonctions derrière tout cela.
Dernière modification par Pat_59 (15-11-2014 10:50:12)
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Bonjour Patrick,
Pendant que je t'ai sous la main pour effectuer les tests, peux-tu me dire si tu allumes les Led en rouge et vert à la fois (valeur 63 pour le deuxième octet) celles-ci changent-elles réellement de couleur? (Peut-être en ambre).
Je viens de faire le test. La couleur dominante est le vert, et un semblant de rouge (ambre) très faible ...
Précision complémentaire : Les leds s'allument les temps d'une boucle. La commande en elle même ne fonctionne pas comme un interrupteur ON/OFF
Je teste le reste cet après midi.
Amitiés, et bon week-end.
Hors ligne
Les leds s'allument les temps d'une boucle. La commande en elle même ne fonctionne pas comme un interrupteur ON/OFF
Tu veux dire qu'il faut sans arrêt boucler sur l'instruction com.writefeature (dev, s, wrf) pour que les diodes restent allumées?
C'est assez génant parce que, tant que le programme boucle il ne fait pas autre chose.
J'ai modifié ton script de test des Led pour voir si cela confirme tes dires. Veux-tu essayer le mien?
Sans faire de boucle, les led rouges devraient s'allumer 10s puis les vertes également 10s pour enfin s'éteindre.
test = 0
dev = ipc.get("dev")
wrf = ipc.get("wrf")
ipc.sleep(1000)if test == 0 then
ipc.display('red',10)
s = string.char(0,56)
com.writefeature (dev, s, wrf)
ipc.sleep(10000)
test = test+1
endif test == 1 then
ipc.display('green',10)
s = string.char(0,7)
com.writefeature (dev, s, wrf)
ipc.sleep(10000)
test = test+1
endif test == 2 then
ipc.display('Off',10)
s = string.char(0,0)
com.writefeature (dev, s, wrf)
ipc.sleep(1000)
end
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Patrick,
J'ai testé ton script concernant les leds. Résultat :
Quand RED s'affiche, elles flashent rouge puis séteignent.
Quant GREEN s'affiche, elles flashent vert puis s'éteignent
OFF s'affiche, tout est déjà éteint.
Quant à ton script RadioPanel.lua ... Il fonctionne parfaitement. Du coup, si j'ai bien compris la conversion de la valeur en bit grâce à ta méthode, j'avoue ne pas saisir ce qui te permet de déterminer que dans le cas ou 2 bits sont modifiés pour un bouton, lequel des deux concerne l'action en cours ?
Erratum : Les boutons de sélection de fréquences ne fonctionnent pas à tous les coups. Cela dépend de la position du sélecteur (Com1, com2 ...)
Edit : a l'aide de ton script, et avec le code concernant les leds, j'ai pu afficher des valeurs pour COM1.
Ce code :
function TLS_COM1()
testVar = ipc.readUD(0x3358)
if logic.And(testVar,1) ~= 0 then
ipc.display('com1_haut',10)
devradio = ipc.get("devradio")
wrfradio = ipc.get("wrfradio")
s=string.char(0,242,240,208,240,240,241,241,209,241,241,242,242,210,242,242,243,243,211,243,243,0,0)
com.writefeature (devradio, s, wrfradio)
ipc.log('com1_haut')
end
end
Donne ceci :
[img align=c]http://www.fsfiles.org/flightsimshotsv2/images/2014/11/15/CoM2l.jpg[/img]
Dernière modification par Oliver77 (15-11-2014 19:19:15)
Hors ligne
Bonsoir Olivier,
Concernant les Led du switch panel, tu avais donc raison. Je suis malgré tout surpris. Est-ce qu'avec le logiciel fourni, ces diodes ne peuvent rester allumées? Si non, j'en vois pas l'intérêt.
Si, avec le driver Saitek, c'est possible de les laisser allumer, on a sans doute raté quelque chose. Si c'est le cas, cela doit se passer au niveau du premier caractère envoyé (dans notre cas le 0) et il faudra tester d'autres possibilités.
Pour le RadioPanel.lua, je t'en parlerai demain mais je t'avais prévenu que cela se compliquerait.
En attendant, tes premiers essais d'affichage sont plutôt bons. As-tu essayé d'afficher une fréquence réelle sur un des afficheurs (ex : 122.05 en active et 122.25 en stand-by sur Com1 sur l'afficheur du haut)?
Je pensais attaquer les affichages une fois que les boutons rotatifs auraient été programmés.
Nous ne sommes pas "sortis de l'auberge" mais c'est là que ça devient intéressant.
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Bonsoir Patrick,
Le rouge de la honte me monte aux joues ! Au cours de mes essais sur les LEDS, je me suis demandé si FSX n'écrasait pas mon paramétrage, alors que je fais tous mes tests avec mon C172 à train fixe ... argh ! Si.
Au premier vol chargé avec le beech baron par défaut, les trois leds vertes s'allument et restent allumées ...
En attendant, tes premiers essais d'affichage sont plutôt bons. As-tu essayé d'afficher une fréquence réelle sur un des afficheurs (ex : 122.05 en active et 122.25 en stand-by sur Com1 sur l'afficheur du haut)?
Oui j'affiche ces fréquences avec ces deux lignes de code :
s=string.char(0,240,240,208,240,240,241,241,209,241,241,242,242,210,242,242,243,243,211,243,243,0,0)
com.writefeature (devradio, s, wrfradio)
Explications des valeurs :
Code Display
0-9 0-9
10-15 <blank>
This repeats in modulo 16 until a character code of 207.208-217 0.-9. (decimal dot set)
218-223 .
224-239 -
240-248 0-9
250-255 <blank>
En revanche, Via le bouton du ACT/STBY, je ne parviens à les intervertir ...
C'est clair qu'on n'est pas sortis de l'auberge, et que je vais ramer encore quelques heures. Maisc'est franchement passionant ...
Encore, merci. Amitiés.
Hors ligne
Bonjour Olivier,
Rassure-moi, quand tu fais tes tests, tu n'as aucun driver chargé ni Saitek ni Spad.
Je reviens vers toi dans la soirée.
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
=8
Non non, je te rassure ! Les drivers Saïtek ont été virés sur le champ et SPAD est inactif ! Je sais que je suis un newbee de base, mais quand même !!!
Ceci dit, tu as raison, on ne sait jamais ... Dans un grand moment de fatigue ...Ou le nez dans le guidon ...
Passe un bon dimanche, et passe quand tu peux !
Hors ligne
une bonne partie de la journée à grenouiller sur le web pour un résultat décevant.
Objectif ? Lire la fréquence COM1 de FSX pour l'afficher sur le Radio Panel.
La lecture :
com1_frq = ipc.readUW(0x034E)
Me donne une valeur Décimale. Alors je la convertis grâce à la fonction ci-dessous (pas de moi ...)
function DEC_HEX(IN)
local B,K,OUT,I,D=16,"0123456789ABCDEF","",0
while IN>0 do
I=I+1
IN,D=math.floor(IN/B),math.mod(IN,B)+1
OUT=string.sub(K,D,D)..OUT
end
return OUT
end
Du coup j'exécute la commande :
test = DEC_HEX(com1_frq)
J'obtiens dans mon exemple, 3425. Ce qui est cohérent, puisque le premier chiffre est implicitement 1.
Donc la fréquence que j'obtiens ainsi est 134,25 qui est bien celle affichée sur le com1 de FSX.
là où je sèche complètement, c'est comment injecter ces valeurs dans cette ligne de commande, représentées ici par v1,v2,v3,v4 :
s=string.char(0,241,v1,v2,v3,v4,241,241,209,241,241,242,242,210,242,242,243,243,211,243,243,0,0)
car quoi que je fassed, j'obtien un message d'erreur :
[E] *** LUA Error: ...\Microsoft Flight Simulator X\Modules\RadioPanel.lua:134: bad argument #3 to 'char' (number expected, got nil)
Très naîvement, j'ai testé ce code, où test est la valeur extraite (3425). Il va de soit qu'en plus de faire de très nombreuses et à mon avis superflues lignes de code, la valeur v1 en l'état est refusée dans le string.char ...
if string.sub(test, 1) == 0 then
v1 = 240
elseif string.sub(test, 1) == 1 then
v1 = 241
elseif string.sub(test, 1) == 2 then
v1 = 242
elseif string.sub(test, 1) == 3 then
v1 = 243
elseif string.sub(test, 1) == 4 then
v1 = 244
elseif string.sub(test, 1) == 5 then
v1 = 245
elseif string.sub(test, 1) == 6 then
v1 = 246
elseif string.sub(test, 1) == 7 then
v1 = 247
elseif string.sub(test, 1) == 8 then
v1 = 248+0
elseif string.sub(test, 1) == 9 then
v1 = 249
end
Tout ça pour dire que j'y travaille ... c'est pas brillant, mais je creuse ...
Pour aujourd'hui je me mets en stand-by ... je n'y vois plus clair, et toutes ces infos lues aujourd'hui se mélangent lamentablement !
Amitiés.
Dernière modification par Oliver77 (16-11-2014 18:30:29)
Hors ligne
Bonsoir,
Ta boucle de test pour v1 est fausse quand tu fais string.sub(test,1) le résultat (si test = 1234) est 1234. Pour isoler le premier chiffre il faut écrire string.sub(test,1,1), string.sub(test,2,2) pour le deuxième etc...
On pourrait alors écrire v = tonumber(string.sub(test,1,1)) puis
v1= 240 + v
Ou encore sur une seule ligne: v1 = 240 + tonumber(string.sub(test,1,1))
L'instruction tonumber permet de transformer une chaîne (string) en nombre pour pouvoir faire des opérations arithmétiques. Quand on utilise une instruction "string", le résultat est toujours sous forme de chaîne. Dans notre exemple, si le résultat de string.sub(test,1,1) est 1 que l'on place dans la variable v par exemple.
Si on pose if v == 1, le résultat sera "False". À l'inverse si on pose if v == "1" donne True . Il faut donc remettre la variable sous forme numérique en utilisant l'instruction "tonumber". L'inverse peut-être également fait avec l'instruction "tostring".
Ta valeur v1 sera alors un nombre et non une chaîne considérée comme un ou des caractères.
En procédant de la sorte, tu initialises tes variables v1, v2, v3 et v4 en 4 lignes de programme (on peut faire encore mieux, pas dans ce cas-ci toutefois, en utilisant des tables ou tableaux).
Ton message d'erreur indique que le programme attend un nombre pour v1 mais qu'il obtient "nil" (valeur vide ou non définie). Si tu utilisais ta boucle de test qui était fausse, il était normal que v1=nil.
Il faudrait que je vois l'ensemble du code.
PS : Utilise les ipc.log quand tu n'es pas sûr du résultat. Si tu avais mis un ipc.log (string.sub(test,1)) avant de lancer ta boucle, tu aurais tout de suite remarqué que ça ne pouvait pas fonctionner.
Dernière modification par Pat_59 (17-11-2014 00:08:03)
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Bonjour Patrick,
Merci pour tes explications. Bon, finalement, je n'étais pas si loin du but ! ça me rassure un peu...
Mes deux bourdes :
- string.sub(test, 1) au lieu de string.sub(test, 1, 1) ... Lecture inattentive de ma part. Et le pire c'est que d'ordinaire, je mets des ipc.display, des ipc.log, ou des MsgBox dans d'autres cas ... Pourquoi ne l'ais-je pas fait hier ? Mystère !
- J'avais déjà utilisé tonumber() dans mon code, mais sans succès. Par exemple, je faisais :
tonumber(v1) au lieu de tonumber(string.sub(test, 1, 1)). Je faisais une conversion après ... Mais pour moi cela revenait au même ...
Voici donc un code qui fonctionne parfaitement (en plus d'être considérablement simplifié !)
Je suis en train de programmer ça pour l'initialisation du module Saïtek quand le switch "Avionic" est basculé sur OFF. Essais ce soir ....
Hors ligne
Bonjour Olivier,
Bravo ! Après on pourra passer à l'étape suivante. Affichage des valeurs en fonction de la position du switch rotatif (Com1, Com2, etc...).
Peut-être un peu plus compliqué (encore que), modifier les fréquences en stand-by via les rotatifs et les envoyées dans FSX.
A te lire.
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Bonjour Patrick,
J'ai perdu beaucoup de temps à essayer de mettre place une boucle pour traiter les infos à envoyer au radiopanel après avoir mis en route l'avionique.
En gros ce que je voulais faire :
- Création d'un array avec la valeur des offsets désirés (par ex com1, com1stb, com2 et com2 stb)
- une boucle : Pour chaque valeur dans l'array, traitement de celui-ci et génération des variables.
- écriture des variables dans le module Saïtek
Tout cela dans le but de minimiser le code et les répétitions.
Voici ce que j'avais imaginé, et qui bien entendu ne fonctionne pas. Mais le principe y est :
ComArray = {ipc.readUW(0x034E), ipc.readUW(0x034E), ipc.readUW(0x3118),ipc.readUW(0x311C)}
for i, v in ipairs(ComArray) do
ipc.log(i,v)
-- Conversion en HEX
setval = DEC_HEX(v)
-- Extraction du 1er chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 1, 1))
v[i] = 240 + tonumber(string.sub(setval, 1, 1))
-- Extraction du 2eme chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 2, 2))
v[i] = 208 + tonumber(string.sub(setval, 2, 2))
-- Extraction du 3eme chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 3, 3))
v[i] = 240 + tonumber(string.sub(setval, 3, 3))
-- Extraction du 4eme chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 4, 4))
v[i] = 240 + tonumber(string.sub(com1, 4, 4))
end-- Définition de la variable s : Valeurs à écrire dans le module Saïtek
s=string.char(0,241,v1,v2,v3,v4,241,v5,v6,v7,v8,241,v9,v10,v11,v12,241,v11,v12,v13,v14,v15,0,0)
-- Envoi des valeurs dans le module Saïtek
com.writefeature (devradio, s, wrfradio)
end
N'y arrivant pas, j'ai donc écrit ceci, qui fonctionne parfaitement :
Ce code me semble très lourd et répétitif, même s'il a le mérite d'être"simple". En le collant ici, je viens de tilter que je pourrais appeler la fonction avec des paramètres, comme ceci :
RadioInit(com1,com1stb)
Après réflexion, la boucle n'était peut-être pas forcément une très bonne idée pour la suite. Je vais tester ça ! (ainsi que le passage de la fréquence Stand-by à Active) ... Je suis ambitieux aujourd'hui !
Il est aussi temps que je note précisément ce que je veux faire avec ce module Radio et les interactions que cela engendre avec FSX, pour ne pas partir dans tous les sens ...
Au plaisir de lire ton avis sur tout ça ...
PS : Je pensais t'avoir posé la question, mais je ne la retrouve pas : je reviens sur les valeurs retournées par le module. Qui sont l'addition de plusieurs bits. Moi j'étais parti sur la somme de ces bits, et toi tu en as sélectionné un. Comment détermines-tu, pour une valeur, le bit qui est réellement concerné par l'action ?
Dernière modification par Oliver77 (18-11-2014 07:55:57)
Hors ligne
Message Effacé
Dernière modification par dreambox62 (12-05-2015 09:33:46)
Hors ligne
Bonjour Olivier,
PS : Je pensais t'avoir posé la question, mais je ne la retrouve pas : je reviens sur les valeurs retournées par le module. Qui sont l'addition de plusieurs bits. Moi j'étais parti sur la somme de ces bits, et toi tu en as sélectionné un. Comment détermines-tu, pour une valeur, le bit qui est réellement concerné par l'action ?
Pour ce faire, il faut mémoriser la précédente valeur de l'offset. Puis on fait la différence entre les deux (nouvelle valeur - ancienne valeur). La différence nous donnera le bit modifié, pour retrouver le bit en question j'utilise les logarithmes.
Exemple:
Dif = testval - precedent_testval
if Dif > 0 then
bitmodif = math.log(Dif)/math.log(2)
else
bitmodif = math.log(math.abs(Dif))/math.log(2) -- On ne peut pas faire d'opérations logarithmiques
end sur des nombres négatifs
Si Dif est positif le bit est à 1 sinon le bit était à 1 et est revenu à 0.
Si Dif = 1024, bitmodif = 10 donc le bit n° 10 est passé sur 1.
Si Dif = -1024 bitmodif = 10, le bit n° 10 est revenu à 0
@ Philippe Je te souhaite également d'excellentes vacances. A bientôt.
Dernière modification par Pat_59 (18-11-2014 10:16:20)
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Petites corrections (en rouge) apportées à ton script plus haut.
Tout fonctionne bien. Rajout d'une petite boucle pour contrôler les résultats.
function Radio_Init ()
ComArray = {ipc.readUW(0x034E), ipc.readUW(0x0311A), ipc.readUW(0x3118),ipc.readUW(0x311C)}
v = {}
j = 0
for i, w in ipairs(ComArray) do
-- Conversion en HEX
setval = DEC_HEX(w)
ipc.log (setval)
-- Extraction du 1er chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 1, 1))
v[i+j] = 240 + tonumber(string.sub(setval, 1, 1))
-- Extraction du 2eme chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 2, 2))
v[i+1+j] = 208 + tonumber(string.sub(setval, 2, 2))
-- Extraction du 3eme chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 3, 3))
v[i+2+j] = 240 + tonumber(string.sub(setval, 3, 3))
-- Extraction du 4eme chiffre et conversion "saïtek"
ipc.log(string.sub(setval, 4, 4))
v[i+3+j] = 240 + tonumber(string.sub(setval, 4, 4))
j=j+3
end
for i = 1,16 do
ipc.log ("v"..i.." = "..v[i])
end
end
Tiens, ma fonction convertisseur décimal --> hexadécimal :
function DEC_HEX(Value)
HexVal = string.format("%X", Value)
HexVal = HexVal..""
return (HexVal)
end
L'inverse (HEX -> DEC) s'obtient tout simblement comme ceci : Dec = tonumber(Hex,16).
Dernière modification par Pat_59 (18-11-2014 13:16:16)
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Édit au précédent post.
Je ne t'ai pas donné d'explications sur les corrections apportées. Les voici:
L'offset en rouge correspond au COM1 stby , tu avais mis deux fois le COM1.
Tu vas stocker tes résultats dans une table v et tu n'as pas initialisé cette table (v{})
Dans ta boucle tu utilisais v pour y mettre la valeur provenant de ComArray or tu utilises déjà v pour y mettre les résultats. J'ai donc modifié en utilisant w.
Ensuite tu n'incrémentais pas les valeurs de i. i ne pourra pas dépasser le nombre d'éléments placés dans la table ComArray (ici 4). Il faut donc ruser, le pourquoi de l'utilisation de "j" qui augmente "artificiellement" la valeur de i afin de construire une table "v" avec toutes les valeurs nécessaires.
Voilà , je pense que c'est tout. En tout cas, bravo, tu progresses à pas de géant.
Édit: l'instruction "ipc.log(i,v)" que tu avais dans ton script, ne fonctionnera pas (seul "i" sera affiché, il n'y aura pas d'erreur),
Il faut concaténer les infos vouliues. Exemple ( pour que cela soit clair, je nomme les variables): ipc.log("i:"..i.." v:"..v).
Dernière modification par Pat_59 (18-11-2014 16:50:29)
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Bonjoour Patrick,
Merci pour le code corrigé et expliqué; C'est vraiment une aide très précieuse ...
Je n'ai rien pu faire hier faute de temps. De plus, j'ai pensé à quelques détails concernant mon approche de la gestion du Radio Panel :
En partant du principe que la ligne de code qui permet de configurer son affichage tient compte des 4 valeurs (2 Active / 2 stand-by) :
s=string.char(0,241,v1,v2,v3,v4,241,v5,v6,v7,v8,241,v9,v10,v11,v12,241,v11,v12,v13,v14,v15,0,0)
Donc, si à l'aide des bouton rotatifs du haut, je modifie la Com1 Stand-By, je dois avant tout lire les valeurs Com1 active, nav1 active et nav2 stand-by, pour pouvoir les réutiliser dans la fameuse ligne de commande, sans les modifier.
Cela implique que je dois savoir sur quelles position sont mes deux selecteurs (com1, com2, ...) pour pouvoir connaître le format des infos à passer. Il me faudrait donc initialiser deux variables globales indiquant l'état des deux sélecteurs.
A mettre en oeuvre avec ton code (après lecture plus pointue et compréhension !)
Amitiés.
Et encore merci pour le temps consacré.
Olivier.
Hors ligne
Bonjour Olivier,
En effet, pour pouvoir envoyer la bonne séquence, il va falloir prendre en compte la position des sélecteurs de gauche, haut et bas.
Ton idée de ComArray m'a séduit mais il faudrait en définir plusieurs en fonction de ce que j'ai dit précédemment.
D'ailleurs qu'en est-il de l'affichage quand le sélecteur est en position DME ou en position XPDR?
Je ne comprends pas très bien la logique de Saitek. Il me semblait plus simple de mettre en haut les "1" (Com1, Nav1, Adf1,DME1) et les "2" en bas. Du coup, on se retrouve avec des fonctions dupliquées. On ne peut pas mettre deux fréquences actives sur le même appareil donc si les deux sélecteurs sont sur la même position (par exemple Com1), les deux lignes (haut et bas) doivent afficher les mêmes informations. Ainsi si l'on modifie l'une des deux, l'autre est également modifiée (à moins qu'il ne soit possible de mémoriser deux fréquences différentes en stand-by mais ce n'est pas la réalité).
En attendant, continuons sur la lancée.
Amicalement Patrick[img align=D]http://www.pilote-virtuel.com/img/members/8639/P3DV3.jpg[/img]
Configuration: Intel I7 3770k OC 4,4 GHz, CM Asrock Z77 Extrem 9
8Gb Gskill DDR3 2133, CG Nvidia 980 GTX TI 6Gb, Windows 8 64bits
P3D V3.3, X52 Pro, CH Product "Éclipse", TIR 5 etc....
Hors ligne
Patrick,
Je te ferai un petit topo sur le DME (que je n'ai pas encore utilisé) et le XPDR.
Quant à la logique de Saïtek, peut-être est-ce en vue de cockpits bien "garnis" avec de nombreux modules radio, ce qui permet d'en dédier un aux COM, un aux NAV, etc... ?
Amtiés.
Hors ligne
Patrick,
Je te ferai un petit topo sur le DME (que je n'ai pas encore utilisé) et le XPDR.
Quant à la logique de Saïtek, peut-être est-ce en vue de cockpits bien "garnis" avec de nombreux modules radio, ce qui permet d'en dédier un aux COM, un aux NAV, etc... ?
Amtiés.
C'est d'ailleurs ce qu je fais avec mes trois modules radio.... Lâchez pas!
-Comm 1 et Nav 1 pour le premier
-Comm 2 et Nav 2 pour le deuxième
-ADF et Transpondeur pour le dernier...
Dernière modification par Bobonhom (19-11-2014 18:48:12)
Hors ligne