Bonjour,
Dans le cadre d'un projet 'pro' j'ai évalué la possibilité de travailler avec cette machine à état.
Je poste juste ici ce que j'ai trouvé pour échanger.
globalement pour déboguer la machine à état on souhaite dans un processus séparé afficher un superviseurs.
Deux chantiers : en premier la mise à disposition des états/transition de la machine et l'état actif, en seconde le superviseur qui rafraichit ses informations.
A remarque que la QstateMachine, bien que basée sur une norme SCXML ne propose pas actuellement d'être scriptée par un tel fichier. Ce fichier aurait put constituer une base commune entre la machine à état et le superviseur.
Côté QStateMachine :
Récupérer la liste des états complètes & les transitions
Analyse :
On n'a pas directement ces infos avec la QStateMachine
Avec Qt V4.7 on peut utiliser QState::transitions() mais indisponibles pour Qt 4.6
Solutions :
Pour récupérer la liste des états on peut les pister à partir de l'état initial et de ses transitions. Mais suivant la complexité du graphe cela peut devenir très complexe de tous les récupérer.
La seconde solution est récupérer tous les objets enfants de la QStateMachine et de tenter un q_objectcast pour indentifier une transition ou un état. C'est la solution à priori la plus simple.
retenir aussi la possibilité d'avoir à parcourir récursivement cette liste pour les états composite, l'identification d'un états final, et des états parallèles.
Récupérer l'état d'exécution de la machine
Pour l'initialisation : QStateMachine::isRunning()
Pour la mise à jour : signaux QStateMachine::started() & stoppped()
Récupérer l'état initial & l'état final.
L'état initial : Propriété QState::initialState()
TODO L'état final ? Pas de méthode direct, il faudra appliquer un test (q_objectcast ou une déduction).
Récupérer l'état actif sur évènement et l'afficher
Analyse :
Pour l'initialisation c'est la fonction QStateMachine::configuration() qui récupère l'ensemble des états actifs.
Pour la mise à jour : le signal entered()/exited()/finished() de la machine ne permettent pas de récupérer une transition d'état dans la machine;
Globalement la QStateMachine ne 'multiplexe' pas les signaux d'entrée et de sortie de ses états, il faut le coder.
Solution : connecter le signal 'entered()' de chacun de ces états à un slot qui fait appel à la fonction QStateMachine::configuration() pour avoir l'ensemble des états actifs.
Test des solutions avec un superviseur 'console' : Ok
Côté Superviseur:
Là ça se corse ... au départ j'ai envisagé de dessiner dynamiquement le graphe mais ce n'est pas une mince affaire et je n'ai rien trouvé qui le fasse.
J'ai pensé à une solution qui associerait graphviz/QtSVG : graphviz dessinerait le graph pour moi. Mais je n'ai pas étudier le support pour les échanges avec Qt.
Donc j'ai décidé de laisser l'utilisateur dessiner le graphe et placer des marqueurs sur les objets.
Là y'a deux pistes ... A SUIVRE
Partager