-
Notifications
You must be signed in to change notification settings - Fork 4
/
Tutorial.m
367 lines (309 loc) · 14.5 KB
/
Tutorial.m
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
global Start MATB_DATA fileID outlet
deviceIndex=[];
KbQueueCreate(deviceIndex);
KbQueueStart(deviceIndex);
Start = GetSecs;
yesKeys = KbName('Return');
MATB_DATA.LastUpdate.RESMAN=Start;
MATB_DATA.LastUpdate.SYSMON=Start;
MATB_DATA.LastUpdate.TRACK=Start;
MATB_DATA.LastUpdate.EVENT=Start;
MATB_DATA.LastUpdate.KB=Start;
MATB_DATA.LastUpdate.LOG=Start;
MATB_DATA.LastUpdate.JS=Start;
MATB_DATA.TRACK.DATA{MATB_DATA.ScenarioNumber}=[];
MATB_DATA.RESMAN.DATA{MATB_DATA.ScenarioNumber}=[];
MATB_DATA.COMM.DATA{MATB_DATA.ScenarioNumber}=[];
MATB_DATA.SYSMON.DATA{MATB_DATA.ScenarioNumber}=[];
MATB_DATA.KeyboardAction{MATB_DATA.ScenarioNumber}=[];
%-------------------------------------------------------
% SYSMON
%-------------------------------------------------------
fprintf(fileID,'%s\t\t %.4f \t\t\t %s \n',char(datetime('now','Format','HH:mm:ss')),0,'TRAINING SYSMON');
if MATB_DATA.LSL_Streaming
outlet.push_sample({0,'TRAINING SYSMON',''});
end
pop_waiter('Commençons par la tache de MONITORING',1)
pop=dialog('position',[1035 519 605 200]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [10 -100 585 250],...
'String','Ici tout est normal, les jauges oscillent autour du milieu',...
'Fontsize',18);
a=[ones(10,1) ; -ones(10,1)];
Ev=[randi(35,20,1)+15 randi(6,20,1) a(randperm(20))];
Start = GetSecs;
while true
t=GetSecs;
% SET EVENTS
if round(t-Start,1)==10 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
close(pop)
fClav=figure('menubar','non','numbertitle','off','position',[900 97 1000 420]);
imagesc(imread('Function_MATB\clavier.png'))
set(gca,'position',[ 0 0 1 1]); axis off
pop=dialog('position',[900 519 1000 300]); %[1035 519 605 200])
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [50 -100 900 300],... %[-100 -100 850 250]
'String','Essayez maintenant de répondre aux alarmes. Lorsque le niveau d`une jauge s`eloigne du milieu, appuyez sur le numéro correspondant à la jauge (bouton 1 à 4, première ligne du clavier). Lorsque F5 cesse d`etre vert, appuyez sur F5. Enfin, lorsque F6 devient rouge, appuyez sur la touche F6. ',...
'Fontsize',18);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if any(Ev(:,1)==round(t-Start,1)) && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
N_Ev=find(Ev(:,1)==round(t-Start,1));
MATB_DATA.SYSMON.EtatAlarm(Ev(N_Ev,2),1)=1;
MATB_DATA.SYSMON.EtatAlarm(Ev(N_Ev,2),2)=Ev(N_Ev,3);
MATB_DATA.SYSMON.EtatAlarm(Ev(N_Ev,2),3)=GetSecs;
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
% UPDATE ALL TASKS
if t-MATB_DATA.LastUpdate.KB >= 0.0
[MATB_DATA]=Update_KEYBOARD(MATB_DATA);
end
if t-MATB_DATA.LastUpdate.SYSMON >= 0.2
[MATB_DATA]=Update_SYSMON(MATB_DATA);
end
if t-Start > 60
close(pop); close(fClav);
break
end
drawnow
end
%-------------------------------------------------------
% TRACK
%-------------------------------------------------------
fprintf(fileID,'%s\t\t %.4f \t\t\t %s \n',char(datetime('now','Format','HH:mm:ss')),0,'TRAINING TRACK');
if MATB_DATA.LSL_Streaming
outlet.push_sample({0,'TRAINING TRACK',''});
end
pop_waiter('Passons maintenant à la tache de TRACKING',1)
pop=dialog('position',[240 623 560 259]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [-150 -100 850 250],... %[-100 -100 850 250]
'String','Maintenez le cercle dans le carré central',...
'Fontsize',18);
MATB_DATA.TRACK.Difficulty{1}=0;
Start = GetSecs;
while true
t=GetSecs;
% SET EVENTS
if round(t-Start,1)==20 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
close(pop)
pop=dialog('position',[240 623 560 259]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [-150 -100 850 250],...
'String','Cela peut aussi devenir plus dur',...
'Fontsize',18);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==25 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
MATB_DATA.TRACK.Difficulty{1}=1;
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
% UPDATE ALL TASKS
if t-MATB_DATA.LastUpdate.KB >= 0.0
[MATB_DATA]=Update_KEYBOARD(MATB_DATA);
end
if t-MATB_DATA.LastUpdate.TRACK >= 0.02
[MATB_DATA]=Update_TRACK(MATB_DATA);
end
if t-Start > 60
close(pop)
break
end
drawnow
end
% %pop_waiter('Don`t forget when the CIRCLE is RED, all pumps are OFF !',1,[240 623 560 259],[0 -100 560 250])
%-------------------------------------------------------
% RESMAN
%-------------------------------------------------------
fprintf(fileID,'%s\t\t %.4f \t\t\t %s \n',char(datetime('now','Format','HH:mm:ss')),0,'TRAINING RESMAN');
if MATB_DATA.LSL_Streaming %%%%%%%%%ajouté par Alex car impossible de lancer la tache sans cela
outlet.push_sample({0,'TRAINING RESMAN',''});
end%%%%%%%%%%%%%%%%%%%
pop_waiter('Passons maintenant à la tache de FUEL MANAGEMENT',1)
pop_nowait('L`objectif ici est de garder le niveau des réservoirs A et B autour de 2500 le plus longtemps possible',yesKeys)
pop_nowait('2500 est symbolisé par une petite ligne bleue tandis que les zones bleues latérales délimitent des niveaux (entre 2000 et 3000) au delà desquels une zone critique est atteinte',yesKeys)
pop_nowait('Il est important de maintenir le niveau des reservoirs A et B entre 2000 et 3000. Dans le cas contraire, les chiffres indiquant le niveau deviendront orange',yesKeys)
pop_nowait('Notez bien que lorsqu`une pompe est grise, celle-ci est désactivée. Vert signifie qu`elle est activée et rouge défectueuse.',yesKeys)
pop_nowait('Quand une pompe est défectueuse, vous ne pourrez pas la réparer, vous devrez simplement attendre que celle-ci redevienne fonctionnelle',yesKeys)
fClav2=figure('menubar','non','numbertitle','off','position',[30 87 746 316]);
imagesc(imread('Function_MATB\clavier2.png'))
set(gca,'position',[ 0 0 1 1]); axis off
pop_nowait('Pour activer une pompe, pressez le nombre correspondant à la pompe sur la deuxième ligne du clavier, la pompe en question deviendra alors verte',yesKeys)
close(fClav2);
pop_nowait('Au début, toutes les pompes seront desactivées (grises) et les réservoirs A et B seront vides, donc n`oubliez pas d`activer les pompes !',yesKeys)
pop_nowait('Parfait, faisons maintenant un petit essai. Restez proche de 2500, pas plus, pas moins, 2500 !',yesKeys)
Start = GetSecs;
while true
t=GetSecs;
% SET EVENTS
if round(t-Start,1)==20 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
pop1=dialog('position',[ 30 403 746 276]);
txt = uicontrol('Parent',pop1,...
'Style','text',...
'Position', [-50 -100 850 250],...
'String','Les pompes 1, 2, 3 et 4 sont les plus importantes',...
'Fontsize',18);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==25 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
pop=dialog('position',[26 56 745 254]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [100 -100 600 250],...
'String','Les pompes 5 et 6 doivent être activées tout le temps pour maintenir les réservoirs auxiliaires (C et D) pleins. Les réservoirs E et F sont illimités',...
'Fontsize',18);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==40 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
close(pop); close(pop1)
set(MATB_DATA.RESMAN.handlePompe([1 2]),'backgroundcolor',[1 0 0])
pop1=dialog('position',[30 403 746 276]);
txt = uicontrol('Parent',pop1,...
'Style','text',...
'Position', [100 -100 600 250],...
'String','A présent les pompes 1 et 2 sont défectueuses, elles ne marchent plus. Vous pouvez simplement attendre qu`elles redeviennent fonctionnelles',...
'Fontsize',18);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==45 && t-MATB_DATA.LastUpdate.EVENT > 0.2 % Si jamais y'a un event et qu'il attend 200ms
pop=dialog('position',[26 56 745 254]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [100 -100 600 250],...
'String','En attendant le retour des pompes 1 et 2, vous pouvez activer la pompe 8 pour maintenir un niveau stable dans le réservoir A',...
'Fontsize',18);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
% UPDATE ALL TASKS
if t-MATB_DATA.LastUpdate.KB >= 0.0
[MATB_DATA]=Update_KEYBOARD(MATB_DATA);
end
if t-MATB_DATA.LastUpdate.RESMAN >= 1
[MATB_DATA]=Update_RESMAN(MATB_DATA);
end
if t-MATB_DATA.LastUpdate.LOG >= 0.5
send_log('RESMAN',num2str(MATB_DATA.RESMAN.NiveauxPompe));
MATB_DATA.LastUpdate.LOG=GetSecs;
end
if t-Start > 60
close(pop); close(pop1);
break
end
drawnow
end
% -------------------------------------------------------
% COMM
% -------------------------------------------------------
fprintf(fileID,'%s\t\t %.4f \t\t\t %s \n',char(datetime('now','Format','HH:mm:ss')),0,'TRAINING COMM');
if MATB_DATA.LSL_Streaming
outlet.push_sample({0,'TRAINING COMM',''});
end
pop_waiter('Enfin, voyons comment réaliser la tâche de COMMUNICATION',1)
pop=dialog('position',[937 177 560 299]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [-150 -100 850 250],...
'String','Ecoutez...',...
'Fontsize',18);
drawnow;
Start = GetSecs;
while true
t=GetSecs;
% SET EVENTS
if round(t-Start,1)==1 && t-MATB_DATA.LastUpdate.EVENT > 0.2
TypeOwnOth=1; TypeCOMM=1;
IdFichier=find(MATB_DATA.COMM.IdxCOMM(:,1)==TypeOwnOth & MATB_DATA.COMM.IdxCOMM(:,2)==TypeCOMM);
PsychPortAudio('FillBuffer', MATB_DATA.handlePortAudio,...
[MATB_DATA.COMM.ListFichierAudio{IdFichier(1)}' ; MATB_DATA.COMM.ListFichierAudio{IdFichier(1)}']);
PsychPortAudio('Start', MATB_DATA.handlePortAudio,1,0,1);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==3 && t-MATB_DATA.LastUpdate.EVENT > 0.2
f1=figure('position',[10 487 414 121],'menubar','none','numbertitle','off');
text(-0.1,1,'NASA 504: Cela vous concerne','fontsize',18);
set(gca,'xlim',[0 2],'ylim',[0 2]); axis off
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==12 && t-MATB_DATA.LastUpdate.EVENT > 0.2
close(pop)
f2=figure('position',[10 346 414 94],'menubar','none','numbertitle','off');
text(-0.1,1.3,'Selectionnez NAV1 grâce à la gachette','fontsize',14);
text(0.7,0.6,'du joystick','fontsize',14);
set(gca,'xlim',[0 2],'ylim',[0 2]); axis off
fjoy1=figure('menubar','non','numbertitle','off','position',[821 780 391 272]);
imagesc(imread('Function_MATB\gachette1.png'))
set(gca,'position',[ 0 0 1 1]); axis off
pause(1);
f3=figure('position',[10 220 414 94],'menubar','none','numbertitle','off');
text(-0.15,1.5,'Changez ensuite les valeurs pour atteindre','fontsize',14);
text(-0.13,0.8,'110 et 650 grâce aux boutons sur le haut','fontsize',14);
text(0.7,0.1,'du joystick','fontsize',14);
set(gca,'xlim',[0 2],'ylim',[0 2]); axis off
fjoy2=figure('menubar','non','numbertitle','off','position',[821 404 286 346]);
imagesc(imread('Function_MATB\gachette2.png'))
set(gca,'position',[ 0 0 1 1]); axis off
pause(1);
f4=figure('position',[10 94 414 94],'menubar','none','numbertitle','off');
text(-0.15,1.3,'Enfin, validez le tout avec le bouton latéral','fontsize',14);
set(gca,'xlim',[0 2],'ylim',[0 2]); axis off
fjoy3=figure('menubar','non','numbertitle','off','position',[821 76 211 297]);
imagesc(imread('Function_MATB\gachette3.png'))
set(gca,'position',[ 0 0 1 1]); axis off
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==40 && t-MATB_DATA.LastUpdate.EVENT > 0.2
close(f1, f2, f3, f4, fjoy1, fjoy2, fjoy3);
TypeOwnOth=-1; TypeCOMM=3;
IdFichier=find(MATB_DATA.COMM.IdxCOMM(:,1)==TypeOwnOth & MATB_DATA.COMM.IdxCOMM(:,2)==TypeCOMM);
PsychPortAudio('FillBuffer', MATB_DATA.handlePortAudio,...
[MATB_DATA.COMM.ListFichierAudio{IdFichier(1)}' ; MATB_DATA.COMM.ListFichierAudio{IdFichier(1)}']);
PsychPortAudio('Start', MATB_DATA.handlePortAudio,1,0,1);
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==42 && t-MATB_DATA.LastUpdate.EVENT > 0.2
f4=figure('position',[10 487 414 121],'menubar','none','numbertitle','off');
text(0.05,1.2,'CITRUS 211: Ce message','fontsize',18);
text(0.2,0.6,'ne vous concerne pas','fontsize',18);
set(gca,'xlim',[0 2],'ylim',[0 2]); axis off
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if round(t-Start,1)==44 && t-MATB_DATA.LastUpdate.EVENT > 0.2
f5=figure('position',[10 300 414 140],'menubar','none','numbertitle','off'); %[10 330 414 121]
text(0.2,1.2,'Donc, vous n`avez pas','fontsize',18);
text(0.35,0.6,'à en tenir compte','fontsize',18);
set(gca,'xlim',[0 2],'ylim',[0 2]); axis off
MATB_DATA.LastUpdate.EVENT=GetSecs;
end
if sum(button(MATB_DATA.TRACK.JoystickID)) && GetSecs-MATB_DATA.LastUpdate.JS>=0.25
% [MATB_DATA]=Update_JOYSTICKBUT(MATB_DATA, joy);
Update_JOYSTICKBUT(MATB_DATA.TRACK.JoystickID)
end
if t-Start > 60
close([f4 f5])
break
end
drawnow
end
[MATB_DATA]=ReInit_MATB(MATB_DATA);
PsychPortAudio('Stop', MATB_DATA.handlePortAudio);
KbQueueStop
function pop_nowait(texte,yesKeys)
pop=dialog('position',[ 30 403 746 276]);
txt = uicontrol('Parent',pop,...
'Style','text',...
'Position', [80 -50 600 250],... %[100 -100 600 250]
'String',texte,...
'Fontsize',18);
drawnow; pause(0.5)
while true
[~,~,keyCode] = KbCheck;
if any(keyCode(yesKeys))
break
end
end
close(pop)
end