Added to the documentation
This commit is contained in:
63
Doc.md
63
Doc.md
@@ -111,3 +111,66 @@ Si le master ne recoit pas tous les ACK au bout d'un certain temps, alors il ren
|
||||
##### Resultat
|
||||
|
||||
En principe, après toutes ces étapes, le master a une grille interne qui repertorie la position de toutes les cartes et toutes les cartes ont une position. Le master est donc prêt à envoyer des paquets à nimporte quelle carte de la grille en fonction de son addresse et chaque carte est capable de répondre. On a donc un écran initialisé.
|
||||
|
||||
#### Envoi des informations de pixels
|
||||
|
||||
Maintenant que l'on a une carte Maitre qui sait quelles cartes sont connectées à la grille et la position de chaqune et que toutes les cartes elles mêmes savent ou elles se positionne dans la grille, on peut passer aux choses sérieuses.
|
||||
|
||||
Le maitre va recevoir les informations sur l'image à afficher depuis le driver linux qui communique à travers le port USB. Ensuite quand le maitre a un paquet qui contient les valeurs de 16x16 pixels et que il sait ou l'envoyer dans la matrice, il envoie le paquet sur une de ses sorties UART pour que laisser le message se propager. (Sauf dans le cas ou les leds à allumer sont celles du maitre lui même)
|
||||
|
||||
On a deja vu en partie le système de distribution des messages plus haut mais on va rentrer dans les détails ici.
|
||||
|
||||
##### Algo de distribution de messages
|
||||
|
||||
Voici le diagramme qui décrit le système de distribution des messages à travers la matrice :
|
||||
|
||||

|
||||
|
||||
Dans l'odre, quand un slave recoit un paquet d'information sur une de ses entrées UART :
|
||||
|
||||
1. Il vérifie si le message lui est destiné, si oui alors on prend en compte l'information et on envoie un paquet d'ACK en 0,0 (master) sur l'entrée ou le message est arrivé
|
||||
|
||||
2. Si le message ne nous est pas destiné alors on lit dans l'entête combien de paquets vont arriver pour cette destination et on les route tous vers la destination
|
||||
|
||||
3. Pour savoir sur quelle sortie router notre paquet, on suit l'algorythme suivant :
|
||||
|
||||
- On imagine une droite diagonale qui part du coin en direction cardinale de la destination et qui continue à 45 degrés (ex pour x,y = 4;5 en partant de 2,2 la diagonale part du coin haut droite mais pour une destination de 1,3 alors que on part de 5,5 la diagonale part du coin bas gauche à 45 degrés)
|
||||
- Ensuite on regarde de quel côté de cette ligne la destination se trouve et on envoie un paquet sur le côté en question.
|
||||
|
||||
Voici deux exemples graphiques pour se faire une meilleure idée :
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Voici l'algorythme formel qui devrait permettre d'implémenter cette solution.
|
||||
|
||||
Soit pos.x et pos.y la position de notre matrice courante
|
||||
Soit X et Y la position de destination
|
||||
Soit diffX et diffY la différence absolue entre la position courante x et y et celle de la destination
|
||||
|
||||
On choisit d'envoyer à droite si :
|
||||
|
||||
- X > pos.x && diffY < diffX
|
||||
|
||||
On choisit d'envoyer à gauche si :
|
||||
|
||||
- X < pos.x && diffY < diffX
|
||||
|
||||
On choisit d'envoyer en haut si
|
||||
|
||||
- Y > pos.Y && diffY > diffX
|
||||
|
||||
On choisit d'envoyer en bas si
|
||||
|
||||
- Y < pos.Y && diffY > diffX
|
||||
|
||||
Dans les cas ou la diffX et la diffY sont les mêmes, alors on alterne en fonction de si la différence est paire ou impaire. (Si on venait à hésiter entre droit et bas, on choisirait le bas quand la différence est impaire et le haut quand elle est paire)
|
||||
|
||||
##### Pourquoi s'embêter comme ca?
|
||||
|
||||
On pourrait en voyant ca se dire que c'est un poil plus compliqué que nécessaire. En effet un algo plus simple du genre "tant que pos.y != Y alors on envoie en haut ou en bas et quand pos.y == Y alors on s'occupe de pos.x..." Ce qui serait très simple et très facile à visualiser.
|
||||
|
||||
C'était l'algo prévu à la base, le problème vient du fait que comme notre liaison UART est notre principal goulot d'étranglement, on veut absolument utiliser les interfaces de la manière la plus efficace possible. Donc si notre master ou les cartes proches du master peuvent utiliser le plus possible chaque entrée de manière parfaitement équilibrée cela permet de garder une transmission de données plus élevée. (Exemple, si une sortie UART permet la transmission de 1mbit/s, alors si on parvient à utiliser celle du haut et de droite de manière parfaitement équivalentes, alors on peut monter à 2mbit/s ce qui peut drastiquement changer la vitesse de rafraichissement de notre grille)
|
||||
|
||||
Si on y réfléchis un peu plus, on peut se dire que le gain n'est important que pour la carte maitre et potentiellement les cartes directement adjacentes, mais comme on doit avoir le même code sur toutes les cartes c'est plus simple d'utiliser le même algorythme de distribution partout.
|
||||
|
||||
BIN
Media/MessageDirection1.png
Normal file
BIN
Media/MessageDirection1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.8 KiB |
BIN
Media/MessageDirection2.png
Normal file
BIN
Media/MessageDirection2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.8 KiB |
Reference in New Issue
Block a user