Skip to content

Commit b2f05bf

Browse files
committed
VTX Table download
Downloads vtx tables if supported and available. This is done as part of ui.lua's init state. The vtx tables are saved as /BF/VTX/modelname.lua where "modelname" is the name of the currently selected model. Delete this file if the vtx tables need to be updated for some reason. The script will download them again.
1 parent e8ee759 commit b2f05bf

File tree

3 files changed

+149
-5
lines changed

3 files changed

+149
-5
lines changed

src/SCRIPTS/BF/ui.lua

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,10 @@ end
247247

248248
local function run_ui(event)
249249
if uiState == uiStatus.init then
250-
local yMinLim = radio.yMinLimit
251250
lcd.clear()
252251
drawScreenTitle("Betaflight Config")
253-
lcd.drawText(6, yMinLim, "Initialising")
254-
if apiVersion == 0 then
255-
init = init or assert(loadScript("data_init.lua"))()
256-
init()
252+
init = init or assert(loadScript("ui_init.lua"))()
253+
if not init() then
257254
return 0
258255
end
259256
init = nil

src/SCRIPTS/BF/ui_init.lua

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
local apiVersionReceived = false
2+
local vtxTablesReceived = loadScript("/BF/VTX/"..model.getInfo().name..".lua")
3+
local data_init, getVtxTables
4+
5+
local function init()
6+
if apiVersion == 0 then
7+
lcd.drawText(6, radio.yMinLimit, "Initialising")
8+
data_init = data_init or assert(loadScript("data_init.lua"))()
9+
data_init()
10+
elseif apiVersion > 0 and not apiVersionReceived then
11+
data_init = nil
12+
apiVersionReceived = true
13+
collectgarbage()
14+
elseif apiVersion >= 1.042 and not vtxTablesReceived then
15+
lcd.drawText(6, radio.yMinLimit, "Downloading VTX Tables")
16+
getVtxTables = getVtxTables or assert(loadScript("vtx_tables.lua"))()
17+
vtxTablesReceived = getVtxTables()
18+
if vtxTablesReceived then
19+
getVtxTables = nil
20+
collectgarbage()
21+
end
22+
else
23+
return true
24+
end
25+
return apiVersionReceived and vtxTablesReceived
26+
end
27+
28+
return init

src/SCRIPTS/BF/vtx_tables.lua

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
local MSP_VTX_CONFIG = 88
2+
local MSP_VTXTABLE_BAND = 137
3+
local MSP_VTXTABLE_POWERLEVEL = 138
4+
5+
local vtxTableAvailable = false
6+
local vtxConfigReceived = false
7+
local vtxFrequencyTableReceived = false
8+
local vtxPowerTableReceived = false
9+
local vtxTablesReceived = false
10+
local requestedBand = 1
11+
local requestedPowerLevel = 1
12+
local vtxTableConfig = {}
13+
local frequencyTable = {}
14+
local frequenciesPerBand = 0
15+
local bandTable = {}
16+
local powerTable = {}
17+
18+
local lastRunTS = 0
19+
local INTERVAL = 100
20+
21+
local function processMspReply(cmd, payload)
22+
if cmd == MSP_VTX_CONFIG then
23+
vtxConfigReceived = true
24+
vtxTableAvailable = payload[12] ~= 0
25+
vtxTableConfig.bands = payload[13]
26+
vtxTableConfig.channels = payload[14]
27+
vtxTableConfig.powerLevels = payload[15]
28+
end
29+
if cmd == MSP_VTXTABLE_BAND and payload[1] == requestedBand then
30+
local i = 1
31+
local receivedBand = payload[i]
32+
i = i + 1
33+
local bandNameLength = payload[i]
34+
i = i + bandNameLength + 1
35+
bandTable[receivedBand] = string.char(payload[i])
36+
i = i + 2
37+
local channels = payload[i]
38+
i = i + 1
39+
frequencyTable[receivedBand] = {}
40+
for channel = 1, channels do
41+
local frequency = 0
42+
for idx=1, 2 do
43+
local raw_val = payload[i]
44+
raw_val = bit32.lshift(raw_val, (idx-1)*8)
45+
frequency = bit32.bor(frequency, raw_val)
46+
i = i + 1
47+
end
48+
frequencyTable[receivedBand][channel] = frequency
49+
end
50+
requestedBand = requestedBand + 1
51+
vtxFrequencyTableReceived = requestedBand > vtxTableConfig.bands
52+
end
53+
if cmd == MSP_VTXTABLE_POWERLEVEL and payload[1] == requestedPowerLevel then
54+
local i = 1
55+
local powerLevel = payload[i]
56+
i = i + 3
57+
local powerLabelLength = payload[i]
58+
i = i + 1
59+
powerTable[powerLevel] = ''
60+
for c = 1, powerLabelLength do
61+
powerTable[powerLevel] = powerTable[powerLevel]..string.char(payload[i])
62+
i = i + 1
63+
end
64+
requestedPowerLevel = requestedPowerLevel + 1
65+
vtxPowerTableReceived = requestedPowerLevel > vtxTableConfig.powerLevels
66+
end
67+
end
68+
69+
local function getVtxTables()
70+
if lastRunTS + INTERVAL < getTime() then
71+
lastRunTS = getTime()
72+
if not vtxConfigReceived then
73+
protocol.mspRead(MSP_VTX_CONFIG)
74+
elseif vtxConfigReceived and not vtxTableAvailable then
75+
return true
76+
elseif not vtxFrequencyTableReceived then
77+
protocol.mspWrite(MSP_VTXTABLE_BAND, { requestedBand })
78+
elseif not vtxPowerTableReceived then
79+
protocol.mspWrite(MSP_VTXTABLE_POWERLEVEL, { requestedPowerLevel })
80+
else
81+
vtxTablesReceived = true
82+
end
83+
end
84+
if vtxTablesReceived then
85+
local f = io.open("/BF/VTX/"..model.getInfo().name..".lua", 'w')
86+
io.write(f, "return {", "\n")
87+
io.write(f, " frequencyTable = {", "\n")
88+
for i = 1, #frequencyTable do
89+
local frequencyString = " { "
90+
for k = 1, #frequencyTable[i] do
91+
frequencyString = frequencyString..tostring(frequencyTable[i][k])..", "
92+
end
93+
frequencyString = frequencyString.."},"
94+
io.write(f, frequencyString, "\n")
95+
end
96+
io.write(f, " },", "\n")
97+
io.write(f, " frequenciesPerBand = "..tostring(vtxTableConfig.channels)..",", "\n")
98+
local bandString = " bandTable = { [0]=\"U\", "
99+
for i = 1, #bandTable do
100+
bandString = bandString.."\""..bandTable[i].."\", "
101+
end
102+
bandString = bandString.."},"
103+
io.write(f, bandString, "\n")
104+
local powerString = " powerTable = { "
105+
for i = 1, #powerTable do
106+
powerString = powerString.."\""..powerTable[i].."\", "
107+
end
108+
powerString = powerString.."},"
109+
io.write(f, powerString, "\n")
110+
io.write(f, "}", "\n")
111+
io.close(f)
112+
assert(loadScript("/BF/VTX/"..model.getInfo().name..".lua", 'c'))
113+
end
114+
mspProcessTxQ()
115+
processMspReply(mspPollReply())
116+
return vtxTablesReceived
117+
end
118+
119+
return getVtxTables

0 commit comments

Comments
 (0)