Added (hopfully) the last things to the doc
This commit is contained in:
+244
-11
@@ -705,7 +705,7 @@ Cette option bien que complexe et difficile à implémenter propose une solution
|
||||
|
||||
Simuler un navigateur internet n'est pas forcément très difficile. Chromium par exemple offre une panoplie d'outils natifs et énormément de librairies existent permettant de facilement et en quelques lignes simuler un Google Chrome et le contrôler sans afficher son UI (Interface Utilisateur).
|
||||
|
||||
{: style="height:150px;width:150px"}
|
||||

|
||||
|
||||
Cependant. La F1TV n'utilise pas simplement un player HTML5 basique. Elle utilise un service de streaming BitMovin qui permet de fournir un stream de bonne qualité et surtout qui implémente les DRM (Digital Right Management)
|
||||
|
||||
@@ -719,7 +719,7 @@ Cependant Firefox de pas sa nature Open Source utilise "OpenH264" pour lire ces
|
||||
|
||||
Sauf que Firefox n'est pas aussi facilement émulé que chrome et cela réduit notre choix de librairies à ... Une seule... Qui est Selenium. (Il existe aussi Pupetteer C# mais j'ai rencontré énormément de soucis avec cette dernière dès que je voulais lancer une vidéo)
|
||||
|
||||
{: style="height:150px;width:150px"}
|
||||

|
||||
|
||||
Mais même si la documentation est plutôt maigre parfois, c'est une bonne librairie qui permet de très bien contrôler une instance de chrome ou de Firefox.
|
||||
|
||||
@@ -2495,17 +2495,250 @@ Merci d'avoir lu cette documentation, j'espère qu'elle a été instructive et j
|
||||
|
||||
Ici je vais donner quelques petites infos qui pourraient vous être utiles si vous décidez d'aller vous aventurer dans mon code source.
|
||||
|
||||
Déja je dois vous parler de comment ces fichiers intéragissent entre eux et ensuite je parlerai de chacuns d'eux individiuellements.
|
||||
Le programme n'est pas à proprement parlé un programme en MVC, le découpage général suit quand même cette philosophie, je vais donc les ranger de cette facon pour que ca soit plus simple pour vous de comprendre.
|
||||
|
||||
### Vues
|
||||
|
||||
Comme le projet n'est pas un MVC parfait, les vues vont quand mêmes quelques actions mais les deux fichiers dont je vais parler ici sont à au moins 90% juste de la vue
|
||||
|
||||
#### Settings.cs
|
||||
|
||||
Ce fichier contient tout le code pour contrôler la vue des "Settings" qui est la vue qui se charge de la creation et édition des Prestets. Si vous voulez changer le comportement de la cette page il faut éditer ce fichier.
|
||||
|
||||
Cette vue utilise deux contrôleurs :
|
||||
|
||||
- F1TVEmulator
|
||||
- ConfigurationTool
|
||||
|
||||
Le premier pour pouvoir lancer une instance de Firefox qui permet de tester le système, le second pour effectuer toutes les actions de création,modification ou de lecture des "Presets"
|
||||
|
||||
Rien de bien fou à dire sur ce fichier. La seule chose un peu bizarre est la gestion de la création des zones et des fenêtres. Il y a tout un système qui peut être un peu bizarre à première vue qui sert à detecter quand l'utilisateur clique sur l'image pour créer une zone. Je suis sûr qu'il existe une manière plus propre de le faire que celle que j'ai utilisé mais j'ai fait en sorte que cela fonctionne.
|
||||
|
||||
Un truc qui serait bien à ajouter dans le futur serait un moyen de visualiser au moins les points que l'on ajoute au fur et à mesure plutôt que de tout voir à la fin.
|
||||
|
||||
#### Form1.cs
|
||||
|
||||
Ce fichier contient tout le code pour contrôler la vue principale. Elle se charge de lancer le navigateur et d'afficher toutes les données récupèrées ou stockées.
|
||||
|
||||
Cette vue utilise deux contrôleurs :
|
||||
|
||||
- F1TVEmulator
|
||||
- DataWrapper
|
||||
|
||||
Le premier pour contrôler le navigateur (le lancer le stopper, changer l'URL etc...) et le second pour accèder à des infos de la base de donnée sans avoir à l'appeler directement.
|
||||
|
||||
### Contrôleurs
|
||||
|
||||
Ces classes ne sont pas des contrôleurs à 100% car ils contiennent aussi un peu de calcul etc... mais ont comme but principal de servir d'interface entre la vue et les données
|
||||
|
||||
#### ConfigurationTool.cs
|
||||
|
||||
Cette classe sert à travailler avec la zone principale pour la contrôler et à contenir les methode qui servent à la création de Presets.
|
||||
|
||||
Les deux grosses methodes que cette classe contient sont :
|
||||
|
||||
- SaveToJson
|
||||
- AutoCalibrate
|
||||
|
||||
La première sert tout simplement à prendre la configuration actuelle et la sauvegarder en format JSON dans un fichier dans le dossier PRESETS. La seconde prend une zone, utilise de l'OCR pour localiser les endroits ou il y a du texte et fait une calibration auto pour créer automatiquement les zones de pilotes.
|
||||
|
||||
Les autres methodes sont simplement des methodes qui appellent des methodes de modèles et servent juste d'interface.
|
||||
|
||||
#### DataWrapper.cs
|
||||
|
||||
Cette methode sert à faire l'intermédiaire entre la form principale et le contrôler "Reader" ainsi que la classe qui contrôle directement la base de données.
|
||||
|
||||
Elle interface avec ces deux classes :
|
||||
|
||||
- Reader
|
||||
- Storage
|
||||
|
||||
Reader est un genre d'hybride mais qui se veut être un genre de contrôler de la lecture des données sur les images et des fichiers JSON tandis que storage est le modèle qui interragis directement avec la base de données SQLITE.
|
||||
|
||||
Cette classe contient des methodes qui auraient très pu (et sûrement dûes) se retrouver directement dans la vue. La plupart des methodes sont la pour génèrer des contrôles qui contiennent des informations récupèrées par la base de données ou par l'OCR.
|
||||
|
||||
#### Reader.cs
|
||||
|
||||
Cette methode est un genre d'hybride. Elle contient des calculs etc... mais sont but est de servir d'inteface entre le reste du programme et les zones/fenêtres de données.
|
||||
|
||||
C'est cette methode qui va gèrer la classe Zone, qui va demander à la classe zone de modifier ajouter ou supprimer des fenêtres etc...
|
||||
|
||||
Elle contient aussi des methodes pour charger un "Preset" et dessiner sur les Images quand une vue en a besoin.
|
||||
|
||||
#### Zone.cs
|
||||
|
||||
Cette methode est clairement la plus discutable en tant que contrôleur mais qui est en même temps la plus proche.
|
||||
|
||||
La raison est qu'elle peut être deux choses. Une zone principale ou une zone de pilote. Dans le cas ou c'est une zone de pilote c'est clairement une classe normale qui est utilisée par un contrôleur et qui retourne des infos. Mais quand elle est utilisée comme une zone principale c'est l'orchestre de toutes les zones et fenêtres.
|
||||
|
||||
Dans ce dernier cas, c'est un intermédiaire entre les zones et fenêtres. Elle ne sert qu'à contrôler des sous zones et leurs fenêtres.
|
||||
|
||||
Les seules methodes de cette classe servent à demander des informations aux sous zones/fenêtres. Il n'y a quasi aucun calculs.
|
||||
|
||||
### Modèles
|
||||
|
||||
La on va parler des classes "classiques" (lol).
|
||||
|
||||
Il y a deux types de classes dans cette liste :
|
||||
|
||||
- Les classes normales
|
||||
- Les classes enfants de Window.cs
|
||||
|
||||
Les classes normales sont indépendantes et contiennent toutes des methodes et des infos très différentes, tandis que les classes dérivées de Window.cs ont toutes la même structure et ont comme seul et unique but de retourner ce qui est marqué dans leur image.
|
||||
|
||||
Il est donc normal que ces dernière se ressemblent beaucoup.
|
||||
|
||||
#### DriverDrsWindow.cs
|
||||
|
||||
Cette classe est prévue pour contenir une image dans laquelle on peut voir l'étât du DRS d'un pilote.
|
||||
|
||||
La methode qu'elle utilise pour savoir si le pilote a activé son DRS ou non est d'utiliser la moyenne de couleur de son image.
|
||||
|
||||
Elle retourne true ou false et elle contient elle même toutes les methodes qui sont nescessaires pour donner une réponse (c'est un cas rare)
|
||||
|
||||
#### DriverGapToLeaderWindow.cs
|
||||
|
||||
Cette classe est prévue pour contenir une image dans laquelle on peut voir combien de temps sépare le pilote actuel du pilote devant lui.
|
||||
|
||||
La methode qu'elle utilise pour le savoir utilise de l'OCR et fait appel à une methode contenue dans son parent Window.
|
||||
|
||||
Elle est plutôt vide car tout le traitement est déporté dans son parent.
|
||||
|
||||
#### DriverLapTimeWindow.cs
|
||||
|
||||
Cette classe est prévue pour contenir une image dans laquelle on peut voir quel était le dernier temps au tour enregistré du pilote.
|
||||
|
||||
La methode qu'elle utilise pour le savoir utilise de l'OCR et fait appel à une methode contenue dans son parent.
|
||||
|
||||
Elle est plutôt vide car tout le traitement est déporté vers son parent.
|
||||
|
||||
#### DriverNameWindow.cs
|
||||
|
||||
Cette classe est prévue pour contenir une image dans laquelle on peut voir le nom du pilote écrit en toutes lettres.
|
||||
|
||||
La methode qu'elle utilise une partie d'OCR qui est déportée dans le parent et utilise aussi une methode appellée IsADriver (qui aurait pu aussi être déportée dans la page principale) qui vérifie si le nom trouvé existe.
|
||||
|
||||
#### DriverPositionWindow.cs
|
||||
|
||||
Cette classe est prévue pour contenir une image dans laquelle on peut voir la position d'un pilote.
|
||||
|
||||
Cette methode est également un peu vide car pour décoder l'image le traitement est déporté dans son parent.
|
||||
|
||||
#### DriverSectorWindow.cs
|
||||
|
||||
Pareil que pour DriverPositionWindow.cs
|
||||
|
||||
#### DriverTyresWindow.cs
|
||||
|
||||
Cette classe est prévue pour contenir une image dans laquelle on peut voir l'infographique qui représente le pneu du pilote.
|
||||
|
||||
Cette methode est la seule fenêtre intéressante car elle utilise du code déporté dans le parent mais aussi une certaine proportion qu'elle contient elle même.
|
||||
|
||||
Elle contient des methodes qui permettent par exemple de trouver la zone intéressante dans l'image ou choisir quel pneu un pilote chausse en fonction de la couleur moyenne de l'image de la zone trouvée.
|
||||
|
||||
Pour toutes les zones de type Window, ce qui est vraiment intéressant vous le trouverez dans le parent.
|
||||
|
||||
#### F1TVEmulator.cs
|
||||
|
||||
F1TVEmulator est la classe qui s'occupe de tout ce qui concerne le navigateur Headless.
|
||||
|
||||
Cette classe utilise la librairie Selenium et est la pour tout faire.
|
||||
|
||||
Elle s'occupe aussi bien d'envoyer la requète de cliquer sur un bouton après 34 secondes que de récupèrer les cookies qui permettront de se connecter ensuite.
|
||||
|
||||
Voici les methodes qui s'occupent des cookies :
|
||||
|
||||
- StartCookieRecovering
|
||||
- GetCookie
|
||||
|
||||
Je déconseille de modifier ces deux methodes. Elles ont une utilité très claire et elles fonctionnent. (If its not broken dont fix it)
|
||||
|
||||
Ce qui peut être intéressant en revanche c'est la seule autre methode que cette classe propose, sobrement intitulée "Start".
|
||||
|
||||
Cette methode est codée de manière totalement procédurale et décrit exactement toutes les actions à faire à partir du moment ou le navigateur est démarré, dans quel ordre et si il faut les faire ou non. Si vous vouliez modifier quelque chose ici je pense que la bonne idée serait une meilleure gestion des erreurs. Pour le moment si le programme n'arrive pas à cliquer sur certains boutons, soit une erreur est lancée soit on attend un peu avant de réessayer. La vraie chose qui manque c'est la raison pour laquelle ces boutons n'ont pas pu être cliqués. Dans l'idéal il faudrait ajouter un système qui peut detecter la panne exacte pour que le message d'erreur soit plus personnalisé.
|
||||
|
||||
Sinon c'est une methode qui marche plutôt bien et qui est faite totalement sur mesure pour l'utilisation de la F1TV.
|
||||
|
||||
#### OcrImage.cs
|
||||
|
||||
La on attaque les classes un peu plus "bordéliques"
|
||||
|
||||
Cette classe regroupe tous les actions de filtrage que l'on pourrait vouloir. Cette classe est pas mal utilisée pour l'OCR. Il n'y a que deux choses à savoir.
|
||||
|
||||
1. Presque toutes les methodes de filtres sont génériques et peuvent être utilisées à peu près nimporte ou et nimporte quand et devraient toujours fonctionner tant qu'on leur fournit ce qdnt elles ont besoin (la plupart sont en statique)
|
||||
2. La seule methode qui vas vous intéresser si vous vouleuz changer le comportement de l'OCR est la methode "Enhance"
|
||||
|
||||
La methode enhance est un genre de mode d'emploi. Selon le contexte de l'image (si c'est une image qui vient d'une fenêtre de DRS, de temps au tour, de pneu etc...) il y aura une combinaison de filtres différente.
|
||||
|
||||
Plusieurs methodes dans cette classe ne sont pas utilisées mais sont gardées car elles pourraient être utiles. La plupart du temps l'utilisation de ces filtres est décidée avec des essais à tâtons. Vous comprendrez donc vite que c'est mieux de garder sous le code des methodes car certaines combinaisons marchent mieux que d'autres.
|
||||
|
||||
#### SqliteStorage.cs
|
||||
|
||||
Cette classe est plutôt simple.
|
||||
|
||||
Ce sont simplement toutes les methodes qui permettent de créer, éditer et accèder à la base de données SQLITE.
|
||||
|
||||
Vous y trouverez des methodes qui sont simplement la pour créer la base comme d'autres plus spécifiques qui sont un peu plus spécifiques comme celles qui veulent récupèrer l'ID d'un pilote selon son nom ou celle qui veut récupèrer l'historique des temps au tour d'un pilote.
|
||||
|
||||
Rien de spécial à dire sur cette classe.
|
||||
|
||||
#### Window.cs
|
||||
|
||||
Ahlala... je pense que c'est une des classes les plus longues de tout le projet. Du haut de ses presque 700 lignes, cette classe s'occupe de tout ce que les enfants fenêtres pourraient avoir besoin.
|
||||
|
||||
On retrouve des methodes pour calculer la différence entre deux strings qui peut servir pour aider à le reconnaissance de noms de pilotes ou bien une methode qui permet de convertir une image en tableau de bytes.
|
||||
|
||||
La methode la plus grosse cependant et de loin est la methode GetTimeFromPng qui doit implémenter un système qui permet de detecter quand un temps est anormal et detecter si la raison est la mauvaise compréhension d'une ponctuation ou le rajout d'un chiffre. Cela prend énormément de place car il y a beaucoup de cas particuliers et il a fallu tout coder à la main. Je déconseille à qui que ce soit de lire cette methode car elle pourrait causer de sévères dommages au cerveau humain.
|
||||
|
||||
A ecrire ce fut une horreur, à comprendre je n'ose pas imaginer.
|
||||
|
||||
Sinon pas grand chose de plus à raconter.
|
||||
|
||||
### Structures
|
||||
|
||||
Les classes de structures sont des classes qui ne contiennent que peu ou pas de traitement et qui sont simplement la pour contenir des informations. Elles sont pratiques car elles permettent de rendre le code dans les autres classes beaucoup plus lisible et leur éviter d'utiliser des tuples bizarres.
|
||||
|
||||
#### DriverData.cs
|
||||
|
||||
Cette classe contient toutes les infos d'un pilote à un moment donné.
|
||||
|
||||
On peut voir cette classe comme une classe contenant une ligne de la F1TV. Toutes les données à propos d'un pilote que l'on peut detecter en une detection sont stockées la dedans.
|
||||
|
||||
Il n'y a pas de notion d'historique ou quoi que ce soit. C'est simplement un moyen de stocker des données de pilotes dans d'autres classes en ayant un nom logique et aider à la lecture. Pas réellement de traitement.
|
||||
|
||||
Ce fichier contient également un autre objet : Tyre.
|
||||
|
||||
Cet object contient les infos d'un pneu rien de plus.
|
||||
|
||||
Et voila ce fut un résumé extrêmement succint de tous les fichiers .CS de l'application pour que vous sachiez ce que vous regardez quand vous irez voir dans la partie code source de la documentation. Normalement il devrait y avoir aussi un certain nombre de commentaires dans ces fichiers pour expliquer certains choix un peu bizarres. C'est en anglais mais pas de l'anglais très difficile à comprendre. Bonne chance !
|
||||
|
||||
## Glossaire
|
||||
|
||||
----
|
||||
|
||||
1. Browser/navigateur Headless :
|
||||
2. OCR :
|
||||
3. TDD :
|
||||
4. C#
|
||||
5. Python
|
||||
6. Tesseract
|
||||
7.
|
||||
|
||||
Vocabulaire F1 :
|
||||
|
||||
1. DRS : Drag Reduction System. : Système qui permet d'ouvrir l'aileron arrière de la monoplace quand elle se trouve à une seconde ou moins de la voiture devant elle. Cela permet de réduire la trainée que la voiture subit et lui permet d'avoir un petit boost qui aide à dépasser.
|
||||
2. Pitstop : Arrêt aux stands : Pendant une course de F1, les pneus s'usent extrêment vite et tous les pilotes sont obligés de passer au moins une fois par les stands par course pour les changer. Et pour changer ces pneus ils font un arrêt aux stands que l'on appelle dans le milieu un Pitstop.
|
||||
3. Pneus Hard,Medium,Soft,Inter,Wet : Types de pneus de F1. Hard est un pneu qui ne s'use pas beaucoup mais qui est lent, Soft est l'inverse et Medium est l'entre deux. Les pneus sont des outils stratégiques et il est très important de savoir lequel chaque pilote utilise. Les pneus Inter et Wet sont des pneus pluies, l'Inter étant pour les faibles pluies.
|
||||
4. Secteur : Setion de circuit : Les circuits de F1 sont toujours découpés en trois parties qui sont mesurées séparément et qui permettent une meilleure granularité dans l'estimation des résultats. On est pas obligé d'attendre la fin d'un tour pour savoir si un pilote est rapide ou non et on peut voir dans quelle partie du circuit il est rapide ou lent.
|
||||
5. Monoplace : Voiture à une seule place, terme utilisé souvent pour décrire les F1 dans le document.
|
||||
6. Grand Prix : Course officielle de Formule 1. Evenement faisant partie du championnat du monde de Formule 1.
|
||||
|
||||
Vocabulaire projet :
|
||||
|
||||
1. Browser/navigateur Headless : Navigateur qui existe et fonctionne sans interface graphique
|
||||
2. OCR : Optical Character Recognition : Processus de reconnaissance de texte sur une image par un ordinateur
|
||||
3. TDD : Test Driver Developppement : Développement avec pour objectif les test. Les tests sont écrits en amont et le but du développeur est simplement de les faire passer.
|
||||
4. MVC : Modèle Vue Controlleur : Architecture de projet qui sépare le traitement de l'information, son affichage et sa gestion.
|
||||
5. Preset : (dans ce projet) Set d'informations préparées à l'avance pour être utilisés ultérieurement.
|
||||
6. DB : Data Base / Base de donnée
|
||||
7. Cookie : Fichier créé par un site internet stocké sur la machine du client qui est utilisé en général pour conserver des informations de connection même après la fermeture du navigateur.
|
||||
8. Window : Fenêtre (dans ce projet) objet contenant une partie d'une image contenant une information précise.
|
||||
9. Zone : (dans ce projet) objet contenant une partie d'une image qui peu être sous divisée en fenêtres de données.
|
||||
10. Wrapper : Code qui s'occupe de faire l'interface entre une librairie ou une classe pour rendre l'utilisation plus simple ou plus propre
|
||||
11. JSON : JavaScript Object Notation : Format de fichier qui permet de stocker des informations dans un format très précis
|
||||
12. AWS : Amazon Web Service : Service d'hébergement d'Amazon
|
||||
13. User Agent : Signature numérique du navigateur qui permet à un site de détecter le type d'appareil et de navigateur connecté (peut être changé manuellement)
|
||||
14. CSV : Comma Separated Values : Format de fichier qui permet de stocker facilement des données sous forme de tableau
|
||||
15. API : Application Programming Interface : Interface générique qui permet d'accèder à une ressource.
|
||||
Reference in New Issue
Block a user