#----------------------------------------------------------------------- #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);