Device config: Advanced topics
Add functionality to inputs and outputs
Input Routing
Basically every device input is a separate control for SPAD.neXt, however you can re-route inputs in the SPAD.neXt UI to add functionality to one input in the UI.
An additional input is created, and the following options are added to it:
HIDDEN=1
Input will not be exposed in the UI
ROUTETO=<targettag>
Events from this input will not be handled by the input, but routed to the input associated with <targettag>
ROUTETO=E_ENCODER
Example: An Encoder with a Pushbutton
First the Encoder is configured
0,INPUT,2000,E_HDG,ENCODER,SPAD_ENCODER_ACC;
Then the pushbutton is configured, telling SPAD.neXt to route it to the encoder
0,INPUT,7,I_HDG_PUSH,PUSHBUTTON,SPAD_PUSHBUTTON,HIDDEN=1,ROUTETO=E_HDG;
SPAD.neXt will now add the pushbutton-events to the encoder in the UI, and not expose the pushbutton I_HDG_PUSH in the UI at all. Whenever the device sends now an inputevent (8,7,1;
) for that pushbutton, the according events on the encoder will be executed.
Example: An encoder that can be pulled out as a switch
Again,just configure the encoder and the additional switch
0,INPUT,2000,E_HDG,ENCODER,SPAD_ENCODER_ACC;
0,INPUT,7,S_HDG_PULL,SWITCH,SPAD_SWITCH,HIDDEN=1,ROUTETO=E_HDG;
Complex Examples
Example: Encoder that can be pushed and pulled as a pushbutton
Now things get a bit more complicated.
First, as before the encoder is configured
0,INPUT,2000,E_HDG,ENCODER,SPAD_ENCODER_ACC;
Now 2 additional inputs shall be attached to the encoder that will use the same events. SPAD.neXt needs to know what to do and how to separate the events. To achieve this, additonal options can be added to the input(s) to create diffrent events for each of them:
ROUTETO.PRESS
PRESS
ROUTETO.PRESSSHORT
PRESSSHORT
ROUTETO.PRESSLONG
PRESSLONG
ROUTETO.HELD
HELD
ROUTETO.RELEASE
RELEASE
Literally every event from an input can be rerouted this way. For a switch the options would be ROUTETO.ON
, ROUTETO.OFF
, for stateful input (rotary/3-way) those would be ROUTETO.<positionname>
The option-value will be used as event name in SPAD.neXt. If it does not exist yet, it will be automatically created.
But back to the example, now create the 2 additional input buttons (simple ones to keep this short and simple):
0,INPUT,7,I_HDG_PUSH,PUSHBUTTON,SPAD_SIMPLEBUTTON,HIDDEN=1,ROUTETO=E_HDG,ROUTETO.PRESS=PUSH_PRESS,ROUTETO.RELEASE=PUSH_RELEASE;
0,INPUT,8,I_HDG_PULL,PUSHBUTTON,SPAD_SIMPLEBUTTON,HIDDEN=1,ROUTETO=E_HDG,ROUTETO.PRESS=PULL_PRESS,ROUTETO.RELEASE=IGNORE;
Note that the INHERIT for the button are ommited, to prevent SPAD.neXt to add any default events to the buttons.
For the pull-button SPAD.neXt is instructed to ignore the release event and only support the push event. The value "IGNORE" can also be ommited which will have the same effect.
In the SPAD.neXt UI the E_HDG encoder will now have the events CW / CCW / PUSH_PRESS / PUSH_RELEASE / PULL_PRESS
Note: This can become quite long configuration commands and should be done in the device editor/ device xml configuration to preserve device space
Important! Routed inputs still have their own variables to hold their current value!
Example: Airbus FCU Altitude encoder
The Airbus FCU altitude encoder has following addtional functions: Push , Pull and a ring-switch for 100 / 1000 steps
0,INPUT,1000,E_ALT,ENCODER,SPAD_ENCODER_ACC;
0,INPUT,1,I_ALT_PUSH,PUSHBUTTON,SPAD_SIMPLEBUTTON,HIDDEN=1,ROUTETO=E_ALT,ROUTETO.PRESS=PUSH,ROUTETO.RELEASE=;
0,INPUT,2,I_ALT_PULL,PUSHBUTTON,SPAD_SIMPLEBUTTON,HIDDEN=1,ROUTETO=E_ALT,ROUTETO.PRESS=PULL,ROUTETO.RELEASE=;
0,INPUT,3,S_ALT_RING,SWITCH,SPAD_SWITCH,HIDDEN=1,ROUTETO=E_ALT,ROUTETO.ON=ALT100,ROUTETO.OFF=ALT1000;
The E_ALT encoder will have the events
CW / CCW / PUSH / PULL / ALT100 / ALT1000
Note that the INHERIT for the buttons/switch
are ommited, to prevent SPAD.neXt to add any default events to the buttons.
Output routing
The other way around is an output that physically located on a button (e.g. MCP / FCU). Here SPAD.neXt needs to know not to expose the led in the UI, but add it to another input, while keeping the output events separated. This is curretntly only supported for leds.
Again the led will need to have the HIDDEN=1
option so it will not be exposed in the UI, but now the button needs an option to associate it with the led. This is done by adding the option LED=<ledtargettag>
to it.
Example: FCU AP1 button
0,INPUT,8,I_AP1,PUSHBUTTON,SPAD_PUSHBUTTON,LED=L_AP1;
0,OUTPUT,5,L_AP1,LED,SPAD_LED,HIDDEN=1;
This will add the led-control actions to the button, but when executed they will be routed to the L_AP1
led using the led-update channel (6)
Last updated