From 0ab67ab9ea0c4f9ac44a3a99bfb2679ca5ba4be0 Mon Sep 17 00:00:00 2001 From: Ray Morris Date: Sun, 17 Sep 2023 11:10:53 -0500 Subject: [PATCH] docs/ipf: Fix typos and clarify wording --- docs/Programming Framework.md | 32 +++++++++++++++--- docs/assets/images/ipf_set_get_rc_channel.png | Bin 0 -> 12113 bytes 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 docs/assets/images/ipf_set_get_rc_channel.png diff --git a/docs/Programming Framework.md b/docs/Programming Framework.md index a5b9a3fdbc..42a4f2a83f 100644 --- a/docs/Programming Framework.md +++ b/docs/Programming Framework.md @@ -1,17 +1,28 @@ # INAV Programming Framework -INAV Programming Framework (abbr. IPF) is a mechanism that allows to evaluate cenrtain flight parameters (RC channels, switches, altitude, distance, timers, other logic conditions) and use the value of evaluated expression in different places of INAV. Currently, the result of LCs can be used in: +INAV Programming Framework (IPF) is a mechanism that allows you to to create +custom functionality in INAV. You can choose for certain actions to be done, +based on custom conditions you select. + +Logic conditions can be based on things such as RC channel values, switches, altitude, +distance, timers, etc. The conditions you create can also make use of other conditions +you've entered previously. +The results can be used in: * [Servo mixer](Mixer.md) to activate/deactivate certain servo mix rulers * To activate/deactivate system overrides -INAV Programming Framework coinsists of: +INAV Programming Framework consists of: -* Logic Conditions - each Logic Condition can be understood as a single command, a single line of code -* Global Variables - variables that can store values from and for LogiC Conditions and servo mixer +* Logic Conditions - each Logic Condition can be understood as a single command, a single line of code. Each logic condition consists of: + * an operator (action), such as "plus" or "set vtx power" + * one or two operands (nouns), which the action acts upon. Operands are often numbers, such as a channel value or the distance to home. + * "activator" condition - optional. This condition is only active when another condition is true +* Global Variables - variables that can store values from and for Logic Conditions and servo mixer * Programming PID - general purpose, user configurable PID controllers -IPF can be edited using INAV Configurator user interface, or via CLI +IPF can be edited using INAV Configurator user interface, or via CLI. To use COnfigurator, click the tab labeled +"Programming". The various options shown in Configurator are described below. ## Logic Conditions @@ -310,3 +321,14 @@ Steps: 2. Scale range [0:1000] to [0:3] 3. Increase range by `1` to have the range of [1:4] 4. Assign LC#2 to VTX power function + +## Common issues / questions about IPF + +One common mistake involves setting RC channel values. To override (set) the +value of a specific RC channel, choose "Override RC value", then for operand A +choose *value* and enter the channel number. Choosing "get RC value" is a common mistake, +which does something other than what you probably want. + +![screenshot of override an RC channel with a value](./assets/images/ipf_set_get_rc_channel.png) + + diff --git a/docs/assets/images/ipf_set_get_rc_channel.png b/docs/assets/images/ipf_set_get_rc_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..01b6bf64ae79cfa957be71288b8af1f4326e89ab GIT binary patch literal 12113 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