Action getlinepos
  (recupere la position de la ligne)
    Ve :	llp, rlp [pointeurs sur octet]
		  (left & right line position)
		lastls [entier]
		  (last line state)
    Vr : 	[entier]
		  (constante indiquant la position de la ligne)
    Av : 	lllp, lrlp [octets]
		  (last llp & rlp)
Debut
|	lllp <- *llp
|	lrlp <- *rlp
|	*llp <- 0
|	*rlp <- 0
|    
|	Lecture des capteurs,
|	Si un capteur est sur une ligne blanche
|	|	Marquer ce capteur (OU logique)
|	|	 dans l'octet correspondant au cote du capteur
|	FinSi
|
|	Si on n'a localise la ligne nulle part
|	|	On decide qu'elle est la ou elle etait juste avant
|	FinSi
|
|	Si la ligne est a plusieurs endroite
|	|ET ce n'est pas que au centre
|	|	Renvoyer qu'on croise une ligne
|	Sinon
|	|	En fonction de la position de la ligne,
|	|	Renvoyer la position (constante) adquate
|	FinSi
|
|	(on ne devrait jamais arriver ici)
|	Renvoyer qu'il y a eu une erreur
Fin

Action principale
    lvit, rvit [entiers]
      (rapport cyclique des moteurs)
    linestate, lls [entiers]
      (etats actuel et precedent de la ligne)
    llp, rlp [octets]
      (position actuelle de la ligne)
    ishere, washere [octets]
      (etats actuel et precedent de la detection de barriere)
    usd, usdd [entiers sur 32 bits]
      (etats et temporisation pour la detection a droite)
Debut
|	Initialiser le PIC
|
|	TantQue le jack est en place
|	|	Ne rien faire
|	FinTantQue
|
|	TantQue la barriere n'est pas encore tombee (ie: washere=0)
|	|	lls <- linestate
|	|	linestate <- getlinepos(&llp, &rlp, lls) (ou est la ligne ?)
|	|
|	|	Selon linestate
|	|	|	Regler la vitesse des moteurs pour corriger
|	|	|	 la trajectoire (avec lvit et rvit)
|	|	|	
|	|	|	Cas ligne blanche croisee (cas particulier)
|	|	|	|	Si juste avant on en croisait pas une ligne
|	|	|	|	|blanche (verification de lls)
|	|	|	|	|	Si on detectait deja a droite (ie: usd>0)
|	|	|	|	|	|	Arreter de detecter (ie: usd <- 0)
|	|	|	|	|	Sinon
|	|	|	|	|	|	Commencer la detection (ie: usd <- 1)
|	|	|	|	|	FinSi
|	|	|	|	FinSi
|	|	|	FinCas
|	|	FinSelon
|	|
|	|	Si on detecte a droite, mais on n'est pas a l'arret (ie: usd>0 ET usdd=0)
|	|	|	Incrementer usd
|	|	|	Si on a atteint le temps limite (ie: usd>USDMAX)
|	|	|	|	Arreter de detecter (ie: usd <- 0)
|	|	|	FinSi
|	|	FinSi
|	|
|	|	Si on detecte A GAUCHE et on etait a l'arret (ie: ddrl>0)
|	|	|	On ne prend plus les ultrasons en compte (ie: usd <- 0, usdd <- 0)
|	|	SinonSi usd>0 ET on detecte A DROITE
|	|	|OU on est a l'arret (ie: usdd>0)
|	|	|	Arreter les moteur (avec lvit et rvit)
|	|	|	Incrementer usdd
|	|	|	Si on a atteint le temps limite (ie: usdd>USDDMAX)
|	|	|	|	On ne prend plus les ultrasons en compte
|	|	|	FinSi
|	|	FinSi
|	|
|	|	Si on heurte la barriere ET c'est la premiere fois (ie: ishere=0)
|	|	|	ishere <- 1
|	|	SinonSi on ne heurte pas la barriere ET on l'a heurtee avant (ie: ishere=1)
|	|	|	washere <- 1
|	|	FinSi
|	|
|	|	Mettre le moteur gauche a la vitesse lvit
|	|	Mettre le moteur droit a la vitesse rvit
|	FinTantQue
|
|	Arreter les moteurs
|	TantQue VRAI
|	|	Ne rien faire
|	FinTantQue
Fin