SCRIPTS TARGET TM WARTHOG etc

Salle dedieé aux péripheriques : Joystick, palloniers, Track-Ir

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#101

Message par ivanwfr »

Juste en passant (trop tard pour faire des essais):

1 - if((Joystick[H3U] & Joystick[H3R]) & !(Joystick[H3U] | Joystick[H3R])

(Joystick[H3U] & Joystick[H3R]) devrait suffire pour savoir si H3 est en haut à droite.

... et méfiance avec les & et les | ... c'est une vraie merde! il s'agit en fait d'opérateurs binaires et non logiques! Pour faire bien, ça devrait être && et || ... pas supporté.

Du coup, faut tout ramener à des 1 et des 0 pour que ça marche presque pareil! Je dis presque parce qu'en C tout ce qui n'est pas 0 est vrai mais avec les opérateurs binaires, (2 & 1) ça fait FALSE ! '10' & '01' == '00'... marrant TARGET non ?


2 - Le if du main n'est pas évalué par le handler d'évènements mais juste une fois au lancement... ce qui revient à évaluer la séquence en passant... et elle ne sera plus jamais prise en compte pendant l'exécution du script.

En fait, il ne reste que ce que tu auras stocké quelque part avec des MapKey et ce n'est pas le cas de ce qui appelle la fonction H3UR().

...faudra pousser les essais mais cette idée des hat dans le coins est intéressante :cowboy:
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#102

Message par hellfrog »

ivanwfr a écrit :Juste en passant (trop tard pour faire des essais):

1 - if((Joystick[H3U] & Joystick[H3R]) & !(Joystick[H3U] | Joystick[H3R])

(Joystick[H3U] & Joystick[H3R]) devrait suffire pour savoir si H3 est en haut à droite.

... et méfiance avec les & et les | ... c'est une vraie merde! il s'agit en fait d'opérateurs binaires et non logiques! Pour faire bien, ça devrait être && et || ... pas supporté.

Du coup, faut tout ramener à des 1 et des 0 pour que ça marche presque pareil! Je dis presque parce qu'en C tout ce qui n'est pas 0 est vrai mais avec les opérateurs binaires, (2 & 1) ça fait FALSE ! '10' & '01' == '00'... marrant TARGET non ?
Non pas marrant du tout !!! mais je comprends mieux la cause de ce qui marchait pas dans mes scripts maintenant...
2 - Le if du main n'est pas évalué par le handler d'évènements mais juste une fois au lancement... ce qui revient à évaluer la séquence en passant... et elle ne sera plus jamais prise en compte pendant l'exécution du script.

En fait, il ne reste que ce que tu auras stocké quelque part avec des MapKey et ce n'est pas le cas de ce qui appelle la fonction H3UR().

...faudra pousser les essais mais cette idée des hat dans le coins est intéressante :cowboy:
[/quote]

des REXEC RNOSTOP ?
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#103

Message par ivanwfr »

Je vais jouer avec ça et je reviendrai ici avec ce que j'aurai pêché....
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#104

Message par hellfrog »

Code : Tout sélectionner

ActKey[color=#00ffff]([/color]KEYON[color=#00ffff]+[/color]REXEC[color=#00ffff]([/color][color=#fff5ee]10[/color], [color=#fff5ee]25[/color], [color=#ff8c00]"if(H3UR()==1){SEQ(CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USBKey_KP9, LOCK),CHAIN( LOCK+UP+USBKey_KP9, UP+USB_KP_PERIOD, LOCK));} "[/color], RNOSTOP));
avec ça on a une boucle de test permanente qui marche, sans Mapkey

par contre les tests marchent pas... tn histoire de & | sans doute

peut etre avec GetInputValue dans Hid.tmh ?



mais est-ce que ça marche en mode "combined" virtuel ?
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#105

Message par ivanwfr »

Après toute une série d'essais avec des CHAIN et des EXEC, j'ai réussi à faire marcher les tests avec le code ci-dessous. Mais ça le fera pas comme ça pour des raisons de multi-threading et de transitions ingérables au niveau des macro-commandes.

Le traitement des CHAIN, ActKey et EXEC est complètement hors de contrôle. Et comme on n'a pas affaire à un POV à 8 valeurs, le positionnement dans les coins provoque deux évènements distincts: Num9 = Num6 + Num8... et ça fout une merde pas possible dans le mapping envisagé lol Faut arriver à ignorer le premier évènement et appeler ActKey() au traitement du 2ème.

Pour l'instant, ça avance mais pour la suite, il vaut mieux en demander le moins possible aux macros et vraiment prendre les choses en main dans EventHandle(). Et je suis pratiquement certain qu'on doit pouvoir faire quelque chose de bien - reste encore a trouver comment :cowboy:

2 remarques:
* Je pense qu'on parle de USB_KP_0 plutôt que de USB_KP_PERIOD... Il s'agit bien des Snap views non?
* Si on active une Snap View (DOWN), on n'a pas intérêt faire autre-chose que de cliquer dans la même direction sinon, on ne fait pas le UP attendu :wacko:

A mon avis, y'a encore du boulot mais on doit pouvoir simplifier le tableau avec un peu de jugeote.

Code : Tout sélectionner

include "target.tmh" define USB_KP_ENTER USB[0x58] define USB_KP_1 USB[0x59] define USB_KP_2 USB[0x5A] define USB_KP_3 USB[0x5B] define USB_KP_4 USB[0x5C] define USB_KP_5 USB[0x5D] define USB_KP_6 USB[0x5E] define USB_KP_7 USB[0x5F] define USB_KP_8 USB[0x60] define USB_KP_9 USB[0x61] define USB_KP_0 USB[0x62] int hat_key = USB_KP_5; // [0-9] int main() { if(Init(&EventHandle)) return 1; int h3_mapping = SEQ( EXEC( "hat_key = getKey(&Joystick, H3U);" "ActKey(KEYON+ USB_KP_0);" "ActKey(KEYON+ hat_key );") , EXEC( "hat_key = getKey(&Joystick, H3U);" "ActKey( hat_key );" "ActKey( USB_KP_0);") ); MapKey(&Joystick, H3U, h3_mapping); MapKey(&Joystick, H3R, h3_mapping); MapKey(&Joystick, H3D, h3_mapping); MapKey(&Joystick, H3L, h3_mapping); } int getKey(alias o, int hat) { int u = o[hat ]; int r = o[hat+1]; int d = o[hat+2]; int l = o[hat+3]; int key = 0; if (u & r) key = USB_KP_9; else if(u & l) key = USB_KP_7; else if(d & l) key = USB_KP_1; else if(d & r) key = USB_KP_3; else if( u ) key = USB_KP_8; else if( d ) key = USB_KP_2; else if( l ) key = USB_KP_4; else if( r ) key = USB_KP_6; printf("...getKey: [%d %d %d %d] -- [%d]\xa" , u, r, d, l, (key - USB_KP_ENTER)); return key; } int EventHandle(int type, alias o, int x) { DefaultMapping(&o, x); } // http://www.checksix-forums.com/showpost.php?p=1166403&postcount=94

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

Hat dans les coins, ça avance

#106

Message par ivanwfr »

Y'a du mieux :

Code : Tout sélectionner

include "target.tmh" // USB {{{ define USB_KP_ENTER USB[0x58] define USB_KP_1 USB[0x59] define USB_KP_2 USB[0x5A] define USB_KP_3 USB[0x5B] define USB_KP_4 USB[0x5C] define USB_KP_5 USB[0x5D] define USB_KP_6 USB[0x5E] define USB_KP_7 USB[0x5F] define USB_KP_8 USB[0x60] define USB_KP_9 USB[0x61] define USB_KP_0 USB[0x62] // }}} int main() { if(Init(&EventHandle)) return 1; //js_map_h3(); } int getKey(int hat) { // {{{ int u = Joystick[hat ]; int r = Joystick[hat+1]; int d = Joystick[hat+2]; int l = Joystick[hat+3]; int key = 0; if (u & r) key = USB_KP_9; else if(u & l) key = USB_KP_7; else if(d & l) key = USB_KP_1; else if(d & r) key = USB_KP_3; else if( u ) key = USB_KP_8; else if( d ) key = USB_KP_2; else if( l ) key = USB_KP_4; else if( r ) key = USB_KP_6; alias zu = " u"; alias zr = " r"; alias zd = " d"; alias zl = " l"; if(key != 0) printf("...getKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], (key - USB_KP_ENTER)); getKey_pending = 0; return key; } // }}} int getKey_pending = 0; int start_getKey(int hat) { if( !getKey_pending ) { getKey_pending = 1; DeferCall(2 * kb_delay, &getKey, hat); } else { // just wait for the pending one to happen } } int EventHandle(int type, alias o, int x) // {{{ { if((&o==&Joystick) & (x>=H3U) & (x<=H3L)) { start_getKey(H3U); } else { DefaultMapping(&o, x); } } // }}}
Avatar de l’utilisateur

dimebug
Pilote d'essais
Pilote d'essais
Messages : 6965
Inscription : 18 août 2001

#107

Message par dimebug »

c'est joli :)
Image Dresseur de cochon (sauvage)
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#108

Message par hellfrog »

vi, j'ai pas le niveau suffisant pour pondre ça, mais je comprends et j'admire le travail !

et où as tu trouvé cette syntaxe : Joystick[hat+1] ?

et ça :

if((&o==&Joystick) & (x>=H3U) & (x<=H3L)) {
start_getKey(H3U);
}


est-ce là seule / meilleure façon d'intercepter une input ?
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#109

Message par ivanwfr »

Y'a pas de miracle avec le niveau, comme c'est mon boulot ça le fait bien. Et ça rejoint mon intérêt pour ce simulateur: On est toujours récompensé de ses efforts quand on bosse sur les sujets qui méritent! Et pour les miracles, il suffit de farfouiller :detective:

- Joystick[hat+1..3] ... dans target.tmh -- fonction Hat2Btn()

- (x>=H3U) & (x<=H3L) ... dans defines.tmh (Warthog Joystick interface)

Alors: encore plus joli que tout-à l'heure avec le code ci-dessous :sorcerer:
(j'ai légèrement pompé dans mon usine à gaz sur la gestion des snap views)

Now we're talking :surf:

[SNAP ON] 1 2 3 4 6 4 8 9 OFF]
[SNAP ON] 1 OFF]
[SNAP ON] 1 2 1 OFF]

Code : Tout sélectionner

include "target.tmh" int main() { // {{{ if(Init(&EventHandle)) return 1; } // }}} int EventHandle(int type, alias o, int x) // {{{ { if((&o==&Joystick) & (x>=H3U) & (x<=H3L)) handleHat(H3U); else DefaultMapping(&o, x); } // }}} int ActHatKeyCalled = 0; //alias zu=" u"; alias zr=" r"; alias zd=" d"; alias zl=" l"; int ActHatKey(int hat) { // {{{ int u = Joystick[hat ]; int r = Joystick[hat+1]; int d = Joystick[hat+2]; int l = Joystick[hat+3]; int num = 0; if (u & r) num = 9; else if(u & l) num = 7; else if(d & l) num = 1; else if(d & r) num = 3; else if( u ) num = 8; else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); if(num != 0) { if(num == view_locked) unlock_view(); else lock_view(num); } ActHatKeyCalled = 0; } // }}} int handleHat(int hat) // {{{ { if( !ActHatKeyCalled ) { ActHatKeyCalled = 1; DeferCall(2 * kb_delay, &ActHatKey, hat); } else { // just wait for the pending one to happen } } // }}} int view_locked = 0; int lock_view(int num) // {{{ { // Enter/Keep "snap view mode" if(view_locked==0) { printf("[SNAP ON]"); ActKey(LOCK); ActKey(KEYON+ R_CTL+ 0); ActKey(KEYON+ KP0); Sleep( 10 ); ActKey( KP0); ActKey( R_CTL+ 0); } if(num) { ActKey(LOCK); ActKey(KEYON+ KPENT+num); Sleep( kb_delay ); ActKey( KPENT+num); ActKey(LOCK); view_locked = num; printf(" %d", view_locked); } } // }}} int unlock_view() // {{{ { // Leave "snap view mode" printf(" OFF]\xa", view_locked); ActKey(LOCK); ActKey(KEYON+ KP0 ); Sleep( kb_delay ); ActKey( KP0 ); ActKey(LOCK); view_locked = 0; } // }}}
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#110

Message par hellfrog »

vu que tu es motivé et que c'est facile pour toi, un test pour H3M
H3M = HAT 3 au centre
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#111

Message par ivanwfr »

J'ai pensé à ça bien sûr mais pourquoi pas H4 sur lequel on peu appuyer ?
On a ça dans defines.tmh:

define H4U 14
define H4R 15
define H4D 16
define H4L 17
define H4P 18
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#112

Message par hellfrog »

on fait j'essaie de faire une routine cadre pour pouvoir gérer les coins et les milieux sur TOUS les Hat, stick et throttle...
ça avance, mais me reste un peu de debug à faire, et pas eu le temps d'avancer ce jour...
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#113

Message par hellfrog »

apparement ça ne lui plait pas :

Code : Tout sélectionner

include "_HATCorners.tmc" ... int EventHandle(int type, alias o, int x) [color=White]{ [/color][color=Yellow][color=White] if((&o==&Joystick) & (x>=H1U) & (x<=H1L)) handleHat(H1U); else if((&o==&Joystick) & (x>=H2U) & (x<=H2L)) handleHat(H2U); else if((&o==&Joystick) & (x>=H3U) & (x<=H3L)) handleHat(H3U); else if((&o==&Joystick) & (x>=H4U) & (x<=H4L)) handleHat(H4U);[/color] else if((&o==&Throttle) & (x>=CSU) & (x<=CSL)) handleHat(CSU); else if((&o==&throttle) & (x>=MSU) & (x<=MSL)) handleHat(MSU);[/color] else DefaultMapping(&o, x); }

Code : Tout sélectionner

// FUNCTIONS TO PERFORM PROGRAMMATION OF CENTER AND CORNER POSITIONS OF HATS int ActHatKeyCalled = 0; //alias zu=" u"; alias zr=" r"; alias zd=" d"; alias zl=" l"; int handleHat(int hat) // {{{ { if( !ActHatKeyCalled ) { // flag to test one or two input ActHatKeyCalled = 1; DeferCall(2 * kb_delay, &ActHatKey, hat); } else { // just wait for the pending one to happen } } // }}} int ActHatKey(int hat) // {{{ { i[color=Yellow]f ((hat == MSU) | (hat == CSU)) // throttle hat called[/color] { [color=Yellow] int u = Throttle[hat ]; int r = Throttle[hat+1]; int d = Throttle[hat+2]; int l = Throttle[hat+3];[/color] int num = 0; [color=Yellow] if (hat == MSU)[/color] { if (u & r) {MSUR(); num = 9;} else if(u & l) {MSUL(); num = 7;} else if(d & l) {MSDL(); num = 1;} else if(d & r) {MSDR(); num = 3;} else if( u ) {num = 8;} // H3U(); // is commented not to call H3U funtion as H3U is already mapped in the main profile generaly} else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); // to call a function with num as parameter : //if(num != 0) { // if(num == view_locked) unlock_view(); // else lock_view(num); // } } [color=Yellow] else if (hat == CSU)[/color] { if (u & r) {CSUR(); num = 9;} else if(u & l) {CSUL(); num = 7;} else if(d & l) {CSDL(); num = 1;} else if(d & r) {CSDR(); num = 3;} else if( u ) {num = 8;} // H3U(); // is commented not to call H3U funtion as H3U is already mapped in the main profile generaly} else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); // to call a function with num as parameter : //if(num != 0) { // if(num == view_locked) unlock_view(); // else lock_view(num); // } } } else // joystick hat called { int u = Joystick[hat ]; int r = Joystick[hat+1]; int d = Joystick[hat+2]; int l = Joystick[hat+3]; int num = 0; if (hat == H1U) { if (u & r) {H1UR(); num = 9;} else if(u & l) {H1UL(); num = 7;} else if(d & l) {H1DL(); num = 1;} else if(d & r) {H1DR(); num = 3;} else if( u ) {num = 8;} // H3U(); // is commented not to call H3U funtion as H3U is already mapped in the main profile generaly} else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); // to call a function with num as parameter : //if(num != 0) { // if(num == view_locked) unlock_view(); // else lock_view(num); // } } else if (hat == H2U) { if (u & r) {H2UR(); num = 9;} else if(u & l) {H2UL(); num = 7;} else if(d & l) {H2DL(); num = 1;} else if(d & r) {H2DR(); num = 3;} else if( u ) {num = 8;} // H3U(); // is commented not to call H3U funtion as H3U is already mapped in the main profile generaly} else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); // to call a function with num as parameter : //if(num != 0) { // if(num == view_locked) unlock_view(); // else lock_view(num); // } } else if (hat == H3U) { if (u & r) {H3UR(); num = 9;} else if(u & l) {H3UL(); num = 7;} else if(d & l) {H3DL(); num = 1;} else if(d & r) {H3DR(); num = 3;} else if( u ) {num = 8;} // H3U(); // is commented not to call H3U funtion as H3U is already mapped in the main profile generaly} else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); // to call a function with num as parameter : //if(num != 0) { // if(num == view_locked) unlock_view(); // else lock_view(num); // } } else if (hat == H4U) { if (u & r) {H4UR(); num = 9;} else if(u & l) {H4UL(); num = 7;} else if(d & l) {H4DL(); num = 1;} else if(d & r) {H4DR(); num = 3;} else if( u ) {num = 8;} // H3U(); // is commented not to call H3U funtion as H3U is already mapped in the main profile generaly} else if( d ) num = 2; else if( l ) num = 4; else if( r ) num = 6; //printf("...ActHatKey: [%c %c %c %c] == [%d]\xa" , zu[u], zr[r], zd[d], zl[l], num); // to call a function with num as parameter : //if(num != 0) { // if(num == view_locked) unlock_view(); // else lock_view(num); // } } } ActHatKeyCalled = 0; } // }}} // HAT1 int H1UR() { } int H1UL() { } int H1DR() { } int H1DL() { } int H1M() { } // HAT2 int H2UR() { } int H2UL() { } int H2DR() { } int H2DL() { } int H2M() { } // HAT3 int H3UR() { //ActKey(KEYON+USB_KP_7); // just as exemple SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_9, LOCK), CHAIN( LOCK+UP+USB_KP_9, UP+USB_KP_PERIOD, LOCK) ); } int H3UL() { SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_7, LOCK), CHAIN( LOCK+UP+USB_KP_7, UP+USB_KP_PERIOD, LOCK) ); } int H3DR() { //ActKey(KEYON+ SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_3, LOCK), CHAIN( LOCK+UP+USB_KP_3, UP+USB_KP_PERIOD, LOCK) )); } int H3DL() { SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_1, LOCK), CHAIN( LOCK+UP+USB_KP_1, UP+USB_KP_PERIOD, LOCK) ); } int H3M() { } // HAT4 int H4UR() { } int H4UL() { } int H4DR() { } int H4DL() { } int H4M() { } // HAT MS int MSUR() { } int MSUL() { } int MSDR() { } int MSDL() { } int MSM() { } // HAT CS int CSUR() { } int CSUL() { } int CSDR() { } int CSDL() { } int CSM() { } int view_locked = 0; int lock_view(int num) // {{{ { // Enter/Keep "snap view mode" if(view_locked==0) { printf("[SNAP ON]"); ActKey(LOCK); ActKey(KEYON+ R_CTL+ 0); ActKey(KEYON+ KP0); Sleep( 10 ); ActKey( KP0); ActKey( R_CTL+ 0); } if(num) { ActKey(LOCK); ActKey(KEYON+ KPENT+num); Sleep( kb_delay ); ActKey( KPENT+num); ActKey(LOCK); view_locked = num; printf(" %d", view_locked); } } // }}} int unlock_view() // {{{ { // Leave "snap view mode" printf(" OFF]\xa", view_locked); ActKey(LOCK); ActKey(KEYON+ KP0 ); Sleep( kb_delay ); ActKey( KP0 ); ActKey(LOCK); view_locked = 0; } // }}}
pour info, sans la throttle, le reste marche bien.

avantage : on met les fonctions que l'on veut dans les fonctions de type H3UL(), on peut réutiliser le script tel quel une fois au point
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#114

Message par ivanwfr »

Après simplification, ça donne quelque chose d'exploitable avec bemols...

1 - Les SEQ(CHAIN...) sont des Macros et des macros qui ne vont pas dans un MapKey ne servent à rien parce que c'est là qu'elles sont mises au bon endroit. Il s'agit en fait d'un pseudo-language inventé par les devs Thrustmaster et ça ne fait du code que quand leur interpréteur les voit passer... et là il n'est pas dans le coup -- on fait sans MapKey!

Il faut donc faire son boulot pour indexer des SEQences perso et remplacer les CHAIN par les ActKey équivalents ... c'est ce que faisait la version précédente.

2 - Quand ça s'est mis a marcher, j'ai vu que le Hat #4 (CMS) ne va mécaniquement pas dans les coins -- seulement un switch enfoncé à la fois)


Ce code fait des printf des fonctions appelées, ce qui permet de voir par où ça passe. Et quand il s'agira de faire quelque chose d'utile dans ces fonctions, ce sera à coup de ActKey() mais pas de CHAIN. EXEC ou SEQ..., on est de l'autre côté du rideau là, faut plus compter sur les macros.

Code : Tout sélectionner

// FUNCTIONS TO PERFORM PROGRAMMATION OF CENTER AND CORNER POSITIONS OF HATS include "target.tmh" include "util/util_usb.tmh" int main() { // {{{ if(Init(&EventHandle)) return 1; } // }}} int EventHandle(int type, alias o, int x) // {{{ { if ((&o==&Joystick) & (x>=H1U) & (x<=H1L)) // H1[URDL] = [29-32] handleHat(H1U); else if((&o==&Joystick) & (x>=H2U) & (x<=H2L)) // H2[URDL] = [ 6- 9] handleHat(H2U); else if((&o==&Joystick) & (x>=H3U) & (x<=H3L)) // H3[URDL] = [10-13] handleHat(H3U); else if((&o==&Joystick) & (x>=H4U) & (x<=H4P)) // H4[URDLP] = [14-18] -- !order=URDLP -- @see defines.tmh handleHat(H4U); else if((&o==&Throttle) & (x>=CSU) & (x<=CSL)) // CS[URDL] = [32-35] handleHat(CSU); else if((&o==&Throttle) & (x>=MSP) & (x<=MSL)) // MS[PURDL] = [ 1- 5] -- !order=PURDL -- @see defines.thm handleHat(MSP); else DefaultMapping(&o, x); } // }}} int ActHatKeyCalled = 0; int handleHat(int hat) // {{{ { if( !ActHatKeyCalled ) { ActHatKeyCalled = 1; DeferCall(2 * kb_delay, &ActHatKey, hat); } // else just wait for the pending one to happen } // }}} int ActHatKey(int hat) // {{{ { int u, r, d, l, m; if (hat == CSU) { u = Throttle[hat ]; r = Throttle[hat+1]; d = Throttle[hat+2]; l = Throttle[hat+3]; } else if(hat == MSP) { // MS[PURDL] -- !order m = Throttle[hat ]; u = Throttle[hat+1]; r = Throttle[hat+2]; d = Throttle[hat+3]; l = Throttle[hat+4]; } else if(hat == H4U) { // H4[URDLP] -- !order u = Joystick[hat ]; r = Joystick[hat+1]; d = Joystick[hat+2]; l = Joystick[hat+3]; m = Joystick[hat+4]; } else { u = Joystick[hat ]; r = Joystick[hat+1]; d = Joystick[hat+2]; l = Joystick[hat+3]; } // Joystick hats if (hat == H1U) { if(u & r) H1UR(); else if(u & l) H1UL(); else if(d & l) H1DL(); else if(d & r) H1DR(); } else if (hat == H2U) { if(u & r) H2UR(); else if(u & l) H2UL(); else if(d & l) H2DL(); else if(d & r) H2DR(); } else if (hat == H3U) { if(u & r) H3UR(); else if(u & l) H3UL(); else if(d & l) H3DL(); else if(d & r) H3DR(); } else if (hat == H4U) { if(u & r) H4UR(); else if(u & l) H4UL(); else if(d & l) H4DL(); else if(d & r) H4DR(); else if(m) H4M(); } // Throttle hats else if (hat == MSP) { if(u & r) MSUR(); else if(u & l) MSUL(); else if(d & l) MSDL(); else if(d & r) MSDR(); else if(m) MSM(); } else if (hat == CSU) { if(u & r) CSUR(); else if(u & l) CSUL(); else if(d & l) CSDL(); else if(d & r) CSDR(); } ActHatKeyCalled = 0; } // }}} // Joystick functions // H1 {{{ int H1UR() { printf("H1UR\xa"); } int H1UL() { printf("H1UL\xa"); } int H1DR() { printf("H1DR\xa"); } int H1DL() { printf("H1DL\xa"); } int H1M () { printf("H1M\xa" ); } // }}} // H2 {{{ int H2UR() { printf("H2UR\xa"); } int H2UL() { printf("H2UL\xa"); } int H2DR() { printf("H2DR\xa"); } int H2DL() { printf("H2DL\xa"); } int H2M () { printf("H2M\xa" ); } // }}} // H3 {{{ int H3UR() { printf("H3UR\xa"); //ActKey(KEYON+USB_KP_7); // just as exemple SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_9, LOCK), CHAIN( LOCK+UP+USB_KP_9, UP+USB_KP_PERIOD, LOCK) ); } int H3UL() { printf("H3UL\xa"); SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_7, LOCK), CHAIN( LOCK+UP+USB_KP_7, UP+USB_KP_PERIOD, LOCK) ); } int H3DR() { printf("H3DR\xa"); SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_3, LOCK), CHAIN( LOCK+UP+USB_KP_3, UP+USB_KP_PERIOD, LOCK) ); } int H3DL() { printf("H3DL\xa"); SEQ( CHAIN( LOCK+DOWN+USB_KP_PERIOD, DOWN+USB_KP_1, LOCK), CHAIN( LOCK+UP+USB_KP_1, UP+USB_KP_PERIOD, LOCK) ); } int H3M () { printf("H3M \xa"); } // }}} // H4 {{{ int H4UR() { printf("H4UR\xa"); } int H4UL() { printf("H4UL\xa"); } int H4DR() { printf("H4DR\xa"); } int H4DL() { printf("H4DL\xa"); } int H4M () { printf("H4M \xa"); } // }}} // Throttle functions // MS {{{ int MSUR() { printf("MSUR\xa"); } int MSUL() { printf("MSUL\xa"); } int MSDR() { printf("MSDR\xa"); } int MSDL() { printf("MSDL\xa"); } int MSM () { printf("MSM \xa"); } // }}} // CS {{{ int CSUR() { printf("CSUR\xa"); } int CSUL() { printf("CSUL\xa"); } int CSDR() { printf("CSDR\xa"); } int CSDL() { printf("CSDL\xa"); } int CSP () { printf("CSP \xa"); } // }}}
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#115

Message par hellfrog »

merci bcp pour le temps passé et les explications pédagogiques !
c'est un super boulot que tu as fait là...

vu de cette manière on peut presque se passer de la syntaxe TM et programmer des choses très avancées...

par contre c'est hard au niveau syntaxe qd on maitrise mal le langage...

et ils auraient qd meme pu etre plus logique avec leurs ordres inversés à la noix
et l'enchainement C / Target est pas evident à piger dans le déroulement du prog...


EDIT : ton script marche sauf pour MSU qui semble plutot marcher comme HAT4
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#116

Message par ivanwfr »

Corrigé ... voir remarque maj ;)

Mais pas de bol, MS fait comme H4... veut pas aller dans les coins non plus!

Quand à TM, faut pas leur en vouloir, je pense que l'ouverture de leur code est sûrement mal vue par les commerciaux... Trop compliqué pour les clients. En général on ne leur demande que de savoir comment faire marcher leur carte bleue, pas plus, ça peut froisser.

En fait y'a pas foulle non plus pour y plonger les mains :ohmy:
Avatar de l’utilisateur

dimebug
Pilote d'essais
Pilote d'essais
Messages : 6965
Inscription : 18 août 2001

#117

Message par dimebug »

bas c'est le résultat d'un compromis, avec un script a la Cougar, tu est vite limité, avec du C c'est imbitable pour le commun des mortels, avec le script, en s'y mettant, tout le monde y arrive.

l'important c'est qu'a aucun moment on soit bridé par le langage.
Image Dresseur de cochon (sauvage)

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#118

Message par ivanwfr »

L'idéal consiste à fournir des moyens adaptés à plusieurs niveaux d'expertise et je crois que TM a fait quelque chose de bien en proposant le GUI et le Script editor. Il suffit de savoir quand on doit changer de registre suivant la complexité de ce qu'on envisage de faire. Y'a du temps réel là dedans et même du multi threading (LOCK)! C'est pas du léger en fait de programmation.

S'il ne s'agit d'envoyer des infos a DX input ou de générer des évènements clavier quand on actionne un switch, y'a tout ce qu'il faut pour faire ça comme il faut sans être programmeur.

Mais l'environnement de développement proposé pas TM va plus loin. Et la recherche de simplification qui apparaît bien dans le manuel a ses inconvénients. Il ne faut pas se faire d'illusions en pensant solutionner simplement des fonctions qui posent de vrais problèmes aux professionnels. Y'a qu'a voir ce que ça donne avec la majorité des périphériques d'autres marques... Input-lag, deadzones, calibration approximative, compromis mécaniques hasardeux...

TM a fait sa part comme un chef, c'est à nous d'en faire autant. Alors je suis tout disposé à creuser les idées du genre de celles de hellfrog lorsque ça coince quelque part et qu'il faut chercher la solution au delà du manuel.
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#119

Message par hellfrog »

tant qu'on y est ... :sweatdrop

continuons l'apprentissage et la pédagogie...


si on veut aussi avoir /I /O, et meme principe pour UMD...

suffit -il d'ajouter

if ((&o==&Joystick) & (x>=H1U) & (x<=H1L) & (x=S3) ) // pour /I ?


et suffit-il pour gérer cela de passer un argument de plus de fonction en fonction :

handleHat(H1U, S3); // par exemple (evidemment en modifiant ensuite la fonction...)





Autre question,

peut-on avoir les fonctions
handleHat()
ActHatKey()

dans un tmh "include" plutot que dans le script principal ?



Comment choisir si on passe une variable à la fonction par définition d'une nouvelle variable locale dans la fonction appelée : int function (int x){}
ou par alias : int function (alias o){}
?




Peut-on avoir des variables de portée globale ? est-ce automatiquement le cas si elles sont définies dans le script principal ? (pour utilisation dans une routine d'un sous programme géré par "include")



nommage des fichiers : les tmh contiennet du code C et les tmc du code target ou c'est juste une convention et ça n'a aucune importance ?
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#120

Message par ivanwfr »

hellfrog a écrit :tant qu'on y est ... :sweatdrop

continuons l'apprentissage et la pédagogie...


si on veut aussi avoir /I /O, et meme principe pour UMD...

suffit -il d'ajouter

if ((&o==&Joystick) & (x>=H1U) & (x<=H1L)) & (x=S3) // pour /I ?
Faut d'abord viser au plus simple plutôt que d'en rajouter une couche tout de suite. Il faut simplement commencer par l'identification du layer concerné au niveau de chaque évènement, pas besoin d’astuce. Il est accessible au niveau du device passé en argument à la fonction EventHandle(). Tu peux en voir l'utilisation dans le code ci-dessous:

Code : Tout sélectionner

include "target.tmh" alias LAYERS_CHAR = "uUoIdD6"; // Lowercase for O-layer, Uppercase for I-Layer int log_event(alias o, int x) { int layer = getEventLayer(&o, x); alias devName; if(&o == &Joystick) &devName = "Joystick"; else &devName = "Throttle"; printf("%8s[%c] x=0x%-6x [%d]\xa", &&devName, LAYERS_CHAR[layer], x, x); } int getEventLayer(alias o, int x) { int i, k; while(i < 9) { if(&&o[x] == layer_sw[i]) { layer_sw[i+2] = layer_sw[i+2] & layer_sw[i+1] ^ o[x]; if(i>0 & layer_sw[i+2]) layer_sw[11-i] = 0; break; } else i = i+3; } k = k + layer_sw[2] + ((layer_sw[8] + !layer_sw[5]) << 1); return k; }
Autre question,

peut-on avoir les fonctions
handleHat()
ActHatKey()

dans un tmh "include" plutot que dans le script principal ?
Je te mets la version actuelle de mon script dans lequel tu trouveras la meilleure solution que j'ai trouvée jusque-là pour structurer l'organisation des fichiers par catégories.
Comment choisir si on passe une variable à la fonction par définition d'une nouvelle variable locale dans la fonction appelée : int function (int x){}
ou par alias : int function (alias o){}
?
Là tu parles des argument passés à une fonction. Et ta question concerne également deux types de variables. Un int est un nombre entier, un alias est un foutoir dans lequel tu peux mettre tout ce que tu veux sans te faire emmerder par le compilateur... C'est un truc commode pour les langages non-typés... Sauf que c'est au run-time que ça plante, suivant que tu utilises le contenu comme il faut ou pas.
En fait j'ai pas de réponse simple. On dirait que dès que tu as besoins d'un morceau de mémoire pour contenir autre chose qu'un int ou un char, faut un alias (Genre Variant du VBScript... une sorte de poubelle quoi. Ex: alias LAYERS_CHAR = "uUoIdD6";)
Peut-on avoir des variables de portée globale ? est-ce automatiquement le cas si elles sont définies dans le script principal ? (pour utilisation dans une routine d'un sous programme géré par "include")
Là c'est pas dur, tout ce que tu déclares en dehors des acollades {...} est global. Tu peux même faire ça entre deux fonction dans les fichiers inclus.
Pièces jointes

[L’extension « zip » a été désactivée et ne peut plus être affichée.]

Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#121

Message par hellfrog »

j'ai bien vu ton script repris de target.tmh dans ton util_log.tmh

mais comment récupérer U M D ? sous quelle forme ?
j'ai fait qqs essais mais ça marche pas... sans doute pb de syntaxe encore...

dans LAYERS_CHAR[layer] ?

je voudrais avoir la valeur dans une variable pour faire un test dans une autre fonction
pour mapper les HAT corners avec une seule couche par ex, sans que ça interagisse avec une autre (par ex HAT en mode directX sur autre couche)




autre pb :
pourquoi cette ligne dans un tmc (include)
me renvoie l'erreur d'xécution "bad alias"

int LEDS_flash(alias o, alias LedIntensity){
GameOutput(&o, OUT_ID_LED_INTENSITY, &LedIntensity); Sleep(50);
}



appel par par ex :
LEDS_flash( &LMFD, 20);
LEDS_flash( &Throttle, 0);
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#122

Message par ivanwfr »

La fonction int getEventLayer(alias o, int x) te renvoie exactement ce que tu demandes. Tu peux passer la valeur renvoyée (un entier) à d'autres fonctions si tu veux éviter de l'appeler plusieurs fois pour gérer un même évènement.

Si tu fais les appels suivants:

Code : Tout sélectionner

LEDS_flash( &LMFD, 20); LEDS_flash( &Throttle, 0);
C'est seulement le premier argument "o" qui est du type alias, LedIntensity est du type int, un simple entier et pas une adressse-mémoire pleine d'infos comme Throttle et Joystick ou LMFD.

Donc :

Code : Tout sélectionner

int LEDS_flash(alias o, [color="red"]alias[/color] LedIntensity) { GameOutput(&o, OUT_ID_LED_INTENSITY, [color="Red"][B]&LedIntensity[/B][/color]); Sleep(50); }
Devrait être sous cette forme:

Code : Tout sélectionner

int LEDS_flash(alias o, [B][color="cyan"]int[/color][/B] LedIntensity) { GameOutput(&o, OUT_ID_LED_INTENSITY, [B][color="cyan"]LedIntensity[/color][/B]); Sleep(50); }
Le signe & va avec les variables de type alias, ça veut dire qu'on passe une addresse-mémoire en argument à l'appel d'une fonction qui attend un alias à cet emplacement.

Avec ça tu devrais pouvoir avancer.

---
Sinon, j'ai répondu dans un thread du Forum ED à propos d'un problème de Hat que j'avais également rencontré et j'y ai mis une solution Target. Il s'agit du China Hat qui fait rater des SOI sur le TAD de temps en temps... Justement une histoire de coins ;) Mais cette fois, il s'agit au contraire de les ignorer !
TM:Warthog Coolie Hat issue
---
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

#123

Message par hellfrog »

ok

merci pour tes reponses



autre point :
si j'utilises les scripts vu précédemment pour les HAT,
cela intercepte tous les evenements HAT,
donc on est obligé d'avoir tous les cas ET les layers programmés
comme dans ton exemple :
on ne peut pas avoir ça et en meme temps des MapKey H3U classiques en plus et que le tout fonctionne, c'est bien ça ?


en passant je signale ici les posts sur DCS
où on parle de tes scripts et autres astuces :
http://forums.eagle.ru/showthread.php?t=73271

and the Yoda universal driver project :
http://forums.eagle.ru/showthread.php?t=71233
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]

ivanwfr
Nouvelle Recrue
Nouvelle Recrue
Messages : 132
Inscription : 24 avril 2011

#124

Message par ivanwfr »

Si ce que tu appelles MapKey classique correspond aux valeurs par défaut de TARGET, ça doit être ce que tu trouves à la rubrique "Default button mapping" dans target.tmh (ligne 792).

J'ai cherché à comprendre pourquoi TM a choisi cette organisation mais j'ai vite laissé tombé... Si celui qui a fait ça avait une idée derrière la tête, il l'a bien gardée pour lui!

Mieux vaut tout prendre en main et combiner les mapping DX-Input et les raccourcis claviers à partir d'un analyse bien argumentée. C'est ce que j'ai fait avec mes mappings de la couche Middle-Out et le profile Combined qui va avec. Ca donne donc un mapping équivalent au plug and play et il n'en faut pas plus pour avancer.

MapKey() pour les boutons ayant la même fonction sur toutes les couches.

MapKeyIOUMD() pour ceux en ayant 2 à 6 différentes.
Avatar de l’utilisateur

Topic author
hellfrog
Messages : 5117
Inscription : 22 août 2008

question mode on/off sur une touche

#125

Message par hellfrog »

je voudrais faire un truc du genre, mais je trouve pas la bonne syntaxe

Code : Tout sélectionner

MapKey(&Throttle, LTB, EXEC(" ActKey(PULSE+KEYON+Hover_On_Off); //hoover mode + led 2 LMFD flash if(flagHover != 0) REXEC(39, 250, " GameOutput( &LMFD, OUT_ID_LED_INTENSITY, 200); GameOutput( &LMFD, OUT_ID_LED_2 , 1); Sleep(100); GameOutput( &LMFD, OUT_ID_LED_2 , 0); GameOutput( &LMFD, OUT_ID_LED_INTENSITY, 20); Sleep(100); flagHover = 0; "); else EXEC(" GameOutput( &LMFD, OUT_ID_LED_2 , 0); GameOutput( &LMFD, OUT_ID_LED_INTENSITY, 20); flagHover = 1; "); ") );
comment initialiser flagHover à 0 au lancement,
puis le basculer de 1 à 0 à chaque press ?
je veux que le flash dure tant que le flag est à 1, jusqu'au press suivant

comment cumuler toutes ces imbrications sans violer les règles de syntaxe ? on est obligé de créer des fonctions ? (je sais faire mais j'espérais trouver plus simple)
[SIGPIC]http://www.kirikoo.net/images/8WoodMAn- ... 212448.png[/img][/SIGPIC] (\_/) (_'.') ..i72600k@4.5GHz + AsusSabertoothZ77 + 16Go GSkill10700 + AC Noctua + Raptor + Win7x64Ult + WH MFDs SaitekThr 1920x1080x3 dt 1 tactile 6950 2G
(")_(")
[/align]
Répondre

Revenir à « salle: Periphériques: Hotas, Joysticks, Track-IR »