Sei sulla pagina 1di 97

LuaScriptinginOpenTX

ReferenceGuide

Contents
Contents
Introduction
ModelScripts
Generaldescription
Limitationsofmodelscripts
Anatomyofmodelscript
Locationofmodelscripts
Lifetimeofmodelscript
Scriptinterfacedefinition
Scriptinitialization
Scriptexecution
OneTimeScripts
Generaldescription
Anatomyofonetimescript
Locationofonetimescripts
Lifetimeofaonetimescript
Scriptinterfacedefinition
Scriptinitialization
Scriptexecution
FunctionScripts
TelemetryScripts
Generaldescription
Anatomyoftelemetryscript
Locationoftelemetryscripts
Lifetimeoftelemetryscript
Scriptinterfacedefinition
Scriptinitialization
Scriptexecution
LuaScriptReference
GeneralSyntax
Localvs.Global
LocalVariables
LocalFunctions
InputsSyntax
NumberFormat
TypesofInputs
OutputsSyntax
NumberFormat
LuaGeneralFunctions
getTime()
getVersion()
getValue(source)
playFile(path)
popupInput(title,event,input,min,max)
getGeneralSettings()
LuaScriptinginOpenTX

playNumber(number,unit,att)
defaultStick(channel)
defaultChannel(stick)
killEvents(keyevent)
getFieldInfo(fieldname)
playDuration(duration,playtime)
playTone(frequency,length,pause,attr,frequnecyInc)
LuaModelFunctions
model.getTimer(timer)
model.setTimer(timer,data)
model.getInputsCount(input)
model.getInput(input,line)
model.insertInput(input,line,value)
model.deleteInput(input,line)
model.deleteInputs()
model.defaultInputs()
model.getMixesCount(channel)
model.getMix(channel,line)
model.insertMix(channel,mix,value)
model.deleteMix(channel,mix)
model.deleteMixes()
model.getLogicalSwitch(switch)
model.setLogicalSwitch(switch,value)
model.getCustomFunction(function)
model.setCustomFunction()
model.getOutput(index)
model.setOutput(index,value)
model.getInfo()
model.setInfo
model.getGlobalVariable(gvar,flightmode)
model.setGlobalVariable(gvar,flightmode,value)
model.getTelemetryChannel(idx)
model.setTelemetryChannel(idx,value)
LuaDisplayFunctions
lcd.lock()
lcd.clear()
lcd.drawPoint(x,y)
lcd.drawLine(x1,y1,x2,y2)
lcd.drawRectangle(x,y,width,height)
lcd.drawText(x,y,text,att)
lcd.drawSwitch(x,y,switch,att)
lcd.drawPixmap(x,y,path)
lcd.drawScreenTitle(title,idx,cnt)
lcd.drawGauge(x1,y1,w,h,fill,maxfill)
lcd.drawChannel(x,y,source,att)
lcd.drawNumber(x,y,number,att)
lcd.drawTimer(x,y,value,att)
lcd.getLastPos()
lcd.drawFilledRectangle(x,y,w,h,att)
lcd.drawSource(x,y,source,att)
lcd.drawCombobox(x,y,w,list,idx,flag)
LuaScriptinginOpenTX

ScriptExamples
OneTimeScriptExample:HelloWorld
OneTimeScriptExample:GenericTemplate
ModelScriptExample:DeltaMixer
TelemetryScriptExample:Screen#1
TelemetryScriptExample:Screen#2
ModelScriptExample:AutomaticBatteryCellDetection
Appendix
LUASourceList
CharacterMaps
SMLSIZE
default
MIDSIZE
DBLSIZE
XXLSIZE
Linkstoexternaldocumentation:
DocumentStyle
Acknowledgments

LuaScriptinginOpenTX

Introduction

OpenTX2.0addedsupportforLua(currentversion5.2.2)userscripts.
Luaisalightweightmultiparadigmprogramminglanguagedesignedasascriptinglanguage.Moreat
Wikipedia
ThereareseveraltypesofLuascriptsusedinopenTX.MoregeneralinformationaboutLuascriptscan
befoundonpagehttp://www.opentx.org/luainstructions.html
LuascriptsmustbeplacedonSDcardincorrectfoldersandhaveanextension.lua.MaximumLuascript
filenamelengthisTODOcharacters.ThescriptfoldershavebeenreorganizedinOpenTX2.0.3.The
folderstructurelookslikethis:

/SCRIPTS/WIZARD/FortheWizardscript
/SCRIPTS/MIXES/Formodelscripts
/SCRIPTS/FUNCTIONS/Forfunctionscripts
/SCRIPTS/modelname/telemXX.luaFortelemetryscripts
/SCRIPTS/TEMPLATES/Fortemplatescripts

LusStandardLibraries

Included

package

no

coroutine

no

table

no

io

no

os

no

string

no

bit

Future2.1.0?

math

Availablefrom2.0.0

debug

no

LuaScriptinginOpenTX

Model Scripts

WARNING
DonotuseLuamodelscriptsforcontrollinganyaspectofyourmodelthatcouldcauseacrashifscript
stopsexecuting.

General description
Eachmodelcanhaveseveralmodelscriptsassociatedwithit.Thesescriptsarerunperiodicallyfor
entiretimethatmodelisselected/active.ThesescriptsbehavesimilartostandardOpenTXmixersbutat
thesametimeprovidemuchmoreflexibleandpowerfultool.
Typicallymodelscriptstakeseveralvaluesasinputs,dosomecalculationorlogicprocessingbasedon
themandoutputoneormorevalues.Eachrunofscriptsshouldbeasshortaspossible.Exceeding
certainscriptexecutionruntimewillresultinscriptbeingforcefullystoppedanddisabled.
Seealso:

LuaOnetimeScriptsdescribesonetimerunninggeneralscripts
LuaFunctionScripts
LuaTelemetryScripts
LuaScriptReferencedetailedreferenceofOpenTXLuaimplementationandinterface
LuaScriptExamplessomeexamplescriptswithcomments

Examplesoftypicaluseofmodelscripts

replacementforcomplexmixesthatarenotcriticaltomodelfunction
complexprocessingofinputsandreactiontotheircurrentstateand/ortheirhistory
filteringoftelemetryvalues
automaticdetectionofnumberofbatterycellsandsettingoflowbatterythreshold
automaticannouncingofmaximumaltitudeforeachDLGthrow
seealsoLuaScriptExamples

Limitations of model scripts

ShouldnotdisplayanythingonLCDscreen.
Can'twaitforuserinputviadialog.
Shouldnotexceedmaximumallowedruntime/numberofinstructions.
StandardOpenTXmixesareruneveryXXmillisecondsinaverydeterministicway(guaranteed
execution)whilemodelscriptsarerunfromanotherthreadwithlesspriority.Theirexecution
periodisaround30msandisnotguaranteed!
Ascriptcouldbedisabled/killedanytimeduetoseveralcauseslike(errorinscript,notenough
freememory,etc...)

LuaScriptinginOpenTX

Anatomy of model script


Location of model scripts
PlacethemonSDcardinfolder/SCRIPTS/MIXES/

Lifetime of model script

scriptisloadedfromSDcardwhenmodelisselected
scriptinitfunctioniscalled
scriptrunfunctionisperiodicallycalled(insideGUIthread,periodcca30ms)
scriptisstoppedanddisabledifitmisbehaves(toolongruntime,errorincode,lowmemory)
allmodelscriptsarestoppedwhileonetimescriptisrunning(seeLuaOnetimescripts)

Script interface definition


Everyscriptmustincludeareturnstatementattheend,thatdefinesitsinterfacetotherestofOpenTX
code.Thisstatementdefines:

scriptinputs(optional)
scriptoutputs(optional)
scriptinitfunction(optional)
scriptrunfunction

Forexample:

-- script body would be here


return { input=inputs, output=outputs, run=run_func, init=init_func }

Thisexampledefines:
inputstable(array)asinputvaluestomodelscript
outputstableasoutputofmodelscript
run_func()functionasperiodicexecutionfunctionthattakesinputsasparametersandreturns
outputstable
init_func()functionasfunctionthatiscalledonetimewhenscriptisloadedandbegins
execution.
Parametersinit,inputandoutputareoptional.Ifmodelscriptdoesn'tusethem,theycanbeomitted
fromreturnstatement.Examplewithoutinitandoutput:

local inputs = { { "Aileron", SOURCE }, { "Ail. ratio", VALUE, -100, 100, 0 } }


local function run_func(ail, ratio)
-- do some stuff
if (ail > 50) and ( ratio < 40) then
playFile("foo.wav")
end
end

LuaScriptinginOpenTX

-- script that only uses input and run


return { run=run_func, input=inputs }

Script initialization
Ifdefined,initfunctioniscalledrightafterthescriptisloadedfromSDcardandbeginsexecution.Initis
calledonlyoncebeforetherunfunctioniscalledforthefirsttime.
local<init_function_name>()
calledoncebeforefirstcalltorunfunction

Parameters: none
Returns:

none

Script execution
Therunfunctionisthefunctionthatisperiodicallycalledfortheentirelifetimeofscript.Syntaxofrun
functionisdifferentbetweenmodelscriptsandonetimescripts.
local<run_function_name>([firstinput,[secondinput],])

Parameters: <>

zeroormoreinputvalues,theirnamesarearbitrary,their
meaningandorderisdefinedbytheinputtable

Returns:

none

ifoutputtableisempty(i.e.scripthasnooutput)

values (commaseparatedlistofvalues)listofoutputvalues,

theirorderandmeaningisdefinedbytheoutputtable

LuaScriptinginOpenTX

One-Time Scripts
General description
Thesescriptsstartwhencalleduponbyaspecificradiofunctionorwhentheuserselectsthemfroma
contextualmenu.Theydotheirtaskandarethenterminatedandunloaded.Pleasenotethatall
persistentscriptsarehaltedduringtheexecutionofonetimescripts.Theyareautomaticallyrestarted
oncetheonetimescriptisfinished.Thisisdonetoprovideenoughsystemresourcestoexecutetheone
timescript.
Seealso:
LuaModelScriptsdescribescontinuouslyrunningmodelscripts
LuaScriptReferencedetailedreferenceofOpenTXLuaimplementationandinterface
LuaScriptExamplessomeexamplescriptswithcomments
Examplesoftypicaluseofonetimescripts
Allkindofwizardstosetup/editmodelsettings.Theofficialmodelwizardisoneexampleofsuch
script
Replacementfortemplates
Games
Limitationsofonetimescripts
WhenrunningallotherLuascriptsarehalted.
Shouldnotexceedmaximumallowedruntime/numberofinstructions.

Anatomy of one-time script


Location of one-time scripts
PlacethemanywhereonSDcard,thefolder/SCRIPTS/isrecommended.Theonlyexceptionisofficial
modelwizardscript,thatshouldbeputinto/SCRIPTS/WIZARD/folderthatwayitwillstartautomatically
whennewmodeliscreated.

Lifetime of a one-time script


scriptisexecutedwhenuserselectsExecuteonascriptfilefromSDcardbrowserscreen.
scriptexecutesuntil:
itreturnsvaluedifferentfrom0
isforcefullyclosedbyuserbylongpressofEXITkey
isforcefullyclosedbysystemififitmisbehaves(toolongruntime,errorincode,low
memory)

LuaScriptinginOpenTX

Script interface definition


Everyscriptmustincludeareturnstatementattheend,thatdefinesitsinterfacetotherestofOpenTX
code.Thisstatementdefines:
scriptinitfunction(optional)
scriptrunfunction
Forexample:
scriptbodywouldbehere
return{run=run_func,init=init_func}

Thisexampledefines:
run_func()functionasperiodicexecutionfunctionthattakesakeypresseventasparameterand
returnssomevalue
init_func()functionasfunctionthatiscalledonetimewhenscriptisloadedandbeginsexecution.
Parameterinitisoptional.

Script initialization
seescriptinitialization

Script execution
Therunfunctionisthefunctionthatisperiodicallycalledfortheentirelifetimeofscript.Syntaxofrun
functionisdifferentbetweenmodelscriptsandonetimescripts.

local<run_function_name>(event)

Parameters: event

numberthatcontainscurrentlyactivekeypress
code.
Ifnokeyispressedthevalueis0.
eventcontainstwodistinctfields:

*whathappened(keyup,keydown,longkey
press,etc)
*whichkeyis/waspressed

Theactualvaluesofeventareusuallynotimportant
insideLuascript,theeventismainlyusedasone
ofparametersforthepopupInput()function.

Returns:

scriptwillcontinueexecution(runfunctionwillbe
calledagain

!=0

scriptisterminated(endsexecution)

LuaScriptinginOpenTX

ExampleScript

Function Scripts
TODO(blankinWiki)

LuaScriptinginOpenTX

Telemetry Scripts
General description
Thesescriptsareusedforbuildingcustomizedtelemetryscreens.Theoreticallyitispossibletohaveup
to7customtelemetryscreens,allwritteninLua.Itispossibletousedifferentscriptsonapermodel
basis.

Anatomy of telemetry script


Location of telemetry scripts
PlacethemonSDcardinthefolder/SCRIPTS/modelname/telemX.luawhereXisanumberfrom0to
6.
Example:/SCRIPTS/Extra/telem0.luawouldbefirstcustomtelemetryscreenformodelExtra.

Lifetime of telemetry script

scriptisloadedfromSDcardandexecutedwhenthemodelisloaded.
scriptinitfunctioniscalled
scriptbackgroundfunctionisperiodicallycalledwhencustomtelemetryscreenisnotvisible
scriptrunfunctionisperiodicallycalledwhencustomtelemetryscreenisvisible
scriptisstoppedanddisabledifitmisbehaves(toolongruntime,errorincode,lowmemory)
alltelemetryscriptsarestoppedwhileonetimescriptisrunning(seeLuaOnetimescripts)

Script interface definition


Everyscriptmustincludeareturnstatementattheend,thatdefinesitsinterfacetotherestofOpenTX
code.Thisstatementdefines:
scriptinitfunction(optional)
scriptbackgroundfunction
scriptrunfunction
Forexample:

scriptbodywouldbehere

return{run=run_func,init=init_func,background=bckgrnd_func}

Thisexampledefines:
bckgrnd_func()functionasperiodicexecutionfunctionthatisperiodicallycalledwhencustom
telemetryscreenisnotvisible
run_func()functionasperiodicexecutionfunctionthatisperiodicallycalledwhencustom
telemetryscreenisvisible

LuaScriptinginOpenTX

init_func()functionasfunctionthatiscalledonetimewhenscriptisloadedandbegins
execution.
Parameterinitisoptional.

Script initialization
seescriptinitialization

Script execution
Therunorbackgroundfunctionisthefunctionthatisperiodicallycalledfortheentirelifetimeofscript.
Whichoneiscalleddependsonthevisibilityofcustomtelemetryscreen:
notvisiblethebackgroundfunctioniscalled.Scriptshouldnotdrawtoscreen.Usuallyusedto
store/processtelemetrydata.
visiblerunfunctioniscalled.Scriptshoulddrawitsscreen.
local<background_function_name>()

Parameters: none

Returns:

none

local<run_function_name>(event)

Parameters: event

numberthatcontainscurrentlyactivekeypresscode.Ifno
keyispressed,thevalueis0
Eventcontainstwodistinctfields:
*whathappened(keyup,keydown,longkeypress,etc).
*whichkeyis/waspressed.

Returns:

none

Examples
TelemetryScreen#1
TelemetryScreen#2

LuaScriptinginOpenTX

Lua Script Reference


General Syntax
Local vs. Global
AllLuamodelscriptsinOpenTXexistinsameLuaenvironment.Thismeans,thattheyshareglobal
functionsandvariables.Usingglobalvariablewiththesamenamefromtwodifferentscriptscouldleadto
unpredictableresults.Thereforetheuseofglobalvariablesandfunctionsshouldbeavoided!

TODO:howtosharedatabetweenscripts

Warning
Evenvariablesdefinedinsidelocalfunctionswithoutlocalkeywordareglobal.Forexampleifwehave
twoscripts,script1:

local function run()


global_var = 7 -- this one is GLOBAL
local local_var = "foo" -- this one is local to script1,
-- but visible in all script1 functions
end

andscript2:

local function run()


if global_var == 7 then -- here global_var is already defined from script1
playFile("Whoopsie.wav")
end
if local_var == "foo" then -- local_var here is nil, because it was not yet assigned
print("We don't get here, local_var is nil")
end
end

Ifweexecutebothscripts,wewouldhear"Whoopsie.wav"(ifitispresentonSDcard).Thismeansthat
variableglobal_varisactuallyglobalevenifitisfirstdefinedinsomelocalfunctioninotherscript.

Local Variables
Scriptcanhaveanynumber(limitedbymemoryusage)oflocalvariables,theirvalueispreserved
betweeneachcalltorunfunction.Theyaredefinedas:

local simple_number = 4
local some_table = {1, 2, 120}

Localvariablesareonlyvisibletothescriptthatdefinedthem.Twoscriptscandefinealocalvariablewith
thesamename.Thesetwovariablesdon'tshareanything,eachscripthashisowninstanceofvariable.

Local Functions
Scriptcanhaveanynumber(limitedbymemoryusage)oflocalfunctions:

local function some_function(a, b, c)


local value1 = a + b * c

LuaScriptinginOpenTX

end

return value1

Localfunctionsareonlyvisibletothescriptthatdefinedthem.Twoscriptscandefinealocalfunctionwith
thesamename.Thesetwofunctionsdon'tshareanything,eachscripthashisowninstanceoffunction.

Inputs Syntax
Inputareonlyusedinmodelscripts.Howeverthesamenumberformatisreturnedbyfunction
getValue().

Number Format
InputsareanaloguevaluesfromopentTXthatareconvertedto16bitsignedintegersbeforetheyreach
Luascripts.

Analoguevaluessuchassticksandslidershavevalueinpercentmultipliedby10.24:

AileronStickValue

InputValuetoScript

0%

60.6%

620

100.0%

1024

100.0%

1024

Switches(realandlogical)arerepresentedas:

SwitchPosition

InputValuetoScript

down(100%)

1024

middle

up(100%)

1024

Telemetryvaluesarereturnedaspropervalues:

TelemetryValue

InputValuetoScript

altitude120.5m

120.5

A1voltage5.47V

5.47

Consumption1260mAh

1260

Types of Inputs

Source

LuaScriptinginOpenTX

SourcetypeprovidescurrentvalueofselectedOpenTXvariable(stickposition,slider,channel).
UserassignsassignsactualsourceforthisinputinCustomscriptmenu.Sourcecanbeanyvalue
OpenTXknowsabout(inputs,channels,telemetryvalues,switches,customfunctions,...).

Syntax:{name,SOURCE}
Example:{"Aileron",SOURCE}

DefinesSOURCEtypeinputwithnameAileron.NamelengthislimitedtoTODO.

Value

ValuetypeprovidesconstantvaluethatusersetsinCustomscriptmenu

Syntax:{name,VALUE,min,max,default}
Example:{"Ratio",VALUE,100,100,0}

DefinesVALUEinputwithnameRatiothathaslimits100and100anddefaultvalueof0.Name
lengthislimitedtoTODO.

Outputs Syntax

Outputsareonlyusedinmodelscripts.

Syntax:{name1,name2}
Example:{"Calc","Out"}

Outputnameislimitedtofourcharacters.

Number Format

Outputsare16bitsignedintegerswhentheyleaveLuascriptandarethendividedby10.24toproduce
outputvalueinpercent:

OutputfromScript

Outputasseenfrom
OpenTX

0%

996

97.2%

1024

100%

1024

100%

LuaScriptinginOpenTX

Lua General Functions


getTime()
Returnsthetimesincetheradiowasstartedinmultipleof10ms

Parameters: none

Returns:

number Numberof10mstickssincetheradiowasstarted

Status:

current Introducedin2.0.0

LuaScriptinginOpenTX

getVersion()
ReturnsOpenTXversion

Parameters: none

Returns:

value

(string)Version(i.e.2.0.0)

Status:

current Introducedin2.0.0

Example:DisplayVersionNumber

local function run_func(event)


lcd.lock()
lcd.clear()
lcd.drawScreenTitle("getVersion",1,1)
lcd.drawText(10,20,getVersion(),MIDSIZE)
if event == EVT_EXIT_BREAK then
return 1 -- Exit
else
return 0
end
end

-- Test for Exit Key

return { run=run_func }

LuaScriptinginOpenTX

getValue(source)
Returnsthevalueofasource

Parameters: source canbeaconstant(i.eSTICK_RUDDER)


orastringname(i.e.altitude)
Returns:

number valueofsourceornilifvalueisnotavailable.

Status:

current Introducedin2.0.0

supportedsourceconstants

name
MIXSRC_FIRST_INPUT
MIXSRC_Rud
MIXSRC_Ele
MIXSRC_Thr
MIXSRC_Ail
MIXSRC_SA
MIXSRC_SB
MIXSRC_SC
MIXSRC_SD
MIXSRC_SE
MIXSRC_SF
MIXSRC_CH1
Thismaybeabeterreferencepointuntil2.0.6
http://www.rcgroups.com/forums/showpost.php?p=28897780&postcount=298

Supportedsourcenamesare:

name

value

example

"altitude"

barometricaltitudeinmeters

120.56

"altitudemax"

maxbarometricaltitudeinmeters

120.56

"vario"

variospeedinm/s

120.56

"txvoltage"

TxvoltageinV

120.56

LuaScriptinginOpenTX

"rpm"

RPMs

120.56

"latitude"

GPSlatitudeindegrees,Northispositive

45.5667

"longitude"

GPSlongitudeindegrees,Eastispositive

120.5677

"pilotlatitude"

firstGPSvalue(usuallypilotposition)formatsame
as"latitude"

12.567

"pilotlongitude"

firstGPSvalue(usuallypilotposition)formatsame
as"longitude"

0.567

NamesarecasesensitiveeggetValue("altitude")

LuaScriptinginOpenTX

playFile(path)
PlaysafilefromtheSDcard

Parameters: path

fullpathtowavfile(i.e./SOUNDS/en/system/tada.wav)

Returns:

none

valueofsourceornilifvalueisnotavailable.

Status:

current introducedin2.0.0

Introducedin2.1.0
Ifyouusearelativepath,willappendcurrentlanguagetothepath.

LuaScriptinginOpenTX

popupInput(title, event, input, min, max)


Raisesapopuponscreenthatallowsusesinput

Parameters: title

(string)Texttodisplay

event

(number)theeventvariablethatispassedinfromthe
RunFunction(keypressed)

input

(number)valuethatcanbeadjustedbythe+/keys

min

(number)minvaluethatinputcanbedecrementedbythe
key

max

(number)maxvaluethatinputcanbedecrementedbythe
key

Returns:

result

(string)OKENTpressed
(string)CANCELEXITpressed
(number)theresultoftheinputadjustment

Status:

current

introducedin2.0.0

Example:Pressing+/willincrement/decrementnumber.

local result = 0
local swtch = 0
local function run_func(event)
lcd.lock()
lcd.clear()
lcd.drawScreenTitle("popupInput",1,1)
result = popupInput("Input", event, swtch, -10, 10)
lcd.drawNumber(62,24,swtch,0)
if result == "OK" then
return 0 -- ignore
elseif result == "CANCEL" then
return 1 -- exit program
else
swtch = result -- it is number
return 0
end
end
return { run=run_func }

LuaScriptinginOpenTX

getGeneralSettings()
ReturnsatablecontainingbattMinandbattMax

Parameters: none

Returns:

value

(generaltable)MinandMaxbatteryvalue

Status:

Current Introduced2.0.6

GeneralTableFormat

battMin

(number)MinimumBattery

battMax

(number)MaximumBattery

Example:DisplayMinandMaxBatteryvolatge

local settings=getGeneralSettings()
lcd.drawNumber(10,20,settings.battMin,LEFT+MIDSIZE)
lcd.drawNumber(100,20,settings.battMax,LEFT+MIDSIZE)

LuaScriptinginOpenTX

playNumber(number, unit, att)

Parameters: number (integer)

unit

(integer)

att

(integer)

Returns:

Status:

Current Introduced2.0.0

Unittable

Unit

Sound

Description

Volts

0115.wav

Amperes

0118.wav

MetersperSecond

0120.wav

Speed

KMHorKnotsdependingonradiosetting(imperial/metric)

Height

Numberismeters.ConvertedtofeetforImperial.

Temperature

Numberiscelcius.convertedtoFifradioisinImperial.

Percent

Millions

10

MH

11

Watts

12

DB

13

Feet

14

Speed

KMHorKnotsdependingonradiosetting(imperial/metric)

15

Hours

16

Minutes

17

Seconds

18

RPM

LuaScriptinginOpenTX

19

Gee

20

Degrees

21

22

23

PointZero

24

Pointtwo

25

Pointfour

26

Pointsix

27

Pointeight

Attr

ATTR

PREC1

Adddecimalplacetonumber.ieifnumberis58,willannounce5.8

LuaScriptinginOpenTX

defaultStick(channel)
Getstickthatisassignedtoachannel.SeeDefaultChannelOrderinGeneralSettings

Parameters: number (number)ChannelNumber


Returns:

value

(number)Stickassignedtothischannel

Status:

Current Introduced2.0.0

LuaScriptinginOpenTX

defaultChannel(stick)
Getchannelassignedtostick.SeeDefaultChannelOrderinGeneralSettings

Parameters: stick

(number)StickNumber

Returns:

nil

value

(number)ChannelNumber

Status:

Current Introduced2.0.0

LuaScriptinginOpenTX

killEvents(key-event)
Removeskeyeventfromevent

Parameters: keyevent

(number)Keyeventstoremove(mask)

Returns:

nil

Status:

Current

introducedin2.0.0

KeyEvents

comments

EVT_MENU_BREAK

EVT_PAGE_BREAK

EVT_PAGE_LONG

EVT_ENTER_BREAK

EVT_ENTER_LONG

EVT_EXIT_BREAK

EVT_PLUS_BREAK

EVT_MINUS_BREAK

EVT_PLUS_FIRST

EVT_MINUS_FIRST

EVT_PLUS_RPT

EVT_MINUS_RPT

LuaScriptinginOpenTX

getFieldInfo(fieldname)

Getsdetailedinformationaboutfield.

Parameters: fieldname

(string)shortfieldname.seeLUASourceList

Returns:

value

(fieldtable)detailsoffield

Status:

Current

2.0.8

FieldTableFormat

id

(number)Fieldindex

name

(string)ShortName

desc

(string)Longdescriptionforfield

LuaScriptinginOpenTX

playDuration(duration,playtime)

Parameters: duration

(integer)

playtime

(boolean)

Returns:

none

Status:

Planned

2.1.0

LuaScriptinginOpenTX

playTone(frequency, length, pause, attr, frequnecyInc)

Parameters: frequency

(integer)Frequencyoftone,inHertz

length

(integer)Lengthoftoneinms

pause

(integer)

attr

(integer)Seetablebelow

frequencyInc (integer)

Returns:

none

Status:

Planned

2.1.0

Attr

Description

PLAY_NOW

Playimmediately

PLAY_BACKGROUND

Placeinbackgroundqueue

LuaScriptinginOpenTX

Lua Model Functions


Pleasenotethatwriting(eventhesamevalue)tomodelsettingswillcausetheawritetoEEPROM.This
couldoccurwithin5secondsofthechangeorwhenmodelisunloadedorradioswitchedoff.

model.getTimer(timer)
Returnsmodeltimer

Parameters: timer

(number)timernumber

Returns:

nil

unknowntimernumber.

value

(timertable)timerdata

Status:

current introducedin2.0.0

TimerTableFormat

mode

(number)timertriggersource:off,abs,stk,stk%,
sw/!sw,!m_sw/!m_sw

start

(number)startvalue[seconds],0foruptimer,0>down
timer

value

(number)currentvalue[seconds]

countdownBeep

(number)countdownbeep
(0silent,1beeps,2voice)

minuteBeep

(boolean)minutebeep

persistent

(number)persistenttimer

Example:
--get timer data into tim1
tim1 = model.getTimer(1)
--access returned values as tim1.<value>
if tim1.value > 0 then
--do something
end

LuaScriptinginOpenTX

model.setTimer(timer, data)
Setsmodeltimer

Parameters: timer

(number)timernumber

data

(timertable)newtimerdata.See

Returns:

none

Status:

current introducedin2.0.0

seemodel.getTimer(timer)fortimertableformat

LuaScriptinginOpenTX

model.getInputsCount(input)
Returnsnumberoflinesforgiveninput

Parameters: input

(unsignednumber)inputnumber(0>maxinputs1)

Returns:

value

(unsignednumber)numberofconfiguredlinesforgiven
input.

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.getInput(input, line)
Returnsinputdataforgiveninputandlinenumber

Parameters: input

(unsignednumber)inputnumber(0>maxinputs1)

line

(unsignednumber)inputline(0>maxlines1)

Returns:

value

(inputtable)inputdata

Status:

current introducedin2.0.0

InputTableFormat

name

(string)inputlinename

source

(number)inputsourceindex

weight

(number)inputweight

offset

(number)inputoffset

LuaScriptinginOpenTX

model.insertInput(input, line, value)


InsertsanInputatspecifiedline

Parameters: input

(unsignednumber)inputnumber(0>maxinputs1)

line

(unsignednumber)inputline(0>maxlines1)

value

(inputtable)seemodel.getInput(input,line)

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.deleteInput(input, line)
Deletelinefromspecifiedinput

Parameters: input

(unsignednumber)inputnumber(0>maxinputs1)

line

(unsignednumber)inputline(0>maxlines1)

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.deleteInputs()
DeleteallInputs

Parameters: none

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.defaultInputs()
SetallinputstoDefaults.

Parameters: none

Returns:

none

Status:

current introducedin2.0.0

Example:

local function run_func(event)


model.defaultInputs()
return 1
end
return { run=run_func}

Radiobeforescriptisrun

Radioafterscriptisrun

LuaScriptinginOpenTX

model.getMixesCount(channel)
GetthenumberofMixerlinesthatthespecifiedChannelhas

Parameters: channel (number)Channelnumbertolookup.Zeronumbered(i.e.CH1


is0)
Returns:

value

(number)numberofline

Status:

current introducedin2.0.0

Example

mix = model.getMixesCount(0)
lcd.drawNumber(10,20,mix,LEFT+MIDSIZE)

RadioConfiguration

Result

LuaScriptinginOpenTX

model.getMix(channel, line)
GetconfigurationforspecifiedMix

Parameters: channel (number)Channelnumbertolookup.Zeronumbered(i.e.CH1


is0)

line

(number)linenumberofMix.Zeronumbered.

Returns:

value

(mixtable)linedetails

nil

invalidparameters

Status:

current introducedin2.0.0

MixTableFormat

name

(string)

source

(number)

weight

(number)WeightvalueorgVar1..9=4096..4114,gVar1..9
=4095..4087

offset

(number)OffsetvalueorgVar1..9=4096..4114,gVar1..9
=4095..4087

switch

(number)SwitchNumber

multiplex

(number)0=ADD,1=MULTIPLY,2=REPLACE

LuaScriptinginOpenTX

model.insertMix(channel, mix, value)


InsertamixerlineintoChannel

Parameters: channel (number)Channelnumbertolookup.Zeronumbered(i.e.CH1


is0)

line

(number)linenumbertoinsert.Existinglinewillbemoved
downoneline

value

(mixtable)seemodel.getMix(channel,line)

Returns:

nil

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.deleteMix(channel, mix)
DeletemixerlinefromspecifiedChannel

Parameters: channel (number)Channelnumbertolookup.Zeronumbered(i.e.CH1


is0)

line

(number)linenumbertodelete.Existinglineswillbe
moveduponeline

Returns:

nil

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.deleteMixes()
RemovesALLlinesfromALLchannels

Parameters: none

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.getLogicalSwitch(switch)
GetLogicalSwitchparameters

Parameters: switch (number)LogicalSwitchNumber


Returns:

value

(switchtable)

Status:

current introducedin2.0.0

SwitchTableFormat

func

(number)

v1

(number)

v2

(number)

v3

(number)

and

(number)

delay

(number)

duration

(number)

LuaScriptinginOpenTX

model.setLogicalSwitch(switch, value)
SetLogicalSwitchparameters

Parameters: switch (number)LogicalSwitchNumber

value

(switchtable)Seemodel.getLogicalSwitch(switch).

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

model.getCustomFunction(function)
GetSpecialFunctions

Parameters: function (number)SpecialFunctionNumber


Returns:

value

(functiontable)

Status:

current

introducedin2.0.0

FunctionTableFormat

switch

(number)SwitchNumber

func

(number)ActionNumber

name

(string)Nameoftracktoplay,onlyreturnedifActionis
playtrackorsound.

value

(number)

mode

(number)

param

(number)

active

(number)0=!Enabled,1=Enabled

LuaScriptinginOpenTX

FunctionTable.Caution,tablebehaviorchangesdependingonthefunction.Needtodetermineagood
waytoshowthisinformation.Thesoundorientatedfunctionsinparticularaffecttheusagesoffields.
Unusedvariableswillcontainvaluesfromapreviousfunctioni.e.ifyouchangeafunctionandvalueisno
longerused,itwillstillcontainthevaluefromtheoldfunction.

Action

Parameter

func

value

mode

param

SafetyCHx

125..125

ParameterValue

Channel021

Trainer

TrainerRUD

TrainerELE

TrainerTHR

TrainerAIL

InstantTrim

PlaySound

10

Reset

Timer1

Reset

Timer2

Reset

All

Reset

Telemetry

SetTimer1

0..n

ParameterValue

SetTimer2

0..n

Vario

18

PlayValue

12

StartLogs

0.0..25.5

20

Parametervalue*10

Volume

source

Seesourcetable

Backlight

21

Background
Music

Background
MusicPause

17

AdjustGV1..9

Value

ParameterValue

GV0..8

AdjustGV1..9

Source

Seesourcetable

GV0..8

AdjustGV1..9

GVAR

GV0.8

GV0..8

AdjustGV1..9

Increment

0=1,1=+1

GV0..8

LuaScriptinginOpenTX

LuaScriptinginOpenTX

model.setCustomFunction()

Parameters: function (number)SpecialFunctionNumber

value

(functiontable)Seemodel.getCustomFunction(function)

Returns:

none

Status:

current

introducedin2.0.0

LuaScriptinginOpenTX

model.getOutput(index)
Getservodetails

Parameters: index

(number)ChannelNumber(ZeroNumbered)

Returns:

value

(outputtable)

nil

Status:

current

2.0.0

OutputTableFormat

name

(string)ChannelName

min

(number)Minimum%*10

max

(number)Maximum%*10

offset

(number)Subtrim*10

ppmCenter

(number)OffsetfromPPMCenter.0=1500

symetrical

(number)LinearSubtrim0=Off,1=On

revert

(number)Direction0=,1=INV

curve

(number)Curvenumber0..31=curve(1)..(32),2..33=
!curve(1)..(32)
Nilifnocurveset

LuaScriptinginOpenTX

model.setOutput(index, value)
Setservoproperties

Parameters: index

(number)ChannelNumber(ZeroNumbered)

value

(outputtable)seemodel.getOutput(index)

Returns:

nil

Status:

current

introducedin2.0.0

LuaScriptinginOpenTX

model.getInfo()
GetcurrentModelinformation

Parameters: none

Returns:

value

(modeltable)CurrentModelinformation

Status:

current introducedin2.0.6

ModelTableFormat

name

(string)modelname

id

(number)receivernumber

Example:
GettheModelnameandNumberofcurrentModel
modelinfo = model.getInfo()
lcd.drawText(10,20,modelinfo.name,MIDSIZE)
lcd.drawNumber(10,30,modelinfo.id,MIDSIZE)

CurrentModelsinRadio

ScriptOutput

LuaScriptinginOpenTX

model.setInfo
SetthecurrentModelNameandNumber

Parameters: value

(modeltable)CurrentModelinformation

Returns:

none

Status:

current introducedin2.0.6

Example:

LuaScriptinginOpenTX

model.getGlobalVariable(gvar, flightmode)
GetvalueofGvarforspecifiedFlightMode

Parameters: gvar

(number)gVarnumber

flightmode

(number)flightmode

Returns:

value

(number)gVarvalue.Ifvalueis>1024thengVaris
gettingitsvaluefromanotherflightmode.Subtract
1025togettheactualflightmodenumber.

Status:

current

introducedin2.0.0

LuaScriptinginOpenTX

model.setGlobalVariable(gvar, flightmode, value)

Parameters: gvar

(number)gVarnumber

flightmode

(number)flightmode

value

(number)valueofGVAR

Returns:

none

Status:

current

introducedin2.0.0

LuaScriptinginOpenTX

model.getTelemetryChannel(idx)

Parameters: idx

(integer)Channelnumber.A1..A4(zeronumbered)

Returns:

value

(telemetrytable)

nil

Status:

current

introducedin2.0.8

TelemetryTableFormat

range

(number)Range

offset

(number)Offset

alarm1

(number)LowAlarm

alarm2

(number)CriticalAlarm

unit

(integer)seeUnittable

UnitTable

Unit

index

Volts(V)

Amps(A)

Speed(m/sorft/s)

Raw()

Speed(km/hormiles/h)

Meters(morft)

Temp()

Fule(%)

mAmps(mA)

LuaScriptinginOpenTX

model.setTelemetryChannel(idx, value)

Parameters: idx

(integer)Channelnumber

value

(telemetrytable)seemodel.getTelemetryChannel(idx)

Returns:

none

Status:

current

introducedin2.0.8

LuaScriptinginOpenTX

Lua Display Functions


lcd.lock()
PreventsmainOpenTXcodefrommodifyingLCDscreen.Thislockisreseteverytimescriptisrunand
mustbesetagainifscriptwantsLCDtobelockedoneachiteration.

Parameters: none

Returns:

none

Status:

current introducedin2.0.0

lcd.clear()
ClearstheLCDscreen

Parameters: none

Returns:

none

Status:

current introducedin2.0.0

lcd.drawPoint(x, y)
Drawsasinglepixelat(x,y)position

Parameters: x

(integer)xpositioninpixels

(integer)ypositioninpixels

Returns:

none

Status

current introducedin2.0.0

Note:TaranishasanLCDdisplaywidthof212pixelsandheightof64pixels.Position(0,0)isattopleft.
Yaxisisnegative,toplineis0,bottomlineis63.

LuaScriptinginOpenTX

lcd.drawLine(x1, y1, x2, y2)


Drawsalinefrom(x1,y1)to(x2,y2)

Parameters: <x1,y1> (integer)startposition.Seelcd.drawPoint()

<x2,y2> (integer)endposition.Seelcd.drawPoint()

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

lcd.drawRectangle(x, y, width, height)


Drawsarectanglefromtopleftcorner(x,y)ofspecifiedwidthandheight

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

width

(integer)widthinpixels

height (integer)heightinpixels

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

lcd.drawText(x, y, text, att)


Drawsatextbeginningat(x,y)

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

text

(string)texttodisplay.

att

textattributes

Returns:

none

Status:

current introducedin2.0.0

TextAttributes:
Allattvaluescanbecombinedtogetherusingthe+character.ieBLINK+DBLSIZE.SeetheAppendix
foravailablecharactersineachfontset.

value

font

companionversion

normalfont

DBLSIZE

doublesizefont

MIDSIZE

midsizedfont

SMLSIZE

smallfont

INVERS

inverteddisplay

BLINK

blinkingtext

XXLSIZE

jumbofont

2.0.6

LEFT

2.0.6

SpecialCharacters

Hex

Decimal

Function

Example

0x1D

29

Tab

localstring='hello\31\110world'
tabinsertedbtweenhelloandworld

0x1E

30

Newline

localstring='hello\30world'
worldwillprintonnextline

0x1F

31

xcoordprefix.

localstring='hello\31\110world'
worldwillprintfromx=110

<0x20

allothercodeswillinsertanextendedspace

LuaScriptinginOpenTX

lcd.drawSwitch(x, y, switch, att)


Drawsatextrepresentationofswitchat(x,y)

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

switch (integer)numberofswitchtodisplay,negativenumber
displaysnegatedswitch

att

(integer)textattributeSeelcd.drawText(x,y,text,att)

Returns:

none

Status:

current introducedin2.0.0

Note:Testingshowsthatasof2.0.8,onlytheSMLSIZEBLINK&INVERSattributeworkscorrectly.

LuaScriptinginOpenTX

lcd.drawPixmap(x, y, path)
Drawsabitmapat(x,y)

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

path

(string)fullpathtothebitmaponSDcard(i.e.
/BMP/test.bmp)

Returns:

none

Status:

current introducedin2.0.0

LuaScriptinginOpenTX

lcd.drawScreenTitle(title, idx, cnt)


Drawsatitlebar

Parameters: title

(string)textforthetitle

idx

(integer)pagenumber

cnt

(integer)totalnumberofpages.Onlyusedasindicatoron
therightsideoftitlebar.(i.e.idx=2,cnt=5,display
2/5)

Returns:

none

Status:

current introducedin2.0.0

Example:lcd.drawScreenTitle("DEMONSTRATION",1,3)

LuaScriptinginOpenTX

lcd.drawGauge(x1, y1, w, h, fill, maxfill)


Drawsasimplegaugethatisfilledbaseduponfillvalue.

Parameters: <x1,y1> (integer)startposition.Seelcd.drawPoint()

(integer)widthinpixels

(integer)heightinpixels

fill

(integer)amountoffilltoapply

maxfill (integer)totalvalueoffill

Returns:

none

Status:

current introduced2.0.6

Example:lcd.drawGauge(50,42,100,18,25,100)

LuaScriptinginOpenTX

lcd.drawChannel(x, y, source, att)


Drawthevalueofasource.Equivalenttolcd.drawText(x,y,model.getValue(source),att)

Parameters: <x,y>

(number)toplefttextposition.Seelcd.drawPoint()

source canbeaconstant(i.eSTICK_RUDDER)
orastringname(i.e.altitude).SeegetValue(source)

att

textattributes.Seelcd.drawText(x,y,text,att)

Returns:

none

Status:

current Introduced2.0.6

LuaScriptinginOpenTX

lcd.drawNumber(x, y, number ,att)


Drawanumberonthedisplay

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

number (integer)valuetodisplay

att

textattributes.Seelcd.drawText(x,y,text,att)

Returns:

none

Status:

current introduced2.0.0

Todisplayafloatingpointnumber,usethePREC1orPREC2attributes.
lcd.drawNumber(62,15,312,DBLSIZE+PREC2+LEFT)

LuaScriptinginOpenTX

lcd.drawTimer(x, y, value, att)


Displayavalueformattedastime

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

value

(timer)Atimervalue

att

textattributes.Seelcd.drawText(x,y,text,att)

Returns:

none

Status:

current Introduced2.0.6

LuaScriptinginOpenTX

lcd.getLastPos()
ReturnsthelastXpositionfrompreviousoutput

Parameters: none

Returns:

number (integer)Xposition

Status:

current Introduced2.0.6

LuaScriptinginOpenTX

lcd.drawFilledRectangle(x, y, w, h, att)
Drawarectangleonthescreenasasolidblock

Parameters: <x,y>

(number)toplefttextposition.Seelcd.drawPoint()

width

(number)widthinpixels

height (numberheightinpixels

att

textattributes.Seelcd.drawText(x,y,text,att)

Returns:

none

Status:

current Introduced2.0.0

Example:lcd.drawFilledRectangle(50,42,100,18,0)

LuaScriptinginOpenTX

lcd.drawSource(x, y, source, att)


Displaysthenameofthecorrespondinginputasdefinedbythesource.

Parameters: <x,y>

(number)toplefttextposition.Seelcd.drawPoint()

source (number)Inputindexnumber

att

textattributes.Seelcd.drawText(x,y,text,att)

Returns:

none

Status:

current Introduced2.0.0

Example:lcd.drawSource(10,20,2,LEFT+MIDSIZE)

RadioconfigurationScreen,showingthatInput02isAIL

LuaScriptinginOpenTX

lcd.drawCombobox(x, y, w, list, idx, flag)

Parameters: <x,y>

(integer)toplefttextposition.Seelcd.drawPoint()

(integer)widthofcomboBox

value

(combolist)Aarrayofitemstodisplayinthecombobox

idx

(integer)Indexofentrytohighlight

flag

(integer)0Collapsed,1=Expanded

Returns:

none

Status:

current Introduced2.0.0

Example:

table[1]="mustang"
table[2]="corsair"
table[3]=spitfire
lcd.drawCombobox(10,20,100,table,2,1)

LuaScriptinginOpenTX

Script Examples
One-Time Script Example: Hello World
AsimpledemonstrationscripttodisplayHelloWorldonthescreen.Scriptcloseswhenyouusethe
momentaryswitchSH.

Toinstall,copythecodebelowtoafilecalledHelloWorld.lua
PlacethefileintheSCRIPTSfolderoftheSDcard
BrowsetheSDcardcontentstotheSCRIPTSfolderandpressenterontheHelloWorld.luaentry
Executescript
UsetheMomentarySwitchSHtoclosethescript

local function init_func()


local switch_value = 0
end
local function run_func(event)
lcd.lock()
lcd.clear()
lcd.drawText(10,10,"Hello World",MIDSIZE)
switch_value = getValue(99)
if switch_value > 100 then
return 1 -- Exit
else
return 0
end
end
return { run=run_func, init=init_func }

LuaScriptinginOpenTX

One-Time Script Example: Generic Template


ThisisatemplatethatImadeforsomebodywhowantedtouseaswitchinordertocheckthelimitsof
eachchannel(withoutanydualrates,expos,offsetsetc.applied).
Theinsertedlinesinthemixesarenamed"ACAL",whichallowstheusereithertochangetheswitchby
callingagaintheLuascriptwithanotherswitch,ortoremoveallinsertedlinesbyselecting""asa
switch.

local swtch = 0
local function init()
for channel = 0, 32, 1 do
for idx = 0, model.getMixesCount(channel), 1 do
mix = model.getMix(channel, idx)
if mix ~= nil and mix.name == "A-CAL" then
swtch = mix.switch
end
end
end
end
local function removeTemplate()
for channel = 0, 32, 1 do
for idx = 0, model.getMixesCount(channel), 1 do
mix = model.getMix(channel, idx)
if mix ~= nil and mix.name == "A-CAL" then
model.deleteMix(channel, idx)
end
end
end
end
local function applyTemplate()
for channel = 0, 32, 1 do
count = model.getMixesCount(channel)
if count > 0 then
first_mix = model.getMix(channel, 0)
mix_source = first_mix["source"]
if mix_source >= 1 and mix_source <= 32 then

LuaScriptinginOpenTX

input = model.getInput(mix_source-1, 0)
mix = { name="A-CAL", source=input["source"], weight=100, switch=swtch, multiplex=REPLACE }
model.insertMix(channel, count, mix)
else
mix = { name="A-CAL", source=mix_source, weight=100, switch=swtch, multiplex=REPLACE }
model.insertMix(channel, count, mix)
end
end
end
end
local function run(event)
lcd.lock()
result = popupInput("Switch", event, swtch, -SWSRC_LAST, SWSRC_LAST)
lcd.drawSwitch(62, 24, swtch, 0);
if result == "OK" then
removeTemplate()
if swtch ~= 0 then
applyTemplate()
end
return 1
elseif result == "CANCEL" then
return 1
else
swtch = result
return 0
end
end
return { init=init, run=run }

LuaScriptinginOpenTX

Model Script Example: Delta Mixer


Thisexampleshowshowtosetupasingledeltamix,withitsconfigurationpages(2sourceswitha
weightoneach).Itshouldnotbeusedforrealmodel!Thisexamplehasfourinputsandtwooutputs:

-- this is comment in LUA


-- inputs definition, here we use variable named inp.
-local inp = {
-- first input: user defined input that will be
-- displayed as "Aileron" in setup screen
{ "Aileron", SOURCE },
{ "Elevator", SOURCE },
-- third input: user defined constant value
{ "Ail. ratio", VALUE, -100, 100, 0 },
{ "Ele. ratio", VALUE, -100, 100, 0 }
}
-- outputs definition
local out = { "Elv1", "Elv2" }
-- periodic run function
-- order of parameters follows inp definition,
-- first parameter is "Aileron", second is "Elevator", etc...
local function run_func(input1, input2, ratio1, ratio2)
-- remember to use local modifier for variables,
-- if omitted variable value1 would be GLOBAL!
-- input1 has current value of input that is selected
-- under "Aileron" in script setup screen
local value1 = (input1 * ratio1) / 100
local value2 = (input2 * ratio2) / 100
-- again, REMEMBER local
local elevon1 = value1 + value2
local elevon2 = value1 - value2
-- now return outputs
-- elevon1 returned for "Elv1", elevon2 for "Elv2"
return elevon1, elevon2
end
-- declaration of interface (we do not use init in this example)
-- this is where we link our local variables and funcitons to the OpenTX
-- run_func() is defined as run function
-- inp table is defined as input
-- out table is defined as output
return { run=run_func, input=inp, output=out}

Seealso:
Inputssyntax
Outputssyntax
LuaScriptinginOpenTX

LuaScriptinginOpenTX

Telemetry Script Example: Screen #1


ThisisthefirstLuatelemetryscreenscript.Itcanbeusedtoaddanadditionaltelemetryscreentoany
model.OpenTXfirmwareversion2.0.4orgreaterisneededtousethescript.Youcaneditthescript
yourselftochangewhatinformationthatisdisplayed.

ToInstallScript:
Downloadthetelemetryscreenscriptfromhere:DownloadLink
CreateafolderontheradiomicroSDcardcalledSCRIPTS(ifitdoesnotalreadyexist)
CreateanewsubfolderintheSCRIPTSfolder.Givethesubfolderthesamenameasthemodel
thatwillusethescript.
Placethescriptfileinthefolder.Thepathshouldread:/SCRIPTS/modelname/telem1.lua
CreateasubfolderinthemodelnamefoldercalledBMP.ThePathwillbecome
/SCRIPTS/modelname/BMP
PlacethethetwobitmapfilesintheBMPfolder(altitude0.bmpandaltitude1.bmp)
Thatisit.Thenewtelemetryscreenshouldnowautomaticallyappearforthemodel.

LuaScriptinginOpenTX

Telemetry Script Example: Screen #2


ThisisthesecondLuatelemetryscreenexamplescript.Itcanbeusedtoaddanadditionaltelemetry
screentoanymodel.OpenTXfirmwareversion2.0.6orgreaterisneededtousethescript.Thescript
willdisplaytwotimers,thebatteryvalueandthealtitude.Thealtitudeisdisplayedusinganewverylarge
font.Youcaneditthescriptyourselftochangewhatinformationthatisdisplayed.

ToInstallScript:
Downloadthetelemetryscreenscriptfromhere:DownloadLink
CreateafolderontheradiomicroSDcardcalledSCRIPTS(ifitdoesnotalreadyexist)
CreateanewsubfolderintheSCRIPTSfolder.Givethesubfolderthesamenameasthemodel
thatwillusethescript.
Placethescriptfileinthefolder.Thepathshouldread:/SCRIPTS/modelname/telem2.lua
Thatisit.Thenewtelemetryscreenshouldnowautomaticallyappearforthemodel.

LuaScriptinginOpenTX

Model Script Example: Automatic Battery Cell Detection


ThismodelscriptcalculatesthenumberofLiPocellsinconnectedbatteryandoutputsavoltageofone
cell.Itcanbeusedforautomaticsettingoflowbatteryalarminmodelswheredifferentcellcount
batteriesareusedinterchangeably.
Scriptalgorithm:
waitsfornewbattery(voltagechangefromzerotosomevalue)
calculatesnumberofcellsbasedonbatteryvoltage
outputsbatteryvoltagedividedbynumberofcells
whennewbatteryisdetected,stepsrepeat

Setupscreens:

ThisscriptmustbeplacedontoSDcardintofolder/SCRIPTS/MIXES/.Scriptmustbeactivatedandits
inputsandoutputssetinModelsettingsCustomscriptspage.
Thisexampleshowsbatteryvoltage(A2)is11.2Volts,detectedcellcountwas3andcalculatedvoltage
foronecellis3.73Volts.ScriptoutputVcelismultipliedby10,so3.73Visoutputtedas37.3.
VceloutputisthenusedinLogicalswitchL1,whichbecomestruewhencellvoltagedropsbelow3.3V
(remembervalueismultipliedby10).
SpecialfunctionisaddedtoplaybatterylowwarningwhenL1istrue.

Scriptcellv.lua:

LuaScriptinginOpenTX

-- cell voltage calculator

local inputs = { {"Bat. volt", SOURCE}, {"Play", VALUE, 0, 1, 0} }


local outputs = { "Vcel" }
local wait_end = 0
local cell_count = 1
local state
local filtered_voltage = 0
--state functions forward declaration
local wait, no_battery, wait_to_stabilize, calc, done
function no_battery()
-- wait for battery
if filtered_voltage > 3 then
state = wait_to_stabilize
wait_end = getTime() + 200
--print("wait " .. wait_end )
end
end
function wait_to_stabilize()
-- wait some time for battery voltage to stabilize
if getTime() >= wait_end then
state = calc
--print("calc")
end
end

function calc(play)
-- calculate cell count
cell_count = math.ceil(filtered_voltage / 4.25) --this works up to 12 cells
print("filtered_voltage: " .. filtered_voltage)
print("cell count: " .. cell_count)
-- play detected cell count
if play > 0 then
playNumber(cell_count, 0, 0)
playFile("/SOUNDS/en/celdet.wav") -- wav says: "cell battery detected"
end
state = done
--print("done")
end
function done()
if filtered_voltage < 2 then
state = no_battery
--print("no_battery")
end

LuaScriptinginOpenTX

end

local function run(voltage, play)


filtered_voltage = filtered_voltage * 0.9 + voltage * 0.1
--if getTime() % 500 == 0 then print("v: " .. filtered_voltage) end
if state == nil then state = no_battery end
state(play)

--state initialization

--call state function

if cell_count > 0 then


return (voltage / cell_count) * 102.4
end
return 0
end
return { run=run, input=inputs, output=outputs }

LuaScriptinginOpenTX

Appendix
LUA Source List
ThisisalistofallindexnumbersthatcanbeusedasaSOURCEforgetValue.Asof2.0.6thenamesare
notvalid,onlythenumber.Thisiscurrentlyunderdevelopmentsousewithcaution.Plannedtobe
releasedin2.0.8

number

name

description

input1

Input[I1]

input2

Input[I2]

input3

Input[I3]

input4

Input[I4]

input5

Input[I5]

input6

Input[I6]

input7

Input[I7]

input8

Input[I8]

input9

Input[I9]

10

input10

Input[I10]

11

input11

Input[I11]

12

input12

Input[I12]

13

input13

Input[I13]

14

input14

Input[I14]

15

input15

Input[I15]

16

input16

Input[I16]

17

input17

Input[I17]

18

input18

Input[I18]

19

input19

Input[I19]

20

input20

Input[I20]

21

input21

Input[I21]

22

input22

Input[I22]

23

input23

Input[I23]

24

input24

Input[I24]

25

input25

Input[I25]
LuaScriptinginOpenTX

26

input26

Input[I26]

27

input27

Input[I27]

28

input28

Input[I28]

29

input29

Input[I29]

30

input30

Input[I30]

31

input31

Input[I31]

32

input32

Input[I32]

75

rud

Rudder

76

ele

Elevator

77

thr

Throttle

78

ail

Aileron

79

s1

Potentiometer1

80

s2

Potentiometer2

81

s3

Potentiometer3

82

ls

Leftslider

83

rs

Rightslider

85

cyc1

Cyclic1

86

cyc2

Cyclic2

87

cyc3

Cyclic3

88

trimrud

Ruddertrim

89

trimele

Elevatortrim

90

trimthr

Throttletrim

91

trimail

Ailerontrim

92

sa

SwitchA

93

sb

SwitchB

94

sc

SwitchC

95

sd

SwitchD

96

se

SwitchE

97

sf

SwitchF

98

sg

SwitchG

99

sh

SwitchH
LuaScriptinginOpenTX

100

ls1

LogicalswitchL1

101

ls2

LogicalswitchL2

102

ls3

LogicalswitchL3

103

ls4

LogicalswitchL4

104

ls5

LogicalswitchL5

105

ls6

LogicalswitchL6

106

ls7

LogicalswitchL7

107

ls8

LogicalswitchL8

108

ls9

LogicalswitchL9

109

ls10

LogicalswitchL10

110

ls11

LogicalswitchL11

111

ls12

LogicalswitchL12

112

ls13

LogicalswitchL13

113

ls14

LogicalswitchL14

114

ls15

LogicalswitchL15

115

ls16

LogicalswitchL16

116

ls17

LogicalswitchL17

117

ls18

LogicalswitchL18

118

ls19

LogicalswitchL19

119

ls20

LogicalswitchL20

120

ls21

LogicalswitchL21

121

ls22

LogicalswitchL22

122

ls23

LogicalswitchL23

123

ls24

LogicalswitchL24

124

ls25

LogicalswitchL25

125

ls26

LogicalswitchL26

126

ls27

LogicalswitchL27

127

ls28

LogicalswitchL28

128

ls29

LogicalswitchL29

129

ls30

LogicalswitchL30

130

ls31

LogicalswitchL31
LuaScriptinginOpenTX

131

ls32

LogicalswitchL32

132

trn1

Trainerinput1

133

trn2

Trainerinput2

134

trn3

Trainerinput3

135

trn4

Trainerinput4

136

trn5

Trainerinput5

137

trn6

Trainerinput6

138

trn7

Trainerinput7

139

trn8

Trainerinput8

140

trn9

Trainerinput9

141

trn10

Trainerinput10

142

trn11

Trainerinput11

143

trn12

Trainerinput12

144

trn13

Trainerinput13

145

trn14

Trainerinput14

146

trn15

Trainerinput15

147

trn16

Trainerinput16

148

ch1

ChannelCH1

149

ch2

ChannelCH2

150

ch3

ChannelCH3

151

ch4

ChannelCH4

152

ch5

ChannelCH5

153

ch6

ChannelCH6

154

ch7

ChannelCH7

155

ch8

ChannelCH8

156

ch9

ChannelCH9

157

ch10

ChannelCH10

158

ch11

ChannelCH11

159

ch12

ChannelCH12

160

ch13

ChannelCH13

161

ch14

ChannelCH14
LuaScriptinginOpenTX

162

ch15

ChannelCH15

163

ch16

ChannelCH16

164

ch17

ChannelCH17

165

ch18

ChannelCH18

166

ch19

ChannelCH19

167

ch20

ChannelCH20

168

ch21

ChannelCH21

169

ch22

ChannelCH22

170

ch23

ChannelCH23

171

ch24

ChannelCH24

172

ch25

ChannelCH25

173

ch26

ChannelCH26

174

ch27

ChannelCH27

175

ch28

ChannelCH28

176

ch29

ChannelCH29

177

ch30

ChannelCH30

178

ch31

ChannelCH31

179

ch32

ChannelCH32

180

gvar1

Globalvariable1

181

gvar2

Globalvariable2

182

gvar3

Globalvariable3

183

gvar4

Globalvariable4

184

gvar5

Globalvariable5

185

gvar6

Globalvariable6

186

gvar7

Globalvariable7

187

gvar8

Globalvariable8

188

gvar9

Globalvariable9

189

txvoltage

Transmitterbatteryvoltage[volts]

190

clock

RTCclock[minutesfrommidnight]

196

timer1

Timer1value[seconds]

197

timer2

Timer2value[seconds]
LuaScriptinginOpenTX

198

swr

Transmitterantennaquality[lessisbetter]

200

rssi

RSSI[moreisbetter]

202

a1

A1analoguevalue[unitsasconfigured]

203

a2

A2analoguevalue[unitsasconfigured]

204

a3

A3analoguevalue[unitsasconfigured]

205

a4

A4analoguevalue[unitsasconfigured]

206

altitude

Variometeraltitude[meters]

207

rpm

Rotationalspeed[revolutionsperminute]

208

fuel

Fuellevel[???]

209

temp1

Temperature1[degreescelsius]

210

temp2

Temperature2[degreescelsius]

211

gpsspeed

GPSspeed[???]

212

distance

GPSdistance[meters]

213

gpsaltitude

GPSaltitude[meters]

214

cellmin

LiPosensorlowestcurrentcellvoltage[volts]

215

cellsum

LiPosensorcurrentsummofallcellvoltages[volts]

216

vfas

Currentsensorvoltage[volts]

217

current

Currentsensorcurrent[ampers]

218

consumption

Currentsensorconsumption[miliamperhours]

219

power

Currentsensorpower[wats]

220

accx

GsensoraccelerationinXaxis[g]

221

accy

GsensoraccelerationinYaxis[g]

222

accz

GsensoraccelerationinZaxis[g]

223

heading

GPSheading[degrees]

224

verticalspeed

Variometerverticalspeed[m/s]

225

airspeed

Airspeed[knots]

226

dte

Totalenergy[???]

232

a1min

A1analoguevalueminimum[unitsasconfigured]

233

a2min

A2analoguevalueminimum[unitsasconfigured]

234

a3min

A3analoguevalueminimum[unitsasconfigured]

235

a4min

A4analoguevalueminimum[unitsasconfigured]
LuaScriptinginOpenTX

236

altitudemin

Lowestaltitude[meters]

237

altitudemax

Highestaltitude[meters]

238

rpmmax

Highestrotationalspeed[revolutionsperminute][meters]

239

temp1max

Highesttemperature1[degreescelsius]

240

temp2max

Highesttemperature2[degreescelsius]

241

gpsspeedmax

HighestGPSspeed[???]

242

distancemax

BiggestGPSdistance[meters]

243

airspeedmax

Highestairspeed[knots]

244

cellminmin

LiPosensoralltimelowestcellvoltage[volts]

245

cellsummin

LiPosensoralltimelowestsummofallcellvoltages[volts]

246

vfasmin

Currentsensorlowestvoltage[volts]

247

currentmax

Currentsensorhighestcurrent[ampers]

248

powermax

Currentsensorhighestpower[wats]

LuaScriptinginOpenTX

Character Maps
SMLSIZE
Fontfile:font_04x06.pngforcharactersbelow0xC0
:font_04x06_extra.pngforcharactersabove0xc0
Hex

Char

Hex

Char

Hex

Char

Hex

Char

Hex

Char

20

3A

54

6E

21

3B

55

6F

22

3C

<

56

70

23

3D

57

71

24

3E

>

58

72

25

3F

59

73

26

&

40

5A

74

27

41

5B

75

28

42

5C

76

29

43

5D

77

2A

44

5E

78

2B

45

5F

79

2C

46

60

7A

2D

47

61

7B

2E

48

62

7C

2F

49

63

7D

30

4A

64

7E

31

4B

65

7F

32

4C

66

22

4D

67

34

4E

68

C0

35

4F

69

C1

36

50

6A

C2

37

51

6B

C3

37

52

6C

C4

39

53

6D

C5

LuaScriptinginOpenTX

default
defaultcharacterset(noconstantsouseatt=0)
Fontfile:font_05x07.png&font_05x07_extra.png

Hex

Char

Hex

Char

Hex

Char

Hex

Char

Hex

Char

20

3A

54

6E

21

3B

55

6F

22

3C

<

56

70

23

3D

57

71

24

3E

>

58

72

25

3F

59

73

26

&

40

5A

74

27

41

5B

75

28

42

5C

76

29

43

5D

77

2A

44

5E

78

2B

45

5F

79

2C

46

60

7A

2D

47

61

7B

2E

48

62

7C

2F

49

63

7D

30

4A

64

7E

31

4B

65

7F

32

4C

66

22

4D

67

C0

34

4E

68

C1

35

4F

69

C2

36

50

6A

C3

37

51

6B

C4

37

52

6C

C5

39

53

6D

C6

LuaScriptinginOpenTX

MIDSIZE
Fontfile:font_08x10.png
Hex

Char

Hex

Char

Hex

Char

Hex

Char

Hex

Char

20

3A

54

6E

21

3B

55

6F

22

3C

<

56

70

23

3D

57

71

24

3E

>

58

72

25

3F

59

73

26

&

40

5A

74

27

41

5B

75

28

42

5C

76

29

43

5D

77

2A

44

5E

78

2B

45

5F

79

2C

46

60

7A

2D

47

61

7B

2E

48

62

7C

2F

49

63

7D

30

4A

64

7E

31

4B

65

7F

32

4C

66

22

4D

67

34

4E

68

35

4F

69

36

50

6A

37

51

6B

37

52

6C

39

53

6D

LuaScriptinginOpenTX

DBLSIZE
Fontfile:font_10x14.png

LuaScriptinginOpenTX

XXLSIZE
Usesfontfilefont_22x38.png

Hex

Character

2C

2D

2E

2F

30

31

32

33

34

35

36

37

38

39

3A

LuaScriptinginOpenTX

Links to external documentation:

OpenTXWebSite
OpenTXDevelopmentWiki
ProgramminginLua
Lua5.2ReferenceManual
OpenTXUniversity

LuaScriptinginOpenTX

Document Style
CodeexamplesareformattedusingtheCodePrettyAddonforGoogleDocs.
Wherepossible,eachfunctionshouldhaveexampleswithascreenshot.
FunctionsandConstantsshouldreferencetheversionithasbeenaddedandifapplicable,the
versionitwasdepreciated.

LuaScriptinginOpenTX

Acknowledgments

LuaScriptinginOpenTX

Potrebbero piacerti anche