See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [aide] simuler clic souris avec clbkVCMouseEvent  (Read 4126 times)

0 Members and 1 Guest are viewing this topic.

Offline Canon

  • Newbie
  • *
  • Posts: 4
  • Karma: 1
20 November 2015, 01:38:53
Bonjour à tous,

L'idée de réaliser un simpit de navette spatiale pour l'addon Space Shuttle Ultra d'orbiter me trotte dans la tête depuis un moment, je me suis donc lancer dans le code il y'a 2 semaines mais je n'arrive à rien  :badsmile:

Voici un exemple de ce que j'ai en tête:
Dans mon cockpit réel, dès que je change la position du switch "switch1" connecté à un arduino, l'info remonte par port usb au pc et à un plugin d'orbiter qui effectue un clbkVCMouseEvent avec les paramètres qui correpondes au switch1 dans le cockpit virtuel afin de simuler un clic de souris sur le switch1 du cockpit virtuel.

Les paramètres de chaque switch dans le cockpit virtuel j'arrive à les obtenir en ajoutant un sprintf(oapiDebugString(), "...") dans le code de SSU.

Mon problème c'est que je n'arrive pas à trouvé de solution pour activer le switch dans le cockpit virtuel avec la fonction clbkVCMouseEvent qui simule le clique de souris.

La très grande majorité des switch de SSU ne possède pas de touche clavier, je suis donc obligé de passer par cette simulation de clic souris pour activer les switch depuis l'extérieur.

Si quelqu'un à une solution à mon soucis je suis prenneur  :wor:


Offline antoo

  • Legend
  • ******
  • Posts: 3659
  • Country: France fr
  • Karma: 179
  • MSFS ❤️
Reply #1 - 20 November 2015, 15:50:47
Bonjour !... et bienvenue :) !

Je ne peux malheureusement pas t'aider personnellement. En revanche si tu veux, tu peux en parler avec l'utilisateur "maxoo" (c'est mon frère), qui est exactement dans le même cas que toi, mais qui y travaille depuis deux ou trois mois. En effet, lui et moi sommes en train de concevoir une reproduction de la capsule Apollo avec l'addon NASSP... donc c'est tout à fait similaire, vous aurez de quoi en causer :) !
De plus, on en a un peu discuté sur le fil de notre cockpit ici : http://orbiter.dansteph.com/forum/index.php?topic=12563.0

Courage :) !!
A+

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961

Offline Canon

  • Newbie
  • *
  • Posts: 4
  • Karma: 1
Reply #2 - 21 November 2015, 11:15:41
Merci pour les infos  ;)
Je suis allez voir voir projet c'est complètement dingue  :eek:

Etant donné que j'ai pas mal de boulot en dehors de ce simpit, j'ai fini par choisir la solution de facilité pour gagner du temps.
J'ajoute directement mes lignes de code DANS le code de SSU. C'est pas très propre ni élégant mais ça a le mérite de marcher  :)

ici j'ajoute un sprintf pour connaitre les paramêtres de chaque bouton quand je clique dessus:
Code: [Select]
bool Crawler::clbkVCMouseEvent(int id, int _event, VECTOR3& p)
{
oapiWriteLog("clbkVCMouseEvent called");
sprintf(oapiDebugString(), "id=%d _event=%d data0=%lf data1=%lf data2=%lf x=%lf y=%lf z=%lf\n",id,_event,p.data[0],p.data[1],p.data[2],p.x,p.y,p.z);//////AJOUT////////
bool bRet = false;

bRet = pgFwdCab.OnVCMouseEvent(id, _event, p);
bRet = pgRearCab.OnVCMouseEvent(id, _event, p);

/*
if((id==AID_LDS_AREA) || (id==AID_LDS_AREA+AID_REAR_OFFSET))
{
KnobAction(p,id);  //LDS BUTTON ACTION
}
*/
return bRet;
}

ici je fait appel a la fonction clbkvcmouseevent dès qu'une touche clavier est entrée (+ ou -  du num pad), les paramètres à envoyés sont définis juste avant l'appel à la fonction:
Code: [Select]
int Crawler::clbkConsumeBufferedKey(DWORD key, bool down, char *kstate) {
if (key == OAPI_KEY_ADD) {
//pEngine->IncreaseTgtSpeed(down);
VECTOR3 p_ardui;///////////////////////////////////////////////////////////////////////////////
p_ardui.data[0]=p_ardui.x=0.273806;/////////////////////////////////////////////////////////
p_ardui.data[1]=p_ardui.y=0.258614;/////////////////////////////////////////////////////////
p_ardui.data[2]=p_ardui.z=0.000000;/////////////////////////////////////////////////////////
clbkVCMouseEvent(1,1,p_ardui);///////////////////////////////////////////////////////////////
increaseTgtSpeed = down;
decreaseTgtSpeed = false;
return 1;
}
else if (key == OAPI_KEY_SUBTRACT) {
//pEngine->DecreaseTgtSpeed(down);
VECTOR3 p_ardui;///////////////////////////////////////////////////////////////////////////////
p_ardui.data[0]=p_ardui.x=0.230022;/////////////////////////////////////////////////////////
p_ardui.data[1]=p_ardui.y=0.227003;/////////////////////////////////////////////////////////
p_ardui.data[2]=p_ardui.z=0.000000;/////////////////////////////////////////////////////////
clbkVCMouseEvent(1,1,p_ardui);///////////////////////////////////////////////////////////////
decreaseTgtSpeed = down;
increaseTgtSpeed = false;
return 1;
     }
}

Cet exemple est très "sale", je l'ai fais hier soir en 5 min pour tester l'idée. Il ne me reste plus qu'a définir une combinaison de touche clavier pour chaque bouton de la navette et de faire quelque chose de plus ordonné.
Ensuite avec un arduino je vais simuler l'appui sur les touches du clavier et c'est dans la poche !

Voilou :beer:

« Last Edit: 21 November 2015, 12:20:26 by Canon »

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #3 - 22 November 2015, 19:10:24
Très intéressant, comme fil; ça donne des indications pour gérer des switches
qui n'ont pas de raccourci clavier, comme la gestion du carburant
sur le Xr2 Ravenstar.
J'ai aussi suivi le fil d'Antoo, et on avait bien discuté à propos de tout ça.

Dans mes assemblages, je n'avance pas à la vitesse que je voudrais, mais
de plus en plus de choses se mettent en place. Les mises en route de nouvelles
cartes ne sont pas toujours des chemins semés de pétales de roses, mais j'arrive
à dépanner dans des délais raisonnables.


Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #4 - 03 December 2015, 04:17:30
Je crois que tu as la bonne technique. J'en avais déjà discuté à quelque part sur ce forum. L'appel direct de la méthode clbkVCMouseEvent n'est pas documentée, mais ça semble fonctionner.

Toutefois, tu n'es pas obligé de modifier directement le code de SSU. Tu peux t'écrire une DLL à part que tu charges dans l'onglet "Modules" d'Orbiter. Cette DLL va récupérer le vaisseau directement (avec une méthode dont le nom ressemble à oapiGetVesselHandle ou un truc du genre). Ensuite, tu peux appeler directement les callbacks comme tu veux. Ceci t'éviteras de toujours recompiler le code de SSU à chaque fois qu'il y a un changement.

Pour recueillir des données de SSU, tu peux seulement importer les headers (les fichiers .h) de SSU, et caster ton pointeur VESSEL3 en Crawler (si je reprends ton exemple).

En C++ moderne, le castage se ferait ainsi:
Code: [Select]
auto myCrawler = dynamic_cast<Crawler*>(myHandler)
Ensuite, selon le code de SSU, tu peux probablement appeler des méthodes pour obtenir les différents paramètres des systèmes.

Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline Canon

  • Newbie
  • *
  • Posts: 4
  • Karma: 1
Reply #5 - 06 December 2015, 12:10:50
Justement c'est parce que je n'arrive pas à créer ma propre DLL que j'ajoute mes lignes directement dans le code de SSU. Je suis un néophyte complet en C++  :badsmile:

Mais j'avoue ne pas être satisfait par cette technique barbare. J'ai donc re-essayé de faire une DLL !
Donc d'après tous ce que j'ai pu lire sur le net et les docs il faut:
- que dans ma dll je créer une classe objet


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #6 - 09 December 2015, 08:54:02
Une question me trotte dans la tête: peut-on cliquer une zone hors écran?
Je me demande ça, car je voudrais pouvoir faire par exemple faire du fuel
management sans afficher le panel correspondant à l'écran ( et pas de raccourci clavier...) :wonder:


Offline Canon

  • Newbie
  • *
  • Posts: 4
  • Karma: 1
Reply #7 - 09 December 2015, 12:05:28
Oui, les coordonnées de la fonction clbkvcmouseevent sont relatives au cockpit virtuel et non pas à l'écran. Chez moi ça marche très bien.


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #8 - 09 December 2015, 18:52:47
@ Canon:
OK, merci!