-
Notifications
You must be signed in to change notification settings - Fork 0
/
a429.cpp
110 lines (98 loc) · 3.38 KB
/
a429.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "a429.h"
#include "configuration.h"
#include <stdio.h>
#include "utilitaire.h"
// Définition du sous-programme
void afficher_entete_decodeur() {
printf("/***************************************************************************************\n");
printf("* DECODEUR ARINC-429\n*\n");
// Requis 5 : Affichage des noms des auteurs
printf("* Auteur : Christian Jeune\n");
// Requis 6 : Affichage de la session
printf("/***************************************************************************************\n");
// Requis 7 : Affichage des colonnes de données reçues
printf("Mot ARINC-429 | Est Corrompu | Donnee\n");
printf("--------------|--------------|----------------------------------------------------------\n");
}
void decoder_mot_a429(unsigned int valeur, int& est_corrompu, int& numero_mot, double& donnee_bnr, int donnee_bcd[4]) {
//le numero de mot est le dernier octet
numero_mot=decimale_a_octale((valeur&0xFF));
//verification de la corruption avec le nombre de bits actifs
est_corrompu=(calculer_nb_bits_actifs(valeur)%2==0)?ODD_PARITY:!ODD_PARITY;
valeur >>= 8;//decalage de 8 bits
//Decodage BCD
if (numero_mot == 232 || numero_mot == 255 || numero_mot == 260) {
for (int i = 0; i < 4; i++) {
donnee_bcd[i]=(valeur&0x1F);
valeur >>= 5;
}
return;
}
//Decodage BNR
else {
donnee_bnr = (valeur & 0x1FFFFF);
if (numero_mot == 310 || numero_mot == 311) {
donnee_bnr * 0.000172;
}
if ((valeur >> 21 & 0x3) == 3)
donnee_bnr *= -1;
}
//test
/*
printf("est corrompu %d\n", est_corrompu);
printf("numero mot %d\n", numero_mot);
printf("donnee bnr %f\n", donnee_bnr);
printf("donnee bcd %d\n", donnee_bcd[0]);
printf("donnee bcd %d\n", donnee_bcd[1]);
printf("donnee bcd %d\n", donnee_bcd[2]);
printf("donnee bcd %d\n\n", donnee_bcd[3]);
*/
}
void afficher_mot_a429(unsigned int valeur) {
int est_corrompu;
int numero_mot;
double donnee_bnr;
int donnee_bcd[4];
decoder_mot_a429(valeur, est_corrompu, numero_mot, donnee_bnr, donnee_bcd);
printf("0x%08X | %s |", valeur, (est_corrompu)?"oui":"non");
// Requis 8 : Affichage du numéro de mot
switch (numero_mot) {
case 150:
printf("Heure du vol : ");
afficher_heure(donnee_bnr);
printf("\n");
break;
case 232:
printf("Depart de l'aeroport : ");
for (int i = 0; i < 4; i++) {
printf("%c", donnee_bcd[i] + 'A');
}
printf("\n");
break;
case 252:
printf("Altitude : %.1lf\n", donnee_bnr);
break;
case 255:
printf("Arrive a l'aeroport : ");
for (int i = 0; i < 4; i++) {
printf("%c", donnee_bcd[i] + 'A');
}
printf("\n");
break;
case 260:
printf("Date du vol : %02d/%02d/%02d\n", donnee_bcd[2],donnee_bcd[1],donnee_bcd[0]);
printf(" | %s |\n", " ");
break;
case 310:
printf("Latitude : %.1lf\n", donnee_bnr);
break;
case 311:
printf("Longitude : %.1lf\n", donnee_bnr);
break;
default:
printf("\n");
//printf("Donnee BNR : %lf\n", donnee_bnr);
//printf("Donnee BCD : %d %d %d %d\n", donnee_bcd[0], donnee_bcd[1], donnee_bcd[2], donnee_bcd[3]);
break;
}
}