# TP1 Installation, "Hello World" et led-bp user
## Auteurs
-RAMS Sean
-BEYRIERE Estephe
### :small_blue_diamond: **Date: 3/02/2023**
## 1. Préambule
## 2. Hello World! RaspberryPi
### 1. Pourquoi passer par la redirection des ports ?
#### Réponse: Cela permet d'éviter plusieurs adresses IP et donc de simplifier la connexion ssh.
### 2. Pourquoi faut-il que vos fichiers soit dans un répertoire propre sur une RaspberryPi ?
#### Réponse: La raison principale est qu'il faut que notre soit exécuté sur la rasberry afin de pouvoir utiliser les systèmes connectés à son GPIO, de plus il faut que ce soit propre afin que les différents groupes n'écrasent pas les executable des autres.
## 3. Configuration des clés ssh
### Remarque sur la partie
#### La configuration de clé ssh est utile et c'est bien d'avoir un exemple.
## 4. Prise en mains des outils de développement: Hello World!
### Remarque sur la partie
#### Bien que connaisant déjà, revoir les commandes de connection shh et surtout de scp est utile, de plus l'idée de le combiner à un MAKEFILE permet de ce simplifier la vie.
#### Le point nouveaux et pratique vu dans le MAKEFILE est les $@ et $<, qui permet rescpetivement, de prendre la première ou toutes les dépendance comme entrée de la commande.
#### Un autre chose nouvelle est la cross compilation mais qui dans notre cas différe que peu de la compilation classique par ligne de commande.
## 5. Contrôle de GPIO en sortie
### Remarque sur la partie
#### Les fonctions définies étant claire et ayant une petite experience avec les GPIO, il y a assez peu à dire en plus des questions.
### 1. Expliquez pourquoi il pourrait être dangereux de se tromper de broche pour la configuration des GPIO.
#### Réponse: En ce trompant dans la configuration, on peut se retrouver à faire un court circuit ce qui va énormément réduire la durée de vie du processeur.
### 2. A quoi correspond l'adresse BCM2835_GPIO_BASE ?
#### Réponse: Cela correspond à la première adresse (virtuel) des registre de configuration du GPIO.
### 3. Que représente la structure struct gpio_s ?
#### Réponse: Elle représente tous les registres de contrôle des GPIO.
### 4. Dans quel espace d'adressage est l'adresse gpio_regs_virt ?
#### Réponse: Cette adresse est contenue dans l'espace utilisateur du processus et c'est une variable globale.
### 5. Dans la fonction gpio_fsel(), que contient la variable reg ?
#### Réponse: Reg permet de choisir la bonne case du tableau gpfsel de gpio_regs. Etant donné qu'il y a 3 bits dédiés pour la sélection de sa fonction par pin GPIO il faut donc la dizaine du numero du port representant le numero de l'entier 32 bits comportant les 10 pins
### 6. Dans la fonction gpio_write(), pourquoi écrire à deux adresses différentes en fonction de la valeur val ?
#### Réponse: Cela est dù au fonctionnement de registre GPSET et GPCLR. Lorsque l'on met un bit des registre GPSET () à 1, la pin associé à ce bit passe à 1 (si elle en mode OUT). Cependant si le bit est à 0 alors la pin conserve sa valeur. Le fonction GPCLR est la même à l'exception que la pin passera à 0.
### 7. Dans la fonction gpio_mmap(), à quoi correspondent les flags de open() ?
#### Réponse: Le flag O_RDWR permet de lire et écrire sur l'emplacement descripteur de fichier tant dit que le le flag O_SYNC permet de s'assurer de l'écriture sur le descripteur de fichier.
### 8.Dans la fonction gpio_mmap(), commentez les arguments de mmap().
#### Réponse: NULL indique que l'on demande aucun emplacement mémoire particulier.
#### RPI_BLOCK_SIZE est la taille de l'emplacement mémoire que l'on alloue.
#### PROT_READ | PROT_WRITE donne les autorisation de lecture et d'écriture sur l'emplacement.
#### MAP_SHARED permet à ce que tous les processus puissent directement éditer l'emplacement.
#### mmap_fd est l'integer du descripteur de fichier.
#### BCM2835_GPIO_BASE est l'offset sur lequel on se place par rapport au fichier décrit par nmap_fd
### 9. Que fait la fonction delay() ?
#### Réponse: Elle permet d'attendre X (donnée en argument) milliseconde durant lequel le processus ne s'execute pas.
### 10. Pourquoi doit-on utiliser sudo ?
#### Réponse: Afin de pouvoir utiliser les pins GPIO, il faut être administrateur, d'où la commande sudo.
## 6. Contrôle de plusieurs GPIO en mode "sortie"
### Remarque sur la partie
#### Peu de choses nouvelles dans cette partie car ayant, tous deux, utiliser les thread c++ la seul différence étant dans l'initialisation. La seule remarque est qu'il faut instancier les thread et non (comme nous l'avons fait au départ) d'instancier des pointeurs de thread (la fonction pthread_create n'alloue pas l'emplacement mémoire du thread).
#### Pour la communication entre les threads, nous utilisons une structure de données instancié dans le main qui est passée, via des pointeurs, aux threads. Cette structure est composée d'un int pour la PIN et un int de valeur pour la fréquence de la led.
#### De plus, l'utilisation de GPIO ne diffèrent pas de la partie précédente, il y a rien à dire de ce côté-ci.
## 7. Lecture de la valeur d'une entrée GPIO
### Remarque sur la partie
#### Les seuls points intéressants à noter pour cette partie sont le moyen mis en place pour détecter une pression (en évitant d'être perturber par le contre-rebond) et la communication entre les threads.
#### Concernant le contre contre-rebond, nous avons utilisé la fonction delay pour tester les fronts toute les 20 millisecondes et ainsi attendre la fin des "perturbations".
#### Concernant la communication, nous recyclons notre structure de données et utilisons le paramètre valeur comme variable pour stocker l'état du bouton. Dans le cas où nous avons besoin de plusieurs pin, nous utilisons un tableau de pointeur de structure pour stocker tous les pins qui communiquent entre eux (dans notre utilisation actuelle nous n'avons pas besoin de mécanisme de synchronisation).
## 8. Pour les plus motivés.
### Remarque sur la partie
#### Il n'y a rien à dire de nouveau car cette partie est juste une combinaison des parties précédentes.