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é

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
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
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