From 249d5681b3ce4e1ccd586a3110c8dc42b7144d22 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Sat, 14 Oct 2017 14:22:51 -0400 Subject: [PATCH 01/22] Notes reformatting --- README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 04a93175..ffacb8b8 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,10 @@ ## Notice -> If you get the message **Script Panic not enough memory** you've run out of memory on your transmitter. -> This happens if you have too many Lua scripts running (this includes model, function, and telemetry scripts). -> It's also possible that you have less memory to work with when running firmware that uses more memory (for example, using firmware that includes multimodule support if you're not using it). -> Using transmitter firmware with `luac` included will reduce memory usage and increase the telemetry screen speed. - -* Designed for multirotor models, but should be valuable for fixed wing (fixed wing feedback appreciated) -* Optional amperage sensor needed for fuel and current displays -* Uses Taranis settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings -* Uses Taranis settings for transmitter voltage min/max for battery gauge in screen title +If you get the message **Script Panic not enough memory** you've run out of memory on your transmitter. +This happens if you have too many Lua scripts running (this includes model, function, and telemetry scripts). +It's also possible that you have less memory to work with when running firmware that uses more memory (for example, using firmware that includes multimodule support if you're not using it). +Using transmitter firmware with `luac` included will reduce memory usage and increase the telemetry screen speed. ## Setup @@ -72,9 +67,13 @@ The launch/pilot-based orientation view is useful if model orientation is unknow The script gives voice feedback for flight modes, battery levels, and warnings (no need to manually set this up for each model). Voice alerts will play in background even if iNav LuaTelemetry screen is not displayed. -## Tips +## Tips & Notes -* Between flights, long-press the Enter/dial and select `Reset telemetry` +* Between flights, you can long-press the Enter/dial and select `Reset telemetry` +* Designed for multirotor models, but should be valuable for fixed wing (fixed wing feedback appreciated) +* Optional amperage sensor needed for fuel and current displays +* Uses Taranis settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings +* Uses Taranis settings for transmitter voltage min/max for battery gauge in screen title ## Release History From 230c5feeabb24506baaac765cd1354dd7b40354d Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Sat, 14 Oct 2017 14:31:48 -0400 Subject: [PATCH 02/22] High altitude flash notification on altitude bar graph on X9D transmitter --- iNav.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iNav.lua b/iNav.lua index 91aee873..bb42b604 100644 --- a/iNav.lua +++ b/iNav.lua @@ -507,10 +507,10 @@ local function run(event) lcd.drawFilledRectangle(198, 56 - height, 13, height, INVERS) local max = 56 - math.max(math.min(math.ceil(data.altitudeMax / data.altAlert * 46), 46), 0) lcd.drawLine(198, max, 210, max, DOTTED, FORCE) - lcd.drawText(198, 58, "Alt", SMLSIZE) + lcd.drawText(198, 58, "Alt", SMLSIZE + altFlags) end return 1 end -return {run = run, background = background} \ No newline at end of file +return {run = run, background = background} From 689c3a9a2a7236171a7bfa98277285dc65a220f3 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Sat, 14 Oct 2017 14:38:27 -0400 Subject: [PATCH 03/22] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ffacb8b8..f7ed544c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# SmartPort/INAV Telemetry Flight Status - v1.1.4 +# SmartPort/INAV Telemetry Flight Status - v1.1.5 #### Taranis Q X7 ![sample](http://www.leethost.com/link_pics/iNav1.png "Launch-based model orientation and location indicators") @@ -77,6 +77,8 @@ Voice alerts will play in background even if iNav LuaTelemetry screen is not dis ## Release History +#### v1.1.5 +* Altitude bar graph text flashes when above max altitude #### v1.1.4 - 10/13/2017 * More accurate max altitude alerts and altitude flashes when above max altitude * Long-press resets values From b08312f8cffc66da447a32d1c605d71fd6350ba1 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Sat, 14 Oct 2017 14:39:15 -0400 Subject: [PATCH 04/22] Update iNav.lua --- iNav.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iNav.lua b/iNav.lua index bb42b604..4092114f 100644 --- a/iNav.lua +++ b/iNav.lua @@ -1,5 +1,5 @@ -- Lua Telemetry Flight Status Screen for INAV/Taranis --- Version: 1.1.4 +-- Version: 1.1.5 -- Author: https://github.com/teckel12 -- Docs: https://github.com/iNavFlight/LuaTelemetry From 09a0312057d74e54636bd33f7fad882a34349dc5 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Sat, 14 Oct 2017 14:41:20 -0400 Subject: [PATCH 05/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f7ed544c..dde856da 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Voice alerts will play in background even if iNav LuaTelemetry screen is not dis ## Release History #### v1.1.5 -* Altitude bar graph text flashes when above max altitude +* Altitude bar graph text on X9D/X9D+ flashes when above max altitude #### v1.1.4 - 10/13/2017 * More accurate max altitude alerts and altitude flashes when above max altitude * Long-press resets values From 9b6dcd7de2b157bc84dba1812a276b6654195459 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Sun, 15 Oct 2017 14:29:51 -0400 Subject: [PATCH 06/22] Moved head free warning on QX7 to top center, better text centering and right justification technique, cleaned up code saving more memory --- README.md | 4 ++- iNav.lua | 89 +++++++++++++++++++++++++++---------------------------- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index dde856da..93d33ca2 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,9 @@ Voice alerts will play in background even if iNav LuaTelemetry screen is not dis ## Release History #### v1.1.5 -* Altitude bar graph text on X9D/X9D+ flashes when above max altitude +* Moved head free warning on Q X7 to top center +* Better text centering and right justification technique +* Cleaned up code saving more memory #### v1.1.4 - 10/13/2017 * More accurate max altitude alerts and altitude flashes when above max altitude * Long-press resets values diff --git a/iNav.lua b/iNav.lua index 4092114f..4a987e98 100644 --- a/iNav.lua +++ b/iNav.lua @@ -10,7 +10,7 @@ local TIMER_POS = QX7 and 60 or 150 local RXBATT_POS = LCD_W - 17 local RIGHT_POS = QX7 and 129 or 195 local GAUGE_WIDTH = QX7 and 82 or 149 -local MODE_POS = QX7 and 48 or 90 +local MODE_POS = QX7 and 67 or 106 local MODE_SIZE = QX7 and SMLSIZE or 0 local X_CNTR_1 = QX7 and 67 or 70 local X_CNTR_2 = QX7 and 67 or 135 @@ -190,6 +190,7 @@ local function flightModes() end end if armed then + data.timer = (getTime() - data.timerStart) / 100 -- Armed so update timer if altHold ~= altHoldPrev and data.modeId ~= 8 then -- Alt hold status change playFile(WAVPATH .. "althld.wav") playFile(WAVPATH .. (altHold and "active.wav" or "off.wav")) @@ -325,22 +326,22 @@ local function background() end end -local function gpsData(t, y, f) - lcd.drawText(RIGHT_POS - 51, 9, t, SMLSIZE) - local x = RIGHT_POS - 51 + (RIGHT_POS - lcd.getLastPos()) - lcd.drawText(x, y, t, SMLSIZE + f) +local function gpsData(txt, y, flags) + lcd.drawText(0, 0, txt, SMLSIZE) + local x = RIGHT_POS - lcd.getLastPos() + lcd.drawText(x, y, txt, SMLSIZE + flags) end -local function drawDirection(h, w, s, x, y) - local rad1 = math.rad(h) - local rad2 = math.rad(h + w) - local rad3 = math.rad(h - w) - local x1 = math.floor(math.sin(rad1) * s + 0.5) + x - local y1 = y - math.floor(math.cos(rad1) * s + 0.5) - local x2 = math.floor(math.sin(rad2) * s + 0.5) + x - local y2 = y - math.floor(math.cos(rad2) * s + 0.5) - local x3 = math.floor(math.sin(rad3) * s + 0.5) + x - local y3 = y - math.floor(math.cos(rad3) * s + 0.5) +local function drawDirection(heading, width, radius, x, y) + local rad1 = math.rad(heading) + local rad2 = math.rad(heading + width) + local rad3 = math.rad(heading - width) + local x1 = math.floor(math.sin(rad1) * radius + 0.5) + x + local y1 = y - math.floor(math.cos(rad1) * radius + 0.5) + local x2 = math.floor(math.sin(rad2) * radius + 0.5) + x + local y2 = y - math.floor(math.cos(rad2) * radius + 0.5) + local x3 = math.floor(math.sin(rad3) * radius + 0.5) + x + local y3 = y - math.floor(math.cos(rad3) * radius + 0.5) lcd.drawLine(x1, y1, x2, y2, SOLID, FORCE) lcd.drawLine(x1, y1, x3, y3, SOLID, FORCE) if headingHold then @@ -370,40 +371,18 @@ local function run(event) lcd.clear() background() - -- Title - if armed then - data.timer = (getTime() - data.timerStart) / 100 - end - lcd.drawFilledRectangle(0, 0, LCD_W, 8) - lcd.drawText(0, 0, data.modelName, INVERS) - lcd.drawTimer(TIMER_POS, 1, data.timer, SMLSIZE + INVERS) - lcd.drawFilledRectangle(86, 1, 19, 6, ERASE) - lcd.drawLine(105, 2, 105, 5, SOLID, ERASE) - local battGauge = math.max(math.min((data.txBatt - data.txBattMin) / (data.txBattMax - data.txBattMin) * 17, 17), 0) + 86 - for i = 87, battGauge, 2 do - lcd.drawLine(i, 2, i, 5, SOLID, FORCE) - end - if not QX7 then - lcd.drawNumber(110 , 1, data.txBatt * 10.05, SMLSIZE + PREC1 + INVERS) - lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) - end - if data.rxBatt > 0 and data.telemetry then - lcd.drawNumber(RXBATT_POS, 1, data.rxBatt * 10.05, SMLSIZE + PREC1 + INVERS) - lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) - end - -- GPS if data.gpsLatLon ~= false then local gpsFlags = (telemFlags > 0 or not data.gpsFix) and FLASH or 0 gpsData(math.floor(data.gpsAlt + 0.5) .. units[data.gpsAlt_unit], 17, gpsFlags) - gpsData(math.floor(data.gpsLatLon.lat * GPS_DIGITS + 0.5) / GPS_DIGITS, 25, gpsFlags) - gpsData(math.floor(data.gpsLatLon.lon * GPS_DIGITS + 0.5) / GPS_DIGITS, 33, gpsFlags) + gpsData(math.floor(data.gpsLatLon.lat * GPS_DIGITS) / GPS_DIGITS, 25, gpsFlags) + gpsData(math.floor(data.gpsLatLon.lon * GPS_DIGITS) / GPS_DIGITS, 33, gpsFlags) else lcd.drawFilledRectangle(RIGHT_POS - 41, 17, 41, 23, INVERS) lcd.drawText(RIGHT_POS - 37, 20, "No GPS", INVERS) lcd.drawText(RIGHT_POS - 28, 30, "Fix", INVERS) end - gpsData(" Sats " .. data.satellites % 100, 9, telemFlags) + gpsData("Sats " .. data.satellites % 100, 9, telemFlags) -- Directionals if event == EVT_ROT_LEFT or event == EVT_ROT_RIGHT or event == EVT_PLUS_BREAK or event == EVT_MINUS_BREAK then @@ -443,13 +422,12 @@ local function run(event) end -- Flight mode - lcd.drawText(48, 34, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) - pos = MODE_POS + (87 - lcd.getLastPos()) / 2 - lcd.drawFilledRectangle(47, 33, QX7 and 41 or 50, 9, ERASE) - lcd.drawText(pos, 33, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) + lcd.drawText(0, 0, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) + local x = MODE_POS - (lcd.getLastPos() / 2) + lcd.drawText(x, 33, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) if headFree then if QX7 then - lcd.drawText(84, 17, "HF", SMLSIZE + FLASH) + lcd.drawText(63, 9, "HF", SMLSIZE + FLASH) else lcd.drawText(lcd.getLastPos() + 2, 33, " HF ", FLASH) end @@ -507,9 +485,28 @@ local function run(event) lcd.drawFilledRectangle(198, 56 - height, 13, height, INVERS) local max = 56 - math.max(math.min(math.ceil(data.altitudeMax / data.altAlert * 46), 46), 0) lcd.drawLine(198, max, 210, max, DOTTED, FORCE) - lcd.drawText(198, 58, "Alt", SMLSIZE + altFlags) + lcd.drawText(198, 58, "Alt", SMLSIZE) end + -- Title + lcd.drawFilledRectangle(0, 0, LCD_W, 8, FORCE) + lcd.drawText(0, 0, data.modelName, INVERS) + lcd.drawTimer(TIMER_POS, 1, data.timer, SMLSIZE + INVERS) + lcd.drawFilledRectangle(86, 1, 19, 6, ERASE) + lcd.drawLine(105, 2, 105, 5, SOLID, ERASE) + local battGauge = math.max(math.min((data.txBatt - data.txBattMin) / (data.txBattMax - data.txBattMin) * 17, 17), 0) + 86 + for i = 87, battGauge, 2 do + lcd.drawLine(i, 2, i, 5, SOLID, FORCE) + end + if not QX7 then + lcd.drawNumber(110 , 1, data.txBatt * 10.05, SMLSIZE + PREC1 + INVERS) + lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) + end + if data.rxBatt > 0 and data.telemetry then + lcd.drawNumber(RXBATT_POS, 1, data.rxBatt * 10.05, SMLSIZE + PREC1 + INVERS) + lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) + end + return 1 end From d937d13ae8d0cc2aefd10f1f00b7ff5279d9adf2 Mon Sep 17 00:00:00 2001 From: teckel12 Date: Mon, 16 Oct 2017 15:17:36 -0400 Subject: [PATCH 07/22] Readme clarifications --- README.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 93d33ca2..2c999915 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,6 @@ * [INAV v1.7.3+](https://github.com/iNavFlight/inav/releases) running on your flight controller * GPS, altimeter, and compass sensors -## Notice - -If you get the message **Script Panic not enough memory** you've run out of memory on your transmitter. -This happens if you have too many Lua scripts running (this includes model, function, and telemetry scripts). -It's also possible that you have less memory to work with when running firmware that uses more memory (for example, using firmware that includes multimodule support if you're not using it). -Using transmitter firmware with `luac` included will reduce memory usage and increase the telemetry screen speed. - ## Setup #### In INAV Configurator @@ -48,32 +41,39 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc #### INAV Lua Telemetry Screen Setup -1. Copy `iNav.lua` file to Taranis SD card's `\SCRIPTS\TELEMETRY\` folder -2. Copy `iNav` folder to Taranis SD card's `\SCRIPTS\TELEMETRY\` folder +1. Copy `iNav.lua` file to transmitter SD card's `\SCRIPTS\TELEMETRY\` folder +2. Copy `iNav` folder to transmitter SD card's `\SCRIPTS\TELEMETRY\` folder 3. In model setup, page to `DISPLAY`, set desired screen to `Script`, and select `iNav` +## Notice + +If you get the message **Script Panic not enough memory** you've run out of memory on your transmitter. +This happens if you have too many Lua scripts running (this includes model, function, and telemetry scripts). +It's also possible that you have less memory to work with when running firmware that uses more memory (for example, using firmware that includes multimodule support if you're not using it). +Using transmitter firmware with `luac` included will reduce memory usage and increase the telemetry screen speed. + ## Usage #### Screen Description ![sample](http://www.leethost.com/link_pics/iNav4.png "Screen description") -From the Taranis main screen, hold the `Page` button to show custom screens, then page to the screen you set to show iNav. -Flashing values are either because there's no telemetry or a warning. -To flip between max/min values and current values, use the dial or +/- buttons. -To flip between compass-based direction and launch/pilot-based orientation and location, use the dial or +/- buttons. -If model is further than 25 feet away, the launch/pilot direction view will show the direction of the model based upon launch/pilot position and orientation. -This can be used to locate a lost model, using the launch/pilot-based model location indicator and distance. -The launch/pilot-based orientation view is useful if model orientation is unknown. -The script gives voice feedback for flight modes, battery levels, and warnings (no need to manually set this up for each model). -Voice alerts will play in background even if iNav LuaTelemetry screen is not displayed. +* From the transmitter's main screen, hold the `Page` button to show custom screens, then page to the screen you set to show iNav. +* Flashing values indicate a warning (for example: no telemetry, battery low, altitiude too high). +* To flip between max/min values and current values, use the dial or +/- buttons. +* To flip between compass-based direction and launch/pilot-based orientation and location, use the dial or +/- buttons. +* The launch/pilot-based orientation view is useful if model orientation is unknown. +* If model is further than 25 feet away, the launch/pilot-based view will show the direction of the model based upon launch/pilot position and orientation. +* The launch/pilot-based model direction can be used to locate a lost model, using the launch/pilot-based model location indicator and distance. +* The script gives voice feedback for flight modes, battery levels, and warnings (no need to manually set this up for each model). +* Voice alerts will play in background even if iNav LuaTelemetry screen is not displayed. ## Tips & Notes * Between flights, you can long-press the Enter/dial and select `Reset telemetry` * Designed for multirotor models, but should be valuable for fixed wing (fixed wing feedback appreciated) * Optional amperage sensor needed for fuel and current displays -* Uses Taranis settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings -* Uses Taranis settings for transmitter voltage min/max for battery gauge in screen title +* Uses transmitter settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings +* Uses transmitter settings for transmitter voltage min/max for battery gauge in screen title ## Release History From 772a37ffe899cbf47046fe268a12f46b309456e4 Mon Sep 17 00:00:00 2001 From: teckel12 Date: Mon, 16 Oct 2017 15:35:46 -0400 Subject: [PATCH 08/22] Readme re-organization --- README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2c999915..ccafc2ec 100644 --- a/README.md +++ b/README.md @@ -57,15 +57,14 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc #### Screen Description ![sample](http://www.leethost.com/link_pics/iNav4.png "Screen description") -* From the transmitter's main screen, hold the `Page` button to show custom screens, then page to the screen you set to show iNav. -* Flashing values indicate a warning (for example: no telemetry, battery low, altitiude too high). -* To flip between max/min values and current values, use the dial or +/- buttons. -* To flip between compass-based direction and launch/pilot-based orientation and location, use the dial or +/- buttons. -* The launch/pilot-based orientation view is useful if model orientation is unknown. -* If model is further than 25 feet away, the launch/pilot-based view will show the direction of the model based upon launch/pilot position and orientation. -* The launch/pilot-based model direction can be used to locate a lost model, using the launch/pilot-based model location indicator and distance. -* The script gives voice feedback for flight modes, battery levels, and warnings (no need to manually set this up for each model). -* Voice alerts will play in background even if iNav LuaTelemetry screen is not displayed. +* From the transmitter's main screen, hold the `Page` button to show custom screens, then page to the screen you set to show iNav +* Flashing values indicate a warning (for example: no telemetry, battery low, altitiude too high) +* To flip between max/min values and current values, use the dial or +/- buttons +* To flip between compass-based direction and launch/pilot-based orientation and location, use the dial or +/- buttons +* The launch/pilot-based orientation view is useful if model orientation is unknown +* If model is further than 25 feet away, the launch/pilot-based view will show the direction of the model based upon launch/pilot position and orientation (useful to locate a lost model) +* The script gives voice feedback for flight modes, battery levels, and warnings (no need to manually set this up for each model) +* Voice alerts will play in background even if iNav LuaTelemetry screen is not displayed ## Tips & Notes From c559197820d1e706abbae5a36a8a983c51885839 Mon Sep 17 00:00:00 2001 From: teckel12 Date: Mon, 16 Oct 2017 16:32:39 -0400 Subject: [PATCH 09/22] Update screenshot --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ccafc2ec..a20bb16b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SmartPort/INAV Telemetry Flight Status - v1.1.5 #### Taranis Q X7 -![sample](http://www.leethost.com/link_pics/iNav1.png "Launch-based model orientation and location indicators") +![sample](http://www.leethost.com/link_pics/iNav1.png "launch/pilot-based model orientation and location indicators") ![sample](http://www.leethost.com/link_pics/iNav2.png "Compass-based direction indicator") #### Taranis X9D, X9D+ & X9E @@ -22,7 +22,7 @@ ## Requirements -* [OpenTX v2.2.0+](http://www.open-tx.org/) running on Taranis Q X7, X9D, X9D+ & X9E +* [OpenTX v2.2.0+](http://www.open-tx.org/) running on Taranis Q X7, X9D, X9D+ or X9E * SmartPort telemetry compatible receiver: X4R(SB), X8R, XSR, R-XSR, XSR-M, XSR-E, etc. (*NOT* D-series receivers) * [INAV v1.7.3+](https://github.com/iNavFlight/inav/releases) running on your flight controller * GPS, altimeter, and compass sensors From c367205003222c79a59f4560b6aaccba051df337 Mon Sep 17 00:00:00 2001 From: teckel12 Date: Mon, 16 Oct 2017 16:35:02 -0400 Subject: [PATCH 10/22] Maybe this will update the image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a20bb16b..6d0329c3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ![sample](http://www.leethost.com/link_pics/iNav2.png "Compass-based direction indicator") #### Taranis X9D, X9D+ & X9E -![sample](http://www.leethost.com/link_pics/iNav3.png "View on Taranis X9D, X9D+ & X9E") +![sample](http://www.leethost.com/link_pics/iNav3.png?1 "View on Taranis X9D, X9D+ & X9E") ## Features From 2c63a7317693a5929e25c735e084705eba0caf66 Mon Sep 17 00:00:00 2001 From: teckel12 Date: Mon, 16 Oct 2017 16:49:51 -0400 Subject: [PATCH 11/22] Manual clarification for changing telemetry sensor measurements --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6d0329c3..c6bbac4e 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ 1. With battery connected and **after GPS fix** [discover telemetry sensors](https://www.youtube.com/watch?v=n09q26Gh858) so all telemetry sensors are discovered 2. Telemetry distance sensor name must be changed from `0420` to `Dist` +3. `Dist`, `Alt`, `GAlt` & `Gspd` sensors can be changed from meters/kmh to feet/mph +4. **Don't** change `Tmp1` or `Tmp2` from celsius to fahrenheit, they're not really temperatures but used for flight modes and GPS information #### INAV Lua Telemetry Screen Setup From 00db10a808a88c8ccff89f4023d4741cc37a7eed Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Mon, 16 Oct 2017 19:16:00 -0400 Subject: [PATCH 12/22] Detect and report home reset with INAV v1.7.4 --- iNav.lua | 51 ++++++++++++++++++++++++++---------------------- iNav/homrst.wav | Bin 0 -> 28912 bytes 2 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 iNav/homrst.wav diff --git a/iNav.lua b/iNav.lua index 4a987e98..a656c4cd 100644 --- a/iNav.lua +++ b/iNav.lua @@ -22,6 +22,7 @@ local armedPrev = false local headingHoldPrev = false local headFreePrev = false local altHoldPrev = false +local homeResetPrev = false local gpsFixPrev = false local altNextPlay = 0 local battNextPlay = 0 @@ -91,18 +92,9 @@ local data = { altitude_unit = getTelemetryUnit("Alt"), distance_unit = getTelemetryUnit("Dist"), speed_unit = getTelemetryUnit("GSpd"), - timerStart = 0, - timer = 0, - distLastPositive = 0, - gpsHome = false, - gpsLatLon = false, - gpsFix = false, - headingRef = -1, showMax = false, showDir = true, - battlow = false, - showCurr = true, - fuel = 100 + showCurr = true } if data.current_id == -1 then @@ -115,11 +107,24 @@ data.battPos2 = data.showCurr and 49 or 41 data.distRef = data.distance_unit == 10 and 20 or 6 data.altAlert = data.altitude_unit == 10 and 400 or 123 +local function reset() + data.timerStart = 0 + data.timer = 0 + data.distLastPositive = 0 + data.gpsHome = false + data.gpsLatLon = false + data.gpsFix = false + data.headingRef = -1 + data.battlow = false + data.fuel = 100 +end + local function flightModes() armed = false headFree = false headingHold = false altHold = false + homeReset = false if data.telemetry then local modeA = data.mode / 10000 local modeB = data.mode / 1000 % 10 @@ -138,6 +143,7 @@ local function flightModes() headFree = bit32.band(modeB, 4) == 4 and true or false headingHold = bit32.band(modeC, 1) == 1 and true or false altHold = bit32.band(modeC, 2) == 2 and true or false + homeReset = bit32.band(modeA, 2) == 2 and true or false if bit32.band(modeC, 4) == 4 then data.modeId = altHold and 8 or 7 -- If also alt hold 3D hold else pos hold end @@ -202,6 +208,9 @@ local function flightModes() if headFree ~= headFreePrev then -- Head free status change playFile(WAVPATH .. (headFree and "hfact.wav" or "hfoff.wav")) end + if homeReset and not homeResetPrev then -- Home reset + playFile(WAVPATH .. "homrst.wav") + end if data.altitude + 0.5 >= data.altAlert then -- Altitude alert if getTime() > altNextPlay then playNumber(data.altitude + 0.5, data.altitude_unit) @@ -262,15 +271,19 @@ local function flightModes() battPercentPlayed = 100 end modeIdPrev = data.modeId - headingHoldPrev = headingHold + armedPrev = armed headFreePrev = headFree + headingHoldPrev = headingHold altHoldPrev = altHold - armedPrev = armed + homeResetPrev = homeReset gpsFixPrev = data.gpsFix end local function background() data.rssi = getValue(data.rssi_id) + if telemFlags == -1 then + reset() + end if data.rssi > 0 or telemFlags < 0 then data.telemetry = true data.mode = getValue(data.mode_id) @@ -440,15 +453,7 @@ local function run(event) end -- Initalize variables on long if not armed and event == EVT_ENTER_LONG then - data.timerStart = 0 - data.timer = 0 - data.distLastPositive = 0 - data.gpsHome = false - data.gpsLatLon = false - data.gpsFix = false - data.headingRef = -1 - data.battlow = false - data.fuel = 100 + reset() end end @@ -506,8 +511,8 @@ local function run(event) lcd.drawNumber(RXBATT_POS, 1, data.rxBatt * 10.05, SMLSIZE + PREC1 + INVERS) lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) end - + return 1 end -return {run = run, background = background} +return {run = run, background = background} \ No newline at end of file diff --git a/iNav/homrst.wav b/iNav/homrst.wav new file mode 100644 index 0000000000000000000000000000000000000000..aa48acc505e50168985a0e3ce4ba8d4a1e5062ba GIT binary patch literal 28912 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 Date: Tue, 17 Oct 2017 11:21:05 -0400 Subject: [PATCH 13/22] Variable changes, test to see about memory usage --- README.md | 4 +++- iNav.lua | 56 +++++++++++++++++++++++++++---------------------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index c6bbac4e..a59e170c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ * Launch/pilot-based model orientation and location indicators (great for lost orientation or if you lose site of your model) * Compass-based direction indicator * Bar gauges for Fuel (% battery mAh capacity remaining), Battery voltage, RSSI strength, Tx battery (and Altitude for X9D, X9D+ & X9E transmitters) -* Display and voice alerts for flight modes and other flight status information (altitude hold, heading hold, etc.) +* Display and voice alerts for flight modes and other flight status information (altitude hold, heading hold, home reset, etc.) * Voice notifications for % battery remaining (based on current), voltage low/critical, high altitude, lost GPS, ready to arm, armed, disarmed, etc. * GPS information: Satellites locked, GPS altitude, GPS coordinates * Display of current/maximum: Altitude, Distance, Speed and Current @@ -75,10 +75,12 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc * Optional amperage sensor needed for fuel and current displays * Uses transmitter settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings * Uses transmitter settings for transmitter voltage min/max for battery gauge in screen title +* INAV v1.8+ is required for `Home reset` voice notification ## Release History #### v1.1.5 +* Voice notification for `Home Reset` with INAV v1.8+ * Moved head free warning on Q X7 to top center * Better text centering and right justification technique * Cleaned up code saving more memory diff --git a/iNav.lua b/iNav.lua index a656c4cd..b348cb8b 100644 --- a/iNav.lua +++ b/iNav.lua @@ -19,10 +19,10 @@ local GPS_DIGITS = QX7 and 10000 or 1000000 local modeIdPrev = false local armedPrev = false -local headingHoldPrev = false -local headFreePrev = false -local altHoldPrev = false -local homeResetPrev = false +local headFree = { p=false } +local headingHold = { p=false } +local altHold = { p=false } +local homeReset = { p=false } local gpsFixPrev = false local altNextPlay = 0 local battNextPlay = 0 @@ -121,10 +121,10 @@ end local function flightModes() armed = false - headFree = false - headingHold = false - altHold = false - homeReset = false + headFree.c = false + headingHold.c = false + altHold.c = false + homeReset.c = false if data.telemetry then local modeA = data.mode / 10000 local modeB = data.mode / 1000 % 10 @@ -140,12 +140,12 @@ local function flightModes() else data.modeId = 4 -- Acro end - headFree = bit32.band(modeB, 4) == 4 and true or false - headingHold = bit32.band(modeC, 1) == 1 and true or false - altHold = bit32.band(modeC, 2) == 2 and true or false - homeReset = bit32.band(modeA, 2) == 2 and true or false + headFree.c = bit32.band(modeB, 4) == 4 and true or false + headingHold.c = bit32.band(modeC, 1) == 1 and true or false + altHold.c = bit32.band(modeC, 2) == 2 and true or false + homeReset.c = bit32.band(modeA, 2) == 2 and true or false if bit32.band(modeC, 4) == 4 then - data.modeId = altHold and 8 or 7 -- If also alt hold 3D hold else pos hold + data.modeId = altHold.c and 8 or 7 -- If also alt hold 3D hold else pos hold end end if bit32.band(modeE, 2) == 2 or modeE == 0 then @@ -197,18 +197,18 @@ local function flightModes() end if armed then data.timer = (getTime() - data.timerStart) / 100 -- Armed so update timer - if altHold ~= altHoldPrev and data.modeId ~= 8 then -- Alt hold status change + if altHold.c ~= altHold.p and data.modeId ~= 8 then -- Alt hold status change playFile(WAVPATH .. "althld.wav") - playFile(WAVPATH .. (altHold and "active.wav" or "off.wav")) + playFile(WAVPATH .. (altHold.c and "active.wav" or "off.wav")) end - if headingHold ~= headingHoldPrev then -- Heading hold status change + if headingHold.c ~= headingHold.p then -- Heading hold status change playFile(WAVPATH .. "hedhld.wav") - playFile(WAVPATH .. (headingHold and "active.wav" or "off.wav")) + playFile(WAVPATH .. (headingHold.c and "active.wav" or "off.wav")) end - if headFree ~= headFreePrev then -- Head free status change - playFile(WAVPATH .. (headFree and "hfact.wav" or "hfoff.wav")) + if headFree.c ~= headFree.p then -- Head free status change + playFile(WAVPATH .. (headFree.c and "hfact.wav" or "hfoff.wav")) end - if homeReset and not homeResetPrev then -- Home reset + if homeReset.c and not homeReset.p then -- Home reset playFile(WAVPATH .. "homrst.wav") end if data.altitude + 0.5 >= data.altAlert then -- Altitude alert @@ -251,7 +251,7 @@ local function flightModes() else battNextPlay = 0 end - if headFree or modes[data.modeId].f > 0 then + if headFree.c or modes[data.modeId].f > 0 then beep = true vibrate = true elseif data.rssi < data.rssiLow then @@ -272,10 +272,10 @@ local function flightModes() end modeIdPrev = data.modeId armedPrev = armed - headFreePrev = headFree - headingHoldPrev = headingHold - altHoldPrev = altHold - homeResetPrev = homeReset + headFree.p = headFree.c + headingHold.p = headingHold.c + altHold.p = altHold.c + homeReset.p = homeReset.c gpsFixPrev = data.gpsFix end @@ -357,7 +357,7 @@ local function drawDirection(heading, width, radius, x, y) local y3 = y - math.floor(math.cos(rad3) * radius + 0.5) lcd.drawLine(x1, y1, x2, y2, SOLID, FORCE) lcd.drawLine(x1, y1, x3, y3, SOLID, FORCE) - if headingHold then + if headingHold.c then lcd.drawFilledRectangle((x2 + x3) / 2 - 1.5, (y2 + y3) / 2 - 1.5, 4, 4, SOLID) else lcd.drawLine(x2, y2, x3, y3, DOTTED, FORCE) @@ -438,7 +438,7 @@ local function run(event) lcd.drawText(0, 0, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) local x = MODE_POS - (lcd.getLastPos() / 2) lcd.drawText(x, 33, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) - if headFree then + if headFree.c then if QX7 then lcd.drawText(63, 9, "HF", SMLSIZE + FLASH) else @@ -462,7 +462,7 @@ local function run(event) local battFlags = (telemFlags > 0 or data.battlow) and FLASH or 0 local rssiFlags = (telemFlags > 0 or data.rssi < data.rssiLow) and FLASH or 0 drawData("Altd", 9, 1, data.altitude, data.altitudeMax, 1000, units[data.altitude_unit], false, altFlags) - if altHold then + if altHold.c then lcd.drawText(lcd.getLastPos() + 1, 9, "\192", SMLSIZE + INVERS) end drawData("Dist", data.distPos, 1, data.distLastPositive, data.distanceMax, 1000, units[data.distance_unit], false, telemFlags) From 4e88641c1494ee7146f4c30a3acccb00dd547603 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Tue, 17 Oct 2017 19:55:59 -0400 Subject: [PATCH 14/22] Added passthru mode and general memory tweaks --- iNav.lua | 87 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/iNav.lua b/iNav.lua index b348cb8b..ffdac0a3 100644 --- a/iNav.lua +++ b/iNav.lua @@ -10,19 +10,18 @@ local TIMER_POS = QX7 and 60 or 150 local RXBATT_POS = LCD_W - 17 local RIGHT_POS = QX7 and 129 or 195 local GAUGE_WIDTH = QX7 and 82 or 149 -local MODE_POS = QX7 and 67 or 106 local MODE_SIZE = QX7 and SMLSIZE or 0 local X_CNTR_1 = QX7 and 67 or 70 -local X_CNTR_2 = QX7 and 67 or 135 -local X_CNTR_3 = QX7 and 67 or 107 +local X_CNTR_2 = QX7 and 67 or 106 +local X_CNTR_3 = QX7 and 67 or 135 local GPS_DIGITS = QX7 and 10000 or 1000000 -local modeIdPrev = false +local modeIdPrev local armedPrev = false -local headFree = { p=false } -local headingHold = { p=false } -local altHold = { p=false } -local homeReset = { p=false } +local headFreePrev = false +local headingHoldPrev = false +local altHoldPrev = false +local homeResetPrev local gpsFixPrev = false local altNextPlay = 0 local battNextPlay = 0 @@ -43,6 +42,7 @@ local modes = { { t="POS HOLD", f=0, w="poshld.wav" }, { t="3D HOLD", f=0, w="3dhold.wav" }, { t="WAYPOINT", f=0, w="waypt.wav" }, + { t="PASSTHRU", f=0, w=false }, { t=" RTH ", f=FLASH, w="rtl.wav" }, { t="FAILSAFE", f=FLASH, w="fson.wav" } } @@ -121,10 +121,10 @@ end local function flightModes() armed = false - headFree.c = false - headingHold.c = false - altHold.c = false - homeReset.c = false + headFree = false + headingHold = false + altHold = false + local homeReset = false if data.telemetry then local modeA = data.mode / 10000 local modeB = data.mode / 1000 % 10 @@ -140,23 +140,22 @@ local function flightModes() else data.modeId = 4 -- Acro end - headFree.c = bit32.band(modeB, 4) == 4 and true or false - headingHold.c = bit32.band(modeC, 1) == 1 and true or false - altHold.c = bit32.band(modeC, 2) == 2 and true or false - homeReset.c = bit32.band(modeA, 2) == 2 and true or false + headFree = bit32.band(modeB, 4) == 4 and true or false + headingHold = bit32.band(modeC, 1) == 1 and true or false + altHold = bit32.band(modeC, 2) == 2 and true or false + homeReset = bit32.band(modeA, 2) == 2 and true or false if bit32.band(modeC, 4) == 4 then - data.modeId = altHold.c and 8 or 7 -- If also alt hold 3D hold else pos hold + data.modeId = altHold and 8 or 7 -- If also alt hold 3D hold else pos hold end - end - if bit32.band(modeE, 2) == 2 or modeE == 0 then - data.modeId = 5 -- Not OK to arm - elseif not armed then - data.modeId = 6 -- Ready to fly + else + data.modeId = (bit32.band(modeE, 2) == 2 or modeE == 0) and 5 or 6 -- Not OK to arm / Ready to fly end if bit32.band(modeA, 4) == 4 then - data.modeId = 11 -- Failsafe + data.modeId = 12 -- Failsafe elseif bit32.band(modeB, 1) == 1 then - data.modeId = 10 -- RTH + data.modeId = 11 -- RTH + elseif bit32.band(modeD, 4) == 4 then + data.modeId = 10 -- Passthru elseif bit32.band(modeB, 2) == 2 then data.modeId = 9 -- Waypoint end @@ -188,7 +187,7 @@ local function flightModes() playFile(WAVPATH .. "gps.wav") playFile(WAVPATH .. (data.gpsFix and "good.wav" or "lost.wav")) end - if modeIdPrev and modeIdPrev ~= data.modeId then -- New flight mode + if modeIdPrev ~= data.modeId then -- New flight mode if armed and modes[data.modeId].w then playFile(WAVPATH .. modes[data.modeId].w) elseif not armed and data.modeId == 6 and modeIdPrev == 5 then @@ -197,18 +196,18 @@ local function flightModes() end if armed then data.timer = (getTime() - data.timerStart) / 100 -- Armed so update timer - if altHold.c ~= altHold.p and data.modeId ~= 8 then -- Alt hold status change + if altHold ~= altHoldPrev and data.modeId ~= 8 then -- Alt hold status change playFile(WAVPATH .. "althld.wav") - playFile(WAVPATH .. (altHold.c and "active.wav" or "off.wav")) + playFile(WAVPATH .. (altHold and "active.wav" or "off.wav")) end - if headingHold.c ~= headingHold.p then -- Heading hold status change + if headingHold ~= headingHoldPrev then -- Heading hold status change playFile(WAVPATH .. "hedhld.wav") - playFile(WAVPATH .. (headingHold.c and "active.wav" or "off.wav")) + playFile(WAVPATH .. (headingHold and "active.wav" or "off.wav")) end - if headFree.c ~= headFree.p then -- Head free status change - playFile(WAVPATH .. (headFree.c and "hfact.wav" or "hfoff.wav")) + if headFree ~= headFreePrev then -- Head free status change + playFile(WAVPATH .. (headFree and "hfact.wav" or "hfoff.wav")) end - if homeReset.c and not homeReset.p then -- Home reset + if homeReset and not homeResetPrev then -- Home reset playFile(WAVPATH .. "homrst.wav") end if data.altitude + 0.5 >= data.altAlert then -- Altitude alert @@ -251,7 +250,7 @@ local function flightModes() else battNextPlay = 0 end - if headFree.c or modes[data.modeId].f > 0 then + if headFree or modes[data.modeId].f > 0 then beep = true vibrate = true elseif data.rssi < data.rssiLow then @@ -272,10 +271,10 @@ local function flightModes() end modeIdPrev = data.modeId armedPrev = armed - headFree.p = headFree.c - headingHold.p = headingHold.c - altHold.p = altHold.c - homeReset.p = homeReset.c + headFreePrev = headFree + headingHoldPrev = headingHold + altHoldPrev = altHold + homeResetPrev = homeReset gpsFixPrev = data.gpsFix end @@ -357,7 +356,7 @@ local function drawDirection(heading, width, radius, x, y) local y3 = y - math.floor(math.cos(rad3) * radius + 0.5) lcd.drawLine(x1, y1, x2, y2, SOLID, FORCE) lcd.drawLine(x1, y1, x3, y3, SOLID, FORCE) - if headingHold.c then + if headingHold then lcd.drawFilledRectangle((x2 + x3) / 2 - 1.5, (y2 + y3) / 2 - 1.5, 4, 4, SOLID) else lcd.drawLine(x2, y2, x3, y3, DOTTED, FORCE) @@ -412,7 +411,7 @@ local function run(event) end if not data.showDir or data.headingRef >= 0 or not QX7 then if not indicatorDisplayed or not QX7 then - drawDirection(data.heading - data.headingRef, 145, 8, X_CNTR_2, 19) + drawDirection(data.heading - data.headingRef, 145, 8, X_CNTR_3, 19) end end end @@ -426,9 +425,9 @@ local function run(event) local x = (math.cos(o1) * math.sin(o2)) - (math.sin(o1) * math.cos(o2) * math.cos(a2 - a1)) local bearing = math.deg(math.atan2(y, x)) - data.headingRef local rad1 = math.rad(bearing) - local x1 = math.floor(math.sin(rad1) * 10 + 0.5) + X_CNTR_3 + local x1 = math.floor(math.sin(rad1) * 10 + 0.5) + X_CNTR_2 local y1 = 19 - math.floor(math.cos(rad1) * 10 + 0.5) - lcd.drawLine(X_CNTR_3, 19, x1, y1, DOTTED, FORCE) + lcd.drawLine(X_CNTR_2, 19, x1, y1, DOTTED, FORCE) lcd.drawFilledRectangle(x1 - 1, y1 - 1, 3, 3, ERASE) lcd.drawFilledRectangle(x1 - 1, y1 - 1, 3, 3, SOLID) end @@ -436,9 +435,9 @@ local function run(event) -- Flight mode lcd.drawText(0, 0, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) - local x = MODE_POS - (lcd.getLastPos() / 2) + local x = X_CNTR_2 - (lcd.getLastPos() / 2) lcd.drawText(x, 33, modes[data.modeId].t, MODE_SIZE + modes[data.modeId].f) - if headFree.c then + if headFree then if QX7 then lcd.drawText(63, 9, "HF", SMLSIZE + FLASH) else @@ -462,7 +461,7 @@ local function run(event) local battFlags = (telemFlags > 0 or data.battlow) and FLASH or 0 local rssiFlags = (telemFlags > 0 or data.rssi < data.rssiLow) and FLASH or 0 drawData("Altd", 9, 1, data.altitude, data.altitudeMax, 1000, units[data.altitude_unit], false, altFlags) - if altHold.c then + if altHold then lcd.drawText(lcd.getLastPos() + 1, 9, "\192", SMLSIZE + INVERS) end drawData("Dist", data.distPos, 1, data.distLastPositive, data.distanceMax, 1000, units[data.distance_unit], false, telemFlags) From 57bb1d838815bf3ce15ad59c5a280d17374a5b45 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Tue, 17 Oct 2017 21:43:03 -0400 Subject: [PATCH 15/22] Forced always showing % and dB for fuel and RSSI --- iNav.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iNav.lua b/iNav.lua index ffdac0a3..56122114 100644 --- a/iNav.lua +++ b/iNav.lua @@ -467,10 +467,10 @@ local function run(event) drawData("Dist", data.distPos, 1, data.distLastPositive, data.distanceMax, 1000, units[data.distance_unit], false, telemFlags) drawData("Sped", data.speedPos, 1, data.speed, data.speedMax, 100, units[data.speed_unit], false, telemFlags) drawData("Batt", data.battPos1, 2, data.batt, data.battMin, 100, "V", true, battFlags) - drawData("RSSI", 57, 2, data.rssiLast, data.rssiMin, 100, "dB", false, rssiFlags) + drawData("RSSI", 57, 2, data.rssiLast, data.rssiMin, 200, "dB", false, rssiFlags) if data.showCurr then drawData("Curr", 33, 1, data.current, data.currentMax, 100, "A", true, telemFlags) - drawData("Fuel", 41, 0, data.fuel, 0, 100, "%", false, battFlags) + drawData("Fuel", 41, 0, data.fuel, 0, 200, "%", false, battFlags) lcd.drawGauge(46, 41, GAUGE_WIDTH, 7, math.min(data.fuel, 98), 100) if data.fuel == 0 then lcd.drawLine(47, 42, 47, 46, SOLID, ERASE) From 9fce7d753d5261c727077b955e1826b837d1385d Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Tue, 17 Oct 2017 22:24:44 -0400 Subject: [PATCH 16/22] Fixed beep and heptic feedback for warning flight modes --- iNav.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iNav.lua b/iNav.lua index 56122114..d175c724 100644 --- a/iNav.lua +++ b/iNav.lua @@ -250,7 +250,7 @@ local function flightModes() else battNextPlay = 0 end - if headFree or modes[data.modeId].f > 0 then + if headFree or modes[data.modeId].f ~= 0 then beep = true vibrate = true elseif data.rssi < data.rssiLow then From 1ac2e35bb8e74e85d32e84814593c5605769ff61 Mon Sep 17 00:00:00 2001 From: teckel12 Date: Fri, 20 Oct 2017 17:19:51 -0400 Subject: [PATCH 17/22] Number display changes --- iNav.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/iNav.lua b/iNav.lua index d175c724..904f706c 100644 --- a/iNav.lua +++ b/iNav.lua @@ -303,7 +303,7 @@ local function background() data.speedMax = getValue(data.speedMax_id) data.batt = getValue(data.batt_id) data.battMin = getValue(data.battMin_id) - data.cells = math.floor(data.batt/4.3) + 1 + data.cells = math.floor(data.batt / 4.3) + 1 data.cell = data.batt/data.cells data.cellMin = data.battMin/data.cells data.rssiMin = getValue(data.rssiMin_id) @@ -319,8 +319,8 @@ local function background() end -- Dist doesn't have a known unit so the transmitter doesn't auto-convert if data.distance_unit == 10 then - data.distance = math.floor(data.distance * 3.28084 + 0.5) - data.distanceMax = math.floor(data.distanceMax * 3.28084 + 0.5) + data.distance = data.distance * 3.28084 + data.distanceMax = data.distanceMax * 3.28084 end if data.distance > 0 then data.distLastPositive = data.distance @@ -369,12 +369,12 @@ local function drawData(txt, y, dir, vc, vm, max, ext, frac, flags) vc = vm lcd.drawText(14, y, dir == 1 and "\192" or "\193", SMLSIZE) end - if frac then - lcd.drawNumber(22, y, vc * 10.05, SMLSIZE + PREC1 + flags) + if frac and vc + 0.5 < max then + lcd.drawNumber(22, y, vc * 10.01, SMLSIZE + PREC1 + flags) else lcd.drawText(22, y, math.floor(vc + 0.5), SMLSIZE + flags) end - if vc < max then + if frac or vc < max then lcd.drawText(lcd.getLastPos(), y, ext, SMLSIZE + flags) end end @@ -503,11 +503,11 @@ local function run(event) lcd.drawLine(i, 2, i, 5, SOLID, FORCE) end if not QX7 then - lcd.drawNumber(110 , 1, data.txBatt * 10.05, SMLSIZE + PREC1 + INVERS) + lcd.drawNumber(110 , 1, data.txBatt * 10.01, SMLSIZE + PREC1 + INVERS) lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) end if data.rxBatt > 0 and data.telemetry then - lcd.drawNumber(RXBATT_POS, 1, data.rxBatt * 10.05, SMLSIZE + PREC1 + INVERS) + lcd.drawNumber(RXBATT_POS, 1, data.rxBatt * 10.01, SMLSIZE + PREC1 + INVERS) lcd.drawText(lcd.getLastPos(), 1, "V", SMLSIZE + INVERS) end From 2af8e9917a80bc94aef7b56bc0af183c9cd10028 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Fri, 20 Oct 2017 18:26:51 -0400 Subject: [PATCH 18/22] Read image link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a59e170c..f772f8d4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ![sample](http://www.leethost.com/link_pics/iNav2.png "Compass-based direction indicator") #### Taranis X9D, X9D+ & X9E -![sample](http://www.leethost.com/link_pics/iNav3.png?1 "View on Taranis X9D, X9D+ & X9E") +![sample](http://www.leethost.com/link_pics/iNav3.png "View on Taranis X9D, X9D+ & X9E") ## Features From 89d85d522ec595f9c4fc995b5d1a203b40bb3352 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Fri, 20 Oct 2017 18:27:56 -0400 Subject: [PATCH 19/22] Nope, need to change the link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f772f8d4..a59e170c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ![sample](http://www.leethost.com/link_pics/iNav2.png "Compass-based direction indicator") #### Taranis X9D, X9D+ & X9E -![sample](http://www.leethost.com/link_pics/iNav3.png "View on Taranis X9D, X9D+ & X9E") +![sample](http://www.leethost.com/link_pics/iNav3.png?1 "View on Taranis X9D, X9D+ & X9E") ## Features From 1ff101a0e26f5a77e099ba083fd9b45d50a4b9f2 Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Fri, 20 Oct 2017 18:29:29 -0400 Subject: [PATCH 20/22] Readme version updates --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a59e170c..2448178b 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc #### v1.1.5 * Voice notification for `Home Reset` with INAV v1.8+ * Moved head free warning on Q X7 to top center +* Values convert from decimal to integer when larger to allow for more room * Better text centering and right justification technique * Cleaned up code saving more memory #### v1.1.4 - 10/13/2017 From 2bc5736196ac5b63a22a1e4b53ff6354a6c11e4b Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Fri, 20 Oct 2017 18:34:00 -0400 Subject: [PATCH 21/22] Readme tweaks --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2448178b..0b2631f0 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc ## Tips & Notes -* Between flights, you can long-press the Enter/dial and select `Reset telemetry` +* Between flights (before armed), long-press the Enter/dial and select `Reset telemetry` to reset telemetry values * Designed for multirotor models, but should be valuable for fixed wing (fixed wing feedback appreciated) * Optional amperage sensor needed for fuel and current displays * Uses transmitter settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings @@ -87,7 +87,7 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc * Cleaned up code saving more memory #### v1.1.4 - 10/13/2017 * More accurate max altitude alerts and altitude flashes when above max altitude -* Long-press resets values +* Long-press resets values (suggest doing this between flights before armed) #### v1.1.3 - 10/10/2017 * Shows metric or imperial values based on transmitter telemetry settings #### v1.1.2 - 10/06/2017 From fd825c238cf83c452fb3e376ac5ad36589f8c20c Mon Sep 17 00:00:00 2001 From: Tim Eckel Date: Fri, 20 Oct 2017 18:35:34 -0400 Subject: [PATCH 22/22] Readme tweaks #2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b2631f0..3360d12a 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Using transmitter firmware with `luac` included will reduce memory usage and inc * Between flights (before armed), long-press the Enter/dial and select `Reset telemetry` to reset telemetry values * Designed for multirotor models, but should be valuable for fixed wing (fixed wing feedback appreciated) -* Optional amperage sensor needed for fuel and current displays +* Optional (but highly suggested) amperage sensor needed for fuel and current displays * Uses transmitter settings for RSSI warning/critical levels for bar gauge range and audio/haptic warnings * Uses transmitter settings for transmitter voltage min/max for battery gauge in screen title * INAV v1.8+ is required for `Home reset` voice notification