howto/come_gestire_dati_fissi/esempio_reale.md
... ...
@@ -0,0 +1,253 @@
1
+Il seguente programma è di un progetto reale in cui occorreva definire due tipi di strutture dati.
2
+
3
+Più avanti troverai anche la parte nello **start.c**.
4
+
5
+Il codice è stato scritto in un file chiamato **"ricettario.h"** che è stato incluso nel common.
6
+
7
+ // ------------------------------------"ricettario.h"------------------------------------ //
8
+ #define numeroRicetteMax 10
9
+ #define coeffDecimali 1000 // ogni decimale è un x10 (quindi 3 decimali equaivale a 1000)
10
+ #define minutiAvvertimento 30
11
+ #define decimiAttesa 2
12
+
13
+ char pathProg[15] = "C:\\MW30632.fis"; // array relativo al file della prima serie di dati fissi
14
+ char pathAll[15] = "C:\\Allarm.fis"; // array relativo al file della seconda serie di dati fissi
15
+
16
+ // funzioni prima serie di dati fissi
17
+ void carica_fissiRic(void);
18
+ char salva_fissiRic(void);
19
+ void reset_fissiRic(void);
20
+
21
+ // primo tipo di struttura dati
22
+ typedef struct datifissiRic
23
+ {
24
+ U16 first_time_df; // condizione di primo avvio
25
+
26
+ unsigned char tipoLavoro_dfRic; // 0 modalità start/stop - 1 modalità ciclo aperto/chiuso
27
+ unsigned char livelloAperturaY2_dfRic; // percentuale di apertura della valvola Y2 durante il normale esercizio
28
+ unsigned char ritardoAperturaY2_dfRic; // ritardo apertura valvola di Y2 nella fase di start
29
+ unsigned char pressioneMinima_dfRic; // pressione minima aria
30
+ unsigned char pressioneMassima_dfRic; // pressione massima aria
31
+ unsigned char livelloChiusuraY2_dfRic; // percentuale apertura valvola Y2 durante pulizia impianto in fase di stop
32
+ unsigned char ritardoChiusuraY1Y3_dfRic; // ritardo chiusura valvole Y1 e Y3
33
+
34
+ // dalità ciclo
35
+ char selLivelli_ric[numeroRicetteMax]; // numero ionizzatori attivi
36
+ char modaLavoro_ric[numeroRicetteMax]; // 0 ciclo aperto - 1 ciclo chiuso
37
+ unsigned char powerTimerEnable_dfRic[numeroRicetteMax]; // abilitazione fascia oraria
38
+ unsigned long int powerOn_dfRic[numeroRicetteMax]; // orari di avvio in modalità temporizzata
39
+ unsigned long int powerOff_dfRic[numeroRicetteMax]; // orari di spegnimento
40
+ unsigned long int TOn_dfRic[numeroRicetteMax]; // orari di avvio in modalità temporizzata
41
+ unsigned long int TOff_dfRic[numeroRicetteMax]; // orari di spegnimento
42
+
43
+ // modalità start stop
44
+ char selLivello_dfRic; // numero ionizzatori attivi
45
+
46
+ // tipo macchina
47
+ unsigned char tipoMacchina_dfRic; // 0 = versione expensive , 1 = versione cheap
48
+
49
+ // linearizzazione pressostato
50
+ char P_max_dfRic;
51
+ char P_min_dfRic;
52
+ long int V_max_dfRic;
53
+ long int V_min_dfRic;
54
+
55
+ // ore utilizzo
56
+ long int oreLavorate1_Ric;
57
+ long int oreLavorate2_Ric;
58
+ long int oreLavorate3_Ric;
59
+ long int oreSoglia1_Ric;
60
+ long int oreSoglia2_Ric;
61
+ long int oreSoglia3_Ric;
62
+ long int oreMax1_Ric;
63
+ long int oreMax2_Ric;
64
+ long int oreMax3_Ric;
65
+
66
+ // warnings
67
+ unsigned char tensioneAria_warning_Enable_Ric;
68
+ unsigned char alimentazioneIonizzatori_warning_Enable_Ric;
69
+ unsigned char tensioneMinMax_warning_Enable_Ric;
70
+ unsigned char sicurezzaPorta_warning_Enable_Ric;
71
+ unsigned char presenzaAcquaSerbatoio_warning_Enable_Ric;
72
+ unsigned char OnOffRemoto_warning_Enable_Ric;
73
+ unsigned char presenzaAria_warning_Enable_Ric;
74
+
75
+ unsigned char Giorno_dfRic[numeroRicetteMax][7];
76
+
77
+ unsigned char superadmin_password_Ric[32];
78
+ unsigned char manutentore_password_Ric[32];
79
+ } datifissiRic __attribute__ ((PACKET));
80
+
81
+ // dichiara una struttura dati dfRic
82
+ datifissiRic dfRic;
83
+
84
+ // dichiara il file che servirà nelle funzioni
85
+ FILE *fpRic;
86
+
87
+ // funzione di caricamento dati della prima serie di dati fissi
88
+ void carica_fissiRic(void)
89
+ {
90
+ fpRic = fopen(pathProg, "r"); // apertura di pathProg in modalità lettura in fpRic
91
+
92
+ if (fpRic == 0) // se fpRic == 0 --> l' operazione fopen non ha avuto successo
93
+ reset_fissiRic(); // resetta i dati con i valori di default
94
+
95
+ fread(&dfRic, sizeof(dfRic), 1, fpRic); // legge i valori dei dati in fpRic e li carica in dfRic
96
+ fclose(fpRic); // chiude fpRic
97
+ }
98
+
99
+ // funzione di salvataggio dati relativo alla prima serie di dati
100
+ char salva_fissiRic(void)
101
+ {
102
+ dfRic.first_time_df = 0xAAAA; // condizione di primo avvio, servirà in start.c
103
+
104
+ fpRic = fopen(pathProg,"w"); // apertura di pathProg in modalità scrittura
105
+
106
+ if (fpRic == 0) // se fpRic == 0 --> fopen non ha avuto successo
107
+ return 0;
108
+
109
+ fwrite(&dfRic, sizeof(dfRic), 1, fpRic); // scrive i valori dei dati fissi da dfRic in fpRic
110
+ fclose(fpRic); // chiude fpRic
111
+ return 1;
112
+ }
113
+
114
+ // funzione di reset relativa alla prima serie di dati
115
+ void reset_fissiRic(void)
116
+ {
117
+ // i valori vengono resettati impostando i valori di default
118
+ int i;
119
+ for (i = 0 ; i < numeroRicetteMax ; i++) {
120
+ dfRic.selLivelli_ric[i] = 1;
121
+ dfRic.modaLavoro_ric[i] = 0;
122
+ dfRic.powerTimerEnable_dfRic[i] = 0;
123
+ dfRic.powerOn_dfRic[i] = 0;
124
+ dfRic.powerOff_dfRic[i] = 0;
125
+ dfRic.TOn_dfRic[i] = 0;
126
+ dfRic.TOff_dfRic[i] = 0;
127
+ int j;
128
+ for (j = 0 ; j < 7 ; j++) {
129
+ dfRic.Giorno_dfRic[i][j] = 0;
130
+ }
131
+ }
132
+
133
+ dfRic.tipoLavoro_dfRic = 0;
134
+ dfRic.livelloAperturaY2_dfRic = 5;
135
+ dfRic.ritardoAperturaY2_dfRic = 5;
136
+ dfRic.pressioneMinima_dfRic = 9;
137
+ dfRic.pressioneMassima_dfRic = 15;
138
+ dfRic.livelloChiusuraY2_dfRic = 60;
139
+ dfRic.ritardoChiusuraY1Y3_dfRic = 20;
140
+ dfRic.selLivello_dfRic = 1;
141
+ dfRic.tipoMacchina_dfRic = 1;
142
+ dfRic.P_max_dfRic = 100;
143
+ dfRic.P_min_dfRic = 0;
144
+ dfRic.V_max_dfRic = 5000;
145
+ dfRic.V_min_dfRic = 1620;
146
+ dfRic.oreLavorate1_Ric = 0;
147
+ dfRic.oreLavorate2_Ric = 0;
148
+ dfRic.oreLavorate3_Ric = 0;
149
+ dfRic.oreSoglia1_Ric = 3500;
150
+ dfRic.oreSoglia2_Ric = 3500;
151
+ dfRic.oreSoglia3_Ric = 3500;
152
+ dfRic.oreMax1_Ric = 4000;
153
+ dfRic.oreMax2_Ric = 4000;
154
+ dfRic.oreMax3_Ric = 4000;
155
+ dfRic.tensioneAria_warning_Enable_Ric = 1;
156
+ dfRic.alimentazioneIonizzatori_warning_Enable_Ric = 1;
157
+ dfRic.tensioneMinMax_warning_Enable_Ric = 1;
158
+ dfRic.sicurezzaPorta_warning_Enable_Ric = 1;
159
+ dfRic.presenzaAcquaSerbatoio_warning_Enable_Ric = 1;
160
+ dfRic.OnOffRemoto_warning_Enable_Ric = 1;
161
+ dfRic.presenzaAria_warning_Enable_Ric = 1;
162
+
163
+ snprintf(dfRic.superadmin_password_Ric, sizeof(dfRic.superadmin_password_Ric), "1018");
164
+ snprintf(dfRic.manutentore_password_Ric, sizeof(dfRic.manutentore_password_Ric), "118");
165
+
166
+ // salva i dati impostati con i valori di default
167
+ salva_fissiRic();
168
+ }
169
+
170
+
171
+ // -----------------------
172
+ // gestione elenco allarmi
173
+ // -----------------------
174
+
175
+ #define allarmiMax 100
176
+
177
+ // tipo di struttura dati relativa alla seconda serie di dati fissi
178
+ typedef struct elencoAllarmi
179
+ {
180
+ U16 first_time_df; // condizione di primo avvio
181
+ char theData_All[allarmiMax][11];
182
+ char thetime_All[allarmiMax][9];
183
+ char theday[allarmiMax];
184
+ char type_All[allarmiMax];
185
+ } elencoAllarmi __attribute__ ((PACKET));
186
+
187
+ // dichiara una struttura dati dfAll
188
+ elencoAllarmi dfAll;
189
+
190
+ // dichiara il file che ci servirà nelle funzioni
191
+ FILE *fpAll;
192
+
193
+ // funzione di caricamento relativa alla seconda serie di dati
194
+ void carica_fissiAll(void)
195
+ {
196
+ fpAll = fopen(pathAll, "r");
197
+
198
+ if (fpAll == 0)
199
+ reset_fissiAll();
200
+
201
+ fread(&dfAll, sizeof(dfAll), 1, fpAll);
202
+ fclose(fpAll);
203
+ }
204
+
205
+ // funzione di salvataggio relativa alla seconda serie di dati
206
+ char salva_fissiAll(void)
207
+ {
208
+ dfAll.first_time_df = 0xAAAA;
209
+
210
+ fpAll = fopen(pathAll,"w");
211
+
212
+ if (fpAll == 0)
213
+ return 0;
214
+
215
+ fwrite(&dfAll, sizeof(dfAll), 1, fpAll);
216
+ fclose(fpAll);
217
+ return 1;
218
+ }
219
+
220
+ // funzione di reset realtiva alla seconda serie di dati
221
+ void reset_fissiAll(void)
222
+ {
223
+ // imposta i valori di default
224
+ int i;
225
+ for (i = 0 ; i < allarmiMax ; i++) {
226
+ snprintf(dfAll.theData_All[i], sizeof(dfAll.theData_All[0]), "%s", " ");
227
+ snprintf(dfAll.thetime_All[i], sizeof(dfAll.thetime_All[0]), "%s", " ");
228
+ dfAll.theday[i] = 8;
229
+ dfAll.type_All[i] = 0;
230
+ }
231
+
232
+ // salva i dati impostati con i valori di default
233
+ salva_fissiAll();
234
+ }
235
+
236
+Nello **start.c**:
237
+
238
+ // Nello start.c sono presenti anche variabili e funzioni del progetto originale la cui
239
+ // dichiarazzione è stata omessa perchè non riguradante la gestione dei dati fissi
240
+
241
+ carica_fissiRic(); // carica i dati fissi nella struttura dati
242
+ if (dfRic.first_time_df !=0xAAAA) { // se è il primo ciclo di avvio
243
+ sostituzioneAlimentatori = 0;
244
+ num_lingua = 1;
245
+ gestioneLingua();
246
+ reset_fissiRic(); // imposta i valori di default
247
+ }
248
+
249
+ carica_fissiAll(); // carica i dati fissi della seconda serie (allarmi)
250
+ if (dfAll.first_time_df !=0xAAAA) { // se è il primo ciclo di avvio
251
+ reset_fissiAll(); // imposta i valori di default
252
+ }
253
+