@@ -4,10 +4,13 @@ return {
4
4
write = 89 , -- MSP_VTX_SET_CONFIG
5
5
eepromWrite = true ,
6
6
reboot = false ,
7
- saveMaxRetries = 2 ,
8
- saveTimeout = 300 , -- 3s
9
7
title = " VTX" ,
10
8
minBytes = 5 ,
9
+ prevBandVal = 0 ,
10
+ prevChanVal = 0 ,
11
+ prevFreqVal = 0 ,
12
+ lastFreqUpdTS = 0 ,
13
+ freqModCounter = 0 ,
11
14
text = {
12
15
{ t = " Band" , x = 36 , y = 110 },
13
16
{ t = " Channel" , x = 36 , y = 155 },
@@ -18,12 +21,12 @@ return {
18
21
},
19
22
fields = {
20
23
-- Band
21
- { x = 130 , y = 110 , min = 1 , max = 5 , vals = { 2 }, to = MIDSIZE ,
22
- table = { " A" , " B" , " E" , " F" , " R" },
23
- upd = function (self ) self .updateVTXFreq (self ) end },
24
+ { x = 130 , y = 110 , min = 0 , max = 5 , vals = { 2 }, to = MIDSIZE ,
25
+ table = { [ 0 ] = " U " , " A" , " B" , " E" , " F" , " R" },
26
+ upd = function (self ) self .handleBandChanUpdate (self ) end },
24
27
-- Channel
25
28
{ x = 130 , y = 155 , min = 1 , max = 8 , vals = { 3 }, to = MIDSIZE ,
26
- upd = function (self ) self .updateVTXFreq (self ) end },
29
+ upd = function (self ) self .handleBandChanUpdate (self ) end },
27
30
-- Power
28
31
{ x = 350 , y = 110 , min = 1 , vals = { 4 }, to = MIDSIZE ,
29
32
upd = function (self ) self .updatePowerTable (self ) end },
@@ -33,9 +36,10 @@ return {
33
36
-- Proto
34
37
{ x = 130 , y = 68 , vals = { 1 }, to = MIDSIZE ,
35
38
write = false , ro = true ,
36
- table = {[3 ]= " SmartAudio" ,[4 ]= " Tramp" ,[255 ]= " None" } },
39
+ table = { [ 1 ] = " RTC6705 " , [3 ]= " SmartAudio" ,[4 ]= " Tramp" ,[255 ]= " None" } },
37
40
-- Freq
38
- { x = 350 , y = 68 , min = 5000 , max = 6000 , ro = true , to = MIDSIZE },
41
+ { x = 350 , y = 68 , min = 5000 , max = 5999 , vals = { 6 }, to = MIDSIZE ,
42
+ upd = function (self ) self .handleFreqValUpdate (self ) end },
39
43
},
40
44
freqLookup = {
41
45
{ 5865 , 5845 , 5825 , 5805 , 5785 , 5765 , 5745 , 5725 }, -- Boscam A
@@ -45,35 +49,215 @@ return {
45
49
{ 5658 , 5695 , 5732 , 5769 , 5806 , 5843 , 5880 , 5917 }, -- RaceBand
46
50
},
47
51
postLoad = function (self )
48
- if self .values [2 ] == 0 or self .values [3 ] == 0 or self .values [4 ] == 0 then
52
+ if ( self .values [2 ] or 0 ) < 0 or ( self .values [3 ] or 0 ) == 0 or ( self .values [4 ] or 0 ) == 0 then
49
53
self .values = {}
54
+ else
55
+ self .prevBandVal = 0 -- reset value trackers
56
+ self .prevChanVal = 0
57
+ self .prevFreqVal = 0
58
+ local rFreq
59
+ if (self .values [7 ] or 0 ) > 0 then
60
+ rFreq = math.floor (self .values [6 ] + (self .values [7 ] * 256 ))
61
+ else
62
+ rFreq = 0
63
+ end
64
+ if (self .values [2 ] or 0 ) > 0 then -- band != 0
65
+ if rFreq > 0 then
66
+ self .prevFreqVal = rFreq
67
+ self .prevBandVal = self .values [2 ]
68
+ self .prevChanVal = self .values [3 ]
69
+ self .fields [1 ].min = 0 -- make sure 'U' band allowed
70
+ self .eepromWrite = true
71
+ self .fields [6 ].value = rFreq
72
+ self .values [6 ] = rFreq
73
+ else -- if user freq not supported then
74
+ self .fields [1 ].min = 1 -- don't allow 'U' band
75
+ self .eepromWrite = false -- don't write EEPROM on older Betaflight versions
76
+ end
77
+ else -- band == 0
78
+ if rFreq > 0 then
79
+ self .prevFreqVal = rFreq
80
+ self .fields [1 ].min = 0 -- make sure 'U' band allowed
81
+ self .eepromWrite = true
82
+ self .fields [6 ].value = rFreq
83
+ self .values [6 ] = rFreq
84
+ -- set chan via freq / 100
85
+ self .prevChanVal = clipValue (math.floor ((rFreq - 5100 ) / 100 ),
86
+ self .fields [2 ].min , self .fields [2 ].max )
87
+ self .fields [2 ].value = self .prevChanVal
88
+ self .values [3 ] = self .prevChanVal
89
+ else
90
+ self .values = {}
91
+ end
92
+ end
50
93
end
51
94
end ,
52
95
preSave = function (self )
53
96
local valsTemp = {}
54
- local channel = (self .values [2 ]- 1 )* 8 + self .values [3 ]- 1
55
- valsTemp [1 ] = bit32.band (channel ,0xFF )
56
- valsTemp [2 ] = bit32.rshift (channel ,8 )
57
- valsTemp [3 ] = self .values [4 ]
58
- valsTemp [4 ] = self .values [5 ]
97
+ if self .values then
98
+ local channel
99
+ if self .values [2 ] > 0 then -- band != 0
100
+ channel = (self .values [2 ]- 1 )* 8 + self .values [3 ]- 1
101
+ elseif self .fields [6 ].value then -- band == 0
102
+ channel = self .fields [6 ].value
103
+ else
104
+ channel = 24
105
+ end
106
+ valsTemp [1 ] = bit32.band (channel ,0xFF )
107
+ valsTemp [2 ] = bit32.rshift (channel ,8 )
108
+ valsTemp [3 ] = self .values [4 ]
109
+ valsTemp [4 ] = self .values [5 ]
110
+ end
59
111
return valsTemp
60
112
end ,
113
+ -- find closest value in freq table that is above/below given freq
114
+ findNextInFreqTable = function (self , newFreq )
115
+ local startBand
116
+ local endBand
117
+ local incFlag -- freq increasing or decreasing
118
+ if newFreq > self .prevFreqVal then
119
+ incFlag = 1
120
+ startBand = 1
121
+ endBand = self .fields [1 ].max
122
+ else
123
+ incFlag = - 1
124
+ startBand = self .fields [1 ].max
125
+ endBand = 1
126
+ end
127
+ local curBand = self .values [2 ]
128
+ local curChan = self .values [3 ]
129
+ local selBand = 0
130
+ local selChan = 0
131
+ local selFreq = 0
132
+ local diffVal = 9999
133
+ local fVal
134
+ local minChan = self .fields [2 ].min
135
+ local maxChan = self .fields [2 ].max
136
+ -- need to scan bands in same "direction" as 'incFlag'
137
+ -- so same-freq selections will be handled properly (F8 & R7)
138
+ for band = startBand ,endBand ,incFlag do
139
+ for chan = minChan ,maxChan do
140
+ if band ~= curBand or chan ~= curChan then -- don't reselect same band/chan
141
+ fVal = self .freqLookup [band ][chan ]
142
+ if incFlag > 0 then
143
+ if fVal >= self .prevFreqVal and fVal - self .prevFreqVal < diffVal then
144
+ -- if same freq then only select if "next" band:
145
+ if fVal ~= self .prevFreqVal or band > curBand then
146
+ selBand = band
147
+ selChan = chan
148
+ selFreq = fVal
149
+ diffVal = fVal - self .prevFreqVal
150
+ end
151
+ end
152
+ else
153
+ if fVal <= self .prevFreqVal and self .prevFreqVal - fVal < diffVal then
154
+ -- if same freq then only select if "previous" band:
155
+ if fVal ~= self .prevFreqVal or band < curBand then
156
+ selBand = band
157
+ selChan = chan
158
+ selFreq = fVal
159
+ diffVal = self .prevFreqVal - fVal
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ return selFreq , selBand , selChan
167
+ end ,
168
+ -- returns the next user-frequency value in MHz; implements an
169
+ -- "exponential" modification rate so dialing in values is faster
170
+ getNextUserFreqValue = function (self , newFreq )
171
+ local now = getTime () -- track rate of change for possible mod speedup
172
+ if now < self .lastFreqUpdTS + 15 then
173
+ self .freqModCounter = self .freqModCounter + (15 - (self .lastFreqUpdTS - now )) -- increase counter for mod speedup
174
+ else
175
+ self .freqModCounter = 0 -- no mod speedup
176
+ end
177
+ local uFreq
178
+ if self .freqModCounter > 65 then -- rate is fast enough; do mod speedup
179
+ if newFreq > self .prevFreqVal then
180
+ uFreq = clipValue (newFreq + math.floor (self .freqModCounter / 65 ),
181
+ self .fields [6 ].min , self .fields [6 ].max )
182
+ else
183
+ uFreq = clipValue (newFreq - math.floor (self .freqModCounter / 65 ),
184
+ self .fields [6 ].min , self .fields [6 ].max )
185
+ end
186
+ else
187
+ uFreq = newFreq
188
+ end
189
+ self .lastFreqUpdTS = now
190
+ return uFreq
191
+ end ,
61
192
updatePowerTable = function (self )
62
193
if self .values and not self .fields [3 ].table then
63
- if self .values [1 ] == 3 then
194
+ if self .values [1 ] == 1 then -- RTC6705
195
+ self .fields [3 ].table = { 25 , 200 }
196
+ self .fields [3 ].max = 2
197
+ self .fields [4 ].t = nil -- don't display Pit field
198
+ self .fields [4 ].table = { [0 ]= " " , " " }
199
+ elseif self .values [1 ] == 3 then -- SmartAudio
64
200
self .fields [3 ].table = { 25 , 200 , 500 , 800 }
65
201
self .fields [3 ].max = 4
66
- elseif self .values [1 ] == 4 then
202
+ elseif self .values [1 ] == 4 then -- Tramp
67
203
self .fields [3 ].table = { 25 , 100 , 200 , 400 , 600 }
68
204
self .fields [3 ].max = 5
69
205
end
70
206
end
71
207
end ,
72
- updateVTXFreq = function (self )
208
+ handleBandChanUpdate = function (self )
73
209
if (# (self .values ) or 0 ) >= self .minBytes then
74
- if (self .fields [2 ].value or 0 ) > 0 and (self .fields [3 ].value or 0 ) > 0 then
75
- self .fields [6 ].value = self .freqLookup [self .values [2 ]][self .values [3 ]]
210
+ if (self .values [3 ] or 0 ) > 0 then
211
+ if self .values [2 ] ~= self .prevBandVal or self .values [3 ] ~= self .prevChanVal then
212
+ if self .values [2 ] > 0 then -- band != 0
213
+ self .prevFreqVal = self .freqLookup [self .values [2 ]][self .values [3 ]]
214
+ else -- band == 0; set freq via channel*100
215
+ self .prevFreqVal = math.floor (5100 + (self .values [3 ] * 100 ))
216
+ end
217
+ self .fields [6 ].value = self .prevFreqVal
218
+ self .values [6 ] = self .prevFreqVal
219
+ self .prevBandVal = self .values [2 ]
220
+ self .prevChanVal = self .values [3 ]
221
+ end
222
+ end
223
+ end
224
+ end ,
225
+ handleFreqValUpdate = function (self )
226
+ if (# (self .values ) or 0 ) >= self .minBytes and (self .fields [6 ].value or 0 ) > 0 then
227
+ local newFreq = self .fields [6 ].value
228
+ if newFreq ~= self .prevFreqVal then
229
+ if self .values [2 ] == 0 then
230
+ -- band == 0
231
+ local uFreq = self .getNextUserFreqValue (self , newFreq )
232
+ self .prevFreqVal = uFreq
233
+ if uFreq ~= newFreq then
234
+ self .fields [6 ].value = uFreq
235
+ self .values [6 ] = uFreq
236
+ end
237
+ -- set channel value via freq/100
238
+ self .prevChanVal = clipValue (math.floor ((self .prevFreqVal - 5100 ) / 100 ),
239
+ self .fields [2 ].min , self .fields [2 ].max )
240
+ self .fields [2 ].value = self .prevChanVal
241
+ self .values [3 ] = self .prevChanVal
242
+ else
243
+ -- band != 0; find closest freq in table that is above/below dialed freq
244
+ local selFreq , selBand , selChan = self .findNextInFreqTable (self , newFreq )
245
+ if selFreq > 0 then
246
+ self .prevFreqVal = selFreq
247
+ self .prevBandVal = selBand
248
+ self .prevChanVal = selChan
249
+ self .fields [6 ].value = selFreq -- using new freq from table
250
+ self .values [6 ] = selFreq
251
+ self .fields [1 ].value = self .prevBandVal -- set band value for freq
252
+ self .values [2 ] = self .prevBandVal
253
+ self .fields [2 ].value = self .prevChanVal -- set channel value for freq
254
+ self .values [3 ] = self .prevChanVal
255
+ else
256
+ self .fields [6 ].value = self .prevFreqVal -- if no match then revert freq
257
+ self .values [6 ] = self .prevFreqVal
258
+ end
259
+ end
76
260
end
77
261
end
78
262
end
79
- }
263
+ }
0 commit comments