SimConnect. Чтение и изменение значений переменных. — Simconnect

Эта тема создана для сообщений и обсуждения использования SimConnect для чтения и изменения значений переменных FSX.

 

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Разобравшись с получением системных и глобальных событий, а также событий, связанных с пользовательским самолетом, перейдем к обработке переменных.
Переменные — это параметры, которые описывают всё состояние и все действия в FSX. Перечень переменных FSX приведен в описании SDK в таблице Simulation Variables, приведенной на скрине.

В таблице Simulation Variables у каждой переменной есть указатель на то, может эта переменная записываться, или нет. Этот указатель находится в столбце Settable и принимает одно из двух значений:
Y – да, может читаться и записываться (может быть изменена);
N — нет, не может записываться. Эта переменная только для чтения.
Обработка этих переменных, т.е. чтение (получение текущих значений) и присвоение значений этим переменным (если это разрешено SDK) достаточно просто производится с помощью API функций SimConnect.

Указанные переменные Simulation Variables не следует путать с группой маркеров переменных Token Variables, которые находятся в SimObject Creation Kit/Panels and Gauges SDK.
Переменные группы Token Variables не могут обрабатываться с помощью SimConnect!

Переменные Simulation Variables включают два класса: переменные самолета и глобальные переменные.
К переменным самолета относятся переменные FSX, включенные в группы, имя которых начинается со слова Aircraft. Например, группы Aircraft Engine Data, Aircraft Fuel Data, Aircraft Avionic Data и др.
Остальные переменные, определяющие общие процессы FSX, относятся к глобальным переменным FSX.

Прикрепленные изображения

  • Simulation_Variables.jpg

Сообщение отредактировал dmi-shef: 03 October 2013 — 18:00


Ответов: 10

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

Теперь напишем программу, которая будет читать переменные FSX. Она создана на основе примеров SDK исключительно для иллюстрации возможностей API функций, а не для показа правильной организации программы.
В программе создадим две структуры данных — положения самолета и напряжения батареи и на главной шине.
Строчка запроса напряжения показана в двух вариантах — однократный запрос и запрос 1 раз в секунду.

// ========= Описание заголовочных файлов ================

#include <windows.h>
…..
#include «SimConnect.h»

// ====================== Определение глобальных переменных, структур, перечислений, прототипов функций ==================================

int quit = 0;

HANDLE hSimConnect = NULL;

struct StructureAircraftUser // Объявляем структуру данных пользовательского самолета
{
char title[256];
double altitude;
double latitude;
double longitude;
};

struct StructureAircraftUserElectricSistem
{
// char title[256];
double batteryVoltage;
double mainBusVoltage;
};

static enum GROUP_ID { // Объявляем группы событий, присваиваем им имена. Можно дать буквенное обозначение
GROUP_ShtPlane, // Группа событий, связанных с системами самолета
GROUP_ShtG1000, // Группа событий, связанных с Garmin1000
};

static enum EVENT_ID { // Определяем пользовательские события для группы Sht0. Имя события состоит из слова EVENT_ и имени ID события из перечня Event IDs SDK
EVENT_SHT_SIM, // ID событие — в FSX начат полет. Событие системное!
EVENT_SHT_SIM_START, // ID событие — загружен FSX в режим свободного полета. Событие системное!
EVENT_SHT_SIM_STOP, // ID событие — завершен в FSX режим свободного полета. Событие системное!
};

static enum DATA_DEFINE_ID { // Объявляем определение данных пользовательского самолета
DEFINITION_AircraftUser,
DEFINITION_AircraftUserElectricSistem,
};

static enum DATA_REQUEST_ID { // Объявляем запрос данных пользовательского самолета
REQUEST_AircraftUser,
REQUEST_AircraftUserElectricSistem,
};

// ==================================== Описание функций =================================================

// =========== Функция обратной связи, сообщает о событиях в FSX ===========================

void CALLBACK ShtDispatchProcReadTXT(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext)
{
HRESULT ShtHr;

switch(pData->dwID) // Доступ к атрибуту через указатель pData на объект dwID, т.е. объект с ID, указанным ниже
{
case SIMCONNECT_RECV_ID_EVENT: // Перечисление для возвращения ID события
{
SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT*)pData; // Структура для возвращения ID события

switch(evt->uEventID) // Доступ к атрибуту evt через указатель на объект uEventID
{
case EVENT_SHT_SIM: // Здесь указатель на ID -> EVENT_SHT_SIM
std::cout << «nEvent EVENT_SHT_SIM» << evt->dwData << «n»;
break;

case EVENT_SHT_SIM_START: // Здесь указатель на ID -> EVENT_SHT_SIM_START
std::cout << «nEvent EVENT_SHT_SIM_START» << evt->dwData << «n»;
ShtHr = SimConnect_RequestDataOnSimObjectType(hSimConnect, REQUEST_AircraftUser, DEFINITION_AircraftUser, 0, SIMCONNECT_SIMOBJECT_TYPE_USER); // Запрос данных пользовательского самолета
ShtHr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_AircraftUserElectricSistem, DEFINITION_AircraftUserElectricSistem, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE); // Однократный вывод
// ShtHr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_AircraftUserElectricSistem, DEFINITION_AircraftUserElectricSistem, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND); // Вывод один раз в секунду
break;

case EVENT_SHT_SIM_STOP: // Здесь указатель на ID -> EVENT_SHT_SIM_STOP
std::cout << «nEvent EVENT_SHT_SIM_STOP» << evt->dwData << «n»;
break;

default:
break;
} // Завершение switch RECV_EVENT
break;
}

case SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE: // Перечисление для возвращения ID типа данных объекта
{
SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE *pObjData = (SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE*)pData; // Структура для возвращения ID типа данных объекта

switch(pObjData->dwRequestID)
{
case REQUEST_AircraftUser:
{
DWORD ObjectID = pObjData->dwObjectID;
StructureAircraftUser *pS = (StructureAircraftUser*)&pObjData->dwData;
if (SUCCEEDED(StringCbLengthA(&pS->title[0], sizeof(pS->title), NULL))) // security check
{
std::cout << ObjectID << » » << pS->title << » Lat=» << pS->latitude << » Lon= » << pS->longitude << » Alt=» << pS->altitude << std::endl;
}
break;
}
}
break;
}

case SIMCONNECT_RECV_ID_SIMOBJECT_DATA:
{
SIMCONNECT_RECV_SIMOBJECT_DATA *pObjData = (SIMCONNECT_RECV_SIMOBJECT_DATA*)pData;

switch(pObjData->dwRequestID)
{
case REQUEST_AircraftUserElectricSistem:
{
DWORD ObjectID = pObjData->dwObjectID;
StructureAircraftUserElectricSistem *pS = (StructureAircraftUserElectricSistem*)&pObjData->dwData;
std::cout << «n» << ObjectID << » » << pS->batteryVoltage << » » << pS->mainBusVoltage << std::endl;
}
break;
}
break;
}

case SIMCONNECT_RECV_ID_QUIT: // Получение флага выхода из ключа switch
{
quit = 1;
break;
}
default:
break;
} // завершение switch pData->dwID
}

// ================= Функция получения запроса о событии в FSX ===========================

void ShtEvent()
{
HRESULT ShtHr;

ShtHr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SHT_SIM, «Sim»);
ShtHr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SHT_SIM_START, «SimStart»);
ShtHr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SHT_SIM_STOP, «SimStop»);

// Настраиваем данные объекта (пользовательского самолета), но пока с ними ничего не делается
ShtHr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AircraftUser, «Title», NULL, SIMCONNECT_DATATYPE_STRING256); // Имя пользовательского самолета
ShtHr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AircraftUser, «Plane Altitude», «feet»); // Высота
ShtHr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AircraftUser, «Plane Latitude», «degrees»); // Широта
ShtHr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AircraftUser, «Plane Longitude», «degrees»); // Долгота

ShtHr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AircraftUserElectricSistem, «ELECTRICAL BATTERY VOLTAGE», «Volts»); // Напряжение батареи
ShtHr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AircraftUserElectricSistem, «ELECTRICAL MAIN BUS VOLTAGE», «Volts»); // Напряжение на главной шине

while (0 == quit)
{
SimConnect_CallDispatch(hSimConnect, ShtDispatchProcReadTXT, NULL); // Включаем в функцию обратной связи нашу функцию (ShtDispatchProcReadTXT) о событиях в FSX
Sleep (1);
}

}

// =========== Функция открытия сеанса SimConnect =============

void ShtSimCntOpen() // Открывает консольное окно и выводит сообщение
{
HANDLE hEventHandle = NULL;
HWND HW_Sht = 0;
DWORD UserEventWin32 = NULL;
DWORD ConfigIndex = 0;

if (SUCCEEDED(SimConnect_Open(&hSimConnect, «OpenReadFile», HW_Sht, UserEventWin32, hEventHandle, ConfigIndex)))
{
std::cout << «nConnected to Flight Simulator!n»;

}
else
std::cout << «nFailed to connect to Flight Simulator!n»;
}

// =========== Функция завершения сеанса SimConnect =============

void ShtSimCntClose() // Закрывает консольное окно
{
HRESULT ShtHr;
ShtHr = SimConnect_Close(hSimConnect);
std::cout << «nDisconnected from Flight Simulatorn»;
}

// Главная программа С++
//———————————
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
ShtSimCntOpen();
ShtEvent();
ShtSimCntClose();

std::system(«Pause»); // Предотвращение закрытия консольного окна
return 0;
}

Компилируем программу со строкой запроса для однократного вызова батареи в виде исполняемого приложения Win32, получаем exe файл, подключаем его к FSX.
Запускаем FSX, загружаем самолет Сессна-172 и видим в консольном окне запрашиваемые переменные: имя самолета, его высоту, координаты, напряжение батареи 24 В и напряжение на главной шине 28 В.

Прикрепленные изображения

  • С172_вид.jpg
  • С172_переменные.jpg

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:55

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

Загрузим другой самолет. И видим измененные данные.

Прикрепленные изображения

  • Монеу_вид.jpg
  • Монеу_переменные.jpg

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:56

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

Теперь включим строчку запроса с частотой 1 секунда, а строку однократного запроса закомментируем.
Запустим FSX, загрузим самолет Сессна-172.
Данные о напряжении батареи и на главной шине для Сессна-172 будут высвечиваться в консольном окне каждую секунду.

Прикрепленные изображения

  • С172_вид.jpg
  • С172_переменные1сек.jpg

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:56

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по ссылке http://www.avsim.su/…-2#entry2510573

Разберем процесс чтения переменных, т.е. получения их текущих значений.

Для чтения переменных Simulation Variables нужно выполнить следующие действия.
Во-первых, надо связать имя клиента с переменной Simulation Variables. Это делается с помощью API функции SimConnect_AddToDataDefinition.

Во-вторых, надо организовать запрос текущего значения переменной. Это делается с помощью двух функций: SimConnect_RequestDataOnSimObjectType и SimConnect_RequestDataOnSimObject.

Первая API функция (SimConnect_RequestDataOnSimObjectType) применяется для запроса данных о всех объектах определенного типа, находящихся в круге установленного радиуса с центром в месте пользовательского самолета. Эта функция может применяться как самостоятельно, так и в паре со второй функцией.

Вторая API функция (SimConnect_RequestDataOnSimObject) применяется для запроса данных о конкретном объекте по его идентификатору ID. Если данные запрашиваются для пользовательского самолета, то вторая API функция применяется самостоятельно. Если данные запрашиваются для любого другого объекта, например, для траффикового самолета, то его ID предварительно должен быть запрошен первой функцией. Данные этого объекта будут выведены только в том случае, если запрашиваемый объект находится от пользовательского самолета на расстоянии, не превышающем радиус установленного круга, а тип запрашиваемых объектов соответствует типу объекта, данные которого запрашиваются второй функцией.

Чтобы запрос производился в нужное время, эти две функции надо связать с событиями, получаемыми из FSX.
В-третьих, надо организовать получение и обработку получаемых переменных, например, вывод получаемых текущих значений на печать, или их анализ и принятие управленческих воздействий на основе результатов анализа и т.д.
Получение значений переменных производится с помощью уже рассмотренной функции DispathProc, которая вызывается API функцией обратной связи CallDispatch. Для этого используются перечисления типа SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE или SIMCONNECT_RECV_ID_SIMOBJECT_DATA.
Первое перечисление применяется для переменных, получаемых в результате запроса SimConnect_RequestDataOnSimObjectType, а второе — для переменных, получаемых в результате запроса SimConnect_RequestDataOnSimObject.
Оба перечисления требуют, чтобы переменные были определены в виде структур. Поэтому переменные для работы с ними определяются структурами такого вида:

struct StructureAircraftUser // Объявляем структуру данных пользовательского самолета
{
char title[256];
double altitude;
double latitude;
double longitude;
};

struct StructureAircraftUserElectricSistem // Объявляем структуру данных электрической системы пользовательского самолета
{
// char title[256];
double batteryVoltage;
double mainBusVoltage;
};

Для очистки связи имени клиента и переменной используется API функция SimConnect_ClearDataDefinition.

Описание этих API функций дано в следующих постах.

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:53

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

SimConnect_AddToDataDefinition

Функция SimConnect_AddToDataDefinition используется для того, чтобы связать переменные FSX с определенным именем клиента для определеного объекта.

Синтаксис:
HRESULT SimConnect_AddToDataDefinition(
HANDLE hSimConnect,
SIMCONNECT_DATA_DEFINITION_ID DefineID,
const char* DatumName,
const char* UnitsName,
SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64,
float fEpsilon = 0,
DWORD DatumID = SIMCONNECT_UNUSED
);
Параметры функции:
hSimConnect – идентификатор объекта SimConnect;
DefineID – специфический ID клиента, которому производится определение данных;
DatumName – специфическое имя переменной в FSX из таблицы, приведенной в разделе Simulation Variables SDK;
UnitsName – определяет единицы измерения переменной FSX. Если в переменной нет единицы измерений, например у Category, то указывается NULL;
DatumType – один из номеров перечисления SIMCONNECT_DATATYPE. Можно не указывать. Применяется только тогда, когда требуется изменение этого параметра. По умолчанию он устанавливается SIMCONNECT_DATATYPE_FLOAT64;
fEpsilon – параметр изменения данных. Можно не указывать. Применяется только тогда, когда требуется изменение данных. По умолчанию равен нулю, т.е. изменение данных не производится.
DatumID – специфический ID данных клиента. Можно не указывать. Применяется только тогда, когда требуется измение ID клиента. По умолчанию равен 0.

Возвращаемая переменная:
Функция возвращает HRESULT. Возможные значения переменной: S_OK, если функция завершилась успешно, E_FALL – если функция не выполнена.

Примечание: максимальное число вхождений на определение данных равно 1000.

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:53

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

SimConnect_RequestDataOnSimObjectType

Функция SimConnect_RequestDataOnSimObjectType используется для получения запроса о данных объекта симулятора, находящегося в круге установленного радиуса от пользовательского самолета.

Синтаксис:
HRESULT SimConnect_RequestDataOnSimObjectType(
HANDLE hSimConnect,
SIMCONNECT_DATA_REQUEST_ID RequestID,
SIMCONNECT_DATA_DEFINITION_ID DefineID,
DWORD dwRadiusMeters,
SIMCONNECT_SIMOBJECT_TYPE type
);

Параметры:
hSimConnect – указатель на объект SimConnect.
RequestID — специфический ID запроса.
DefineID – специфический ID запрашиваемых данных.
dwRadiusMeters – число double, которое показывает радиус запроса данных. Если данные запрашиваются для пользовательского самолета, то он устанавливается равным 0. Для других объектов этот радиус может быть до 200000 метров или 200 км. При запросе для большего радиуса выдается ошибка.
type – специфический тип объекта из перечня типов, установленных в перечислении SIMCONNECT_SIMOBJECT_TYPE.

Возврашаемое значение.
Функция возвращает результат как HRESULT. Значения возвращаемой переменной могут быть:
S_OK – если функция завершилась успешно;
E_FALL – если функция завершилась неуспешно.

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:54

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

SimConnect_RequestDataOnSimObject

Функция SimConnect_RequestDataOnSimObject используется для запроса, когда клиент SimConnect получает установленные данные для конкретного объекта. Например, объектом является пользовательский самолет, а установленными (определенными оператором definition) данными является напряжение батареи. После загрузки пользовательского самолета напряжение батареи станет доступным и с помощью функции SimConnect_RequestDataOnSimObject будет произведен запрос его значения.
Синтаксис:
HRESULT SimConnect_RequestDataOnSimObject(
HANDLE hSimConnect,
SIMCONNECT_DATA_REQUEST_ID RequestID,
SIMCONNECT_DATA_DEFINITION_ID DefineID,
SIMCONNECT_OBJECT_ID ObjectID,
SIMCONNECT_PERIOD Period,
SIMCONNECT_DATA_REQUEST_FLAG Flags = 0,
DWORD origin = 0,
DWORD interval = 0,
DWORD limit = 0
);
Параметры:
hSimConnect – указатель на объект SimConnect.

RequestID – специфический ID запроса клиента. Этот ID позднее используется клиентом, чтобы определить, какие данные получены в результате запроса. Это значение должно быть уникальным для каждого запроса. При повторном использовании RequestID нужно перезаписать любой предыдущий запрос, используя тот же ID.

DefineID – специфический ID определенных данных клиента, которые запрашиваются.

ObjectID — специфический ID объекта клиента, данные которого запрашиваются. Этот ID может быть любым из структуры SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE. Например, SIMCONNECT_OBJECT_ID_USER – объект – пользовательский самолет.

Period – частота запроса. Определяется параметром перечисления SIMCONNECT_PERIOD и может принимать следующие значения:
SIMCONNECT_PERIOD_NEVER – данные не запрашиваются никогда;
SIMCONNECT_PERIOD_ONCE – данные запрашиваются однократно;
SIMCONNECT_PERIOD_VISUAL_FRAME – данные запрашиваются при смене каждого визуального кадра;
SIMCONNECT_PERIOD_SIM_FRAME – данные запрашиваются при смене каждого моделируемого кадра независимо от визуальных кадров;
SIMCONNECT_PERIOD_SECOND – данные запрашиваются каждую секунду.

Flags – флаг, слово DWORD, включающее одно из следующих значений:
0 – по умолчанию;
SIMCONNECT_DATA_REQUEST_FLAG_CHANGED – данные запрашиваются при изменении одного или нескольких параметров;
SIMCONNECT_DATA_REQUEST_FLAG_TAGGED – запрашиваемые данные будут отправляться в формате tagged (пара ID/value). Tagged формат предполагает, что значение переменной возвращается вместе с ID для того, чтобы клиент мог идентифицировать переменную.

origin – количество значений параметра Period, которые должны пройти, прежде чем начнется передача данных. По умолчанию равен нулю, что означает, что передача начинается немедленно.
interval – количество значений параметра Period, через которые производится передача данных. Например, интервал передачи составляет 5 секунд. По умолчанию равен нулю, что означает, что передача данных производится каждый Period.
limit – время, в течение которого должны передаваться данные. По умолчанию равно нулю, что означает передачу все время работы сеанса SimConnect.

Возвращаемое значение.
Функция возвращает результат как HRESULT. Значения возвращаемой переменной могут быть:
S_OK – если функция завершилась успешно;
E_FALL – если функция завершилась неуспешно.

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:54

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

SimConnect_ClearDataDefinition

Удаляет все симуляторные переменные FSX из определенного объекта клиента.

Синтаксис:
HRESULT SimConnect_ClearDataDefinition(
HANDLE hSimConnect,
SIMCONNECT_DATA_DEFINITION_ID DefineID
);
Параметры:
hSimConnect – дескриптор (хэндл) объекта SimConnect;
DefineID – специфический ID клиента, данные которого были опеределены и которые надо очистить.

Возвращаемая переменная.
Функция возвращает HRESULT. Возможные значения переменной: S_OK, если функция завершилась успешно, E_FALL – если функция не выполнена.

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:55

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573

Описание API функций чтения переменных FSX.

Подобным образом можно получить текущее значение любой переменной Simulation Variables.
Повторюсь, что приведенный пример работает при компилировании исполняющего приложения Win32 в формате .exe. Для библиотек DLL организация запроса и чтения переменных Simulation Variables иная, хотя использует тот же набор API функций, перечислений и структур.

Сообщение отредактировал dmi-shef: 03 October 2013 — 17:57

Эта тема создана для сообщений и обсуждения использования SimConnect для чтения переменных FSX.