mirror of
https://github.com/weyne85/DCS-ExportScripts.git
synced 2025-10-29 16:58:18 +00:00
added digital compass for Hip
This commit is contained in:
parent
eb7f1027ad
commit
c72de78db4
@ -1008,6 +1008,9 @@ function ExportScript.ProcessIkarusDCSConfigHighImportance(mainPanelDevice)
|
|||||||
|
|
||||||
--[21] = "%.4f", -- VD_10K_L_PRESS {0.0, 1.0}
|
--[21] = "%.4f", -- VD_10K_L_PRESS {0.0, 1.0}
|
||||||
ExportScript.Tools.SendData(21, string.format("%.4f", ExportScript.Tools.negate(mainPanelDevice:get_argument_value(21)))) -- negate
|
ExportScript.Tools.SendData(21, string.format("%.4f", ExportScript.Tools.negate(mainPanelDevice:get_argument_value(21)))) -- negate
|
||||||
|
|
||||||
|
ExportScript.CompassReadouts(mainPanelDevice)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function ExportScript.ProcessDACConfigHighImportance(mainPanelDevice)
|
function ExportScript.ProcessDACConfigHighImportance(mainPanelDevice)
|
||||||
@ -1325,3 +1328,297 @@ function ExportScript.ProcessDACConfigLowImportance(mainPanelDevice)
|
|||||||
end
|
end
|
||||||
]]
|
]]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function ExportScript.CompassReadouts(mainPanelDevice)
|
||||||
|
|
||||||
|
--[[
|
||||||
|
|
||||||
|
[25] = "%.4f", -- UGR_4K_heading_L {0.0, 1.0}
|
||||||
|
[27] = "%.4f", -- UGR_4K_commanded_course_L {0.0, 1.0}
|
||||||
|
[28] = "%.4f", -- UGR_4K_bearing_needle_L {0.0, 1.0}
|
||||||
|
----
|
||||||
|
[101] = "%.4f", -- UGR_4K_heading_R {0.0, 1.0}
|
||||||
|
[103] = "%.4f", -- UGR_4K_commanded_course_R {0.0, 1.0}
|
||||||
|
[104] = "%.4f", -- UGR_4K_bearing_needle_R {0.0, 1.0}
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
--ExportScript.Tools.SendData(3000, "Hi") --test
|
||||||
|
local pilotCompassHeadingValue = ExportScript.Tools.round(mainPanelDevice:get_argument_value(25),8)--rounds to the 8th digit after the decimal
|
||||||
|
local pilotCompassCommandedCourseValue = ExportScript.Tools.round(mainPanelDevice:get_argument_value(27),8)--makes it more accurate compared to 2
|
||||||
|
local pilotCompassBearingNeedleValue = ExportScript.Tools.round(mainPanelDevice:get_argument_value(28),8)
|
||||||
|
|
||||||
|
--[[
|
||||||
|
we know for the HeadingValue, 0.0 = 000
|
||||||
|
0.5 = 180
|
||||||
|
1.0 = 000
|
||||||
|
|
||||||
|
For both the commanded course and the bearing needle are similar,
|
||||||
|
but they are based on the orentation of the Heading value.
|
||||||
|
|
||||||
|
This means that if we subtract their values from the Heading value,
|
||||||
|
the absolute value should represent the fraction of the compass that
|
||||||
|
is shown. Hopefully...
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
if pilotCompassHeadingValue = 0.0, the top is indicating 000
|
||||||
|
pilotCompassCommandedCourseValue at 0.0 will show 000
|
||||||
|
pilotCompassBearingNeedleValue at 0.0 will show 000
|
||||||
|
|
||||||
|
We realize that we only need to solve for CommandedCourse bc the
|
||||||
|
bearingNeedle will be the same code.
|
||||||
|
|
||||||
|
if pilotCompassHeadingValue = 0.25, the top is indicating 090
|
||||||
|
if pilotCompassCommandedCourseValue at 0.0 will point to 090
|
||||||
|
if pilotCompassCommandedCourseValue at 0.25 will point to 180
|
||||||
|
|
||||||
|
Now let's make up some math that works. Science!
|
||||||
|
|
||||||
|
We know that 180 should "be" 0.50. That turns out to be the vaules combined...
|
||||||
|
Let's see if that works in a different example.
|
||||||
|
|
||||||
|
if pilotCompassHeadingValue = 0.75, the top is indicating 270
|
||||||
|
if pilotCompassCommandedCourseValue at 0.0 will point to 270
|
||||||
|
if pilotCompassCommandedCourseValue at 0.50 will point to 090
|
||||||
|
|
||||||
|
Does it work? Well, 0.75 plus 0.50 = 1.25, which reduced by 1 = 0.25, which
|
||||||
|
represents a compass value of 090. Yes! The logic works!
|
||||||
|
All of the above was assumed and varified via ModelViewer.
|
||||||
|
|
||||||
|
Now lets write that in code.
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Let's print out some easy, basic, raw values to monitor our base assumptions
|
||||||
|
-- This step is import so that we don't go in a random direction with our code.
|
||||||
|
-- Dont use the ':' symbol. Export Scripts does not like that.
|
||||||
|
--[[
|
||||||
|
ExportScript.Tools.SendData(3000, "HDG\n"
|
||||||
|
.. "Raw " .. pilotCompassHeadingValue .. "\n"
|
||||||
|
.. "DEG " .. pilotCompassHeadingValue*360)
|
||||||
|
ExportScript.Tools.SendData(3001, "Needle 2\n"
|
||||||
|
.. "Raw " .. pilotCompassCommandedCourseValue .. "\n"
|
||||||
|
.. "Abs " .. pilotCompassCommandedCourseValue*360)
|
||||||
|
ExportScript.Tools.SendData(3002, "Needle 1\n"
|
||||||
|
.. "Raw " .. pilotCompassBearingNeedleValue .. "\n"
|
||||||
|
.. "Abs " .. pilotCompassBearingNeedleValue*360)
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Now we code the code we think is going to work using out thought process from above.
|
||||||
|
|
||||||
|
local pilotadditiveCommandedValue = pilotCompassHeadingValue + pilotCompassCommandedCourseValue
|
||||||
|
local pilotCompassCommandedNeedleValue_adjusted
|
||||||
|
|
||||||
|
-- We have to reduce the number to below 1 (or below 360 if we did it later).
|
||||||
|
|
||||||
|
if pilotadditiveCommandedValue > 1 then
|
||||||
|
pilotCompassCommandedNeedleValue_adjusted = pilotadditiveCommandedValue - 1
|
||||||
|
-- The max the additive can be is "2". if we minus 1 from 2, we get 1, which is 360.
|
||||||
|
-- Not more reduction logic is necessary.
|
||||||
|
else
|
||||||
|
pilotCompassCommandedNeedleValue_adjusted = pilotadditiveCommandedValue
|
||||||
|
end
|
||||||
|
|
||||||
|
-- we need to add a '0' to the front for numbers less than three digits long
|
||||||
|
-- or add two '0's for number less than two digits long
|
||||||
|
-- The following code is from the mossie.lua
|
||||||
|
|
||||||
|
--turn the number into a string
|
||||||
|
pilotCompassCommandedNeedleValue_adjusted = string.format("%.1d" , round(pilotCompassCommandedNeedleValue_adjusted*360,0))
|
||||||
|
|
||||||
|
--if the values string length is 2 then
|
||||||
|
if #pilotCompassCommandedNeedleValue_adjusted == 2 then
|
||||||
|
pilotCompassCommandedNeedleValue_adjusted = "0" .. pilotCompassCommandedNeedleValue_adjusted
|
||||||
|
elseif #pilotCompassCommandedNeedleValue_adjusted == 1 then
|
||||||
|
pilotCompassCommandedNeedleValue_adjusted = "00" .. pilotCompassCommandedNeedleValue_adjusted
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
ExportScript.Tools.SendData(3003, "Needle 2\n"
|
||||||
|
.. "Deg " .. pilotCompassCommandedNeedleValue_adjusted)
|
||||||
|
|
||||||
|
|
||||||
|
ExportScript.Tools.SendData(3004, "Additive\n" .. pilotadditiveCommandedValue .. "=\n"
|
||||||
|
.. pilotCompassHeadingValue .. "+\n"
|
||||||
|
.. pilotCompassCommandedCourseValue)
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Yay, it works! Now we need to format into solid degrees and round the result
|
||||||
|
-- After that we will clean the code up a bit and then replicate for the other needle.
|
||||||
|
|
||||||
|
local pilotadditiveBearingValue = pilotCompassHeadingValue + pilotCompassBearingNeedleValue
|
||||||
|
local pilotCompassBearingNeedleValue_adjusted
|
||||||
|
|
||||||
|
-- We have to reduce the number to below 1 (or below 360 if we did it later).
|
||||||
|
|
||||||
|
if pilotadditiveBearingValue > 1 then
|
||||||
|
pilotCompassBearingNeedleValue_adjusted = pilotadditiveBearingValue - 1
|
||||||
|
-- The max the additive can be is "2". if we minus 1 from 2, we get 1, which is 360.
|
||||||
|
-- Not more reduction logic is necessary.
|
||||||
|
else
|
||||||
|
pilotCompassBearingNeedleValue_adjusted = pilotadditiveBearingValue
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- we need to add a '0' to the front for numbers less than three digits long
|
||||||
|
-- or add two '0's for number less than two digits long
|
||||||
|
-- The following code is from the mossie.lua
|
||||||
|
|
||||||
|
--turn the number into a string
|
||||||
|
pilotCompassBearingNeedleValue_adjusted = string.format("%.1d" , round(pilotCompassBearingNeedleValue_adjusted*360,0))
|
||||||
|
|
||||||
|
--if the values string length is 2 then
|
||||||
|
if #pilotCompassBearingNeedleValue_adjusted == 2 then
|
||||||
|
pilotCompassBearingNeedleValue_adjusted = "0" .. pilotCompassBearingNeedleValue_adjusted
|
||||||
|
elseif #pilotCompassBearingNeedleValue_adjusted == 1 then
|
||||||
|
pilotCompassBearingNeedleValue_adjusted = "00" .. pilotCompassBearingNeedleValue_adjusted
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
ExportScript.Tools.SendData(3005, "Needle 1\n"
|
||||||
|
.. "Deg " .. pilotCompassBearingNeedleValue_adjusted)
|
||||||
|
]]
|
||||||
|
-- Now that we have all of that information, it's time to put in onto one tile.
|
||||||
|
|
||||||
|
--turn the number into a string
|
||||||
|
pilotCompassHeadingValue = string.format("%.1d" , round(pilotCompassHeadingValue*360,0))
|
||||||
|
|
||||||
|
--if the values string length is 2 then
|
||||||
|
if #pilotCompassHeadingValue == 2 then
|
||||||
|
pilotCompassHeadingValue = "0" .. pilotCompassHeadingValue
|
||||||
|
elseif #pilotCompassHeadingValue == 1 then
|
||||||
|
pilotCompassHeadingValue = "00" .. pilotCompassHeadingValue
|
||||||
|
end
|
||||||
|
|
||||||
|
--last minute string adjustment for this aircraft's compass
|
||||||
|
if pilotCompassHeadingValue == "360" then pilotCompassHeadingValue = "000" end
|
||||||
|
if pilotCompassCommandedNeedleValue_adjusted == "360" then pilotCompassCommandedNeedleValue_adjusted = "000" end
|
||||||
|
if pilotCompassBearingNeedleValue_adjusted == "360" then pilotCompassBearingNeedleValue_adjusted = "000" end
|
||||||
|
|
||||||
|
ExportScript.Tools.SendData(3000, "PLT\n"
|
||||||
|
.. "HDG " .. pilotCompassHeadingValue
|
||||||
|
.. "\nN1 " .. pilotCompassCommandedNeedleValue_adjusted
|
||||||
|
.. "\nN2 " .. pilotCompassBearingNeedleValue_adjusted)
|
||||||
|
|
||||||
|
|
||||||
|
--=====Copilot Side=====--
|
||||||
|
|
||||||
|
local copilotCompassHeadingValue = ExportScript.Tools.round(mainPanelDevice:get_argument_value(101),2)
|
||||||
|
local copilotCompassCommandedCourseValue = ExportScript.Tools.round(mainPanelDevice:get_argument_value(103),2)
|
||||||
|
local copilotCompassBearingNeedleValue = ExportScript.Tools.round(mainPanelDevice:get_argument_value(104),2)
|
||||||
|
|
||||||
|
|
||||||
|
local copilotadditiveCommandedValue = copilotCompassHeadingValue + copilotCompassCommandedCourseValue
|
||||||
|
local copilotCompassCommandedNeedleValue_adjusted
|
||||||
|
|
||||||
|
if copilotadditiveCommandedValue > 1 then
|
||||||
|
copilotCompassCommandedNeedleValue_adjusted = copilotadditiveCommandedValue - 1
|
||||||
|
else
|
||||||
|
copilotCompassCommandedNeedleValue_adjusted = copilotadditiveCommandedValue
|
||||||
|
end
|
||||||
|
|
||||||
|
local copilotCompassCommandedNeedleValue_adjustedInt = round(copilotCompassCommandedNeedleValue_adjusted*360,0) --used for later
|
||||||
|
copilotCompassCommandedNeedleValue_adjusted = string.format("%.1d" , round(copilotCompassCommandedNeedleValue_adjusted*360,0))
|
||||||
|
|
||||||
|
--if the values string length is 2 then
|
||||||
|
if #copilotCompassCommandedNeedleValue_adjusted == 2 then
|
||||||
|
copilotCompassCommandedNeedleValue_adjusted = "0" .. copilotCompassCommandedNeedleValue_adjusted
|
||||||
|
elseif #copilotCompassCommandedNeedleValue_adjusted == 1 then
|
||||||
|
copilotCompassCommandedNeedleValue_adjusted = "00" .. copilotCompassCommandedNeedleValue_adjusted
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local copilotadditiveBearingValue = copilotCompassHeadingValue + copilotCompassBearingNeedleValue
|
||||||
|
local copilotCompassBearingNeedleValue_adjusted
|
||||||
|
|
||||||
|
if copilotadditiveBearingValue > 1 then
|
||||||
|
copilotCompassBearingNeedleValue_adjusted = copilotadditiveBearingValue - 1
|
||||||
|
else
|
||||||
|
copilotCompassBearingNeedleValue_adjusted = copilotadditiveBearingValue
|
||||||
|
end
|
||||||
|
|
||||||
|
copilotCompassBearingNeedleValue_adjustedInt = round(copilotCompassBearingNeedleValue_adjusted*360,0)--used for later
|
||||||
|
--turn the number into a string
|
||||||
|
copilotCompassBearingNeedleValue_adjusted = string.format("%.1d" , round(copilotCompassBearingNeedleValue_adjusted*360,0))
|
||||||
|
|
||||||
|
--if the values string length is 2 then
|
||||||
|
if #copilotCompassBearingNeedleValue_adjusted == 2 then
|
||||||
|
copilotCompassBearingNeedleValue_adjusted = "0" .. copilotCompassBearingNeedleValue_adjusted
|
||||||
|
elseif #copilotCompassBearingNeedleValue_adjusted == 1 then
|
||||||
|
copilotCompassBearingNeedleValue_adjusted = "00" .. copilotCompassBearingNeedleValue_adjusted
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Now that we have all of that information, it's time to put in onto one tile.
|
||||||
|
|
||||||
|
|
||||||
|
--turn the number into a string
|
||||||
|
copilotCompassHeadingValue = string.format("%.1d" , round(copilotCompassHeadingValue*360,0))
|
||||||
|
|
||||||
|
--if the values string length is 2 then
|
||||||
|
if #copilotCompassHeadingValue == 2 then
|
||||||
|
copilotCompassHeadingValue = "0" .. copilotCompassHeadingValue
|
||||||
|
elseif #copilotCompassHeadingValue == 1 then
|
||||||
|
copilotCompassHeadingValue = "00" .. copilotCompassHeadingValue
|
||||||
|
end
|
||||||
|
|
||||||
|
--last minute string adjustment for this aircraft's compass
|
||||||
|
if copilotCompassHeadingValue == "360" then copilotCompassHeadingValue = "000" end
|
||||||
|
if copilotCompassCommandedNeedleValue_adjusted == "360" then copilotCompassCommandedNeedleValue_adjusted = "000" end
|
||||||
|
if copilotCompassBearingNeedleValue_adjusted == "360" then copilotCompassBearingNeedleValue_adjusted = "000" end
|
||||||
|
|
||||||
|
ExportScript.Tools.SendData(3001, "CPLT\n"
|
||||||
|
.. "HDG " .. copilotCompassHeadingValue
|
||||||
|
.. "\nN1 " .. copilotCompassCommandedNeedleValue_adjusted
|
||||||
|
.. "\nN2 " .. copilotCompassBearingNeedleValue_adjusted)
|
||||||
|
|
||||||
|
|
||||||
|
-- something a little extra. an "on course" or "on bearing" detector that changes colors
|
||||||
|
-- if the commanded course is within 5 degrees of the way you are going, then you are on course
|
||||||
|
-- if the ndb bearing line is within 5 degrees of the way you are going, then you are on bearing
|
||||||
|
-- You can code this some other day.
|
||||||
|
end
|
||||||
|
|
||||||
|
------------------------------
|
||||||
|
-- General Helper Functions --
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
function ExportScript.Linearize(current_value, raw_tab, final_tab)
|
||||||
|
-- (c) scoobie
|
||||||
|
if current_value <= raw_tab[1] then
|
||||||
|
return final_tab[1]
|
||||||
|
end
|
||||||
|
for index, value in pairs(raw_tab) do
|
||||||
|
if current_value <= value then
|
||||||
|
local ft = final_tab[index]
|
||||||
|
local rt = raw_tab[index]
|
||||||
|
return (current_value - rt) * (ft - final_tab[index - 1]) / (rt - raw_tab[index - 1]) + ft
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- we shouldn't be here, so something went wrong - return arbitrary max. final value, maybe the user will notice the problem:
|
||||||
|
return final_tab[#final_tab]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function round(num, numDecimalPlaces) --http://lua-users.org/wiki/SimpleRound
|
||||||
|
local mult = 10^(numDecimalPlaces or 0)
|
||||||
|
return math.floor(num * mult + 0.5) / mult
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function format_int(number) --https://stackoverflow.com/questions/10989788/format-integer-in-lua
|
||||||
|
|
||||||
|
local i, j, minus, int, fraction = tostring(number):find('([-]?)(%d+)([.]?%d*)')
|
||||||
|
|
||||||
|
-- reverse the int-string and append a comma to all blocks of 3 digits
|
||||||
|
int = int:reverse():gsub("(%d%d%d)", "%1,")
|
||||||
|
|
||||||
|
-- reverse the int-string back remove an optional comma and put the
|
||||||
|
-- optional minus and fractional part back
|
||||||
|
return minus .. int:reverse():gsub("^,", "") .. fraction
|
||||||
|
end
|
||||||
|
|
||||||
|
function trim(s) --http://lua-users.org/wiki/CommonFunctions
|
||||||
|
-- from PiL2 20.4
|
||||||
|
return (s:gsub("^%s*(.-)%s*$", "%1"))
|
||||||
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user