mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-11-03 22:31:04 +00:00 
			
		
		
		
	
		
			
	
	
		
			128 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 
								 | 
							
								--
							 | 
						||
| 
								 | 
							
								-- This telemetry script displays the Flight Log Gain
							 | 
						||
| 
								 | 
							
								-- Parameters streamed from the Blade 150S Spektrum AR6335A
							 | 
						||
| 
								 | 
							
								-- Flybarless Controller.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- The script facilitates the setting of the FBL's
							 | 
						||
| 
								 | 
							
								-- Gain Parameters including PID  for both
							 | 
						||
| 
								 | 
							
								-- cyclic and tail.  It is similar to the Telemetry Based
							 | 
						||
| 
								 | 
							
								-- Text Generator available on Spektrum transmitters.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- Supporting similar Blade micros such as the Fusion 180
							 | 
						||
| 
								 | 
							
								-- would possibly require minor modifications to this script. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- This script reads telemetry data from the Spektrum
							 | 
						||
| 
								 | 
							
								-- receiver and thus functionality relies on data being
							 | 
						||
| 
								 | 
							
								-- captured by the OpenTX transmitter.  A DSM
							 | 
						||
| 
								 | 
							
								-- telemetry-ready module is required.  Please see the
							 | 
						||
| 
								 | 
							
								-- MULTI-Module project at https://www.multi-module.org/.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- The only supported display is the Taranis'.  It may work
							 | 
						||
| 
								 | 
							
								-- with higher res screens.
							 | 
						||
| 
								 | 
							
								--
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- Sensor names
							 | 
						||
| 
								 | 
							
								local PSensor = "FdeA"
							 | 
						||
| 
								 | 
							
								local ISensor = "FdeB"
							 | 
						||
| 
								 | 
							
								local DSensor = "FdeL"
							 | 
						||
| 
								 | 
							
								local RSensor = "FdeR"
							 | 
						||
| 
								 | 
							
								local ActiveParamSensor = "Hold"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local tags = {"P", "I", "D"}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local function getPage(iParam)
							 | 
						||
| 
								 | 
							
								  -- get page from 0-based index
							 | 
						||
| 
								 | 
							
								  -- {0,1,2,3}: cyclic (1), {4,5,6,7}: tail (2)
							 | 
						||
| 
								 | 
							
								  local res = (math.floor(iParam/4)==0) and 1 or 2
							 | 
						||
| 
								 | 
							
								  return res
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function round(v)
							 | 
						||
| 
								 | 
							
								  -- round float
							 | 
						||
| 
								 | 
							
								  local factor = 100
							 | 
						||
| 
								 | 
							
								  return math.floor(v * factor + 0.5) / factor
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local function readValue(sensor)
							 | 
						||
| 
								 | 
							
								  -- read from sensor, round and return
							 | 
						||
| 
								 | 
							
								  local v = getValue(sensor)
							 | 
						||
| 
								 | 
							
								  v = round(v)
							 | 
						||
| 
								 | 
							
								  return v
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								local function readActiveParamValue(sensor)
							 | 
						||
| 
								 | 
							
								  --  read and return a validated active parameter value
							 | 
						||
| 
								 | 
							
								  local v = getValue(sensor)
							 | 
						||
| 
								 | 
							
								  if (v<1 or v>8) then
							 | 
						||
| 
								 | 
							
								    return nil
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								  return v
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								local function readParameters()
							 | 
						||
| 
								 | 
							
								  -- read and return parameters
							 | 
						||
| 
								 | 
							
								  local p = readValue(PSensor)
							 | 
						||
| 
								 | 
							
								  local i = readValue(ISensor)
							 | 
						||
| 
								 | 
							
								  local d = readValue(DSensor)
							 | 
						||
| 
								 | 
							
								  local r = readValue(RSensor)
							 | 
						||
| 
								 | 
							
								  local a = readActiveParamValue(ActiveParamSensor)
							 | 
						||
| 
								 | 
							
								  return {p,i,d,r,a}
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local function drawParameters()
							 | 
						||
| 
								 | 
							
								  -- draw labels and params on screen
							 | 
						||
| 
								 | 
							
								  local params = readParameters()
							 | 
						||
| 
								 | 
							
								  local activeParam = params[5]
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  -- if active gain does not validate then assume
							 | 
						||
| 
								 | 
							
								  -- Gain Adjustment Mode is disabled
							 | 
						||
| 
								 | 
							
								  if not activeParam then
							 | 
						||
| 
								 | 
							
								    lcd.clear()
							 | 
						||
| 
								 | 
							
								    lcd.drawText(20,30,"Please enter Gain Adjustment Mode")
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  local activePage = getPage(activeParam-1)
							 | 
						||
| 
								 | 
							
								  for iParam=0,7 do
							 | 
						||
| 
								 | 
							
								    -- highlight selected parameter
							 | 
						||
| 
								 | 
							
								    local attr = (activeParam==iParam+1) and 2 or 0
							 | 
						||
| 
								 | 
							
								    -- circular index (per page)
							 | 
						||
| 
								 | 
							
								    local perPageIndx = iParam % 4 + 1
							 | 
						||
| 
								 | 
							
								    -- check if displaying cyclic params.
							 | 
						||
| 
								 | 
							
								    local isCyclicPage = (getPage(iParam)==1)
							 | 
						||
| 
								 | 
							
								    -- set y draw coord
							 | 
						||
| 
								 | 
							
								    local y = perPageIndx*10+2
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    -- labels
							 | 
						||
| 
								 | 
							
								    local x = isCyclicPage and 6 or 120
							 | 
						||
| 
								 | 
							
								    -- labels are P,I,D for both pages except for last param
							 | 
						||
| 
								 | 
							
								    local val = iParam==3 and "Response" or
							 | 
						||
| 
								 | 
							
								                  (iParam==7 and "Filtering" or tags[perPageIndx])
							 | 
						||
| 
								 | 
							
								    lcd.drawText (x, y, val, attr)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    -- gains
							 | 
						||
| 
								 | 
							
								    -- set all params for non-active page to '--' rather than 'last value'
							 | 
						||
| 
								 | 
							
								    val = (getPage(iParam)==activePage) and params[perPageIndx] or '--'
							 | 
						||
| 
								 | 
							
								    x = isCyclicPage and 70 or 180
							 | 
						||
| 
								 | 
							
								    lcd.drawText (x, y, val, attr)
							 | 
						||
| 
								 | 
							
								  end
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local function run_func(event)
							 | 
						||
| 
								 | 
							
								  -- TODO: calling clear() on every function call redrawing all labels is not ideal
							 | 
						||
| 
								 | 
							
								  lcd.clear()
							 | 
						||
| 
								 | 
							
								  lcd.drawText (8, 2, "Cyclic (0...200)")
							 | 
						||
| 
								 | 
							
								  lcd.drawText (114, 2, "Tail (0...200)")
							 | 
						||
| 
								 | 
							
								  drawParameters()
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local function init_func() end
							 | 
						||
| 
								 | 
							
								local function bg_func() end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								return { run=run_func, background=bg_func, init=init_func  }
							 |