Чтение данных SimConnect — Simconnect

Здравствуйте! Друзья, подскажите, как вытянуть данные с FSX?
Я в соседней ветке читал, надо вызвать AddToDataDefinition, затем RequestDataOnSimObject.

 

Ну вот и что дальше делать? Проблема в том, что в С/С++ я ничего сложнее HelloWorld-а не писал, а документация вся идет на С++((

 

Програмку пишу на С#. С этим языком я довольно хорошо знаком. Но примеров под C# не нашел, во всяком случае на русском.

 

В общем, прошу помощи по следующим пунктам:

 

  1. Как исправить ошибки «Имя не существует в текущем контексте.»? Ведь все перечисления лежат в одном классе что и функция.
  2. В Simulation Variables есть записи вроде этой GENERAL ENG RPM:index, что означает :index?
  3. Как всё таки получить данные? Ну вызвал я эти два метода, дальше что? Как конкретно Value  получить??

Огромное спасибо всем за отклики!

 

Снимок.PNG


Ответов: 5

То ли лыжи не едут, то ли время позднее, то ли я чего не понимаю :huh:

 

Если брать мануал с SDK, то выходит так, что они сначала добавляют всё что нужно, потом вызывают RequestDataOnSimObject и в обработчике события ловят и шлют всё в структуру.

 

Spoiler

 

Ну вот я добавляю.

connect.AddToDataDefinition(SIMCONNECT_DATA_DEFINITION_ID.Engines, «ENG N2 RPM:1», «Rpm», SIMCONNECT_DATATYPE.INT32, 0, 0);
connect.AddToDataDefinition(SIMCONNECT_DATA_DEFINITION_ID.Engines, «ENG N2 RPM:2», «Rpm», SIMCONNECT_DATATYPE.INT32, 0, 0);

 

И вызываю.
connect.RequestDataOnSimObject(DATA_REQUEST_ID.REQUEST_1, SIMCONNECT_DATA_DEFINITION_ID.Engines, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.SECOND, 0, 0, 0, 0);

 

 

В обработчике всё равно лажа :blink:

wtf.PNG

 

Что сейчас-то пошло не так?

Так, ладно. Со всей этой ерундой разобрался.

 

Ошибки из-за того что обращался не правильно, вот так надо:

 

           connect.AddToDataDefinition(SIMCONNECT_DATA_DEFINITION_ID.EngineLeft, «TURB ENG N1:1», «Percent», SIMCONNECT_DATATYPE.INT32, 0, 0);

           connect.RequestDataOnSimObject(DATA_REQUEST_ID.REQUEST_1, SIMCONNECT_DATA_DEFINITION_ID.EngineLeft, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.SECOND, 0, 0, 0, 0);

 

С индексом всё тоже просто:

 

TURB ENG N1:1 левая у 737

TURB ENG N1:2 правая.

 

Получить значение вроде тоже не сложно:

 

  • В общем надо было подписатся под новое событие

                connect.OnRecvSimobjectData += new SimConnect.RecvSimobjectDataEventHandler(simconnect_RecvSimobjectData);

 

  • В обработчике событий ловить то, что идет в нулевом индексе.

        void simconnect_RecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data)
        {
            label1.Text = «Left N1:» + data.dwData[0].ToString() + «rn»;
        }

 

Едем дальше… Двигателей у мну 2, а значения получаю по одному. Не порядок. Как получать значения по всем двигателям?

Сообщение отредактировано _777_: 19 August 2015 — 01:39

Вообще нужно придумать какую-то магию для этого всего. Явно в data.dwData[] не зря массив object-ов идет. По сути каждый елемент массива и есть значение того или инного параметра. Всё сводится к вот этим двум строчкам:

 

connect.AddToDataDefinition(SIMCONNECT_DATA_DEFINITION_ID.EngineLeft, «TURB ENG N1:1», «Percent», SIMCONNECT_DATATYPE.INT32, 0, 0);

connect.RequestDataOnSimObject(DATA_REQUEST_ID.REQUEST_1, SIMCONNECT_DATA_DEFINITION_ID.EngineLeft, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.SECOND, 0, 0, 0, 0);

 

Вот с них и начну. А пока перерыв. Сегодня решил сидеть до победного конца.

Что сейчас-то пошло не так?

 

По сложившейся традиции сам отвечаю на свой вопрос B)

 

 

  1.  В определении данных (перечисление SIMCONNECT_DATA_DEFINITION_ID) должна хранится структура с полями соответствующими с SIMCONNECT_DATATYPE;
  2. В функции AddToDataDefinition последние два аргумента должны выглядеть  вот так:  0.0f, SimConnect.SIMCONNECT_UNUSED, а не 0, 0 как пишут на большинстве буржуйских и наших тоже сайтов.Может быть в крестах это и работает, но в .NET именно это и приводило к ошибкам.
  3. Обязательно нужно зарегистрировать структуру командой RegisterDataDefineStruct иначе так же корректной работы не добиться.

 

Событие OnRecvSimobjectData желательно регистрировать  в той же методе, что и предыдущие команды. Однако это не обязательно !

 

Привожу код:

код.JPG

 

 

И пруф, что работает :wow1:

Работает.JPG

Вставлю свой вопрос.

Пытаюсь написать свою программку (хочу сделать аппаратный автопилот, а то очень неудобно каждый раз ставить на паузу, вместо джойстика брать мышь, менять что-то, снова брать джойстик и снимать с паузы).

Решил писать на С# (заодно поучу язык), аппаратная основа — Ардуино (уже начал осваивать — ничего сложного пока не вижу).

Сложности возникли с подключением моей программы к SimConnect.

Пишу в коде — using Microsoft.FlightSimulator.SimConnect;

Получаю ошибку:

Тип или имя пространства имен «FlightSimulator» не существует в пространстве имен «Microsoft» (возможно, отсутствует ссылка на сборку)

Сообщение отредактировано -Alex-: 19 March 2016 — 16:16