From 23b17f6e3f83ebb3eb13cfdd044542a2e6ae0634 Mon Sep 17 00:00:00 2001
From: Delta Echo <echoair@t-online.de>
Date: Thu, 29 Sep 2022 14:43:40 +0200
Subject: [PATCH] FLARM: Add support for Salus combi instrument, various small
 improvements

---
 .../Instruments-3d/glider/flarm/flarm.nas     | 61 ++++++++++++++-----
 1 file changed, 46 insertions(+), 15 deletions(-)

diff --git a/Aircraft/Instruments-3d/glider/flarm/flarm.nas b/Aircraft/Instruments-3d/glider/flarm/flarm.nas
index a10cf38f6..b9295829a 100644
--- a/Aircraft/Instruments-3d/glider/flarm/flarm.nas
+++ b/Aircraft/Instruments-3d/glider/flarm/flarm.nas
@@ -1,5 +1,5 @@
 ##		FLARM
-##	Version 08/2021
+##	Version 09/2022
 ##	by Benedikt Wolf (D-ECHO)
 
 ##	References:
@@ -28,6 +28,8 @@ var track	=	props.globals.getNode("/orientation/track-deg");
 var ai_models	=	props.globals.getNode("/ai/models");
 var elapsed_sec	=	props.globals.getNode("/sim/time/elapsed-sec");
 
+var version = 202209;	# used for backwards compatibility (e.g. Salus Combined Instrument)
+
 # Initialize Arrays to internally store targets and warnings
 var targets	=	[];
 var warnings	=	[];
@@ -56,17 +58,19 @@ var new_contact = func ()  { #Sound message for new contact
 }
 
 #	Target class
-#var target1 = Target.new(n,scnd);
 var Target = {
-	new : func(n,scnd){
+	new : func(n, type, scnd){
 		m = { parents : [Target] };
 		m.id=n;
-		m.lat = ai_models.getNode("multiplayer["~n~"]/position/latitude-deg");
-		m.lon = ai_models.getNode("multiplayer["~n~"]/position/longitude-deg");
-		m.alt = ai_models.getNode("multiplayer["~n~"]/position/altitude-ft");
+		m.prop_path = ai_models.getNode(type ~ "[" ~n~ "]" );
+		m.lat = m.prop_path.getNode("position/latitude-deg");
+		m.lon = m.prop_path.getNode("position/longitude-deg");
+		m.alt = m.prop_path.getNode("position/altitude-ft");
 		m.pos = geo.Coord.new().set_latlon(	m.lat.getDoubleValue(),
 							m.lon.getDoubleValue(),
 							m.alt.getDoubleValue()	);
+		m.hdg = m.prop_path.getNode("orientation/true-heading-deg");
+		m.vario = m.prop_path.getNode("velocities/vertical-speed-fps");
 		m.second=0.0;
 		var ac = geo.aircraft_position();
 		m.last_dist = m.pos.direct_distance_to( ac );
@@ -154,19 +158,21 @@ setlistener("/sim/signals/fdm-initialized", func{
 
 
 var update_FLARM = func{
-	for(var f=0; f<=30; f=f+1){
-		if(getprop("/ai/models/multiplayer["~f~"]/position/latitude-deg") != nil){
-			var temp_pos = geo.Coord.set_latlon(	getprop("/ai/models/multiplayer["~f~"]/position/latitude-deg"),
-								getprop("/ai/models/multiplayer["~f~"]/position/longitude-deg"),
-								getprop("/ai/models/multiplayer["~f~"]/position/altitude-ft"));
+	# Check MP first, AI afterwards
+	var type = "multiplayer";
+	for(var f = 0; f < 15; f += 1){
+		if(getprop("/ai/models/"~ type ~"[" ~f~ "]/position/latitude-deg") != nil){
+			var temp_pos = geo.Coord.set_latlon(	getprop("/ai/models/"~ type ~"[" ~f~ "]/position/latitude-deg"),
+								getprop("/ai/models/"~ type ~"[" ~f~ "]/position/longitude-deg"),
+								getprop("/ai/models/"~ type ~"[" ~f~ "]/position/altitude-ft"));
 							
 			#Check whether in range and target not already existing
 			var distance_km = temp_pos.distance_to(geo.aircraft_position())/1000;
-			if(distance_km<max_dist and targets_tracked[f] == 0){
+			if( distance_km < max_dist and targets_tracked[f] == 0){
 				#Now generate a target
-				targets[f]=Target.new( f, elapsed_sec.getDoubleValue() );
+				targets[f]=Target.new( f, type, elapsed_sec.getDoubleValue() );
 				targets_tracked[f] = 1;
-			}else if(distance_km>max_dist and targets_tracked[f] == 1){
+			}else if( distance_km > max_dist and targets_tracked[f] == 1){
 				#Target existing, but has moved meanwhile out of range
 				targets[f] = nil;
 				targets_tracked[f] = 0;
@@ -177,6 +183,30 @@ var update_FLARM = func{
 			targets_tracked[f] = 0;
 		}
 	}
+	type = "aircraft";
+	for(var f = 0; f < 15; f += 1){
+		if(getprop("/ai/models/"~ type ~"[" ~f~ "]/position/latitude-deg") != nil){
+			var temp_pos = geo.Coord.set_latlon(	getprop("/ai/models/"~ type ~"[" ~f~ "]/position/latitude-deg"),
+								getprop("/ai/models/"~ type ~"[" ~f~ "]/position/longitude-deg"),
+								getprop("/ai/models/"~ type ~"[" ~f~ "]/position/altitude-ft"));
+							
+			#Check whether in range and target not already existing
+			var distance_km = temp_pos.distance_to(geo.aircraft_position())/1000;
+			if( distance_km < max_dist and targets_tracked[ f+15 ] == 0){
+				#Now generate a target
+				targets[ f+15 ]=Target.new( f, type, elapsed_sec.getDoubleValue() );
+				targets_tracked[ f+15 ] = 1;
+			}else if( distance_km > max_dist and targets_tracked[ f+15 ] == 1){
+				#Target existing, but has moved meanwhile out of range
+				targets[ f+15 ] = nil;
+				targets_tracked[ f+15 ] = 0;
+			}
+		} else if ( targets_tracked[ f+15 ] == 1){
+			#Target existing, but has meanwhile logged out
+			targets[ f+15 ]=nil;
+			targets_tracked[ f+15 ] = 0;
+		}
+	}
 	
 	receive = 0;
 	
@@ -291,7 +321,8 @@ var update_FLARM = func{
 	}
 }
 
-var flarm_update	=	maketimer( 1, func() { update_FLARM(); } );
+var flarm_update = maketimer( 1, func() { update_FLARM(); } );
+flarm_update.simulatedTime = 1;
 
 # Startup as described in [1], p.6
 var phase1_timer = nil;