#-----------------------------------------------------------------------
#Radar
#Get prepared data and account everything for radar indication
var radar_host = {
new: func()
{
var radar = { parents: [radar_host] };
radar.canvas = canvas.new({
"name": "radar-screen",
"size": [1024, 1024],
"view": [1024, 1024],
"mipmapping": 1
});
radar.canvas.addPlacement({"node": "RScreen"});
radar.canvas.setColorBackground(0.156, 0.235, 0.235);
var group = radar.canvas.createGroup("group");
var group_tr = group.createTransform();
radar.cross_halo =
group.createChild("path", "cross_halo")
.moveTo(484, 268)
.lineTo(540, 268)
.moveTo(484, 340)
.lineTo(540, 340)
.moveTo(484, 446)
.lineTo(540, 446)
.moveTo(484, 578)
.lineTo(540, 578)
.moveTo(484, 684)
.lineTo(540, 684)
.moveTo(484, 756)
.lineTo(540, 756)
.moveTo(512, 268)
.lineTo(512, 756)
.moveTo(268, 484)
.lineTo(268, 540)
.moveTo(340, 484)
.lineTo(340, 540)
.moveTo(446, 484)
.lineTo(446, 540)
.moveTo(578, 484)
.lineTo(578, 540)
.moveTo(684, 484)
.lineTo(684, 540)
.moveTo(756, 484)
.lineTo(756, 540)
.moveTo(268, 512)
.lineTo(756, 512)
.moveTo(366, 512)
.cubicTo(366, 431, 431, 366, 512, 366)
.cubicTo(592, 366, 658, 431, 658, 512)
.cubicTo(658, 592, 592, 658, 512, 658)
.cubicTo(431, 658, 366, 592, 366, 512)
.close()
.setStrokeLineWidth(16)
.setStrokeLineCap("round")
.setColor(0.1, 0.2, 0.2);
radar.cross =
group.createChild("path", "cross")
.moveTo(484, 268)
.lineTo(540, 268)
.moveTo(484, 340)
.lineTo(540, 340)
.moveTo(484, 446)
.lineTo(540, 446)
.moveTo(484, 578)
.lineTo(540, 578)
.moveTo(484, 684)
.lineTo(540, 684)
.moveTo(484, 756)
.lineTo(540, 756)
.moveTo(512, 268)
.lineTo(512, 756)
.moveTo(268, 484)
.lineTo(268, 540)
.moveTo(340, 484)
.lineTo(340, 540)
.moveTo(446, 484)
.lineTo(446, 540)
.moveTo(578, 484)
.lineTo(578, 540)
.moveTo(684, 484)
.lineTo(684, 540)
.moveTo(756, 484)
.lineTo(756, 540)
.moveTo(268, 512)
.lineTo(756, 512)
.moveTo(366, 512)
.cubicTo(366, 431, 431, 366, 512, 366)
.cubicTo(592, 366, 658, 431, 658, 512)
.cubicTo(658, 592, 592, 658, 512, 658)
.cubicTo(431, 658, 366, 592, 366, 512)
.close()
.setStrokeLineWidth(8)
.setStrokeLineCap("round")
.setColor(0.318, 0.475, 0.475);
radar.radar_group = radar.canvas.createGroup("radar_group");
radar.radar_group.radar_group_tr = radar.radar_group.createTransform("radar_group_tr");
radar.radar_group.radar_group_rt = radar.radar_group.createTransform("radar_group_rt");
radar.ground_line_halo =
radar.radar_group.createChild("path", "ground_line_halo")
.moveTo(-2048, 512)
.lineTo(2048, 512)
.close()
.setStrokeLineWidth(16)
.setStrokeLineCap("round")
.setColor(0.4, 0.7, 0.7);
radar.ground_line =
radar.radar_group.createChild("path", "ground_line")
.moveTo(-2048, 512)
.lineTo(2048, 512)
.close()
.setStrokeLineWidth(8)
.setStrokeLineCap("round")
.setColor(0.572, 0.858, 0.858);
radar.target_halo =
group.createChildren("path", 10);
for (i=0; i<10; i+=1)
{
radar.target_halo[i]
.moveTo(-8.0, 0.0)
.cubicTo(-8.0, -4.418, -4.418, -8.0, 0.0, -8.0)
.cubicTo(4.418, -8.0, 8.0, -4.418, 8.0, 0.0)
.cubicTo(8.0, 4.418, 4.418, 8.0, 0.0, 8.0)
.cubicTo(-4.418, 8.0, -8.0, 4.418, -8.0, 0.0)
.close()
.setStrokeLineWidth(8)
.setStrokeLineCap("round")
.setColor(0.4, 0.7, 0.7)
.setVisible(0);
radar.target_halo[i].createTransform();
}
radar.target =
group.createChildren("path", 10);
for (i=0; i<10; i+=1)
{
radar.target[i]
.moveTo(-8.0, 0.0)
.cubicTo(-8.0, -4.418, -4.418, -8.0, 0.0, -8.0)
.cubicTo(4.418, -8.0, 8.0, -4.418, 8.0, 0.0)
.cubicTo(8.0, 4.418, 4.418, 8.0, 0.0, 8.0)
.cubicTo(-4.418, 8.0, -8.0, 4.418, -8.0, 0.0)
.close()
.setStrokeLineWidth(4)
.setStrokeLineCap("round")
.setColor(0.572, 0.858, 0.858)
.setVisible(0);
radar.target[i].createTransform();
}
radar.lock_halo =
group.createChild("path", "lock_halo")
.moveTo(-32.0, 0.0)
.cubicTo(-32.0, -17.672, -17.672, -32.0, 0.0, -32.0)
.cubicTo(17.672, -32.0, 32.0, -17.672, 32.0, 0.0)
.cubicTo(32.0, 17.672, 17.672, 32.0, 0.0, 32.0)
.cubicTo(-17.672, 32.0, -32.0, 17.672, -32.0, 0.0)
.close()
.setStrokeLineWidth(8)
.setStrokeLineCap("round")
.setColor(0.572, 0.858, 0.858)
.setVisible(0);
radar.lock_halo.createTransform();
radar.lock =
group.createChild("path", "lock")
.moveTo(-32.0, 0.0)
.cubicTo(-32.0, -17.672, -17.672, -32.0, 0.0, -32.0)
.cubicTo(17.672, -32.0, 32.0, -17.672, 32.0, 0.0)
.cubicTo(32.0, 17.672, 17.672, 32.0, 0.0, 32.0)
.cubicTo(-17.672, 32.0, -32.0, 17.672, -32.0, 0.0)
.close()
.setStrokeLineWidth(4)
.setStrokeLineCap("round")
.setColor(0.572, 0.858, 0.858)
.setVisible(0);
radar.lock.createTransform();
radar.distance_line_halo =
group.createChild("path", "distance_line_halo")
.moveTo(-33.0, 0.0)
.lineTo(33.0, 0.0)
.close()
.setStrokeLineWidth(16)
.setStrokeLineCap("round")
.setColor(0.572, 0.858, 0.858)
.setVisible(0);
radar.distance_line_halo.createTransform();
radar.distance_line =
group.createChild("path", "distance_line")
.moveTo(-33.0, 0.0)
.lineTo(33.0, 0.0)
.close()
.setStrokeLineWidth(6)
.setStrokeLineCap("round")
.setColor(0.572, 0.858, 0.858)
.setVisible(0);
radar.distance_line.createTransform();
radar.rot = 0;
radar.pos = 0;
radar.move = 0;
return radar;
},
update: func()
{
#update of radar information and of radar screen
#put at same procedure to make it faster
#------------------------ update radar information ------------------------
radar_node=props.globals.getNode("fdm/jsbsim/systems/radar");
if ((radar_node.getNode("on").getValue()==1) and
(radar_node.getNode("antenna-moving").getValue()==1)
)
{
#update target data
alpha_vern=radar_node.getNode("alpha-mod-vern-pos").getValue();
beta_vern=radar_node.getNode("beta-mod-vern-pos").getValue();
alpha_range=radar_node.getNode("alpha-range-deg").getValue();
beta_range=radar_node.getNode("beta-range-deg").getValue();
if (props.globals.getNode("fdm/jsbsim/systems/mpdata/unit[0]/existed")!=nil)
{
foreach (var node; props.globals.getNode("fdm/jsbsim/systems/mpdata").getChildren("unit"))
{
index=node.getIndex();
if (index==nil)
{
index=0;
}
if ((node.getNode("existed").getValue()==1) and
(node.getNode("back-semisphere").getValue()==0) and
(node.getNode("hidden-by-mountain").getValue()==0) and
((node.getNode("higher-than-horison").getValue()==1) or
(radar_node.getNode("background-filtering").getValue()==1)) and
(node.getNode("distance-m").getValue()<
radar_node.getNode("get-range-m").getValue())
)
{
alpha_deg=node.getNode("alpha-deg").getValue()+
(alpha_vern-0.5)*alpha_range;
beta_deg=node.getNode("beta-deg").getValue()-
(beta_vern-0.5)*beta_range;
if ((alpha_deg>(-alpha_range*0.5)) and
(alpha_deg<(alpha_range*0.5)) and
(beta_deg>(-beta_range*0.5)) and
(beta_deg<(beta_range*0.5))
)
{
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/existed", 1);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/alpha-deg", alpha_deg);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/beta-deg", beta_deg);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/speed-kmh",
node.getNode("speed-kmh").getValue());
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/distance-m",
node.getNode("distance-m").getValue());
#as that target is locked, update lock information
if (radar_node.getNode("lock/id").getValue()==index)
{
if ((node.getNode("distance-m").getValue()>
radar_node.getNode("lock-range-m").getValue()))
{
setprop("fdm/jsbsim/systems/radar/lock/id", -1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-deg", 0);
setprop("fdm/jsbsim/systems/radar/lock/beta-deg", 0);
setprop("fdm/jsbsim/systems/radar/lock/distance-m", 0);
setprop("fdm/jsbsim/systems/radar/lock/speed-kmh", 0);
setprop("fdm/jsbsim/systems/radar/lock/approach-time", -1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-cmd-rad", 0);
setprop("fdm/jsbsim/systems/radar/lock/beta-cmd-rad", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/locked", 0);
}
else
{
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/locked", 1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-deg", alpha_deg);
setprop("fdm/jsbsim/systems/radar/lock/beta-deg", beta_deg);
setprop("fdm/jsbsim/systems/radar/lock/speed-kmh",
node.getNode("speed-kmh").getValue());
setprop("fdm/jsbsim/systems/radar/lock/distance-m",
node.getNode("distance-m").getValue());
if (node.getNode("speed-kmh").getValue()>0)
{
approach_time=node.getNode("distance-m").getValue()/
(node.getNode("speed-kmh").getValue()/3.6);
setprop("fdm/jsbsim/systems/radar/lock/approach-time", approach_time);
}
else
{
setprop("fdm/jsbsim/systems/radar/lock/approach-time", -1);
}
alpha_cmd_rad=alpha_deg/180*math.pi;
beta_cmd_rad=math.atan2(beta_deg, alpha_deg)*(math.abs(beta_deg)/beta_range);
setprop("fdm/jsbsim/systems/radar/lock/alpha-cmd-rad", alpha_cmd_rad);
setprop("fdm/jsbsim/systems/radar/lock/beta-cmd-rad", beta_cmd_rad);
}
}
}
else
{
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/existed", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/locked", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/alpha-deg", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/beta-deg", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/distance-m", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/speed-kmh", 0);
}
}
else
{
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/existed", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/locked", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/alpha-deg", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/beta-deg", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/distance-m", 0);
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/speed-kmh", 0);
}
}
}
#clear lock data if locked target is not existed to radar
lock_id=radar_node.getNode("lock/id").getValue();
if (lock_id!=-1)
{
if (radar_node.getNode("unit["~lock_id~"]/existed").getValue()==0)
{
setprop("fdm/jsbsim/systems/radar/lock/id", -1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-deg", 0);
setprop("fdm/jsbsim/systems/radar/lock/beta-deg", 0);
setprop("fdm/jsbsim/systems/radar/lock/distance-m", 0);
setprop("fdm/jsbsim/systems/radar/lock/speed-kmh", 0);
setprop("fdm/jsbsim/systems/radar/lock/approach-time", -1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-cmd-rad", 0);
setprop("fdm/jsbsim/systems/radar/lock/beta-cmd-rad", 0);
setprop("fdm/jsbsim/systems/radar/unit["~lock_id~"]/locked", 0);
lock_id=-1;
}
}
#set lock to target if is commanded to,
#not target is locked already,
#and there is target which could be locked
#lock target which is most close to center
if ((props.globals.getNode("fdm/jsbsim/systems/stick/lock-button-switch").getValue()==1) and
(lock_id==-1)
)
{
if (radar_node.getNode("unit[0]/existed")!=nil)
{
lock_vector_stored=0;
foreach (var node; radar_node.getChildren("unit"))
{
index=node.getIndex();
if (index==nil)
{
index=0;
}
if ((node.getNode("existed").getValue()==1) and
(node.getNode("distance-m").getValue()<
radar_node.getNode("lock-range-m").getValue())
)
{
lock_vector=math.sqrt(
math.pow(node.getNode("alpha-deg").getValue()/(alpha_range/2), 2)+
math.pow(node.getNode("beta-deg").getValue()/(beta_range/2), 2));
if ((lock_id==-1) or
(lock_vector_stored>lock_vector)
)
{
lock_id=index;
lock_vector_stored=lock_vector;
}
}
}
}
#found some target to lock, lock that
if (lock_id!=-1)
{
setprop("fdm/jsbsim/systems/radar/lock/id", lock_id);
}
}
}
#clearing lock data if lock is off
if ((radar_node.getNode("on").getValue()==0) or
(radar_node.getNode("antenna-moving").getValue()==0) or
(props.globals.getNode("fdm/jsbsim/systems/stick/lock-button-switch").getValue()==0)
)
{
setprop("fdm/jsbsim/systems/radar/lock/id", -1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-deg", 0);
setprop("fdm/jsbsim/systems/radar/lock/beta-deg", 0);
setprop("fdm/jsbsim/systems/radar/lock/distance-m", 0);
setprop("fdm/jsbsim/systems/radar/lock/speed-kmh", 0);
setprop("fdm/jsbsim/systems/radar/lock/approach-time", -1);
setprop("fdm/jsbsim/systems/radar/lock/alpha-cmd-rad", 0);
setprop("fdm/jsbsim/systems/radar/lock/beta-cmd-rad", 0);
if (radar_node.getNode("unit[0]/existed")!=nil)
{
foreach (var node; radar_node.getChildren("unit"))
{
index=node.getIndex();
if (index==nil)
{
index=0;
}
setprop("fdm/jsbsim/systems/radar/unit["~index~"]/locked", 0);
}
}
}
#------------------------ update radar screen ------------------------
screened_index=0;
locked_index=-1;
if (radar_node.getNode("on").getValue()==1)
{
me.cross_halo.setVisible(1);
me.cross.setVisible(1);
if (radar_node.getNode("antenna-moving").getValue()==1)
{
me.ground_line.setVisible(1);
me.ground_line_halo.setVisible(1);
line_hor_shift=0;
line_rad=-props.globals.getNode("orientation/roll-deg").getValue()/180*math.pi;
line_ver_shift=( radar_node.getNode("alpha-mod-vern-pos").getValue() -0.5)*
radar_node.getNode("alpha-mod-deg").getValue() /
radar_node.getNode("alpha-range-deg").getValue() *1024+
props.globals.getNode("orientation/pitch-deg").getValue() /
(radar_node.getNode("alpha-range-deg").getValue() /2)*512;
me.radar_group.radar_group_rt.setRotation(line_rad, 512+line_hor_shift, 512+line_ver_shift);
me.radar_group.radar_group_tr.setTranslation(line_hor_shift, line_ver_shift);
if ((props.globals.getNode("orientation/pitch-deg").getValue()>
(- radar_node.getNode("alpha-mod-deg").getValue() /2
- radar_node.getNode("alpha-range-deg").getValue() /2 )) and
(props.globals.getNode("orientation/pitch-deg").getValue()<
(radar_node.getNode("alpha-mod-deg").getValue() /2
+ radar_node.getNode("alpha-range-deg").getValue() /2 ))
)
{
me.ground_line.setVisible(1);
me.ground_line_halo.setVisible(1);
}
else
{
me.ground_line.setVisible(0);
me.ground_line_halo.setVisible(0);
}
if (props.globals.getNode("fdm/jsbsim/systems/radar/unit[0]/existed")!=nil)
{
foreach (var node; props.globals.getNode("fdm/jsbsim/systems/radar").getChildren("unit"))
{
index=node.getIndex();
if (index==nil)
{
index=0;
}
if (node.getNode("existed").getValue()==1)
{
dot_ver_shift=512-node.getNode("alpha-deg").getValue()/
(radar_node.getNode("alpha-range-deg").getValue()/2)*512;
dot_hor_shift=512+node.getNode("beta-deg").getValue()/
(radar_node.getNode("beta-range-deg").getValue()/2)*512;
me.target_halo[screened_index].setTranslation(dot_hor_shift, dot_ver_shift);
me.target[screened_index].setTranslation(dot_hor_shift, dot_ver_shift);
me.target_halo[screened_index].setVisible(1);
me.target[screened_index].setVisible(1);
if (node.getNode("locked").getValue()==1)
{
locked_index=index;
me.lock_halo.setTranslation(dot_hor_shift, dot_ver_shift);
me.lock.setTranslation(dot_hor_shift, dot_ver_shift);
me.lock_halo.setVisible(1);
me.lock.setVisible(1);
me.distance_line_halo.setTranslation(124,
radar_node.getNode("lock/distance-line-pos").getValue());
me.distance_line.setTranslation(124,
radar_node.getNode("lock/distance-line-pos").getValue());
me.distance_line_halo.setVisible(1);
me.distance_line.setVisible(1);
}
screened_index=screened_index+1;
}
}
}
if (locked_index==-1)
{
me.lock_halo.setVisible(0);
me.lock.setVisible(0);
me.distance_line_halo.setVisible(0);
me.distance_line.setVisible(0);
}
}
else
{
me.ground_line.setVisible(0);
me.ground_line_halo.setVisible(0);
me.lock_halo.setVisible(0);
me.lock.setVisible(0);
me.distance_line_halo.setVisible(0);
me.distance_line.setVisible(0);
}
}
else
{
me.cross_halo.setVisible(0);
me.cross.setVisible(0);
me.ground_line.setVisible(0);
me.ground_line_halo.setVisible(0);
me.lock_halo.setVisible(0);
me.lock.setVisible(0);
me.distance_line_halo.setVisible(0);
me.distance_line.setVisible(0);
}
if (screened_index<9)
{
for (i=screened_index; i<10; i+=1)
{
me.target_halo[i].setVisible(0);
me.target[i].setVisible(0);
}
}
settimer(func me.update(), 0.1);
}
};
setlistener("/nasal/canvas/loaded", func {
var radar = radar_host.new();
radar.update();
}, 1);