float glide_slope_val,
bool worm_energy,
bool waypoint,
- bool working) :
+ bool working,
+ int zenithsymbol, //suma
+ int nadirsymbol, //suma
+ int hat_marker): //suma
+
dual_instr_item( x, y, width, height,
ptch_source,
roll_source,
factor ( factr ),
hudladder_type ( name ),
frl ( frl_spot ),
+ target_spot ( target ),
velocity_vector ( vel_vec ),
drift_marker ( drift ),
alpha_bracket ( alpha ),
energy_marker ( energy ),
climb_dive_marker ( climb ),
- target_spot ( target ),
glide_slope_marker ( glide ),
glide_slope ( glide_slope_val),
energy_worm ( worm_energy),
{
- if( !width_units ) {
- width_units = 45;
+
+ zenith= zenithsymbol; //suma
+ nadir=nadirsymbol; //suma
+ hat= hat_marker; //suma
+
+ if( !width_units )
+ {
+ width_units = 45;
}
}
factor ( image.factor ),
hudladder_type ( image.hudladder_type),
frl ( image.frl),
+ target_spot ( image.target_spot),
velocity_vector ( image.velocity_vector),
drift_marker ( image.drift_marker),
alpha_bracket ( image.alpha_bracket),
energy_marker ( image.energy_marker),
climb_dive_marker ( image.climb_dive_marker),
- target_spot ( image.target_spot),
glide_slope_marker ( image.glide_slope_marker),
glide_slope ( image.glide_slope),
energy_worm ( image.energy_worm),
float x_ini,x_ini2;
float x_end,x_end2;
- float y;
+ float y = 0;
int count;
- float cosine, sine,xvvr,yvvr,Vxx,Vyy,Vzz,up_vel,ground_vel,actslope;
- float Axx,Ayy,Azz,total_vel,pot_slope,t1,t2,psi,alpha,pla;
- float vel_x,vel_y,drift;
- char Textaux[8] ;
- bool pitch_ladder;
- bool climb_dive_ladder;
- bool clip_plane;
+ float cosine, sine, xvvr, yvvr, Vxx = 0.0, Vyy = 0.0, Vzz = 0.0,
+ up_vel, ground_vel, actslope = 0.0;
+ float Axx = 0.0, Ayy = 0.0, Azz = 0.0, total_vel = 0.0, pot_slope, t1,
+ t2 = 0.0, psi = 0.0, alpha,pla;
+ float vel_x = 0.0, vel_y = 0.0, drift;
+ // char Textaux[8] ;
+ bool pitch_ladder = false;
+ bool climb_dive_ladder = false;
+ bool clip_plane = false;
GLdouble eqn_top[4] = {0.0,-1.0,0.0,0.0};
GLdouble eqn_left[4] = {-1.0,0.0,0.0,100.0};
pla = get_throttleval();
int lgear,wown,wowm,ilcanclaw,ihook;
- ilcanclaw = get_iaux1();
- lgear = get_iaux2();
- wown = get_iaux3();
- wowm = get_iaux4();
- ihook = get_iaux5();
+ ilcanclaw = get_iaux2();
+ lgear = get_iaux3();
+ wown = get_iaux4();
+ wowm = get_iaux5();
+ ihook = get_iaux6();
- float pitch_value = current_ch1() * RAD_TO_DEG;
+ float pitch_value = current_ch1() * SGD_RADIANS_TO_DEGREES;
if(hudladder_type=="Climb/Dive Ladder") {
pitch_ladder = false;
clip_plane = true;
}
else
- if(hudladder_type=="Pitch Ladder") {
+ // hudladder_type=="Pitch Ladder"
+ {
pitch_ladder = true;
climb_dive_ladder = false;
clip_plane = false;
actslope = (up_vel/fabs(up_vel))*90.0;
}
} else {
- actslope = atan(up_vel/ground_vel)*RAD_TO_DEG;
+ actslope = atan(up_vel/ground_vel)*SGD_RADIANS_TO_DEGREES;
}
- xvvr = (((atan2(Vyy,Vxx)*RAD_TO_DEG)-psi)*(640.0/45.0));
- drift = ((atan2(Vyy,Vxx)*RAD_TO_DEG)-psi);
+ xvvr = (((atan2(Vyy,Vxx)*SGD_RADIANS_TO_DEGREES)-psi)*
+ (factor/globals->get_current_view()->get_aspect_ratio()));
+ drift = ((atan2(Vyy,Vxx)*SGD_RADIANS_TO_DEGREES)-psi);
yvvr = ((actslope - pitch_value)*factor);
vel_y = ((actslope -pitch_value) * cos(roll_value) + drift*sin(roll_value))*factor;
- vel_x = (-(actslope -pitch_value)*sin(roll_value) + drift*cos(roll_value))*(640/45.0);
+ vel_x = (-(actslope -pitch_value)*sin(roll_value) + drift*cos(roll_value))*
+ (factor/globals->get_current_view()->get_aspect_ratio());
// printf("%f %f %f %f\n",vel_x,vel_y,drift,psi);
//****************************************************************
// OBJECT MOVING RETICLE
// velocity vector
glBegin(GL_LINE_LOOP); // Use polygon to approximate a circle
for(count=0; count<50; count++) {
- cosine = 6 * cos(count * 2 * M_PI/50.0);
- sine = 6 * sin(count * 2 * M_PI/50.0);
+ cosine = 6 * cos(count * 2 * SGD_PI/50.0);
+ sine = 6 * sin(count * 2 * SGD_PI/50.0);
glVertex2f(cosine+vel_x, sine+vel_y);
}
glEnd();
t1 = up_vel/total_vel;
t2 = asin((Vxx*Axx + Vyy*Ayy + Vzz*Azz)/(9.81*total_vel));
}
- pot_slope = ((t2/3)*RAD_TO_DEG)*factor + vel_y;
+ pot_slope = ((t2/3)*SGD_RADIANS_TO_DEGREES)*factor + vel_y;
// if (pot_slope < (vel_y - 45)) pot_slope = vel_y-45;
// if (pot_slope > (vel_y + 45)) pot_slope = vel_y+45;
// ATTRIB - ON CONDITION
glBegin(GL_LINE_STRIP);
glVertex2f(-6, -134);
- glVertex2f(-6, t2*RAD_TO_DEG*4.0 - 134);
- glVertex2f(+6, t2*RAD_TO_DEG*4.0 - 134);
+ glVertex2f(-6, t2*SGD_RADIANS_TO_DEGREES*4.0 - 134);
+ glVertex2f(+6, t2*SGD_RADIANS_TO_DEGREES*4.0 - 134);
glVertex2f(6, -134);
glEnd();
// OBJECT MOVING RETICLE
//****************************************************************
- if(climb_dive_ladder) {// CONFORMAL_HUD
+ if(climb_dive_ladder)
+ { // CONFORMAL_HUD
vmin = pitch_value - (float)width_units;
vmax = pitch_value + (float)width_units;
}
else
- if (pitch_ladder) {//Default Hud
+ // pitch_ladder - Default Hud
+ {
vmin = pitch_value - (float)width_units * 0.5f;
vmax = pitch_value + (float)width_units * 0.5f;
}
- glRotatef(roll_value * RAD_TO_DEG, 0.0, 0.0, 1.0);
+ glRotatef(roll_value * SGD_RADIANS_TO_DEGREES, 0.0, 0.0, 1.0);
// FRL marker not rotated - this line shifted below
- if( div_units ) {
-
+ if( div_units )
+ {
char TextLadder[8] ;
float label_length ;
float label_height ;
float bot ;
float top ;
float text_offset = 4.0f ;
- float zero_offset;
+ float zero_offset = 0.0;
- if(climb_dive_ladder)
- zero_offset = 50.0f ;
- else
- if(pitch_ladder)
+ if ( climb_dive_ladder ) {
+ zero_offset = 50.0f ; // horizon line is wider by this much (hard coded ??)
+ } else {
zero_offset = 10.0f ;
+ }
fntFont *font = HUDtext->getFont();
float pointsize = HUDtext->getPointSize();
float italic = HUDtext->getSlant();
- TextList.setFont( HUDtext );
- TextList.erase();
- LineList.erase();
- StippleLineList.erase();
+ TextList.setFont( HUDtext );
+ TextList.erase();
+ LineList.erase();
+ StippleLineList.erase();
- int last = FloatToInt(vmax)+1;
- int i = FloatToInt(vmin);
+ int last = FloatToInt(vmax)+1;
+ int i = FloatToInt(vmin);
if( !scr_hole ) {
x_end = half_span;
- for( ; i<last ; i++ ) {
+ for( ; i<last ; i++ )
+ {
y = (((float)(i - pitch_value) * factor) + .5f);
- if( !(i % div_units )) { // At integral multiple of div
+ if( !(i % div_units )) // At integral multiple of div
+ {
sprintf( TextLadder, "%d", i );
font->getBBox ( TextLadder, pointsize, italic,
x_ini = -half_span;
- if( i >= 0 ) {
+ if( i >= 0 )
+ {
// Make zero point wider on left
if( i == 0 )
x_ini -= zero_offset;
- // Zero or above draw solid lines
- Line(x_ini, y, x_end, y);
+
+ // Zero or above draw solid lines
+ Line(x_ini, y, x_end, y);
+
+ if(i == 90)
+ if(zenith == 1)
+ {
+ drawZenith(x_ini, x_end,y);
+ }
} else {
// Below zero draw dashed lines.
StippleLine(x_ini, y, x_end, y);
+
+
+ if(i == -90)
+ if(nadir ==1)
+ {
+ drawNadir(x_ini, x_end,y);
+ }
}
// Calculate the position of the left text and write it.
x_end = -half_span + hole;
x_ini2= half_span - hole;
- for( ; i<last ; i++ ) {
+ for( ; i<last ; i++ )
+ {
if(hudladder_type=="Pitch Ladder")
y = (((float)(i - pitch_value) * factor) + .5);
x_ini = -half_span;
x_end2= half_span;
- if( i >= 0 ) {
+ if( i >= 0 )
+ {
// Make zero point wider on left
- if( i == 0 ) {
- x_ini -= zero_offset;
- x_end2 +=zero_offset;
- } else {
- if(climb_dive_ladder){
- // Zero or above draw solid lines
- Line(x_end, y-5.0, x_end, y);
- Line(x_ini2, y-5.0, x_ini2, y);
- }
+ if( i == 0 )
+ {
+ x_ini -= zero_offset;
+ x_end2 +=zero_offset;
+ }
+ //draw climb bar vertical lines
+ if(climb_dive_ladder)
+ {
+ // Zero or above draw solid lines
+ Line(x_end, y-5.0, x_end, y);
+ Line(x_ini2, y-5.0, x_ini2, y);
}
-
+ // draw pitch / climb bar
Line(x_ini, y, x_end, y);
Line(x_ini2, y, x_end2, y);
- } else {
- // Below zero draw dashed lines.
- if(climb_dive_ladder) {
- Line(x_end, y+5.0, x_end, y);
- Line(x_ini2, y+5.0, x_ini2, y);
+ if(i == 90)
+ if(zenith == 1)
+ {
+ drawZenith(x_ini2, x_end,y);
+ }
+ }
+ else // i < 0
+ {
+ // draw dive bar vertical lines
+ if(climb_dive_ladder)
+ {
+ Line(x_end, y+5.0, x_end, y);
+ Line(x_ini2, y+5.0, x_ini2, y);
}
- StippleLine(x_ini, y, x_end, y);
+ // draw pitch / dive bars
+ StippleLine(x_ini, y, x_end, y);
StippleLine(x_ini2, y, x_end2, y);
+
+ if(i == -90)
+ if(nadir == 1)
+ {
+ drawNadir(x_ini2, x_end,y);
+ }
}
// Now calculate the location of the left side label using
//waypoint marker computation
float fromwp_lat,towp_lat,fromwp_lon,towp_lon,dist,delx,dely,hyp,theta,brg;
- fromwp_lon = get_longitude()*DEG_TO_RAD;
- fromwp_lat = get_latitude()*DEG_TO_RAD;
- towp_lon = get_aux5()*DEG_TO_RAD;
- towp_lat = get_aux6()*DEG_TO_RAD;
+ fromwp_lon = get_longitude()*SGD_DEGREES_TO_RADIANS;
+ fromwp_lat = get_latitude()*SGD_DEGREES_TO_RADIANS;
+ towp_lon = get_aux2()*SGD_DEGREES_TO_RADIANS;
+ towp_lat = get_aux1()*SGD_DEGREES_TO_RADIANS;
dist = acos(sin(fromwp_lat)*sin(towp_lat)+cos(fromwp_lat)*cos(towp_lat)*cos(fabs(fromwp_lon-towp_lon)));
delx= towp_lat - fromwp_lat;
} else {
theta = 0.0;
}
- brg = theta*RAD_TO_DEG;
+ brg = theta*SGD_RADIANS_TO_DEGREES;
if (brg > 360.0) brg = 0.0;
if (delx < 0) brg = 180 - brg;
// {Brg = asin(cos(towp_lat)*sin(fabs(fromwp_lon-towp_lon))/ sin(dist));
- // Brg = Brg * RAD_TO_DEG; }
- dist = dist*RAD_TO_DEG * 60.0*1852.0; //rad->deg->nm->m
+ // Brg = Brg * SGD_RADIANS_TO_DEGREES; }
+ dist = dist*SGD_RADIANS_TO_DEGREES * 60.0*1852.0; //rad->deg->nm->m
// end waypoint marker computation
//*********************************************************
// OBJECT MOVING RETICLE
// TYPE ARROW
// waypoint marker
- if (fabs(brg-psi) > 10.0) {
+
+ if (fabs(brg-psi) > 10.0)
+ {
glPushMatrix();
glTranslatef( centroid.x, centroid.y, 0);
glTranslatef( vel_x, vel_y, 0);
glVertex2f(2.5,20.0);
glEnd();
glPopMatrix();
- }
- // waypoint marker on heading scale
- if (fabs(brg-psi) < 12.0) {
+ }
+
+ // waypoint marker on heading scale
+ if (fabs(brg-psi) < 12.0)
+ {
+ if(hat ==0)
+ {
glBegin(GL_LINE_LOOP);
glVertex2f(((brg-psi)*60/25)+320,240.0);
glVertex2f(((brg-psi)*60/25)+326,240.0-4);
glVertex2f(((brg-psi)*60/25)+317,240.0-4);
glVertex2f(((brg-psi)*60/25)+314,240.0-4);
glEnd();
- }
- //*************************************************************
- }// if waypoint_marker
+ } else {//if hat=0
+
+ float x= (brg-psi)*60/25 + 320, y=240.0, r=5.0;
+ float x1,y1;
+
+ glEnable(GL_POINT_SMOOTH);
+
+ glBegin(GL_POINTS);
+
+ for(int count=0; count<=200; count++)
+ {
+ float temp = count * 3.142 * 3 / (200.0*2.0);
+ float temp1 = temp-(45.0*SGD_DEGREES_TO_RADIANS);
+ x1 = x + r * cos(temp1);
+ y1 = y + r * sin(temp1);
+
+ glVertex2f(x1, y1);
+ }
+
+ glEnd();
+ glDisable(GL_POINT_SMOOTH);
+ } //hat=0
+
+ } //brg<12
+ } // if waypoint_marker
}//draw
+
+/******************************************************************/
+
+//begin suma
+ // draws the zenith symbol for highest possible climb angle (i,e 90 degree climb angle)
+
+void HudLadder ::
+drawZenith(float xfirst,float xlast,float yvalue )
+{
+
+ float xcentre = (xfirst + xlast)/2.0;
+ float ycentre = yvalue;
+
+ Line(xcentre-9.0, ycentre, xcentre-3.0, ycentre+1.3);
+ Line(xcentre-9.0, ycentre, xcentre-3.0, ycentre-1.3);
+
+ Line(xcentre+9.0, ycentre, xcentre+3.0, ycentre+1.3);
+ Line(xcentre+9.0, ycentre, xcentre+3.0, ycentre-1.3);
+
+ Line(xcentre, ycentre+9.0, xcentre-1.3, ycentre+3.0);
+ Line(xcentre, ycentre+9.0, xcentre+1.3, ycentre+3.0);
+
+ Line(xcentre-3.9, ycentre+3.9, xcentre-3.0, ycentre+1.3);
+ Line(xcentre-3.9, ycentre+3.9, xcentre-1.3, ycentre+3.0);
+
+ Line(xcentre+3.9, ycentre+3.9, xcentre+1.3, ycentre+3.0);
+ Line(xcentre+3.9, ycentre+3.9, xcentre+3.0, ycentre+1.3);
+
+ Line(xcentre-3.9, ycentre-3.9, xcentre-3.0, ycentre-1.3);
+ Line(xcentre-3.9, ycentre-3.9, xcentre-1.3, ycentre-2.6);
+
+ Line(xcentre+3.9, ycentre-3.9, xcentre+3.0, ycentre-1.3);
+ Line(xcentre+3.9, ycentre-3.9, xcentre+1.3, ycentre-2.6);
+
+ Line(xcentre-1.3, ycentre-2.6, xcentre, ycentre-27.0);
+ Line(xcentre+1.3, ycentre-2.6, xcentre, ycentre-27.0);
+
+
+}
+ //end suma
+
+//begin suma
+ // draws the nadir symbol for lowest possible dive angle (i,e 90 degree dive angle)
+
+
+void HudLadder ::
+drawNadir(float xfirst, float xlast, float yvalue)
+{
+
+ float xcentre = (xfirst + xlast)/2.0;
+ float ycentre = yvalue;
+
+
+ float r = 7.5;
+ float x1,y1,x2,y2;
+
+
+ // to draw a circle
+
+ float xcent1, xcent2, ycent1, ycent2;
+ xcent1 = xcentre + r * cos(0.0);
+ ycent1 = ycentre + r * sin(0.0);
+ for(int count=1; count<=400; count++)
+ {
+ float temp = count * 2 * 3.142 / 400.0;
+ xcent2 = xcentre + r * cos(temp);
+ ycent2 = ycentre + r * sin(temp);
+
+ Line(xcent1, ycent1, xcent2, ycent2);
+
+ xcent1 = xcent2;
+ ycent1 = ycent2;
+ }
+
+ xcent2 = xcentre + r * cos(0.0);
+ ycent2 = ycentre + r * sin(0.0);
+
+ drawOneLine(xcent1, ycent1, xcent2, ycent2); //to connect last point to first point
+ //end circle
+
+
+ Line(xcentre, ycentre+7.5, xcentre, ycentre+22.5); //to draw a line above the circle
+
+ Line(xcentre-7.5, ycentre, xcentre+7.5,ycentre); //line in the middle of circle
+
+ float theta = asin (2.5/7.5);
+ float theta1 = asin(5.0/7.5);
+
+ x1 = xcentre + r * cos(theta);
+ y1 = ycentre + 2.5;
+
+ x2 = xcentre + r * cos((180.0 * SGD_DEGREES_TO_RADIANS) - theta);
+ y2 = ycentre + 2.5;
+
+ Line(x1,y1,x2,y2);
+
+
+ x1 = xcentre + r * cos(theta1);
+ y1 = ycentre + 5.0;
+
+ x2 = xcentre + r * cos((180.0 * SGD_DEGREES_TO_RADIANS)-theta1);
+ y2 = ycentre + 5.0;
+
+ Line(x1,y1,x2,y2);
+
+
+ x1 = xcentre + r * cos((180.0 * SGD_DEGREES_TO_RADIANS) +theta);
+ y1 = ycentre - 2.5;
+
+ x2 = xcentre + r * cos((360.0* SGD_DEGREES_TO_RADIANS)-theta);
+ y2 = ycentre - 2.5;
+
+ Line(x1,y1,x2,y2);
+
+
+ x1 = xcentre + r * cos((180.0* SGD_DEGREES_TO_RADIANS) +theta1);
+ y1 = ycentre - 5.0;
+
+ x2 = xcentre + r * cos((360.0* SGD_DEGREES_TO_RADIANS)-theta1);
+ y2 = ycentre - 5.0;
+
+ Line(x1,y1,x2,y2);
+
+
+}