1## garmin 196 functions
2var last_time = 0.0;
3var last_bearing = -1;
4var tab_chiffres_lettres = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
5var old_status = -1;
6
7var init_variables = func{
8	##version
9	props.globals.getNode("/instrumentation/garmin196/version",1).setValue("JeeP v. 30/11/2012");
10
11	##routes
12	props.globals.getNode("/instrumentation/garmin196/menu_routes/search/x_char",1).setIntValue(0);
13	props.globals.getNode("/instrumentation/garmin196/menu_routes/search/y_char",1).setIntValue(0);
14	props.globals.getNode("/instrumentation/garmin196/menu_routes/fpl-loaded",1).setBoolValue(0);
15	props.globals.getNode("/instrumentation/garmin196/menu_routes/last-wp-reached",1).setBoolValue(0);
16	props.globals.getNode("/instrumentation/garmin196/menu_routes/waypoint-jump",1).setBoolValue(0);
17
18	##points
19	props.globals.getNode("/instrumentation/garmin196/menu_points/x_char",1).setIntValue(0);
20	props.globals.getNode("/instrumentation/garmin196/menu_points/y_char",1).setIntValue(0);
21
22	##aircrafts
23	props.globals.getNode("/instrumentation/garmin196/menu_aircraft/x_char",1).setIntValue(0);
24	props.globals.getNode("/instrumentation/garmin196/menu_aircraft/y_char",1).setIntValue(0);
25
26	##load atis freq
27	fgcommand("loadxml", props.Node.new({ filename: getprop("/sim/fg-root")~"/Aircraft/Instruments-3d/garmin196/airports_atis.xml", targetnode: "/instrumentation/garmin196" }));
28
29	##init waypoint system
30	props.globals.getNode("/instrumentation/garmin196/panel-wpt-bearing",1).setDoubleValue(0);
31	props.globals.getNode("/instrumentation/garmin196/position-wpt-bearing",1).setDoubleValue(0);
32	props.globals.getNode("/instrumentation/garmin196/panel-wpt-id",1).setValue("------");
33	props.globals.getNode("/instrumentation/gps/config/drive-autopilot",1).setBoolValue(0); ##pour ne pas interferer avec l'autopilot
34
35	##init map system
36	props.globals.getNode("/instrumentation/garmin196/map-range",1).setDoubleValue(0.125);
37
38	##init dto system
39	props.globals.getNode("/instrumentation/garmin196/dto_display/x_char",1).setIntValue(0);
40	props.globals.getNode("/instrumentation/garmin196/dto_display/y_char",1).setIntValue(0);
41
42	##init saveable variables
43	props.globals.getNode("/instrumentation/garmin196/antenne-deg",1).setDoubleValue(30);
44	props.globals.getNode("/instrumentation/garmin196/light",1).setDoubleValue(30);
45	props.globals.getNode("/instrumentation/garmin196/max-speed",1).setDoubleValue(150);
46	props.globals.getNode("/instrumentation/garmin196/cruise-speed",1).setDoubleValue(120);
47	props.globals.getNode("/instrumentation/garmin196/fuel-flow",1).setDoubleValue(5);
48	props.globals.getNode("/instrumentation/garmin196/no_aircraft",1).setIntValue(0);
49	props.globals.getNode("/instrumentation/garmin196/symbols/params/airport",1).setBoolValue(1);
50	props.globals.getNode("/instrumentation/garmin196/symbols/params/vor",1).setBoolValue(1);
51	props.globals.getNode("/instrumentation/garmin196/symbols/params/ndb",1).setBoolValue(1);
52	props.globals.getNode("/instrumentation/garmin196/symbols/params/fix",1).setBoolValue(1);
53	props.globals.getNode("/instrumentation/garmin196/symbols/params/twn",1).setBoolValue(1);
54	props.globals.getNode("/instrumentation/garmin196/symbols/params/wpt",1).setBoolValue(1);
55
56	props.globals.getNode("/instrumentation/garmin196/params/units/distance",1).setIntValue(1);
57	props.globals.getNode("/instrumentation/garmin196/params/units/speed",1).setIntValue(1);
58	props.globals.getNode("/instrumentation/garmin196/params/units/vert-speed",1).setIntValue(1);
59	props.globals.getNode("/instrumentation/garmin196/params/units/altitude",1).setIntValue(1);
60	props.globals.getNode("/instrumentation/garmin196/params/units/pressure",1).setIntValue(1);
61	props.globals.getNode("/instrumentation/garmin196/params/units/temperature",1).setIntValue(1);
62
63	props.globals.getNode("/instrumentation/garmin196/params/filtrage",1).setBoolValue(0);
64	props.globals.getNode("/instrumentation/garmin196/params/vnav-indicator",1).setBoolValue(1);
65
66	##status du gps
67	#0 eteint
68	#1 startup page
69	#1x map page
70	#2x panel page
71	#3x position page
72	#50 coffee page
73	#menus
74	#100 = menu gps
75	#110 = menu flights
76	#120 = menu route
77	#130 = menu points
78	#140 = menu aircraft
79	#150 = menu e6b
80	#160 = menu map
81	#170 = menu setup
82	props.globals.getNode("/instrumentation/garmin196/status",1).setIntValue(0);
83
84	##popup windows
85	#0 = pas de popup
86	#1 = affichage du reglage de la lumiere
87	#10,11,12 = dto aviation
88	#20 = dto recent
89	#30 = dto user
90	#40 = nrst airport
91	#50 = nrst vor
92	#60 = nrst ndb
93	#70 = nrst fix
94	#80 = nrst cities
95
96	props.globals.getNode("/instrumentation/garmin196/popup_status",1).setIntValue(0);
97
98	props.globals.getNode("/instrumentation/garmin196/serviceable",1).setBoolValue(0);
99	props.globals.getNode("/instrumentation/garmin196/light",1).setDoubleValue(0);
100	props.globals.getNode("/instrumentation/garmin196/coffee",1).setIntValue(0);
101
102	load_cities();
103	main_loop();
104}
105setlistener("/sim/signals/fdm-initialized",init_variables,0,0);
106
107var load_parameters = func{
108	fgcommand("loadxml", props.Node.new({ filename: getprop("/sim/fg-home")~"/aircraft-data/garmin196.xml", targetnode: "/instrumentation/garmin196/save" }));
109
110	if(getprop("/instrumentation/garmin196/save/antenne-deg")!=nil){
111		setprop("/instrumentation/garmin196/antenne-deg",getprop("/instrumentation/garmin196/save/antenne-deg"));
112	}
113	if(getprop("/instrumentation/garmin196/save/light")!=nil){
114		setprop("/instrumentation/garmin196/light",getprop("/instrumentation/garmin196/save/light"));
115	}
116	if(getprop("/instrumentation/garmin196/save/max-speed")!=nil){
117		setprop("/instrumentation/garmin196/max-speed",getprop("/instrumentation/garmin196/save/max-speed"));
118	}
119	if(getprop("/instrumentation/garmin196/save/cruise-speed")!=nil){
120		setprop("/instrumentation/garmin196/cruise-speed",getprop("/instrumentation/garmin196/save/cruise-speed"));
121	}
122	if(getprop("/instrumentation/garmin196/save/fuel-flow")!=nil){
123		setprop("/instrumentation/garmin196/fuel-flow",getprop("/instrumentation/garmin196/save/fuel-flow"));
124	}
125	if(getprop("/instrumentation/garmin196/save/no_aircraft")!=nil){
126		setprop("/instrumentation/garmin196/no_aircraft",getprop("/instrumentation/garmin196/save/no_aircraft"));
127	}
128	if(getprop("/instrumentation/garmin196/save/symbols/params/airport")!=nil){
129		setprop("/instrumentation/garmin196/symbols/params/airport",getprop("/instrumentation/garmin196/save/symbols/params/airport"));
130	}
131	if(getprop("/instrumentation/garmin196/save/symbols/params/vor")!=nil){
132		setprop("/instrumentation/garmin196/symbols/params/vor",getprop("/instrumentation/garmin196/save/symbols/params/vor"));
133	}
134	if(getprop("/instrumentation/garmin196/save/symbols/params/ndb")!=nil){
135		setprop("/instrumentation/garmin196/symbols/params/ndb",getprop("/instrumentation/garmin196/save/symbols/params/ndb"));
136	}
137	if(getprop("/instrumentation/garmin196/save/symbols/params/fix")!=nil){
138		setprop("/instrumentation/garmin196/symbols/params/fix",getprop("/instrumentation/garmin196/save/symbols/params/fix"));
139	}
140	if(getprop("/instrumentation/garmin196/save/symbols/params/twn")!=nil){
141		setprop("/instrumentation/garmin196/symbols/params/twn",getprop("/instrumentation/garmin196/save/symbols/params/twn"));
142	}
143	if(getprop("/instrumentation/garmin196/save/symbols/params/wpt")!=nil){
144		setprop("/instrumentation/garmin196/symbols/params/wpt",getprop("/instrumentation/garmin196/save/symbols/params/wpt"));
145	}
146
147	if(getprop("/instrumentation/garmin196/save/params/units/distance")!=nil){
148		setprop("/instrumentation/garmin196/params/units/distance",getprop("/instrumentation/garmin196/save/params/units/distance"));
149	}
150	if(getprop("/instrumentation/garmin196/save/params/units/speed")!=nil){
151		setprop("/instrumentation/garmin196/params/units/speed",getprop("/instrumentation/garmin196/save/params/units/speed"));
152	}
153	if(getprop("/instrumentation/garmin196/save/params/units/vert-speed")!=nil){
154		setprop("/instrumentation/garmin196/params/units/vert-speed",getprop("/instrumentation/garmin196/save/params/units/vert-speed"));
155	}
156	if(getprop("/instrumentation/garmin196/save/params/units/altitude")!=nil){
157		setprop("/instrumentation/garmin196/params/units/altitude",getprop("/instrumentation/garmin196/save/params/units/altitude"));
158	}
159	if(getprop("/instrumentation/garmin196/save/params/units/pressure")!=nil){
160		setprop("/instrumentation/garmin196/params/units/pressure",getprop("/instrumentation/garmin196/save/params/units/pressure"));
161	}
162	if(getprop("/instrumentation/garmin196/save/params/units/temperature")!=nil){
163		setprop("/instrumentation/garmin196/params/units/temperature",getprop("/instrumentation/garmin196/save/params/units/temperature"));
164	}
165	if(getprop("/instrumentation/garmin196/save/params/filtrage")!=nil){
166		setprop("/instrumentation/garmin196/params/filtrage",getprop("/instrumentation/garmin196/save/params/filtrage"));
167	}
168	if(getprop("/instrumentation/garmin196/save/params/vnav-indicator")!=nil){
169		setprop("/instrumentation/garmin196/params/vnav-indicator",getprop("/instrumentation/garmin196/save/params/vnav-indicator"));
170	}
171
172	for(var i=0;i<5;i=i+1){
173		if(getprop("/instrumentation/garmin196/save/waypoints/recent/wpt["~i~"]/id")!=nil){
174			props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id",1).setValue(getprop("/instrumentation/garmin196/save/waypoints/recent/wpt["~i~"]/id"));
175			props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/type",1).setValue(getprop("/instrumentation/garmin196/save/waypoints/recent/wpt["~i~"]/type"));
176		}
177	}
178
179	for(var i=0;i<5;i=i+1){
180		if(getprop("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/id")!=nil){
181			props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id",1).setValue(getprop("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/id"));
182			props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/latitude",1).setDoubleValue(getprop("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/latitude"));
183			props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/longitude",1).setDoubleValue(getprop("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/longitude"));
184			props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/longitude"));
185			props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/latitude"));
186			props.globals.getNode("/instrumentation/gps/scratch/ident",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id")~"WPTUSR");
187			setprop("/instrumentation/gps/command","define-user-wpt");
188		}
189	}
190
191	for(var i=0;i<6;i=i+1){
192		if(getprop("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/name")!=nil){
193			props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/name",1).setValue(getprop("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/name"));
194			props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/max-speed",1).setIntValue(getprop("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/max-speed"));
195			props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/cruise-speed",1).setIntValue(getprop("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/cruise-speed"));
196			props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/fuel-flow",1).setDoubleValue(getprop("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/fuel-flow"));
197		}
198	}
199
200	for(var i=0;i<9;i=i+1){
201		if(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/start")!=nil){
202			props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/start",1).setValue(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/start"));
203			props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/end",1).setValue(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/end"));
204			props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/date",1).setValue(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/date"));
205			props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/aircraft",1).setValue(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/aircraft"));
206			props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/distance",1).setDoubleValue(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/distance"));
207			props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/duration",1).setDoubleValue(getprop("/instrumentation/garmin196/save/flights/flight["~i~"]/duration"));
208		}
209	}
210
211	for(var i=0;i<11;i=i+1){
212		if(getprop("/instrumentation/garmin196/save/routes/route["~i~"]/name")!=nil){
213			props.globals.getNode("/instrumentation/garmin196/routes/route["~i~"]/name",1).setValue(getprop("/instrumentation/garmin196/save/routes/route["~i~"]/name"));
214			for(var j=0;j<10;j=j+1){
215				if(getprop("/instrumentation/garmin196/save/routes/route["~i~"]/wpts/wpt["~j~"]/id")!=nil){
216					props.globals.getNode("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/id",1).setValue(getprop("/instrumentation/garmin196/save/routes/route["~i~"]/wpts/wpt["~j~"]/id"));
217					props.globals.getNode("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/type",1).setValue(getprop("/instrumentation/garmin196/save/routes/route["~i~"]/wpts/wpt["~j~"]/type"));
218				}
219			}
220		}
221	}
222}
223setlistener("/sim/signals/fdm-initialized",load_parameters);
224
225var save_parameters = func{
226		props.globals.getNode("/instrumentation/garmin196/save").remove();
227
228		##preparation
229		if(getprop("/instrumentation/garmin196/antenne-deg")!=nil){
230			props.globals.getNode("/instrumentation/garmin196/save/antenne-deg",1).setDoubleValue(getprop("/instrumentation/garmin196/antenne-deg"));
231		}
232		if(getprop("/instrumentation/garmin196/light")!=nil){
233			props.globals.getNode("/instrumentation/garmin196/save/light",1).setDoubleValue(getprop("/instrumentation/garmin196/light"));
234		}
235		if(getprop("/instrumentation/garmin196/max-speed")!=nil){
236			props.globals.getNode("/instrumentation/garmin196/save/max-speed",1).setDoubleValue(getprop("/instrumentation/garmin196/max-speed"));
237		}
238		if(getprop("/instrumentation/garmin196/cruise-speed")!=nil){
239			props.globals.getNode("/instrumentation/garmin196/save/cruise-speed",1).setDoubleValue(getprop("/instrumentation/garmin196/cruise-speed"));
240		}
241		if(getprop("/instrumentation/garmin196/fuel-flow")!=nil){
242			props.globals.getNode("/instrumentation/garmin196/save/fuel-flow",1).setDoubleValue(getprop("/instrumentation/garmin196/fuel-flow"));
243		}
244		if(getprop("/instrumentation/garmin196/no_aircraft")!=nil){
245			props.globals.getNode("/instrumentation/garmin196/save/no_aircraft",1).setDoubleValue(getprop("/instrumentation/garmin196/no_aircraft"));
246		}
247		props.globals.getNode("/instrumentation/garmin196/save/symbols/params/airport",1).setDoubleValue(getprop("/instrumentation/garmin196/symbols/params/airport"));
248		props.globals.getNode("/instrumentation/garmin196/save/symbols/params/vor",1).setBoolValue(getprop("/instrumentation/garmin196/symbols/params/vor"));
249		props.globals.getNode("/instrumentation/garmin196/save/symbols/params/ndb",1).setBoolValue(getprop("/instrumentation/garmin196/symbols/params/ndb"));
250		props.globals.getNode("/instrumentation/garmin196/save/symbols/params/fix",1).setBoolValue(getprop("/instrumentation/garmin196/symbols/params/fix"));
251		props.globals.getNode("/instrumentation/garmin196/save/symbols/params/twn",1).setBoolValue(getprop("/instrumentation/garmin196/symbols/params/twn"));
252		props.globals.getNode("/instrumentation/garmin196/save/symbols/params/wpt",1).setBoolValue(getprop("/instrumentation/garmin196/symbols/params/wpt"));
253
254		props.globals.getNode("/instrumentation/garmin196/save/params/units/distance",1).setIntValue(getprop("/instrumentation/garmin196/params/units/distance"));
255		props.globals.getNode("/instrumentation/garmin196/save/params/units/speed",1).setIntValue(getprop("/instrumentation/garmin196/params/units/speed"));
256		props.globals.getNode("/instrumentation/garmin196/save/params/units/vert-speed",1).setIntValue(getprop("/instrumentation/garmin196/params/units/vert-speed"));
257		props.globals.getNode("/instrumentation/garmin196/save/params/units/altitude",1).setIntValue(getprop("/instrumentation/garmin196/params/units/altitude"));
258		props.globals.getNode("/instrumentation/garmin196/save/params/units/pressure",1).setIntValue(getprop("/instrumentation/garmin196/params/units/pressure"));
259		props.globals.getNode("/instrumentation/garmin196/save/params/units/temperature",1).setIntValue(getprop("/instrumentation/garmin196/params/units/temperature"));
260		props.globals.getNode("/instrumentation/garmin196/save/params/filtrage",1).setBoolValue(getprop("/instrumentation/garmin196/params/filtrage"));
261		props.globals.getNode("/instrumentation/garmin196/save/params/vnav-indicator",1).setBoolValue(getprop("/instrumentation/garmin196/params/vnav-indicator"));
262
263		for(var i=0;i<5;i=i+1){
264			if(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id")!=nil){
265				props.globals.getNode("/instrumentation/garmin196/save/waypoints/recent/wpt["~i~"]/id",1).setValue(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id"));
266				props.globals.getNode("/instrumentation/garmin196/save/waypoints/recent/wpt["~i~"]/type",1).setValue(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/type"));
267			}
268		}
269
270		for(var i=0;i<9;i=i+1){
271			if(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id")!=nil){
272				props.globals.getNode("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/id",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id"));
273				props.globals.getNode("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/latitude",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/latitude"));
274				props.globals.getNode("/instrumentation/garmin196/save/waypoints/user/wpt["~i~"]/longitude",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/longitude"));
275			}
276		}
277
278		for(var i=0;i<6;i=i+1){
279			if(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/name")!=nil){
280				props.globals.getNode("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/name",1).setValue(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/name"));
281				props.globals.getNode("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/max-speed",1).setIntValue(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/max-speed"));
282				props.globals.getNode("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/cruise-speed",1).setIntValue(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/cruise-speed"));
283				props.globals.getNode("/instrumentation/garmin196/save/params/aircrafts/aircraft["~i~"]/fuel-flow",1).setDoubleValue(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/fuel-flow"));
284			}
285		}
286		for(var i=0;i<8;i=i+1){
287			if(getprop("/instrumentation/garmin196/flights/flight["~i~"]/start")!=nil){
288				props.globals.getNode("/instrumentation/garmin196/save/flights/flight["~i~"]/start",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~i~"]/start"));
289				props.globals.getNode("/instrumentation/garmin196/save/flights/flight["~i~"]/end",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~i~"]/end"));
290				props.globals.getNode("/instrumentation/garmin196/save/flights/flight["~i~"]/date",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~i~"]/date"));
291				props.globals.getNode("/instrumentation/garmin196/save/flights/flight["~i~"]/aircraft",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~i~"]/aircraft"));
292				props.globals.getNode("/instrumentation/garmin196/save/flights/flight["~i~"]/distance",1).setDoubleValue(getprop("/instrumentation/garmin196/flights/flight["~i~"]/distance"));
293				props.globals.getNode("/instrumentation/garmin196/save/flights/flight["~i~"]/duration",1).setDoubleValue(getprop("/instrumentation/garmin196/flights/flight["~i~"]/duration"));
294			}
295		}
296		for(var i=0;i<11;i=i+1){
297			if(getprop("/instrumentation/garmin196/routes/route["~i~"]/name")!=nil){
298				props.globals.getNode("/instrumentation/garmin196/save/routes/route["~i~"]/name",1).setValue(getprop("/instrumentation/garmin196/routes/route["~i~"]/name"));
299				for(var j=0;j<10;j=j+1){
300					if(getprop("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/id")!=nil){
301						props.globals.getNode("/instrumentation/garmin196/save/routes/route["~i~"]/wpts/wpt["~j~"]/id",1).setValue(getprop("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/id"));
302						props.globals.getNode("/instrumentation/garmin196/save/routes/route["~i~"]/wpts/wpt["~j~"]/type",1).setValue(getprop("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/type"));
303					}
304				}
305			}
306		}
307		##delete file before saving to delete keys
308		var file = io.open(getprop("/sim/fg-home")~"/aircraft-data/garmin196.xml", mode="w");
309		io.write(file,"");
310		io.close(file);
311		fgcommand("savexml", props.Node.new({ filename: getprop("/sim/fg-home")~"/aircraft-data/garmin196.xml", sourcenode: "/instrumentation/garmin196/save" }));
312}
313
314var main_loop = func{
315	var time = getprop("/sim/time/elapsed-sec");
316    var dt = time - last_time;
317    last_time = time;
318
319	calcul_turn_rate(dt);
320	change_speed_display();
321	change_position_wpt_bug();
322	update_flight();
323	update_e6b_menu();
324
325	settimer(main_loop, 0.3);
326}
327
328var nyi = func (x) { gui.popupTip(x ~ ": not yet implemented", 3); }
329
330var power = func (x){
331	var serviceable = getprop("/instrumentation/garmin196/serviceable");
332	if(x==0){
333		if(serviceable==1){
334			setprop("/instrumentation/garmin196/serviceable",0);
335			setprop("/instrumentation/garmin196/status",0);
336			setprop("/instrumentation/garmin196/popup_status",0);
337		}else{
338			setprop("/instrumentation/garmin196/serviceable",1);
339			setprop("/instrumentation/garmin196/status",1);
340		}
341	}
342
343	if(x==1 and serviceable==1){
344		setprop("/instrumentation/garmin196/popup_status",1)
345	}
346
347}
348
349var in = func (x){
350	var serviceable = getprop("/instrumentation/garmin196/serviceable");
351	if(serviceable==1){
352		var status = getprop("/instrumentation/garmin196/status");
353		if(x==0){
354			##traitement des pages
355			if(status==10){
356				var range = getprop("/instrumentation/garmin196/map-range");
357				range = range / 2;
358				if(range<0.125){
359					range = 0.125;
360				}
361				setprop("/instrumentation/garmin196/map-range",range);
362				return;
363			}
364		}elsif(x==1){
365			if(getprop("/instrumentation/garmin196/coffee")==2 and status>=10){
366				setprop("/instrumentation/garmin196/coffee",0);
367				setprop("/instrumentation/garmin196/status",50);
368			}
369		}
370	}
371}
372
373var out = func (x){
374	var serviceable = getprop("/instrumentation/garmin196/serviceable");
375	if(serviceable==1){
376		var status = getprop("/instrumentation/garmin196/status");
377		if(x==0){
378			##traitement des pages
379			if(status==10){
380				var range = getprop("/instrumentation/garmin196/map-range");
381				range = range * 2;
382				if(range>32){
383					range = 32;
384				}
385				setprop("/instrumentation/garmin196/map-range",range);
386				return;
387			}
388		}elsif(x==1){
389			if(getprop("/instrumentation/garmin196/coffee")==1 and status>=10){
390				setprop("/instrumentation/garmin196/coffee",2);
391			}
392		}
393	}
394}
395
396var page = func (x){
397	var serviceable = getprop("/instrumentation/garmin196/serviceable");
398	if(serviceable==1){
399		var status = getprop("/instrumentation/garmin196/status");
400		if(x==0){
401			##traitement des pages
402			if(status==10){
403				setprop("/instrumentation/garmin196/status",20);
404				return;
405			}
406
407			if(status==20){
408				setprop("/instrumentation/garmin196/status",30);
409				return;
410			}
411
412			if(status==30){
413				setprop("/instrumentation/garmin196/status",10);
414				update_map();
415				return;
416			}
417
418			if(status==50){
419				setprop("/instrumentation/garmin196/status",10);
420				update_map();
421				return;
422			}
423		}elsif(x==1){
424			if(getprop("/instrumentation/garmin196/coffee")==0 and status>=10){
425				setprop("/instrumentation/garmin196/coffee",1);
426			}
427		}
428	}
429}
430
431var quit = func (x){
432	var serviceable = getprop("/instrumentation/garmin196/serviceable");
433	if(serviceable==1){
434		if(x==0){
435			#traitement des popup
436			var popup_status = getprop("/instrumentation/garmin196/popup_status");
437			if(popup_status==1){
438				setprop("/instrumentation/garmin196/popup_status",0);
439				save_parameters();
440				return;
441			}
442			if(popup_status>=10 and popup_status<=99){
443				setprop("/instrumentation/garmin196/popup_status",0);
444				return;
445			}
446
447			##traitement des pages
448			var status = getprop("/instrumentation/garmin196/status");
449			if(status==10){
450				setprop("/instrumentation/garmin196/status",30);
451				return;
452			}
453
454			if(status==20){
455				setprop("/instrumentation/garmin196/status",10);
456				update_map();
457				return;
458			}
459
460			if(status==30){
461				setprop("/instrumentation/garmin196/status",20);
462				return;
463			}
464
465			if(status==50){
466				setprop("/instrumentation/garmin196/status",10);
467				update_map();
468				return;
469			}
470
471			if(status==111){
472				setprop("/instrumentation/garmin196/status",110);
473				setprop("/instrumentation/garmin196/menu_flights/no_ligne_selected",-1);
474				return;
475			}
476
477			if(status==112){
478				setprop("/instrumentation/garmin196/status",111);
479				return;
480			}
481
482			##menu routes
483			if(status==121){
484				setprop("/instrumentation/garmin196/status",120);
485				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",-1);
486				return;
487			}
488
489			if(status==122){
490				setprop("/instrumentation/garmin196/status",121);
491				save_parameters();
492				return;
493			}
494
495			if(status==123){
496				setprop("/instrumentation/garmin196/status",122);
497				return;
498			}
499
500			if(status==124){
501				setprop("/instrumentation/garmin196/status",123);
502				return;
503			}
504
505			##menu points
506			if(status==131){
507				setprop("/instrumentation/garmin196/status",130);
508				setprop("/instrumentation/garmin196/menu_points/no_ligne_selected",-1);
509				init_list_points();
510				return;
511			}
512
513			if(status==132){
514				setprop("/instrumentation/garmin196/status",131);
515				return;
516			}
517
518			if(status==133){
519				setprop("/instrumentation/garmin196/status",132);
520				return;
521			}
522
523			if(status==134){
524				setprop("/instrumentation/garmin196/status",133);
525				return;
526			}
527
528			if(status==135){
529				setprop("/instrumentation/garmin196/status",134);
530				return;
531			}
532
533			if(status==136){
534				setprop("/instrumentation/garmin196/status",135);
535				return;
536			}
537
538			##menu aircraft
539			if(status==141){
540				setprop("/instrumentation/garmin196/status",140);
541				setprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected",-1);
542				init_list_aircraft();
543				display_list_aircraft();
544				return;
545			}
546
547			if(status==142){
548				setprop("/instrumentation/garmin196/status",141);
549				display_list_aircraft();
550				return;
551			}
552
553			if(status==143){
554				setprop("/instrumentation/garmin196/status",142);
555				return;
556			}
557
558			if(status==144){
559				setprop("/instrumentation/garmin196/status",143);
560				return;
561			}
562
563			if(status==145){
564				setprop("/instrumentation/garmin196/status",144);
565				return;
566			}
567
568			##menu map
569			if(status==161){
570				setprop("/instrumentation/garmin196/status",160);
571				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",-1);
572				return;
573			}
574
575			##menu setup
576			if(status==171){
577				setprop("/instrumentation/garmin196/status",170);
578				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",-1);
579				return;
580			}
581
582			if(status==176){
583				setprop("/instrumentation/garmin196/status",175);
584				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",-1);
585				return;
586			}
587
588			if(status>=100 and status <180){
589				if(old_status>=10){
590					status = old_status;
591				}else{
592					status = 10;
593				}
594				setprop("/instrumentation/garmin196/status",status);
595				if(status==10){
596					update_map();
597				}
598				return;
599			}
600		}
601	}
602}
603
604var enter = func (x){
605	var serviceable = getprop("/instrumentation/garmin196/serviceable");
606	if(serviceable==1){
607		if(x==0){
608			#traitement des popup
609			var popup_status = getprop("/instrumentation/garmin196/popup_status");
610			if(popup_status==1){
611				setprop("/instrumentation/garmin196/popup_status",0);
612				save_parameters();
613				return;
614			}
615
616			if(popup_status==10){
617				setprop("/instrumentation/garmin196/popup_status",11);
618				display_dto_search();
619				return;
620			}
621
622			if(popup_status==11){
623				if(getprop("/instrumentation/garmin196/dto_display/max_ligne_selected")>=0){
624					props.globals.getNode("/instrumentation/garmin196/dto_display/ligne[0]/selected",1).setBoolValue(1);
625					setprop("/instrumentation/garmin196/popup_status",12);
626					return;
627				}
628			}
629
630			if(popup_status==12 or popup_status==30){
631				setprop("/instrumentation/garmin196/popup_status",0);
632				var id = getprop("/instrumentation/garmin196/dto_display/ligne["~getprop("/instrumentation/garmin196/dto_display/no_ligne_selected")~"]/id");
633				var type = getprop("/instrumentation/garmin196/dto_display/ligne["~getprop("/instrumentation/garmin196/dto_display/no_ligne_selected")~"]/type");
634				affectation_waypoint(id);
635				##rolling recents waypoints
636				var existe_deja = 0;
637				for(var i=0;i<5;i=i+1){
638					if(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id")==id){
639						existe_deja = 1;
640						break;
641					}
642				}
643				if(existe_deja==0){
644					for(var i=4;i>0;i=i-1){
645						if(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~(i-1)~"]/id")){
646							props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id",1).setValue(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~(i-1)~"]/id"));
647							props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/type",1).setValue(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~(i-1)~"]/type"));
648						}
649					}
650					props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt[0]/id",1).setValue(id);
651					props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt[0]/type",1).setValue(type);
652					save_parameters();
653				}
654				return;
655			}
656
657			if(popup_status==20){
658				setprop("/instrumentation/garmin196/popup_status",0);
659				var id = getprop("/instrumentation/garmin196/dto_display/ligne["~getprop("/instrumentation/garmin196/dto_display/no_ligne_selected")~"]/id");
660				var type = getprop("/instrumentation/garmin196/dto_display/ligne["~getprop("/instrumentation/garmin196/dto_display/no_ligne_selected")~"]/type");
661				affectation_waypoint(id);
662				return;
663			}
664
665			if(popup_status>30 and popup_status<=89){
666				setprop("/instrumentation/garmin196/popup_status",0);
667				var id = getprop("/instrumentation/garmin196/nrst_display/ligne["~getprop("/instrumentation/garmin196/nrst_display/no_ligne_selected")~"]/id");
668				var type = getprop("/instrumentation/garmin196/nrst_display/ligne["~getprop("/instrumentation/garmin196/nrst_display/no_ligne_selected")~"]/type");
669				affectation_waypoint(id);
670				##rolling recents waypoints
671				var existe_deja = 0;
672				for(var i=0;i<5;i=i+1){
673					if(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id")==id){
674						existe_deja = 1;
675						break;
676					}
677				}
678				if(existe_deja==0){
679					for(var i=4;i>0;i=i-1){
680						if(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~(i-1)~"]/id")){
681							props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/id",1).setValue(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~(i-1)~"]/id"));
682							props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt["~i~"]/type",1).setValue(getprop("/instrumentation/garmin196/waypoints/recent/wpt["~(i-1)~"]/type"));
683						}
684					}
685					props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt[0]/id",1).setValue(id);
686					props.globals.getNode("/instrumentation/garmin196/waypoints/recent/wpt[0]/type",1).setValue(type);
687					save_parameters();
688				}
689				return;
690			}
691
692			##validation de la startup page
693			var status = getprop("/instrumentation/garmin196/status");
694			if(status==1){
695				setprop("/instrumentation/garmin196/status",10);
696				update_map();
697				return;
698			}
699
700			if(status==110){
701				if(getprop("/instrumentation/garmin196/menu_flights/max_ligne_selected")>=0){
702					setprop("/instrumentation/garmin196/menu_flights/no_ligne_selected",0);
703					setprop("/instrumentation/garmin196/status",111);
704				}
705				return;
706			}
707
708			if(status==111){
709				update_menu_flights_detail();
710				setprop("/instrumentation/garmin196/status",112);
711				return;
712			}
713
714			if(status==112){
715				setprop("/instrumentation/garmin196/status",111);
716				return;
717			}
718
719			if(status==120){
720				setprop("/instrumentation/garmin196/status",121);
721				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",0);
722				return;
723			}
724
725			if(status==121){
726				setprop("/instrumentation/garmin196/status",122);
727				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
728				if(getprop("/instrumentation/garmin196/routes/route["~no_ligne~"]/name")==nil){
729					init_new_route(no_ligne);
730				}
731				update_menu_routes_detail();
732				setprop("/instrumentation/garmin196/menu_routes/no_ligne_detail",0);
733				return;
734			}
735
736			if(status==122){
737				setprop("/instrumentation/garmin196/status",123);
738				var no_ligne_liste = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
739				var no_ligne_detail = getprop("/instrumentation/garmin196/menu_routes/no_ligne_detail");
740				if(getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~no_ligne_detail~"]/id")==nil){
741					init_search_route("0");
742				}else{
743					init_search_route(getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~no_ligne_detail~"]/id"));
744				}
745				setprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected",-1);
746				return;
747			}
748
749			if(status==123){
750				if(getprop("/instrumentation/garmin196/menu_routes/search/max_ligne_selected")>=0){
751					setprop("/instrumentation/garmin196/status",124);
752					setprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected",0);
753				}
754				return;
755			}
756
757			if(status==124){
758				validate_menu_search_routes();
759				update_menu_routes_detail();
760				init_menu_routes_list();
761				setprop("/instrumentation/garmin196/status",122);
762				return;
763			}
764
765			if(status==130){
766				setprop("/instrumentation/garmin196/status",131);
767				setprop("/instrumentation/garmin196/menu_points/no_ligne_selected",0);
768				return;
769			}
770
771			if(status==131){
772				setprop("/instrumentation/garmin196/status",132);
773				var no_ligne = getprop("/instrumentation/garmin196/menu_points/no_ligne_selected");
774				if(getprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/id")==nil){
775					init_new_point(no_ligne);
776				}
777				update_menu_points();
778				return;
779			}
780
781			if(status==132){
782				setprop("/instrumentation/garmin196/status",133);
783				return;
784			}
785
786			if(status==133){
787				setprop("/instrumentation/garmin196/status",134);
788				return;
789			}
790
791			if(status==134){
792				setprop("/instrumentation/garmin196/status",135);
793				return;
794			}
795
796			if(status==135){
797				setprop("/instrumentation/garmin196/status",136);
798				return;
799			}
800
801			if(status==136){
802				setprop("/instrumentation/garmin196/status",131);
803				validate_menu_points();
804				init_list_points();
805				return;
806			}
807
808			if(status==140){
809				setprop("/instrumentation/garmin196/status",141);
810				setprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected",getprop("/instrumentation/garmin196/no_aircraft"));
811				display_list_aircraft();
812				return;
813			}
814
815			if(status==141){
816				setprop("/instrumentation/garmin196/status",142);
817				var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
818				if(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/name")==nil){
819					init_new_aircraft(no_ligne);
820				}
821				init_menu_aircraft();
822				return;
823			}
824
825			if(status==142){
826				setprop("/instrumentation/garmin196/status",143);
827				return;
828			}
829
830			if(status==143){
831				setprop("/instrumentation/garmin196/status",144);
832				return;
833			}
834
835			if(status==144){
836				setprop("/instrumentation/garmin196/status",145);
837				return;
838			}
839
840			if(status==145){
841				setprop("/instrumentation/garmin196/status",141);
842				validate_menu_aircraft();
843				init_list_aircraft();
844				display_list_aircraft();
845				return;
846			}
847
848			##menu map
849			if(status==160){
850				setprop("/instrumentation/garmin196/status",161);
851				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",0);
852				return;
853			}
854
855			if(status==161){
856				var no_ligne = getprop("/instrumentation/garmin196/menu_map/no_ligne_selected");
857				if(no_ligne==0){
858					setprop("/instrumentation/garmin196/symbols/params/airport",(getprop("/instrumentation/garmin196/symbols/params/airport")==1 ? 0 : 1));
859				}
860				if(no_ligne==1){
861					setprop("/instrumentation/garmin196/symbols/params/vor",(getprop("/instrumentation/garmin196/symbols/params/vor")==1 ? 0 : 1));
862				}
863				if(no_ligne==2){
864					setprop("/instrumentation/garmin196/symbols/params/ndb",(getprop("/instrumentation/garmin196/symbols/params/ndb")==1 ? 0 : 1));
865				}
866				if(no_ligne==3){
867					setprop("/instrumentation/garmin196/symbols/params/fix",(getprop("/instrumentation/garmin196/symbols/params/fix")==1 ? 0 : 1));
868				}
869				if(no_ligne==4){
870					setprop("/instrumentation/garmin196/symbols/params/twn",(getprop("/instrumentation/garmin196/symbols/params/twn")==1 ? 0 : 1));
871				}
872				if(no_ligne==5){
873					setprop("/instrumentation/garmin196/symbols/params/wpt",(getprop("/instrumentation/garmin196/symbols/params/wpt")==1 ? 0 : 1));
874				}
875				save_parameters();
876				return;
877			}
878
879			##menu setup
880			if(status==170){
881				setprop("/instrumentation/garmin196/status",171);
882				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",0);
883				return;
884			}
885
886			if(status==171){
887				var no_ligne = getprop("/instrumentation/garmin196/menu_setup/no_ligne_selected");
888				if(no_ligne==0){
889					setprop("/instrumentation/garmin196/params/units/distance",(getprop("/instrumentation/garmin196/params/units/distance")==1 ? 2 : 1));
890				}
891				if(no_ligne==1){
892					setprop("/instrumentation/garmin196/params/units/speed",(getprop("/instrumentation/garmin196/params/units/speed")==1 ? 2 : 1));
893				}
894				if(no_ligne==2){
895					setprop("/instrumentation/garmin196/params/units/vert-speed",(getprop("/instrumentation/garmin196/params/units/vert-speed")==1 ? 2 : 1));
896				}
897				if(no_ligne==3){
898					setprop("/instrumentation/garmin196/params/units/altitude",(getprop("/instrumentation/garmin196/params/units/altitude")==1 ? 2 : 1));
899				}
900				if(no_ligne==4){
901					setprop("/instrumentation/garmin196/params/units/pressure",(getprop("/instrumentation/garmin196/params/units/pressure")==1 ? 2 : 1));
902				}
903				if(no_ligne==5){
904					setprop("/instrumentation/garmin196/params/units/temperature",(getprop("/instrumentation/garmin196/params/units/temperature")==1 ? 2 : 1));
905				}
906				save_parameters();
907				return;
908			}
909
910			if(status==175){
911				setprop("/instrumentation/garmin196/status",176);
912				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",0);
913				return;
914			}
915			if(status==176){
916				var no_ligne = getprop("/instrumentation/garmin196/menu_setup/no_ligne_selected");
917				if(no_ligne==0){
918					setprop("/instrumentation/garmin196/params/filtrage",(getprop("/instrumentation/garmin196/params/filtrage")==0 ? 1 : 0));
919				}
920				if(no_ligne==1){
921					setprop("/instrumentation/garmin196/params/vnav-indicator",(getprop("/instrumentation/garmin196/params/vnav-indicator")==0 ? 1 : 0));
922				}
923				save_parameters();
924				return;
925			}
926
927		}elsif(x==1){
928			#traitement des popup
929			var popup_status = getprop("/instrumentation/garmin196/popup_status");
930			var status = getprop("/instrumentation/garmin196/status");
931			if(popup_status==0){##pas de popup
932				if(status>=10 and status<=39){
933					old_status = status;
934					setprop("/instrumentation/garmin196/status",132);
935					setprop("/instrumentation/garmin196/menu_points/no_ligne_selected",0);
936					var points = props.globals.getNode("/instrumentation/garmin196/waypoints/user/",1).getChildren("wpt");
937					for(var i=size(points)-1;i>=0;i=i-1){
938						if(i<8){
939							props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~(i+1)~"]/id",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id"));
940							props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~(i+1)~"]/latitude",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/latitude"));
941							props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~(i+1)~"]/longitude",1).setValue(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/longitude"));
942						}
943					}
944					init_new_point(0);
945					update_menu_points();
946					#init_list_points();
947				}
948			}
949		}
950	}
951}
952
953var menu = func (x){
954    var serviceable = getprop("/instrumentation/garmin196/serviceable");
955	var status = getprop("/instrumentation/garmin196/status");
956	if(serviceable==1){
957		if(status>=10 and status<100){
958			old_status = status;
959			setprop("/instrumentation/garmin196/status",100);
960			setprop("/instrumentation/garmin196/popup_status",0);
961
962			##particularite map
963			if(status==10){
964				setprop("/instrumentation/garmin196/status",160);
965				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",-1);
966			}
967		}elsif(status>=100){
968			if(old_status>=10){
969				status = old_status;
970			}else{
971				status = 10;
972			}
973			setprop("/instrumentation/garmin196/status",status);
974		}
975	}
976}
977
978var nrst = func (x){
979	var serviceable = getprop("/instrumentation/garmin196/serviceable");
980	var status = getprop("/instrumentation/garmin196/status");
981	if(serviceable==1 and status>1 and status<100){
982		if(x==0){
983			setprop("/instrumentation/garmin196/popup_status",40);
984			display_nrst("airport");
985		}
986	}
987}
988
989var dto = func (x){
990	var serviceable = getprop("/instrumentation/garmin196/serviceable");
991	var status = getprop("/instrumentation/garmin196/status");
992	if(serviceable==1 and status>1 and status<100){
993		if(x==0){
994			setprop("/instrumentation/garmin196/popup_status",10);
995			setprop("/instrumentation/garmin196/dto_display/ligne_select","Press Enter to search");
996			init_dto_display();
997			setprop("/instrumentation/garmin196/dto_display/x_char",0);
998			setprop("/instrumentation/garmin196/dto_display/y_char",0);
999		}
1000	}
1001}
1002
1003var rockerup = func (x){
1004	var serviceable = getprop("/instrumentation/garmin196/serviceable");
1005	if(serviceable==1){
1006		if(x==0){
1007			#traitement des popup
1008			var popup_status = getprop("/instrumentation/garmin196/popup_status");
1009
1010			if(popup_status==1){
1011				var light_level = getprop("/instrumentation/garmin196/light");
1012				light_level = light_level + 0.1;
1013				if(light_level>1){
1014					light_level = 1;
1015				}
1016				setprop("/instrumentation/garmin196/light",light_level);
1017				return;
1018			}
1019
1020			if(popup_status==11){
1021				var y_char = getprop("/instrumentation/garmin196/dto_display/y_char");
1022				y_char = y_char + 1;
1023				if(y_char>35){
1024					y_char = 0;
1025				}
1026				setprop("/instrumentation/garmin196/dto_display/y_char",y_char);
1027				display_dto_search();
1028				return;
1029			}
1030
1031			if(popup_status==12){
1032				var no_ligne = getprop("/instrumentation/garmin196/dto_display/no_ligne_selected");
1033				var old_no_ligne = no_ligne;
1034				no_ligne = no_ligne - 1;
1035				if(no_ligne<0){
1036					no_ligne = 0;
1037				}
1038				setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",no_ligne);
1039				if(old_no_ligne!=no_ligne){
1040					setprop("/instrumentation/garmin196/dto_display/ligne["~no_ligne~"]/selected",1);
1041					setprop("/instrumentation/garmin196/dto_display/ligne["~old_no_ligne~"]/selected",0);
1042				}
1043				return;
1044			}
1045
1046			if(popup_status==20 or popup_status==30){
1047				var no_ligne = getprop("/instrumentation/garmin196/dto_display/no_ligne_selected");
1048				var old_no_ligne = no_ligne;
1049				no_ligne = no_ligne - 1;
1050				if(no_ligne<0){
1051					no_ligne = 0;
1052				}
1053				setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",no_ligne);
1054				setprop("/instrumentation/garmin196/dto_display/ligne_select",getprop("/instrumentation/garmin196/dto_display/ligne["~no_ligne~"]/texte"));
1055				if(old_no_ligne!=no_ligne){
1056					setprop("/instrumentation/garmin196/dto_display/ligne["~no_ligne~"]/selected",1);
1057					setprop("/instrumentation/garmin196/dto_display/ligne["~old_no_ligne~"]/selected",0);
1058				}
1059				return;
1060			}
1061
1062			if(popup_status>=40 and popup_status<=99){
1063				var no_ligne = getprop("/instrumentation/garmin196/nrst_display/no_ligne_selected");
1064				var old_no_ligne = no_ligne;
1065				no_ligne = no_ligne - 1;
1066				if(no_ligne<0){
1067					no_ligne = 0;
1068				}
1069				setprop("/instrumentation/garmin196/nrst_display/no_ligne_selected",no_ligne);
1070				setprop("/instrumentation/garmin196/nrst_display/ligne_select",getprop("/instrumentation/garmin196/nrst_display/ligne["~no_ligne~"]/texte"));
1071				if(old_no_ligne!=no_ligne){
1072					setprop("/instrumentation/garmin196/nrst_display/ligne["~no_ligne~"]/selected",1);
1073					setprop("/instrumentation/garmin196/nrst_display/ligne["~old_no_ligne~"]/selected",0);
1074				}
1075				return;
1076			}
1077
1078			##traitement des menus
1079			var status = getprop("/instrumentation/garmin196/status");
1080			if(status>=100 and status<110){
1081				setprop("/instrumentation/garmin196/status",170);
1082				return;
1083			}
1084
1085			if(status==110){
1086				setprop("/instrumentation/garmin196/status",100);
1087				return;
1088			}
1089
1090			if(status==111){
1091				if(getprop("/instrumentation/garmin196/menu_flights/max_ligne_selected")>=0){
1092					var no_ligne = getprop("/instrumentation/garmin196/menu_flights/no_ligne_selected");
1093					no_ligne = no_ligne - 1;
1094					if(no_ligne<0){
1095						no_ligne = 0;
1096					}
1097					setprop("/instrumentation/garmin196/menu_flights/no_ligne_selected",no_ligne);
1098				}
1099			}
1100
1101			if(status==120){
1102				setprop("/instrumentation/garmin196/status",110);
1103				display_menu_flights();
1104				return;
1105			}
1106
1107			if(status==121){
1108				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
1109				no_ligne = no_ligne - 1;
1110				if(no_ligne<0){
1111					no_ligne = 0;
1112				}
1113				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",no_ligne);
1114				return;
1115			}
1116
1117			if(status==122){
1118				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_detail");
1119				no_ligne = no_ligne - 1;
1120				if(no_ligne<0){
1121					no_ligne = 0;
1122				}
1123				setprop("/instrumentation/garmin196/menu_routes/no_ligne_detail",no_ligne);
1124				return;
1125			}
1126
1127			if(status==123){
1128				var y_char = getprop("/instrumentation/garmin196/menu_routes/search/y_char");
1129				y_char = y_char + 1;
1130				if(y_char>35){
1131					y_char = 0;
1132				}
1133				setprop("/instrumentation/garmin196/menu_routes/search/y_char",y_char);
1134				display_route_waypoint_search();
1135				return;
1136			}
1137
1138			if(status==124){
1139				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected");
1140				no_ligne = no_ligne - 1;
1141				if(no_ligne<0){
1142					no_ligne = 0;
1143				}
1144				setprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected",no_ligne);
1145				return;
1146			}
1147
1148			if(status==130){
1149				setprop("/instrumentation/garmin196/status",120);
1150				init_menu_routes_list();
1151				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",-1);
1152				return;
1153			}
1154
1155			if(status==131){
1156				var no_ligne = getprop("/instrumentation/garmin196/menu_points/no_ligne_selected");
1157				no_ligne = no_ligne - 1;
1158				if(no_ligne<0){
1159					no_ligne = 0;
1160				}
1161				setprop("/instrumentation/garmin196/menu_points/no_ligne_selected",no_ligne);
1162				return;
1163			}
1164
1165			if(status==132){
1166				var y_char = getprop("/instrumentation/garmin196/menu_points/y_char");
1167				y_char = y_char + 1;
1168				if(y_char>35){
1169					y_char = 0;
1170				}
1171				setprop("/instrumentation/garmin196/menu_points/y_char",y_char);
1172				display_menu_points();
1173				return;
1174			}
1175
1176			if(status==133){
1177				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1178				latitude = latitude + 1;
1179				if(latitude>180){
1180					latitude = 180;
1181				}
1182				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1183				display_menu_points();
1184				return;
1185			}
1186
1187			if(status==134){
1188				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1189				latitude = latitude + .01;
1190				if(latitude>180){
1191					latitude = 180;
1192				}
1193				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1194				display_menu_points();
1195				return;
1196			}
1197
1198			if(status==135){
1199				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1200				longitude = longitude + 1;
1201				if(longitude>180){
1202					longitude = -180;
1203				}
1204				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1205				display_menu_points();
1206				return;
1207			}
1208
1209			if(status==136){
1210				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1211				longitude = longitude + .01;
1212				if(longitude>180){
1213					longitude = -180;
1214				}
1215				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1216				display_menu_points();
1217				return;
1218			}
1219
1220			if(status==140){
1221				setprop("/instrumentation/garmin196/status",130);
1222				setprop("/instrumentation/garmin196/menu_points/no_ligne_selected",-1);
1223				init_list_points();
1224				return;
1225			}
1226
1227			if(status==141){
1228				var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
1229				no_ligne = no_ligne - 1;
1230				if(no_ligne<0){
1231					no_ligne = 0;
1232				}
1233				setprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected",no_ligne);
1234				display_list_aircraft();
1235				return;
1236			}
1237
1238			if(status==142){
1239				var y_char = getprop("/instrumentation/garmin196/menu_aircraft/y_char");
1240				y_char = y_char + 1;
1241				if(y_char>35){
1242					y_char = 0;
1243				}
1244				setprop("/instrumentation/garmin196/menu_aircraft/y_char",y_char);
1245				display_menu_aircraft_name();
1246				return;
1247			}
1248
1249			if(status==143){
1250				var cruise = getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise");
1251				cruise = cruise + 1;
1252				if(cruise>500){
1253					cruise = 500;
1254				}
1255				setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise",cruise);
1256				display_menu_aircraft();
1257				return;
1258			}
1259
1260			if(status==144){
1261				var max = getprop("/instrumentation/garmin196/menu_aircraft/selected-max");
1262				max = max + 1;
1263				if(max>500){
1264					max = 500;
1265				}
1266				setprop("/instrumentation/garmin196/menu_aircraft/selected-max",max);
1267				display_menu_aircraft();
1268				return;
1269			}
1270
1271			if(status==145){
1272				var fuelflow = getprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow");
1273				fuelflow = fuelflow + 0.1;
1274				if(fuelflow>100){
1275					fuelflow = 100;
1276				}
1277				setprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow",fuelflow);
1278				return;
1279			}
1280
1281			if(status==150){
1282				setprop("/instrumentation/garmin196/status",140);
1283				setprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected",-1);
1284				init_list_aircraft();
1285				display_list_aircraft();
1286				return;
1287			}
1288
1289			if(status==160){
1290				setprop("/instrumentation/garmin196/status",150);
1291				return;
1292			}
1293
1294			if(status==161){
1295				var no_ligne = getprop("/instrumentation/garmin196/menu_map/no_ligne_selected");
1296				no_ligne = no_ligne - 1;
1297				if(no_ligne<0){
1298					no_ligne = 0;
1299				}
1300				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",no_ligne);
1301				return;
1302			}
1303
1304			if(status==170){
1305				setprop("/instrumentation/garmin196/status",160);
1306				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",-1);
1307				return;
1308			}
1309
1310			if(status==171){
1311				var no_ligne = getprop("/instrumentation/garmin196/menu_setup/no_ligne_selected");
1312				no_ligne = no_ligne - 1;
1313				if(no_ligne<0){
1314					no_ligne = 0;
1315				}
1316				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",no_ligne);
1317				return;
1318			}
1319
1320			if(status==176){
1321				var no_ligne = getprop("/instrumentation/garmin196/menu_setup/no_ligne_selected");
1322				no_ligne = no_ligne - 1;
1323				if(no_ligne<0){
1324					no_ligne = 0;
1325				}
1326				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",no_ligne);
1327				return;
1328			}
1329
1330		}elsif(x==1){
1331			#traitement des popup
1332			var popup_status = getprop("/instrumentation/garmin196/popup_status");
1333			if(popup_status==11){
1334				var y_char = getprop("/instrumentation/garmin196/dto_display/y_char");
1335				y_char = y_char + 10;
1336				if(y_char>35){
1337					y_char = y_char-36;
1338				}
1339				setprop("/instrumentation/garmin196/dto_display/y_char",y_char);
1340				display_dto_search();
1341				return;
1342			}
1343
1344			##traitement des menus
1345			var status = getprop("/instrumentation/garmin196/status");
1346
1347			if(status==123){
1348				var y_char = getprop("/instrumentation/garmin196/menu_routes/search/y_char");
1349				y_char = y_char + 10;
1350				if(y_char>35){
1351					y_char = y_char-36;
1352				}
1353				setprop("/instrumentation/garmin196/menu_routes/search/y_char",y_char);
1354				display_route_waypoint_search();
1355				return;
1356			}
1357
1358			if(status==132){
1359				var y_char = getprop("/instrumentation/garmin196/menu_points/y_char");
1360				y_char = y_char + 10;
1361				if(y_char>35){
1362					y_char = y_char-36;
1363				}
1364				setprop("/instrumentation/garmin196/menu_points/y_char",y_char);
1365				display_menu_points();
1366				return;
1367			}
1368
1369			if(status==133){
1370				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1371				latitude = latitude + 10;
1372				if(latitude>180){
1373					latitude = 180;
1374				}
1375				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1376				display_menu_points();
1377				return;
1378			}
1379
1380			if(status==134){
1381				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1382				latitude = latitude + .1;
1383				if(latitude>180){
1384					latitude = 180;
1385				}
1386				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1387				display_menu_points();
1388				return;
1389			}
1390
1391			if(status==135){
1392				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1393				longitude = longitude + 10;
1394				if(longitude>180){
1395					longitude = -180;
1396				}
1397				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1398				display_menu_points();
1399				return;
1400			}
1401
1402			if(status==136){
1403				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1404				longitude = longitude + .1;
1405				if(longitude>180){
1406					longitude = -180;
1407				}
1408				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1409				display_menu_points();
1410				return;
1411			}
1412
1413			if(status==142){
1414				var y_char = getprop("/instrumentation/garmin196/menu_aircraft/y_char");
1415				y_char = y_char + 10;
1416				if(y_char>35){
1417					y_char = y_char-36;
1418				}
1419				setprop("/instrumentation/garmin196/menu_aircraft/y_char",y_char);
1420				display_menu_aircraft_name();
1421				return;
1422			}
1423
1424			if(status==143){
1425				var cruise = getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise");
1426				cruise = cruise + 10;
1427				if(cruise>500){
1428					cruise = 500;
1429				}
1430				setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise",cruise);
1431				display_menu_aircraft();
1432				return;
1433			}
1434
1435			if(status==144){
1436				var max = getprop("/instrumentation/garmin196/menu_aircraft/selected-max");
1437				max = max + 10;
1438				if(max>500){
1439					max = 500;
1440				}
1441				setprop("/instrumentation/garmin196/menu_aircraft/selected-max",max);
1442				display_menu_aircraft();
1443				return;
1444			}
1445
1446			if(status==145){
1447				var fuelflow = getprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow");
1448				fuelflow = fuelflow + 1;
1449				if(fuelflow>100){
1450					fuelflow = 100;
1451				}
1452				setprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow",fuelflow);
1453				return;
1454			}
1455		}
1456	}
1457}
1458
1459var rockerdown = func (x){
1460	var serviceable = getprop("/instrumentation/garmin196/serviceable");
1461	if(serviceable==1){
1462		if(x==0){
1463			#traitement des popup
1464			var popup_status = getprop("/instrumentation/garmin196/popup_status");
1465			if(popup_status==1){
1466				var light_level = getprop("/instrumentation/garmin196/light");
1467				light_level = light_level - 0.1;
1468				if(light_level<0){
1469					light_level = 0;
1470				}
1471				setprop("/instrumentation/garmin196/light",light_level);
1472				return;
1473			}
1474
1475			if(popup_status==11){
1476				var y_char = getprop("/instrumentation/garmin196/dto_display/y_char");
1477				y_char = y_char - 1;
1478				if(y_char<0){
1479					y_char = 35;
1480				}
1481				setprop("/instrumentation/garmin196/dto_display/y_char",y_char);
1482				display_dto_search();
1483				return;
1484			}
1485
1486			if(popup_status==12){
1487				var no_ligne = getprop("/instrumentation/garmin196/dto_display/no_ligne_selected");
1488				var old_no_ligne = no_ligne;
1489				var max_ligne = getprop("/instrumentation/garmin196/dto_display/max_ligne_selected");
1490				no_ligne = no_ligne + 1;
1491				if(no_ligne>max_ligne){
1492					no_ligne = max_ligne;
1493				}
1494				setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",no_ligne);
1495				if(old_no_ligne!=no_ligne){
1496					setprop("/instrumentation/garmin196/dto_display/ligne["~no_ligne~"]/selected",1);
1497					setprop("/instrumentation/garmin196/dto_display/ligne["~old_no_ligne~"]/selected",0);
1498				}
1499				return;
1500			}
1501
1502			if(popup_status==20 or popup_status==30){
1503				var no_ligne = getprop("/instrumentation/garmin196/dto_display/no_ligne_selected");
1504				var old_no_ligne = no_ligne;
1505				var max_ligne = getprop("/instrumentation/garmin196/dto_display/max_ligne_selected");
1506				no_ligne = no_ligne + 1;
1507				if(no_ligne>max_ligne){
1508					no_ligne = max_ligne;
1509				}
1510				setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",no_ligne);
1511				setprop("/instrumentation/garmin196/dto_display/ligne_select",getprop("/instrumentation/garmin196/dto_display/ligne["~no_ligne~"]/texte"));
1512				if(old_no_ligne!=no_ligne){
1513					setprop("/instrumentation/garmin196/dto_display/ligne["~no_ligne~"]/selected",1);
1514					setprop("/instrumentation/garmin196/dto_display/ligne["~old_no_ligne~"]/selected",0);
1515				}
1516				return;
1517			}
1518
1519			if(popup_status>=40 and popup_status<=99){
1520				var no_ligne = getprop("/instrumentation/garmin196/nrst_display/no_ligne_selected");
1521				var old_no_ligne = no_ligne;
1522				var max_ligne = getprop("/instrumentation/garmin196/nrst_display/max_ligne_selected");
1523				no_ligne = no_ligne + 1;
1524				if(no_ligne>max_ligne){
1525					no_ligne = max_ligne;
1526				}
1527				setprop("/instrumentation/garmin196/nrst_display/no_ligne_selected",no_ligne);
1528				setprop("/instrumentation/garmin196/nrst_display/ligne_select",getprop("/instrumentation/garmin196/nrst_display/ligne["~no_ligne~"]/texte"));
1529				if(old_no_ligne!=no_ligne){
1530					setprop("/instrumentation/garmin196/nrst_display/ligne["~no_ligne~"]/selected",1);
1531					setprop("/instrumentation/garmin196/nrst_display/ligne["~old_no_ligne~"]/selected",0);
1532				}
1533				return;
1534			}
1535
1536			##traitement des menus
1537			var status = getprop("/instrumentation/garmin196/status");
1538			if(status>=100 and status<110){
1539				setprop("/instrumentation/garmin196/status",110);
1540				display_menu_flights();
1541				return;
1542			}
1543
1544			if(status==110){
1545				setprop("/instrumentation/garmin196/status",120);
1546				init_menu_routes_list();
1547				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",-1);
1548				return;
1549			}
1550
1551			if(status==111){
1552				if(getprop("/instrumentation/garmin196/menu_flights/max_ligne_selected")>=0){
1553					var no_ligne = getprop("/instrumentation/garmin196/menu_flights/no_ligne_selected");
1554					no_ligne = no_ligne + 1;
1555					if(no_ligne>getprop("/instrumentation/garmin196/menu_flights/max_ligne_selected")){
1556						no_ligne = getprop("/instrumentation/garmin196/menu_flights/max_ligne_selected");
1557					}
1558					setprop("/instrumentation/garmin196/menu_flights/no_ligne_selected",no_ligne);
1559				}
1560				return;
1561			}
1562
1563			if(status==120){
1564				setprop("/instrumentation/garmin196/status",130);
1565				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",-1);
1566				init_list_points();
1567				return;
1568			}
1569
1570			if(status==121){
1571				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
1572				var max_no_ligne = getprop("/instrumentation/garmin196/menu_routes/max_no_ligne");
1573				no_ligne = no_ligne + 1;
1574				if(no_ligne>max_no_ligne){
1575					no_ligne = max_no_ligne;
1576				}
1577				setprop("/instrumentation/garmin196/menu_routes/no_ligne_selected",no_ligne);
1578				return;
1579			}
1580
1581			if(status==122){
1582				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_detail");
1583				var max_no_ligne = getprop("/instrumentation/garmin196/menu_routes/max_no_ligne_detail");
1584				no_ligne = no_ligne + 1;
1585				if(no_ligne>max_no_ligne){
1586					no_ligne = max_no_ligne;
1587				}
1588				setprop("/instrumentation/garmin196/menu_routes/no_ligne_detail",no_ligne);
1589				return;
1590			}
1591
1592			if(status==123){
1593				var y_char = getprop("/instrumentation/garmin196/menu_routes/search/y_char");
1594				y_char = y_char - 1;
1595				if(y_char<0){
1596					y_char = 35;
1597				}
1598				setprop("/instrumentation/garmin196/menu_routes/search/y_char",y_char);
1599				display_route_waypoint_search();
1600				return;
1601			}
1602
1603			if(status==124){
1604				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected");
1605				var max_no_ligne = getprop("/instrumentation/garmin196/menu_routes/search/max_ligne_selected");
1606				no_ligne = no_ligne + 1;
1607				if(no_ligne>max_no_ligne){
1608					no_ligne = max_no_ligne;
1609				}
1610				setprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected",no_ligne);
1611				return;
1612			}
1613
1614			if(status==130){
1615				setprop("/instrumentation/garmin196/status",140);
1616				setprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected",-1);
1617				init_list_aircraft();
1618				display_list_aircraft();
1619				return;
1620			}
1621
1622			if(status==131){
1623				var no_ligne = getprop("/instrumentation/garmin196/menu_points/no_ligne_selected");
1624				no_ligne = no_ligne + 1;
1625				if(no_ligne>getprop("/instrumentation/garmin196/menu_points/max_no_ligne")){
1626					no_ligne = getprop("/instrumentation/garmin196/menu_points/max_no_ligne");
1627				}
1628				setprop("/instrumentation/garmin196/menu_points/no_ligne_selected",no_ligne);
1629				return;
1630			}
1631
1632			if(status==132){
1633				var y_char = getprop("/instrumentation/garmin196/menu_points/y_char");
1634				y_char = y_char - 1;
1635				if(y_char<0){
1636					y_char = 35;
1637				}
1638				setprop("/instrumentation/garmin196/menu_points/y_char",y_char);
1639				display_menu_points();
1640				return;
1641			}
1642
1643			if(status==133){
1644				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1645				latitude = latitude - 1;
1646				if(latitude<-180){
1647					latitude = -180;
1648				}
1649				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1650				display_menu_points();
1651				return;
1652			}
1653
1654			if(status==134){
1655				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1656				latitude = latitude - .01;
1657				if(latitude<-180){
1658					latitude = -180;
1659				}
1660				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1661				display_menu_points();
1662				return;
1663			}
1664
1665			if(status==135){
1666				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1667				longitude = longitude - 1;
1668				if(longitude<-180){
1669					longitude = 180;
1670				}
1671				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1672				display_menu_points();
1673				return;
1674			}
1675
1676			if(status==136){
1677				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1678				longitude = longitude - .01;
1679				if(longitude<-180){
1680					longitude = 180;
1681				}
1682				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1683				display_menu_points();
1684				return;
1685			}
1686
1687			if(status==140){
1688				setprop("/instrumentation/garmin196/status",150);
1689				return;
1690			}
1691
1692			if(status==141){
1693				var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
1694				no_ligne = no_ligne + 1;
1695				if(no_ligne>getprop("/instrumentation/garmin196/menu_aircraft/max_no_ligne")){
1696					no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/max_no_ligne");
1697				}
1698				setprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected",no_ligne);
1699				display_list_aircraft();
1700				return;
1701			}
1702
1703			if(status==142){
1704				var y_char = getprop("/instrumentation/garmin196/menu_aircraft/y_char");
1705				y_char = y_char - 1;
1706				if(y_char<0){
1707					y_char = 35;
1708				}
1709				setprop("/instrumentation/garmin196/menu_aircraft/y_char",y_char);
1710				display_menu_aircraft_name();
1711				return;
1712			}
1713
1714			if(status==143){
1715				var cruise = getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise");
1716				cruise = cruise - 1;
1717				if(cruise<1){
1718					cruise = 1;
1719				}
1720				setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise",cruise);
1721				display_menu_aircraft();
1722				return;
1723			}
1724
1725			if(status==144){
1726				var max = getprop("/instrumentation/garmin196/menu_aircraft/selected-max");
1727				max = max - 1;
1728				if(max<1){
1729					max = 1;
1730				}
1731				setprop("/instrumentation/garmin196/menu_aircraft/selected-max",max);
1732				display_menu_aircraft();
1733				return;
1734			}
1735
1736			if(status==145){
1737				var fuelflow = getprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow");
1738				fuelflow = fuelflow - 0.1;
1739				if(fuelflow<1){
1740					fuelflow = 1;
1741				}
1742				setprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow",fuelflow);
1743				return;
1744			}
1745
1746			if(status==150){
1747				setprop("/instrumentation/garmin196/status",160);
1748				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",-1);
1749				return;
1750			}
1751
1752			if(status==160){
1753				setprop("/instrumentation/garmin196/status",170);
1754				return;
1755			}
1756
1757			if(status==161){
1758				var no_ligne = getprop("/instrumentation/garmin196/menu_map/no_ligne_selected");
1759				no_ligne = no_ligne + 1;
1760				if(no_ligne>5){
1761					no_ligne = 5;
1762				}
1763				setprop("/instrumentation/garmin196/menu_map/no_ligne_selected",no_ligne);
1764				return;
1765			}
1766
1767			if(status==170){
1768				setprop("/instrumentation/garmin196/status",100);
1769				return;
1770			}
1771
1772			if(status==171){
1773				var no_ligne = getprop("/instrumentation/garmin196/menu_setup/no_ligne_selected");
1774				no_ligne = no_ligne + 1;
1775				if(no_ligne>5){
1776					no_ligne = 5;
1777				}
1778				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",no_ligne);
1779				return;
1780			}
1781
1782			if(status==176){
1783				var no_ligne = getprop("/instrumentation/garmin196/menu_setup/no_ligne_selected");
1784				no_ligne = no_ligne + 1;
1785				if(no_ligne>1){
1786					no_ligne = 1;
1787				}
1788				setprop("/instrumentation/garmin196/menu_setup/no_ligne_selected",no_ligne);
1789				return;
1790			}
1791
1792		}elsif(x==1){
1793			#traitement des popup
1794			var popup_status = getprop("/instrumentation/garmin196/popup_status");
1795			if(popup_status==11){
1796				var y_char = getprop("/instrumentation/garmin196/dto_display/y_char");
1797				y_char = y_char - 10;
1798				if(y_char<0){
1799					y_char = y_char + 36;
1800				}
1801				setprop("/instrumentation/garmin196/dto_display/y_char",y_char);
1802				display_dto_search();
1803				return;
1804			}
1805
1806			##traitement des menus
1807			var status = getprop("/instrumentation/garmin196/status");
1808
1809			if(status==123){
1810				var y_char = getprop("/instrumentation/garmin196/menu_routes/search/y_char");
1811				y_char = y_char - 10;
1812				if(y_char<0){
1813					y_char = y_char + 36;
1814				}
1815				setprop("/instrumentation/garmin196/menu_routes/search/y_char",y_char);
1816				display_route_waypoint_search();
1817				return;
1818			}
1819
1820			if(status==132){
1821				var y_char = getprop("/instrumentation/garmin196/menu_points/y_char");
1822				y_char = y_char - 10;
1823				if(y_char<0){
1824					y_char = y_char + 36;
1825				}
1826				setprop("/instrumentation/garmin196/menu_points/y_char",y_char);
1827				display_menu_points();
1828				return;
1829			}
1830
1831			if(status==132){
1832				var y_char = getprop("/instrumentation/garmin196/menu_points/y_char");
1833				y_char = y_char - 1;
1834				if(y_char<0){
1835					y_char = 35;
1836				}
1837				setprop("/instrumentation/garmin196/menu_points/y_char",y_char);
1838				display_menu_points();
1839				return;
1840			}
1841
1842			if(status==133){
1843				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1844				latitude = latitude - 10;
1845				if(latitude<-180){
1846					latitude = -180;
1847				}
1848				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1849				display_menu_points();
1850				return;
1851			}
1852
1853			if(status==134){
1854				var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
1855				latitude = latitude - .1;
1856				if(latitude<-180){
1857					latitude = -180;
1858				}
1859				setprop("/instrumentation/garmin196/menu_points/latitude",latitude);
1860				display_menu_points();
1861				return;
1862			}
1863
1864			if(status==135){
1865				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1866				longitude = longitude - 10;
1867				if(longitude<-180){
1868					longitude = 180;
1869				}
1870				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1871				display_menu_points();
1872				return;
1873			}
1874
1875			if(status==136){
1876				var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
1877				longitude = longitude - .1;
1878				if(longitude<-180){
1879					longitude = 180;
1880				}
1881				setprop("/instrumentation/garmin196/menu_points/longitude",longitude);
1882				display_menu_points();
1883				return;
1884			}
1885
1886			if(status==142){
1887				var y_char = getprop("/instrumentation/garmin196/menu_aircraft/y_char");
1888				y_char = y_char - 10;
1889				if(y_char<0){
1890					y_char = y_char + 36;
1891				}
1892				setprop("/instrumentation/garmin196/menu_aircraft/y_char",y_char);
1893				display_menu_aircraft_name();
1894				return;
1895			}
1896
1897			if(status==143){
1898				var cruise = getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise");
1899				cruise = cruise - 10;
1900				if(cruise<1){
1901					cruise = 1;
1902				}
1903				setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise",cruise);
1904				display_menu_aircraft();
1905				return;
1906			}
1907
1908			if(status==144){
1909				var max = getprop("/instrumentation/garmin196/menu_aircraft/selected-max");
1910				max = max - 10;
1911				if(max<1){
1912					max = 1;
1913				}
1914				setprop("/instrumentation/garmin196/menu_aircraft/selected-max",max);
1915				display_menu_aircraft();
1916				return;
1917			}
1918
1919			if(status==145){
1920				var fuelflow = getprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow");
1921				fuelflow = fuelflow - 1;
1922				if(fuelflow<1){
1923					fuelflow = 1;
1924				}
1925				setprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow",fuelflow);
1926				return;
1927			}
1928		}
1929	}
1930}
1931
1932var rockerleft = func (x){
1933	var serviceable = getprop("/instrumentation/garmin196/serviceable");
1934	if(serviceable==1){
1935		if(x==0){
1936			#traitement des popup
1937			var popup_status = getprop("/instrumentation/garmin196/popup_status");
1938			if(popup_status==10){
1939				setprop("/instrumentation/garmin196/popup_status",30);
1940				setprop("/instrumentation/garmin196/dto_display/ligne_select","");
1941				init_dto_display();
1942				display_dto_user();
1943				return;
1944			}
1945			if(popup_status==11){
1946				var x_char = getprop("/instrumentation/garmin196/dto_display/x_char");
1947				if(x_char>0){
1948					setprop("/instrumentation/garmin196/dto_display/x_char",x_char-1);
1949					setprop("/instrumentation/garmin196/dto_display/y_char",searchLastChar(getprop("/instrumentation/garmin196/dto_display/ligne_select"),getprop("/instrumentation/garmin196/dto_display/x_char")));
1950					display_dto_search();
1951				}
1952				return;
1953			}
1954			if(popup_status==20){
1955				setprop("/instrumentation/garmin196/popup_status",10);
1956				setprop("/instrumentation/garmin196/dto_display/x_char",0);
1957				setprop("/instrumentation/garmin196/dto_display/y_char",0);
1958				setprop("/instrumentation/garmin196/dto_display/ligne_select","Press Enter to search");
1959				init_dto_display();
1960				return;
1961			}
1962			if(popup_status==30){
1963				setprop("/instrumentation/garmin196/popup_status",20);
1964				setprop("/instrumentation/garmin196/dto_display/ligne_select","");
1965				init_dto_display();
1966				display_dto_recent();
1967				return;
1968			}
1969
1970			if(popup_status==40){
1971				setprop("/instrumentation/garmin196/popup_status",80);
1972				display_nrst("wpt");
1973				return;
1974			}
1975
1976			if(popup_status==50){
1977				setprop("/instrumentation/garmin196/popup_status",40);
1978				display_nrst("airport");
1979				return;
1980			}
1981
1982			if(popup_status==60){
1983				setprop("/instrumentation/garmin196/popup_status",50);
1984				display_nrst("vor");
1985				return;
1986			}
1987
1988			if(popup_status==70){
1989				setprop("/instrumentation/garmin196/popup_status",60);
1990				display_nrst("ndb");
1991				return;
1992			}
1993
1994			if(popup_status==80){
1995				setprop("/instrumentation/garmin196/popup_status",70);
1996				display_nrst("fix");
1997				return;
1998			}
1999
2000			var status = getprop("/instrumentation/garmin196/status");
2001
2002			##menu routes
2003			#suppression de la ligne
2004			if(status==121){
2005				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
2006				delete_route(no_ligne);
2007				init_menu_routes_list();
2008			}
2009
2010			if(status==122){
2011				var no_ligne_liste = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
2012				var no_ligne_detail = getprop("/instrumentation/garmin196/menu_routes/no_ligne_detail");
2013				delete_route_detail(no_ligne_liste,no_ligne_detail);
2014				update_menu_routes_detail();
2015				return;
2016			}
2017
2018			if(status==123){
2019				var x_char = getprop("/instrumentation/garmin196/menu_routes/search/x_char");
2020				if(x_char>0){
2021					setprop("/instrumentation/garmin196/menu_routes/search/x_char",x_char-1);
2022					setprop("/instrumentation/garmin196/menu_routes/search/y_char",searchLastChar(getprop("/instrumentation/garmin196/menu_routes/search/ligne_select"),getprop("/instrumentation/garmin196/menu_routes/search/x_char")));
2023					display_route_waypoint_search();
2024				}
2025				return;
2026			}
2027
2028			##menu points
2029			#suppression de la ligne
2030			if(status==131){
2031				var no_ligne = getprop("/instrumentation/garmin196/menu_points/no_ligne_selected");
2032				delete_point(no_ligne);
2033				init_list_points();
2034			}
2035
2036			if(status==132){
2037				var x_char = getprop("/instrumentation/garmin196/menu_points/x_char");
2038				if(x_char>0){
2039					setprop("/instrumentation/garmin196/menu_points/x_char",x_char-1);
2040					setprop("/instrumentation/garmin196/menu_points/y_char",searchLastChar(getprop("/instrumentation/garmin196/menu_points/name"),getprop("/instrumentation/garmin196/menu_points/x_char")));
2041					display_menu_points();
2042				}
2043				return;
2044			}
2045
2046			##menu aircraft
2047			#suppression de la ligne
2048			if(status==141){
2049				var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
2050				delete_aircraft(no_ligne);
2051				init_list_aircraft();
2052				display_list_aircraft();
2053			}
2054
2055			if(status==142){
2056				var x_char = getprop("/instrumentation/garmin196/menu_aircraft/x_char");
2057				if(x_char>0){
2058					setprop("/instrumentation/garmin196/menu_aircraft/x_char",x_char-1);
2059					setprop("/instrumentation/garmin196/menu_aircraft/y_char",searchLastChar(getprop("/instrumentation/garmin196/menu_aircraft/selected-name"),getprop("/instrumentation/garmin196/menu_aircraft/x_char")));
2060					display_menu_aircraft_name();
2061				}
2062				return;
2063			}
2064
2065			if(status==175){
2066				setprop("/instrumentation/garmin196/status",170);
2067			}
2068
2069		}
2070	}
2071}
2072
2073var rockerright = func (x){
2074	var serviceable = getprop("/instrumentation/garmin196/serviceable");
2075	if(serviceable==1){
2076		if(x==0){
2077			#traitement des popup
2078			var popup_status = getprop("/instrumentation/garmin196/popup_status");
2079			if(popup_status==10){
2080				setprop("/instrumentation/garmin196/popup_status",20);
2081				setprop("/instrumentation/garmin196/dto_display/ligne_select","");
2082				init_dto_display();
2083				display_dto_recent();
2084				return;
2085			}
2086			if(popup_status==11){
2087				var x_char = getprop("/instrumentation/garmin196/dto_display/x_char");
2088				if(x_char<20){
2089					setprop("/instrumentation/garmin196/dto_display/x_char",x_char+1);
2090					display_dto_search();
2091				}
2092				return;
2093			}
2094			if(popup_status==20){
2095				setprop("/instrumentation/garmin196/popup_status",30);
2096				setprop("/instrumentation/garmin196/dto_display/ligne_select","");
2097				init_dto_display();
2098				display_dto_user();
2099				return;
2100			}
2101			if(popup_status==30){
2102				setprop("/instrumentation/garmin196/popup_status",10);
2103				setprop("/instrumentation/garmin196/dto_display/ligne_select","Press Enter to search");
2104				init_dto_display();
2105				setprop("/instrumentation/garmin196/dto_display/x_char",0);
2106				setprop("/instrumentation/garmin196/dto_display/y_char",0);
2107				return;
2108			}
2109
2110			if(popup_status==40){
2111				setprop("/instrumentation/garmin196/popup_status",50);
2112				display_nrst("vor");
2113				return;
2114			}
2115
2116			if(popup_status==50){
2117				setprop("/instrumentation/garmin196/popup_status",60);
2118				display_nrst("ndb");
2119				return;
2120			}
2121
2122			if(popup_status==60){
2123				setprop("/instrumentation/garmin196/popup_status",70);
2124				display_nrst("fix");
2125				return;
2126			}
2127
2128			if(popup_status==70){
2129				setprop("/instrumentation/garmin196/popup_status",80);
2130				display_nrst("wpt");
2131				return;
2132			}
2133
2134			if(popup_status==80){
2135				setprop("/instrumentation/garmin196/popup_status",40);
2136				display_nrst("airport");
2137				return;
2138			}
2139
2140			var status = getprop("/instrumentation/garmin196/status");
2141
2142			##menu routes
2143			if(status==121){
2144				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
2145				if(getprop("/instrumentation/garmin196/routes/route["~no_ligne~"]/name")!=nil){
2146					load_flight_plan(no_ligne);
2147					affiche_fpl_loaded();
2148				}
2149				return;
2150			}
2151
2152			if(status==122){
2153				var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
2154				var no_ligne_detail = getprop("/instrumentation/garmin196/menu_routes/no_ligne_detail");
2155				if(getprop("/instrumentation/garmin196/routes/route["~no_ligne~"]/wpts/wpt["~no_ligne_detail~"]/id")!=nil){
2156					jump_to_waypoint(no_ligne_detail);
2157					affiche_waypoint_jump();
2158				}
2159				return;
2160			}
2161
2162			if(status==123){
2163				var x_char = getprop("/instrumentation/garmin196/menu_routes/search/x_char");
2164				if(x_char<20){
2165					setprop("/instrumentation/garmin196/menu_routes/search/x_char",x_char+1);
2166					display_route_waypoint_search();
2167				}
2168				return;
2169			}
2170
2171			##menu points
2172			if(status==132){
2173				var x_char = getprop("/instrumentation/garmin196/menu_points/x_char");
2174				if(x_char<20){
2175					setprop("/instrumentation/garmin196/menu_points/x_char",x_char+1);
2176					display_menu_points();
2177				}
2178				return;
2179			}
2180
2181			##menu aircraft
2182			if(status==142){
2183				var x_char = getprop("/instrumentation/garmin196/menu_aircraft/x_char");
2184				if(x_char<20){
2185					setprop("/instrumentation/garmin196/menu_aircraft/x_char",x_char+1);
2186					display_menu_aircraft_name();
2187				}
2188				return;
2189			}
2190
2191			if(status==170){
2192				setprop("/instrumentation/garmin196/status",175);
2193			}
2194
2195		}
2196	}
2197}
2198
2199##recalc speed to display
2200var change_speed_display = func{
2201	var max_speed = getprop("/instrumentation/garmin196/max-speed");
2202	var speed = getprop("/instrumentation/gps/indicated-ground-speed-kt");
2203	setprop("/instrumentation/garmin196/speed-display",315*speed/max_speed);
2204}
2205
2206##calcul du turn rate
2207var calcul_turn_rate = func(dt){
2208	if(last_bearing==-1){
2209		last_bearing = getprop("/instrumentation/gps/magnetic-bug-error-deg");
2210	}
2211	bearing = getprop("/instrumentation/gps/magnetic-bug-error-deg");
2212
2213	var turn_rate = abs(bearing - last_bearing);
2214	if(turn_rate>180){
2215		turn_rate = 360 - turn_rate;
2216 	}
2217	var sgn = 1;
2218	if(bearing - last_bearing<0){
2219		sgn = -1;
2220	}
2221	turn_rate = turn_rate/dt;
2222	if(turn_rate<10){##pour enlever les valeurs aberentes
2223		props.globals.getNode("/instrumentation/garmin196/turn-rate",1).setDoubleValue(sgn*turn_rate);
2224	}
2225	last_bearing = bearing;
2226}
2227
2228var change_wpt_id = func{
2229	if(getprop("/instrumentation/gps/mode")!=nil and getprop("/autopilot/route-manager/wp[0]/id")!=""){
2230		props.global.getNode("/instrumentation/garmin196/panel-wpt-id").alias("/autopilot/route-manager/wp[0]/id");
2231	}else{
2232		setprop("/instrumentation/garmin196/panel-wpt-id",getprop("/instrumentation/garmin196/panel-wpt-dto-id"));
2233	}
2234}
2235setlistener("/instrumentation/gps/mode",change_wpt_id);
2236
2237var change_position_wpt_bug = func{
2238	var wpt_bearing = getprop("/instrumentation/gps/wp/wp[1]/bearing-mag-deg");
2239	var aircraft_bearing = getprop("/instrumentation/gps/indicated-track-magnetic-deg");
2240
2241	var diff = wpt_bearing - aircraft_bearing;
2242	setprop("/instrumentation/garmin196/position-wpt-bearing",diff);
2243	setprop("/instrumentation/garmin196/panel-wpt-bearing",diff);
2244
2245	var nb_wpt = getprop("/autopilot/route-manager/route/num");
2246	var no_wpt = getprop("/autopilot/route-manager/current-wp");
2247	var panel_course = 0;
2248	if(no_wpt>0 and no_wpt<(nb_wpt-1)){
2249		panel_course = getprop("/autopilot/route-manager/route/wp["~(no_wpt-1)~"]/leg-bearing-true-deg");
2250	}else{
2251		panel_course = getprop("/instrumentation/gps/wp/wp[1]/bearing-mag-deg");
2252	}
2253	panel_course = panel_course - aircraft_bearing;
2254	var panel_deflexion = diff - panel_course;
2255
2256	if(math.cos(diff*math.pi/180)>0){
2257		setprop("/instrumentation/garmin196/panel-neddle-to-flag",1);
2258	}else{
2259		setprop("/instrumentation/garmin196/panel-neddle-to-flag",0);
2260	}
2261	if(panel_deflexion>10){
2262		panel_deflexion = 10;
2263	}
2264	if(panel_deflexion<-10){
2265		panel_deflexion = -10;
2266	}
2267
2268	setprop("/instrumentation/garmin196/panel-neddle-course",panel_course);
2269	setprop("/instrumentation/garmin196/panel-neddle-deflexion",panel_deflexion);
2270
2271	##vnav
2272	var altitude_id = getprop("/instrumentation/garmin196/vnav/altitude-m");
2273	var latitude_id = getprop("/instrumentation/garmin196/vnav/latitude");
2274	var longitude_id = getprop("/instrumentation/garmin196/vnav/longitude");
2275	if(altitude_id!=nil and latitude_id!=nil and longitude_id!=nil and latitude_id!=-9999 and longitude_id!=-9999 and getprop("/instrumentation/garmin196/params/vnav-indicator")==1){
2276		var altitude_aircraft = getprop("/instrumentation/gps/indicated-altitude-ft") * 0.3048;
2277		var latitude_aircraft = getprop("/instrumentation/gps/indicated-latitude-deg");
2278		var longitude_aircraft = getprop("/instrumentation/gps/indicated-longitude-deg");
2279
2280		var coord_id = geo.Coord.new().set_latlon(latitude_id,longitude_id);
2281		var coord_aircraft = geo.Coord.new().set_latlon(latitude_aircraft,longitude_aircraft);
2282		var distance = coord_aircraft.distance_to(coord_id);## en metres
2283		var diff_altitude = altitude_aircraft - altitude_id;
2284		var angle = math.atan2(diff_altitude,distance)*180/math.pi;
2285		#setprop("/instrumentation/garmin196/vnav/angle",angle);
2286		var deviation = angle - 3;#pente ideale = 3 degres
2287		if(deviation>10){
2288			deviation = 10;
2289		}
2290		if(deviation<-10){
2291			deviation = -10;
2292		}
2293		setprop("/instrumentation/garmin196/vnav/deviation",deviation);
2294	}else{
2295		setprop("/instrumentation/garmin196/vnav/deviation",0);
2296	}
2297}
2298
2299var update_map = func{
2300	##protection, une seule recherche gps a la fois, la popup devient prioritaire
2301	var popup_status = getprop("/instrumentation/garmin196/popup_status");
2302	if(popup_status<10 or popup_status>99){
2303		var max_plots = 25;
2304		var offset_mul = 0.034;
2305		var symbol_map_range = getprop("/instrumentation/garmin196/map-range") * 8;
2306		var plots = [];
2307		var type_symbol = [ "airport" , "vor" , "ndb" , "fix" , "twn" , "wpt"];
2308
2309		for(var i=0;i<size(type_symbol);i=i+1){
2310			if(getprop("/instrumentation/garmin196/symbols/params/"~type_symbol[i])==1){
2311				if(type_symbol[i]=="twn" or type_symbol[i]=="wpt"){
2312					props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(max_plots*8 + 1);
2313				}else{
2314					props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(max_plots*4 + 1);
2315				}
2316				props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2317				props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2318				var type = type_symbol[i];
2319				if(type == "twn"){
2320					type = "wpt";
2321				}
2322				setprop("/instrumentation/gps/scratch/type", type);
2323				setprop("/instrumentation/gps/command", "nearest");
2324
2325				while (getprop('/instrumentation/gps/scratch/has-next')) {
2326					var id = getprop('/instrumentation/gps/scratch/ident');
2327					var range = getprop('/instrumentation/gps/scratch/distance-nm') / symbol_map_range;
2328					var bearing = 360 - getprop("/instrumentation/gps/indicated-track-magnetic-deg") + getprop('/instrumentation/gps/scratch/mag-bearing-deg');
2329					if(bearing<0){
2330						bearing = bearing + 360;
2331					}
2332
2333					if(bearing>360){
2334						bearing = bearing - 360;
2335					}
2336
2337					if(i==1){##vor
2338						id = id ~ " " ~ sprintf("%2.2f",getprop('/instrumentation/gps/scratch/frequency-mhz'));
2339					}
2340
2341					if(i==2){##ndb
2342						id = id ~ " " ~ sprintf("%2.1f",getprop('/instrumentation/gps/scratch/frequency-khz'));
2343					}
2344
2345					var plot = { id: id,bearing: bearing,type: i,range: range};
2346					if(range<=1){
2347						if(i<4){
2348							append(plots,plot);
2349						}elsif(i==4 and substr(id,size(id)-6)=="WPTTWN"){
2350							append(plots,plot);
2351						}elsif(i==5 and substr(id,size(id)-6)=="WPTUSR"){
2352							append(plots,plot);
2353						}
2354					}else{
2355						break;
2356					}
2357					setprop("/instrumentation/gps/command", "next");
2358				}
2359			}
2360		}
2361
2362		var plots_sorted = sort (plots, func (a,b) a.range - b.range);
2363
2364		##suppression des points les plus proches si il y en a de trop
2365		var filtrage = getprop("/instrumentation/garmin196/params/filtrage");
2366		if(filtrage==1){
2367			var nb_points = 0;
2368			for(var i=0;i<size(plots_sorted);i=i+1){
2369				if(plots_sorted[i].range<0.25){#un quart d'ecran
2370					nb_points = nb_points + 1;
2371				}else{
2372					break;
2373				}
2374			}
2375			if(nb_points>5){
2376				plots_sorted = subvec(plots_sorted,nb_points);
2377			}
2378		}
2379
2380		var nb_plots = max_plots;
2381		if(nb_plots>size(plots_sorted)){
2382			nb_plots = size(plots_sorted);
2383		}
2384		for(var i=0;i<nb_plots;i=i+1){
2385			if(plots_sorted[i].type==4 or plots_sorted[i].type==5){##town or waypoint
2386				var type_wpt = substr(plots_sorted[i].id,size(plots_sorted[i].id)-6);
2387				if(type_wpt=="WPTTWN"){#cities
2388					plots_sorted[i].id = substr(plots_sorted[i].id,0,size(plots_sorted[i].id)-8);
2389				}elsif(type_wpt=="WPTUSR"){#wpt user
2390					plots_sorted[i].id = substr(plots_sorted[i].id,0,size(plots_sorted[i].id)-6);
2391					plots_sorted[i].type = 5;
2392				}
2393			}
2394
2395			props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/id",1).setValue(plots_sorted[i].id);
2396			props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/type",1).setValue(plots_sorted[i].type);
2397
2398			##calcul des coordonnees
2399			var x_wp = math.cos(plots_sorted[i].bearing*math.pi/180) * plots_sorted[i].range * offset_mul;
2400			var y_wp = math.sin(plots_sorted[i].bearing*math.pi/180) * plots_sorted[i].range * offset_mul;
2401			props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/x",1).setDoubleValue(x_wp);
2402			props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/y",1).setDoubleValue(y_wp);
2403
2404			if(x_wp<0.026 and x_wp>-0.026 and y_wp<0.0323 and y_wp>-0.0323){##si on est dans l'ecran, on affiche
2405				props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/visible",1).setBoolValue(1);
2406			}else{
2407				props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/visible",1).setBoolValue(0);
2408			}
2409		}
2410
2411		for(var i=nb_plots;i<max_plots;i=i+1){
2412			props.globals.getNode("/instrumentation/garmin196/symbols/symbol["~i~"]/visible",1).setIntValue(0);
2413		}
2414
2415		##wpt path calculations
2416		var offset_range_wp_direct = 0.19;
2417		var range_wp_direct = offset_range_wp_direct * getprop("/instrumentation/gps/wp/wp[1]/distance-nm") / symbol_map_range;
2418
2419		var bearing_wp_direct = getprop("/instrumentation/garmin196/panel-wpt-bearing");
2420		var x_range_wp_direct = math.abs(math.cos(bearing_wp_direct*math.pi/180) * range_wp_direct); #max 0.15
2421		if(x_range_wp_direct>0.15){
2422			range_wp_direct = math.abs(0.15 / math.cos(bearing_wp_direct*math.pi/180));
2423		}
2424		var y_range_wp_direct = math.abs(math.sin(bearing_wp_direct*math.pi/180) * range_wp_direct); #max 0.18
2425		if(y_range_wp_direct>0.18){
2426			range_wp_direct = math.abs(0.18 / math.sin(bearing_wp_direct*math.pi/180));
2427		}
2428		setprop("/instrumentation/garmin196/symbols/paths/range_wp_direct/range",range_wp_direct);
2429
2430		if(getprop("/instrumentation/garmin196/panel-wpt-id")!=nil and getprop("/instrumentation/garmin196/panel-wpt-id")!="------"){
2431			setprop("/instrumentation/garmin196/symbols/paths/range_wp_direct/visible",1);
2432		}else{
2433			setprop("/instrumentation/garmin196/symbols/paths/range_wp_direct/visible",0);
2434		}
2435
2436		##flight plan calculation
2437		var nb_path = getprop("/autopilot/route-manager/route/num");
2438		if(nb_path>9){
2439			nb_path = 9;
2440		}
2441
2442		var aircraft_bearing = getprop("/instrumentation/gps/indicated-track-magnetic-deg");
2443		for(var i=0;i<(nb_path-1);i=i+1){
2444			var id = getprop("/autopilot/route-manager/route/wp["~i~"]/id");
2445
2446			setprop("/instrumentation/gps/scratch/max-results",1);
2447			setprop("/instrumentation/gps/scratch/longitude-deg",-9999);
2448			setprop("/instrumentation/gps/scratch/latitude-deg",-9999);
2449			setprop("/instrumentation/gps/scratch/type", "");
2450			setprop("/instrumentation/gps/scratch/query", id);
2451			setprop("/instrumentation/gps/command", "search");
2452
2453			if(getprop("/instrumentation/gps/scratch/valid")==0 or getprop("/instrumentation/gps/scratch/ident")!=id){
2454				setprop("/instrumentation/gps/scratch/type", "fix");
2455				setprop("/instrumentation/gps/scratch/query", id);
2456				setprop("/instrumentation/gps/command", "search");
2457			}
2458
2459			var distance_to_wp = getprop("/instrumentation/gps/scratch/distance-nm") / symbol_map_range;
2460			var	bearing_to_wp = 360 - getprop("/instrumentation/gps/indicated-track-magnetic-deg") + getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2461
2462			var x_wp_fpl = math.cos(bearing_to_wp*math.pi/180) * distance_to_wp * offset_mul;
2463			var y_wp_fpl = math.sin(bearing_to_wp*math.pi/180) * distance_to_wp * offset_mul;
2464
2465			setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/x",x_wp_fpl);
2466			setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/y",y_wp_fpl);
2467
2468			var wp_bearing = 360 - getprop("/instrumentation/gps/indicated-track-true-deg") + getprop("/autopilot/route-manager/route/wp["~i~"]/leg-bearing-true-deg");
2469			var wp_distance = offset_range_wp_direct * getprop("/autopilot/route-manager/route/wp["~i~"]/leg-distance-nm") / symbol_map_range;
2470
2471			var x_range_wp =(math.cos(wp_bearing*math.pi/180) * wp_distance) + ((x_wp_fpl/0.026)*0.15); #max 0.15
2472			if(math.abs(x_range_wp)>0.15){
2473				wp_distance = math.abs(((0.15*math.sgn(math.cos(wp_bearing*math.pi/180))) - ((x_wp_fpl/0.026)*0.15))/math.cos(wp_bearing*math.pi/180));
2474			}
2475
2476			var y_range_wp =(math.sin(wp_bearing*math.pi/180) * wp_distance) + ((y_wp_fpl/0.0323)*0.18); #max 0.18
2477			if(math.abs(y_range_wp)>0.18){
2478				wp_distance = math.abs(((0.18*math.sgn(math.sin(wp_bearing*math.pi/180))) - ((y_wp_fpl/0.0323)*0.18))/math.sin(wp_bearing*math.pi/180));
2479			}
2480
2481			setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/range",wp_distance);
2482			setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/bearing",wp_bearing);
2483
2484			if(x_wp_fpl<0.026 and x_wp_fpl>-0.026 and y_wp_fpl<0.0323 and y_wp_fpl>-0.0323){##si on est dans l'ecran, on affiche
2485				setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/visible",1);
2486			}else{
2487				setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/visible",0);
2488			}
2489		}
2490		for(var i=(nb_path-1);i<9;i=i+1){
2491			setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/visible",0);
2492		}
2493
2494	}
2495	if(getprop("/instrumentation/garmin196/serviceable")==1 and getprop("/instrumentation/garmin196/status")==10){
2496		settimer(update_map,1);
2497	}
2498}
2499
2500var display_dto_recent = func{
2501	var waypoints = props.globals.getNode("/instrumentation/garmin196/waypoints/recent/",1);
2502	var i = 0;
2503	foreach (var e; waypoints.getChildren("wpt")) {
2504		var id = e.getChild("id").getValue();
2505		var type = e.getChild("type").getValue();
2506		var ligne = id;
2507		if(type=="wpt"){
2508			var type_wpt = substr(id,size(id)-6);
2509			if(type_wpt=="WPTTWN"){#cities
2510				ligne = substr(id,0,size(id)-8);
2511				ligne = substr(ligne,0,15);
2512			}elsif(type_wpt=="WPTUSR"){#wpt user
2513				ligne = substr(id,0,size(id)-6);
2514			}
2515		}
2516
2517		ligne = ligne ~ " " ~ type;
2518		var ligne_spaces = "                              ";
2519		ligne_spaces = substr(ligne_spaces,0,15-size(ligne));
2520
2521		props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(1);
2522		props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2523		props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2524		setprop("/instrumentation/gps/scratch/type", type);
2525		setprop("/instrumentation/gps/scratch/query", id);
2526		setprop("/instrumentation/gps/command", "search");
2527
2528		var range = getprop("/instrumentation/gps/scratch/distance-nm");
2529		var	bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2530
2531		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2532		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2533			ligne = ligne ~sprintf(" %3.1fnm",range);
2534		}else{
2535			ligne = ligne ~sprintf(" %3.1fkm",range*1.852);
2536		}
2537
2538		if(i==0){
2539			setprop("/instrumentation/garmin196/dto_display/ligne_select",ligne);
2540			props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(1);
2541		}else{
2542			props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(0);
2543		}
2544		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/texte",ligne);
2545		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/id",id);
2546		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/type",type);
2547		i=i+1;
2548	}
2549	for(var j=i;j<5;j=j+1){
2550		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/texte","");
2551		props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~j~"]/selected",1).setBoolValue(0);
2552		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/id","");
2553		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/type","");
2554	}
2555	setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",0);
2556	setprop("/instrumentation/garmin196/dto_display/max_ligne_selected",i-1);
2557	if(i==0){
2558		setprop("/instrumentation/garmin196/dto_display/ligne_select","");
2559	}
2560}
2561
2562var display_dto_user = func{
2563	var waypoints = props.globals.getNode("/instrumentation/garmin196/waypoints/user/",1);
2564	var i = 0;
2565	foreach (var e; waypoints.getChildren("wpt")) {
2566		var id = e.getChild("id").getValue()~"WPTUSR";
2567		var type = "wpt";
2568		var ligne = substr(id,0,size(id)-6);
2569		ligne = substr(ligne,0,14);
2570
2571		var ligne_spaces = "                              ";
2572		ligne_spaces = substr(ligne_spaces,0,14-size(ligne));
2573
2574		props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(1);
2575		props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2576		props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2577		setprop("/instrumentation/gps/scratch/type", type);
2578		setprop("/instrumentation/gps/scratch/query", id);
2579		setprop("/instrumentation/gps/command", "search");
2580
2581		var range = getprop("/instrumentation/gps/scratch/distance-nm");
2582		var	bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2583
2584		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2585		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2586			ligne = ligne ~sprintf(" %3.1fnm",range);
2587		}else{
2588			ligne = ligne ~sprintf(" %3.1fkm",range*1.852);
2589		}
2590
2591		if(i==0){
2592			setprop("/instrumentation/garmin196/dto_display/ligne_select",ligne);
2593			props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(1);
2594		}else{
2595			props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(0);
2596		}
2597		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/texte",ligne);
2598		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/id",id);
2599		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/type",type);
2600		i=i+1;
2601	}
2602	for(var j=i;j<5;j=j+1){
2603		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/texte","");
2604		props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~j~"]/selected",1).setBoolValue(0);
2605		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/id","");
2606		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/type","");
2607	}
2608	setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",0);
2609	setprop("/instrumentation/garmin196/dto_display/max_ligne_selected",i-1);
2610	if(i==0){
2611		setprop("/instrumentation/garmin196/dto_display/ligne_select","");
2612	}
2613}
2614
2615var affectation_waypoint = func(id){
2616	setprop("/autopilot/route-manager/active",0);
2617	setprop("/autopilot/route-manager/input","@CLEAR");
2618	setprop("/autopilot/route-manager/input","@POP");
2619	setprop("/autopilot/route-manager/input","@insert0:"~id);
2620	##to correct the index bug appeared in 2.8.0.5
2621	setprop("/autopilot/route-manager/input","@insert0:"~id);
2622	setprop("/autopilot/route-manager/input","@JUMP0");
2623	setprop("/autopilot/route-manager/input","@ACTIVATE");
2624}
2625
2626var display_dto_search = func{
2627	var ligne_selected = getprop("/instrumentation/garmin196/dto_display/ligne_select");
2628	var x_char = props.globals.getNode("/instrumentation/garmin196/dto_display/x_char").getValue();
2629	ligne_selected = substr(ligne_selected,0,x_char);
2630	ligne_selected = ligne_selected ~ tab_chiffres_lettres[getprop("/instrumentation/garmin196/dto_display/y_char")];
2631	setprop("/instrumentation/garmin196/dto_display/ligne_select",ligne_selected);
2632
2633	var plots = [];
2634	##recherche gps globale
2635	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
2636	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2637	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2638	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
2639	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
2640	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("");
2641
2642	setprop("/instrumentation/gps/command", "search");
2643	var i=0;
2644	var flag_continue = getprop("/instrumentation/gps/scratch/valid");
2645	while (flag_continue and i<5) {
2646		var id = getprop("/instrumentation/gps/scratch/ident");
2647		var range = getprop("/instrumentation/gps/scratch/distance-nm");
2648		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2649		var type = getprop("/instrumentation/gps/scratch/type");
2650
2651		var ligne = id;
2652		if(type=="waypoint"){
2653			type = "wpt";
2654			var type_wpt = substr(id,size(id)-6);
2655			if(type_wpt=="WPTTWN"){#cities
2656				ligne = substr(id,0,size(id)-8);
2657			}elsif(type_wpt=="WPTUSR"){#wpt user
2658				ligne = substr(id,0,size(id)-6);
2659			}
2660		}
2661
2662		ligne = ligne ~ " " ~ type;
2663		var ligne_spaces = "                              ";
2664		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
2665
2666		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2667		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2668			ligne = ligne ~sprintf("  %3.1fnm",range);
2669		}else{
2670			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
2671		}
2672		var popup_status = getprop("/instrumentation/garmin196/popup_status");
2673
2674
2675		var plot = { id: id,texte: ligne,type: type};
2676		append(plots,plot);
2677
2678		i=i+1;
2679		setprop("/instrumentation/gps/command", "next");
2680		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
2681	}
2682
2683	##recherche gps fix
2684	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
2685	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2686	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2687	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
2688	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
2689	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("fix");
2690
2691	setprop("/instrumentation/gps/command", "search");
2692	i=0;
2693	flag_continue = getprop("/instrumentation/gps/scratch/valid");
2694	while (flag_continue and i<5) {
2695		var id = getprop("/instrumentation/gps/scratch/ident");
2696		var range = getprop("/instrumentation/gps/scratch/distance-nm");
2697		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2698		var type = getprop("/instrumentation/gps/scratch/type");
2699
2700		var ligne = id ~ " " ~ type;
2701		var ligne_spaces = "                              ";
2702		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
2703
2704		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2705		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2706			ligne = ligne ~sprintf("  %3.1fnm",range);
2707		}else{
2708			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
2709		}
2710		var popup_status = getprop("/instrumentation/garmin196/popup_status");
2711
2712
2713		var plot = { id: id,texte: ligne,type: type};
2714		append(plots,plot);
2715
2716		i=i+1;
2717		setprop("/instrumentation/gps/command", "next");
2718		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
2719	}
2720
2721	##recherche gps vor
2722	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
2723	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2724	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2725	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
2726	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
2727	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("vor");
2728
2729	setprop("/instrumentation/gps/command", "search");
2730	i=0;
2731	flag_continue = getprop("/instrumentation/gps/scratch/valid");
2732	while (flag_continue and i<5) {
2733		var id = getprop("/instrumentation/gps/scratch/ident");
2734		var range = getprop("/instrumentation/gps/scratch/distance-nm");
2735		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2736		var type = getprop("/instrumentation/gps/scratch/type");
2737
2738		var ligne = id ~ " vor";
2739		var ligne_spaces = "                              ";
2740		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
2741
2742		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2743		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2744			ligne = ligne ~sprintf("  %3.1fnm",range);
2745		}else{
2746			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
2747		}
2748		var popup_status = getprop("/instrumentation/garmin196/popup_status");
2749
2750
2751		var plot = { id: id,texte: ligne,type: type};
2752		append(plots,plot);
2753
2754		i=i+1;
2755		setprop("/instrumentation/gps/command", "next");
2756		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
2757	}
2758
2759	##recherche gps ndb
2760	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
2761	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2762	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2763	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
2764	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
2765	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("ndb");
2766
2767	setprop("/instrumentation/gps/command", "search");
2768	i=0;
2769	flag_continue = getprop("/instrumentation/gps/scratch/valid");
2770	while (flag_continue and i<5) {
2771		var id = getprop("/instrumentation/gps/scratch/ident");
2772		var range = getprop("/instrumentation/gps/scratch/distance-nm");
2773		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2774		var type = getprop("/instrumentation/gps/scratch/type");
2775
2776		var ligne = id ~ " ndb";
2777		var ligne_spaces = "                              ";
2778		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
2779
2780		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2781		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2782			ligne = ligne ~sprintf("  %3.1fnm",range);
2783		}else{
2784			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
2785		}
2786		var popup_status = getprop("/instrumentation/garmin196/popup_status");
2787
2788
2789		var plot = { id: id,texte: ligne,type: type};
2790		append(plots,plot);
2791
2792		i=i+1;
2793		setprop("/instrumentation/gps/command", "next");
2794		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
2795	}
2796
2797	var plots_sorted = sort (plots, func (a,b) cmp (a.id, b.id));
2798	var nb_plots = size(plots_sorted);
2799	if(nb_plots>5){
2800		nb_plots = 5;
2801	}
2802	for(var j=0;j<nb_plots;j=j+1){
2803		if(i==0 and popup_status!=10 and popup_status!=11){
2804			props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(1);
2805		}else{
2806			props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(0);
2807		}
2808		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/texte",plots_sorted[j].texte);
2809		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/id",plots_sorted[j].id);
2810		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/type",plots_sorted[j].type);
2811	}
2812
2813	for(var j=nb_plots;j<5;j=j+1){
2814		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/texte","");
2815		props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~j~"]/selected",1).setBoolValue(0);
2816		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/id","");
2817		setprop("/instrumentation/garmin196/dto_display/ligne["~j~"]/type","");
2818	}
2819	setprop("/instrumentation/garmin196/dto_display/no_ligne_selected",0);
2820	setprop("/instrumentation/garmin196/dto_display/max_ligne_selected",nb_plots-1);
2821}
2822
2823var searchLastChar = func(chaine, char){
2824	var result = -1;
2825	var char_a_tester = substr(chaine,char,1);
2826	for(var i=0;i<size(tab_chiffres_lettres);i=i+1){
2827		if(tab_chiffres_lettres[i]==char_a_tester){
2828			result = i;
2829			break;
2830		}
2831	}
2832	return result;
2833}
2834
2835var init_dto_display = func{
2836	for(var i=0;i<5;i=i+1){
2837		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/texte","");
2838		props.globals.getNode("/instrumentation/garmin196/dto_display/ligne["~i~"]/selected",1).setBoolValue(0);
2839		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/id","");
2840		setprop("/instrumentation/garmin196/dto_display/ligne["~i~"]/type","");
2841	}
2842}
2843
2844var init_nrst_display = func{
2845	for(var i=0;i<5;i=i+1){
2846		setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/texte","");
2847		props.globals.getNode("/instrumentation/garmin196/nrst_display/ligne["~i~"]/selected",1).setBoolValue(0);
2848		setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/id","");
2849		setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/type","");
2850	}
2851}
2852
2853var display_nrst = func(type){
2854	if(type=="wpt"){
2855		props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(25);
2856		props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2857		props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2858		#props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(1);
2859		props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue(type);
2860		setprop("/instrumentation/gps/command", "nearest");
2861		var i=0;
2862		var flag_continue = getprop("/instrumentation/gps/scratch/valid");
2863		while (flag_continue and i<5) {
2864			var id = getprop("/instrumentation/gps/scratch/ident");
2865			var range = getprop("/instrumentation/gps/scratch/distance-nm");
2866			var	bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2867
2868			var type_wpt = substr(id,size(id)-6);
2869			if(type_wpt=="WPTTWN"){
2870				var ligne = substr(id,0,size(id)-8);
2871			}elsif(type_wpt=="WPTUSR"){
2872				var ligne = substr(id,0,size(id)-6);
2873			}
2874			ligne = substr(ligne,0,18);
2875			var ligne_spaces = "                              ";
2876			ligne_spaces = substr(ligne_spaces,0,18-size(ligne));
2877			ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2878			if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2879				ligne = ligne ~sprintf(" %3.1fnm",range);
2880			}else{
2881				ligne = ligne ~sprintf(" %3.1fkm",range*1.852);
2882			}
2883
2884			if(i==0){
2885				setprop("/instrumentation/garmin196/nrst_display/ligne_select",ligne);
2886				props.globals.getNode("/instrumentation/garmin196/nrst_display/ligne["~i~"]/selected",1).setBoolValue(1);
2887			}else{
2888				props.globals.getNode("/instrumentation/garmin196/nrst_display/ligne["~i~"]/selected",1).setBoolValue(0);
2889			}
2890			setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/texte",ligne);
2891			setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/id",id);
2892			setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/type",type);
2893			i=i+1;
2894
2895			setprop("/instrumentation/gps/command", "next");
2896			flag_continue = getprop("/instrumentation/gps/scratch/has-next");
2897		}
2898		setprop("/instrumentation/garmin196/nrst_display/no_ligne_selected",0);
2899		setprop("/instrumentation/garmin196/nrst_display/max_ligne_selected",(i-1));
2900
2901	}else{
2902		props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(6);
2903		props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
2904		props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
2905		#props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(1);
2906		props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue(type);
2907		props.globals.getNode("/instrumentation/gps/scratch").removeChildren("runways");
2908		setprop("/instrumentation/gps/command", "nearest");
2909		var i=0;
2910		var flag_continue = getprop("/instrumentation/gps/scratch/valid");
2911		while (flag_continue and i<5) {
2912			var id = getprop("/instrumentation/gps/scratch/ident");
2913			var ligne = id;
2914			var range = getprop("/instrumentation/gps/scratch/distance-nm");
2915			var	bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
2916			var ligne_spaces = "                              ";
2917			ligne_spaces = substr(ligne_spaces,0,6-size(ligne));
2918			ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
2919			if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2920				ligne = ligne ~sprintf(" %3.1fnm",range);
2921			}else{
2922				ligne = ligne ~sprintf(" %3.1fkm",range*1.852);
2923			}
2924			if(type=="airport"){
2925				var runways = props.globals.getNode("/instrumentation/gps/scratch",1);
2926				var max_length = 0;
2927				foreach (var e; runways.getChildren("runways")) {
2928					var runway_length = e.getChild("length-ft").getValue();
2929					if(runway_length>max_length){
2930						max_length = runway_length;
2931					}
2932				}
2933				if(getprop("/instrumentation/garmin196/params/units/distance")==1){
2934					ligne = ligne ~ " " ~ sprintf("%4.0fft",max_length);
2935				}else{
2936					ligne = ligne ~ " " ~ sprintf("%4.0fm",max_length*0.3048);
2937				}
2938
2939				var radio = getprop("/instrumentation/garmin196/airports_atis/id_"~id);
2940				if(radio!=nil){
2941					ligne = ligne ~ sprintf(" %3.2f",radio);
2942				}
2943			}elsif(type=="vor"){
2944				ligne = ligne ~ " " ~ sprintf("%2.2f",getprop('/instrumentation/gps/scratch/frequency-mhz'));
2945			}elsif(type=="ndb"){
2946				ligne = ligne ~ " " ~ sprintf("%2.1f",getprop('/instrumentation/gps/scratch/frequency-khz'));
2947			}
2948			if(i==0){
2949				setprop("/instrumentation/garmin196/nrst_display/ligne_select",ligne);
2950				props.globals.getNode("/instrumentation/garmin196/nrst_display/ligne["~i~"]/selected",1).setBoolValue(1);
2951			}else{
2952				props.globals.getNode("/instrumentation/garmin196/nrst_display/ligne["~i~"]/selected",1).setBoolValue(0);
2953			}
2954			setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/texte",ligne);
2955			setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/id",id);
2956			setprop("/instrumentation/garmin196/nrst_display/ligne["~i~"]/type",type);
2957			i=i+1;
2958
2959			props.globals.getNode("/instrumentation/gps/scratch").removeChildren("runways");
2960			setprop("/instrumentation/gps/command", "next");
2961			flag_continue = getprop("/instrumentation/gps/scratch/has-next");
2962		}
2963		setprop("/instrumentation/garmin196/nrst_display/no_ligne_selected",0);
2964		setprop("/instrumentation/garmin196/nrst_display/max_ligne_selected",(i-1));
2965	}
2966}
2967
2968var load_cities = func{
2969	print("Garmin 196 loading cities");
2970	fgcommand("loadxml", props.Node.new({ filename: getprop("/sim/fg-root")~"/Aircraft/Instruments-3d/garmin196/cities.xml", targetnode: "/instrumentation/garmin196/cities" }));
2971	var waypoints = props.globals.getNode("/instrumentation/garmin196/cities/waypoints",1);
2972	foreach (var e; waypoints.getChildren("waypoint")) {
2973		var id = e.getChild("id").getValue();
2974		var latitude = e.getChild("latitude").getValue();
2975		var longitude = e.getChild("longitude").getValue();
2976		props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(longitude);
2977		props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(latitude);
2978		props.globals.getNode("/instrumentation/gps/scratch/ident",1).setValue(id);
2979		setprop("/instrumentation/gps/command","define-user-wpt");
2980	}
2981	props.globals.getNode("/instrumentation/garmin196").removeChildren("cities");
2982	print("Garmin 196 loading cities done");
2983}
2984
2985var update_wp_id_display=func{
2986	var id=getprop("/autopilot/route-manager/wp[0]/id");
2987	if(size(id)>6){
2988		var type_wpt=substr(id,size(id)-6);
2989		if(type_wpt=="WPTTWN"){#cities
2990			id=substr(id,0,size(id)-8);
2991			id=substr(id,0,13);
2992		}elsif(type_wpt=="WPTUSR"){#wpt user
2993			id=substr(id,0,size(id)-6);
2994		}
2995	}
2996	setprop("/instrumentation/garmin196/panel-wpt-id",id);
2997	setprop("/instrumentation/garmin196/position-wpt-id",id);
2998
2999	##stockage des coordonnees pour la vnav
3000	setprop("/instrumentation/gps/scratch/max-results",1);
3001	setprop("/instrumentation/gps/scratch/longitude-deg",-9999);
3002	setprop("/instrumentation/gps/scratch/latitude-deg",-9999);
3003	setprop("/instrumentation/gps/scratch/type", "");
3004	setprop("/instrumentation/gps/scratch/query", id);
3005	setprop("/instrumentation/gps/command", "search");
3006
3007	if(getprop("/instrumentation/gps/scratch/type")=="airport"){
3008	  ##stockage des coordonnees du waypoint pour vnav
3009	  props.globals.getNode("/instrumentation/garmin196/vnav/longitude",1).setDoubleValue(getprop("/instrumentation/gps/scratch/longitude-deg"));
3010	  props.globals.getNode("/instrumentation/garmin196/vnav/latitude",1).setDoubleValue(getprop("/instrumentation/gps/scratch/latitude-deg"));
3011	  props.globals.getNode("/instrumentation/garmin196/vnav/altitude-m",1).setDoubleValue(getprop("/instrumentation/gps/scratch/altitude-ft") * 0.3048);
3012	  props.globals.getNode("/instrumentation/garmin196/vnav/visible",1).setBoolValue(1);
3013	}else{
3014	  props.globals.getNode("/instrumentation/garmin196/vnav/visible",1).setBoolValue(0);
3015	}
3016
3017}
3018setlistener("/autopilot/route-manager/wp[0]/id",update_wp_id_display);
3019
3020var init_list_aircraft = func{
3021	var aircrafts = props.globals.getNode("/instrumentation/garmin196/params/aircrafts",1);
3022	var i = 0;
3023	foreach (var e; aircrafts.getChildren("aircraft")) {
3024		setprop("/instrumentation/garmin196/menu_aircraft/aircraft["~i~"]/texte",e.getChild("name").getValue());
3025		i=i+1;
3026	}
3027
3028	for(var j=i;j<6;j=j+1){
3029		setprop("/instrumentation/garmin196/menu_aircraft/aircraft["~j~"]/texte","");
3030	}
3031
3032	if(i<6){
3033		setprop("/instrumentation/garmin196/menu_aircraft/aircraft["~i~"]/texte","ENTER TO ADD AIRCRAFT");
3034	}else{
3035		i=5;
3036	}
3037	setprop("/instrumentation/garmin196/menu_aircraft/max_no_ligne",i);
3038}
3039
3040var init_new_aircraft = func(no_aircraft){
3041	props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~no_aircraft~"]/name", 1).setValue("AIRCRAFT");
3042	props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~no_aircraft~"]/max-speed", 1).setIntValue(150);
3043	props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~no_aircraft~"]/cruise-speed", 1).setIntValue(120);
3044	props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~no_aircraft~"]/fuel-flow", 1).setIntValue(5);
3045}
3046
3047var delete_aircraft = func(no_aircraft){
3048	for(var i=no_aircraft+1;i<6;i=i+1){
3049		if(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/name")!=nil){
3050			setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~(i-1)~"]/name",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/name"));
3051			setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~(i-1)~"]/max-speed",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/max-speed"));
3052			setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~(i-1)~"]/cruise-speed",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/cruise-speed"));
3053			setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~(i-1)~"]/fuel-flow",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~i~"]/fuel-flow"));
3054		}
3055	}
3056	var nb_aircraft = size(props.globals.getNode("/instrumentation/garmin196/params/aircrafts",1).getChildren("aircraft"));
3057	if(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_aircraft~"]/name")!=nil){
3058		props.globals.getNode("/instrumentation/garmin196/params/aircrafts/aircraft["~(nb_aircraft-1)~"]").remove();
3059	}
3060
3061	setprop("/instrumentation/garmin196/no_aircraft",no_aircraft-1);
3062	save_parameters();
3063}
3064
3065var display_list_aircraft = func{
3066	var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
3067	if(no_ligne==-1){
3068		no_ligne = getprop("/instrumentation/garmin196/no_aircraft");
3069	}
3070	var aircraft_display = "";
3071	if(getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/max-speed")!=nil){
3072		var max_speed = getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/max-speed");
3073		var name = getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/name");
3074		setprop("/instrumentation/garmin196/max-speed",max_speed);
3075		setprop("/instrumentation/garmin196/cruise-speed",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/cruise-speed"));
3076		setprop("/instrumentation/garmin196/fuel-flow",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/fuel-flow"));
3077		setprop("/instrumentation/garmin196/no_aircraft",no_ligne);
3078
3079		aircraft_display = name ~ "    vmax=";
3080		if(getprop("/instrumentation/garmin196/params/units/speed")==1){
3081			aircraft_display = aircraft_display ~ max_speed ~"kt";
3082		}else{
3083			aircraft_display = aircraft_display ~ sprintf("%3.0f",(max_speed*1.852)) ~"km/h";
3084		}
3085	}else{
3086		aircraft_display = "NEW AIRCRAFT";
3087	}
3088	setprop("/instrumentation/garmin196/menu_aircraft/text",aircraft_display);
3089}
3090
3091var init_menu_aircraft = func{
3092	var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
3093
3094	setprop("/instrumentation/garmin196/menu_aircraft/selected-name",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/name"));
3095	setprop("/instrumentation/garmin196/menu_aircraft/selected-max",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/max-speed"));
3096	setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/cruise-speed"));
3097	setprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow",getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/fuel-flow"));
3098
3099	setprop("/instrumentation/garmin196/menu_aircraft/x_char",size(getprop("/instrumentation/garmin196/menu_aircraft/selected-name"))-1);
3100	setprop("/instrumentation/garmin196/menu_aircraft/y_char",searchLastChar(getprop("/instrumentation/garmin196/menu_aircraft/selected-name"),getprop("/instrumentation/garmin196/menu_aircraft/x_char")));
3101	display_menu_aircraft();
3102}
3103
3104var validate_menu_aircraft=func{
3105	var no_ligne = getprop("/instrumentation/garmin196/menu_aircraft/no_ligne_selected");
3106
3107	setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/name",getprop("/instrumentation/garmin196/menu_aircraft/selected-name"));
3108	setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/max-speed",getprop("/instrumentation/garmin196/menu_aircraft/selected-max"));
3109	setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/cruise-speed",getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise"));
3110	setprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_ligne~"]/fuel-flow",getprop("/instrumentation/garmin196/menu_aircraft/selected-fuelflow"));
3111	save_parameters();
3112}
3113
3114var display_menu_aircraft=func{
3115	if(getprop("/instrumentation/garmin196/params/units/speed")==1){
3116		setprop("/instrumentation/garmin196/menu_aircraft/selected-max-display",getprop("/instrumentation/garmin196/menu_aircraft/selected-max")~"kt");
3117		setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise-display",getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise")~"kt");
3118	}else{
3119		setprop("/instrumentation/garmin196/menu_aircraft/selected-max-display",sprintf("%3.0fkm/h",getprop("/instrumentation/garmin196/menu_aircraft/selected-max")*1.852));
3120		setprop("/instrumentation/garmin196/menu_aircraft/selected-cruise-display",sprintf("%3.0fkm/h",getprop("/instrumentation/garmin196/menu_aircraft/selected-cruise")*1.852));
3121	}
3122}
3123
3124var display_menu_aircraft_name = func{
3125	var ligne_selected = getprop("/instrumentation/garmin196/menu_aircraft/selected-name");
3126	var x_char = props.globals.getNode("/instrumentation/garmin196/menu_aircraft/x_char").getValue();
3127	ligne_selected = substr(ligne_selected,0,x_char);
3128	ligne_selected = ligne_selected ~ tab_chiffres_lettres[getprop("/instrumentation/garmin196/menu_aircraft/y_char")];
3129	setprop("/instrumentation/garmin196/menu_aircraft/selected-name",ligne_selected);
3130}
3131
3132var display_menu_flights = func{
3133	var flights = props.globals.getNode("/instrumentation/garmin196/flights",1);
3134	var i = 0;
3135	foreach (var e; flights.getChildren("flight")) {
3136		var start = e.getChild("start").getValue();
3137		var end = e.getChild("end").getValue();
3138		var date = e.getChild("date").getValue();
3139		var aircraft = e.getChild("aircraft").getValue();
3140		var distance = e.getChild("distance").getValue();
3141		var duration = e.getChild("duration").getValue();
3142
3143		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3144			distance = sprintf("%03.1fnm",distance);
3145		}else{
3146			distance = sprintf("%03.1fkm",distance*1.852);
3147		}
3148		var ligne = sprintf("%s to %s    %s",start,end,date);
3149
3150		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/texte",ligne);
3151		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/start",start);
3152		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/end",end);
3153		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/date",date);
3154		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/aircraft",aircraft);
3155		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/distance",distance);
3156		setprop("/instrumentation/garmin196/menu_flights/ligne["~i~"]/duration",sprintf("%03.1fh",duration));
3157
3158		i=i+1;
3159	}
3160	for(var j=i;j<8;j=j+1){
3161		setprop("/instrumentation/garmin196/menu_flights/ligne["~j~"]/texte","");
3162	}
3163	setprop("/instrumentation/garmin196/menu_flights/max_ligne_selected",i-1);
3164}
3165
3166var update_menu_flights_detail = func{
3167	var no_ligne = getprop("/instrumentation/garmin196/menu_flights/no_ligne_selected");
3168	setprop("/instrumentation/garmin196/menu_flights/ligne_selected/texte",getprop("/instrumentation/garmin196/menu_flights/ligne["~no_ligne~"]/start")~" to "~getprop("/instrumentation/garmin196/menu_flights/ligne["~no_ligne~"]/end"));
3169	setprop("/instrumentation/garmin196/menu_flights/ligne_selected/date",getprop("/instrumentation/garmin196/menu_flights/ligne["~no_ligne~"]/date"));
3170	setprop("/instrumentation/garmin196/menu_flights/ligne_selected/aircraft",getprop("/instrumentation/garmin196/menu_flights/ligne["~no_ligne~"]/aircraft"));
3171	setprop("/instrumentation/garmin196/menu_flights/ligne_selected/distance",getprop("/instrumentation/garmin196/menu_flights/ligne["~no_ligne~"]/distance"));
3172	setprop("/instrumentation/garmin196/menu_flights/ligne_selected/duration",getprop("/instrumentation/garmin196/menu_flights/ligne["~no_ligne~"]/duration"));
3173}
3174
3175var update_flight = func{
3176	if(getprop("/instrumentation/garmin196/flight/inflight")==nil){
3177		props.globals.getNode("/instrumentation/garmin196/flight/inflight",1).setBoolValue(0);
3178		props.globals.getNode("/instrumentation/garmin196/flight/start",1).setValue("");
3179	}
3180
3181	var inflight = getprop("/instrumentation/garmin196/flight/inflight");
3182	var speed = getprop("/instrumentation/gps/indicated-ground-speed-kt");
3183	if(inflight==1){
3184		if(speed<30){#speed<30kt, flight saved
3185
3186			props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(1);
3187			props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
3188			props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
3189			props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("airport");
3190			setprop("/instrumentation/gps/command", "nearest");
3191			var id = getprop("/instrumentation/gps/scratch/ident");
3192			props.globals.getNode("/instrumentation/garmin196/flight/end",1).setValue(id);
3193			props.globals.getNode("/instrumentation/garmin196/flight/distance",1).setDoubleValue(getprop("/instrumentation/gps/trip-odometer"));
3194			props.globals.getNode("/instrumentation/garmin196/flight/duration",1).setDoubleValue((getprop("/sim/time/elapsed-sec")-getprop("/instrumentation/garmin196/flight/start-time"))/3600);
3195			setprop("/instrumentation/garmin196/flight/inflight",0);
3196
3197			##inscription dans le carnet de vol
3198			for(var i=7;i>0;i=i-1){
3199				if(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/start")!=nil){
3200					props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/start",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/start"));
3201					props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/end",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/end"));
3202					props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/date",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/date"));
3203					props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/aircraft",1).setValue(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/aircraft"));
3204					props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/distance",1).setDoubleValue(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/distance"));
3205					props.globals.getNode("/instrumentation/garmin196/flights/flight["~i~"]/duration",1).setDoubleValue(getprop("/instrumentation/garmin196/flights/flight["~(i-1)~"]/duration"));
3206				}
3207			}
3208			props.globals.getNode("/instrumentation/garmin196/flights/flight[0]/start",1).setValue(getprop("/instrumentation/garmin196/flight/start"));
3209			props.globals.getNode("/instrumentation/garmin196/flights/flight[0]/end",1).setValue(getprop("/instrumentation/garmin196/flight/end"));
3210			props.globals.getNode("/instrumentation/garmin196/flights/flight[0]/date",1).setValue(getprop("/instrumentation/garmin196/flight/date"));
3211			props.globals.getNode("/instrumentation/garmin196/flights/flight[0]/aircraft",1).setValue(getprop("/instrumentation/garmin196/flight/aircraft"));
3212			props.globals.getNode("/instrumentation/garmin196/flights/flight[0]/distance",1).setDoubleValue(getprop("/instrumentation/garmin196/flight/distance"));
3213			props.globals.getNode("/instrumentation/garmin196/flights/flight[0]/duration",1).setDoubleValue(getprop("/instrumentation/garmin196/flight/duration"));
3214			display_menu_flights();
3215			save_parameters();
3216		}
3217	}else{
3218		if(speed>30){#speed>30kt, flight started
3219			props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(1);
3220			props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
3221			props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
3222			props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("airport");
3223			setprop("/instrumentation/gps/command", "nearest");
3224			var id = getprop("/instrumentation/gps/scratch/ident");
3225			props.globals.getNode("/instrumentation/garmin196/flight/start",1).setValue(id);
3226			var no_aircraft = getprop("/instrumentation/garmin196/no_aircraft");
3227			var aircraft = getprop("/instrumentation/garmin196/params/aircrafts/aircraft["~no_aircraft~"]/name");
3228			if(aircraft==nil){
3229				props.globals.getNode("/instrumentation/garmin196/flight/aircraft",1).setValue("NO AIRCRAFT");
3230			}else{
3231				props.globals.getNode("/instrumentation/garmin196/flight/aircraft",1).setValue(aircraft);
3232			}
3233			props.globals.getNode("/instrumentation/garmin196/flight/date",1).setValue(substr(getprop("/sim/time/gmt"),0,10));
3234			props.globals.getNode("/instrumentation/garmin196/flight/start-time",1).setDoubleValue(getprop("/sim/time/elapsed-sec"));
3235			setprop("/instrumentation/gps/trip-odometer",0);
3236			setprop("/instrumentation/garmin196/flight/inflight",1);
3237		}
3238	}
3239}
3240
3241var update_e6b_menu=func{
3242	var status = getprop("/instrumentation/garmin196/status");
3243	if(status==150){
3244		if(getprop("/instrumentation/garmin196/params/units/pressure")==1){
3245			setprop("/instrumentation/garmin196/menu_e6b/baro-pressure",sprintf("%2.2fInHg",getprop("/environment/pressure-sea-level-inhg")));
3246		}else{
3247			setprop("/instrumentation/garmin196/menu_e6b/baro-pressure",sprintf("%4.0fhPa",getprop("/environment/pressure-sea-level-inhg")/0.03));
3248		}
3249
3250		var diff_speed = getprop("/instrumentation/gps/indicated-ground-speed-kt") - getprop("/velocities/airspeed-kt");
3251		if(getprop("/instrumentation/garmin196/params/units/speed")==1){
3252			setprop("/instrumentation/garmin196/menu_e6b/wind-speed",sprintf("%1.0fkt",getprop("/environment/wind-speed-kt")));
3253			setprop("/instrumentation/garmin196/menu_e6b/calibrated-airspeed",sprintf("%1.0fkt",getprop("/instrumentation/gps/indicated-ground-speed-kt")));
3254			setprop("/instrumentation/garmin196/menu_e6b/true-airspeed",sprintf("%1.0fkt",getprop("/velocities/airspeed-kt")));
3255			setprop("/instrumentation/garmin196/menu_e6b/head-wind",sprintf("%1.0fkt",diff_speed));
3256		}else{
3257			setprop("/instrumentation/garmin196/menu_e6b/wind-speed",sprintf("%1.0fkm/h",getprop("/environment/wind-speed-kt")*1.852));
3258			setprop("/instrumentation/garmin196/menu_e6b/calibrated-airspeed",sprintf("%1.0fkm/h",getprop("/instrumentation/gps/indicated-ground-speed-kt")*1.852));
3259			setprop("/instrumentation/garmin196/menu_e6b/true-airspeed",sprintf("%1.0fkm/h",getprop("/velocities/airspeed-kt")*1.852));
3260			setprop("/instrumentation/garmin196/menu_e6b/head-wind",sprintf("%1.0fkm/h",diff_speed*1.852));
3261		}
3262
3263		if(getprop("/instrumentation/garmin196/params/units/altitude")==1){
3264			setprop("/instrumentation/garmin196/menu_e6b/indicated-altitude",sprintf("%1.0fft",getprop("/instrumentation/gps/indicated-altitude-ft")));
3265			setprop("/instrumentation/garmin196/menu_e6b/density-altitude",sprintf("%1.0fft",getprop("/position/altitude-ft")));
3266		}else{
3267			setprop("/instrumentation/garmin196/menu_e6b/indicated-altitude",sprintf("%1.0fm",getprop("/instrumentation/gps/indicated-altitude-ft")*0.1097));
3268			setprop("/instrumentation/garmin196/menu_e6b/density-altitude",sprintf("%1.0fm",getprop("/position/altitude-ft")*0.1097));
3269		}
3270
3271		if(getprop("/instrumentation/garmin196/params/units/temperature")==1){
3272			setprop("/instrumentation/garmin196/menu_e6b/air-temp",sprintf("%1.1fC",getprop("/environment/temperature-degc")));
3273		}else{
3274			setprop("/instrumentation/garmin196/menu_e6b/air-temp",sprintf("%1.1fF",getprop("/environment/temperature-degf")));
3275		}
3276		setprop("/instrumentation/garmin196/menu_e6b/wind-from",sprintf("%1.0f",getprop("/environment/wind-from-heading-deg")));
3277		setprop("/instrumentation/garmin196/menu_e6b/heading",sprintf("%1.0f",getprop("/orientation/heading-deg")));
3278	}
3279}
3280
3281var init_list_points = func{
3282	var points = props.globals.getNode("/instrumentation/garmin196/waypoints/user/",1);
3283	var i = 0;
3284	foreach (var e; points.getChildren("wpt")) {
3285		setprop("/instrumentation/garmin196/menu_points/point["~i~"]/texte",e.getChild("id").getValue());
3286		i=i+1;
3287	}
3288
3289	for(var j=i;j<9;j=j+1){
3290		setprop("/instrumentation/garmin196/menu_points/point["~j~"]/texte","");
3291	}
3292
3293	if(i<9){
3294		setprop("/instrumentation/garmin196/menu_points/point["~i~"]/texte","ENTER TO ADD WAYPOINT");
3295	}else{
3296		i=8;
3297	}
3298	setprop("/instrumentation/garmin196/menu_points/max_no_ligne",i);
3299}
3300
3301var init_new_point = func(no_point){
3302	props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~no_point~"]/id", 1).setValue("POINT");
3303	props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~no_point~"]/latitude", 1).setDoubleValue(getprop("/position/latitude-deg"));
3304	props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~no_point~"]/longitude", 1).setDoubleValue(getprop("/position/longitude-deg"));
3305}
3306
3307var delete_point = func(no_point){
3308	for(var i=no_point+1;i<9;i=i+1){
3309		if(getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id")!=nil){
3310			setprop("/instrumentation/garmin196/waypoints/user/wpt["~(i-1)~"]/id",getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/id"));
3311			setprop("/instrumentation/garmin196/waypoints/user/wpt["~(i-1)~"]/latitude",getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/latitude"));
3312			setprop("/instrumentation/garmin196/waypoints/user/wpt["~(i-1)~"]/longitude",getprop("/instrumentation/garmin196/waypoints/user/wpt["~i~"]/longitude"));
3313		}
3314	}
3315	var nb_points = size(props.globals.getNode("/instrumentation/garmin196/waypoints/user/",1).getChildren("wpt"));
3316	if(getprop("/instrumentation/garmin196/waypoints/user/wpt["~no_point~"]/id")!=nil){
3317		props.globals.getNode("/instrumentation/garmin196/waypoints/user/wpt["~(nb_points-1)~"]").remove();
3318	}
3319	save_parameters();
3320}
3321
3322var update_menu_points = func{
3323	var no_ligne = getprop("/instrumentation/garmin196/menu_points/no_ligne_selected");
3324	var name = getprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/id");
3325	var latitude = getprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/latitude");
3326	var longitude = getprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/longitude");
3327
3328	setprop("/instrumentation/garmin196/menu_points/name",name);
3329	props.globals.getNode("/instrumentation/garmin196/menu_points/longitude", 1).setDoubleValue(longitude);
3330	props.globals.getNode("/instrumentation/garmin196/menu_points/latitude", 1).setDoubleValue(latitude);
3331	setprop("/instrumentation/garmin196/menu_points/x_char",size(getprop("/instrumentation/garmin196/menu_points/name"))-1);
3332	setprop("/instrumentation/garmin196/menu_points/y_char",searchLastChar(getprop("/instrumentation/garmin196/menu_points/name"),getprop("/instrumentation/garmin196/menu_points/x_char")));
3333	display_menu_points();
3334}
3335
3336var validate_menu_points = func{
3337	var no_ligne = getprop("/instrumentation/garmin196/menu_points/no_ligne_selected");
3338
3339	var id = getprop("/instrumentation/garmin196/menu_points/name");
3340	var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
3341	var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
3342	setprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/id",id);
3343	setprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/latitude",latitude);
3344	setprop("/instrumentation/garmin196/waypoints/user/wpt["~no_ligne~"]/longitude",longitude);
3345	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(longitude);
3346	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(latitude);
3347	props.globals.getNode("/instrumentation/gps/scratch/ident",1).setValue(id~"WPTUSR");
3348	setprop("/instrumentation/gps/command","define-user-wpt");
3349	update_menu_points();
3350	save_parameters();
3351}
3352
3353var display_menu_points = func{
3354	var ligne_selected = getprop("/instrumentation/garmin196/menu_points/name");
3355	var x_char = props.globals.getNode("/instrumentation/garmin196/menu_points/x_char").getValue();
3356	ligne_selected = substr(ligne_selected,0,x_char);
3357	ligne_selected = ligne_selected ~ tab_chiffres_lettres[getprop("/instrumentation/garmin196/menu_points/y_char")];
3358	setprop("/instrumentation/garmin196/menu_points/name",ligne_selected);
3359
3360	var latitude = getprop("/instrumentation/garmin196/menu_points/latitude");
3361	var latitude_tab = split(".",sprintf("%3.2f",math.abs(latitude)));
3362	var latitude_text10 = latitude_tab[0];
3363	var latitude_text1 = "00";
3364	if(size(latitude_tab)>1){
3365		latitude_text1 = sprintf("%0.2s",latitude_tab[1]);
3366	}
3367	if(latitude>=0){
3368		latitude_text10 = "N" ~ latitude_text10;
3369	}else{
3370		latitude_text10 = "S" ~ latitude_text10;
3371	}
3372	var longitude = getprop("/instrumentation/garmin196/menu_points/longitude");
3373	var longitude_tab = split(".",sprintf("%3.2f",math.abs(longitude)));
3374	var longitude_text10 = longitude_tab[0];
3375	var longitude_text1 = "00";
3376	if(size(longitude_tab)>1){
3377		longitude_text1 = sprintf("%0.2s",longitude_tab[1]);
3378	}
3379	if(longitude>=0){
3380		longitude_text10 = "E" ~ longitude_text10;
3381	}else{
3382		longitude_text10 = "W" ~ longitude_text10;
3383	}
3384
3385	setprop("/instrumentation/garmin196/menu_points/latitude10_text",latitude_text10);
3386	setprop("/instrumentation/garmin196/menu_points/latitude1_text",latitude_text1);
3387	setprop("/instrumentation/garmin196/menu_points/longitude10_text",longitude_text10);
3388	setprop("/instrumentation/garmin196/menu_points/longitude1_text",longitude_text1);
3389}
3390
3391var init_menu_routes_list = func{
3392	var routes = props.globals.getNode("/instrumentation/garmin196/routes",1);
3393	var i = 0;
3394	foreach (var e; routes.getChildren("route")) {
3395		setprop("/instrumentation/garmin196/menu_routes/route["~i~"]/texte",e.getChild("name").getValue());
3396		i=i+1;
3397	}
3398
3399	for(var j=i;j<11;j=j+1){
3400		setprop("/instrumentation/garmin196/menu_routes/route["~j~"]/texte","");
3401	}
3402
3403	if(i<11){
3404		setprop("/instrumentation/garmin196/menu_routes/route["~i~"]/texte","ENTER TO ADD ROUTE");
3405	}else{
3406		i=10;
3407	}
3408	setprop("/instrumentation/garmin196/menu_routes/max_no_ligne",i);
3409}
3410
3411var init_new_route = func(no_ligne){
3412	setprop("/instrumentation/gps/scratch/max-results", 1);
3413	setprop("/instrumentation/gps/scratch/longitude-deg",-9999);
3414	setprop("/instrumentation/gps/scratch/latitude-deg",-9999);
3415	setprop("/instrumentation/gps/scratch/type", "airport");
3416	setprop("/instrumentation/gps/command", "nearest");
3417	var id = getprop("/instrumentation/gps/scratch/ident");
3418
3419	props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne~"]/name",1).setValue(id~" to "~id);
3420	props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne~"]/wpts/wpt[0]/id",1).setValue(id);
3421	props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne~"]/wpts/wpt[0]/type",1).setValue("airport");
3422}
3423
3424var update_menu_routes_detail = func{
3425	var no_ligne = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
3426
3427	var points = props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne~"]/wpts/",1);
3428	var i = 0;
3429	var last_longitude = 0;
3430	var last_latitude = 0;
3431
3432	var distance_total = 0;
3433	var cruise_speed = getprop("/instrumentation/garmin196/cruise-speed");
3434	var conso_horaire = getprop("/instrumentation/garmin196/fuel-flow");
3435
3436	foreach (var e; points.getChildren("wpt")) {
3437		var id = e.getChild("id").getValue();
3438		var type = e.getChild("type").getValue();
3439		var ligne = id;
3440		if(substr(id,size(id)-6)=="WPTUSR"){
3441			ligne = substr(id,0,size(id)-6);
3442		}elsif(substr(id,size(id)-6)=="WPTTWN"){
3443			ligne = substr(id,0,size(id)-8);
3444		}
3445		ligne = substr(ligne,0,8);
3446
3447		if(i==0){
3448			setprop("/instrumentation/gps/scratch/max-results", 1);
3449			setprop("/instrumentation/gps/scratch/exact", 0);
3450			setprop("/instrumentation/gps/scratch/query", id);
3451			setprop("/instrumentation/gps/scratch/type", type);
3452			setprop("/instrumentation/gps/command", "search");
3453			last_longitude = getprop("/instrumentation/gps/scratch/longitude-deg");
3454			last_latitude = getprop("/instrumentation/gps/scratch/latitude-deg");
3455		}else{
3456			var ligne_spaces = "                              ";
3457			ligne_spaces = substr(ligne_spaces,0,8-size(ligne));
3458			var coord_last_id = geo.Coord.new().set_latlon(last_latitude,last_longitude);
3459			setprop("/instrumentation/gps/scratch/max-results", 1);
3460			setprop("/instrumentation/gps/scratch/exact", 0);
3461			setprop("/instrumentation/gps/scratch/query", id);
3462			setprop("/instrumentation/gps/scratch/type", type);
3463			setprop("/instrumentation/gps/command", "search");
3464			last_longitude = getprop("/instrumentation/gps/scratch/longitude-deg");
3465			last_latitude = getprop("/instrumentation/gps/scratch/latitude-deg");
3466
3467			var coord_id = geo.Coord.new().set_latlon(last_latitude,last_longitude);
3468			var distance = coord_last_id.distance_to(coord_id) * 0.000539;
3469			var bearing = coord_last_id.course_to(coord_id);
3470
3471			var ete = distance / cruise_speed;
3472			var ete_hours = int(ete);
3473			var ete_minutes = int(ete*60-ete_hours*60);
3474			var conso = ete * conso_horaire;
3475			distance_total = distance_total + distance;
3476			if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3477				ligne = ligne ~ ligne_spaces ~ sprintf(" %03.0f %03.1f %02.0f:%02.0f %02.1f",bearing,distance,ete_hours,ete_minutes,conso);
3478			}else{
3479				ligne = ligne ~ ligne_spaces ~ sprintf(" %03.0f %03.1f %02.0f:%02.0f %02.1f",bearing,(distance*1.852),ete_hours,ete_minutes,conso);
3480			}
3481		}
3482		setprop("/instrumentation/garmin196/menu_routes/point["~i~"]/texte",ligne);
3483		i=i+1;
3484	}
3485
3486	var ete_total = distance_total / cruise_speed;
3487	var ete_total_hours = int(ete_total);
3488	var ete_total_minutes = int(ete_total*60-ete_total_hours*60);
3489	var conso_total = ete_total * conso_horaire;
3490	if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3491		setprop("/instrumentation/garmin196/menu_routes/total/texte",sprintf("%03.1f %02.0f:%02.0f %02.1f",distance_total,ete_total_hours,ete_total_minutes,conso_total));
3492	}else{
3493		setprop("/instrumentation/garmin196/menu_routes/total/texte",sprintf("%03.1f %02.0f:%02.0f %02.1f",(distance_total*1.852),ete_total_hours,ete_total_minutes,conso_total));
3494	}
3495
3496	for(var j=i;j<10;j=j+1){
3497		setprop("/instrumentation/garmin196/menu_routes/point["~j~"]/texte","");
3498	}
3499	if(i<10){
3500		setprop("/instrumentation/garmin196/menu_routes/point["~i~"]/texte","ENTER TO ADD WAYPOINT");
3501	}else{
3502		i=9;
3503	}
3504	setprop("/instrumentation/garmin196/menu_routes/max_no_ligne_detail",i);
3505}
3506
3507var init_search_route = func(start_string){
3508	if(substr(start_string,size(start_string)-6)=="WPTUSR"){
3509		start_string = substr(start_string,0,size(start_string)-6);
3510	}elsif(substr(start_string,size(start_string)-6)=="WPTTWN"){
3511		start_string = substr(start_string,0,size(start_string)-8);
3512	}
3513	setprop("/instrumentation/garmin196/menu_routes/search/ligne_select",start_string);
3514	setprop("/instrumentation/garmin196/menu_routes/search/x_char",size(start_string)-1);
3515	setprop("/instrumentation/garmin196/menu_routes/search/y_char",searchLastChar(getprop("/instrumentation/garmin196/menu_routes/search/ligne_select"),getprop("/instrumentation/garmin196/menu_routes/search/x_char")));
3516
3517	display_route_waypoint_search();
3518}
3519
3520var display_route_waypoint_search = func{
3521	var ligne_selected = getprop("/instrumentation/garmin196/menu_routes/search/ligne_select");
3522	var x_char = props.globals.getNode("/instrumentation/garmin196/menu_routes/search/x_char").getValue();
3523	ligne_selected = substr(ligne_selected,0,x_char);
3524	ligne_selected = ligne_selected ~ tab_chiffres_lettres[getprop("/instrumentation/garmin196/menu_routes/search/y_char")];
3525	setprop("/instrumentation/garmin196/menu_routes/search/ligne_select",ligne_selected);
3526
3527	var plots = [];
3528	##recherche gps globale
3529	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
3530	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
3531	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
3532	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
3533	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
3534	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("");
3535
3536	setprop("/instrumentation/gps/command", "search");
3537	var i=0;
3538	var flag_continue = getprop("/instrumentation/gps/scratch/valid");
3539	while (flag_continue and i<5) {
3540		var id = getprop("/instrumentation/gps/scratch/ident");
3541		var range = getprop("/instrumentation/gps/scratch/distance-nm");
3542		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
3543		var type = getprop("/instrumentation/gps/scratch/type");
3544
3545		var ligne = id;
3546		if(type=="waypoint"){
3547			type = "wpt";
3548			var type_wpt = substr(id,size(id)-6);
3549			if(type_wpt=="WPTTWN"){#cities
3550				ligne = substr(id,0,size(id)-8);
3551			}elsif(type_wpt=="WPTUSR"){#wpt user
3552				ligne = substr(id,0,size(id)-6);
3553			}
3554		}
3555
3556		ligne = ligne ~ " " ~ type;
3557		var ligne_spaces = "                              ";
3558		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
3559
3560		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
3561		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3562			ligne = ligne ~sprintf("  %3.1fnm",range);
3563		}else{
3564			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
3565		}
3566		var popup_status = getprop("/instrumentation/garmin196/popup_status");
3567
3568
3569		var plot = { id: id,texte: ligne,type: type};
3570		append(plots,plot);
3571
3572		i=i+1;
3573		setprop("/instrumentation/gps/command", "next");
3574		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
3575	}
3576
3577	##recherche gps fix
3578	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
3579	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
3580	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
3581	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
3582	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
3583	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("fix");
3584
3585	setprop("/instrumentation/gps/command", "search");
3586	i=0;
3587	flag_continue = getprop("/instrumentation/gps/scratch/valid");
3588	while (flag_continue and i<5) {
3589		var id = getprop("/instrumentation/gps/scratch/ident");
3590		var range = getprop("/instrumentation/gps/scratch/distance-nm");
3591		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
3592		var type = getprop("/instrumentation/gps/scratch/type");
3593
3594		var ligne = id ~ " " ~ type;
3595		var ligne_spaces = "                              ";
3596		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
3597
3598		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
3599		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3600			ligne = ligne ~sprintf("  %3.1fnm",range);
3601		}else{
3602			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
3603		}
3604		var popup_status = getprop("/instrumentation/garmin196/popup_status");
3605
3606
3607		var plot = { id: id,texte: ligne,type: type};
3608		append(plots,plot);
3609
3610		i=i+1;
3611		setprop("/instrumentation/gps/command", "next");
3612		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
3613	}
3614
3615	##recherche gps vor
3616	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
3617	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
3618	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
3619	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
3620	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
3621	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("vor");
3622
3623	setprop("/instrumentation/gps/command", "search");
3624	i=0;
3625	flag_continue = getprop("/instrumentation/gps/scratch/valid");
3626	while (flag_continue and i<5) {
3627		var id = getprop("/instrumentation/gps/scratch/ident");
3628		var range = getprop("/instrumentation/gps/scratch/distance-nm");
3629		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
3630		var type = getprop("/instrumentation/gps/scratch/type");
3631
3632		var ligne = id ~ " vor";
3633		var ligne_spaces = "                              ";
3634		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
3635
3636		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
3637		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3638			ligne = ligne ~sprintf("  %3.1fnm",range);
3639		}else{
3640			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
3641		}
3642		var popup_status = getprop("/instrumentation/garmin196/popup_status");
3643
3644
3645		var plot = { id: id,texte: ligne,type: type};
3646		append(plots,plot);
3647
3648		i=i+1;
3649		setprop("/instrumentation/gps/command", "next");
3650		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
3651	}
3652
3653	##recherche gps ndb
3654	props.globals.getNode("/instrumentation/gps/scratch/max-results", 1).setIntValue(5);
3655	props.globals.getNode("/instrumentation/gps/scratch/longitude-deg", 1).setDoubleValue(-9999);
3656	props.globals.getNode("/instrumentation/gps/scratch/latitude-deg", 1).setDoubleValue(-9999);
3657	props.globals.getNode("/instrumentation/gps/scratch/exact", 1).setBoolValue(0);
3658	props.globals.getNode("/instrumentation/gps/scratch/query",1).setValue(ligne_selected);
3659	props.globals.getNode("/instrumentation/gps/scratch/type",1).setValue("ndb");
3660
3661	setprop("/instrumentation/gps/command", "search");
3662	i=0;
3663	flag_continue = getprop("/instrumentation/gps/scratch/valid");
3664	while (flag_continue and i<5) {
3665		var id = getprop("/instrumentation/gps/scratch/ident");
3666		var range = getprop("/instrumentation/gps/scratch/distance-nm");
3667		var bearing = getprop("/instrumentation/gps/scratch/mag-bearing-deg");
3668		var type = getprop("/instrumentation/gps/scratch/type");
3669
3670		var ligne = id ~ " ndb";
3671		var ligne_spaces = "                              ";
3672		ligne_spaces = substr(ligne_spaces,0,16-size(ligne));
3673
3674		ligne = ligne ~ ligne_spaces ~ sprintf(" %03.f",bearing);
3675		if(getprop("/instrumentation/garmin196/params/units/distance")==1){
3676			ligne = ligne ~sprintf("  %3.1fnm",range);
3677		}else{
3678			ligne = ligne ~sprintf("  %3.1fkm",range*1.852);
3679		}
3680		var popup_status = getprop("/instrumentation/garmin196/popup_status");
3681
3682
3683		var plot = { id: id,texte: ligne,type: type};
3684		append(plots,plot);
3685
3686		i=i+1;
3687		setprop("/instrumentation/gps/command", "next");
3688		flag_continue = getprop("/instrumentation/gps/scratch/has-next");
3689	}
3690
3691	var plots_sorted = sort (plots, func (a,b) cmp (a.id, b.id));
3692	var nb_plots = size(plots_sorted);
3693	if(nb_plots>9){
3694		nb_plots = 9;
3695	}
3696	for(var j=0;j<nb_plots;j=j+1){
3697		setprop("/instrumentation/garmin196/menu_routes/search/ligne["~j~"]/texte",plots_sorted[j].texte);
3698		setprop("/instrumentation/garmin196/menu_routes/search/ligne["~j~"]/id",plots_sorted[j].id);
3699		setprop("/instrumentation/garmin196/menu_routes/search/ligne["~j~"]/type",plots_sorted[j].type);
3700	}
3701
3702	for(var j=nb_plots;j<9;j=j+1){
3703		setprop("/instrumentation/garmin196/menu_routes/search/ligne["~j~"]/texte","");
3704		setprop("/instrumentation/garmin196/menu_routes/search/ligne["~j~"]/id","");
3705		setprop("/instrumentation/garmin196/menu_routes/search/ligne["~j~"]/type","");
3706	}
3707	setprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected",-1);
3708	setprop("/instrumentation/garmin196/menu_routes/search/max_ligne_selected",nb_plots-1);
3709}
3710
3711var delete_route = func(no_ligne){
3712	for(var i=no_ligne+1;i<11;i=i+1){
3713		if(getprop("/instrumentation/garmin196/routes/route["~i~"]/name")!=nil){
3714			setprop("/instrumentation/garmin196/routes/route["~(i-1)~"]/name",getprop("/instrumentation/garmin196/routes/route["~i~"]/name"));
3715			for(var j=0;j<10;j=j+1){
3716				if(getprop("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/id")!=nil){
3717					setprop("/instrumentation/garmin196/routes/route["~(i-1)~"]/wpts/wpt["~j~"]/id",getprop("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/id"));
3718					setprop("/instrumentation/garmin196/routes/route["~(i-1)~"]/wpts/wpt["~j~"]/type",getprop("/instrumentation/garmin196/routes/route["~i~"]/wpts/wpt["~j~"]/type"));
3719				}
3720			}
3721		}
3722	}
3723	var nb_routes = size(props.globals.getNode("/instrumentation/garmin196/routes",1).getChildren("route"));
3724	if(getprop("/instrumentation/garmin196/routes/route["~no_ligne~"]/name")!=nil){
3725		props.globals.getNode("/instrumentation/garmin196/routes/route["~(nb_routes-1)~"]").remove();
3726	}
3727
3728	save_parameters();
3729}
3730
3731var delete_route_detail = func(no_ligne_liste,no_ligne_detail){
3732	if(no_ligne_detail>0){
3733		for(var i=no_ligne_detail+1;i<10;i=i+1){
3734			if(getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~i~"]/id")!=nil){
3735				setprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~(i-1)~"]/id",getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~i~"]/id"));
3736				setprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~(i-1)~"]/type",getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~i~"]/type"));
3737			}
3738		}
3739
3740		var nb_waypoints = size(props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts",1).getChildren("wpt"));
3741		if(getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~no_ligne_detail~"]/id")!=nil){
3742			props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~(nb_waypoints-1)~"]").remove();
3743		}
3744		save_parameters();
3745	}
3746}
3747
3748var validate_menu_search_routes = func{
3749	var no_ligne = getprop("/instrumentation/garmin196/menu_routes/search/no_ligne_selected");
3750	var id = getprop("/instrumentation/garmin196/menu_routes/search/ligne["~no_ligne~"]/id");
3751	var type = getprop("/instrumentation/garmin196/menu_routes/search/ligne["~no_ligne~"]/type");
3752	var no_ligne_liste = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
3753	var no_ligne_detail = getprop("/instrumentation/garmin196/menu_routes/no_ligne_detail");
3754	setprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~no_ligne_detail~"]/id",id);
3755	setprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~no_ligne_detail~"]/type",type);
3756
3757	var name_wpt0 = getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt[0]/id");
3758	if(substr(name_wpt0,size(name_wpt0)-6)=="WPTUSR"){
3759		name_wpt0 = substr(name_wpt0,0,size(name_wpt0)-6);
3760	}elsif(substr(name_wpt0,size(name_wpt0)-6)=="WPTTWN"){
3761		name_wpt0 = substr(name_wpt0,0,size(name_wpt0)-8);
3762	}
3763	var name_wpt1 = name_wpt0;
3764	var nb_points = size(props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts").getChildren("wpt"));
3765	if(nb_points>1){
3766		name_wpt1 = getprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/wpts/wpt["~(nb_points-1)~"]/id");
3767		if(substr(name_wpt1,size(name_wpt1)-6)=="WPTUSR"){
3768			name_wpt1 = substr(name_wpt1,0,size(name_wpt1)-6);
3769		}elsif(substr(name_wpt1,size(name_wpt1)-6)=="WPTTWN"){
3770			name_wpt1 = substr(name_wpt1,0,size(name_wpt1)-8);
3771		}
3772	}
3773
3774	var name = name_wpt0 ~ " to " ~ name_wpt1;
3775	setprop("/instrumentation/garmin196/routes/route["~no_ligne_liste~"]/name",name);
3776}
3777
3778var load_flight_plan = func(no_ligne){
3779	setprop("/autopilot/route-manager/active",0);
3780	setprop("/autopilot/route-manager/input","@CLEAR");
3781	setprop("/autopilot/route-manager/input","@POP");
3782	var points = props.globals.getNode("/instrumentation/garmin196/routes/route["~no_ligne~"]/wpts/",1);
3783	var last_id = "";
3784	foreach (var e; points.getChildren("wpt")) {
3785		var id = e.getChild("id").getValue();
3786		setprop("/autopilot/route-manager/input",id);
3787		last_id = id;
3788	}
3789	##to correct the index bug appeared in 2.8.0.5
3790	setprop("/autopilot/route-manager/input",last_id);
3791
3792	setprop("/autopilot/route-manager/input","@JUMP0");
3793	setprop("/autopilot/route-manager/input","@ACTIVATE");
3794}
3795
3796var close_fpl_loaded = func{
3797	setprop("/instrumentation/garmin196/menu_routes/fpl-loaded",0);
3798}
3799var affiche_fpl_loaded = func{
3800	setprop("/instrumentation/garmin196/menu_routes/fpl-loaded",1);
3801	settimer(close_fpl_loaded,3);
3802}
3803
3804var close_waypoint_jump = func{
3805	setprop("/instrumentation/garmin196/menu_routes/waypoint-jump",0);
3806}
3807var affiche_waypoint_jump = func{
3808	setprop("/instrumentation/garmin196/menu_routes/waypoint-jump",1);
3809	settimer(close_waypoint_jump,3);
3810}
3811
3812var jump_to_waypoint = func(no_ligne){
3813	var no_ligne_liste = getprop("/instrumentation/garmin196/menu_routes/no_ligne_selected");
3814	load_flight_plan(no_ligne_liste);
3815	setprop("/autopilot/route-manager/input","@JUMP"~no_ligne);
3816}
3817
3818var delete_lines_in_map = func{
3819	for(var i=0;i<9;i=i+1){
3820		setprop("/instrumentation/garmin196/symbols/paths/range_wp_"~i~"_"~(i+1)~"/visible",0);
3821	}
3822}
3823
3824var close_last_wp_reached = func{
3825	setprop("/instrumentation/garmin196/menu_routes/last-wp-reached",0);
3826}
3827var affiche_last_wp_reached = func{
3828	setprop("/instrumentation/garmin196/menu_routes/last-wp-reached",1);
3829	settimer(close_last_wp_reached,3);
3830}
3831
3832##to correct the index bug appeared in 2.8.0.5
3833var correct_index = func{
3834	var index = getprop("/autopilot/route-manager/current-wp");
3835	var max_index = getprop("/autopilot/route-manager/route/num");
3836	if(index>=(max_index-1) and index>0){
3837		setprop("/autopilot/route-manager/current-wp",(index-1));
3838		affiche_last_wp_reached();
3839	}
3840}
3841setlistener("/autopilot/route-manager/current-wp",correct_index,0,0);
3842
3843