summaryrefslogtreecommitdiffstats
path: root/Kod/bilbana/yc4/main.m
diff options
context:
space:
mode:
Diffstat (limited to 'Kod/bilbana/yc4/main.m')
-rw-r--r--Kod/bilbana/yc4/main.m294
1 files changed, 67 insertions, 227 deletions
diff --git a/Kod/bilbana/yc4/main.m b/Kod/bilbana/yc4/main.m
index fa966e8..8ee18b2 100644
--- a/Kod/bilbana/yc4/main.m
+++ b/Kod/bilbana/yc4/main.m
@@ -5,10 +5,17 @@ cd display/ClientServerApp/Release
!startServer
cd ../../..
-global display_data;
-display_data = {};
-display_data = {display_data clear_display()};
-pause(1);
+display = struct;
+display.data = [clear_display()];
+display.out = 0;
+display.shm = 0;
+display.shm_interp = struct;
+display.shm_interp.ack = 0;
+display.shm_interp.start_code = '';
+display.shm_interp.data = [];
+display.last_send = tic;
+display.last_request = tic;
+display.send_interval = 0.5;
disp('Startar bilbanan. Avsluta med q.')
hf=figure('position', [0 0 eps eps], 'menubar', 'none');
@@ -16,7 +23,6 @@ hf=figure('position', [0 0 eps eps], 'menubar', 'none');
initialize_counters(1)
initialize_counters(2)
-
config_IOs
load('bilbana\files\Bana1.mat')
@@ -26,6 +32,7 @@ start_race(1)
start_race(2)
car1 = struct;
+car1.num = 1;
car1.running = false;
car1.automatic = true;
car1.segment = 1;
@@ -34,12 +41,12 @@ car1.lap_times = [];
car1.seg_times = [];
car1.position = 0;
car1.seg_len = [0.0 2.53 3.05 4.73 7.68 8.98 10.93 14.69 17.57];
+car1.map = Bana1;
car1.approximation = [];
car1.miss_probability = 0.0;
-%car1.miss_time = uint64(0);
-
car2 = struct;
+car2.num = 2;
car2.running = false;
car2.automatic = true;
car2.segment = 1;
@@ -48,8 +55,10 @@ car2.lap_times = [];
car2.seg_times = [];
car2.position = 0;
car2.seg_len = [0.0 2.53 3.05 4.92 7.60 8.84 10.65 14.68 17.76];
+car2.map = Bana2;
+car2.miss_probability = 0.05;
-
+t = 0;
highToc = 0;
%% ASK ACTIVE CARS
@@ -77,8 +86,16 @@ elseif car2.response == 'M'
else
car2.running = false;
end
-
-
+%{
+ref_time = input('Vilken referenstid ska användas? [13] ', 's');
+ref_time = str2double(ref_time);
+if isnan(ref_time)
+ ref_time = 13;
+elseif not(isreal(ref_time))
+ ref_time = 13;
+end
+%}
+ref_time = 13;
%% MAIN LOOP
while 1
readTime = tic;
@@ -90,227 +107,51 @@ while 1
figure(hf)
drawnow
- % disp(car1);
- %% READ
- if car1.running == true
- [car1.new_lap, car1.new_check_point, car1.time] = get_car_position(1);
- if car1.new_check_point == true && rand < car1.miss_probability && car1.lap >= 4
- disp('Hoppar �ver givare');
- car1.new_check_point = false;
- beep;
- end
- end
- disp(car1);
- if car2.running == true
- [car2.new_lap, car2.new_check_point, car2.time] = get_car_position(2);
- end
- disp(car2);
- %% CHECK LAP AND CHECKPOINT (CAR 1)
- if car1.running == true
- if car1.lap ~= 0
- if toc(car1.seg_tic) > 9.0
- set_car_speed(1, 0);
- set_car_speed(2, 0);
- disp('Avåkning bil 1');
- disp('J = Ja, N = Nej')
- car1.response = input('Vill du fortsätta? [N] ', 's');
- if car1.response == 'J'
- car1.seg_tic = tic;
- else
- break;
- end
- end
- end
- %% CALC POSITION (CAR 1)
- if car1.lap > 1
- last_seg_times1 = car1.seg_times(car1.lap - 1, 1:9);
- aprox_v = get_aprox_v(car1.segment + detect_missed(car1.position, car1.segment, 1), car1.lap, car1.seg_times, 1);
- car1.position = get_position(aprox_v, car1.position, t);
- if detect_missed( car1.position, car1.segment, 1)
- disp('Miss?');
-
- %disp(toc(car1.miss_time));
- %if car1.miss_time == 0
- % car1.miss_time = tic;
- %end
- end
- end
- if car1.new_check_point == true
- if car1.new_lap == false % choose_position krachar vid nytt varv (seg 10)
- if car1.lap ~= 0
- car1.seg_times(car1.lap, car1.segment) = toc(car1.seg_tic);
- end
- car1.segment = car1.segment + 1;
- car1.seg_tic = tic;
- if car1.lap > 2 % S�kerhetsmarginal (B�r vara 1?)
- disp(car1);
- [new_position, seg_plus] = ...
- choose_position(car1.position, car1.segment, 1);
- if seg_plus ~= 0 && car1.segment == 1
- disp('Hoppar �ver missad givare 1/2');
- else
- car1.position = new_position;
- car1.segment = car1.segment + seg_plus;
- end
- %car1.miss_time = uint64(0);
- else
- car1.position = car1.seg_len(car1.segment);
- %car1.miss_time = uint64(0);
- end
- end
- end
- if car1.new_lap == true
- car1.new_lap = false;
- beep;
- disp('------------NEW LAP 1------------')
- if car1.lap == 0
- % dont save time for first lap
- car1.segment = 1;
- car1.lap = car1.lap + 1;
- car1.seg_tic = tic;
- car1.lap_tic = tic;
- else
- % beep;
- car1.seg_times(car1.lap, car1.segment) = toc(car1.seg_tic);
- car1.seg_tic = tic;
- car1.lap_times(car1.lap) = toc(car1.lap_tic);
- car1.lap_tic = tic;
- car1.position = 0;
-
- display_data = {display_data, put_text(100, 32, 'L', strjoin({num2str(car1.lap), get_time_as_string(round(car1.lap_times(car1.lap) * 1000))}, ' '))};
+ [car1, car1.stop, display.data] = do_car(car1, t, display.data);
+ [car2, car2.stop, display.data] = do_car(car2, t, display.data);
- car1.segment = 1;
- car1.lap = car1.lap + 1;
- end
- end
- end
+ if car1.stop == true
+ disp('stopped by car 1');
+ break;
+ end
+ if car2.stop == true
+ disp('stopped by car 2');
+ break;
+ end
- %% CHECK LAP AND CHECKPOINT (CAR 2)
- if car2.running == true
- if car2.lap ~= 0
- if toc(car2.seg_tic) > 9.0
- set_car_speed(1, 0);
- set_car_speed(2, 0);
- disp('Avåkning bil 2');
- disp('J = Ja, N = Nej')
- car2.response = input('Vill du fortsätta? [N] ', 's');
- if car2.response == 'J'
- car2.seg_tic = tic;
- else
- break;
- end
+ %% END OF LOOP
+ while 1 %Whileloop med paus som k�rs till pausen �verskridit 0.07 sekunder
+ % DISPLAY
+ display.send_delay = tic;
+ if toc(display.last_send) > display.send_interval
+ % queue control signal
+ if car1.running && car1.automatic
+ display.data = [display.data, put_text(20, 16 + (16 * 1), 'L', num2str(car1.u))];
end
- end
- if car2.lap > 1
- last_seg_times2 = car2.seg_times(car2.lap - 1, 1:9);
- aprox_v = get_aprox_v(car2.segment + detect_missed(car2.position, car2.segment, 2), car2.lap, car2.seg_times, 2);
- car2.position = get_position(aprox_v, car2.position, t);
- if detect_missed( car2.position, car2.segment, 2)
- disp('Miss?');
-
- %disp(toc(car2.miss_time));
- %if car2.miss_time == 0
- % car2.miss_time = tic;
- %end
+ if car2.running && car2.automatic
+ display.data = [display.data, put_text(20, 16 + (16 * 2), 'L', num2str(car2.u))];
end
- end
- if car2.new_check_point == true
- if car2.new_lap == false % choose_position krachar vid nytt varv (seg 10)
- if car2.lap ~= 0
- car2.seg_times(car2.lap, car2.segment) = toc(car2.seg_tic);
- end
- car2.segment = car2.segment + 1;
- car2.seg_tic = tic;
- disp(car2);
- if car2.lap > 2 % S�kerhetsmarginal (B�r vara 1?)
- [new_position, seg_plus] = ...
- choose_position(car2.position, car2.segment, 2);
- if seg_plus ~= 0 && car2.segment == 1
- disp('Hoppar �ver missad givare 1/2');
- else
- car2.position = new_position;
- car2.segment = car2.segment + seg_plus;
- end
- %car2.miss_time = uint64(0);
- else
- car2.position = car2.seg_len(car2.segment);
- %car2.miss_time = uint64(0);
- end
+
+ % send all queued data
+ if ~isempty(display.data)
+ [display.out] = matlabclient(1, get_smallpackage(display.data));
+ display.data = [];
end
+ display.last_send = tic;
+
+ % read internal mem from last send
+ [display.out, display.shm] = matlabclient(2);
+ [display.shm_interp.ack, display.shm_interp.start_code, display.shm_interp.data] = get_response(display.shm);
+
+ % request internal mem
+ % matlabclient(1, hex2dec(['12'; '01'; '53'; '66']));
end
- if car2.new_lap == true
- car2.new_lap = false;
- disp('------------NEW LAP 2------------')
- if car2.lap == 0
- % dont save time for first lap
- car2.segment = 1;
- car2.lap = car2.lap + 1;
- car2.seg_tic = tic;
- car2.lap_tic = tic;
- else
- % beep;
- car2.seg_times(car2.lap, car2.segment) = toc(car2.seg_tic);
- car2.seg_tic = tic;
- car2.lap_times(car2.lap) = toc(car2.lap_tic);
- car2.lap_tic = tic;
- car2.position = 0;
-
- display_data = {display_data, put_text(100, 48, 'L', strjoin({num2str(car2.lap), get_time_as_string(round(car2.lap_times(car2.lap) * 1000))}, ' '))};
-
- car2.segment = 1;
- car2.lap = car2.lap + 1;
- end
- end
- end
-
- %% CALCULATE (CAR 1)
- if car1.running == true && car1.automatic == true
- car1.car_constant = get_car_constant(1);
- car1.v = get_new_v(car1.position, Bana1);
- car1.track_u_constant = get_track_u_constant();
- car1.u = get_new_u(car1.v, car1.car_constant, car1.track_u_constant);
- end
-
- %% CALCULATE (CAR 2)
- if car2.running == true && car2.automatic == true
- car2.car_constant = get_car_constant(2);
- car2.v = get_new_v(car2.position, Bana2);
- car2.track_u_constant = get_track_u_constant();
- car2.u = get_new_u(car2.v, car2.car_constant, car2.track_u_constant);
- end
-
- % TEMP VARIABLES FOR MANUAL CONTROL
- mult = 100;
- max = 55;
- div = 55;
-
- %% CONTROLLER (CAR 1)
- if car1.running == true && car1.automatic == false
- set_car_speed(1, mult * ((max - get_manual_speed(1)) / div));
- end
-
- %% CONTROLLER (CAR 2)
- if car2.running == true && car2.automatic == false
- set_car_speed(2, mult * ((max - get_manual_speed(2)) / div));
- end
-
- %% EXECUTE
- if car1.running == true && car1.automatic == true
- set_car_speed(1, car1.u);
- end
-
- if car2.running == true && car2.automatic == true
- set_car_speed(2, car2.u);
- end
-
- %% DISPLAY
-
- %% END OF LOOP
- while 1 %Whileloop med paus som k�rs till pausen �verskridit 0.07 sekunder
- pause(0.001);
+ % disp(strjoin({'display took additional ', num2str(toc(display.send_delay))}));
+ % ACTUAL END OF LOOP
t = toc(readTime);
- if t > 0.1
+
+ if t > 0.07
if t > highToc
highToc = t; %Om det nya v�rdet p� pausen �r h�gre �n den tidigare h�gsta s� sparas det som den h�gsta
end
@@ -319,9 +160,8 @@ while 1
end
break;
end
+ pause(0.001);
end
-
- send_data_to_display();
end
%% END OF PROGRAM
@@ -337,10 +177,10 @@ matlabclient(3);
%% DISPLAY GRAPHS
if car1.running == true
- graphs(car1.lap_times, 13, car1.seg_times, 1);
+ graphs(car1.lap_times, ref_time, car1.seg_times, 1);
end
if car2.running == true
- graphs(car2.lap_times, 13, car2.seg_times, 2);
+ graphs(car2.lap_times, ref_time, car2.seg_times, 2);
end