--[[ SCRIPT: SNAPFLAP AUTHOR: Mike Shellim URL: http://www.rc-soar.com/opentx DATE: 22 August 2014 VERSION: 2.02A DESCRIPTION: Adjustable snapflap mix. INPUTS: ctrl_p1 control for adjusting elevator value at which snapflap starts 1=S1 (default) 2=S2 3=LS 4=RS 5=TrmT (throttle trim) p2 elev value at which max snapflap is reached min=20 max=100 default=100 OUTPUTS: Snap - snapflap value -100 to +100 Snap ^ | | 100 | ----- xxxxxxxx | x | x | x | x | x |xxxx------------------ |elev| --> | | | | p1 p2 | INSTALLATION 1. Save script with .LUA extension, store in /SCRIPTS/MIXES folder on SD Card 2. Open Custom Scripts menu in the transmitter 3. Assign this LUA script to an empty slot 4. Test by moving elevator stick and observing 'snap' value 5. Close Custom Scripts menu 6. Check that [i]Snap appears in the mixer Src list MIXER SETUP - Create new mixer line in wing servo channel, call it 'snap' Src = [i]Snap [optional] to restrict snapflap to one direction, specify curve="x<0" or "x>0" ADJUSTMENTS - To alter p1, rotate designated control (s1, s2, ls, lr or trmT) - To alter p2, enter a value for p2 in the script menu - To alter snapflap volume, adjust wt in 'snap' mixer line - Alternatively adjust via another control in a subsequent MULTiply mixer line --]] local MIN_INTERVAL = 20 -- minimum interval between p1 and p2 local control_id = {} -- array of control ids local out = {"Snap"} -- outputs definition -- inputs definition local inp = { { "ctrl_p1", VALUE, 1, 5, 1}, -- index into controls table, defines adjuster for p1. Default = 1, i.e S1 { "p2", VALUE, MIN_INTERVAL, 100, 100 } -- Value of p2. Default = 100. } -- initialisation function (called once) local function init_func() -- Store ids of permissable adjuster controls in array -- (saves expensive lookups in run_func) control_id [1] = getFieldInfo ("s1").id control_id [2] = getFieldInfo ("s2").id control_id [3] = getFieldInfo ("ls").id control_id [4] = getFieldInfo ("rs").id control_id [5] = getFieldInfo ("trim-thr").id end -- periodically called function local function run_func(ctrl_p1, p2) local p1 local elev_in local elev local snap -- initialise variables snap = 0 --------------------------------- -- convert inputs to script units --------------------------------- -- Map el_p1_control (-100 to +100) to snap_sta (0 to 1024) p1 = getValue (control_id[ctrl_p1]) p1 = ((p1 * 0.5) + 512) -- convert p2 to script units p2 = p2 * 10.24 ----------------------------------- -- check interval between p1 and p2 ----------------------------------- if p2 - p1 < MIN_INTERVAL then p1 = p2 - MIN_INTERVAL end ---------------------------- -- get abs value of elevator ---------------------------- elev_in = getValue (MIXSRC_Ele) if elev_in < 0 then elev = -elev_in else elev = elev_in end --------------------- -- determine snapflap --------------------- if elev >= p2 then snap = 1024 elseif elev <= p1 then snap = 0 else snap = (1024 *(elev-p1))/(p2-p1) end -- negate result if elev was negative if elev_in < 0 then snap = -snap end return snap end return { init=init_func, run=run_func, input=inp, output=out}