1
0
Fork 0

Implement new fuel system

This commit is contained in:
Matthew Maring 2021-02-21 09:25:30 -05:00
parent 174759c8cb
commit 099a1b84ca
16 changed files with 1367 additions and 166 deletions

View file

@ -198,6 +198,7 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
</propulsion>
<system file="glass-effect"/>
<system file="fuel-driver"/>
<system file="a320-fbw"/>
<system file="a320-fcs"/>
<system file="a320-fuel"/>

View file

@ -197,6 +197,7 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
</propulsion>
<system file="glass-effect"/>
<system file="fuel-driver"/>
<system file="a320-fbw"/>
<system file="a320-fcs"/>
<system file="a320-fuel"/>

View file

@ -197,6 +197,7 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
</propulsion>
<system file="glass-effect"/>
<system file="fuel-driver"/>
<system file="a320-fbw"/>
<system file="a320-fcs"/>
<system file="a320-fuel"/>

View file

@ -197,6 +197,7 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
</propulsion>
<system file="glass-effect"/>
<system file="fuel-driver"/>
<system file="a320-fbw"/>
<system file="a320-fcs"/>
<system file="a320-fuel"/>

View file

@ -197,6 +197,7 @@ xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
</propulsion>
<system file="glass-effect"/>
<system file="fuel-driver"/>
<system file="a320-fbw"/>
<system file="a320-fcs"/>
<system file="a320-fuel"/>

View file

@ -269,6 +269,9 @@ var postInit = func() {
var FMGCNodes = {
costIndex: props.globals.initNode("/FMGC/internal/cost-index", 0, "DOUBLE"),
crzFt: props.globals.initNode("/FMGC/internal/crz-ft", 0, "DOUBLE"),
zfw: props.globals.initNode("/FMGC/internal/zfw", 0, "DOUBLE"),
tow: props.globals.initNode("/FMGC/internal/tow", 0, "DOUBLE"),
flexSet: props.globals.initNode("/FMGC/internal/flex-set", 0, "BOOL"),
flexTemp: props.globals.initNode("/FMGC/internal/flex", 0, "INT"),
mngSpdAlt: props.globals.getNode("/FMGC/internal/mng-alt-spd"),
@ -1097,11 +1100,14 @@ var timer3blockFuel = maketimer(1, func() {
var timer5fuelPred = maketimer(1, func() {
if (pts.Sim.Time.elapsedSec.getValue() > getprop("/FMGC/internal/fuel-pred-time") + 5) {
#updateFuel();
flightPlanController.calculateVerticalPoints(0);
flightPlanController.calculateVerticalPoints(1);
flightPlanController.calculateVerticalPoints(2);
fmgc.FMGCInternal.fuelCalculating = 0;
fmgc.fuelCalculating.setValue(0);
flightPlanController.calculateTOCPoint(0);
flightPlanController.calculateTOCPoint(1);
flightPlanController.calculateTOCPoint(2);
flightPlanController.calculateTODPoint(0);
flightPlanController.calculateTODPoint(1);
flightPlanController.calculateTODPoint(2);
setprop("/FMGC/internal/fuel-pred-time", -99);
timer5fuelPred.stop();
}

View file

@ -189,16 +189,16 @@ var SimbriefParser = {
_foundTOC = 1;
#setprop("/autopilot/route-manager/vnav/tc/latitude-deg",ofpFix.getNode("pos_lat").getValue());
#setprop("/autopilot/route-manager/vnav/tc/longitude-deg",ofpFix.getNode("pos_long").getValue());
#ident = "(T/C)";
continue; # restore skip TOC/TOD
ident = "(T/C)";
continue;
}
if (ident == "TOD") {
_foundTOD = 1;
#setprop("/autopilot/route-manager/vnav/td/latitude-deg",ofpFix.getNode("pos_lat").getValue());
#setprop("/autopilot/route-manager/vnav/td/longitude-deg",ofpFix.getNode("pos_long").getValue());
#ident = "(T/D)";
continue; # restore skip TOC/TOD
ident = "(T/D)";
continue;
}
coords = geo.Coord.new();
@ -277,6 +277,7 @@ var SimbriefParser = {
# Set cruise altitude
fmgc.FMGCInternal.crzFt = me.OFP.getNode("general/initial_altitude").getValue();
fmgc.FMGCNodes.crzFt.setValue(fmgc.FMGCInternal.crzFt);
fmgc.FMGCInternal.crzFl = fmgc.FMGCInternal.crzFt / 100;
fmgc.FMGCInternal.crzTemp = (((fmgc.FMGCInternal.crzFt / 1000) * -2) + 15) + me.OFP.getNode("general/avg_temp_dev").getValue();
fmgc.FMGCInternal.crzProg = fmgc.FMGCInternal.crzFt / 100;
@ -314,8 +315,10 @@ var SimbriefParser = {
fmgc.FMGCInternal.block = me.store1.getChild("plan_ramp").getValue() / 1000;
fmgc.FMGCInternal.blockSet = 1;
fmgc.FMGCInternal.zfw = me.store2.getChild("est_zfw").getValue() / 1000;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
} else {
fmgc.FMGCInternal.taxiFuel = (me.store1.getChild("taxi").getValue() / LBS2KGS) / 1000;
fmgc.FMGCInternal.taxiFuelSet = 1;
@ -334,8 +337,10 @@ var SimbriefParser = {
fmgc.FMGCInternal.block = (me.store1.getChild("plan_ramp").getValue() / LBS2KGS) / 1000;
fmgc.FMGCInternal.blockSet = 1;
fmgc.FMGCInternal.zfw = (me.store2.getChild("est_zfw").getValue() / LBS2KGS) / 1000;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
}
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;

View file

@ -18,7 +18,7 @@ var magHDG = props.globals.getNode("/orientation/heading-magnetic-deg", 1);
var trueHDG = props.globals.getNode("/orientation/heading-deg", 1);
var flightPlanController = {
flightplans: [createFlightplan(), createFlightplan(), createFlightplan(), nil, nil],
flightplans: [createFlightplan(), createFlightplan(), createFlightplan(), nil],
temporaryFlag: [0, 0],
# These flags are only for the main flgiht-plan
@ -39,14 +39,13 @@ var flightPlanController = {
num: [props.globals.initNode("/FMGC/flightplan[0]/num", 0, "INT"), props.globals.initNode("/FMGC/flightplan[1]/num", 0, "INT"), props.globals.initNode("/autopilot/route-manager/route/num", 0, "INT")],
arrivalIndex: [0, 0, 0],
arrivalDist: props.globals.getNode("/autopilot/route-manager/distance-remaining-nm"),
totalDist: props.globals.getNode("/autopilot/route-manager/total-distance"),
fromWptTime: nil,
fromWptAlt: nil,
_timeTemp: nil,
_altTemp: nil,
decelPoint: nil,
tocIndex: [-99, -99, -99],
tocPoint: nil,
todIndex: [99, 99, 99],
todPoint: nil,
init: func() {
@ -274,51 +273,16 @@ var flightPlanController = {
fmgc.windController.insertWind(n, index, 0, "(DECEL)");
},
insertTOC: func(n) {
var indexTOC = 0;
var toc_distance = 0;
for (var wpt = 1; wpt <= me.arrivalIndex[n]; wpt += 1) {
toc_distance += me.flightplans[n].getWP(wpt).leg_distance;
if (toc_distance > fmgc.FMGCInternal.clbDist) {
indexTOC = wpt;
break;
}
}
me.tocIndex[n] = indexTOC;
me.tocPoint = me.flightplans[n].pathGeod(0, fmgc.FMGCInternal.clbDist);
me.flightplans[n].insertWP(createWP({lat: me.tocPoint.lat, lon: me.tocPoint.lon}, "(T/C)"), me.tocIndex[n]);
#me.flightplans[n].getWP(me.tocIndex[n]).hidden = 1;
fmgc.windController.insertWind(n, me.tocIndex[n], 0, "(T/C)");
if (n == 2) {
#me.tocNode = props.globals.initNode("/autopilot/route-manager/vnav/tc");
setprop("/autopilot/route-manager/vnav/tc/latitude-deg", me.tocPoint.lat);
setprop("/autopilot/route-manager/vnav/tc/longitude-deg", me.tocPoint.lon);
}
me.flightPlanChanged(n, 0);
insertTOC: func(n, pos, index) {
me.flightplans[n].insertWP(createWP(pos, "(T/C)"), index);
#me.flightplans[n].getWP(index[n]).hidden = 1;
fmgc.windController.insertWind(n, index, 0, "(T/C)");
},
insertTOD: func(n) {
var indexTOD = 0;
var tod_distance = 0;
for (var wpt = me.arrivalIndex[n]; wpt >= 1; wpt -= 1) {
tod_distance += me.flightplans[n].getWP(wpt).leg_distance;
if (tod_distance > fmgc.FMGCInternal.desDist) {
indexTOD = wpt;
break;
}
# check for tod before toc
}
me.todIndex[n] = indexTOD;
me.todPoint = me.flightplans[n].pathGeod(me.arrivalIndex[n], -fmgc.FMGCInternal.desDist);
me.flightplans[n].insertWP(createWP({lat: me.todPoint.lat, lon: me.todPoint.lon}, "(T/D)"), me.todIndex[n]);
#me.flightplans[n].getWP(me.todIndex).hidden = 1;
fmgc.windController.insertWind(n, me.todIndex[n], 0, "(T/D)");
if (n == 2) {
#me.todNode = props.globals.initNode("/autopilot/route-manager/vnav/td");
setprop("/autopilot/route-manager/vnav/td/latitude-deg", me.todPoint.lat);
setprop("/autopilot/route-manager/vnav/td/longitude-deg", me.todPoint.lon);
}
me.flightPlanChanged(n, 0);
insertTOD: func(n, pos, index) {
me.flightplans[n].insertWP(createWP(pos, "(T/D)"), index);
#me.flightplans[n].getWP(index[n]).hidden = 1;
fmgc.windController.insertWind(n, index, 0, "(T/D)");
},
# childWPBearingDistance - return waypoint at bearing and distance from specified waypoint ghost
@ -819,95 +783,95 @@ var flightPlanController = {
}
# todo create waypoint, insert to flightplan, as non-sequence one (gets skipped in sequencing code
me.insertDecel(n,{lat: me.decelPoint.lat, lon: me.decelPoint.lon}, me.indexTemp);
me.insertDecel(n, {lat: me.decelPoint.lat, lon: me.decelPoint.lon}, me.indexTemp);
me.flightPlanChanged(n, 0);
},
deleteVerticalWaypoint: func(n, index, type) {
if ((type == "tc" and index != -99) or (type == "td" and index != 99)) {
if (type == "tc") {
me.tocIndex[n] = -99;
me.tocPoint = nil;
} else if (type == "td") {
me.todIndex[n] = 99;
me.todPoint = nil;
}
me.flightplans[n].deleteWP(index);
fmgc.windController.deleteWind(n, index);
if (n == 2 and type == "tc") { #and me.tocNode != nil) {
setprop("/autopilot/route-manager/vnav/tc/latitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
setprop("/autopilot/route-manager/vnav/tc/longitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
#me.tocNode.remove();
#me.tocNode = nil;
} else if (n == 2 and type == "td") { #and me.todNode != nil) {
setprop("/autopilot/route-manager/vnav/td/latitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
setprop("/autopilot/route-manager/vnav/td/longitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
#me.todNode.remove();
#me.todNode = nil;
}
me.flightPlanChanged(n, 0);
} else {
print(type, " couldn't be deleted: ", index, " | plan: ", n);
calculateTOCPoint: func(n) {
if (me.getPlanSizeNoDiscont(n) <= 1 or fmgc.FMGCInternal.clbReached) {
setprop("/autopilot/route-manager/vnav/tc/latitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
setprop("/autopilot/route-manager/vnav/tc/longitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
return;
}
if (fmgc.FMGCInternal.fuelCalculating) {
return;
}
me.indexTOC = me.getIndexOfTOC(n);
if (me.indexTOC != -99) {
me.flightplans[n].deleteWP(me.indexTOC);
fmgc.windController.deleteWind(n, me.indexTOC);
me.flightPlanChanged(n, 0);
}
if (!fmgc.FMGCInternal.clbSet) {
return;
}
me.indexTOC = 1;
me.dist = 0;
for (var wpt = 1; wpt <= me.arrivalIndex[n]; wpt += 1) {
me.dist += me.flightplans[n].getWP(wpt).leg_distance;
if (me.dist > fmgc.FMGCInternal.clbDist) {
me.indexTOC = wpt;
break;
}
}
me.tocPoint = me.flightplans[n].pathGeod(0, fmgc.FMGCInternal.clbDist);
if (n == 2) {
#me.tocNode = props.globals.initNode("/autopilot/route-manager/vnav/tc");
setprop("/autopilot/route-manager/vnav/tc/latitude-deg", me.tocPoint.lat);
setprop("/autopilot/route-manager/vnav/tc/longitude-deg", me.tocPoint.lon);
}
me.insertTOC(n, {lat: me.tocPoint.lat, lon: me.tocPoint.lon}, me.indexTOC);
me.flightPlanChanged(n, 0);
},
calculateVerticalPoints: func(n, explicit = 0) {
if (me.getPlanSizeNoDiscont(n) <= 1) {
# to do: hide toc and tod
return;
calculateTODPoint: func(n) {
if (me.getPlanSizeNoDiscont(n) <= 1 or fmgc.FMGCInternal.desReached) {
setprop("/autopilot/route-manager/vnav/td/latitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
setprop("/autopilot/route-manager/vnav/td/longitude-deg", 0.0); # temporary fix, for some reason the symbol refuses to go away
return;
}
if (fmgc.FMGCInternal.clbSet and !fmgc.FMGCInternal.clbReached) {
if (explicit) {
me.deleteVerticalWaypoint(n, me.getIndexOfTOC(n), "tc");
me.insertTOC(n);
} else {
if (me.tocIndex[n] != -99) {
var indexTOC_old = me.getIndexOfTOC(n);
var tocPoint_old = me.flightplans[n].getWP(indexTOC_old);
me.flightplans[4] = me.flightplans[n].clone();
me.flightplans[4].deleteWP(indexTOC_old);
var tocPoint_new = me.flightplans[4].pathGeod(0, fmgc.FMGCInternal.clbDist);
me.flightplans[4] = nil;
if (tocPoint_new.lat != tocPoint_old.lat or tocPoint_new.lon != tocPoint_old.lon) {
me.deleteVerticalWaypoint(n, indexTOC_old, "tc");
me.insertTOC(n);
}
} else {
me.insertTOC(n);
}
}
} else {
me.deleteVerticalWaypoint(n, me.getIndexOfTOC(n), "tc");
if (fmgc.FMGCInternal.fuelCalculating) {
return;
}
if (fmgc.FMGCInternal.desSet and !fmgc.FMGCInternal.desReached) {
if (explicit) {
me.deleteVerticalWaypoint(n, me.getIndexOfTOD(n), "td");
me.insertTOD(n);
} else {
if (me.todIndex[n] != 99) {
var indexTOD_old = me.getIndexOfTOD(n);
var todPoint_old = me.flightplans[n].getWP(indexTOD_old);
me.flightplans[4] = me.flightplans[n].clone();
me.flightplans[4].deleteWP(indexTOD_old);
var todPoint_new = me.flightplans[4].pathGeod(me.arrivalIndex[n] - 1, -fmgc.FMGCInternal.desDist);
me.flightplans[4] = nil;
if (todPoint_new.lat != todPoint_old.lat or todPoint_new.lon != todPoint_old.lon) {
me.deleteVerticalWaypoint(n, indexTOD_old, "td");
me.insertTOD(n);
}
} else {
me.insertTOD(n);
}
}
} else {
me.deleteVerticalWaypoint(n, me.getIndexOfTOD(n), "td");
me.indexTOD = me.getIndexOfTOD(n);
if (me.indexTOD != -99) {
me.flightplans[n].deleteWP(me.indexTOD);
fmgc.windController.deleteWind(n, me.indexTOD);
me.flightPlanChanged(n, 0);
}
if (!fmgc.FMGCInternal.desSet) {
return;
}
me.indexTOD = me.arrivalIndex[n];
me.dist = 0;
for (var wpt = me.arrivalIndex[n]; wpt >= 1; wpt -= 1) {
me.dist += me.flightplans[n].getWP(wpt).leg_distance;
if (me.dist > fmgc.FMGCInternal.desDist) {
me.indexTOD = wpt;
break;
}
# check for tod before toc
}
me.todPoint = me.flightplans[n].pathGeod(me.arrivalIndex[n], -fmgc.FMGCInternal.desDist);
if (n == 2) {
#me.tocNode = props.globals.initNode("/autopilot/route-manager/vnav/tc");
setprop("/autopilot/route-manager/vnav/td/latitude-deg", me.todPoint.lat);
setprop("/autopilot/route-manager/vnav/td/longitude-deg", me.todPoint.lon);
}
me.insertTOD(n, {lat: me.todPoint.lat, lon: me.todPoint.lon}, me.indexTOD);
me.flightPlanChanged(n, 0);
},
# insertPlaceBearingDistance - insert PBD waypoint at specified index,
@ -994,7 +958,7 @@ var flightPlanController = {
var errs = [];
call(func {
me.currentToWptIndex.setValue(1);
}, nil, nil, nil,errs);
}, nil, nil, nil, errs);
if (size(errs) != 0) { debug.printerror(errs); }
}
me.active.setValue(1);
@ -1022,7 +986,8 @@ var flightPlanController = {
if (runCalculate and callCalculate) {
me.calculateDecelPoint(n);
me.calculateVerticalPoints(n, 1);
me.calculateTOCPoint(n);
me.calculateTODPoint(n);
}
}

View file

@ -1,5 +1,5 @@
# A3XX FMGC Fuel Driver
# Copyright (c) 2020 Matthew Maring (msattmaring)
# Copyright (c) 2020 Matthew Maring (mattmaring)
########
# FUEL #
@ -85,7 +85,7 @@ var updateFuel = func {
if (fmgc.FMGCInternal.toFromSet and fmgc.FMGCInternal.crzSet and fmgc.FMGCInternal.crzTempSet and fmgc.FMGCInternal.zfwSet) {
crz = fmgc.FMGCInternal.crzFl;
temp = fmgc.FMGCInternal.crzTemp;
dist = flightPlanController.arrivalDist.getValue();
dist = flightPlanController.totalDist.getValue();
trpWind = fmgc.FMGCInternal.tripWind;
wind_value = fmgc.FMGCInternal.tripWindValue;
@ -94,23 +94,15 @@ var updateFuel = func {
}
dist = dist - (dist * wind_value * 0.002);
#trip_fuel = 4.003e+02 + (dist * -5.399e+01) + (dist * dist * -7.322e-02) + (dist * dist * dist * 1.091e-05) + (dist * dist * dist * dist * 2.962e-10) + (dist * dist * dist * dist * dist * -1.178e-13) + (dist * dist * dist * dist * dist * dist * 6.322e-18) + (crz * 5.387e+01) + (dist * crz * 1.583e+00) + (dist * dist * crz * 7.695e-04) + (dist * dist * dist * crz * -1.057e-07) + (dist * dist * dist * dist * crz * 1.138e-12) + (dist * dist * dist * dist * dist * crz * 1.736e-16) + (crz * crz * -1.171e+00) + (dist * crz * crz * -1.219e-02) + (dist * dist * crz * crz * -2.879e-06) + (dist * dist * dist * crz * crz * 3.115e-10) + (dist * dist * dist * dist * crz * crz * -4.093e-15) + (crz * crz * crz * 9.160e-03) + (dist * crz * crz * crz * 4.311e-05) + (dist * dist * crz * crz * crz * 4.532e-09) + (dist * dist * dist * crz * crz * crz * -2.879e-13) + (crz * crz * crz * crz * -3.338e-05) + (dist * crz * crz * crz * crz * -7.340e-08) + (dist * dist * crz * crz * crz * crz * -2.494e-12) + (crz * crz * crz * crz * crz * 5.849e-08) + (dist * crz * crz * crz * crz * crz * 4.898e-11) + (crz * crz * crz * crz * crz * crz * -3.999e-11);
trip_fuel = 4.018e+02 + (dist*3.575e+01) + (dist*dist*-4.260e-02) + (dist*dist*dist*-1.446e-05) + (dist*dist*dist*dist*4.101e-09) + (dist*dist*dist*dist*dist*-6.753e-13) + (dist*dist*dist*dist*dist*dist*5.074e-17) + (crz*-2.573e+01) + (dist*crz*-1.583e-01) + (dist*dist*crz*8.147e-04) + (dist*dist*dist*crz*4.485e-08) + (dist*dist*dist*dist*crz*-7.656e-12) + (dist*dist*dist*dist*dist*crz*4.503e-16) + (crz*crz*4.427e-01) + (dist*crz*crz*-1.137e-03) + (dist*dist*crz*crz*-4.409e-06) + (dist*dist*dist*crz*crz*-3.345e-11) + (dist*dist*dist*dist*crz*crz*4.985e-15) + (crz*crz*crz*-2.471e-03) + (dist*crz*crz*crz*1.223e-05) + (dist*dist*crz*crz*crz*9.660e-09) + (dist*dist*dist*crz*crz*crz*-2.127e-14) + (crz*crz*crz*crz*5.714e-06) + (dist*crz*crz*crz*crz*-3.546e-08) + (dist*dist*crz*crz*crz*crz*-7.536e-12) + (crz*crz*crz*crz*crz*-4.061e-09) + (dist*crz*crz*crz*crz*crz*3.355e-11) + (crz*crz*crz*crz*crz*crz*-1.451e-12);
if (trip_fuel < 400) {
trip_fuel = 400;
} else if (trip_fuel > 80000) {
trip_fuel = 80000;
}
# get trip fuel
trip_fuel = getprop("/fuel/integrated/lr-fuel") * 1000; # fix this
# cruize temp correction
trip_fuel = trip_fuel + (0.033 * (temp - 15 + (2 * crz / 10)) * flightPlanController.arrivalDist.getValue());
trip_fuel = trip_fuel + (0.033 * (temp - 15 + (2 * crz / 10)) * flightPlanController.totalDist.getValue());
# get trip time
trip_time = getprop("/fuel/integrated/lr-time");
trip_time = 9.095e-02 + (dist*-3.968e-02) + (dist*dist*4.302e-04) + (dist*dist*dist*2.005e-07) + (dist*dist*dist*dist*-6.876e-11) + (dist*dist*dist*dist*dist*1.432e-14) + (dist*dist*dist*dist*dist*dist*-1.177e-18) + (crz*7.348e-01) + (dist*crz*3.310e-03) + (dist*dist*crz*-8.700e-06) + (dist*dist*dist*crz*-4.214e-10) + (dist*dist*dist*dist*crz*5.652e-14) + (dist*dist*dist*dist*dist*crz*-6.379e-18) + (crz*crz*-1.449e-02) + (dist*crz*crz*-7.508e-06) + (dist*dist*crz*crz*4.529e-08) + (dist*dist*dist*crz*crz*3.699e-13) + (dist*dist*dist*dist*crz*crz*8.466e-18) + (crz*crz*crz*1.108e-04) + (dist*crz*crz*crz*-4.126e-08) + (dist*dist*crz*crz*crz*-9.645e-11) + (dist*dist*dist*crz*crz*crz*-1.544e-16) + (crz*crz*crz*crz*-4.123e-07) + (dist*crz*crz*crz*crz*1.831e-10) + (dist*dist*crz*crz*crz*crz*7.438e-14) + (crz*crz*crz*crz*crz*7.546e-10) + (dist*crz*crz*crz*crz*crz*-1.921e-13) + (crz*crz*crz*crz*crz*crz*-5.453e-13);
if (trip_time < 10) {
trip_time = 10;
} else if (trip_time > 480) {
trip_time = 480;
}
# if (low air conditioning) {
# trip_fuel = trip_fuel * 0.995;
#}
@ -119,15 +111,6 @@ var updateFuel = func {
#} else if (engine anti-ice) {
# trip_fuel = trip_fuel * 1.02;
#}
zfw = fmgc.FMGCInternal.zfw;
landing_weight_correction = 9.951e+00 + (dist*-2.064e+00) + (dist*dist*2.030e-03) + (dist*dist*dist*8.179e-08) + (dist*dist*dist*dist*-3.941e-11) + (dist*dist*dist*dist*dist*2.443e-15) + (crz*2.771e+00) + (dist*crz*3.067e-02) + (dist*dist*crz*-1.861e-05) + (dist*dist*dist*crz*2.516e-10) + (dist*dist*dist*dist*crz*5.452e-14) + (crz*crz*-4.483e-02) + (dist*crz*crz*-1.645e-04) + (dist*dist*crz*crz*5.212e-08) + (dist*dist*dist*crz*crz*-8.721e-13) + (crz*crz*crz*2.609e-04) + (dist*crz*crz*crz*3.898e-07) + (dist*dist*crz*crz*crz*-4.617e-11) + (crz*crz*crz*crz*-6.488e-07) + (dist*crz*crz*crz*crz*-3.390e-10) + (crz*crz*crz*crz*crz*5.835e-10);
trip_fuel = trip_fuel + (landing_weight_correction * (fmgc.FMGCInternal.lw * 1000 - 121254.24421) / 2204.622622);
if (trip_fuel < 400) {
trip_fuel = 400;
} else if (trip_fuel > 80000) {
trip_fuel = 80000;
}
fmgc.FMGCInternal.tripFuel = trip_fuel / 1000;
fmgc.FMGCInternal.tripTime_num = trip_time;
@ -200,6 +183,7 @@ var updateFuel = func {
}
fmgc.FMGCInternal.tow = num(fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel);
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
# Calculate climb/descent fuel
if (fmgc.FMGCInternal.toFromSet and fmgc.FMGCInternal.crzSet and fmgc.FMGCInternal.crzTempSet and fmgc.FMGCInternal.zfwSet) {
@ -266,7 +250,7 @@ var updateFuel = func {
}
_distance += fmgc.flightPlanController.flightplans[i].getWP(wpt).leg_distance;
var _wp = fmgc.flightPlanController.flightplans[i].getWP(wpt);
if (wpt < fmgc.flightPlanController.tocIndex[i]) {
if (wpt < fmgc.flightPlanController.getIndexOfTOC(i)) {
_clb_distance += fmgc.flightPlanController.flightplans[i].getWP(wpt).leg_distance;
var _multiplier = _clb_distance / fmgc.FMGCInternal.clbDist;
append(efob_values[i], fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel - _multiplier * fmgc.FMGCInternal.clbFuel / 1000);
@ -287,8 +271,8 @@ var updateFuel = func {
}
# to-do: add other conditions
}
} else if (wpt >= fmgc.flightPlanController.tocIndex[i] and wpt <= fmgc.flightPlanController.todIndex[i]) {
if (wpt != fmgc.flightPlanController.tocIndex[i]) {
} else if (wpt >= fmgc.flightPlanController.getIndexOfTOC(i) and wpt <= fmgc.flightPlanController.getIndexOfTOD(i)) {
if (wpt != fmgc.flightPlanController.getIndexOfTOC(i)) {
_crz_distance += fmgc.flightPlanController.flightplans[i].getWP(wpt).leg_distance;
}
var _multiplier = _crz_distance / (fmgc.flightPlanController.arrivalDist.getValue() - fmgc.FMGCInternal.clbDist - fmgc.FMGCInternal.desDist);
@ -307,7 +291,7 @@ var updateFuel = func {
# if (_wp.speed_cstr == nil or _wp.speed_cstr == 0 or _wp.speed_cstr_type == "computed" or _wp.speed_cstr_type == "computed-mach") {
#
# }
} else if (wpt > fmgc.flightPlanController.todIndex[i] and wpt < fmgc.flightPlanController.arrivalIndex[i]) {
} else if (wpt > fmgc.flightPlanController.getIndexOfTOD(i) and wpt < fmgc.flightPlanController.arrivalIndex[i]) {
_des_distance += fmgc.flightPlanController.flightplans[i].getWP(wpt).leg_distance;
var _multiplier = _des_distance / fmgc.FMGCInternal.desDist;
append(efob_values[i], fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel - fmgc.FMGCInternal.tripFuel + fmgc.FMGCInternal.desFuel / 1000 - _multiplier * fmgc.FMGCInternal.desFuel / 1000);

View file

@ -447,7 +447,7 @@ var windController = {
}
}
if ((!fmgc.FMGCInternal.clbSet and waypoint.wp_role == "sid") or (fmgc.FMGCInternal.clbSet and i <= fmgc.flightPlanController.tocIndex[plan])) {
if ((!fmgc.FMGCInternal.clbSet and waypoint.wp_role == "sid") or (fmgc.FMGCInternal.clbSet and i <= fmgc.flightPlanController.getIndexOfTOC(plan))) {
if (found == 0) {
append(me.winds[plan], waypoint_winds.new(waypoint.id, "departure", 0));
} else {
@ -455,7 +455,7 @@ var windController = {
me.winds[plan][i].type = "departure";
me.includeWind = 0;
}
} else if ((!fmgc.FMGCInternal.desSet and (waypoint.wp_role == "star" or waypoint.wp_role == "approach" or waypoint.wp_role == "missed")) or (fmgc.FMGCInternal.desSet and i >= fmgc.flightPlanController.todIndex[plan])) {
} else if ((!fmgc.FMGCInternal.desSet and (waypoint.wp_role == "star" or waypoint.wp_role == "approach" or waypoint.wp_role == "missed")) or (fmgc.FMGCInternal.desSet and i >= fmgc.flightPlanController.getIndexOfTOD(plan))) {
if (found == 0) {
append(me.winds[plan], waypoint_winds.new(waypoint.id, "arrival", 0));
} else {

View file

@ -153,11 +153,13 @@ var fuelPredInput = func(key, i) {
if (size(scratchpad) == 0) {
var zfw = pts.Fdm.JSBsim.Inertia.weightLbs.getValue() - pts.Consumables.Fuel.totalFuelLbs.getValue();
fmgc.FMGCInternal.zfw = sprintf("%3.1f", math.round(zfw / 1000, 0.1));
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
if (fmgc.FMGCInternal.blockSet != 1) {
fmgc.FMGCInternal.block = pts.Consumables.Fuel.totalFuelLbs.getValue() / 1000;
fmgc.FMGCInternal.blockSet = 1;
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);
@ -181,6 +183,7 @@ var fuelPredInput = func(key, i) {
if (zfw != nil and zfws > 0 and zfws <= 5 and (find(".", zfwi[0]) == -1 or size(split(".", zfwi[0])[1]) <= 1) and zfwcg != nil and zfwcgs > 0 and zfwcgs <= 4 and (find(".", zfwi[1]) == -1 or size(split(".", zfwi[1])[1]) <= 1)) {
if (zfw >= zfw_min and zfw <= zfw_max and zfwcg >= 8.0 and zfwcg <= 45.0) {
fmgc.FMGCInternal.zfw = zfw;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
fmgc.FMGCInternal.zfwcg = zfwcg;
fmgc.FMGCInternal.zfwcgSet = 1;
@ -188,6 +191,7 @@ var fuelPredInput = func(key, i) {
fmgc.FMGCInternal.block = pts.Consumables.Fuel.totalFuelLbs.getValue() / 1000;
fmgc.FMGCInternal.blockSet = 1;
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);
@ -219,11 +223,13 @@ var fuelPredInput = func(key, i) {
}
if (scratchpad >= zfw_min and scratchpad <= zfw_max) {
fmgc.FMGCInternal.zfw = scratchpad;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
if (fmgc.FMGCInternal.blockSet != 1) {
fmgc.FMGCInternal.block = pts.Consumables.Fuel.totalFuelLbs.getValue() / 1000;
fmgc.FMGCInternal.blockSet = 1;
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);

View file

@ -143,6 +143,7 @@ var initInputA = func(key, i) {
} else if (key == "L6") {
if (scratchpad == "CLR") {
fmgc.FMGCInternal.crzFt = 10000;
fmgc.FMGCNodes.crzFt.setValue(fmgc.FMGCInternal.crzFt);
fmgc.FMGCInternal.crzFl = 100;
fmgc.altvert();
fmgc.updateRouteManagerAlt();
@ -185,6 +186,7 @@ var initInputA = func(key, i) {
} else if (crzs >= 1 and crzs <= 3 and crz != nil and temps >= 1 and temps <= 3 and temp != nil) {
if (crz > 0 and crz <= 390 and temp >= -99 and temp <= 99) {
fmgc.FMGCInternal.crzFt = crz * 100;
fmgc.FMGCNodes.crzFt.setValue(fmgc.FMGCInternal.crzFt);
fmgc.FMGCInternal.crzFl = crz;
fmgc.altvert();
fmgc.updateRouteManagerAlt();
@ -217,6 +219,7 @@ var initInputA = func(key, i) {
if (crzs >= 1 and crzs <= 3 and crz != nil) {
if (crz > 0 and crz <= 390) {
fmgc.FMGCInternal.crzFt = crz * 100;
fmgc.FMGCNodes.crzFt.setValue(fmgc.FMGCInternal.crzFt);
fmgc.FMGCInternal.crzFl = crz;
fmgc.altvert();
fmgc.updateRouteManagerAlt();

View file

@ -190,9 +190,11 @@ var initInputB = func(key, i) {
if (size(scratchpad) == 0) {
var zfw = pts.Fdm.JSBsim.Inertia.weightLbs.getValue() - pts.Consumables.Fuel.totalFuelLbs.getValue();
fmgc.FMGCInternal.zfw = sprintf("%3.1f", math.round(zfw / 1000, 0.1));
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
if (!fmgc.FMGCInternal.blockConfirmed and fmgc.FMGCInternal.blockSet) {
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);
@ -219,11 +221,13 @@ var initInputB = func(key, i) {
if (zfw != nil and zfws > 0 and zfws <= 5 and (find(".", zfwi[0]) == -1 or size(split(".", zfwi[0])[1]) <= 1) and zfwcg != nil and zfwcgs > 0 and zfwcgs <= 4 and (find(".", zfwi[1]) == -1 or size(split(".", zfwi[1])[1]) <= 1)) {
if (zfw >= zfw_min and zfw <= zfw_max and zfwcg >= 8.0 and zfwcg <= 45.0) {
fmgc.FMGCInternal.zfw = zfw;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
fmgc.FMGCInternal.zfwcg = zfwcg;
fmgc.FMGCInternal.zfwcgSet = 1;
if (!fmgc.FMGCInternal.blockConfirmed and fmgc.FMGCInternal.blockSet) {
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);
@ -258,9 +262,11 @@ var initInputB = func(key, i) {
}
if (scratchpad >= zfw_min and scratchpad <= zfw_max) {
fmgc.FMGCInternal.zfw = scratchpad;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 1;
if (!fmgc.FMGCInternal.blockConfirmed and fmgc.FMGCInternal.blockSet) {
fmgc.FMGCInternal.tow = fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);
@ -311,6 +317,7 @@ var initInputB = func(key, i) {
fmgc.FMGCInternal.minDestFob = 0;
fmgc.FMGCInternal.minDestFobSet = 0;
fmgc.FMGCInternal.tow = 0;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.lw = 0;
fmgc.FMGCInternal.tripWind = "HD000";
fmgc.FMGCInternal.tripWindValue = 0;
@ -332,6 +339,7 @@ var initInputB = func(key, i) {
fmgc.FMGCInternal.blockSet = 1;
if (fmgc.FMGCInternal.zfwSet) {
fmgc.FMGCInternal.tow = num(fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel);
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);
@ -349,6 +357,7 @@ var initInputB = func(key, i) {
fmgc.FMGCInternal.blockSet = 1;
if (fmgc.FMGCInternal.zfwSet) {
fmgc.FMGCInternal.tow = num(fmgc.FMGCInternal.zfw + fmgc.FMGCInternal.block - fmgc.FMGCInternal.taxiFuel);
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.fuelRequest = 1;
fmgc.FMGCInternal.fuelCalculating = 1;
fmgc.fuelCalculating.setValue(1);

View file

@ -62,6 +62,7 @@ var MCDU_reset = func(i) {
fmgc.FMGCInternal.costIndex = 0;
fmgc.FMGCInternal.costIndexSet = 0;
fmgc.FMGCInternal.crzFt = 10000;
fmgc.FMGCNodes.crzFt.setValue(fmgc.FMGCInternal.crzFt);
fmgc.altvert();
fmgc.updateRouteManagerAlt();
fmgc.FMGCInternal.crzFl = 100;
@ -100,6 +101,7 @@ var MCDU_reset = func(i) {
# INT-B
fmgc.FMGCInternal.zfw = 0;
fmgc.FMGCNodes.zfw.setValue(fmgc.FMGCInternal.zfw);
fmgc.FMGCInternal.zfwSet = 0;
fmgc.FMGCInternal.zfwcg = 25.0;
fmgc.FMGCInternal.zfwcgSet = 0;
@ -124,6 +126,7 @@ var MCDU_reset = func(i) {
fmgc.FMGCInternal.minDestFob = 0;
fmgc.FMGCInternal.minDestFobSet = 0;
fmgc.FMGCInternal.tow = 0;
fmgc.FMGCNodes.tow.setValue(fmgc.FMGCInternal.tow);
fmgc.FMGCInternal.lw = 0;
fmgc.FMGCInternal.tripWind = "HD000";
fmgc.FMGCInternal.tripWindValue = 0;

View file

@ -203,7 +203,7 @@ var vertRev = {
mcdu_message(me.computer, "FORMAT ERROR");
}
} elsif (index == 5) {
if ((!fmgc.FMGCInternal.clbSet and me.wp.wp_role == "sid") or (fmgc.FMGCInternal.clbSet and me.index <= fmgc.flightPlanController.tocIndex[me.plan])) {
if ((!fmgc.FMGCInternal.clbSet and me.wp.wp_role == "sid") or (fmgc.FMGCInternal.clbSet and me.index <= fmgc.flightPlanController.getIndexOfTOC[me.plan])) {
if (canvas_mcdu.myCLBWIND[me.computer] == nil) {
canvas_mcdu.myCLBWIND[me.computer] = windCLBPage.new(me.computer);
} else {
@ -211,7 +211,7 @@ var vertRev = {
}
fmgc.windController.accessPage[me.computer] = "VERTREV";
setprop("MCDU[" ~ me.computer ~ "]/page", "WINDCLB");
} else if ((!fmgc.FMGCInternal.desSet and (me.wp.wp_role == "star" or me.wp.wp_role == "approach" or me.wp.wp_role == "missed")) or (fmgc.FMGCInternal.desSet and me.index >= fmgc.flightPlanController.todIndex[me.plan])) {
} else if ((!fmgc.FMGCInternal.desSet and (me.wp.wp_role == "star" or me.wp.wp_role == "approach" or me.wp.wp_role == "missed")) or (fmgc.FMGCInternal.desSet and me.index >= fmgc.flightPlanController.getIndexOfTOD(me.plan))) {
if (canvas_mcdu.myDESWIND[me.computer] == nil) {
canvas_mcdu.myDESWIND[me.computer] = windDESPage.new(me.computer);
} else {

1215
Systems/fuel-driver.xml Normal file

File diff suppressed because it is too large Load diff