1 /***************************************************************************
2 sonar.cpp - description
3 -------------------
4 begin : Fri Apr 11 2002
5 copyright : (C) 2002 by Michael Bridak
6 email : michael.bridak@verizon.net
7 $Id: sonar.cpp,v 1.14 2003/09/21 21:52:40 mbridak Exp $
8 ***************************************************************************/
9
10 /***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License. *
15 * . *
16 * *
17 ***************************************************************************/
18
19
20
21 #include <string>
22 #include "math.h"
23 #include "SDL/SDL.h"
24 #include "SDL/SDL_image.h"
25 #include "SDL/SDL_thread.h"
26 #include "dfont.h"
27 #include "files.h"
28 #include "message.h"
29 #include "submarine.h"
30 #include "towedarray.h"
31 #include "targetmotionanalysis.h"
32 #include "sonar.h"
33
34 using namespace std;
35
AnBqq5(Submarine * temp,TowedArray & temp2,TargetMotionAnalysis & temp3,msg & temp4)36 AnBqq5::AnBqq5(Submarine *temp, TowedArray &temp2, TargetMotionAnalysis &temp3,
37 msg &temp4): Subs(temp), TB16(temp2), Tma(temp3), Message(temp4)
38 {
39 northcenter = true;
40 arraychoice5by6 = true;
41 bearingdisplay5by6 = true;
42 sonarwidget = false;
43 cursorBearing = 0;
44 }
45
~AnBqq5()46 AnBqq5::~AnBqq5(){}
47
InitGraphics()48 void AnBqq5::InitGraphics()
49 {
50 screen = SDL_GetVideoSurface();
51 SDL_Surface *temp = SDL_CreateRGBSurface(SDL_SWSURFACE, 368, 280, 16,
52 screen->format->Rmask,
53 screen->format->Gmask,
54 screen->format->Bmask,
55 screen->format->Amask);
56 sonarscreen=SDL_DisplayFormat(temp);
57 towedarrayscreen=SDL_DisplayFormat(temp);
58 SDL_FreeSurface(temp);
59 uppersonarcrt=sonarscreen;
60 lowersonarcrt=towedarrayscreen;
61 if ( screen == NULL || sonarscreen == NULL || towedarrayscreen == NULL) {
62 cerr << "OOPS" << SDL_GetError() << endl;
63 exit(1);
64 }
65 string filename;
66 string filename2;
67 black = SDL_MapRGB(screen->format, 0, 0, 0);
68 white = SDL_MapRGB(screen->format, 255, 255, 255);
69 green = SDL_MapRGB(screen->format, 0,255,0);
70 // medium_green = SDL_MapRGB(screen->format, 0, 160, 0);
71 // dark_green = SDL_MapRGB(screen->format, 0, 100, 0);
72 }
73
ClearSonarData()74 void AnBqq5::ClearSonarData(){ //when the display is switched from north centered
75 //to south centered, we must erase the old display data
76 SDL_Rect rectangle;
77 rectangle.x=0;
78 rectangle.y=0;
79 rectangle.h=200;
80 rectangle.w=368;
81 SDL_FillRect(sonarscreen, &rectangle, black);
82 SDL_FillRect(towedarrayscreen, &rectangle, black);
83 }
84
DPixel(SDL_Surface * screen,int x,int y,Uint32 color)85 inline void AnBqq5::DPixel(SDL_Surface *screen, int x, int y, Uint32 color)
86 {
87 //this only works for 16bpp screens
88 //place the pixel on the screen
89 Uint16 *pixel_location;
90 pixel_location = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
91 *pixel_location = color;
92 }
93
94
DLine(SDL_Surface * screen,int X1,int Y1,int X2,int Y2,Uint32 Color)95 inline void AnBqq5::DLine(SDL_Surface *screen, int X1, int Y1, int X2, int Y2, Uint32 Color)
96 {
97
98 //don't even ask me about this stuff All I know is it works
99 //and thats ALL I care about...
100
101 int dx,dy,sdx,sdy,py,px,x,y;
102 dx = X2 - X1;
103 dy = Y2 - Y1;
104 if (dx < 0) sdx = -1;
105 else sdx = 1;
106 if (dy < 0) sdy = -1;
107 else sdy = 1;
108 dx = sdx * dx + 1;
109 dy = sdy * dy + 1;
110 x = 0;
111 y = 0;
112 px = X1;
113 py = Y1;
114 if (dx >= dy){
115 for (int x = 0; x < dx; x++){
116 DPixel(screen, px, py, Color);
117 y = y + dy;
118 if (y >= dx){
119 y = y - dx;
120 py = py + sdy;
121 }
122 px = px + sdx;
123 }
124 }else{
125 for (int y = 0; y < dy; y++){
126 DPixel(screen, px, py, Color);
127 x = x + dx;
128 if (x >= dy){
129 x = x - dy;
130 px = px + sdx;
131 }
132 py = py + sdy;
133 }
134 }
135 }
136
Sonar(bool center)137 void AnBqq5::Sonar(bool center)
138
139 /********************************************
140 This routine checks the sonar event queue
141 and if there is an event, plots the sound
142 source on the waterfall display. It's called
143 every 1/5 of a second. and in turn calls
144 AdvanceSonarScreen() every second.
145 *********************************************/
146
147 {
148 Uint32 tracecolor; //We have to put the color somewhere
149 int direction;
150 float signal;
151 int ship_type;
152 double combined_sound;
153
154 if (Subs->GetCount()>0){
155 //Are there any sound events at this time index to worry about?
156 for (int event=1; event<=Subs->GetCount(); event++){
157 //If so step through the events.
158 Subs->GetEvent(event, &direction, &signal, &ship_type);
159 //TargetId not used now but maybe later in TMA
160
161 //visable mono color from 70 - 255
162 combined_sound = (signal * 4) + flowandambientnoise;
163 if (combined_sound > 255.0)
164 combined_sound = 255.0;
165 switch(ship_type)
166 {
167 case TYPE_SHIP:
168 tracecolor=SDL_MapRGB(sonarscreen->format, 0,(int) combined_sound, 0); break;
169 case TYPE_TORPEDO:
170 tracecolor=SDL_MapRGB(sonarscreen->format,(int) combined_sound, 0, 0); break;
171 case TYPE_SUB:
172 default:
173 tracecolor=SDL_MapRGB(sonarscreen->format, 0, 0, (int) combined_sound); break;
174 }
175 //Change brightness based on strength of signal
176 int tdirection = direction;
177 for(int xx = 1;xx < 6; xx++){
178 direction = (-3+RandInt(6))+tdirection;
179 //throw some variances in the bearing nothing is perfekt!...
180 if (direction < 0) direction += 360; //Christ I hate roll overs in degrees
181 if (direction > 359) direction -= 360;
182
183 if (!center){ //Do we want the sonar display to be North centered ?
184 DPixel(sonarscreen, direction, 0, tracecolor); //plots on 0-60 sec display
185 DPixel(sonarscreen, direction, 70, tracecolor); //plots on 0-30 min display
186 DPixel(sonarscreen, direction, 140, tracecolor); //plots on 0-2 hr display
187 }
188 else { //draw traces for south centered display
189 DPixel(sonarscreen, ReciprocalBearing(direction),
190 0, tracecolor); //plots on 0-60 sec display
191 DPixel(sonarscreen, ReciprocalBearing(direction),
192 70, tracecolor); //plots on 0-30 min display
193 DPixel(sonarscreen, ReciprocalBearing(direction),
194 140, tracecolor); //plots on 0-2 hr display
195 }
196 }
197 }
198 }
199 if (!center){
200 DPixel(sonarscreen, (int)Subs->Heading, 0, white); //plot our heading
201 }else{
202 DPixel(sonarscreen, ReciprocalBearing((int)Subs->Heading),
203 0, white); //plots our heading
204 }
205 AdvanceSonarDisplay(); //advance the screen.
206 UpdateCursor();
207 }
208
209
210
DisplaySonar()211 void AnBqq5::DisplaySonar(){
212 SDL_Rect destination_rectangle;
213 SDL_Rect source_rectangle;
214 DisplayBearingScale(northcenter);
215 DisplayCursor();
216
217 if(uppersonarcrt != NULL){
218 source_rectangle.x = 0;
219 source_rectangle.y = 0;
220 source_rectangle.w = 360;
221 source_rectangle.h = 200;
222 destination_rectangle.x = 52;
223 destination_rectangle.y = 150;
224 destination_rectangle.w = 360;
225 destination_rectangle.h = 200;
226 SDL_BlitSurface(uppersonarcrt, &source_rectangle, screen, &destination_rectangle);
227 SDL_UpdateRects(screen, 1, &destination_rectangle);
228 }
229
230
231 if(lowersonarcrt != NULL){
232 source_rectangle.x = 0;
233 source_rectangle.y = 0;
234 source_rectangle.w = 360;
235 source_rectangle.h = 200;
236 destination_rectangle.x = 52;
237 destination_rectangle.y = 450;
238 destination_rectangle.w = 360;
239 destination_rectangle.h = 200;
240 SDL_BlitSurface(lowersonarcrt, &source_rectangle, screen, &destination_rectangle);
241 SDL_UpdateRects(screen, 1, &destination_rectangle);
242 }
243
244 }
245
UpdateDisplay(Submarine * current_target)246 void AnBqq5::UpdateDisplay(Submarine *current_target){
247 SDL_Rect destination_rectangle;
248 static char text[120];
249 char filename[] = "images/largefont.png";
250 char filename2[] = "data/largefont.dat";
251 static DFont largeFont(filename, filename2);
252 DisplaySonar(); //draw sonar screen
253 destination_rectangle.x=830;
254 destination_rectangle.y=410; //define a rectangle on the screen and make it black
255 destination_rectangle.h=30;
256 destination_rectangle.w=90;
257 SDL_FillRect(screen, &destination_rectangle, black);
258 SDL_UpdateRects(screen, 1, &destination_rectangle);
259 destination_rectangle.y=498; //define a rectangle on the screen and make it black
260 SDL_FillRect(screen, &destination_rectangle, black);
261 SDL_UpdateRects(screen, 1, &destination_rectangle);
262 if (current_target)
263 {
264 tempint = (int)Subs->BearingToTarget( current_target );
265 sprintf(text, "%4i", tempint);
266 largeFont.PutString(screen, 840, 412, text);
267 Subs->DEAngle( current_target );
268 if (deAngle > 0){
269 sprintf(text,"+%3.1f",deAngle);
270 }else{
271 sprintf(text,"%3.1f",deAngle);
272 }
273 largeFont.PutString(screen, 840, 498, text);
274 }
275 }
276
TowedSonar(bool center)277 void AnBqq5::TowedSonar(bool center)
278
279 /********************************************
280 This routine checks the sonar event queue
281 and if there is an event, plots the sound
282 source on the waterfall display. It's called
283 every 1/5 of a second. and in turn calls
284 AdvanceSonarScreen() every second.
285 *********************************************/
286
287 {
288 Uint32 tracecolor; //We have to put the color somewhere
289 int direction, ambiguous_direction, bearing, ambiguous_relative_bearing;
290 int ship_type;
291 float signal;
292 double combined_sound;
293 int TB16_Count = TB16.GetCount();
294 if (TB16_Count > 0){
295 //Are there any sound events at this time index to worry about?
296 for (int event=1; event<=TB16_Count; event++){
297 //If so step through the events.
298 TB16.GetEvent(event, &bearing, &signal, &ship_type);
299 ambiguous_relative_bearing = (int)TB16.BearingAmbiguity((float)bearing);
300 //TargetId not used now but maybe later in TMA
301 //visable mono color from 70 - 255
302 combined_sound = (signal * 4) + flowandambientnoise;
303 if (combined_sound > 255.0)
304 combined_sound = 255.0;
305 switch(ship_type)
306 {
307 case TYPE_SHIP:
308 tracecolor=SDL_MapRGB(sonarscreen->format, 0,(int) combined_sound, 0); break;
309 case TYPE_TORPEDO:
310 tracecolor=SDL_MapRGB(sonarscreen->format,(int) combined_sound, 0, 0); break;
311 case TYPE_SUB:
312 default:
313 tracecolor=SDL_MapRGB(sonarscreen->format, 0, 0, (int) combined_sound); break;
314 }
315
316 //Change brightness based on strength of signal
317 for(int xx = 1;xx < 6; xx++){
318 direction = bearing;
319 //if (direction >= 360) direction -= 360;
320 direction = (-3+RandInt(6))+direction;
321 //throw some variances in the bearing nothing is perfekt!...
322 if (direction < 0) direction += 360;
323 if (direction > 359) direction -= 360;
324 ambiguous_direction = ambiguous_relative_bearing;
325 //if (ambiguous_direction >= 360) ambiguous_direction -= 360;
326 ambiguous_direction = (-3+RandInt(6))+ambiguous_direction;
327 if (ambiguous_direction < 0) ambiguous_direction += 360;
328 if (ambiguous_direction > 359) ambiguous_direction -= 360;
329 if (!center){ //Do we want the sonar display to be North centered ?
330 DPixel(towedarrayscreen, direction, 0, tracecolor); //plots on 0-60 sec display
331 DPixel(towedarrayscreen, direction, 70, tracecolor); //plots on 0-30 min display
332 DPixel(towedarrayscreen, direction, 140, tracecolor); //plots on 0-2 hr display
333 DPixel(towedarrayscreen, ambiguous_direction, 0, tracecolor); //Do the same for the
334 DPixel(towedarrayscreen, ambiguous_direction, 70, tracecolor); //ambiguous bearing
335 DPixel(towedarrayscreen, ambiguous_direction, 140, tracecolor); //returned from towed array
336 }else { //draw traces for south centered display
337 DPixel(towedarrayscreen, ReciprocalBearing(direction),
338 0, tracecolor); //plots on 0-60 sec display
339 DPixel(towedarrayscreen, ReciprocalBearing(direction),
340 70, tracecolor); //plots on 0-30 min display
341 DPixel(towedarrayscreen, ReciprocalBearing(direction),
342 140, tracecolor); //plots on 0-2 hr display
343
344 DPixel(towedarrayscreen, ReciprocalBearing(ambiguous_direction),
345 0, tracecolor); //plots on 0-60 sec display
346 DPixel(towedarrayscreen, ReciprocalBearing(ambiguous_direction),
347 70, tracecolor); //plots on 0-30 min display
348 DPixel(towedarrayscreen, ReciprocalBearing(ambiguous_direction),
349 140, tracecolor); //plots on 0-2 hr display
350 }
351 }
352 }
353 }
354 if (!center){
355 DPixel(towedarrayscreen, (int)Subs->Heading, 0, white); //plot our heading
356 }else{
357 DPixel(towedarrayscreen, ReciprocalBearing((int)Subs->Heading),
358 0, white); //plots our heading
359 }
360 AdvanceTB16Screen(); //advance the screen.
361 }
362
AdvanceSonarDisplay()363 void AnBqq5::AdvanceSonarDisplay(){
364 SDL_Rect destination_rectangle;
365 SDL_Rect source_rectangle;
366 static int count = 0;
367 static int count2 = 0;
368 int my_noise;
369 Uint32 noisecolor;
370 // move the minute display down
371 source_rectangle.x = 0; //sonar screen minus last line
372 source_rectangle.y = 0;
373 source_rectangle.w = 360;
374 source_rectangle.h = 59;
375 destination_rectangle.x = 0;
376 destination_rectangle.y = 1;
377 destination_rectangle.w = 360;
378 destination_rectangle.h = 59;
379 //cut sonarscreen and paste it back one line lower
380 SDL_BlitSurface(sonarscreen, &source_rectangle, sonarscreen, &destination_rectangle);
381 //Fill first line with background noise
382 for(int nbp = 0; nbp<360; nbp++){
383 bool sensordeaf = false;
384 int array_heading;
385 if(northcenter){
386 array_heading = (int)Subs->Heading;
387 }else{
388 array_heading = ReciprocalBearing((int)Subs->Heading);
389 }
390 int recipbearing;
391 if (array_heading >= 180){
392 recipbearing = array_heading - 180;
393 }else{
394 recipbearing = array_heading + 180;
395 }
396 int bearing_to_target = nbp;
397 if(recipbearing > bearing_to_target) bearing_to_target += 360;
398 int relative_bearing = bearing_to_target - recipbearing;
399 if(relative_bearing > 150 && relative_bearing < 210) sensordeaf = true;
400 if (!sensordeaf){
401 // noisecolor=SDL_MapRGB(sonarscreen->format, 0,(int) fabs((flowandambientnoise - RandInt(40))) , 0);
402 my_noise = (int) fabs( (flowandambientnoise - RandInt(40) ) ) / 2;
403 noisecolor=SDL_MapRGB(sonarscreen->format, my_noise, my_noise, my_noise);
404 DPixel(sonarscreen, nbp, 0, noisecolor);
405 }
406 else{
407 DPixel(sonarscreen, nbp, 0, black);
408 }
409 }
410
411 // move the 0-30 min display down
412 ++count;
413 if(count>29){
414 count = 0;
415 source_rectangle.x = 0; //sonar screen minus last line
416 source_rectangle.y = 70;
417 source_rectangle.w = 360;
418 source_rectangle.h = 59;
419 destination_rectangle.x = 0;
420 destination_rectangle.y = 71;
421 destination_rectangle.w = 360;
422 destination_rectangle.h = 59;
423 //cut sonarscreen and paste it to buffer
424 SDL_BlitSurface(sonarscreen, &source_rectangle, sonarscreen, &destination_rectangle);
425 for(int nbp = 0; nbp<360; nbp++){
426 bool sensordeaf = false;
427 int array_heading;
428 if(northcenter){
429 array_heading = (int)Subs->Heading;
430 }else{
431 array_heading = ReciprocalBearing((int)Subs->Heading);
432 }
433 int recipbearing;
434 if (array_heading >= 180){
435 recipbearing = array_heading - 180;
436 }else{
437 recipbearing = array_heading + 180;
438 }
439 int bearing_to_target = nbp;
440 if(recipbearing > bearing_to_target) bearing_to_target += 360;
441 int relative_bearing = bearing_to_target - recipbearing;
442 if(relative_bearing > 150 && relative_bearing < 210) sensordeaf = true;
443 if (!sensordeaf){
444 // noisecolor=SDL_MapRGB(sonarscreen->format, 0,(int) fabs((flowandambientnoise - RandInt(40))) , 0);
445 my_noise = (int) fabs( (flowandambientnoise - RandInt(40) ) ) / 2;
446 noisecolor = SDL_MapRGB(sonarscreen->format, my_noise, my_noise, my_noise);
447 DPixel(sonarscreen, nbp, 70, noisecolor);
448 }
449 else{
450 DPixel(sonarscreen, nbp, 70, black);
451 }
452 }
453 }
454 // move the 0-2 hour display down
455 ++count2;
456 if(count2 > 119){
457 count2 = 0;
458 source_rectangle.x = 0; //sonar screen minus last line
459 source_rectangle.y = 140;
460 source_rectangle.w = 360;
461 source_rectangle.h = 59;
462 destination_rectangle.x = 0;
463 destination_rectangle.y = 141;
464 destination_rectangle.w = 360;
465 destination_rectangle.h = 59;
466 //cut sonarscreen and paste it to buffer
467 SDL_BlitSurface(sonarscreen, &source_rectangle, sonarscreen, &destination_rectangle);
468 for(int nbp = 0; nbp<360; nbp++){
469 bool sensordeaf = false;
470 int array_heading;
471 if(northcenter){
472 array_heading = (int)Subs->Heading;
473 }else{
474 array_heading = ReciprocalBearing((int)Subs->Heading);
475 }
476 int recipbearing;
477 if (array_heading >= 180){
478 recipbearing = array_heading - 180;
479 }else{
480 recipbearing = array_heading + 180;
481 }
482 int bearing_to_target = nbp;
483 if(recipbearing > bearing_to_target) bearing_to_target += 360;
484 int relative_bearing = bearing_to_target - recipbearing;
485 if(relative_bearing > 150 && relative_bearing < 210) sensordeaf = true;
486 if (!sensordeaf){
487 // noisecolor=SDL_MapRGB(sonarscreen->format, 0,(int) fabs((flowandambientnoise - RandInt(40))) , 0);
488
489 my_noise = (int) fabs( (flowandambientnoise - RandInt(40) ) ) / 2;
490 noisecolor = SDL_MapRGB(sonarscreen->format, my_noise, my_noise, my_noise);
491 DPixel(sonarscreen, nbp, 140, noisecolor);
492 }
493 else{
494 DPixel(sonarscreen, nbp, 140, black);
495 }
496 }
497 }
498 }
499
500
AdvanceTB16Screen()501 void AnBqq5::AdvanceTB16Screen()
502
503 /******************************************
504 This routine advances the waterfall display
505 on the TB16 towed array screen.
506 *******************************************/
507
508 {
509
510 static int count = 0;
511 static int count2 = 0;
512 Uint32 noisecolor;
513 int my_noise;
514
515 // move the minute display down
516
517 SDL_Rect source, destination;
518 source.x = 0; //sonar screen minus last line
519 source.y = 0;
520 source.w = 360;
521 source.h = 59;
522
523 destination.x = 0;
524 destination.y = 1;
525 destination.w = 360;
526 destination.h = 59;
527
528 //cut towedarrayscreen and paste it to buffer
529 SDL_BlitSurface(towedarrayscreen, &source, towedarrayscreen, &destination);
530
531
532
533 //erase portion of screen
534 DLine(towedarrayscreen, 0, 0, 360, 0, black);
535 if (TB16.GetLength() > 240){
536 for(int nbp = 0; nbp<360; nbp++){
537
538 bool sensordeaf = false;
539 int array_heading;
540 if(northcenter){
541 array_heading = (int)TB16.ReturnHeading();
542 }else{
543 array_heading = ReciprocalBearing((int)TB16.ReturnHeading());
544 }
545 int bearing_to_target = nbp;
546 if(array_heading > bearing_to_target) bearing_to_target += 360;
547 int relative_bearing = bearing_to_target - array_heading;
548 if(relative_bearing > 150 && relative_bearing < 210) sensordeaf = true;
549 if(!sensordeaf){
550 // noisecolor=SDL_MapRGB(towedarrayscreen->format, 0,(int) fabs((flowandambientnoise - RandInt(40))), 0);
551 my_noise = (int) fabs( (flowandambientnoise - RandInt(40) ) ) / 2;
552 noisecolor = SDL_MapRGB(towedarrayscreen->format, my_noise, my_noise, my_noise);
553 DPixel(towedarrayscreen, nbp, 0, noisecolor);
554 }
555 else{
556 DPixel(towedarrayscreen, nbp, 0, black);
557 }
558 }
559 }
560
561
562 // move the 0-30 min display down
563 ++count;
564 if(count>29){
565 count = 0;
566
567 source.x = 0; //sonar screen minus last line
568 source.y = 70;
569 source.w = 360;
570 source.h = 59;
571
572 destination.x = 0;
573 destination.y = 71;
574 destination.w = 360;
575 destination.h = 59;
576
577 //cut towedarrayscreen and paste it to buffer
578 SDL_BlitSurface(towedarrayscreen, &source, towedarrayscreen, &destination);
579 if (TB16.GetLength() > 240){
580 for(int nbp = 0; nbp<360; nbp++){
581
582 bool sensordeaf = false;
583 int array_heading;
584 if(northcenter){
585 array_heading = (int)TB16.ReturnHeading();
586 }else{
587 array_heading = ReciprocalBearing((int)TB16.ReturnHeading());
588 }
589 int bearing_to_target = nbp;
590 if(array_heading > bearing_to_target) bearing_to_target += 360;
591 int relative_bearing = bearing_to_target - array_heading;
592 if(relative_bearing > 150 && relative_bearing < 210) sensordeaf = true;
593 if(!sensordeaf){
594 // noisecolor=SDL_MapRGB(towedarrayscreen->format, 0,(int) fabs((flowandambientnoise - RandInt(40))), 0);
595 my_noise = (int) fabs( (flowandambientnoise - RandInt(40) ) ) / 2;
596 noisecolor = SDL_MapRGB(towedarrayscreen->format, my_noise, my_noise, my_noise);
597 DPixel(towedarrayscreen, nbp, 70, noisecolor);
598 }
599 else{
600 DPixel(towedarrayscreen, nbp, 70, black);
601 }
602 }
603 }
604 }
605 // move the 0-2 hour display down
606 ++count2;
607 if(count2 > 119){
608 count2 = 0;
609
610 source.x = 0; //sonar screen minus last line
611 source.y = 140;
612 source.w = 360;
613 source.h = 59;
614
615 destination.x = 0; // temp buffer
616 destination.y = 141;
617 destination.w = 360;
618 destination.h = 59;
619
620 //cut towedarrayscreen and paste it to buffer
621 SDL_BlitSurface(towedarrayscreen, &source, towedarrayscreen, &destination);
622 if (TB16.GetLength() > 240){
623 for(int nbp = 0; nbp<360; nbp++){
624 bool sensordeaf = false;
625 int array_heading;
626 if(northcenter){
627 array_heading = (int)TB16.ReturnHeading();
628 }else{
629 array_heading = ReciprocalBearing((int)TB16.ReturnHeading());
630 }
631 int bearing_to_target = nbp;
632 if(array_heading > bearing_to_target) bearing_to_target += 360;
633 int relative_bearing = bearing_to_target - array_heading;
634 if(relative_bearing > 150 && relative_bearing < 210) sensordeaf = true;
635 if(!sensordeaf){
636 // noisecolor=SDL_MapRGB(towedarrayscreen->format, 0,(int) fabs((flowandambientnoise - RandInt(40))), 0);
637 my_noise = (int) fabs( (flowandambientnoise - RandInt(40) ) ) / 2;
638 noisecolor = SDL_MapRGB(towedarrayscreen->format, my_noise, my_noise, my_noise);
639 DPixel(towedarrayscreen, nbp, 140, noisecolor);
640 }
641 else{
642 DPixel(towedarrayscreen, nbp, 140, black);
643 }
644 }
645 }
646 }
647 }
648
649
DisplayBearingScale(bool center)650 void AnBqq5::DisplayBearingScale(bool center){
651 SDL_Rect destination_rectangle;
652 if(center){
653 destination_rectangle.x = 50; //upper left corner to
654 destination_rectangle.y = 130; //place the scale
655 destination_rectangle.h = ncscale->h; //height &
656 destination_rectangle.w = ncscale->w;//width of button.
657 SDL_BlitSurface(ncscale, NULL, screen, &destination_rectangle); // Do the Blit.
658 SDL_UpdateRects(screen, 1, &destination_rectangle);
659 destination_rectangle.x = 50; //upper left corner to
660 destination_rectangle.y = 430; //place the scale
661 SDL_BlitSurface(ncscale, NULL, screen, &destination_rectangle); // Do the Blit.
662 SDL_UpdateRects(screen, 1, &destination_rectangle);
663 }else{
664 destination_rectangle.x = 50; //upper left corner to
665 destination_rectangle.y = 130; //place the scale
666 destination_rectangle.h = scscale->h; //height &
667 destination_rectangle.w = scscale->w;//width of button.
668 SDL_BlitSurface(scscale, NULL, screen, &destination_rectangle); // Do the Blit.
669 SDL_UpdateRects(screen, 1, &destination_rectangle);
670 destination_rectangle.x = 50; //upper left corner to
671 destination_rectangle.y = 430; //place the scale
672 SDL_BlitSurface(scscale, NULL, screen, &destination_rectangle); // Do the Blit.
673 SDL_UpdateRects(screen, 1, &destination_rectangle);
674 }
675 }
676
LoadWidgets()677 void AnBqq5::LoadWidgets(){
678 //cerr << "LoadWidgets()" << endl;
679 SDL_Surface *temp;
680
681 temp = Load_Image("images/nc_scale.png");
682 if(temp != NULL) ncscale = SDL_DisplayFormat(temp);
683 if ( ncscale == NULL ) { // Are we screwed??
684 cerr<<"Function LoadWidgets()" << endl
685 << SDL_GetError() << endl;
686 SDL_Quit();
687 exit(0);
688 }
689 SDL_FreeSurface(temp);
690
691 temp = Load_Image("images/sc_scale.png");
692 if(temp != NULL) scscale = SDL_DisplayFormat(temp);
693 if ( scscale == NULL ) { // Are we screwed??
694 cerr<<"Function LoadWidgets()" << endl
695 << SDL_GetError() << endl;
696 SDL_Quit();
697 exit(0);
698 }
699 SDL_FreeSurface(temp);
700 temp = Load_Image("images/sonarup.png");
701 if(temp != NULL) sonarbuttonup = SDL_DisplayFormat(temp);
702 if ( sonarbuttonup == NULL ) { // Are we screwed??
703 cerr<<"Function LoadWidgets()" << endl
704 << SDL_GetError() << endl;
705 SDL_Quit();
706 exit(0);
707 }
708 SDL_FreeSurface(temp);
709 temp = Load_Image("images/sonardown.png");
710 if(temp != NULL) sonarbuttondown = SDL_DisplayFormat(temp);
711 if ( sonarbuttondown == NULL ) { // Are we screwed??
712 cerr<<"Function LoadWidgets()" << endl
713 << SDL_GetError() << endl;
714 SDL_Quit();
715 exit(0);
716 }
717 SDL_FreeSurface(temp);
718 temp = Load_Image("images/rel_true.png");
719 if(temp != NULL) truerel[0] = SDL_DisplayFormat(temp);
720 if ( truerel[0] == NULL ) { // Are we screwed??
721 cerr<<"Function LoadWidgets()" << endl
722 << SDL_GetError() << endl;
723 SDL_Quit();
724 exit(0);
725 }
726 SDL_FreeSurface(temp);
727
728 temp = Load_Image("images/true_rel.png");
729 if(temp != NULL) truerel[1] = SDL_DisplayFormat(temp);
730 if ( truerel[1] == NULL ) { // Are we screwed??
731 cerr<<"Function LoadWidgets()" << endl
732 << SDL_GetError() << endl;
733 SDL_Quit();
734 exit(0);
735 }
736 SDL_FreeSurface(temp);
737
738 temp = Load_Image("images/sphericaltowed.png");
739 if(temp != NULL) sphertowed[1] = SDL_DisplayFormat(temp);
740 if ( sphertowed[1] == NULL ) { // Are we screwed??
741 cerr<<"Function LoadWidgets()" << endl
742 << SDL_GetError() << endl;
743 SDL_Quit();
744 exit(0);
745 }
746 SDL_FreeSurface(temp);
747
748 temp = Load_Image("images/towedspherical.png");
749 if(temp != NULL) sphertowed[0] = SDL_DisplayFormat(temp);
750 if ( sphertowed[0] == NULL ) { // Are we screwed??
751 cerr<<"Function LoadWidgets()" << endl
752 << SDL_GetError() << endl;
753 SDL_Quit();
754 exit(0);
755 }
756 SDL_FreeSurface(temp);
757
758 temp = Load_Image("images/uppercrtoff.png");
759 if(temp != NULL) uppercrtoff = SDL_DisplayFormat(temp);
760 if ( uppercrtoff == NULL ) { // Are we screwed??
761 cerr<<"Function LoadWidgets()" << endl
762 << SDL_GetError() << endl;
763 SDL_Quit();
764 exit(0);
765 }
766 SDL_FreeSurface(temp);
767
768 temp = Load_Image("images/uppercrton.png");
769 if(temp != NULL) uppercrton = SDL_DisplayFormat(temp);
770 if ( uppercrton == NULL ) { // Are we screwed??
771 cerr<<"Function LoadWidgets()" << endl
772 << SDL_GetError() << endl;
773 SDL_Quit();
774 exit(0);
775 }
776 SDL_FreeSurface(temp);
777
778 temp = Load_Image("images/lowercrtoff.png");
779 if(temp != NULL) lowercrtoff = SDL_DisplayFormat(temp);
780 if ( lowercrtoff == NULL ) { // Are we screwed??
781 cerr<<"Function LoadWidgets()" << endl
782 << SDL_GetError() << endl;
783 SDL_Quit();
784 exit(0);
785 }
786 SDL_FreeSurface(temp);
787
788 temp = Load_Image("images/lowercrton.png");
789 if(temp != NULL) lowercrton = SDL_DisplayFormat(temp);
790 if ( lowercrton == NULL ) { // Are we screwed??
791 cerr<<"Function LoadWidgets()" << endl
792 << SDL_GetError() << endl;
793 SDL_Quit();
794 exit(0);
795 }
796 SDL_FreeSurface(temp);
797
798 temp = Load_Image("images/tb16winchon.png");
799 if(temp != NULL) tb16winchon = SDL_DisplayFormat(temp);
800 if ( tb16winchon == NULL ) { // Are we screwed??
801 cerr<<"Function LoadWidgets()" << endl
802 << SDL_GetError() << endl;
803 SDL_Quit();
804 exit(0);
805 }
806 SDL_FreeSurface(temp);
807
808 temp = Load_Image("images/tb16winchoff.png");
809 if(temp != NULL) tb16winchoff = SDL_DisplayFormat(temp);
810 if ( tb16winchoff == NULL ) { // Are we screwed??
811 cerr<<"Function LoadWidgets()" << endl
812 << SDL_GetError() << endl;
813 SDL_Quit();
814 exit(0);
815 }
816 SDL_FreeSurface(temp);
817
818 temp = Load_Image("images/extendtb16on.png");
819 if(temp != NULL) extendtb16[1] = SDL_DisplayFormat(temp);
820 if ( extendtb16[1] == NULL ) { // Are we screwed??
821 cerr<<"Function LoadWidgets()" << endl
822 << SDL_GetError() << endl;
823 SDL_Quit();
824 exit(0);
825 }
826 SDL_FreeSurface(temp);
827
828 temp = Load_Image("images/extendtb16off.png");
829 if(temp != NULL) extendtb16[0] = SDL_DisplayFormat(temp);
830 if ( extendtb16[0] == NULL ) { // Are we screwed??
831 cerr<<"Function LoadWidgets()" << endl
832 << SDL_GetError() << endl;
833 SDL_Quit();
834 exit(0);
835 }
836 SDL_FreeSurface(temp);
837
838 temp = Load_Image("images/retracttb16on.png");
839 if(temp != NULL) retracttb16[1] = SDL_DisplayFormat(temp);
840 if ( retracttb16[1] == NULL ) { // Are we screwed??
841 cerr<<"Function LoadWidgets()" << endl
842 << SDL_GetError() << endl;
843 SDL_Quit();
844 exit(0);
845 }
846 SDL_FreeSurface(temp);
847
848 temp = Load_Image("images/retracttb16off.png");
849 if(temp != NULL) retracttb16[0] = SDL_DisplayFormat(temp);
850 if ( retracttb16[0] == NULL ) { // Are we screwed??
851 cerr<<"Function LoadWidgets()" << endl
852 << SDL_GetError() << endl;
853 SDL_Quit();
854 exit(0);
855 }
856 SDL_FreeSurface(temp);
857
858 temp = Load_Image("images/cutarray.png");
859 if (temp != NULL)
860 cutarray = SDL_DisplayFormat(temp);
861 if (! cutarray)
862 {
863 cerr << "Error loading cutarray.png in LoadWidgets()" << endl
864 << SDL_GetError() << endl;
865 SDL_Quit();
866 exit(0);
867 }
868
869 temp = Load_Image("images/ping_button.png");
870 if (temp != NULL)
871 sendping = SDL_DisplayFormat(temp);
872 if (! sendping)
873 {
874 cerr << "Error loading ping_button.png in LoadWidgets()" << endl
875 << SDL_GetError() << endl;
876 SDL_Quit();
877 exit(0);
878 }
879
880 temp = Load_Image("images/assigntrackeroff.png");
881 if(temp != NULL) assigntrackerwidget[0] = SDL_DisplayFormat(temp);
882 if ( assigntrackerwidget[0] == NULL ) { // Are we screwed??
883 cerr<<"Function LoadWidgets()" << endl
884 << SDL_GetError() << endl;
885 SDL_Quit();
886 exit(0);
887 }
888 SDL_FreeSurface(temp);
889
890 temp = Load_Image("images/assigntrackeron.png");
891 if(temp != NULL) assigntrackerwidget[1] = SDL_DisplayFormat(temp);
892 if ( assigntrackerwidget[1] == NULL ) { // Are we screwed??
893 cerr<<"Function LoadWidgets()" << endl
894 << SDL_GetError() << endl;
895 SDL_Quit();
896 exit(0);
897 }
898 SDL_FreeSurface(temp);
899
900 temp = Load_Image("images/track1.png");
901 if(temp != NULL) tracker1[0] = SDL_DisplayFormat(temp);
902 if ( tracker1[0] == NULL ) { // Are we screwed??
903 cerr<<"Function LoadWidgets()" << endl
904 << SDL_GetError() << endl;
905 SDL_Quit();
906 exit(0);
907 }
908 SDL_FreeSurface(temp);
909
910 temp = Load_Image("images/track1assigned.png");
911 if(temp != NULL) tracker1[1] = SDL_DisplayFormat(temp);
912 if ( tracker1[1] == NULL ) { // Are we screwed??
913 cerr<<"Function LoadWidgets()" << endl
914 << SDL_GetError() << endl;
915 SDL_Quit();
916 exit(0);
917 }
918 SDL_FreeSurface(temp);
919
920 temp = Load_Image("images/track2.png");
921 if(temp != NULL) tracker2[0] = SDL_DisplayFormat(temp);
922 if ( tracker2[0] == NULL ) { // Are we screwed??
923 cerr<<"Function LoadWidgets()" << endl
924 << SDL_GetError() << endl;
925 SDL_Quit();
926 exit(0);
927 }
928 SDL_FreeSurface(temp);
929
930 temp = Load_Image("images/track2assigned.png");
931 if(temp != NULL) tracker2[1] = SDL_DisplayFormat(temp);
932 if ( tracker2[1] == NULL ) { // Are we screwed??
933 cerr<<"Function LoadWidgets()" << endl
934 << SDL_GetError() << endl;
935 SDL_Quit();
936 exit(0);
937 }
938 SDL_FreeSurface(temp);
939
940 temp = Load_Image("images/track3.png");
941 if(temp != NULL) tracker3[0] = SDL_DisplayFormat(temp);
942 if ( tracker3[0] == NULL ) { // Are we screwed??
943 cerr<<"Function LoadWidgets()" << endl
944 << SDL_GetError() << endl;
945 SDL_Quit();
946 exit(0);
947 }
948 SDL_FreeSurface(temp);
949
950 temp = Load_Image("images/track3assigned.png");
951 if(temp != NULL) tracker3[1] = SDL_DisplayFormat(temp);
952 if ( tracker3[1] == NULL ) { // Are we screwed??
953 cerr<<"Function LoadWidgets()" << endl
954 << SDL_GetError() << endl;
955 SDL_Quit();
956 exit(0);
957 }
958 SDL_FreeSurface(temp);
959
960 temp = Load_Image("images/track4.png");
961 if(temp != NULL) tracker4[0] = SDL_DisplayFormat(temp);
962 if ( tracker4[0] == NULL ) { // Are we screwed??
963 cerr<<"Function LoadWidgets()" << endl
964 << SDL_GetError() << endl;
965 SDL_Quit();
966 exit(0);
967 }
968 SDL_FreeSurface(temp);
969
970 temp = Load_Image("images/track4assigned.png");
971 if(temp != NULL) tracker4[1] = SDL_DisplayFormat(temp);
972 if ( tracker4[1] == NULL ) { // Are we screwed??
973 cerr<<"Function LoadWidgets()" << endl
974 << SDL_GetError() << endl;
975 SDL_Quit();
976 exit(0);
977 }
978 SDL_FreeSurface(temp);
979 }
980
DisplaySonarWidgets()981 void AnBqq5::DisplaySonarWidgets(){
982 SDL_Rect destination_rectangle;
983 destination_rectangle.x = 180; //upper left corner to
984 destination_rectangle.y = 710; //place the button.
985 if (sonarwidget){ // Is our button down?
986 destination_rectangle.h = sonarbuttondown->h; //height &
987 destination_rectangle.w = sonarbuttondown->w;//width of button.
988 SDL_BlitSurface(sonarbuttondown, NULL, screen, &destination_rectangle); // Do the Blit.
989 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
990 destination_rectangle.x = 614;
991 destination_rectangle.y = 161;
992 destination_rectangle.h = truerel[bearingdisplay5by6]->h; //height &
993 destination_rectangle.w = truerel[bearingdisplay5by6]->w;//width of button
994 SDL_BlitSurface(truerel[bearingdisplay5by6], NULL, screen, &destination_rectangle); // Do the Blit..
995 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
996 destination_rectangle.x = 614;
997 destination_rectangle.y = 215;
998 destination_rectangle.h = sphertowed[arraychoice5by6]->h; //height &
999 destination_rectangle.w = sphertowed[arraychoice5by6]->w;//width of button
1000 SDL_BlitSurface(sphertowed[arraychoice5by6], NULL, screen, &destination_rectangle); // Do the Blit..
1001 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1002 destination_rectangle.x = 661;
1003 destination_rectangle.y = 161;
1004 destination_rectangle.h = uppercrtoff->h; //height &
1005 destination_rectangle.w = uppercrtoff->w;//width of button
1006 SDL_BlitSurface(uppercrtoff, NULL, screen, &destination_rectangle); // Do the Blit..
1007 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1008 destination_rectangle.x = 661;
1009 destination_rectangle.y = 215;
1010 destination_rectangle.h = lowercrtoff->h; //height &
1011 destination_rectangle.w = lowercrtoff->w;//width of button
1012 SDL_BlitSurface(lowercrtoff, NULL, screen, &destination_rectangle); // Do the Blit..
1013 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1014 destination_rectangle.x = 520;
1015 destination_rectangle.y = 590;
1016 destination_rectangle.h = cutarray->h;
1017 destination_rectangle.w = cutarray->w;
1018 SDL_BlitSurface(cutarray, NULL, screen, &destination_rectangle);
1019 SDL_UpdateRects(screen, 1, &destination_rectangle);
1020
1021 destination_rectangle.x = 472;
1022 destination_rectangle.y = 590;
1023 destination_rectangle.h = sendping->h;
1024 destination_rectangle.w = sendping->w;
1025 SDL_BlitSurface(sendping, NULL, screen, &destination_rectangle);
1026 SDL_UpdateRects(screen, 1, &destination_rectangle);
1027
1028 destination_rectangle.x = 567;
1029 destination_rectangle.y = 590;
1030 destination_rectangle.h = tb16winchoff->h; //height &
1031 destination_rectangle.w = tb16winchoff->w;//width of button
1032 SDL_BlitSurface(tb16winchoff, NULL, screen, &destination_rectangle); // Do the Blit..
1033 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1034 destination_rectangle.x = 614;
1035 destination_rectangle.y = 590;
1036 destination_rectangle.h = extendtb16[TB16.winch==1]->h; //height &
1037 destination_rectangle.w = extendtb16[TB16.winch==1]->w;//width of button
1038 SDL_BlitSurface(extendtb16[TB16.winch==1], NULL, screen, &destination_rectangle); // Do the Blit..
1039 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1040 destination_rectangle.x = 661;
1041 destination_rectangle.y = 590;
1042 destination_rectangle.h = retracttb16[TB16.winch==2]->h; //height &
1043 destination_rectangle.w = retracttb16[TB16.winch==2]->w;//width of button
1044 SDL_BlitSurface(retracttb16[TB16.winch==2], NULL, screen, &destination_rectangle); // Do the Blit..
1045 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1046 destination_rectangle.x = 473;
1047 destination_rectangle.y = 403;
1048 destination_rectangle.h = assigntrackerwidget[0]->h; //height &
1049 destination_rectangle.w = assigntrackerwidget[0]->w;//width of button
1050 SDL_BlitSurface(assigntrackerwidget[assigntracker], NULL, screen, &destination_rectangle); // Do the Blit..
1051 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1052 destination_rectangle.x = 520;
1053 destination_rectangle.y = 403;
1054 destination_rectangle.h = tracker1[0]->h; //height &
1055 destination_rectangle.w = tracker1[0]->w;//width of button
1056 SDL_BlitSurface(tracker1[Tma.GetTrackerState(0)], NULL, screen, &destination_rectangle); // Do the Blit..
1057 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1058 destination_rectangle.x = 567;
1059 destination_rectangle.y = 403;
1060 destination_rectangle.h = tracker2[0]->h; //height &
1061 destination_rectangle.w = tracker2[0]->w;//width of button
1062 SDL_BlitSurface(tracker2[Tma.GetTrackerState(1)], NULL, screen, &destination_rectangle); // Do the Blit..
1063 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1064 destination_rectangle.x = 614;
1065 destination_rectangle.y = 403;
1066 destination_rectangle.h = tracker3[0]->h; //height &
1067 destination_rectangle.w = tracker3[0]->w;//width of button
1068 SDL_BlitSurface(tracker3[Tma.GetTrackerState(2)], NULL, screen, &destination_rectangle); // Do the Blit..
1069 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1070 destination_rectangle.x = 661;
1071 destination_rectangle.y = 403;
1072 destination_rectangle.h = tracker4[0]->h; //height &
1073 destination_rectangle.w = tracker4[0]->w;//width of button
1074 SDL_BlitSurface(tracker4[Tma.GetTrackerState(3)], NULL, screen, &destination_rectangle); // Do the Blit..
1075 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1076 }else{ // our button must be up...
1077 destination_rectangle.h = sonarbuttonup->h; //height &
1078 destination_rectangle.w = sonarbuttonup->w;//width of button.
1079 SDL_BlitSurface(sonarbuttonup, NULL, screen, &destination_rectangle); // Do the Blit.
1080 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1081 }
1082 }
1083
1084
UpperCRT_Spherical()1085 void AnBqq5::UpperCRT_Spherical(){
1086 uppersonarcrt = sonarscreen;
1087 }
1088
LowerCRT_Spherical()1089 void AnBqq5::LowerCRT_Spherical(){
1090 lowersonarcrt = sonarscreen;
1091 }
1092
UpperCRT_TowedArray()1093 void AnBqq5::UpperCRT_TowedArray(){
1094 uppersonarcrt = towedarrayscreen;
1095 }
1096
LowerCRT_TowedArray()1097 void AnBqq5::LowerCRT_TowedArray(){
1098 lowersonarcrt = towedarrayscreen;
1099 }
1100
ToggleArrayChoice()1101 void AnBqq5::ToggleArrayChoice(){
1102 arraychoice5by6 = !arraychoice5by6;
1103 }
1104
ToggleTrueRel()1105 void AnBqq5::ToggleTrueRel(){
1106 bearingdisplay5by6 = !bearingdisplay5by6;
1107 }
1108
ToggleAssignTracker()1109 void AnBqq5::ToggleAssignTracker(){
1110 assigntracker = !assigntracker;
1111 }
1112
GetNorthCenterState()1113 bool AnBqq5::GetNorthCenterState(){
1114 return northcenter;
1115 }
1116
ToggleNorthCenter()1117 void AnBqq5::ToggleNorthCenter(){
1118 northcenter = !northcenter;
1119 }
1120
UpperCRT_Button()1121 void AnBqq5::UpperCRT_Button(){
1122 SDL_Rect destination_rectangle;
1123 destination_rectangle.x = 661;
1124 destination_rectangle.y = 161;
1125 destination_rectangle.h = uppercrton->h; //height &
1126 destination_rectangle.w = uppercrton->w;//width of button
1127 SDL_BlitSurface(uppercrton, NULL, screen, &destination_rectangle); // Do the Blit..
1128 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1129 SDL_Delay(200);
1130 if(arraychoice5by6){
1131 UpperCRT_Spherical();
1132 }else{
1133 UpperCRT_TowedArray();
1134 }
1135 DisplaySonarWidgets();
1136 }
1137
LowerCRT_Button()1138 void AnBqq5::LowerCRT_Button(){
1139 SDL_Rect destination_rectangle;
1140 destination_rectangle.x = 661;
1141 destination_rectangle.y = 215;
1142 destination_rectangle.h = lowercrton->h; //height &
1143 destination_rectangle.w = lowercrton->w;//width of button
1144 SDL_BlitSurface(lowercrton, NULL, screen, &destination_rectangle); // Do the Blit..
1145 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1146 SDL_Delay(200);
1147 if(arraychoice5by6){
1148 LowerCRT_Spherical();
1149 }else{
1150 LowerCRT_TowedArray();
1151 }
1152 DisplaySonarWidgets();
1153 }
1154
StopWinch()1155 void AnBqq5::StopWinch(){
1156 SDL_Rect destination_rectangle;
1157 destination_rectangle.x = 567;
1158 destination_rectangle.y = 590;
1159 destination_rectangle.h = tb16winchon->h; //height &
1160 destination_rectangle.w = tb16winchon->w;//width of button
1161 SDL_BlitSurface(tb16winchon, NULL, screen, &destination_rectangle); // Do the Blit..
1162 SDL_UpdateRects(screen, 1, &destination_rectangle); //Show the screen...
1163 TB16.Stop();
1164 SDL_Delay(200);
1165 DisplaySonarWidgets();
1166 }
1167
RandInt(int TO)1168 int AnBqq5::RandInt(int TO) //Returns a random interger...TO is upper limit
1169 {
1170 return (rand()%TO);
1171 }
1172
ReciprocalBearing(int bearing)1173 int AnBqq5::ReciprocalBearing(int bearing)
1174 {
1175 // returns the 180 degree opposite of the bearing given to it..
1176 int recipbearing;
1177 if (bearing >= 180){
1178 recipbearing = bearing - 180;
1179 }else{
1180 recipbearing = bearing + 180;
1181 }
1182 return recipbearing;
1183 }
1184
1185
1186
DisplayCursor()1187 void AnBqq5::DisplayCursor()
1188 {
1189 SDL_Rect rectangle;
1190 //Draw Cursor
1191 if(!northcenter){
1192 DLine(screen, 51+cursorBearing, 140, 51+cursorBearing, 147, green);
1193 rectangle.x=51+cursorBearing;
1194 }else{
1195 int recipCursorBearing = ReciprocalBearing(cursorBearing);
1196 DLine(screen, 51+recipCursorBearing, 140, 51+recipCursorBearing, 147, green);
1197 rectangle.x=51+recipCursorBearing;
1198 }
1199 rectangle.y=140;
1200 rectangle.h=7;
1201 rectangle.w=1;
1202 SDL_UpdateRects(screen, 1, &rectangle);
1203 }
UpdateCursor()1204 void AnBqq5::UpdateCursor()
1205 {
1206 int direction, temp;
1207 int ship_type;
1208 float signal;
1209 if (Subs->GetCount()>0){
1210 //Are there any sound events at this time index to worry about?
1211 for (int event=1; event<=Subs->GetCount(); event++){
1212 //If so step through the events.
1213 Subs->GetEvent(event, &direction, &signal, &ship_type);
1214 //Okay this used to go through each bearing one by one and
1215 //check to see if there was a sonar contact. But this is slow..
1216 //So we are now incrementing by 5 degrees to speed thing along
1217 //In doing so we now have to chech relative_bearings because
1218 //the contact might get passed by if it's on a 0/359 deg boundary.
1219 temp = direction;
1220 if(cursorBearing > temp) temp += 360;
1221 // relative_bearing = temp - cursorBearing;
1222
1223 //if(relative_bearing < 3 || relative_bearing >357){
1224 // cout << "TargetId: " << TargetId << " - Bearing: " << direction <<endl;
1225 /*
1226 static char text[120];
1227 sprintf(text, "TARGET-ID %3i - BEARING %3i", TargetId, direction);
1228 string textline = text;
1229 Message.post_message(textline);
1230 Message.display_message();
1231 */
1232 //}
1233 }
1234 }
1235 //If cursor located on undesignated contact, Halt on contact.
1236 //else
1237 cursorBearing += 5;
1238 if(cursorBearing>360) cursorBearing -= 360;
1239 //Some debug crap
1240 /*if (cursorBearing > 360) cout << "cursor over " << cursorBearing <<endl;
1241 if (cursorBearing < 0) cout << "cursor under " << cursorBearing << endl;*/
1242 }
1243