Commit 717e403d12969cf1635e26be26944ee8daf89593
1 parent
12ca1331
Sperated output
Showing
6 changed files
with
83 additions
and
35 deletions
Show diff stats
1 | 1 | #include <stdio.h> |
2 | 2 | #include <time.h> |
3 | 3 | #include <stdbool.h> |
4 | +#include <unistd.h> | |
4 | 5 | #include "hvc.h" |
5 | 6 | #include "heat.h" |
6 | 7 | #include "pump.h" |
... | ... | @@ -60,7 +61,7 @@ void resetHeatOk(void) |
60 | 61 | |
61 | 62 | bool isHeatOk(void) |
62 | 63 | { |
63 | - return heat_ok; | |
64 | + return (tAct > T_STEP_THRESH && tAct < T_HOLD_THRESH); | |
64 | 65 | } |
65 | 66 | |
66 | 67 | void* processHeat(void* arg) |
... | ... | @@ -72,12 +73,13 @@ void* processHeat(void* arg) |
72 | 73 | //Chaufffe initiale |
73 | 74 | if (task[0]) |
74 | 75 | { |
76 | + printx(INFO, HEAT, "Entering in task 0\n"); | |
75 | 77 | tTask = clock(); |
76 | 78 | |
77 | 79 | if (tAct < T_INIT_THRESH) |
78 | 80 | { |
79 | 81 | setHeatOn(); |
80 | - printx(INFO, BUS, "Début chauffe initiale 0\n"); | |
82 | + printx(INFO, HEAT, "Début chauffe initiale 0\n"); | |
81 | 83 | task[0] = false; |
82 | 84 | task[1] = true; |
83 | 85 | } |
... | ... | @@ -91,6 +93,7 @@ void* processHeat(void* arg) |
91 | 93 | |
92 | 94 | else if (task[1]) |
93 | 95 | { |
96 | + printx(INFO, HEAT, "Entering in task 1\n"); | |
94 | 97 | tTask = clock(); |
95 | 98 | task[1] = false; |
96 | 99 | task[2] = true; |
... | ... | @@ -98,10 +101,12 @@ void* processHeat(void* arg) |
98 | 101 | |
99 | 102 | else if (task[2]) |
100 | 103 | { |
104 | + printx(INFO, HEAT, "Entering in task 2\n"); | |
105 | + printx(INFO, HEAT, "Time heating : %d (%d - %d) / %d\n", (tNow - tTask) / CLOCKS_PER_SEC, tNow, tTask, CLOCKS_PER_SEC); | |
101 | 106 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > INIT_HEAT_TIME ) |
102 | 107 | { |
103 | 108 | setHeatOff(); |
104 | - printx(INFO, BUS, "Fin chauffe initiale 1\n"); | |
109 | + printx(INFO, HEAT, "Fin chauffe initiale 1\n"); | |
105 | 110 | task[2] = false; |
106 | 111 | task[3] = true; |
107 | 112 | } |
... | ... | @@ -109,6 +114,7 @@ void* processHeat(void* arg) |
109 | 114 | |
110 | 115 | else if (task[3]) |
111 | 116 | { |
117 | + printx(INFO, HEAT, "Entering in task 3\n"); | |
112 | 118 | tTask = clock(); |
113 | 119 | task[3] = false; |
114 | 120 | task[4] = true; |
... | ... | @@ -116,9 +122,10 @@ void* processHeat(void* arg) |
116 | 122 | |
117 | 123 | else if (task[4]) |
118 | 124 | { |
125 | + printx(INFO, HEAT, "Entering in task 4\n"); | |
119 | 126 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > INIT_WAIT_TIME ) |
120 | 127 | { |
121 | - printx(INFO, BUS, "Fin attente %d sec 2\n", INIT_WAIT_TIME); | |
128 | + printx(INFO, HEAT, "Fin attente %d sec 2\n", INIT_WAIT_TIME); | |
122 | 129 | task[4] = false; |
123 | 130 | task[5] = true; |
124 | 131 | } |
... | ... | @@ -128,6 +135,7 @@ void* processHeat(void* arg) |
128 | 135 | //Chauffe par palier |
129 | 136 | else if (task[5]) |
130 | 137 | { |
138 | + printx(INFO, HEAT, "Entering in task 5\n"); | |
131 | 139 | tTask = clock(); |
132 | 140 | task[5] = false; |
133 | 141 | task[6] = true; |
... | ... | @@ -136,9 +144,10 @@ void* processHeat(void* arg) |
136 | 144 | |
137 | 145 | else if (task[6]) |
138 | 146 | { |
147 | + printx(INFO, HEAT, "Entering in task 6\n"); | |
139 | 148 | if (tAct < T_STEP_THRESH) |
140 | 149 | { |
141 | - printx(INFO, BUS, "Début Chauffe par palier 3\n"); | |
150 | + printx(INFO, HEAT, "Début Chauffe par palier 3\n"); | |
142 | 151 | setHeatOn(); |
143 | 152 | task[6] = false; |
144 | 153 | task[7] = true; |
... | ... | @@ -153,6 +162,7 @@ void* processHeat(void* arg) |
153 | 162 | |
154 | 163 | else if (task[7]) |
155 | 164 | { |
165 | + printx(INFO, HEAT, "Entering in task 7\n"); | |
156 | 166 | tTask = clock(); |
157 | 167 | task[7] = false; |
158 | 168 | task[8] = true; |
... | ... | @@ -160,9 +170,10 @@ void* processHeat(void* arg) |
160 | 170 | |
161 | 171 | else if (task[8]) |
162 | 172 | { |
173 | + printx(INFO, HEAT, "Entering in task 8\n"); | |
163 | 174 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > STEP_HEAT_TIME ) |
164 | 175 | { |
165 | - printx(INFO, BUS, "Fin de chauffe palier intermédiaire 4\n"); | |
176 | + printx(INFO, HEAT, "Fin de chauffe palier intermédiaire 4\n"); | |
166 | 177 | setHeatOff(); |
167 | 178 | task[8] = false; |
168 | 179 | task[9] = true; |
... | ... | @@ -171,6 +182,7 @@ void* processHeat(void* arg) |
171 | 182 | |
172 | 183 | else if (task[9]) |
173 | 184 | { |
185 | + printx(INFO, HEAT, "Entering in task 9\n"); | |
174 | 186 | tTask = clock(); |
175 | 187 | task[9] = false; |
176 | 188 | task[10] = true; |
... | ... | @@ -178,9 +190,10 @@ void* processHeat(void* arg) |
178 | 190 | |
179 | 191 | else if (task[10]) |
180 | 192 | { |
193 | + printx(INFO, HEAT, "Entering in task 10\n"); | |
181 | 194 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > STEP_WAIT_TIME ) |
182 | 195 | { |
183 | - printx(INFO, BUS, "Fin d'attente palier intermédiaire 5\n"); | |
196 | + printx(INFO, HEAT, "Fin d'attente palier intermédiaire 5\n"); | |
184 | 197 | |
185 | 198 | if ( tAct < T_STEP_THRESH ) |
186 | 199 | { |
... | ... | @@ -200,6 +213,7 @@ void* processHeat(void* arg) |
200 | 213 | // Maintien au chaud |
201 | 214 | else if (task[11]) |
202 | 215 | { |
216 | + printx(INFO, HEAT, "Entering in task 11\n"); | |
203 | 217 | tTask = clock(); |
204 | 218 | task[11] = false; |
205 | 219 | task[12] = true; |
... | ... | @@ -207,7 +221,8 @@ void* processHeat(void* arg) |
207 | 221 | |
208 | 222 | else if (task[12]) |
209 | 223 | { |
210 | - printx(INFO, BUS, "Début Maintien au chaud 6\n"); | |
224 | + printx(INFO, HEAT, "Entering in task 12\n"); | |
225 | + printx(INFO, HEAT, "Début Maintien au chaud 6\n"); | |
211 | 226 | setHeatOk(); |
212 | 227 | task[12]=false; |
213 | 228 | task[13]=true; |
... | ... | @@ -215,20 +230,22 @@ void* processHeat(void* arg) |
215 | 230 | |
216 | 231 | else if (task[13]) |
217 | 232 | { |
233 | + printx(INFO, HEAT, "Entering in task 13\n"); | |
218 | 234 | tTask = clock(); |
219 | 235 | task[13] = false; |
220 | 236 | task[14] = true; |
221 | 237 | } |
222 | 238 | |
223 | 239 | else if (task[14]) |
224 | - { | |
240 | + { | |
241 | + printx(INFO, HEAT, "Entering in task 14\n"); | |
225 | 242 | if(hold_heat) |
226 | 243 | { |
227 | 244 | if( (tAct < T_HOLD_THRESH)) |
228 | 245 | { |
229 | 246 | if (!isPumpOn()) |
230 | 247 | { |
231 | - printx(INFO, BUS, "Début Chauffe maintien sans pompe 7\n"); | |
248 | + printx(INFO, HEAT, "Début Chauffe maintien sans pompe 7\n"); | |
232 | 249 | setHeatOn(); |
233 | 250 | task[14] = false; |
234 | 251 | task[15] = true; |
... | ... | @@ -236,7 +253,7 @@ void* processHeat(void* arg) |
236 | 253 | |
237 | 254 | else |
238 | 255 | { |
239 | - printx(INFO, BUS, "Début Chauffe maintien avec pompe 7'\n"); | |
256 | + printx(INFO, HEAT, "Début Chauffe maintien avec pompe 7'\n"); | |
240 | 257 | setHeatOn(); |
241 | 258 | task[14]=false; |
242 | 259 | task[19]=true; //Numéro de tache "T<Thold && pumpitup" |
... | ... | @@ -247,7 +264,7 @@ void* processHeat(void* arg) |
247 | 264 | |
248 | 265 | else |
249 | 266 | { |
250 | - printx(INFO, BUS, "Maintien au chaud annulé 7 ' ' Go etape de fin\n"); | |
267 | + printx(INFO, HEAT, "Maintien au chaud annulé 7 ' ' Go etape de fin\n"); | |
251 | 268 | task[14]=false; |
252 | 269 | task[23]=true; //Sinon go étape d'attente fin |
253 | 270 | } |
... | ... | @@ -255,6 +272,7 @@ void* processHeat(void* arg) |
255 | 272 | |
256 | 273 | else if (task[15]) |
257 | 274 | { |
275 | + printx(INFO, HEAT, "Entering in task 15\n"); | |
258 | 276 | tTask = clock(); |
259 | 277 | task[15] = false; |
260 | 278 | task[16] = true; |
... | ... | @@ -263,9 +281,10 @@ void* processHeat(void* arg) |
263 | 281 | //Maintien au chaud sans pompage |
264 | 282 | else if (task[16]) |
265 | 283 | { |
284 | + printx(INFO, HEAT, "Entering in task 16\n"); | |
266 | 285 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_HEAT_TIME ) |
267 | 286 | { |
268 | - printx(INFO, BUS, "Fin chauffe maintien sans pompe 8\n"); | |
287 | + printx(INFO, HEAT, "Fin chauffe maintien sans pompe 8\n"); | |
269 | 288 | setHeatOff(); |
270 | 289 | task[16] = false; |
271 | 290 | task[17] = true; |
... | ... | @@ -274,6 +293,7 @@ void* processHeat(void* arg) |
274 | 293 | |
275 | 294 | else if (task[17]) |
276 | 295 | { |
296 | + printx(INFO, HEAT, "Entering in task 17\n"); | |
277 | 297 | tTask = clock(); |
278 | 298 | task[17] = false; |
279 | 299 | task[18] = true; |
... | ... | @@ -281,11 +301,12 @@ void* processHeat(void* arg) |
281 | 301 | |
282 | 302 | else if (task[18]) |
283 | 303 | { |
304 | + printx(INFO, HEAT, "Entering in task 18\n"); | |
284 | 305 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_WAIT_TIME ) |
285 | 306 | { |
286 | 307 | if ( tAct < T_HOLD_THRESH) |
287 | 308 | { |
288 | - printx(INFO, BUS, "Fin d'attente chauffe intermédiaire maintien 9\n"); | |
309 | + printx(INFO, HEAT, "Fin d'attente chauffe intermédiaire maintien 9\n"); | |
289 | 310 | task[18] = false; |
290 | 311 | task[11] = true; //Retour au début de "Maintien au chaud" |
291 | 312 | } |
... | ... | @@ -295,6 +316,7 @@ void* processHeat(void* arg) |
295 | 316 | //Maintien au chaud avec pompage |
296 | 317 | else if (task[19]) |
297 | 318 | { |
319 | + printx(INFO, HEAT, "Entering in task 19\n"); | |
298 | 320 | tTask = clock(); |
299 | 321 | task[19] = false; |
300 | 322 | task[20] = true; |
... | ... | @@ -302,9 +324,10 @@ void* processHeat(void* arg) |
302 | 324 | |
303 | 325 | else if (task[20]) |
304 | 326 | { |
327 | + printx(INFO, HEAT, "Entering in task 20\n"); | |
305 | 328 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_PUMP_HEAT_TIME ) |
306 | 329 | { |
307 | - printx(INFO, BUS, "Fin chauffe maintien avec pompe 10\n"); | |
330 | + printx(INFO, HEAT, "Fin chauffe maintien avec pompe 10\n"); | |
308 | 331 | setHeatOff(); |
309 | 332 | task[20] = false; |
310 | 333 | task[21] = true; |
... | ... | @@ -313,6 +336,7 @@ void* processHeat(void* arg) |
313 | 336 | |
314 | 337 | else if (task[21]) |
315 | 338 | { |
339 | + printx(INFO, HEAT, "Entering in task 21\n"); | |
316 | 340 | tTask = clock(); |
317 | 341 | task[21] = false; |
318 | 342 | task[22] = true; |
... | ... | @@ -320,11 +344,12 @@ void* processHeat(void* arg) |
320 | 344 | |
321 | 345 | else if (task[22]) |
322 | 346 | { |
347 | + printx(INFO, HEAT, "Entering in task 22\n"); | |
323 | 348 | if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_PUMP_WAIT_TIME ) |
324 | 349 | { |
325 | 350 | if ( tAct < T_HOLD_THRESH) |
326 | 351 | { |
327 | - printx(INFO, BUS, "Fin d'attente chauffe intermédiaire maintien avec pompe 11\n"); | |
352 | + printx(INFO, HEAT, "Fin d'attente chauffe intermédiaire maintien avec pompe 11\n"); | |
328 | 353 | task[22] = false; |
329 | 354 | task[11] = true; //Retour au début de "Maintien au chaud" |
330 | 355 | } |
... | ... | @@ -334,6 +359,7 @@ void* processHeat(void* arg) |
334 | 359 | //Fin de maintien au chaud (demandé par l'extérieur) et reboucle quand hold_heat est remis |
335 | 360 | else if(task[23]) |
336 | 361 | { |
362 | + printx(INFO, HEAT, "Entering in task 23\n"); | |
337 | 363 | setHeatOff(); |
338 | 364 | heat_ok=false; |
339 | 365 | |
... | ... | @@ -351,8 +377,7 @@ void* processHeat(void* arg) |
351 | 377 | //task[]=false; |
352 | 378 | //task[]=true; |
353 | 379 | } |
354 | - | |
355 | - | |
380 | + usleep(20000); | |
356 | 381 | } |
357 | 382 | |
358 | 383 | ... | ... |
... | ... | @@ -128,7 +128,8 @@ bool initHVC() |
128 | 128 | sendData(&hvc_fd, GET_PUMP); |
129 | 129 | data = getData(&hvc_fd); |
130 | 130 | |
131 | - previousPumpState = data == PUMP_STATE_HIGH; | |
131 | + previousPumpState = (data == PUMP_STATE_HIGH); | |
132 | + printf("Data received from HVC for PUMP %02x\n", data); | |
132 | 133 | |
133 | 134 | return true; |
134 | 135 | } |
... | ... | @@ -187,12 +188,14 @@ void* processHVC(void* we) |
187 | 188 | } |
188 | 189 | |
189 | 190 | // Querying pump state |
190 | - sendData(&hvc_fd, GET_TEMP); | |
191 | + sendData(&hvc_fd, GET_PUMP); | |
191 | 192 | data = getData(&hvc_fd); |
192 | - pumpState = data == PUMP_STATE_HIGH; | |
193 | + pumpState = (data == PUMP_STATE_HIGH); | |
194 | + printx(DEBUG, HVC, "PUMP %d %d Flow : %d\n", previousPumpState, pumpState, pumped); | |
193 | 195 | if(pumpState ^ previousPumpState) |
194 | 196 | pumped++; |
195 | 197 | previousPumpState = pumpState; |
198 | + actDeb(pumped); | |
196 | 199 | |
197 | 200 | usleep(HVC_POLLING_TIME); |
198 | 201 | } | ... | ... |
... | ... | @@ -17,6 +17,7 @@ int main(void) |
17 | 17 | pthread_t tBUS; |
18 | 18 | pthread_t tHVC; |
19 | 19 | pthread_t tHeat; |
20 | + pthread_t tPump; | |
20 | 21 | initUILog(); |
21 | 22 | if(!initLog()) |
22 | 23 | { |
... | ... | @@ -48,8 +49,11 @@ int main(void) |
48 | 49 | pthread_create(&tHVC, NULL, processHVC, NULL); |
49 | 50 | initProcessHeat(); |
50 | 51 | initProcessPump(); |
51 | - //setPumpOn(); | |
52 | 52 | pthread_create(&tHeat, NULL, processHeat, NULL); |
53 | + pthread_create(&tPump, NULL, processPump, NULL); | |
54 | + | |
55 | + setVolWanted(1); | |
56 | + setCoffeeWanted(); | |
53 | 57 | |
54 | 58 | pthread_join(tUI, NULL); |
55 | 59 | closeLog(); | ... | ... |
printx.c
... | ... | @@ -11,9 +11,9 @@ |
11 | 11 | #define S_RESET "\33[0m" |
12 | 12 | #define MAX_BUFFER 128 |
13 | 13 | |
14 | -FILE* logfiles[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; | |
14 | +FILE* logfiles[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; | |
15 | 15 | char s_color[4][12] = {"\x1b[01;31m", "\x1b[01;33m", "\x1b[01;32m", "\x1b[01;36m"}; |
16 | -char f_name[6][5] = {"MAIN", "UI ", "NFC ", "HVC ", "BUS ", "TEMP"}; | |
16 | +char f_name[8][5] = {"MAIN", "UI ", "NFC ", "HVC ", "BUS ", "TEMP", "PUMP", "HEAT"}; | |
17 | 17 | struct timeval tv; |
18 | 18 | |
19 | 19 | void removeCharFromString(char c, char *str) |
... | ... | @@ -68,6 +68,20 @@ bool initLog() |
68 | 68 | return false; |
69 | 69 | } |
70 | 70 | |
71 | + logfiles[6] = fopen("log/pump.log", "a"); | |
72 | + if(logfiles[6] == NULL) | |
73 | + { | |
74 | + printf("Unable to open the pump log file\n"); | |
75 | + return false; | |
76 | + } | |
77 | + | |
78 | + logfiles[7] = fopen("log/heat.log", "a"); | |
79 | + if(logfiles[7] == NULL) | |
80 | + { | |
81 | + printf("Unable to open the heat log file\n"); | |
82 | + return false; | |
83 | + } | |
84 | + | |
71 | 85 | return true; |
72 | 86 | } |
73 | 87 | |
... | ... | @@ -79,6 +93,8 @@ void closeLog() |
79 | 93 | fclose(logfiles[3]); |
80 | 94 | fclose(logfiles[4]); |
81 | 95 | fclose(logfiles[5]); |
96 | + fclose(logfiles[6]); | |
97 | + fclose(logfiles[7]); | |
82 | 98 | } |
83 | 99 | |
84 | 100 | void printx(severity s, msgfrom from, char* str, ...) | ... | ... |
printx.h
... | ... | @@ -78,7 +78,7 @@ void* processPump(void* arg) |
78 | 78 | { |
79 | 79 | if (coffee_wanted) |
80 | 80 | { |
81 | - printx(INFO, BUS, "Demande de café prise en compte 1\n"); | |
81 | + printx(INFO, PUMP, "Demande de café prise en compte 1\n"); | |
82 | 82 | taskP[0]=false; |
83 | 83 | taskP[1]=true; |
84 | 84 | } |
... | ... | @@ -88,14 +88,14 @@ void* processPump(void* arg) |
88 | 88 | { |
89 | 89 | if (isHeatOk()) |
90 | 90 | { |
91 | - printx(INFO, BUS, "Chauffe eau a bonne temperature OK 2\n"); | |
91 | + printx(INFO, PUMP, "Chauffe eau a bonne temperature OK 2\n"); | |
92 | 92 | taskP[1]=false; |
93 | 93 | taskP[3]=true; |
94 | 94 | } |
95 | 95 | |
96 | 96 | else |
97 | 97 | { |
98 | - printx(INFO, BUS, "Attente chauffe eau a bonne temperature 2'\n"); | |
98 | + printx(INFO, PUMP, "Attente chauffe eau a bonne temperature 2'\n"); | |
99 | 99 | taskP[1]=false; |
100 | 100 | taskP[2]=true; |
101 | 101 | } |
... | ... | @@ -113,7 +113,7 @@ void* processPump(void* arg) |
113 | 113 | else if (taskP[3]) |
114 | 114 | { |
115 | 115 | tTaskP = clock(); |
116 | - printx(INFO, BUS, "Distribution de l'eau Pompe ON 3\n"); | |
116 | + printx(INFO, PUMP, "Distribution de l'eau Pompe ON 3\n"); | |
117 | 117 | taskP[3]=false; |
118 | 118 | taskP[4]=true; |
119 | 119 | } |
... | ... | @@ -125,14 +125,14 @@ void* processPump(void* arg) |
125 | 125 | |
126 | 126 | if (volDeb > volWanted) |
127 | 127 | { |
128 | - printx(INFO, BUS, "Fin de Distribution de l'eau Pompe OFF 4\n"); | |
128 | + printx(INFO, PUMP, "Fin de Distribution de l'eau Pompe OFF 4\n"); | |
129 | 129 | taskP[4]=false; |
130 | 130 | taskP[5]=true; |
131 | 131 | } |
132 | 132 | |
133 | 133 | else if ( ((tNowP - tTaskP) / CLOCKS_PER_SEC) > 60 ) |
134 | 134 | { |
135 | - printx(INFO, BUS, "Pompe utilisée depuis plus d'1 min, mise en pause 4'\n"); | |
135 | + printx(INFO, PUMP, "Pompe utilisée depuis plus d'1 min, mise en pause 4'\n"); | |
136 | 136 | taskP[4]=false; |
137 | 137 | taskP[6]=false; |
138 | 138 | } |
... | ... | @@ -143,7 +143,7 @@ void* processPump(void* arg) |
143 | 143 | setPumpOff(); |
144 | 144 | pump_on=false; |
145 | 145 | |
146 | - printx(INFO, BUS, "Cafe servi 5\n"); | |
146 | + printx(INFO, PUMP, "Cafe servi 5\n"); | |
147 | 147 | volWanted=0; |
148 | 148 | coffee_wanted=false; |
149 | 149 | |
... | ... | @@ -156,7 +156,7 @@ void* processPump(void* arg) |
156 | 156 | setPumpOff(); |
157 | 157 | pump_on=false; |
158 | 158 | |
159 | - printx(INFO, BUS, "En pause, Pompe OFF 6"); | |
159 | + printx(INFO, PUMP, "En pause, Pompe OFF 6"); | |
160 | 160 | |
161 | 161 | tTaskP = clock(); |
162 | 162 | taskP[6]=false; |
... | ... | @@ -167,13 +167,13 @@ void* processPump(void* arg) |
167 | 167 | { |
168 | 168 | if ( ((tNowP - tTaskP) / CLOCKS_PER_SEC) > 60 ) |
169 | 169 | { |
170 | - printx(INFO, BUS, "Pause terminée 7\n"); | |
170 | + printx(INFO, PUMP, "Pause terminée 7\n"); | |
171 | 171 | taskP[7]=false; |
172 | 172 | taskP[4]=true; |
173 | 173 | } |
174 | 174 | } |
175 | 175 | |
176 | - sleep(50); | |
176 | + usleep(20000); | |
177 | 177 | } |
178 | 178 | |
179 | 179 | return NULL; | ... | ... |