Jump to content

Lock ON и железная кабина.


Recommended Posts

Возникла необходимость (по убедительной просьбе любимого племянника) подключить к военному симулятору Lock On ГС-2 существующую железную кабину, которая работает под МФС.

Что оказалось для меня совсем не простой задачей. Тем более, что программа управления кабиной должна находиться на другом компьютере. Но надеюсь с помощью коллег по симулятору эту проблему решить.

P1040660.thumb.JPG.e49238db275f7f49a782a9d01ef9a1f6.JPG

  • Like 1
Link to comment
Share on other sites

Как известно работа с этой программой обеспечивается за счет взаимодействия по протоколу TCP.

Механизм работы примерно следующий : программа связи симулятора со внешними устройствами создает TCP «сервер» (ведущий процесс) , который ( упрощенно ) является областью в памяти компьютера .

Эту область программа связи симулятора с внешними устройствами постоянно прослушивает. В свою очередь ЛокОн создает «клиент» ( то есть ведомый процесс ) который постоянно передает в эту область данные. Увидев наличие данных программа связи должна считать их, и преобразовав выдать во внешние устройства. Лок Он при запуске анализирует, создан ли сервер. Если сервер не создан, то Лок Он не будет передавать данные. Таким образом, для корректной работы необходимо СНАЧАЛА запустить программу связи (сервер), и только после этого ЛокОн.

По совету Андрея (Lisa) попробуем применить такую схему:

Lock On => Lua => TCP/IP => Sioc => клиент => приборы.

SIOCиспользуется исключительно как сервер на который LockOn посылает данные.

Для того , чтобы ЛокОн начал работать с созданным сервером необходимо :

- объяснить программе, что она должна работать по TCP.

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

- указать программе объем данных ( параметры ), который необходимо передавать .

 

После настройки программы:

- сформировав сервер дождаться начала обмена данными .

 

Эта последовательность действий обеспечивается следующим образом.

1. Вфайле ...\1C\Eagle Dinamics\LO\Config\Export\Config.lua

найти строку EnableExportScript = false ( в принципе она одна там и есть )...

и исправить её так :EnableExportScript = true

Этим мы дадим знать ЛокОн что ему необходимо начать работать на передачу (экспорт)

данных.

2. Заменитьфайл ...\1C\Eagle Dinamics\LO\Config\Export\Export.lua

на одноименный файл , ( то есть с нашими данными )

Желательно старый файл не удалять а переименовать (на всякий случай ).

 

В этом файле находятся :

- настройки TCP ( номер порта и номер хоста )

- ----------------------------------------------------------- --процедурыоткрытияпорта

functionLuaExportStart()

package.path =package.path..";.\\LuaSocket\\?.

lua"package.cpath =package.cpath..";.\\LuaSocket\\?.dll"

socket =require("socket") host ="192.168.10.190"--сетевойадресSIOC

port =8092порт SIOC

c = socket.try(socket.connect(host, port))

c:setoption("tcp-nodelay",true)

c:settimeout(.01)end

------------------------------------------------------------------------------------

--значения"host"и"port"поумолчаниюдляSIOC host – сетевой адрес компьютера на котором установлен сервер.

 

Запускаем SIOC сервер, затем LockOn, выбираем миссию. Компьютеры связаны по локальной сети.

В строчке "Clientsconnecteds" должны увидеть, сколько клиентов подключены. Если соединение получилось уже хорошо.

Sioc.JPG.3c1cb4994fc4162097419eb5798c16b5.JPG

Link to comment
Share on other sites

Теперь дальше получаемые данные полета.

-- эта функция выполняется после отрисовки каждого кадра

function LuaExportAfterNextFrame()

local lSIOC_SendString = ""

local TAS = LoGetTrueAirSpeed()* 3.6 -- получаем значение истинной скорости

local IAS = LoGetIndicatedAirSpeed()* 3.6 -- получаем значение прибрной скорости

local AOA = LoGetAngleOfAttack() -- угол атаки

local Gp = LoGetAccelerationUnits() -- перегрузка

local VV = LoGetVerticalVelocity() -- верт скорость

local altBar = LoGetAltitudeAboveSeaLevel()

local altRad = LoGetAltitudeAboveGroundLevel()

local pitch, bank, yaw = LoGetADIPitchBankYaw()

local Mach = LoGetMachNumber()

local HSI = LoGetControlPanel_HSI()

local engine = LoGetEngineInfo()

local route = LoGetRoute()

local PlaneID = LoGetPlayerPlaneId()

local obj = LoGetObjectById(PlaneID)

local myXCoord, myZCoord = getXYCoords(obj.LatLongAlt.Lat, obj.LatLongAlt.Long)

local navi = LoGetNavigationInfo()

R0 = TAS

R1 = IAS

R2 = AOA*ToDegree

R3 = Gp.y

R4 = VV

R5 = altBar

R6 = altRad

-- округляем значение до целого

R0 = math.floor(R0 + 0.5)

R1 = math.floor(R1 + 0.5)

R2 = math.floor(R2 + 0.5)

R3 = math.floor(R3 + 0.5)

R4 = math.floor(R4 + 0.5)

R5 = math.floor(R5 + 0.5)

R6 = math.floor(R6 + 0.5)

-- формируем строчку номер переменной = значение

R0 = "0="..R0..":"

R1 = "1="..R1..":"

R2 = "2="..R2..":"

R3 = "3="..R3..":"

R4 = "4="..R4..":"

R5 = "5="..R5..":"

R6 = "6="..R6..":"

-- записываем строчку

lSIOC_SendString = lSIOC_SendString..R0

lSIOC_SendString = lSIOC_SendString..R1

lSIOC_SendString = lSIOC_SendString..R2

lSIOC_SendString = lSIOC_SendString..R3

lSIOC_SendString = lSIOC_SendString..R4

lSIOC_SendString = lSIOC_SendString..R5

lSIOC_SendString = lSIOC_SendString..R6

-- отправляем

if lSIOC_SendString ~= "" then

socket.try(c:send("Arn.Resp:"..lSIOC_SendString.."\n"))

end

end

-- процедуры закрытия порта

function LuaExportStop()

io.close()

socket.try(c:send("quit")) -- to close the listener socket

c:close()

end

------------------------------------------------------------------

Link to comment
Share on other sites

Первая часть задачи была решена, работают основные приборы и системы.

Возникла необходимость обратной передачи данных от железной кабины (пульты управления, положение некоторых органов управления) в LockOn. Должна работать связка кабина ==>клиент==>Sioc==>Export.lua==>LockOn.

Первая часть задачи послать данные от кабины в Sioc. Евгений (Shaman_2010) подсказал, как это сделать.

Нужно отправить в SIOC пакет вида:

Arn.Resp: номер переменной = значение переменной: номер переменной = значение переменной: и в конце закончить символами "#$D" "#$A".

Например, для отправки данных из кабины резервируем переменные с номерами от 50 до 80, тогда процедура отправки данных в Sioc (в клиентской части) выглядит так.

var

Sioc_Send: string;

begin

Sioc_Send := 'Arn.Resp:';

Sioc_Send := Sioc_Send + '50=' + IntToStr(c1) + ':51=' + IntToStr(c1) + .... + ':';

Sioc_Send := SiocSend + #$D + #$A;

ClientSocket.Socket.SendText(Sioc_Send);

Sioc_Send := '':

end;

Однако, это только половина дороги. Теперь задача научить Export.Lua читать эти данные.

Вот тут пока загвоздка!

Знающие люди – подскажите!?

Link to comment
Share on other sites

Мало у нас тут людей интересуется железными кабинами!

 

Судя по всему этим кодом в начале старта ЛокОна запрашиваются от СИОК переменные находящиеся в файле inputsTable с номерами те,что в квадратных скобках.

 

local lSIOC_Var, i

local lSIOC_SendString = ""

 

-- Generate the init string to SIOC (to register with SIOC which parameters we are interested in)

for lSIOC_Var,i in pairs(inputsTable)

do

lSIOC_SendString = lSIOC_SendString..lSIOC_Var..":"

end

-- Send the initstring

socket.try(c:send("Arn.Inicio:"..lSIOC_SendString.."\n"))

Link to comment
Share on other sites

Тут каки е то операции с этими переменными:

 

-- Works just before every simulation frame.

-- Check for data/string from the SIOC server on the socket

local inpst = c:receive()

if inpst then

for lSIOC_Param, lSIOCValue in SIOC_Parse(inpst) do

if inputsTable[lSIOC_Param] ~= nil then

inputsTable[lSIOC_Param][1](lSIOCValue, inputsTable[lSIOC_Param][2],inputsTable[lSIOC_Param][3],inputsTable[lSIOC_Param][4],inputsTable[lSIOC_Param][5])

end

end

-- io.flush()

end

 

Вот понять бы какие?

Link to comment
Share on other sites

  • 2 weeks later...

http://code.google.com/p/dcsbsexport/

Насколько я понял, речь тут идет про кликабельные элементы и индикаторы. Т.е. те элементы управления, которые управляются щелчком на экране кнопкой мыши, но в ЛокОне таких элементов я не вижу. Скорее всего, в случае ЛокОна нужен другой подход.

Link to comment
Share on other sites

В файле inputsTable.lua формируем нужные нам переменные и назначаем им команды.

например:

 

-- General Format [sIOC Parameter Value] = {Function, input1, input2, input 3, input4}

-------------------------------------------------------------

-- Примечание: Значение параметра SIOC должно быть 1 или 0, никакие другие значения недопустимы

-- приведет к непредсказуемым результатам.

-------------------------------------------------------------

 

inputsTable = {

[50] = {TwoPositionSwitch, 309, 1, 1}, -- Запуск двигателя.

[51] = {TwoPositionSwitch, 300, 1, 1}, -- Освещение кабины.

[52] = {TwoPositionSwitch, 82, 1, 1}, -- Сброс подвесок.

[53] = {TwoPositionSwitch, 310, 1, 1}, -- Останов двигателя.

[54] = {TwoPositionSwitch, 430, 1, 1}, --Шасси выпустить.

[55] = {TwoPositionSwitch, 431, 1, 1, 1}, -- Шасси убрать.

[56] = {TwoPositionSwitch, 76, 1, 1, 1}, -- Сбросить тормозной парашют.

[57] = {TwoPositionSwitch, 12, 1, 1, 1},

[58] = {TwoPositionSwitch, 12, 1, 1, 1},

[59] = {TwoPositionSwitch, 12, 1, 1, 1},

}

Link to comment
Share on other sites

В файле ExportSupport.lua в функции TwoPositionSwitch меняем строку GetDevice(pDevice):performClickableAction(pNumber + 3000, pValue * pOnValue)

на строку LoSetCommand(pDevice)

 

В файле Export.lua нужно прописать путь к файлам inputsTable и ExportSupport.lua

 

--load the support functions

dofile("./Config/Export/ExportSupport.lua")

-- Load Sioc input definitions

dofile "./Config/Export/SIOCConfig/inputsTable.lua"

Link to comment
Share on other sites

Как оказалась функция LoSetCommand(номер команды) реагирует на любое изменение переменной, т.е. независимо, что там 0 или 1. Что вызывает некоторые неудобства при начальной загрузке Локк Она.

Link to comment
Share on other sites

  • 3 years later...

Ra3DCS, ПОМОГИТЕ. Уже голову сломал.

Задача. завести переменную, допустим 596 и повесить на неё функцию 430 - шасси. Потом ручками в консоли OPENSIOC поставить единичку и что б шасси выпустились.

 

Взял с сайта летяга все луа, в inputstable.lua и siocconfig.lua добавил [596] = {TwoPositionSwitch, 430, 1, 1}, В ExpotrSupport.lua пробовал заменять GetDevice(pDevice):performClickableAction(pNumber + 3000, pValue * pOnValue)

на LoSetCommand(pDevice)

 

В общем результата 0. В сиоке меняется а в Сушке шасси не выезжают. (может так и должно быть ?)

 

Хоть посоветуйте что то ПОЖАЛУЙСТА.

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...