<commit_before># UI-Debug
Ce dépôt contient une interface de débogage pour faciliter les travaux de développement pour StrategyIA et le reste du projet RoboCupULaval.

L'interface permet de visualiser diverses informations:

* Les robots identifiés par la vue
* Leur direction vectorielle
* Les positions du pathfinder
* Informations arbitraires en provenance d'un client (_e.g_: StrategyIA)

## Communication et API

L'application agit comme un serveur et une interface graphique selon le cadre **MVC**.
Un serveur UDP sur une adresse multicast est créé et les clients s'y connectent pour envoyer les informations de débogage.
Pour le client de l'IA, une communication bidirectionnelle est activée afin de permettre à l'interface d'envoyer des commandes.

L'**UI-Debug** assumme aussi la présence du serveur de vision: _vision-SSL_ ou _grSim_.
Il va obtenir directement de ce serveur les frames de visions et les clients se synchronisent tous en utilisant le numéro de frame.

La **version 0.0** garantie les API suivante:

### Protocole de communication v1.0

L'API est disponible pour le langage Python. Tous les paquets de données transférés sont des dictionnaires python qui sont sérialisés avec la librairie pickle.
Chaque paquet de données se structure de la manière suivante :

```python
packet = {'name': str,      # Indique le nom de l'émetteur.
          'version': str,   # Indique la version de l'API utilisée.
          'type': int,      # Indique le type de données.
          'link': int,      # Indique la numéro du robot dont les données sont associées (None étant aucun).
          'data': dict(...) # Données du paquet dans un dictionnaire (cf. les données par type).
          }

""" Exemple de paquet : Afficher une ligne rouge pendant 5 secondes """
packet = {'name': 'JulienB',
          'version': '1.0',
          'type': 3001,
          'link': None,
          'data': {'start': (100, 100),
                   'end':   (200, 200),
                   'color': (255, 0, 0),
                   'width': 2,
                   'style': 'SolidLine',
                   'timeout': 5
                   }
          }
```

#### Définition des types de données

Les données sont divisées en 4 familles qui ont chacunes leurs spécificités :

  Valeur type | Nom de Famille | Description
------------- | -------------- | ---------------------------------------------------------------------------------------
0 <= 999      | Logger         | Affiche de l'information sous forme de texte dans la fenêtre assignée dans l'UI.
1000 <= 2999  | Setter/Getter  | Permet de paramétrer des données de l'IA dans l'UI ou de récupérer des données de l'UI de maniére ponctuelle.
3000 <= 4999  | Drawer         | Dessine des éléments dans la fenêtre du terrain.
5000 <= 6999  | Sender         | Commande envoyée de l'UI vers le client

### Description des données par type

L'information du paquet['data'] sont les données que l'on souhaite traiter. Il y a un type différent par données.

```python
# Type 1 - Affiche n'importe quelles données dans la fenêtre du logger.
data = {'data_header_1': int/str,
        'data_header_2': int/str,
        ...
        'data_header_n': int/str}

# Type 2 - Affiche un message texte avec un niveau d'importance.
data = {'level': int,       # 0:NOSET | 1:DEBUG | 2:INFO | 3:WARN | 4:ERR | 5:CRIT
        'message': str}     # Message à envoyer

""" ... """

# Type 1001 - Envoie à l'UI la liste des stratégies, tactiques et actions disponibles.
data = {'strategy': list(str),      # Liste de toutes les stratégies
        'tactic': list(str),        # Liste de toutes les tactiques
        'action': list(str)}        # Liste de toutes les actions

""" ... """

# Type 3001 - Dessine une Ligne simple dans la fenêtre graphique du terrain.
data = {'start': tuple(int, int),       # Coordonnées du premier point
        'end': tuple(int, int),         # Coordonnées du point final
        'color': tuple(int, int, int),  # Couleur RGB
        'width': int,                   # Épaisseur du trait
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3002 - Dessine une Série de Lignes dans la fenêtre graphique du terrain.
data = {'points': list(tuple(int, int)), # Liste de coordonnées du premier point
        'color': tuple(int, int, int),  # Couleur RGB
        'width': int,                   # Épaisseur du trait
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3003 - Dessine un Cercle dans la fenêtre graphique du terrain.
data = {'center': tuple(int, int),      # Coordonnées du centre du cercle
        'radius': int,                  # Rayon du cercle
        'color': tuple(int, int int),   # Couleur RGB
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'is_fill': bool,                # Si le cercle est rempli ou non
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3004 - Dessine un Point dans la fenêtre graphique du terrain.
data = {'point': tuple(int, int),       # Coordonnées du centre du cercle
        'width': int,                   # Taille en pixel du point
        'color': tuple(int, int int),   # Couleur RGB
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3005 - Dessine une Série de Point dans la fenêtre graphique du terrain.
data = {'points': list(tuple(int, int)),# Coordonnées du centre du cercle
        'width': int,                   # Taille en pixel du point
        'color': tuple(int, int int),   # Couleur RGB
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3006 - Dessine un Rectangle dans la fenêtre graphique du terrain.
data = {'top_left': tuple(int, int),    # Coordonnées du premier point
        'bottom_right': tuple(int, int),# Coordonnées du point final
        'color': tuple(int, int, int),  # Couleur RGB
        'width': int,                   # Épaisseur du trait
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'is_fill': bool,                # Si le forme est rempli ou non
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3007 - Dessine les informations d'une Influence Map sur le terrain.
data = {'field_data': list(int, int, ...),      # Données de l'Influence Map
        'size': tuple(int, int),                # Taille de la grille
        'focus': tuple(int, int, int, int)      # Affiche uniquement les données dans un rectangle prédéfini
        'hotest_numb': int,                     # Nombre le plus élevé
        'hotest_color': tuple(int, int ,int ),  # Couleur RGB du nombre le plus élevé
        'coldest_numb': int,                    # Nombre le moins élevé
        'coldest_color': tuple(int, int, int),  # Couleur RGB du nombre le moins élevé
        'has_grid': bool,                       # Affichage de la grille ?
        'grid_color': tuple(int, int, int),     # Couleur RGB des traits de la grille
        'grid_width': int,                      # Taille des traits de la grille
        'grid_style': str,                      # SolidLine | DashLine | DotLine | DashDotLine
        'opacity': int}                         # Indice d'opacité de la grille de 0 à 10 (0 étant transparente)
        'timeout': int                          # Temps d'affichage en seconde (0 étant un temps infini)
        }

# Type 3008 - Dessine un Texte de couleur
data = {'position': tuple(int, int)     # Position de l'affichage du texte
        'text': str,                    # Texte à afficher
         s'size': int,                    # Taille du texte en pixel
        'font': str,                    # Arial | Courier New | Verdana
        'align': str,                   # Right | Left | Center
        'color': tuple(int, int, int),  # Couleur RGB
        'has_bold': bool,               # Si le texte est en gras
        'has_italic': bool,             # Si le texte est en italic
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)
        }
```

### API serveur->ia

* _toggle-human-control_
* _set-robot-tactic_
* _set-robot-target_
* _set-strategy_

### API client->serveur

* _draw-line_
* _draw-circle_
* _display-text_
* _create-filter_


## Évolution

**UI-Debug** est une appplication indépendante avec comme seule dépendance le serveur de vision.
L'application a donc la responsabilité de déterminer comment afficher et dessiner les différents éléments.
Les différents clients sont libres de choisir comment ils gèrent leur envoi d'information, la frontière d'E/S étant codifiée par les API décris ci-haut.

Les versions majeures peuvent potentiellement modifier ces API.

## Standard de code

Le projet respecte les mêmes standards de code décrit dans le dépôt RoboCupULavalHautNiveau/Admin.

* PEP-8
* Docstring PEP-257
* Unit Test: nosetests

## Responsable

_(30 mai 2016)_ <NAME>'au _31 août 2016_
<commit_msg>add optional attributs for drawing communication protocol<commit_after># UI-Debug
Ce dépôt contient une interface de débogage pour faciliter les travaux de développement pour StrategyIA et le reste du projet RoboCupULaval.

L'interface permet de visualiser diverses informations:

* Les robots identifiés par la vue
* Leur direction vectorielle
* Les positions du pathfinder
* Informations arbitraires en provenance d'un client (_e.g_: StrategyIA)

## Communication et API

L'application agit comme un serveur et une interface graphique selon le cadre **MVC**.
Un serveur UDP sur une adresse multicast est créé et les clients s'y connectent pour envoyer les informations de débogage.
Pour le client de l'IA, une communication bidirectionnelle est activée afin de permettre à l'interface d'envoyer des commandes.

L'**UI-Debug** assumme aussi la présence du serveur de vision: _vision-SSL_ ou _grSim_.
Il va obtenir directement de ce serveur les frames de visions et les clients se synchronisent tous en utilisant le numéro de frame.

La **version 0.0** garantie les API suivante:

### Protocole de communication v1.0

L'API est disponible pour le langage Python. Tous les paquets de données transférés sont des dictionnaires python qui sont sérialisés avec la librairie pickle.
Chaque paquet de données se structure de la manière suivante :

```python
packet = {'name': str,      # Indique le nom de l'émetteur.
          'version': str,   # Indique la version de l'API utilisée.
          'type': int,      # Indique le type de données.
          'link': int,      # Indique la numéro du robot dont les données sont associées (None étant aucun).
          'data': dict(...) # Données du paquet dans un dictionnaire (cf. les données par type).
          }

""" Exemple de paquet : Afficher une ligne rouge pendant 5 secondes """
packet = {'name': 'JulienB',
          'version': '1.0',
          'type': 3001,
          'link': None,
          'data': {'start': (100, 100),
                   'end':   (200, 200),
                   'color': (255, 0, 0),
                   'width': 2,
                   'style': 'SolidLine',
                   'timeout': 5
                   }
          }
```

#### Définition des types de données

Les données sont divisées en 4 familles qui ont chacunes leurs spécificités :

  Valeur type | Nom de Famille | Description
------------- | -------------- | ---------------------------------------------------------------------------------------
0 <= 999      | Logger         | Affiche de l'information sous forme de texte dans la fenêtre assignée dans l'UI.
1000 <= 2999  | Setter/Getter  | Permet de paramétrer des données de l'IA dans l'UI ou de récupérer des données de l'UI de maniére ponctuelle.
3000 <= 4999  | Drawer         | Dessine des éléments dans la fenêtre du terrain.
5000 <= 6999  | Sender         | Commande envoyée de l'UI vers le client

### Description des données par type

L'information du paquet['data'] sont les données que l'on souhaite traiter. Il y a un type différent par données.

```python
# Type 1 - Affiche n'importe quelles données dans la fenêtre du logger.
data = {'data_header_1': int/str,
        'data_header_2': int/str,
        ...
        'data_header_n': int/str}

# Type 2 - Affiche un message texte avec un niveau d'importance.
data = {'level': int,       # 0:NOSET | 1:DEBUG | 2:INFO | 3:WARN | 4:ERR | 5:CRIT
        'message': str}     # Message à envoyer

""" ... """

# Type 1001 - Envoie à l'UI la liste des stratégies, tactiques et actions disponibles.
data = {'strategy': list(str),      # Liste de toutes les stratégies
        'tactic': list(str),        # Liste de toutes les tactiques
        'action': list(str)}        # Liste de toutes les actions

""" ... """

# Type 3001 - Dessine une Ligne simple dans la fenêtre graphique du terrain.
data = {'start': tuple(int, int),       # Coordonnées du premier point
        'end': tuple(int, int),         # Coordonnées du point final
        # === Options supplémentaires ===
        'color': tuple(int, int, int),  # Couleur RGB
        'width': int,                   # Épaisseur du trait
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3002 - Dessine une Série de Lignes dans la fenêtre graphique du terrain.
data = {'points': list(tuple(int, int)), # Liste de coordonnées du premier point
        # === Options supplémentaires ===
        'color': tuple(int, int, int),  # Couleur RGB
        'width': int,                   # Épaisseur du trait
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3003 - Dessine un Cercle dans la fenêtre graphique du terrain.
data = {'center': tuple(int, int),      # Coordonnées du centre du cercle
        'radius': int,                  # Rayon du cercle
        # === Options supplémentaires ===
        'color': tuple(int, int int),   # Couleur RGB
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'is_fill': bool,                # Si le cercle est rempli ou non
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3004 - Dessine un Point dans la fenêtre graphique du terrain.
data = {'point': tuple(int, int),       # Coordonnées du centre du cercle
        # === Options supplémentaires ===
        'width': int,                   # Taille en pixel du point
        'color': tuple(int, int int),   # Couleur RGB
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3005 - Dessine une Série de Point dans la fenêtre graphique du terrain.
data = {'points': list(tuple(int, int)),# Coordonnées du centre du cercle
        # === Options supplémentaires ===
        'width': int,                   # Taille en pixel du point
        'color': tuple(int, int int),   # Couleur RGB
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3006 - Dessine un Rectangle dans la fenêtre graphique du terrain.
data = {'top_left': tuple(int, int),    # Coordonnées du premier point
        'bottom_right': tuple(int, int),# Coordonnées du point final
        # === Options supplémentaires ===
        'color': tuple(int, int, int),  # Couleur RGB
        'width': int,                   # Épaisseur du trait
        'style': str,                   # SolidLine | DashLine | DotLine | DashDotLine
        'is_fill': bool,                # Si le forme est rempli ou non
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)

# Type 3007 - Dessine les informations d'une Influence Map sur le terrain.
data = {'field_data': list(int, int, ...),      # Données de l'Influence Map
        # === Options supplémentaires ===
        'size': tuple(int, int),                # Taille de la grille
        'focus': tuple(int, int, int, int)      # Affiche uniquement les données dans un rectangle prédéfini
        'hotest_numb': int,                     # Nombre le plus élevé
        'hotest_color': tuple(int, int ,int ),  # Couleur RGB du nombre le plus élevé
        'coldest_numb': int,                    # Nombre le moins élevé
        'coldest_color': tuple(int, int, int),  # Couleur RGB du nombre le moins élevé
        'has_grid': bool,                       # Affichage de la grille ?
        'grid_color': tuple(int, int, int),     # Couleur RGB des traits de la grille
        'grid_width': int,                      # Taille des traits de la grille
        'grid_style': str,                      # SolidLine | DashLine | DotLine | DashDotLine
        'opacity': int}                         # Indice d'opacité de la grille de 0 à 10 (0 étant transparente)
        'timeout': int                          # Temps d'affichage en seconde (0 étant un temps infini)
        }

# Type 3008 - Dessine un Texte de couleur
data = {'position': tuple(int, int)     # Position de l'affichage du texte
        'text': str,                    # Texte à afficher
        # === Options supplémentaires ===
        'size': int,                    # Taille du texte en pixel
        'font': str,                    # Arial | Courier New | Verdana
        'align': str,                   # Right | Left | Center
        'color': tuple(int, int, int),  # Couleur RGB
        'has_bold': bool,               # Si le texte est en gras
        'has_italic': bool,             # Si le texte est en italic
        'timeout': int}                 # Temps d'affichage en seconde (0 étant un temps infini)
        }
```

### API serveur->ia

* _toggle-human-control_
* _set-robot-tactic_
* _set-robot-target_
* _set-strategy_

### API client->serveur

* _draw-line_
* _draw-circle_
* _display-text_
* _create-filter_


## Évolution

**UI-Debug** est une appplication indépendante avec comme seule dépendance le serveur de vision.
L'application a donc la responsabilité de déterminer comment afficher et dessiner les différents éléments.
Les différents clients sont libres de choisir comment ils gèrent leur envoi d'information, la frontière d'E/S étant codifiée par les API décris ci-haut.

Les versions majeures peuvent potentiellement modifier ces API.

## Standard de code

Le projet respecte les mêmes standards de code décrit dans le dépôt RoboCupULavalHautNiveau/Admin.

* PEP-8
* Docstring PEP-257
* Unit Test: nosetests

## Responsable

_(30 mai 2016)_ <NAME>'au _31 août 2016_

{'fraction_non_alphanumeric': 0.10261824324324324, 'fraction_numerical': 0.014041385135135136, 'mean_word_length': 2.2263283378746594, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '431136', 'n_tokens_mistral': 5903, 'n_tokens_neox': 5682, 'n_words': 2168}