FSX | C# | FSUIPC SDK | Programming | Программирование — Панели и приборы

По просьбе автора видео размещаю его в новой теме, т. к. планируется продолжение дальнейших вариаций с ПИД и примеров работы с  C# + FSUIPC SDK.

 

 

И сразу пример создания автопилота для дефолтного дельтаплана.

 

Ответов: 30

FS9 также программируется. 

Сообщение отредактировано NStK: 08 March 2016 — 14:36

SDK FSUIPC к любому симу подходит, надо только правильно выбать общую позицию открытия или указать какой СИМ будет использываться. В первом ролике, внимательно смотрите, это показано.

 

На канале под роликом есть ссылочки на исходники и спользуемые во втором видео.

Сообщение отредактировано KAI31: 08 March 2016 — 19:06

Гуд :clapping: … Единственное нормальная тема. Подписался…

Мы требуем продолжение.

Бум стараться. Если будут чьи либо другие наработки по этой темке — милости просим, выкладывать их сюда.

 

Автор давно хотел показать вариант работы с SDK FSUIPC, а тут 

заварились на темке Туполёнка, (off)

Spoiler

 

в частности — передачи данных из электронного варианта НЛки (калькулятора) напрямую в РСБН.

Spoiler

 

Пилится всё потихонечку.

Сообщение отредактировано KAI31: 09 March 2016 — 15:01

SDK FSUIPC к любому симу подходит, надо только правильно выбать общую позицию открытия или указать какой СИМ будет использываться. В первом ролике, внимательно смотрите, это показано.

 

На канале под роликом есть ссылочки на исходники и спользуемые во втором видео.

 

Я не смотрел, я сам сейчас программирую для собственных нужд.. 

 

Канал полезный, позже загляну, может даже с вопросам! :)

Сообщение отредактировано NStK: 10 March 2016 — 08:29

Дальнейшее продолжение.

 

Исходники

 

 Если кому будет интересно и будут другие идеи и вариации пишите здесь и можно автору на канале.

Соответсвенно с желанием и востребованностью всего, что с этим связано, можно продолжить и рассмотреть не только эти Варианты.

Сообщение отредактировано KAI31: 12 March 2016 — 02:51

 Если кому будет интересно и будут другие идеи и вариации пишите здесь и можно автору на канале.

Соответсвенно с желанием и востребованностью всего, что с этим связано, можно продолжить и рассмотреть не только эти Варианты.

 

Помогите с кодом ответчика:

 

Такой вопрос:

Столкнулся с проблемой считывания кода ответчика ч/з FSUIPC.

Offsets: 0354

Size: 2

Transponder setting, 4 digits in BCD format: 0x1200 means 1200 on the dials.

 

 

 

Опытным путем установил, что ответчик это шестнадцатеричное число, которое получается из десятичной переменной с Offset 0354.

Помогите дописать код по переводу  моей переменной Sqw  из DEC в HEX.

 

Пишу в C#.

 

Spoiler

 

Спасибо!

 

 

 PS далее меня ждут COM и NAV/

Сообщение отредактировано NStK: 14 March 2016 — 11:44

Привет,

в данном случае простая uint переменная, поэтому это не надо:

  double Sqw = dwResultSqw;

 

Вот так получить строку ответчика:

string TransponserFreq = «»;

resultSqw = fsuipc.FSUIPC_Get(ref tokenSqw, ref dwResultSqw);

TransponserFreq = Convert.ToString(dwResultSqw,16);

получаем строку с кодом …

Привет,

в данном случае простая uint переменная, поэтому это не надо:

  double Sqw = dwResultSqw;

 

Вот так получить строку ответчика:

string TransponserFreq = «»;

resultSqw = fsuipc.FSUIPC_Get(ref tokenSqw, ref dwResultSqw);

TransponserFreq = Convert.ToString(dwResultSqw,16);

получаем строку с кодом …

 

Понял. 

 

Еще вопрос, сегодня обнаружился БАГ. Все переменные самопроизвольно меняют значение в полный рандом и так же востанавливаются.

Сегодня тестировал Курс АРК, крутил круги на 154ке, курсы шли нормально от 0 до 360, но в какой момент стали тысячными 2010, 2124, 1345. И вдруг внезапно вернулись в нормальные от 0 до 360. 

 

Встречали, не встречали, как быть? 

Сообщение отредактировано NStK: 16 March 2016 — 08:04

 

в какой момент 

Случайно этот момент не совпал с проходом над маяком?

Или может 18 Кгц повлияло.

Надо посмотреть в задатчике.

 Вообще сим(ы) загадками не удивляют уже))

Для меня это, С и С++…и т.д. + XML, их взаимодействие и влияние на общие переменные, пока дремучий лес и пытаюсь разобраться в буреломе).

Но начало положено! Далее будем дерзть и разберём Что к чему.

Сообщение отредактировано KAI31: 16 March 2016 — 00:02

Случайно этот момент не совпал с проходом над маяком?

Или может 18 Кгц повлияло.

Надо посмотреть в задатчике.

 Вообще сим(ы) загадками не удивляют уже))

Для меня это, С и С++…и т.д. + XML, их взаимодействие и влияние на общие переменные, пока дремучий лес и пытаюсь разобраться в буреломе).

Но начало положено! Далее будем дерзть и разберём Что к чему.

 

Нет, крутил виражи на удалении 20-30 км. Потом коробочку… случайный рандом Причем в этом участвуют несколько переменных. И ответчик тоже.

Вчера все было нормально, сегодня появилось.

 

Я отображал только настраиваемые переменные, не знаю какие еще сбоят. Вечерком проверю…

Сообщение отредактировано NStK: 16 March 2016 — 07:37

«Встречали, не встречали, как быть?»

 

да видел подобное ….

обычно начинается этот глюк после длительного использования паузы (у меня) …

после перезапуска программы — проходит

но иногда лечится только перезапуском полета, а иногда вообще только перезапуском сима …

«Встречали, не встречали, как быть?»

 

да видел подобное ….

обычно начинается этот глюк после длительного использования паузы (у меня) …

после перезапуска программы — проходит

но иногда лечится только перезапуском полета, а иногда вообще только перезапуском сима …

 

Симптомы один в один. Ок. Будем наблюдать пациента.

Все переменные самопроизвольно меняют значение в полный рандом и так же востанавливаются.

 

 

БАГ пофиксин симптоматическим лечением. Убрал из кода все строки с переводом из десятичной в шестнадцатиричную. Ответчик и все частоты.

 

 PS  Как БАГ выглядел.  Три консоли. Верхняя запущена была первой, остальные с некоторым интервалом, нижняя сама последняя. 

Spoiler

 

 

Другой БАГ, менее противный, после минуты запуска проги, некоторые переменный разово меняют значения, из которых уже можно вычислять.

К примеру:

— Режимы работы двигателей

— Положение РВ

— давление на высотомере.

 и еще, на память не скажу.

 

К примеру, после запуска консоли с параметрами двигателя, обороты N1 = — 778.xx (точно не помню) после минуты все ок, 60%. и держится, не скачет…

Если запустить еще одну консоль параллельно, то опять сначала кривые параметры, потом встают на место, причем в первой запущенной консоли параметры уже нормальные.

Сообщение отредактировано NStK: 17 March 2016 — 10:45

«К примеру, после запуска консоли с параметрами двигателя, обороты N1 = — 778.xx (точно не помню) после минуты все ок, 60%. и держится, не скачет…»

 

А что в этот момент времени в симе?

p.s. я такое видел при начальном запуске (т.е. до первых манипуляций с самолетом), там зачастую даже GPS не в ту сторону показывает ориентацию самолета …

а так в процессе работы — вроде все стабильно, правда у меня FSX

А что в этот момент времени в симе?

Летит в автомате, стоит или рулит.

 

я такое видел при начальном запуске (т.е. до первых манипуляций с самолетом),

Манипуляции никак не влияют. Ч/з 60сек все приходит в норму независимо летит, стоит или рулит.

 

 

Spoiler

 

правда у меня FSX

А баги похожи, да и код в C# один к одному.

 

 

Еще подскажите:

 

Как у Вас реализованы переменные истинного курса, магнитного курса и маг. склонения, не могу поймать закономерность, переменные скачут в полном рандоме.

 

Так же никак не соображу по курсу на VOR, NAV heading, с АРК/ADF разобрался легко, а вот с курсом на VOR проблемы. Дистанция до VOR — все ок, считает верно.

 

И остались переменные директорных стрелок… NAV localizer и glideslope needle кажись называются. Пока не копался, но с первого захода значения реагируют странно, но еще не углублялся в расчеты. 

Сообщение отредактировано NStK: 18 March 2016 — 11:43

«Ч/з 60сек все приходит в норму независимо летит, стоит или рулит.»

Не такого не видел …

может просто буфера не успевают очишаться (но это не более чем предположение), попробуй чутка цикл замедлить — Thread.Sleep(5);

 

«А баги похожи, да и код в C# один к одному.»

Это — да )))

 

«Как у Вас реализованы переменные истинного курса, магнитного курса и маг. склонения, не могу поймать закономерность, переменные скачут в полном рандоме.»

Нет такой проблемы, я сейчас как раз под себя, дальше делаю калькулятор, да и в предыдущий раз я все строил на обсчете

0x610C — курс выхода на ЛЗП

0x6028 — магнитное склонение (для текущего местоположения) — если нужно для произвольного положения нужно брать из «magdec.bgl»

(ели нужно могу показать как это делать, правда только для файла 2004 версии)

0x6038 — истинный курс

соответственно 0x6038 — 0x6028  — получаем «магнитный» курс

точнее:

 

if (TrueHeading < MagVar)
                    {
                        MagHeading = 360 + Math.Round(TrueHeading — MagVar);
                    }
                    else
                        MagHeading = Math.Round(TrueHeading — MagVar,4)

 

 

«Так же никак не соображу по курсу на VOR, NAV heading«

я с этим не работал, думаю 0x0870 смотреть …

 

«NAV localizer и glideslope needle кажись называются.»

и тут то-же не знаю …

Здравствуйте! Скажите, а что-то более сложное можете написать на С++? К примеру ВСС в связке с ВСУП и ВСУТ??!!

«Скажите, а что-то более сложное можете написать на С++?»

Привет, если этот вопрос ко мне, то я никогда на С++ не писал …

«Скажите, а что-то более сложное можете написать на С++?»
Привет, если этот вопрос ко мне, то я никогда на С++ не писал …

Вопрос скорее к автору темы. Хотя так и не понял кто именно и что программирует. 🙂
Интересно создание кастомного автопилота (аналог боинга) в связке с жк дисплеями и бортовым компьютером (аналог MSDU Airbus) для отечественного ВС. По сути технология работы и отображения схожа с Boeing, только на русском и с некоторыми изменениями…

Сообщение отредактировано MrJam: 21 March 2016 — 14:46

«Вопрос скорее к автору темы. Хотя так и не понял кто именно и что программирует. :-)»

— я не автор темы, я автор видео )))

 

«Интересно создание кастомного автопилота (аналог боинга)…»

— это во многом, если не в основном, вопрос работы постановщика задачи по разработке грамотного и полного ТЗ (технического задания) + работа дизайнера по созданию текстур + уже потом работа программиста …  и все это очень редко умеет делать один и тот-же человек …

то-есть оно (ТЗ) должно содержать не только картинки приборов с пояснениями а еще и формулы описывающие модель поведения объекта как физической единицы так и поведения сопуствующего оборудования в рамках модели,  (иначе, например адекватного ПИД регулирования просто не сделать), короче очень кропотливый и творческий процесс,

а дальше уже программирование, которое при наличии грамотного ТЗ  — это уже вопрос техники.

Вопрос скорее к автору темы. Хотя так и не понял кто именно и что программирует. 🙂

Как автор темы, но не автор разработки и видео поясняю:

Програмируется внешний, подключаемый, модуль FSUIPC через его SDK.

Любым возможным способом, на любом языке програмирования и кем угодно.

 

 

 

Интересно создание кастомного автопилота (аналог боинга) в связке с жк дисплеями и бортовым компьютером (аналог MSDU Airbus) .

Как раз это и есть основа для такой внешней! пророграммы. Здесь не разбирается возможность построения приборов модели внутри СИМа. Это совсем другая тема.

 

 

для отечественного ВС. По сути технология работы и отображения схожа с Boeing, только на русском и с некоторыми изменениями…

Какого отечественного ВС? Насколько я знаю общепринятый язык на котором програмируется MSDU, FMC и их аналоги — Английский. 

 

P.S. Выводимые на монитор прибора(того же FMC) сообщения можно конвертировать в любой понятной форме, задав нужные параметры перевода или просто текст.

«Ч/з 60сек все приходит в норму независимо летит, стоит или рулит.»

 

Не такого не видел …

может просто буфера не успевают очишаться (но это не более чем предположение), попробуй чутка цикл замедлить — Thread.Sleep(5);

 

Баг не исчез. Беру переменную магнитного склонения, преобразую по формуле, запускаю консоль, первую минуту показывает все верно склонения = 8, 7, 6 и т.д., ч/з минуту склонение = 1448, 1447, 1446 и тд., т.е. на 1440 больше.

 

Вот такая ерунда, по сути не влияет на работоспособность.

Сообщение отредактировано NStK: 24 March 2016 — 07:48

«Вот такая ерунда, по сути не влияет на работоспособность.»

 

есть мысль, она касается переменных длинной 2 байта (как раз например «магнитное склонение»)

когда мы ее получаем из супика:

 

                        result = fsuipc.FSUIPC_Read(0x02A0, 2, ref token, ref dwResult);
                        result = fsuipc.FSUIPC_Process(ref dwResult);
                        result = fsuipc.FSUIPC_Get(ref token, ref dwResult);

 

у нас dwResult это int32 тоесть надо делать так:

                        ushort MagVar = 0;

                        MagVar =  (ushort)dwResult;

и должны перестать прыгать значения …

есть мысль, она касается переменных длинной 2 байта (как раз например «магнитное склонение»)

когда мы ее получаем из супика:

 

                        result = fsuipc.FSUIPC_Read(0x02A0, 2, ref token, ref dwResult);
                        result = fsuipc.FSUIPC_Process(ref dwResult);
                        result = fsuipc.FSUIPC_Get(ref token, ref dwResult);

 

у нас dwResult это int32 тоесть надо делать так:

                        ushort MagVar = 0;

                        MagVar =  (ushort)dwResult;

и должны перестать прыгать значения …

 

Попробую

 

С протоколами связи и прошивками микроконтроллеров знакомы? 

Сообщение отредактировано NStK: 30 March 2016 — 12:23

-«С протоколами связи и прошивками микроконтроллеров знакомы?»

не, не моя тема

Может кто подсказать, как получить название самолета? Оно типа string. Я не понимаю как его получить. Пробую конверт то стринг, результат на скрине.

Сама переменная:

Spoiler

 

Код получения данных:

Spoiler

 

Что в итоге:

Spoiler

Сообщение отредактировано Andreypilot1: 15 June 2016 — 04:02

API fsuipc никогда не изучал. нет надобности.

По этому ничего конкретного сказать не могу.

Но меня смущает название переменной dwResult.

Это явно — число.

Обычно, когда переменная названа  — dwResult, она несет в себе некий числовой код.

Код ошибки, например, индекс в таблице строк, ID переменной, ну и т.д.

Вот Вы и получаете число, преобразованное в строку.

 

 

P.S.

Наверное стоит погуглить.

Я сейчас ткнул в Гугл и сразу нашел вот такое:

int typeToken = 0;
fsuipc.FSUIPC_Read(0x3D00, 256, ref typeToken, ref dwResult);
fsuipc.FSUIPC_Process(ref dwResult);
byte[] type = new byte[256];
if (fsuipc.FSUIPC_Get(ref typeToken, 256, ref type))
{
   string tmp = System.Text.Encoding.ASCII.GetString(type).TrimEnd('');
   if(tmp.Length > 1)
      current_aircraft = tmp;
}

Должно быть, что-то вроде этого.

 

Здесь использует метод с таким же именем — fsuipc.FSUIPC_Get, но с другой сигнатурой.

Тут уже используются три параметра.

Т.е., существует несколько перегруженных методов для разных случаев применения.

Сообщение отредактировано serg_p: 16 June 2016 — 23:25

API fsuipc никогда не изучал. нет надобности.
По этому ничего конкретного сказать не могу.
Но меня смущает название переменной dwResult.
Это явно — число.
Обычно, когда переменная названа  — dwResult, она несет в себе некий числовой код.
Код ошибки, например, индекс в таблице строк, ID переменной, ну и т.д.
Вот Вы и получаете число, преобразованное в строку.
 
 
P.S.
Наверное стоит погуглить.
Я сейчас ткнул в Гугл и сразу нашел вот такое:

int typeToken = 0;
fsuipc.FSUIPC_Read(0x3D00, 256, ref typeToken, ref dwResult);
fsuipc.FSUIPC_Process(ref dwResult);
byte[] type = new byte[256];
if (fsuipc.FSUIPC_Get(ref typeToken, 256, ref type))
{
   string tmp = System.Text.Encoding.ASCII.GetString(type).TrimEnd('');
   if(tmp.Length > 1)
      current_aircraft = tmp;
}

Должно быть, что-то вроде этого.
 
Здесь использует метод с таким же именем — fsuipc.FSUIPC_Get, но с другой сигнатурой.
Тут уже используются три параметра.
Т.е., существует несколько перегруженных методов для разных случаев применения.

 

Большое спасибо, все работает :)
Я немного нуб в этом. Но опять же, когда дело доходит до получения данных типа string, другим словом, не числовых, я стопорюсь. Еще один вопрос, как теперь получить ICAO код ближайшего аэропорта.

 

Spoiler

 

Как я понял по этой кодировке, делать нужно тоже самое, только сменить 256 бит на 32?

 

Нашел это решение, но у меня какие-то проблемы с 1 строчкой, там где Offset. Он подсвечивает красным, говоря, что пропущена ссылка на директорию и какой-то using. Но все usingи, которые нужно, указаны. Может я не туда пихаю что-то

Spoiler

Сообщение отредактировано Andreypilot1: 11 July 2016 — 15:18

result = fsuipc.FSUIPC_Read(0x0658, 4, ref token, ref dwResult);
                    result = fsuipc.FSUIPC_Process(ref dwResult);
                    byte[] icao = new byte[4];
                    result = fsuipc.FSUIPC_Get(ref token, 4, ref icao);
                    if (result)
                    {
                        string icaoname = System.Text.Encoding.ASCII.GetString(icao);
                    }