Орбита-10: импорт планов Route Manager.

parent 943384af
......@@ -5,26 +5,69 @@ ________
\ /
ПОДГОТОВКА НАВИГАЦИОННО-ПИЛОТАЖНОГО КОМПЛЕКСА
ПОДГОТОВКА ПЛАНА ПОЛЁТА ЦВМ
План полёта в памяти ЦВМ сохраняется между сеансами симуляции. Если вы
собираетесь использовать ЦВМ для навигации, проверьте, что маршрут
верно отображается на встроенной карте. Проверьте также положение
аэродромов и маяков, установив переключатель "Show" в диалоге "Pilots
-> FMC flightplan" в соответствующие положения.
Перед запуском симулятора сохраните XML-файл плана полёта в директории
"Orbita-10" под именем "plan.xml". При работе симулятора проверьте,
что маршрут верно отображается на встроенной карте. При необходимости
проверьте также положение аэродромов и маяков, установив переключатель
"Map display" в диалоге "Pilits -> FMC flightplan" в соответствующее
положение.
Сохранить или загрузить всё содержимое памяти во внешний файл можно,
нажав кнопки "Load" и "Save".
ПРЕДУПРЕЖДЕНИЕ. Файл "plan.xml" должен быть корректным XML со
структурой, изложенной в файле "Orbita-10/README.TXT". В противном
ПРЕДУПРЕЖДЕНИЯ.
1. Загрузку плана полёта разрешается выполнять только при отключенном
режиме НК "Руление".
2. Все загружаемоые файлы должны быть корректным XML, в противном
случае возможны серьёзные сбои в работе симулятора.
ПРИМЕЧАНИЯ:
1. При необходимости перезагрузить план откройте диалог "Pilots -> FMC
flightplan" и нажмите кнопку "Primary flightplan -> Reload". Данное
действие разрешается выполнять не позднее включения режима НК
"Руление".
2. Ввод данных через пульты модели не предусмотрен. Ввод оперативного
маршрута производится через диалог "FMC flightplan".
ПРИМЕЧАНИЕ. Примеры данных для загрузки в обоих поддерживаемых
форматах см. в директории "Flightplans" самолёта.
При необходимости преобразовать новый план полёта из формата
FlightGear Route Manager выполните следующие действия.
1. Составление плана произведите в самолёте "ufo" или любом другом
имеющем функцию "Route Manager".
ПРИМЕЧАНИЕ. В связи с тем, что функции ЦВМ не полностью совпадают с
функциями Route Manager, выполните следующие требования:
- собственно аэродромы взлёта и посадки из файла с ППМ (1) не
задействованы (однако они должны быть заданы, и ВПП должна быть
выбрана), используются только схемы вылета/прилёта, если они были
выбраны;
- аэродромы взлёта и посадки должны иметь выбранную ВПП и быть
записаны в отдельный файл (2) без ППМ, при необходимости запасные
аэродромы добавьте в него как промежуточные точки;
- данные РМ должны находиться в другом файле (3) как промежуточные
точки, данные аэродромов из него не используются;
- максимальное число ППМ 30, аэродромов 8 (включая аэродромы взлёта и
посадки), РМ 9, точки сверх этого не будут загружены.
2. Откройте диалог "Pilots -> FMC flightplan".
3. Очистите пмять ЦВМ, нажав кнопку "Clear".
4. Задайте высоту эшелона в поле "H ... km" и загрузите ППМ, нажав
кнопку "PPM" и выбрав файл (1).
5. Загрузите аэродромы, нажав кнопку "AP" и выбрав файл (2).
6. Загрузите радиомаяки, нажав кнопку "RM" и выбрав файл (3).
7. Убедитесь в правильности загрузки последовательной установкой
переключателя "Show" в соответствующие положения и проверкой по карте
FlightGear.
8. Задайте аэронавигационный запас топлива в кг в поле "Aeronav fuel
(ANZ): ... kg".
ПОДГОТОВКА НАВИГАЦИОННО-ПИЛОТАЖНОГО КОМПЛЕКСА
ПРИМЕЧАНИЕ. Ввод данных через пульты модели не предусмотрен. Ввод
оперативного маршрута производится через диалог "FMC flightplan".
1. Установите магнитное склонение аэродрома взлёта на пульте курсов,
расположенном на приборной доске второго пилота.
......@@ -79,8 +122,7 @@ ________
Задайте номер аэродрома посадки галетным переключателем на пульте
ЦУНП.
ПРИМЕЧАНИЕ. Время выставки ГВУ-2 25 минут. В связи с этим
использование ГВУ на промежуточном аэродроме не разрешается.
ПРИМЕЧАНИЕ. Время выставки ГВУ-2 25 минут.
6. Произведите заправку и загрузку самолёта.
......
<?xml version="1.0"?>
<PropertyList>
<version type="int">2</version>
<departure>
<airport type="string">UUDD</airport>
<runway type="string">32R</runway>
</departure>
<destination>
<airport type="string">UAAA</airport>
<runway type="string">05R</runway>
</destination>
<route>
<wp>
<type type="string">runway</type>
<departure type="bool">true</departure>
<ident type="string">32R</ident>
<icao type="string">UUDD</icao>
</wp>
<wp n="1">
<type type="string">navaid</type>
<ident type="string">UWGG</ident>
<lon type="double">43.7883513</lon>
<lat type="double">56.22128733</lat>
</wp>
<wp n="2">
<type type="string">navaid</type>
<ident type="string">UWLW</ident>
<lon type="double">48.802664</lon>
<lat type="double">54.401014</lat>
</wp>
<wp n="3">
<type type="string">navaid</type>
<ident type="string">UWWW</ident>
<lon type="double">50.1604234</lon>
<lat type="double">53.50447908</lat>
</wp>
<wp n="4">
<type type="string">navaid</type>
<ident type="string">UWOO</ident>
<lon type="double">55.4567455</lon>
<lat type="double">51.7957875</lat>
</wp>
<wp n="5">
<type type="string">navaid</type>
<ident type="string">UWOR</ident>
<lon type="double">58.59233725</lon>
<lat type="double">51.07408613</lat>
</wp>
<wp n="6">
<type type="string">navaid</type>
<ident type="string">UAKD</ident>
<lon type="double">67.7391985</lon>
<lat type="double">47.7087555</lat>
</wp>
<wp n="7">
<type type="string">runway</type>
<approach type="bool">true</approach>
<ident type="string">05R</ident>
<icao type="string">UAAA</icao>
</wp>
</route>
</PropertyList>
<?xml version="1.0"?>
<PropertyList>
<version type="int">2</version>
<departure>
<airport type="string">UUDD</airport>
<runway type="string">32R</runway>
</departure>
<destination>
<airport type="string">UAAA</airport>
<runway type="string">05R</runway>
</destination>
<route>
<wp>
<type type="string">runway</type>
<departure type="bool">true</departure>
<ident type="string">32R</ident>
<icao type="string">UUDD</icao>
</wp>
<wp n="1">
<type type="string">navaid</type>
<ident type="string">WT</ident>
<lon type="double">37.78583333</lon>
<lat type="double">55.58888889</lat>
</wp>
<wp n="2">
<type type="string">basic</type>
<ident type="string">E037N055</ident>
<lon type="double">37.8681</lon>
<lat type="double">55.65</lat>
</wp>
<wp n="3">
<type type="string">navaid</type>
<ident type="string">SF</ident>
<lon type="double">39.99694444</lon>
<lat type="double">55.54833333</lat>
</wp>
<wp n="4">
<type type="string">navaid</type>
<ident type="string">AGUNA</ident>
<lon type="double">75.783611</lon>
<lat type="double">43.971111</lat>
</wp>
<wp n="5">
<type type="string">navaid</type>
<ident type="string">UC</ident>
<lon type="double">76.326111</lon>
<lat type="double">43.6</lat>
</wp>
<wp n="6">
<type type="string">runway</type>
<approach type="bool">true</approach>
<ident type="string">05R</ident>
<icao type="string">UAAA</icao>
</wp>
</route>
</PropertyList>
№499 УУДД-УААА 08:30 MSK
UUDD
UAAA
WT GEKLA SF AGUNA UC
18500 m
3123 km
ANZ 7000 kg
<?xml version="1.0"?>
<PropertyList>
<version type="int">2</version>
<departure>
<airport type="string">UUDD</airport>
<runway type="string">32R</runway>
</departure>
<destination>
<airport type="string">UAAA</airport>
<runway type="string">05R</runway>
</destination>
<route>
<wp>
<type type="string">runway</type>
<departure type="bool">true</departure>
<ident type="string">32R</ident>
<icao type="string">UUDD</icao>
</wp>
<wp n="1">
<type type="string">navaid</type>
<ident type="string">00</ident>
<lon type="double">38.18500000</lon>
<lat type="double">55.53166700</lat>
</wp>
<wp n="2">
<type type="string">navaid</type>
<ident type="string">LS</ident>
<lon type="double">48.228333</lon>
<lat type="double">54.26</lat>
</wp>
<wp n="3">
<type type="string">navaid</type>
<ident type="string">BMK</ident>
<lon type="double">48.225</lon>
<lat type="double">54.26333333</lat>
</wp>
<wp n="4">
<type type="string">navaid</type>
<ident type="string">ORN</ident>
<lon type="double">55.45333333</lon>
<lat type="double">51.7975</lat>
</wp>
<wp n="5">
<type type="string">navaid</type>
<ident type="string">AKB</ident>
<lon type="double">57.183889</lon>
<lat type="double">50.263056</lat>
</wp>
<wp n="6">
<type type="string">navaid</type>
<ident type="string">GN</ident>
<lon type="double">67.792553</lon>
<lat type="double">47.737081</lat>
</wp>
<wp n="7">
<type type="string">navaid</type>
<ident type="string">ALM</ident>
<lon type="double">77.085833</lon>
<lat type="double">43.374444</lat>
</wp>
<wp n="8">
<type type="string">runway</type>
<approach type="bool">true</approach>
<ident type="string">05R</ident>
<icao type="string">UAAA</icao>
</wp>
</route>
</PropertyList>
......@@ -17,8 +17,7 @@ var LoadFlightplan = func(file) {
});
CopyLoaded();
Tu144.NPKLandingAirport(getprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/count"));
setprop("/sim/gui/dialog/Orbita10/plottype", "PPM");
Plot("PPM");
Plot(getprop("/sim/gui/dialog/Orbita10/plottype") or "PPM");
}
......@@ -28,6 +27,9 @@ var LoadFlightplan = func(file) {
var Plot = func(type) {
var nfp = flightplan();
nfp.cleanPlan();
if((type != "PPM") and (type != "OPM") and (type != "RM") and (type != "AP")){
return;
}
var count = getprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/" ~ type ~ "/count");
for(var i = 1; i <= count; i += 1){
var phi = getprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/" ~ type ~ "/" ~ type ~ "[" ~ i ~ "]/phi-deg");
......@@ -101,3 +103,247 @@ var JSBSafeCopy = func(p) {
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/" ~ p, 0.0);
}
}
# @brief Save flightplan to a XML file.
var SaveFlightplan = func(file) {
io.write_properties(file, "/fdm/jsbsim/fcs/NPK/Orbita/flightplan");
}
var _LoadFlightplanDialogCallback = func(filenode) {
LoadFlightplan(filenode.getValue());
}
var LoadFlightplanDialog= func() {
var dir = getprop("/sim/fg-home") ~ "/Export";
var selector = gui.FileSelector.new(
callback: _LoadFlightplanDialogCallback,
dir: dir,
dotfiles: 1,
title: "Load Orbita-10 flightplan",
button: "Load"
);
selector.open();
selector.del();
}
var _SaveFlightplanDialogCallback = func(filenode) {
SaveFlightplan(filenode.getValue());
}
var SaveFlightplanDialog= func() {
var dir = getprop("/sim/fg-home") ~ "/Export";
var selector = gui.FileSelector.new(
callback: _SaveFlightplanDialogCallback,
dir: dir,
dotfiles: 1,
title: "Save Orbita-10 flightplan",
button: "Save"
);
selector.open();
selector.del();
}
# @brief Import route from FG route manager flight plan.
var ImportFGFPPPM = func(file) {
var fgfp = flightplan(file);
var H = getprop("/sim/gui/dialog/Orbita10/fgfp-H-km" or 19.0);
# Route waypoints.
var count = 0;
for(var ii = 0; ii < fgfp.getPlanSize(); ii += 1){
if(count > 29){
print("PPM > 30 ignored.");
break;
}
var wp = fgfp.getWP(ii);
if((wp.wp_type == "basic") or (wp.wp_type == "navaid")){
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/PPM/PPM[" ~ (count + 1) ~ "]/phi-deg", wp.lat);
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/PPM/PPM[" ~ (count + 1) ~ "]/lam-deg", wp.lon);
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/PPM/PPM[" ~ (count + 1) ~ "]/H-km", H);
count += 1;
}
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/PPM/count", count);
Plot(getprop("/sim/gui/dialog/Orbita10/plottype"));
}
# @brief Import dummy FG plan with airports.
var ImportFGFPAP = func(file) {
var fgfp = flightplan(file);
# Diversion airports.
var count = 0;
for(var ii = 0; ii < fgfp.getPlanSize(); ii += 1){
# SIC First and last AP used for departure and destination.
if(count > 5){
print("AP > 8 ignored.");
break;
}
var wp = fgfp.getWP(ii);
if(wp.wp_type != "navaid"){
continue;
}
var ap = airportinfo(wp.lat, wp.lon);
if(ap == nil){
continue;
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/AP[" ~ (count + 2) ~ "]/phi-deg", ap.lat);
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/AP[" ~ (count + 2) ~ "]/lam-deg", ap.lon);
# Find 2 longest runways.
var psi = [0.0, 0.0];
var score = [0.0, 0.0];
foreach(var jj; keys(ap.runways)){
var area = ap.runways[jj].length * math.min(ap.runways[jj].width, 45.0);
if(area > score[0]){
score[1] = score[0];
psi[1] = psi[0];
score[0] = area;
psi[0] = ap.runways[jj].heading;
}
}
for(var jj = 0; jj < 1; jj += 2){
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/AP[" ~ (count + 2) ~ "]/psi-deg[" ~ 0 ~ "]", psi[jj]);
}
count += 1;
}
# Departure and destination airports.
for(var ii = 0; ii < 2; ii += 1){
var fprwy = nil;
var ap = nil;
if(!ii){
ap = fgfp.departure;
fprwy = fgfp.departure_runway;
}else{
ap = fgfp.destination;
fprwy = fgfp.destination_runway;
}
if(ap == nil){
continue;
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/AP[" ~ (ii * count + 1) ~ "]/phi-deg", ap.lat);
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/AP[" ~ (ii * count + 1) ~ "]/lam-deg", ap.lon);
# Find 2 longest runways.
var psi = [0.0, 0.0];
var score = [0.0, 0.0];
foreach(var jj; keys(ap.runways)){
var area = ap.runways[jj].length * math.min(ap.runways[jj].width, 45.0);
if(area > score[0]){
score[1] = score[0];
psi[1] = psi[0];
score[0] = area;
psi[0] = ap.runways[jj].heading;
}
}
# If runway defined in flightplan, use it.
if(fprwy != nil){
psi[1] = psi[0];
psi[0] = fprwy.heading;
}
for(var jj = 0; jj < 1; jj += 2){
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/AP[" ~ (ii * count + 1) ~ "]/psi-deg[" ~ 0 ~ "]", psi[jj]);
}
count += 1;
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/count", count);
Tu144.NPKDepartureAirport(1);
Tu144.NPKLandingAirport(getprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/AP/count"));
Plot(getprop("/sim/gui/dialog/Orbita10/plottype"));
}
# @brief Import dummy FG plan with beacons.
var ImportFGFPRM = func(file) {
var fgfp = flightplan(file);
var count = 0;
for(var ii = 0; ii < fgfp.getPlanSize(); ii += 1){
if(count > 8){
print("RM > 9 ignored.");
break;
}
var wp = fgfp.getWP(ii);
if(wp.wp_type == "navaid"){
navaids = findNavaidsWithinRange(wp.lat, wp.lon, 1.0);
if((navaids == nil) or (size(navaids) == 0)){
continue;
}
# FGBUG This never shows any DME...
# var hasDME = 0;
# for(var jj = 0; jj < size(navaids); jj += 1){
#print(ii ~ " " ~ jj ~ " " ~ navaids[jj].type);
# if(navaids[jj].type == "DME"){
# hasDME = 1;
# break;
# }
# }
# if(!hasDME){
# continue;
# }
for(var jj = 0; jj < size(navaids); jj += 1){
if(navaids[jj].type != "VOR"){
continue;
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/RM/RM[" ~ (count + 1) ~ "]/phi-deg", navaids[jj].lat);
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/RM/RM[" ~ (count + 1) ~ "]/lam-deg", navaids[jj].lon);
var freq = navaids[jj].frequency;
# If RSBN, extract channel.
if((freq >= 960000.0) and (freq <= 964350.0)){
freq = int((freq - 959950.0) / 50.0);
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/RM/RM[" ~ (count + 1) ~ "]/f", freq);
count += 1;
break;
}
}
}
setprop("/fdm/jsbsim/fcs/NPK/Orbita/flightplan/RM/count", count);
Plot(getprop("/sim/gui/dialog/Orbita10/plottype"));
}
var _ImportFGFPPPMDialogCallback = func(filenode) {
ImportFGFPPPM(filenode.getValue());
}
var ImportFGFPPPMDialog= func() {
var dir = getprop("/sim/fg-home") ~ "/Export";
var selector = gui.FileSelector.new(
callback: _ImportFGFPPPMDialogCallback,
dir: dir,
dotfiles: 1,
title: "Import PPM",
button: "Import"
);
selector.open();
selector.del();
}
var _ImportFGFPAPDialogCallback = func(filenode) {
ImportFGFPAP(filenode.getValue());
}
var ImportFGFPAPDialog= func() {
var dir = getprop("/sim/fg-home") ~ "/Export";
var selector = gui.FileSelector.new(
callback: _ImportFGFPAPDialogCallback,
dir: dir,
dotfiles: 1,
title: "Import AP",
button: "Import"
);
selector.open();
selector.del();
}
var _ImportFGFPRMDialogCallback = func(filenode) {
ImportFGFPRM(filenode.getValue());
}
var ImportFGFPRMDialog= func() {
var dir = getprop("/sim/fg-home") ~ "/Export";
var selector = gui.FileSelector.new(
callback: _ImportFGFPRMDialogCallback,
dir: dir,
dotfiles: 1,
title: "Import RM",
button: "Import"
);
selector.open();
selector.del();
}
......@@ -846,7 +846,7 @@ setlistener("/sim/signals/fdm-initialized", func(p) {
if(p.getValue() == 0){
return;
}
Orbita10.LoadFlightplan('Orbita-10/plan.xml');
Orbita10.Plot("PPM");
settimer(func {
# FIXME Kludge, see -set.xml.
for(var eng = 0; eng < 4; eng += 1){
......
UUDD-UAAA.xml
\ No newline at end of file
......@@ -2,16 +2,22 @@
<system name="Orbita-10. Flightplan memory">
<property>fcs/NPK/panel/TsUNP/switch/flightlevel</property><!-- 1: Прогр., 0: Опер. -->
<property value="1">fcs/NPK/panel/TsUNP/switch/runway</property><!-- 0: 2., 1: 1. -->
<!-- 1: Прогр., 0: Опер. -->
<property>fcs/NPK/panel/TsUNP/switch/flightlevel</property>
<!-- 0: 2., 1: 1. -->
<property value="1">fcs/NPK/panel/TsUNP/switch/runway</property>
<!-- Number of valid points entered. -->
<property>fcs/NPK/Orbita/flightplan/PPM/count</property><!-- max: 30 -->
<property>fcs/NPK/Orbita/flightplan/OPM/count</property><!-- max: 10 -->
<property>fcs/NPK/Orbita/flightplan/AP/count</property><!-- max: 8 -->
<!-- max: 30 -->
<property>fcs/NPK/Orbita/flightplan/PPM/count</property>
<!-- max: 10 -->
<property>fcs/NPK/Orbita/flightplan/OPM/count</property>
<!-- max: 8 -->
<property>fcs/NPK/Orbita/flightplan/AP/count</property>
<property>fcs/NPK/Orbita/flightplan/AP/oper-entered</property>
<property>fcs/NPK/Orbita/flightplan/RM/count</property><!-- max: 9 -->
<!-- max: 9 -->
<property>fcs/NPK/Orbita/flightplan/RM/count</property>
<property>fcs/NPK/Orbita/flightplan/RM/oper-entered</property>
......@@ -292,6 +298,11 @@
<property>fcs/NPK/Orbita/flightplan/RM/RM[10]/f</property>
<!-- Defined in func/time.xml
<property value="7000.0">fcs/NPK/Orbita/flightplan/ANZ-kg</property>
-->
<property>fcs/NPK/Orbita/route/PPM</property>
<property>fcs/NPK/Orbita/route/PPM_prev</property>
<property>fcs/NPK/Orbita/route/airport/AP</property>
......
This diff is collapsed.
......@@ -26,15 +26,24 @@
<group><layout>hbox</layout>
<text><label>Primary flightplan:</label></text>
<text><label>Core memory:</label></text>
<button>
<legend>Reload</legend>
<legend>Load</legend>
<binding>
<command>nasal</command>
<script>
Orbita10.LoadFlightplan('Orbita-10/plan.xml');
Orbita10.Plot(getprop("/sim/gui/dialog/Orbita10/plottype"));
Orbita10.LoadFlightplanDialog();
</script>
</binding>
</button>
<button>
<legend>Save</legend>
<binding>
<command>nasal</command>
<script>
Orbita10.SaveFlightplanDialog();
</script>
</binding>
</button>
......@@ -50,7 +59,7 @@
</binding>
</button>
<text><label>FG map display:</label></text>
<text><label>Show:</label></text>
<combo>
<pref-width>65</pref-width>
......@@ -76,6 +85,80 @@
</group>
<group><layout>hbox</layout>
<text><label>Import plan:</label></text>
<text><label>H</label></text>
<input>
<property>/sim/gui/dialog/Orbita10/fgfp-H-km</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
</binding>
</input>
<text><label>km</label></text>
<button>
<legend>PPM</legend>
<binding>
<command>nasal</command>
<script>
Orbita10.ImportFGFPPPMDialog();
</script>
</binding>
</button>
<button>
<legend>AP</legend>
<binding>
<command>nasal</command>
<script>
Orbita10.ImportFGFPAPDialog();
</script>
</binding>
</button>
<button>
<legend>RM</legend>
<binding>
<command>nasal</command>
<script>
Orbita10.ImportFGFPRMDialog();
</script>
</binding>
</button>
<empty>
<stretch>true</stretch>
</empty>