Cross
Вот тот вариант, а котором я пишу, с учетом Вашей поправки:
Код: Выделить всё
function Initialise ()
gBrakeState = 0 -- эта штука служит связующим звеном между движковым и виртуальным тормозом.
gBrakeLock = false -- данная переменная служит первым блоком (пока пищит DSD (по умолчанию выключена)
gBrakeLock_2 = false-- данная переменная служит вторым блоком (пока есть рассинхрон)(по умолчанию выключена)
gBrakeState_2 = 0 -- буферная переменная;
end
function OnControlValueChange ( name, index, value )
if name == "VirtualBrake" then
gBrakeState = Call( "*:GetControlValue", "VirtualBrake", 0) --Считываем значение виртуального контрола
gBrakeState_2 = gBrakeState --копируем это значение в буфер
if (gBrakeLock == true) or (gBrakeLock_2 == true) then --если стоит хотя бы 1 блок
gBrakeState_2 = 1 --мы подставляем значение, независимое
--от положения ручки
if (gBrakeLock == false) then --и проверяем, какой именно блок установлен
--Выполнение условия означает, что педаль DSD нажата
if (gBrakeState == TrainBrakeControl) then --теперь, если ручка тормоза в положении 1
--(как и сам реальный тормоз)
gBrakeLock_2 = false --мы можем отключить второй блок
end
end
end
Call( "*:SetControlValue", "TrainBrakeControl", 0, gBrakeState_2 ) -- передаем значение реальному контролу
end
...
if gDSDStartCount > DSDDELAY + 5 and not isDSDTriggered and not isSafetyIsolated then
isDSDTriggered = true
Call( "*:SetControlValue", "TrainBrakeControl", 0, 1 )
Call( "*:SetControlValue", "Regulator", 0, 0 )
Call( "*:SetControlValue", "Reverser", 0, 0 )
gBrakeLock = true
gBrakeLock_2 = true -- До тех пор, пока переменные содержат такое значение,
-- на реальный тормоз будет передаваться подмененные данные
-- т.е. движение ручки влиять на него не будет
end
Суть алгоритма: данные на движковый тормоз передаются постоянно, т.е. с точки зрения движка с момента срабатывания DSD ручка тормоза неподвижна и стабильно находится в положении "экстренный тормоз". Мы можем её двигать, но это ничего не даст, даже если мы поставим её в положение 1, т.е. блокировка будет, хотя движок этого даже не заметит

. После нажатия педали DSD ручка все равно будет "отсоединена" от реального тормоза, зато мы получим возможность снять второй блок, установив её в положение 1. Когда ручка будет поставлена в положение 1, движок начнет получать данные уже от нее, хотя даже не "заметит" этого - ведь он получит 1, и до этого получал 1. Значит, движок будет "уверен", что он ни на секунду не терял контроль над положением ручки. После этого смена положения ручки будет передаваться без резкого скачка. Вернее, будет 1 скачок - в момент срабатывания DSD, но ведь это предусмотрено, а других не будет.
--- добавлено позже в 09 авг 2015, 14:20 ---
Cross писал(а):По логике вещей я так понимаю, что дальше нужно писать условие проверки, что isDSDTriggered == true and gBrakeLock == true тогда
если активна пищалка тогда
если получить значение педали DSD == 1 тогда
если получить значение виртуального тормоза == 1 тогда
gBrakeLock = false
isDSDTriggered = false
Это должно по идее вернуть синхронизацию, когда выполнено условие отключения пищалки, затем тормоз переведён в "экстренное" и на этом моменте, если потянуть ручку назад, то мы свяжемся с TrainBrakeControl и сможем снова контроллировать параметр. Но этого почему-то не происходит. Вот оно как блокируется разово, так и всё
А разве isDSDTriggered == true и gBrakeLock == true не дублируют друг друга? Ведь фактически, при срабатывании DSD обе эти переменные получают значение "да", а после нажатия педали - "нет". По-моему, можно отказаться от переменной gBrakeLock и ориентироваться на isDSDTriggered. Но это так, заметка, проблему это не решит. (Возможно, я не до конца понимаю значения переменной isDSDTriggered).
Все же мне кажется, что основной причиной является восстановление связи при различных значениях виртуального и реального контрола. Ведь, насколько я понимаю, на реальном тормозе завязана анимация тормозных механизмов, звуки, и вот - он стоит на 1, а мы восстанавливаем связь, и он получает новое значение, допустим, 0,4. Разве это не стресс для движка? Мой алгоритм позволяет этого избежать, попробуйте, пожалуйста, кто знает, вдруг поможет? Хуже точно не будет

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