Gamoover

Forums " WORKSHOP" => Emulateurs, Frontends & Distributions => Mame - Mame 32 => Discussion démarrée par: Dr_Lagaffe le Mercredi 21 Septembre 2011, 09:50:15 AM

Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Mercredi 21 Septembre 2011, 09:50:15 AM
Est ce que quelqu'un a deja essayer de programmer un soft (C++ de preference ou python) pour envoyer des combinaisons de touches a mame.
Projet : faire un programme de gestion de credit ( compteur de credit virtuel) 8) oui oui je sais ca sert a rien mais je serais content ;D.

En gros : Avoir un soft qui ecoute les touches claviers et quand le monnayeur envoie une impulsion au IPac, le soft le detecte et execute une sequence d action ( ajouter un credit au compteur ) et multiplier le nombre de credit par piece ( 5 credits pour 100 yen par exemple)

Realisation :  J'ai un petit keylogger qui ecoute les touches et detecte l insertion d un credit.
Par contre je n arrive pas a executer de commande type sendkey sendinput pour les passer sur mame. Y compris apres avoir compile mame avec l option direct input !

Autre Option : Je peux utiliser Autohotkey pour envoyer une combinaison de touche et augmenter le nombre de credits mais je perds le compteur virtuel et toute autre possibilite d evolution du programme !!

Avez vous deja reussi a envoyer des sendkey a mame ? Des idees/suggestions?

Merci

Titre: Mame progammation : gestion de credits C++
Posté par: wikee le Mercredi 21 Septembre 2011, 13:56:36 PM
Alors pour envoyer des "keys" a mame c'est un peu galère (si mes souvenirs sont bons il y à une histoire comme quoi mame accepte que les "raw" inputs au niveau du système (pour eviter le moindre lag) et donc si tu envoie un caractere via un soft ca ne les reconnait pas.


De mémoire il faut modifier la source et le recompiler (du moins c'est ce que j'avais du faire avec les versions datant un peu (il y a un ou deux ans))

edit: oui c'est ca il faut le recompiler en modifiant dans la source src\osd\windows\input.c
#define FORCE_DIRECTINPUT       1


Dans le genre, sur ma mamecab j'ai fait une petite appli en ahk qui tourne en tache de fond qui incrémente une valeur dans la base de registre chaque fois qu'un crédit est inséré dans la machine, ca me permet juste de savoir combien de crédits ont été inséré dans ma borne chaque année/mois.
Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Jeudi 22 Septembre 2011, 03:28:08 AM
Merci wikee,

Citation de: wikee le Mercredi 21 Septembre 2011, 13:56:36 PM
Aune petite appli en ahk qui tourne en tache de fond qui incrémente une valeur dans la base de registre chaque fois qu'un crédit est inséré dans la machine, ca me permet juste de savoir combien de crédits ont été inséré dans ma borne chaque année/mois.

Merci pour l'idee, je n'y avais pas pense. J ai bien recompile mame avec direct input et je peux utiliser le ahk sans souci... Mais pour une raison obscure le sendkey c++ passe pas  ::) Peut etre que c'est juste un probleme dans mon code (plausible).
En tous cas je savais pas qu'on pouvait manipuler le registre avec les scripts ahk (j'avais pense a un fichier texte).

Donc ahk ca marche mais c++/sendkey non... Toujours en quete de debbugage du coup a titre 'educatif'
Titre: Mame progammation : gestion de credits C++
Posté par: Iro le Jeudi 22 Septembre 2011, 07:24:22 AM
Tu peux le faire directement dans les jeux. Mais je suppose que tu veux que ce soit globale.
Sinon tu récupéres une carte de crédit d'une borne, c'est exactement sont rôles.
Titre: Mame progammation : gestion de credits C++
Posté par: Sir Kayne le Jeudi 22 Septembre 2011, 08:12:42 AM
A ma connaissance, il existe Coindrop, un petit soft pour gerer ca (mais difficile à trouver).
Sinon, il est toujours plus intéressant de le développer sois même  ^-
Tu pourras y inclure plus tard le pilotage de LED et afficheur de credit peut etre ?
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Jeudi 22 Septembre 2011, 09:01:09 AM
Citation de: Dr_Lagaffe le Jeudi 22 Septembre 2011, 03:28:08 AM
Merci wikee,

Merci pour l'idee, je n'y avais pas pense. J ai bien recompile mame avec direct input et je peux utiliser le ahk sans souci... Mais pour une raison obscure le sendkey c++ passe pas  ::) Peut etre que c'est juste un probleme dans mon code (plausible).
En tous cas je savais pas qu'on pouvait manipuler le registre avec les scripts ahk (j'avais pense a un fichier texte).

Donc ahk ca marche mais c++/sendkey non... Toujours en quete de debbugage du coup a titre 'educatif'
Salut,
Tu ne pourras pas envoyer des input avec le "sendkey" (~= message windows) alors que MAME récupère ses entrées par DirectInput (~= Directx, utilise Dinput.dll)
Pour faire ce que tu veux, il faut "hooker" la Dll de DirectInput (intercepter la réception de l'entrée DirectInput, analyser et éventuellement modifier la donnée) avec une Dll que tu aura préalablement codée toi-même.
Tu as une explication du pricipe ICI (http://www.cppfrance.com/codes/HOOK-SUR-API-WIN32-NT-REQUIS_26694.aspx)

Après à toi de chercher sur Google (y'a pas mal d'info apparemment) les fonctions à réécrire pour la dll directInput... :-[
Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Samedi 24 Septembre 2011, 17:25:21 PM

Citation
Tu peux le faire directement dans les jeux. Mais je suppose que tu veux que ce soit globale.
Sinon tu récupéres une carte de crédit d'une borne, c'est exactement sont rôles.
En effet je voudrais du global. La carte de credit effectivement ca pourrait etre une option.
Mais je trouve ca dommage de remplacer une contrainte software(mame/credits) par du hardware qui me sera inutile pour le reste ( j ai une naomi et le bios permet de regler le nombre de credit par coin )

Citation de: Sir Kayne le Jeudi 22 Septembre 2011, 08:12:42 AM
A ma connaissance, il existe Coindrop, un petit soft pour gerer ca (mais difficile à trouver).
Sinon, il est toujours plus intéressant de le développer sois même  ^-
Tu pourras y inclure plus tard le pilotage de LED et afficheur de credit peut etre ?
Impossible a trouver (pour moi lol) .... Retire de la distribution parceque au dela de multiplier les credits dans mame il recupere les impulsions des coins au niveau du frontend !!Du coup on peut s en servir aisement pour mettre une mamecab en exploitation avec infinite de jeux....
Il semblerait que les developpeurs mame aient demande le retrait du soft....

Citation
Tu ne pourras pas envoyer des input avec le "sendkey" (~= message windows) alors que MAME récupère ses entrées par DirectInput (~= Directx, utilise Dinput.dll)
Pour faire ce que tu veux, il faut "hooker" la Dll de DirectInput (intercepter la réception de l'entrée DirectInput, analyser et éventuellement modifier la donnée)
Super... une piste interessante a creuser!
Ca a l air tendu.... c'est bien se casser la tete alors que ahk marche tres bien... mais j aime me casser la tete...  :D
Encore du temps libre qui va etre engouli...
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Samedi 24 Septembre 2011, 20:47:46 PM
Citation de: Dr_Lagaffe le Samedi 24 Septembre 2011, 17:25:21 PM
Super... une piste interessante a creuser!
Ca a l air tendu.... c'est bien se casser la tete alors que ahk marche tres bien... mais j aime me casser la tete...  :D
Encore du temps libre qui va etre engouli...
C'est ça qui est bon, utiliser du temps de libre à se casser la tête  =:))
Il y a un article sur le hook directx ICI (http://www.gamedev.net/topic/371104-c-directinput-hooking-component-and-sample/) malheureusement le fichier zip du code source n'existe plus.
On le retrouve ailleurs sur google (DInput-Hook-2005-22-01.zip) mais sur des sites sur lesquelles il faut s'enregistrer pour le telecharger, etc...

A ce que j'ai cru lire,il y peut être moyen de faire ça (un peu plus facilement ? ) en C# avec la librairie DirectX.
Si j'ai le temps de trouver un MAME et de le compiler avec l'option directinput je pourrais peut être tester ce que j'ai trouvé comme infos sur le sujet.
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Dimanche 25 Septembre 2011, 14:03:40 PM
Petit up :
j'ai eu le temps de tester et en effet il est très facile en C# de substituer/envoyer des commandes à un MAME compilé avec le "Force DirectInput"

J'ai fait rapidement un test avec un petit programme de fond, qui se hook au clavier et remplace un appui de la touche '5' (crédit P1) par une séquence de X impulsions de cette même touche.

@Dr_Lagaffe : je peux te filer le code si tu veux. C'est pas du C++ mais vu que ça utilise une fonction d'une dll windows native (user32.dll) tu peux te baser dessus pour gérer ça en C++. Ou, encore plus facile  :), continuer à ta guise en C#  ^-
Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Lundi 26 Septembre 2011, 02:38:08 AM
Citation de: argonlefou le Dimanche 25 Septembre 2011, 14:03:40 PM
Petit up :
j'ai eu le temps de tester et en effet il est très facile en C# de substituer/envoyer des commandes à un MAME compilé avec le "Force DirectInput"

J'ai fait rapidement un test avec un petit programme de fond, qui se hook au clavier et remplace un appui de la touche '5' (crédit P1) par une séquence de X impulsions de cette même touche.

@Dr_Lagaffe : je peux te filer le code si tu veux. C'est pas du C++ mais vu que ça utilise une fonction d'une dll windows native (user32.dll) tu peux te baser dessus pour gérer ça en C++. Ou, encore plus facile  :), continuer à ta guise en C#  ^-

Dans la serie : j 'ai teste pour vous argonlefou nous a fait un boulot de 'fou'. Merci super nouvelle. Oui je veux bien le code ( je te PM ) apres selon le temps libre je pousserai peut etre le cassage de tete a l'apprentissage du C# ... :D
En tous cas merci c'est super utile, grace a toi je comprends pourquoi mes keyb_event et autre sendkey restaient sans effet et je vais apprendre a hooker du direct x....
Max TY   ^-^
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Lundi 26 Septembre 2011, 11:03:17 AM
Sources & Exécutable disponibles ICI (http://www.toofiles.com/fr/oip/documents/rar/directinput.html)

Je t'ai MP pour te donner quelques explications  ;)
Titre: Mame progammation : gestion de credits C++
Posté par: Sir Kayne le Lundi 26 Septembre 2011, 12:30:04 PM
Je me permet de télécharger le source, pour y jeter un coup d'oeil  :D
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Lundi 26 Septembre 2011, 12:40:04 PM
C'est fait pour  :D
Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Lundi 26 Septembre 2011, 15:50:10 PM
Merci pour les infos et pour les sources.
Meme en ne connaissant pas le C# ca reste comprehensible.
C'est quasi du clef en main pour faire ce que je voulais.  ^-
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Lundi 26 Septembre 2011, 18:43:16 PM
Cool  ^-
Tiens nous au courant si tu as réussi à faire ce que tu voulais  :)
Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Mardi 04 Octobre 2011, 10:22:21 AM
Citation de: argonlefou le Lundi 26 Septembre 2011, 18:43:16 PM
Cool  ^-
Tiens nous au courant si tu as réussi à faire ce que tu voulais  :)

Salut Argon,
J'ai une question. Je suis pas loin de reussir a faire ce que je veux :
* Ecrire un fichier log avec historique des credits
* Affichage au demarage du compteur de credits virtuel
* multiplication du nombre de credit par insertion de coins.

Par contre je note un 'bug' ou tout du moins un effet dont je ne trouve pas la source qui est deja present dans le code que tu nous a fourni.
Le hook va identifier la pression de la touche uniquement 11 fois et planter a la 12e !!! curieux n est ce pas ?
Une idee la dessus ?
Titre: Mame progammation : gestion de credits C++
Posté par: argonlefou le Mardi 04 Octobre 2011, 15:10:09 PM
Salut,
En effet, je n'avais pas testé le programme à répétition et il y a un bug de ce genre.

En faisant quelques tests (malheureusement pas sous MAME car j'ai supprimé le MAME recompilé DirectInput), le soucis vient de la boucle "for {}" dans laquelle les répétitions sont envoyées.

Si je fais 1 ou deux itérations, ça semble fonctionner à l'infini
Avec 3 itérations, le caractère de base apparait en plus des 3 itérations et après 11 fois = bug
Avec 4 itérations, le caractère de base apparait en plus des 4 itérations et après 6 fois = bug
Avec 5 itérations, idem au dessus
Etc...

Maintenant si je supprime les deux temporisations de 50ms (System.Threading.Thread.Sleep(50)) au sein de la boucle, ça fonctionne ad vitam quelque soit le nombre d'itérations (1,2,6,10,20, etc..)

Le soucis vient donc de cette temporisation (dont la valeur je l'avoue a été choisie purement au hazard) rajoutée car sinon MAME chez moi ne captait pas toutes les touches envoyées (trop rapide pour lui ?)
Passé un certain nombre d'itération, il doit y avoir un conflit avec un temps total temporisé trop important (et le SupressKeyPress à l'air de ne pas être pris en compte, la fonction n'a pas le temps de se finir)

Je dirais donc qu'il "suffit" de faire des tests propres à ta machine afin de réduire au maximum cette temporisation, tout en laissant suffisemment de temps à MAME de capter toute la séquence (peut-être que 5 ou 10ms suffisent, je n'avais pas testé).
Bien entendu, plus tu enverras de touches à la suite et plus la tempo devra être basse.
Titre: Mame progammation : gestion de credits C++
Posté par: Dr_Lagaffe le Mardi 04 Octobre 2011, 16:36:54 PM
Jolie analyse ca me semble logique.
Je testerai ca !
Merci ! <:)