###### Primus 1000 system ########
#Primus 1000 class
# ie: var primus = P1000.new(prop);
var P1000 = {
    new : func(prop){
        var m = { parents : [P1000]};
        m.FMS_VNAV =["VNV","FMS"];
        m.NAV_SRC = ["VOR1","VOR2","ILS1","ILS2","FMS"];
        m.NAV_PTR_SRC = [" ","NAV","ADF","FMS"];
        m.TIMER_MSG1 = ["GSPD","TTG","ET"];
        m.TIMER_MSG2 = ["KTS","MIN","   "];
        m.RNG_STEP = [5,10,25,50,100,200,300,600,1200];
        m.MFD_MENU1 = ["                       VNAV     VSPEED     TERR     FMS",
        "            RTN       FMS      SNGP",
        "            RTN       CNCL",
        "SET      RTN        TO        ST EL     VANG        VS",
        "            RTN                      T/O       LNDG",
        "SET      RTN        V1          VR          V2",
        "SET      RTN      VREF      VAPP"];
        m.dh=200;

        m.primus = props.globals.getNode("instrumentation/"~prop,1);
        m.PFD = m.primus.getNode("pfd",1);
            m.PFD_serv = m.PFD.initNode("serviceable",1,"BOOL");
            m.PFD_bright = m.PFD.initNode("dimmer",0.8,"DOUBLE");
            m.PFD_ptr1_src = m.PFD.initNode("nav1-ptr-source",m.NAV_PTR_SRC[0],"STRING");
            m.PFD_ptr2_src = m.PFD.initNode("nav2-ptr-source",m.NAV_PTR_SRC[0],"STRING");
            m.PFD_timer_msg1 = m.PFD.initNode("timer-label",m.TIMER_MSG1[0],"STRING");
            m.PFD_timer_msg2 = m.PFD.initNode("timer-units",m.TIMER_MSG2[0],"STRING");

        m.MFD = m.primus.initNode("mfd",1);
            m.MFD_serv = m.MFD.initNode("serviceable",1,"BOOL");
            m.MFD_bright = m.MFD.initNode("dimmer",0.8,"DOUBLE");
            m.MFD_menu_num = m.MFD.initNode("menu-num",0,"INT");
            m.MFD_menu_line1 = m.MFD.initNode("menu-text",m.MFD_MENU1[0],"STRING");
            m.MFD_menu_col1 = m.MFD.initNode("menu-val[0]","     ","STRING");
            m.MFD_menu_col2 = m.MFD.initNode("menu-val[1]","     ","STRING");
            m.MFD_menu_col3 = m.MFD.initNode("menu-val[2]","     ","STRING");
            m.MFD_menu_col4 = m.MFD.initNode("menu-val[3]","     ","STRING");
            m.MFD_settings = m.MFD.initNode("settings",1);
                m.MFD_to = m.MFD_settings.initNode("to",0.0);
                m.MFD_st_el = m.MFD_settings.initNode("st-el",0.0);
                m.MFD_vang = m.MFD_settings.initNode("vang",0.0);
                m.MFD_vs = m.MFD_settings.initNode("vs",0.0);
                m.MFD_v1 = m.MFD_settings.initNode("v1",0.0);
                m.MFD_vr = m.MFD_settings.initNode("vr",0.0);
                m.MFD_v2 = m.MFD_settings.initNode("v2",0.0);
                m.MFD_vref = m.MFD_settings.initNode("vref",0.0);
                m.MFD_vapp = m.MFD_settings.initNode("vapp",0.0);

        m.EICAS = m.primus.initNode("eicas");
            m.EICAS_serv = m.EICAS.initNode("serviceable",1,"BOOL");

        m.Control = m.primus.initNode("control");
            m.ctl_tcas = m.Control.initNode("tcas",0,"BOOL");
            m.ctl_hsi = m.Control.initNode("hsi",0,"BOOL");
            m.ctl_cp = m.Control.initNode("cp",0,"BOOL");
            m.ctl_hpa = m.Control.initNode("hpa",0,"BOOL");
            m.ctl_gspd = m.Control.initNode("timer",0,"INT");
            m.ctl_nav = m.Control.initNode("nav",0,"INT");
            m.ctl_fms = m.Control.initNode("fms",0,"BOOL");
            m.ctl_RA = m.Control.initNode("RA-alert",1,"BOOL");
            m.ctl_rng = m.Control.initNode("rng-switch",0.0);
            m.DH = m.Control.initNode("decision-height",m.dh,"DOUBLE");
            setprop("instrumentation/mk-viii/inputs/arinc429/decision-height",m.dh);
            setprop("autopilot/route-manager/min-lock-altitude-agl-ft",m.dh);
            m.NavPtr1 =m.Control.initNode("nav1ptr",0.0);
            m.NavPtr2 =m.Control.initNode("nav2ptr",0.0);
            m.NavPtr1_offset =m.PFD.initNode("nav1ptr-hdg-offset",0.0);
            m.NavPtr2_offset =m.PFD.initNode("nav2ptr-hdg-offset",0.0);

        m.CRStype =m.primus.initNode("course-string","CRS");
        m.CRSheading =m.primus.initNode("course-heading",0.0);
        m.GS_inrange =m.primus.initNode("GS-in-range",0,"BOOL");
        m.GS_deflection =m.primus.initNode("GS-deflection",0.0);
        m.CRSdeflection =m.primus.initNode("course-deflection",0.0);
        m.NavDist =m.primus.initNode("nav-dist-nm",0.0);
        m.NavType =m.primus.initNode("nav-type",0,"INT");
        m.NavString =m.primus.initNode("nav-string","VOR1");
        m.NavTime =m.primus.initNode("nav-time","- - : - -");
        m.NavID =m.primus.initNode("nav-id"," ");
        m.fms_mode=m.primus.initNode("fms-mode",m.FMS_VNAV[0],"STRING");
        m.FDmode = m.primus.initNode("fdmode",1,"BOOL");
        m.baro_mode=m.primus.initNode("baro-mode",1,"BOOL");
        m.baro_kpa = m.primus.initNode("baro-kpa","      ");
        m.IAS = props.globals.getNode("instrumentation/airspeed-indicator/indicated-speed-kt",1);
        m.ALT = props.globals.getNode("instrumentation/altimeter/indicated-altitude-ft",1);
        setprop("/instrumentation/kr-87/inputs/adf-btn",1);
    return m;
    },
#### pointer needle update ####
    get_pointer_offset : func(test,src){
        var hdg = getprop("/orientation/heading-magnetic-deg");
        var offset = 0;
        if(test==0 or test == nil)return 0.0;
        if(test == 1){
            offset=getprop("/instrumentation/nav["~src~"]/heading-deg") or 0;
            offset -= hdg;
            if(offset < -180){offset += 360;}
            elsif(offset > 180){offset -= 360;}
        }elsif(test == 2){
            offset = getprop("/instrumentation/adf/indicated-bearing-deg");
        }elsif(test == 3){
            offset = getprop("/autopilot/internal/true-heading-error-deg");
        }
        return offset;
    },
#### control inputs ####
    ctl_set : func(dc){
        var tmp = 0;
        if(dc == "tcas"){
            tmp = me.ctl_tcas.getBoolValue();
            me.ctl_tcas.setBoolValue(1-tmp);
        }
        elsif(dc == "ra-up")
        {
            me.dh+=5;
            if(me.dh>1000)me.dh=1000;
            me.DH.setDoubleValue(me.dh);
            setprop("instrumentation/mk-viii/inputs/arinc429/decision-height",me.dh);
            setprop("autopilot/route-manager/min-lock-altitude-agl-ft",me.dh);
        }
        elsif(dc == "ra-dn")
        {
            me.dh-=5;
            if(me.dh<0)me.dh=0;
            me.DH.setDoubleValue(me.dh);
            setprop("instrumentation/mk-viii/inputs/arinc429/decision-height",me.dh);
            setprop("autopilot/route-manager/min-lock-altitude-agl-ft",me.dh);
            }
            elsif(dc == "hsi")
            {
            tmp = me.ctl_hsi.getBoolValue();
            me.ctl_hsi.setBoolValue(1-tmp);
        }
        elsif(dc=="cp")
        {
            tmp = me.ctl_cp.getBoolValue();
            me.ctl_cp.setBoolValue(1-tmp);
        }
        elsif(dc=="hpa")
        {
            tmp = me.ctl_hpa.getBoolValue();
            me.ctl_hpa.setBoolValue(1-tmp);
        }
        elsif(dc=="ttg")
        {
            tmp = me.ctl_gspd.getValue();
            if(tmp ==0){
                tmp=1;
            }else{
                tmp=0;
            }
            me.ctl_gspd.setIntValue(tmp);
            me.PFD_timer_msg1.setValue(me.TIMER_MSG1[tmp]);
            me.PFD_timer_msg2.setValue(me.TIMER_MSG2[tmp]);
        }
        elsif(dc=="et")
        {
            tmp=me.ctl_gspd.getValue();
            if(tmp ==2)tmp = 0 else tmp=2;
            me.ctl_gspd.setIntValue(tmp);
            me.PFD_timer_msg1.setValue(me.TIMER_MSG1[tmp]);
            me.PFD_timer_msg2.setValue(me.TIMER_MSG2[tmp]);
        }
        elsif(dc=="nav")
        {
            var nv = me.ctl_nav.getValue();
            nv= 1- nv;
            me.ctl_nav.setValue(nv);
            me.ctl_fms.setBoolValue(0);
            me.fms_mode.setValue(me.FMS_VNAV[0]);
            if(getprop("instrumentation/nav["~nv~"]/has-gs")){
                me.NavType.setValue(2 + nv);
            }else{
                me.NavType.setValue(0 + nv);
            }
        }
        elsif(dc=="fms")
        {
            if(getprop("autopilot/route-manager/route/num") > 0){
                me.ctl_fms.setBoolValue(1);
                me.NavType.setValue(4);
                me.fms_mode.setValue(me.FMS_VNAV[1]);
            }
        me.NavString.setValue(me.NAV_SRC[me.NavType.getValue()]);
        }
        elsif(dc=="pointer1-inc")
        {
            tmp = me.NavPtr1.getValue();
            tmp+=1;
            if(tmp > 3)tmp=3;
            me.NavPtr1.setValue(tmp);
            me.PFD_ptr1_src.setValue(me.NAV_PTR_SRC[tmp]);
        }
        elsif(dc=="pointer1-dec")
        {
            tmp = me.NavPtr1.getValue();
            tmp-=1;
            if(tmp < 0)tmp=0;
            me.NavPtr1.setValue(tmp);
            me.PFD_ptr1_src.setValue(me.NAV_PTR_SRC[tmp]);
        }
        elsif(dc=="pointer2-inc")
        {
            tmp = me.NavPtr2.getValue();
            tmp+=1;
            if(tmp > 3)tmp=3;
            me.NavPtr2.setValue(tmp);
            me.PFD_ptr2_src.setValue(me.NAV_PTR_SRC[tmp]);
        }
        elsif(dc=="pointer2-dec")
        {
            tmp = me.NavPtr2.getValue();
            tmp-=1;
            if(tmp <0)tmp=0;
            me.NavPtr2.setValue(tmp);
            me.PFD_ptr2_src.setValue(me.NAV_PTR_SRC[tmp]);
        }
        elsif(dc=="radar-up")
        {
            tmp=me.ctl_rng.getValue();
            tmp +=1;
            if(tmp > 8)tmp=8;
            me.ctl_rng.setValue(tmp);
            setprop("instrumentation/radar/range",me.RNG_STEP[tmp]);
        }
        elsif(dc=="radar-dn")
        {
            tmp=me.ctl_rng.getValue();
            tmp -=1;
            if(tmp < 0)tmp=0;
            me.ctl_rng.setValue(tmp);
            setprop("instrumentation/radar/range",me.RNG_STEP[tmp]);
        }
        elsif(dc=="dat")
        {
            tmp=getprop("instrumentation/radar/display-controls/data");
            tmp=1-tmp;
            setprop("instrumentation/radar/display-controls/data",tmp);
        }
        elsif(dc=="wx")
        {
            tmp=getprop("instrumentation/radar/display-controls/WX");
            tmp=1-tmp;
            setprop("instrumentation/radar/display-controls/WX",tmp);
        }
        elsif(dc=="map")
        {
            tmp=getprop("instrumentation/radar/display-mode");
            if(tmp == "plan"){
                setprop("instrumentation/radar/display-mode","map");
            }else{
                setprop("instrumentation/radar/display-mode","plan");
            }
            setprop("instrumentation/radar/display-controls/pos",tmp);
            setprop("instrumentation/radar/display-controls/symbol",tmp);
        }
    },
#### update nav info  ####
    update_nav : func{
        me.GS_inrange.setValue(0);
        me.GS_deflection.setValue(0);
        var nm_calc = 0;
        var id =" ";
        var ttg = "- - : - -";
        if(me.ctl_fms.getBoolValue()){
            me.CRStype.setValue("DTK");
            me.CRSdeflection.setValue(0);
            var maghdg=getprop("autopilot/settings/true-heading-deg") or 0;
            maghdg -=getprop("environment/magnetic-variation-deg") or 0;
            if(maghdg>359)maghdg-=360;
            if(maghdg<0)maghdg+=360;
            me.CRSheading.setValue(maghdg);
            nm_calc = getprop("/autopilot/route-manager/wp/dist");
            if(nm_calc == nil)nm_calc = 0.0;
            id = getprop("autopilot/route-manager/wp/id") or "   ";
            me.NavType.setValue(4);
            ttg=getprop("autopilot/route-manager/wp/eta") or "- - : - -";
        }else{
            me.CRStype.setValue("CRS");
            nm_calc = 0;
            var nv = me.ctl_nav.getValue();
            me.CRSdeflection.setValue(getprop("/instrumentation/nav["~nv~"]/heading-needle-deflection"));
            me.CRSheading.setValue(getprop("/instrumentation/nav["~nv~"]/radials/selected-deg"));
            if(getprop("/instrumentation/nav["~nv~"]/data-is-valid")){
                nm_calc = getprop("/instrumentation/nav["~nv~"]/nav-distance") or 0.0;
                nm_calc = 0.000539 * nm_calc;
                if(getprop("/instrumentation/nav["~nv~"]/has-gs")){
                    me.NavType.setValue(2);
                    if(nm_calc<30)me.GS_inrange.setValue(1);
                    var df = getprop("/instrumentation/nav["~nv~"]/gs-needle-deflection-norm");
                    me.GS_deflection.setValue(df);
                }
                id = getprop("instrumentation/nav["~nv~"]/nav-id") or "---";
                ttg=getprop("instrumentation/dme/indicated-time-min");
                if(ttg==nil or ttg == 0){
                    ttg="- - : - -";
                }else{
                var buf = ttg;
                ttg=sprintf("%2.0s:%0.2s",buf,buf);
                }
            }
        }
    me.NavDist.setValue(nm_calc);
    me.NavString.setValue(me.NAV_SRC[me.NavType.getValue()]);
    me.NavID.setValue(id);
    me.NavTime.setValue(ttg);
    var RA =0;
    var tmp =me.DH.getValue();
    if(tmp > getprop("position/altitude-agl-ft") and tmp !=0)RA=1;
    me.ctl_RA.setBoolValue(RA);
    },
#### update pfd  ####
    update_pfd : func{
    me.NavPtr1_offset.setValue(me.get_pointer_offset(me.NavPtr1.getValue(),0));
    me.NavPtr2_offset.setValue(me.get_pointer_offset(me.NavPtr2.getValue(),1));
    me.update_nav();
    },
#### MFD controller  ####
    mfd_menu : func(inp){
        var pg =me.MFD_menu_num.getValue();
        var altsetting=getprop("autopilot/settings/target-altitude-ft");
        var blank=" ";
        if(inp=="page0"){
            pg=0;
        }elsif(inp=="page1"){
            if(pg==1){
                pg=2;
            }elsif(pg==0){
                pg=1;
            }
        }elsif(inp=="page2"){
            if(pg==0){
                pg=4;
            }elsif(pg==1){
                pg=3;
            }elsif(pg==4){
                pg=5;
            }
        }elsif(inp=="page3"){
            if(pg==4)pg=6;
        }elsif(inp=="page4"){
        }elsif(inp=="alt-dec"){
            altsetting -=100;
            if(altsetting < 0)altsetting=0;
        }elsif(inp=="alt-inc"){
        altsetting +=100;
            if(altsetting > 45000)altsetting=45000;
        }
        setprop("autopilot/settings/target-altitude-ft",altsetting);

        if(pg == 0){
            me.MFD_menu_col1.setValue(blank);
            me.MFD_menu_col2.setValue(blank);
            me.MFD_menu_col3.setValue(blank);
            me.MFD_menu_col4.setValue(blank);
        }elsif(pg==1){
            me.MFD_menu_col1.setValue(blank);
            me.MFD_menu_col2.setValue(blank);
            me.MFD_menu_col3.setValue(blank);
            me.MFD_menu_col4.setValue(blank);
        }elsif(pg==2){
            me.MFD_menu_col1.setValue(" VNAV ");
            me.MFD_menu_col2.setValue(blank);
            me.MFD_menu_col3.setValue(blank);
            me.MFD_menu_col4.setValue(blank);
        }elsif(pg==3){
            me.MFD_menu_col1.setValue(" -- . -");
            me.MFD_menu_col2.setValue("- - - - - ");
            me.MFD_menu_col3.setValue(" - . - ");
            me.MFD_menu_col4.setValue(" - - - ");
        }elsif(pg==4){
            me.MFD_menu_col1.setValue(blank);
            me.MFD_menu_col2.setValue("SPEEDS");
            me.MFD_menu_col3.setValue("SPEEDS");
            me.MFD_menu_col4.setValue(blank);
            }elsif(pg==5){
            me.MFD_menu_col1.setValue("- - - ");
            me.MFD_menu_col2.setValue(" - - - ");
            me.MFD_menu_col3.setValue(" - - - ");
            me.MFD_menu_col4.setValue(blank);
            }elsif(pg==6){
            me.MFD_menu_col1.setValue(" - - - ");
            me.MFD_menu_col2.setValue(" - - - ");
            me.MFD_menu_col3.setValue(blank);
            me.MFD_menu_col4.setValue(blank);
        }
        me.MFD_menu_num.setValue(pg);
        me.MFD_menu_line1.setValue(me.MFD_MENU1[pg]);
    },
};
#######################################

var primus = P1000.new("primus1000");
var APoff=props.globals.getNode("/autopilot/locks/passive-mode",1);

var update_p1000 = func {
    primus.update_pfd();
    settimer(update_p1000,0);
    }

setlistener("/sim/signals/fdm-initialized", func {
    APoff.setBoolValue(1);
    print("Primus 1000 systems ... check");
    settimer(update_p1000,1);
    });

setlistener("/sim/signals/reinit", func {
    APoff.setBoolValue(1);
    });