AssettoCorsaWindSim – Interface graphique

Préambule

Jusqu’à maintenant, mon programme AssettoCorsaWindSim devait être exécuté depuis une console (un terminal Windows) ou carrément depuis Visual Studio Code. Si je veux construire une solution complète destinée à un utilisateur final lambda, je dois pouvoir mettre au point une IHM qui permettent de contrôler facilement AssettoCorsaWindSim et ce de manière intuitive.

C’est une de mes faiblesses principales : la création d’une IHM intuitif. Je n’ai aucune formation et très peu d’expérience dans le domaine du UI/UX. Mes IHM ont tendance contenir trop d’informations et de contrôles, pas assez intuitives. Cela me rappelle la vidéo du créateur du Gestionnaire des Tâches de Windows, qui faisait part de difficultés similaires lors de la création de ses IHM.

Cliquez pour voir la vidéo

Les objectifs

Pour la première version, je me suis donné trois principaux objectifs :

  • Fonctionnement en arrière-plan : le programme doit pouvoir fonctionner même si aucune fenêtre n’est affiché
  • Monitoring de l’état : l’interface doit pouvoir rapidement donné des informations sur l’état de la connexion au jeu et à la carte de contrôle des ventilateurs, ainsi que des informations sur les ventilateurs eux-même
  • Configuration de chaque ventilateur : l’interface doit pouvoir donner la possibilité de changer la configuration des ventilateurs (vitesse max, angle, gamma, choix de la fonction de calcul)

Pour pouvoir facilement concevoir l’interface, j’ai téléchargé Visual Studio 2022 Community pour avoir accès au concepteur de vue. Cela permet de placer directement sur la fenêtre façon drag-and-drop les différents éléments de l’interface (bouton, champs de texte, etc).

Le concepteur permet plus facilement de construire des IHM typiques Windows

Fonctionnement en arrière-plan et icône de notification

Lorsque un programme fonctionne en arrière-plan, la convention veut que celui-ci affiche une icone dans la barre des tâches en bas à gauche. Notre icône affichera l’état du programme.

Arduino non connectée
Arduino connectée, mais jeu non détecté
Arduino connectée, jeu détecté
Arduino connectée, jeu en cours

Cette icône permet d’envoyer une notification à l’utilisateur. Dans le cas de AssettoCorsaWindSim, on enverra une notification lorsque la connexion à l’appareil USB est perdue.

La déconnexion de l’Arduino est considérée comme une urgence.

De manière conventionnelle, double-cliquer sur l’icône permet d’afficher la fenêtre, et faire un clic-droit permet d’ouvrir le menu contextuel.

Pour l’instant, celle l’option pour quitter le programme me semble utile.

Lorsque l’on ferme la fenêtre, on ne veut pas que le programme se termine SAUF si l’on a expressément demandé. Par contre, si il y a un problème on veut que le programme se ferme, on va donc demander à ce que le programme ne se ferme pas si une certaine condition est remplie.

On insiste sur le fait que les ventilateurs ne tourneront plus. Peut-être un peu trop d’insistance ?
Cliquez pour voir l'extrait de code

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            acws.AssettoCorsaDataReceived -= Acws_AssettoCorsaDataReceived;
            acws.HardwareDataSent -= Acws_HardwareDataSent;

            if (e.CloseReason == CloseReason.UserClosing && !allowClose)
            {
                e.Cancel = true;
                this.Hide();
                return;
            }

            acws.AssettoCorsaConnectionChanged -= Acws_AssettoCorsaConnectionChanged;
            acws.HardwareConnectionChanged -= Acws_HardwareConnectionChanged;

            notifyIcon.Visible = false;

            acws.Stop();
        }

Il reste plus qu’à intégrer le reste du programme d’AssettoCorsaWindSim.

Disposition générale de la fenêtre

La fenêtre du programme consiste en trois onglets : un premier onglet sert de page d’accueil pour des informations générales sur le programme et l’état de la connexion, tandis que les deux autres onglets sont utilisées pour gérer les paramètres des deux ventilateurs.

  • Visualisation de la puissance des ventilateurs côté hardware, de la vitesse et de l’orientation de la voiture côté software
Pas mal d’information d’un simple coup d’oeil

  • Monitoring des différents états de l’USB (connecté ou non)
Arduino non connectée
Arduino connectée

  • Monitoring des différents états de AssettoCorsaSharedMemory : inconnu, détecté, pause, en jeu
Jeu non détecté
Jeu détecté en pause
Jeu en cours

Pour chaque ventilateur via le deuxième et troisième onglet, on peut gérer les paramètres Vitesse Max, Gamma, Angle Ventilateur et Méthode de Calcul (voir l’article précédent sur ces paramètres)

Les paramètres sur lesquels on pouvait jouer se retrouvent également ici

Par convention, on met également en place un menu d’en-tête pour gérer l’application et l’arrêter si besoin, un futur menu de paramètres et le fameux sous-menu ‘Aide‘ et son ‘A propos‘.

‘File’ ou ‘Fichier’ pour quitter l’application
L’aide…
… et la fenêtre ‘A propos’

En aparté, ChatGPT et Dall-E m’ont aidé à créer une petite icône sans prétention pour le logiciel AssettoCorsaWindSim. Le site icons8.com m’a permis de customiser des icônes pour pouvoir donner visuellement l’état du système d’un coup d’oeil. Merci à eux.

Démonstration

Vidéo de démonstration de la fenêtre :

L’Arduino est détectée dès son branchement et le jeu est détecté également dès son démarrage. Les paramètres peuvent être ajustés en direct pour s’adapter à la vitesse max de la voiture par exemple.

Il reste encore du travail sur les calculs. En effet, dans la vidéo on voit qu’après la mise en marche du mode permettant de prendre en compte les angles, la puissance maximale envoyée aux ventilateurs n’est plus qu’à environ 50% de la puissance disponible.

Conclusion

Liste d’améliorations possibles :

  • Enregistrement des paramètres dans un fichier, imaginer la détection de la voiture et du circuit pour charger automatiquement les paramètres
  • Affichage d’une courbe pour avoir un aperçu de la puissance du ventilo en fonction de la vitesse et de l’orientation
  • Une fonction personnalisée pour avoir encore plus de liberté, à charger en fonction du type de ventilateur
  • D’autres paramètres pour le démarrage automatique de l’appli avec Windows, etc

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut