Primus , autopilot and autopilot dialog updates ...
[fg:toms-fgdata.git] / Aircraft / Citation-Bravo / Nasal / Primus1000.nas
1 ###### Primus 1000 system ########
2 #Primus 1000 class 
3 # ie: var primus = P1000.new(prop);
4 var P1000 = {
5     new : func(prop1000){
6         m = { parents : [P1000]};
7         m.FMS_VNAV =["VNV","FMS"];
8         m.NAV_SRC = ["VOR1","VOR2","ILS1","ILS2","FMS"];
9         m.RNG_STEP = [5,10,25,50,100,200,300,600,1200];
10         m.MFD_MENU1 = ["                       VNAV     VSPEED     TERR     FMS",
11         "            RTN       FMS      SNGP",
12         "            RTN       CNCL",
13         "SET      RTN        TO        ST EL     VANG        VS",
14         "            RTN                      T/O       LNDG",
15         "SET      RTN        V1          VR          V2",
16         "SET      RTN      VREF      VAPP"];
17         m.primus = props.globals.getNode(prop1000,1);
18         m.PFD = m.primus.getNode("pfd",1);
19         m.PFD_serv = m.PFD.getNode("serviceable",1);
20         m.PFD_serv.setBoolValue(1);
21         m.PFD_bright = m.PFD.getNode("dimmer",1);
22         m.PFD_bright.setDoubleValue(0.8);
23         m.MFD = m.primus.getNode("mfd",1);
24         m.MFD_serv = m.MFD.getNode("serviceable",1);
25         m.MFD_serv.setBoolValue(1);
26         m.MFD_bright = m.MFD.getNode("dimmer",1);
27         m.MFD_bright.setDoubleValue(0.8);
28         m.MFD_menu_num = m.MFD.getNode("menu-num",1);
29         m.MFD_menu_num.setIntValue(0);
30         m.MFD_menu_line1 = m.MFD.getNode("menu-text",1);
31         m.MFD_menu_line1.setValue(m.MFD_MENU1[0]);
32         m.MFD_menu_col1 = m.MFD.getNode("menu-val[0]",1);
33         m.MFD_menu_col1.setValue("     ");
34         m.MFD_menu_col2 = m.MFD.getNode("menu-val[1]",1);
35         m.MFD_menu_col2.setValue("     ");
36         m.MFD_menu_col3 = m.MFD.getNode("menu-val[2]",1);
37         m.MFD_menu_col3.setValue("     ");
38         m.MFD_menu_col4 = m.MFD.getNode("menu-val[3]",1);
39         m.MFD_menu_col4.setValue("     ");
40         m.DC550 = m.primus.getNode("dc550",1);
41         m.dc550_hsi = m.DC550.getNode("hsi",1);
42         m.dc550_hsi.setBoolValue(0);
43         m.dc550_cp = m.DC550.getNode("cp",1);
44         m.dc550_cp.setBoolValue(0);
45         m.dc550_hpa = m.DC550.getNode("hpa",1);
46         m.dc550_hpa.setBoolValue(0);
47         m.dc550_gspd = m.DC550.getNode("timer",1);
48         m.dc550_gspd.setIntValue(0);
49         m.dc550_nav = m.DC550.getNode("nav",1);
50         m.dc550_nav.setIntValue(0);
51         m.dc550_fms = m.DC550.getNode("fms",1);
52         m.dc550_fms.setBoolValue(0);
53         m.dc550_RA = m.DC550.getNode("RA-alert",1);
54         m.dc550_RA.setBoolValue(1);
55         m.DH = props.globals.getNode("instrumentation/mk-viii/inputs/arinc429/decision-height",1);
56         m.DH.setDoubleValue(200);
57         m.mc800_rng = m.primus.getNode("mc800/rng-switch",1);
58         m.mc800_rng.setDoubleValue(0);
59         m.NavPtr1 =m.DC550.getNode("nav1ptr",1);
60         m.NavPtr1.setDoubleValue(0);
61         m.NavPtr2 =m.DC550.getNode("nav2ptr",1);
62         m.NavPtr2.setDoubleValue(0);
63         m.NavPtr1_offset =m.DC550.getNode("nav1ptr-hdg-offset",1);
64         m.NavPtr1_offset.setDoubleValue(0);
65         m.NavPtr2_offset =m.DC550.getNode("nav2ptr-hdg-offset",1);
66         m.NavPtr2_offset.setDoubleValue(0);
67          m.NavDist =m.primus.getNode("nav-dist-nm",1);
68         m.NavDist.setDoubleValue(0);
69         m.NavType =m.primus.getNode("nav-type",1);
70         m.NavType.setIntValue(0);
71         m.NavString =m.primus.getNode("nav-string",1);
72         m.NavString.setValue("VOR1");
73         m.NavTime =m.primus.getNode("nav-time",1);
74         m.NavTime.setValue("- - : - -");
75         m.NavID =m.primus.getNode("nav-id",1);
76         m.NavID.setValue("");
77         m.fms_mode=m.primus.getNode("fms-mode",1);
78         m.fms_mode.setValue(m.FMS_VNAV[0]);
79         m.FDmode = m.primus.getNode("fdmode",1);
80         m.FDmode.setBoolValue(1);
81         m.baro_mode=m.primus.getNode("baro-mode",1);
82         m.baro_mode.setBoolValue(1);
83         m.baro_kpa = m.primus.getNode("baro-kpa",1);
84         m.baro_kpa.setValue("     ");
85         m.IAS = props.globals.getNode("instrumentation/airspeed-indicator/indicated-speed-kt",1);
86         m.ALT = props.globals.getNode("instrumentation/altimeter/indicated-altitude-ft",1);
87         m.TAS = m.primus.getNode("TAS",1);
88         m.TAS.setDoubleValue(0.0);
89     return m;
90     },
91 #### convert inhg to kpa ####
92     calc_kpa : func(){
93         var kp = getprop("instrumentation/altimeter/setting-inhg");
94         var buf="";
95         if(me.dc550_hpa.getBoolValue()){
96             kp = kp * 33.8637526;
97             buf = sprintf("%4.0f",kp);
98         }else{
99             buf = sprintf("%2.2f",kp);
100         }
101         me.baro_kpa.setValue(buf);
102     },
103 #### calculate TAS ####
104     calc_tas : func(){
105         var tas = me.ALT.getValue();
106         if(tas ==nil)return;
107         tas = (tas*0.001) *5;
108         var ias=me.IAS.getValue();
109         me.TAS.setValue(ias+tas);
110     },
111 #### pointer needle update ####
112     get_pointer_offset : func(test,src){
113         var hdg = getprop("/orientation/heading-magnetic-deg");
114         if(test==0 or test == nil)return 0.0;
115         if(test == 1){
116             offset=getprop("/instrumentation/nav["~src~"]/heading-deg");
117             if(offset == nil)offset=0.0;
118             offset -= hdg;
119             if(offset < -180){offset += 360;}
120             elsif(offset > 180){offset -= 360;}
121         }elsif(test == 2){
122             offset = getprop("/instrumentation/kr-87/outputs/needle-deg");
123         }elsif(test == 3){
124                 offset = getprop("/autopilot/internal/true-heading-error-deg");
125         }
126         return offset;
127     },
128 #### dc550 control ####
129     dc550_set : func(dcmode){
130         var tmp = 0;
131         var dc = dcmode;
132         if(dc == "ra-dn"){
133             tmp = me.DH.getValue();
134             tmp -=5;
135             if(tmp<0)tmp=0;
136             me.DH.setValue(tmp);
137         }elsif(dc == "ra-up"){
138             tmp = me.DH.getValue();
139             tmp +=5;
140             if(tmp>1000)tmp=1000;
141             me.DH.setValue(tmp);
142         }elsif(dc == "hsi"){
143             tmp = me.dc550_hsi.getBoolValue();
144             me.dc550_hsi.setBoolValue(1-tmp);
145         }elsif(dc=="cp"){
146             tmp = me.dc550_cp.getBoolValue();
147             me.dc550_cp.setBoolValue(1-tmp);
148         }elsif(dc=="hpa"){
149             tmp = me.dc550_hpa.getBoolValue();
150             me.dc550_hpa.setBoolValue(1-tmp);
151             me.calc_kpa();
152         }elsif(dc=="ttg"){
153             tmp = me.dc550_gspd.getValue();
154             if(tmp ==0){
155                 tmp=1;
156             }else{
157                 tmp=0;
158             }
159             me.dc550_gspd.setIntValue(tmp);
160         }elsif(dc=="et"){
161             me.dc550_gspd.setIntValue(2);
162         }elsif(dc=="nav"){
163             var nv = me.dc550_nav.getValue();
164             nv= 1- nv;
165             me.dc550_nav.setValue(nv);
166             me.dc550_fms.setBoolValue(0);
167             me.fms_mode.setValue(me.FMS_VNAV[0]);
168             if(getprop("instrumentation/nav["~nv~"]/has-gs")){
169                 me.NavType.setValue(2 + nv);
170             }else{
171                 me.NavType.setValue(0 + nv);
172             }
173         }elsif(dc=="fms"){
174             if(getprop("autopilot/route-manager/route/num") > 0){
175                 me.dc550_fms.setBoolValue(1);
176                 me.NavType.setValue(4);
177                 me.fms_mode.setValue(me.FMS_VNAV[1]);
178             }
179         me.NavString.setValue(me.NAV_SRC[me.NavType.getValue()]);
180         }
181     },
182 #### update nav info  ####
183     update_nav : func{
184         var nm_calc = 0;
185         var id =" ";
186         var ttg = "- - : - -";
187         if(me.dc550_fms.getBoolValue()){
188             nm_calc = getprop("/autopilot/route-manager/wp/dist");
189             if(nm_calc == nil)nm_calc = 0.0;
190             id = getprop("autopilot/route-manager/wp/id");
191             if(id ==nil)id= "   ";
192             me.NavType.setValue(4);
193             ttg=getprop("autopilot/route-manager/wp/eta");
194         }else{
195             nm_calc = 0;
196             var nv = me.dc550_nav.getValue();
197             if(getprop("/instrumentation/nav["~nv~"]/data-is-valid")){
198                 nm_calc = getprop("/instrumentation/nav["~nv~"]/nav-distance");
199                 if(nm_calc == nil)nm_calc = 0.0;
200                 nm_calc = 0.000539 * nm_calc;
201                 if(getprop("/instrumentation/nav["~nv~"]/has-gs"))me.NavType.setValue(2);
202                 id = getprop("instrumentation/nav["~nv~"]/nav-id");
203                 if(id ==nil)id= "---";
204                 ttg=getprop("instrumentation/dme/indicated-time-min");
205                 if(ttg==nil or ttg == 0){
206                     ttg="- - : - -";
207                 }else{
208                 var buf = ttg;
209                 ttg=sprintf("%2.0s:%0.2s",buf,buf);
210                 }
211             }
212         }
213     me.NavDist.setValue(nm_calc);
214     me.NavString.setValue(me.NAV_SRC[me.NavType.getValue()]);
215     me.NavID.setValue(id);
216     me.NavTime.setValue(ttg);
217     var RA =0;
218     tmp =me.DH.getValue();
219     if(tmp > getprop("position/altitude-agl-ft") and tmp !=0)RA=1;
220     me.dc550_RA.setBoolValue(RA);
221     },
222 #### update pfd  ####
223     update_pfd : func{
224     me.NavPtr1_offset.setValue(me.get_pointer_offset(me.NavPtr1.getValue(),0));
225     me.NavPtr2_offset.setValue(me.get_pointer_offset(me.NavPtr2.getValue(),1));
226     me.update_nav();
227         primus.calc_tas();
228     },
229 #### MC800 controls  ####
230     mc800_input : func(mcmd){
231         var tmp =0;
232         if(mcmd=="radar-up"){
233             tmp=me.mc800_rng.getValue();
234             tmp +=1;
235             if(tmp > 8)tmp=8;
236             me.mc800_rng.setValue(tmp);
237             setprop("instrumentation/radar/range",me.RNG_STEP[tmp]);
238         }elsif(mcmd=="radar-dn"){
239             tmp=me.mc800_rng.getValue();
240             tmp -=1;
241             if(tmp < 0)tmp=0;
242             me.mc800_rng.setValue(tmp);
243             setprop("instrumentation/radar/range",me.RNG_STEP[tmp]);
244         }elsif(mcmd=="dat"){
245             tmp=getprop("instrumentation/radar/display-controls/data");
246             tmp=1-tmp;
247             setprop("instrumentation/radar/display-controls/data",tmp);
248         }elsif(mcmd=="wx"){
249             tmp=getprop("instrumentation/radar/display-controls/WX");
250             tmp=1-tmp;
251             setprop("instrumentation/radar/display-controls/WX",tmp);
252         }elsif(mcmd=="tcas"){
253             tmp=getprop("instrumentation/radar/display-controls/pos");
254             tmp=1-tmp;
255             setprop("instrumentation/radar/display-controls/pos",tmp);
256             setprop("instrumentation/radar/display-controls/symbol",tmp);
257         }elsif(mcmd=="map"){
258             tmp=getprop("instrumentation/radar/display-mode");
259             if(tmp == "plan"){
260                 setprop("instrumentation/radar/display-mode","map");
261             }else{
262                 setprop("instrumentation/radar/display-mode","plan");
263             }
264             setprop("instrumentation/radar/display-controls/pos",tmp);
265             setprop("instrumentation/radar/display-controls/symbol",tmp);
266         }
267     },
268 #### MFD controller  ####
269     mfd_menu : func(inp){
270         var pg =me.MFD_menu_num.getValue();
271         var altsetting=getprop("autopilot/settings/target-altitude-ft");
272         if(inp=="page0"){
273             pg=0;
274         }elsif(inp=="page1"){
275             if(pg==1){
276                 pg=2;
277             }elsif(pg==0){
278                 pg=1;
279             }
280         }elsif(inp=="page2"){
281             if(pg==0){
282                 pg=4;
283             }elsif(pg==1){
284                 pg=3;
285             }elsif(pg==4){
286                 pg=5;
287             }
288         }elsif(inp=="page3"){
289             if(pg==4)pg=6;
290         }elsif(inp=="page4"){
291         }elsif(inp=="alt-dec"){
292             altsetting -=100;
293             if(altsetting < 0)altsetting=0;
294         }elsif(inp=="alt-inc"){
295         altsetting +=100;
296             if(altsetting > 45000)altsetting=45000;
297         }
298         setprop("autopilot/settings/target-altitude-ft",altsetting);
299         
300         if(pg == 0){
301             me.MFD_menu_col1.setValue("        ");
302             me.MFD_menu_col2.setValue("        ");
303             me.MFD_menu_col3.setValue("        ");
304             me.MFD_menu_col4.setValue("        ");
305         }elsif(pg==1){
306             me.MFD_menu_col1.setValue("        ");
307             me.MFD_menu_col2.setValue("        ");
308             me.MFD_menu_col3.setValue("        ");
309             me.MFD_menu_col4.setValue("        ");
310         }elsif(pg==2){
311             me.MFD_menu_col1.setValue("  VNAV ");
312             me.MFD_menu_col2.setValue("        ");
313             me.MFD_menu_col3.setValue("        ");
314             me.MFD_menu_col4.setValue("        ");
315         }elsif(pg==3){
316             me.MFD_menu_col1.setValue("  - - . - ");
317             me.MFD_menu_col2.setValue("  - - - - -");
318             me.MFD_menu_col3.setValue("  - . -");
319             me.MFD_menu_col4.setValue("- - - - - -");
320         }elsif(pg==4){
321             me.MFD_menu_col1.setValue("        ");
322             me.MFD_menu_col2.setValue("SPEEDS");
323             me.MFD_menu_col3.setValue("SPEEDS");
324             me.MFD_menu_col4.setValue("        ");
325             }elsif(pg==5){
326             me.MFD_menu_col1.setValue("  - - -");
327             me.MFD_menu_col2.setValue("  - - - ");
328             me.MFD_menu_col3.setValue("  - - - ");
329             me.MFD_menu_col4.setValue("        ");
330             }elsif(pg==6){
331             me.MFD_menu_col1.setValue("  - - - ");
332             me.MFD_menu_col2.setValue("  - - - ");
333             me.MFD_menu_col3.setValue("       ");
334             me.MFD_menu_col4.setValue("       ");
335         }
336         me.MFD_menu_num.setValue(pg);
337         me.MFD_menu_line1.setValue(me.MFD_MENU1[pg]);
338     },
339 };
340 #######################################
341
342 var primus = P1000.new("instrumentation/primus1000");
343 var APoff=props.globals.getNode("/autopilot/locks/passive-mode",1);
344
345 var update_p1000 = func {
346     primus.update_pfd();
347     settimer(update_p1000,0);
348     }
349
350 setlistener("/sim/signals/fdm-initialized", func {
351     APoff.setBoolValue(1);
352     props.globals.getNode("instrumentation/primus1000/pfd/serviceable",1).setBoolValue(1);
353     props.globals.getNode("instrumentation/primus1000/mfd/serviceable",1).setBoolValue(1);
354     props.globals.getNode("instrumentation/primus1000/mfd/mode",1).setValue("normal");
355     print("Primus 1000 systems ... check");
356     settimer(update_p1000,1);
357     });
358
359
360 setlistener("instrumentation/altimeter/setting-inhg", func(){
361     primus.calc_kpa();
362     },1,0);
363