Programmation en C: Série 2

Exercice 1: GPS

Les appareils GPS industriels transmettent les informations au format NMEA 0183.

A. Extraire les positions

Le GPS nous indique sa position avec des messages GPGGA:

$GPGGA,092750.000,4631.2105,N,00633.9330,E,1,8,1.03,399.7,M,50.3,M,,*54
$GPGGA,124632,4558.583,N,00739.500,E,1,9,1.05,4477.8,M,50.2,M,,*7A
...

Ecrivez un programme (ou une fonction) qui extrait et affiche:

d'un tel message.

			#load solutions/gpsA.c
		
			#load solutions/gpsA-virgules.c
		
			#load solutions/gpsA-sscanf.c
		
			#load solutions/gpsA-atoi.c
		

B. Vérifier le type des messages

Ajoutez du code pour vérifier si le message commence par $GPGGA, et affichez une erreur si nécessaire.

			#load solutions/gpsB.c
		

C. Afficher les satellites

Le GPS nous indique les satellites avec un groupe de messages GPGSV:

$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76

Chaque message contient jusqu'à 4 satellites avec:

Ecrivez une fonction qui extrait et affiche la liste des satellites sous une forme bien lisible, par ex:

ID   ELEVATION  AZIMUT     SNR
10   63°        137°       17
...
			#load solutions/gpsC.c
		
			#load solutions/gps-lireProchain.c
		

D. Vérifier la somme de contrôle

Chaque message est suivi par une somme de contrôle à la fin:

$GPGGA,092750.000,4631.2105,N,00633.9330,E,1,8,1.03,399.7,M,50.3,M,,*54

Ecrivez une fonction qui vérifie la cette somme, qui se calcule comme suit:

Notation hexadécimale

Le premier chiffre est la somme divisé par 16, arrondie vers le bas, et le deuxième chiffre le reste de cette division (modulo, opérateur % en C). Les chiffres sont codés comme suit:

0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

Avec printf ou scanf, on peut utiliser %02x.

			#load solutions/gpsD.c
		
La somme doit être 54, et elle est 54.
			#load solutions/gpsD-verification.c
		
Le checksum est correct.
Le checksum est correct.
Le checksum est faux (ff != 16).

Exercice 2: Tremblements de terre

Un sismographe mesure les mouvements du sol en permanence, mais les évènements intéressants – les séismes – sont rares (heureusement). Avec un programme, on aimerait trouver ces évènements automatiquement.

Nous avons les fichiers de 3 tremblements de terre, et un fichier qui contient plusieurs tremblements:

  1. earthquake1 (visualisation)
  2. earthquake2 (visualisation)
  3. earthquake3 (visualisation)
  4. earthquake-multiple (les trois signaux en haut enchaînés)

De plus, nous disposons du code pour lire ces fichiers:

A. Début et fin

Cherchez le début du tremblement de terre et affichez le numéro de la case. On dit qu'il y a un tremblement de terre si la valeur absolue du signal dépasse 20.0. (Vous pouvez essayer avec d'autres seuils.)

Cherchez la fin du tremblement de terre, et affichez le numéro de la case. On dit que le tremblement est terminé si 200 valeurs consécutives sont en dessous du seuil.

B. Energie

Calculez l'énergie du tremblement de terre, i.e. la somme des valeurs carrés (∑x²) entre le début et la fin:

			#load solutions/tremblement.c
		
Début à 537, fin à 1369, longueur 832, énergie 304041.83

C. Plusieurs tremblements

Modifiez votre programme pour détecter plusieurs séismes. Pour chaque séisme, affichez son début, sa longueur, et son énergie.

			#load solutions/tremblement-multiple.c
		
Début à 400, fin à 942, longueur 542, énergie 236521.88
Début à 3936, fin à 4574, longueur 638, énergie 227423.20
Début à 4754, fin à 4954, longueur 200, énergie 9875.65
Début à 7453, fin à 8484, longueur 1031, énergie 312810.77