]> git.mxchange.org Git - flightgear.git/commitdiff
Clean up indentation and then replace tabs with spaces
authorDave Luff <daveluff@ntlworld.com>
Sun, 21 Nov 2010 14:16:43 +0000 (14:16 +0000)
committerDave Luff <daveluff@ntlworld.com>
Sun, 21 Nov 2010 14:16:43 +0000 (14:16 +0000)
src/Instrumentation/KLN89/kln89_page_fpl.cxx

index 86e6178c7343603d04331d6ea567769c7ad13386..f463b155fa711c42d8166a1cfc4f142801b4cd9b 100644 (file)
@@ -34,469 +34,469 @@ using namespace std;
 
 KLN89FplPage::KLN89FplPage(KLN89* parent)
 : KLN89Page(parent) {
-       _nSubPages = 26;
-       _subPage = 0;
-       _name = "FPL";
-       _fpMode = 0;
-       _actFpMode = 0;
-       _wLinePos = 0;
-       _bEntWp = false;
-       _bEntExp = false;
-       _entWp = NULL;
-       _fplPos = 0;
-       _resetFplPos0 = true;
-       _delFP = false;
-       _delWp = false;
-       _delAppr = false;
-       _changeAppr = false;
-       _fp0SelWpId = "";
+    _nSubPages = 26;
+    _subPage = 0;
+    _name = "FPL";
+    _fpMode = 0;
+    _actFpMode = 0;
+    _wLinePos = 0;
+    _bEntWp = false;
+    _bEntExp = false;
+    _entWp = NULL;
+    _fplPos = 0;
+    _resetFplPos0 = true;
+    _delFP = false;
+    _delWp = false;
+    _delAppr = false;
+    _changeAppr = false;
+    _fp0SelWpId = "";
 }
 
 KLN89FplPage::~KLN89FplPage() {
 }
 
 void KLN89FplPage::Update(double dt) {
-       Calc();
-       
-       // NOTE - we need to draw the active leg arrow outside of this block to avoid the _delFP check.
-       // TODO - we really ought to merge the page 0 and other pages drawing code with a couple of lines of extra logic.
-       if(_subPage == 0 && !_delFP) {  // Note that in the _delFP case, the active flightplan gets a header, and hence the same geometry as the other fps, so we draw it there.
-               // active FlightPlan
-               // NOTE THAT FOR THE ACTIVE FLIGHT PLAN, TOP POSITION IS STILL 4 in the underline position scheme, to make 
-               // copy and paste easier!!!!
+    Calc();
+    
+    // NOTE - we need to draw the active leg arrow outside of this block to avoid the _delFP check.
+    // TODO - we really ought to merge the page 0 and other pages drawing code with a couple of lines of extra logic.
+    if(_subPage == 0 && !_delFP) {  // Note that in the _delFP case, the active flightplan gets a header, and hence the same geometry as the other fps, so we draw it there.
+        // active FlightPlan
+        // NOTE THAT FOR THE ACTIVE FLIGHT PLAN, TOP POSITION IS STILL 4 in the underline position scheme, to make 
+        // copy and paste easier!!!!
 
-               // ---------------------------------- Copy the active FlightPlan and insert approach header and fence if required ---------------
-               // For synatical convienience
-               //vector<GPSWaypoint*> waylist = _kln89->_flightPlans[_subPage]->waypoints;
-               // Copy every waypoint for now.
+        // ---------------------------------- Copy the active FlightPlan and insert approach header and fence if required ---------------
+        // For synatical convienience
+        //vector<GPSWaypoint*> waylist = _kln89->_flightPlans[_subPage]->waypoints;
+        // Copy every waypoint for now.
         // This is inefficient, but allows us to insert dummy waypoints to represent the header and fence 
-               // in our *local copy* of the flightplan, if an approach is loaded.  There must be a better way to do this!!!!
-               vector<GPSWaypoint> waylist;
-               for(unsigned int i=0; i<_kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
-                       waylist.push_back(*_kln89->_flightPlans[_subPage]->waypoints[i]);
-               }
-               _hdrPos = -1;
-               _fencePos = -1;
-               if(_kln89->_approachLoaded) {
-                       GPSWaypoint wp;
-                       wp.id = "HHHH";
-                       wp.type = GPS_WP_VIRT;
-                       wp.appType = GPS_HDR;
-                       for(unsigned int i=0; i<waylist.size(); ++i) {
-                               // Insert the hdr immediately before the IAF
-                               if(waylist[i].appType == GPS_IAF) {
-                                       waylist.insert(waylist.begin()+i, wp);
-                                       // Need to insert empty string into the params to keep them in sync
-                                       // Guard against empty params list.
-                                       // This shouldn't happen, but currently it can until ETE and UTC params are implemeted
-                                       // (and better the ugly params list ripped out and replaced with something more maintainable!).
-                                       if(!_params.empty()) {
-                                               _params.insert(_params.begin()+i-1, "");
-                                       }
-                                       _hdrPos = i;
-                                       break;
-                               }
-                       }
-                       wp.id = "FFFF";
-                       wp.type = GPS_WP_VIRT;
-                       wp.appType = GPS_FENCE;
-                       for(unsigned int i=0; i<waylist.size(); ++i) {
-                               // Insert the fence between the MAF and the MAP
-                               if(waylist[i].appType == GPS_MAHP) {
-                                       waylist.insert(waylist.begin()+i, wp);
-                                       // Need to insert empty string into the params to keep them in sync
-                                       // Guard against empty params list. See comments a few lines above.
-                                       if(!_params.empty()) {
-                                               _params.insert(_params.begin()+i-1, "");
-                                       }
-                                       _fencePos = i;
-                                       break;
-                               }
-                       }
-               }
-               /*
-               // Now make up a vector of waypoint numbers, since they aren't aligned with list position anymore
-               int num = 0;
-               vector<int> numlist;
-               numlist.clear();
-               for(unsigned int i=0; i<waylist.size(); ++i) {
-                       if(waylist[i].appType != GPS_HDR && waylist[i].appType != GPS_FENCE) {
-                               numlist.push_back(num);
-                               num++;
-                       } else {
-                               numlist.push_back(-1);
-                       }
-               }
-               */
-               int hfcount = 0;
-               for(unsigned int i=0; i<waylist.size(); ++i) {
-                       //cout << i + 1 - hfcount << ":  ID= " << waylist[i].id;
-                       if(waylist[i].appType == GPS_HDR) {
-                               hfcount++;
-                               //cout << " HDR!";
-                       }
-                       if(waylist[i].appType == GPS_FENCE) {
-                               hfcount++;
-                               //cout << " FENCE!";
-                       }
-                       //cout << '\n';
-               }
-               //----------------------------------------- end active FP copy ------------------------------------------------
-               
-               // Recalculate which waypoint is displayed at the top of the list if required (generally if this page has lost focus).
-               int idx = _kln89->GetActiveWaypointIndex();
-               if(_resetFplPos0) {
-                       if(waylist.size() <= 1) {
-                               _fplPos = 0;
-                       } else if(waylist.size() <= 4) {
-                               _fplPos = 1;
-                       } else {
-                               // Make the active waypoint the second WP displayed
-                               _fplPos = idx;
-                               if(_fplPos != 0) {
-                                       _fplPos--;
-                               }
-                       }
-                       //cout << "HeaderPos = " << _hdrPos << ", fencePos = " << _fencePos << ", _fplPos = " << _fplPos << ", active waypoint index = " << _parent->GetActiveWaypointIndex() << '\n';
-                       if(_hdrPos >= 0 && idx >= _hdrPos) {
-                               _fplPos++;
-                               if(_fencePos >= 0 && (idx + 1) >= _fencePos) {
-                                       _fplPos++;
-                               }
-                       }
-                       _resetFplPos0 = false;
-               }
-               
-               // Increment the active waypoint position if required due hdr and fence here not above so it gets called every frame
-               if(_hdrPos >= 0 && idx >= _hdrPos) {
-                       idx++;
-                       if(_fencePos >= 0 && idx >= _fencePos) {
-                               idx++;
-                       }
-               }
-               
-               // Draw the leg arrow etc
-               int diff = idx - (int)_fplPos;
-               int drawPos = -1;
-               if(idx < 0) {
-                       // No active waypoint
-               } else if(diff < 0) {
-                       // Off screen to the top
-               } else if(diff > 2) {
-                       // TODO !
-               } else {
-                       drawPos = diff;
-               }
-               // Only the head is blinked during waypoint alerting
-               if(!(_kln89->_waypointAlert && _kln89->_blink)) {
-                       _kln89->DrawSpecialChar(4, 2, 0, 3-drawPos);
-               }
-               // If the active waypoint is immediately after an approach header then we need to do an extra-long tail leg
-               if(_hdrPos >= 0 && idx == _hdrPos + 1) {
-                       if(drawPos > 0 && !_kln89->_dto) _kln89->DrawLongLegTail(3-drawPos);
-               } else {
-                       if(drawPos > 0 && !_kln89->_dto) _kln89->DrawLegTail(3-drawPos);
-               }
-               
-               //cout << "Top pos is " << _fplPos0 << ' ';
-               
-               if(_kln89->_mode == KLN89_MODE_CRSR) {
-                       if(_uLinePos == 3) {
-                               _kln89->Underline(2, 13, 3, 3);
-                       } else if(_uLinePos >= 4) {
-                               if(_bEntWp) {
-                                       if(_wLinePos == 0) {
-                                               _kln89->Underline(2, 5, 3 - (_uLinePos - 4), 4);
-                                       } else if(_wLinePos == 4) {
-                                               _kln89->Underline(2, 4, 3 - (_uLinePos - 4), 4);
-                                       } else {
-                                               _kln89->Underline(2, 4, 3 - (_uLinePos - 4), _wLinePos);
-                                               _kln89->Underline(2, 5 + _wLinePos, 3 - (_uLinePos - 4), 4 - _wLinePos);
-                                       }
-                                       if(!_kln89->_blink) {
-                                               //_kln89->DrawText(_entWp->id, 2, 4, 2 - (_uLinePos - 4), false, _wLinePos);
-                                               _kln89->DrawEnt();
-                                       }
-                               } else {
-                                       _kln89->Underline(2, 4, 3 - (_uLinePos - 4), 5);
-                               }
-                       }
-               }
-               // ----------------------------------
-                       
-               // Sanity check the top position - remember that we can have an extra blank one at the bottom even if CRSR is off if crsr is switched on then off
-               if((int)_fplPos > ((int)waylist.size()) - 3) _fplPos = (((int)waylist.size()) - 3 < 0 ? 0 : waylist.size() - 3);
-               unsigned int last_pos;
-               if(waylist.empty()) {
-                       last_pos = 0;
-               } else {
-                       last_pos = ((int)_fplPos == ((int)waylist.size()) - 3 ? waylist.size() : waylist.size() - 1);
-               }
-               //cout << "Initialising last_pos, last_pos = " << last_pos << '\n';
-               if(waylist.size() < 4) last_pos = waylist.size();
-               
-               // Don't draw the cyclic field header if the top waypoint is the approach header
-               // Not sure if this also applies to the fence - don't think so but TODO - check!
-               if(!waylist.empty() && _fplPos < waylist.size()) {
-                       if(waylist[_fplPos].appType != GPS_HDR) {
-                               _kln89->DrawChar('>', 2, 12, 3);
-                               if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 3 && _kln89->_blink)) {
-                                       DrawFpMode(3);
-                               }
-                       }
-               }
-               
-               //
-               // NOTE: this is the drawing routine for the ACTIVE flightplan, due to the number
-               // of differences there is a seperate routine for the stored flightplans.
-               //
-               // There are 4 rows to display flightplan data on the KLN89.  Draw each row.
-               for(unsigned int i=0; i<4; ++i) {
-                       // Sanity check - we should no longer tickle this.
-                       if((_fplPos+i) > waylist.size()) {
-                               break;
-                       }
+        // in our *local copy* of the flightplan, if an approach is loaded.  There must be a better way to do this!!!!
+        vector<GPSWaypoint> waylist;
+        for(unsigned int i=0; i<_kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
+            waylist.push_back(*_kln89->_flightPlans[_subPage]->waypoints[i]);
+        }
+        _hdrPos = -1;
+        _fencePos = -1;
+        if(_kln89->_approachLoaded) {
+            GPSWaypoint wp;
+            wp.id = "HHHH";
+            wp.type = GPS_WP_VIRT;
+            wp.appType = GPS_HDR;
+            for(unsigned int i=0; i<waylist.size(); ++i) {
+                // Insert the hdr immediately before the IAF
+                if(waylist[i].appType == GPS_IAF) {
+                    waylist.insert(waylist.begin()+i, wp);
+                    // Need to insert empty string into the params to keep them in sync
+                    // Guard against empty params list.
+                    // This shouldn't happen, but currently it can until ETE and UTC params are implemeted
+                    // (and better the ugly params list ripped out and replaced with something more maintainable!).
+                    if(!_params.empty()) {
+                        _params.insert(_params.begin()+i-1, "");
+                    }
+                    _hdrPos = i;
+                    break;
+                }
+            }
+            wp.id = "FFFF";
+            wp.type = GPS_WP_VIRT;
+            wp.appType = GPS_FENCE;
+            for(unsigned int i=0; i<waylist.size(); ++i) {
+                // Insert the fence between the MAF and the MAP
+                if(waylist[i].appType == GPS_MAHP) {
+                    waylist.insert(waylist.begin()+i, wp);
+                    // Need to insert empty string into the params to keep them in sync
+                    // Guard against empty params list. See comments a few lines above.
+                    if(!_params.empty()) {
+                        _params.insert(_params.begin()+i-1, "");
+                    }
+                    _fencePos = i;
+                    break;
+                }
+            }
+        }
+        /*
+        // Now make up a vector of waypoint numbers, since they aren't aligned with list position anymore
+        int num = 0;
+        vector<int> numlist;
+        numlist.clear();
+        for(unsigned int i=0; i<waylist.size(); ++i) {
+            if(waylist[i].appType != GPS_HDR && waylist[i].appType != GPS_FENCE) {
+                numlist.push_back(num);
+                num++;
+            } else {
+                numlist.push_back(-1);
+            }
+        }
+        */
+        int hfcount = 0;
+        for(unsigned int i=0; i<waylist.size(); ++i) {
+            //cout << i + 1 - hfcount << ":  ID= " << waylist[i].id;
+            if(waylist[i].appType == GPS_HDR) {
+                hfcount++;
+                //cout << " HDR!";
+            }
+            if(waylist[i].appType == GPS_FENCE) {
+                hfcount++;
+                //cout << " FENCE!";
+            }
+            //cout << '\n';
+        }
+        //----------------------------------------- end active FP copy ------------------------------------------------
+        
+        // Recalculate which waypoint is displayed at the top of the list if required (generally if this page has lost focus).
+        int idx = _kln89->GetActiveWaypointIndex();
+        if(_resetFplPos0) {
+            if(waylist.size() <= 1) {
+                _fplPos = 0;
+            } else if(waylist.size() <= 4) {
+                _fplPos = 1;
+            } else {
+                // Make the active waypoint the second WP displayed
+                _fplPos = idx;
+                if(_fplPos != 0) {
+                    _fplPos--;
+                }
+            }
+            //cout << "HeaderPos = " << _hdrPos << ", fencePos = " << _fencePos << ", _fplPos = " << _fplPos << ", active waypoint index = " << _parent->GetActiveWaypointIndex() << '\n';
+            if(_hdrPos >= 0 && idx >= _hdrPos) {
+                _fplPos++;
+                if(_fencePos >= 0 && (idx + 1) >= _fencePos) {
+                    _fplPos++;
+                }
+            }
+            _resetFplPos0 = false;
+        }
+        
+        // Increment the active waypoint position if required due hdr and fence here not above so it gets called every frame
+        if(_hdrPos >= 0 && idx >= _hdrPos) {
+            idx++;
+            if(_fencePos >= 0 && idx >= _fencePos) {
+                idx++;
+            }
+        }
+        
+        // Draw the leg arrow etc
+        int diff = idx - (int)_fplPos;
+        int drawPos = -1;
+        if(idx < 0) {
+            // No active waypoint
+        } else if(diff < 0) {
+            // Off screen to the top
+        } else if(diff > 2) {
+            // TODO !
+        } else {
+            drawPos = diff;
+        }
+        // Only the head is blinked during waypoint alerting
+        if(!(_kln89->_waypointAlert && _kln89->_blink)) {
+            _kln89->DrawSpecialChar(4, 2, 0, 3-drawPos);
+        }
+        // If the active waypoint is immediately after an approach header then we need to do an extra-long tail leg
+        if(_hdrPos >= 0 && idx == _hdrPos + 1) {
+            if(drawPos > 0 && !_kln89->_dto) _kln89->DrawLongLegTail(3-drawPos);
+        } else {
+            if(drawPos > 0 && !_kln89->_dto) _kln89->DrawLegTail(3-drawPos);
+        }
+        
+        //cout << "Top pos is " << _fplPos0 << ' ';
+        
+        if(_kln89->_mode == KLN89_MODE_CRSR) {
+            if(_uLinePos == 3) {
+                _kln89->Underline(2, 13, 3, 3);
+            } else if(_uLinePos >= 4) {
+                if(_bEntWp) {
+                    if(_wLinePos == 0) {
+                        _kln89->Underline(2, 5, 3 - (_uLinePos - 4), 4);
+                    } else if(_wLinePos == 4) {
+                        _kln89->Underline(2, 4, 3 - (_uLinePos - 4), 4);
+                    } else {
+                        _kln89->Underline(2, 4, 3 - (_uLinePos - 4), _wLinePos);
+                        _kln89->Underline(2, 5 + _wLinePos, 3 - (_uLinePos - 4), 4 - _wLinePos);
+                    }
+                    if(!_kln89->_blink) {
+                        //_kln89->DrawText(_entWp->id, 2, 4, 2 - (_uLinePos - 4), false, _wLinePos);
+                        _kln89->DrawEnt();
+                    }
+                } else {
+                    _kln89->Underline(2, 4, 3 - (_uLinePos - 4), 5);
+                }
+            }
+        }
+        // ----------------------------------
+            
+        // Sanity check the top position - remember that we can have an extra blank one at the bottom even if CRSR is off if crsr is switched on then off
+        if((int)_fplPos > ((int)waylist.size()) - 3) _fplPos = (((int)waylist.size()) - 3 < 0 ? 0 : waylist.size() - 3);
+        unsigned int last_pos;
+        if(waylist.empty()) {
+            last_pos = 0;
+        } else {
+            last_pos = ((int)_fplPos == ((int)waylist.size()) - 3 ? waylist.size() : waylist.size() - 1);
+        }
+        //cout << "Initialising last_pos, last_pos = " << last_pos << '\n';
+        if(waylist.size() < 4) last_pos = waylist.size();
+        
+        // Don't draw the cyclic field header if the top waypoint is the approach header
+        // Not sure if this also applies to the fence - don't think so but TODO - check!
+        if(!waylist.empty() && _fplPos < waylist.size()) {
+            if(waylist[_fplPos].appType != GPS_HDR) {
+                _kln89->DrawChar('>', 2, 12, 3);
+                if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 3 && _kln89->_blink)) {
+                    DrawFpMode(3);
+                }
+            }
+        }
+        
+        //
+        // NOTE: this is the drawing routine for the ACTIVE flightplan, due to the number
+        // of differences there is a seperate routine for the stored flightplans.
+        //
+        // There are 4 rows to display flightplan data on the KLN89.  Draw each row.
+        for(unsigned int i=0; i<4; ++i) {
+            // Sanity check - we should no longer tickle this.
+            if((_fplPos+i) > waylist.size()) {
+                break;
+            }
 
-                       // Draw the number and (optional) colon for each row.
-                       bool drawNum = true;
-                       int n = (i < 3 ? _fplPos + i + 1 : last_pos + 1);
-                       if(_kln89->_approachLoaded) {
-                               if(n > _hdrPos) --n;
-                               if(n > _fencePos) --n;
-                       }
-                       string s = GPSitoa(n);
-                       if(_fplPos+i < waylist.size()) {
-                               // Don't draw the waypoint number for the header or fence
-                               if((waylist[_fplPos+i].appType == GPS_HDR || waylist[_fplPos+i].appType == GPS_FENCE) 
-                                       && i != 3) {    // By definition, the header and fence lines can't be displayed on the last line hence the unconditional !i==3 is safe.
-                                       drawNum = false;
-                               } else {
-                                       // Don't draw the colon for waypoints that are part of the published approach
-                                       if(waylist[_fplPos+i].appType == GPS_APP_NONE) {
-                                               s += ':';
-                                       }
-                               }
-                       } else {
-                               // We must be drawing the next entry field at the end of the list - this has a colon
-                               s += ':';
-                       }
-                       if(drawNum) {
-                               if(!(_delWp && _uLinePos == i+4)) _kln89->DrawText(s, 2, 4 - (s[s.size()-1] == ':' ? s.size() : s.size()+1), 3 - i);
-                       }
-                       // Done drawing numbers and colons.
-                               
-                       bool drawID = true;
-                       if(_delWp && _uLinePos == i+4) {
-                               if(!_kln89->_blink) {
-                                       _kln89->DrawText("Del", 2, 0, 3-i);
-                                       _kln89->DrawChar('?', 2, 10, 3-i);
-                                       _kln89->Underline(2, 0, 3-i, 11);
-                                       _kln89->DrawEnt();
-                               }
-                       } else if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos == i+4) {
-                               if(!_kln89->_blink) {
-                                       if(_wLinePos >= _entWp->id.size()) {
-                                               _kln89->DrawText(_entWp->id, 2, 4, 3-i);
-                                               _kln89->DrawChar(' ', 2, 4+_wLinePos, 3-i, false, true);
-                                       } else {
-                                               _kln89->DrawText(_entWp->id.substr(0, _wLinePos), 2, 4, 3-i);
-                                               _kln89->DrawChar(_entWp->id[_wLinePos], 2, 4+_wLinePos, 3-i, false, true);
-                                               _kln89->DrawText(_entWp->id.substr(_wLinePos+1, _entWp->id.size()-_wLinePos-1), 2, 5+_wLinePos, 3-i);
-                                       }
-                               }
-                               drawID = false;
-                       }
-                       if(drawID) {
-                               if(i == 3 || _fplPos + i == waylist.size()) {
-                                       //cout << "_uLinePos = " << _uLinePos << ", i = " << i << ", waylist.size() = " << waylist.size() << endl;
-                                       if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
-                                               // Draw the underline symbol at the end of the flightplan
-                                               _kln89->DrawText(last_pos < waylist.size() ? waylist[last_pos].GetAprId() : "_____", 2, 4, 3-i);
-                                       }
-                                       //cout << "last_pos = " << last_pos << endl;
-                                       if(last_pos > 0 && last_pos < waylist.size() && i > 0) {
-                                               // Draw the param
-                                               if(_actFpMode == 0) {
-                                                       string s = _params[last_pos - 1];
-                                                       _kln89->DrawText(s, 2, 16-s.size(), 3-i);
-                                               } else if(_actFpMode == 3) {
-                                                       string s = _params[last_pos - 1];
-                                                       _kln89->DrawText(s, 2, 15-s.size(), 3-i);
-                                                       _kln89->DrawSpecialChar(0, 2, 15, 3-i);
-                                               }
-                                       }
-                                       break;
-                               } else {
-                                       if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
-                                               if(waylist[_fplPos+i].appType == GPS_HDR) {
-                                                       if(_delAppr) {
-                                                               _kln89->DrawText("DELETE APPR?", 2, 1, 3-i);
-                                                       } else if(_changeAppr) {
-                                                               _kln89->DrawText("CHANGE APPR?", 2, 1, 3-i);
-                                                       } else {
-                                                               _kln89->DrawText(_kln89->_approachAbbrev, 2, 1, 3-i);
-                                                               _kln89->DrawText(_kln89->_approachRwyStr, 2, 7, 3-i);
-                                                               _kln89->DrawText(_kln89->_approachID, 2, 12, 3-i);
-                                                       }
-                                               } else if(waylist[_fplPos+i].appType == GPS_FENCE) {
-                                                       _kln89->DrawText("*NO WPT SEQ", 2, 0, 3-i);
-                                               } else {
-                                                       _kln89->DrawText(waylist[_fplPos+i].GetAprId(), 2, 4, 3-i);
-                                               }
-                                       }
-                               }
-                               if(i > 0) {
-                                       // Draw the param
-                                       //cout << "i > 0 param draw...\n";
-                                       if(_actFpMode == 0) {
-                                               string s = _params[_fplPos + i - 1];
-                                               _kln89->DrawText(s, 2, 16-s.size(), 3-i);
-                                       } else if(_actFpMode == 3) {
-                                               string s = _params[_fplPos + i - 1];
-                                               _kln89->DrawText(s, 2, 15-s.size(), 3-i);
-                                               _kln89->DrawSpecialChar(0, 2, 15, 3-i);
-                                       }
-                               }
-                       }
-               }
-       } else {  // Not active flightplan
-               //cout << "Top pos is " << _fplPos << ' ';
-               // For synatical convienience
-               //int nWp = (_subPage == 0 && !_delFP ? 4 : 3); // number of waypoints to display
-               vector<GPSWaypoint*> waylist = _kln89->_flightPlans[_subPage]->waypoints;
-               if(waylist.empty()) {
-                       if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 1 && _kln89->_blink)) {
-                               _kln89->DrawText(_delFP ? "Delete FPL?" : "Copy FPL 0?", 2, 0, 3);
-                       }
-               } else {
-                       if(!(_kln89->_mode == KLN89_MODE_CRSR && (_uLinePos == 1 || _uLinePos == 2) && _kln89->_blink)) {
-                               _kln89->DrawText(_delFP ? "Delete FPL?" : "Use?", 2, 0, 3);
-                       }
-                       if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 2 && _kln89->_blink)) {
-                               if(!_delFP) _kln89->DrawText("Inverted?", 2, 5, 3);
-                       }
-               }
-               
-               // ----------------------------------
-               if(_kln89->_mode == KLN89_MODE_CRSR) {
-                       if(_uLinePos == 1) {
-                               if(!_kln89->_blink) {
-                                       _kln89->Underline(2, 0, 3, (waylist.empty() || _delFP ? 11 : 4));       // This underline is blinked
-                                       _kln89->DrawEnt();
-                               }
-                       } else if(_uLinePos == 2) {
-                               // assert(!waylist.empty());
-                               if(!_kln89->_blink) {
-                                       _kln89->Underline(2, 0, 3, 14); // This underline is blinked
-                                       _kln89->DrawEnt();
-                               }
-                       } else if(_uLinePos == 3) {
-                               _kln89->Underline(2, 13, 2, 3);
-                       } else if(_uLinePos >= 4) {
-                               if(_bEntWp) {
-                                       if(_wLinePos == 0) {
-                                               _kln89->Underline(2, 5, 2 - (_uLinePos - 4), 4);
-                                       } else if(_wLinePos == 4) {
-                                               _kln89->Underline(2, 4, 2 - (_uLinePos - 4), 4);
-                                       } else {
-                                               _kln89->Underline(2, 4, 2 - (_uLinePos - 4), _wLinePos);
-                                               _kln89->Underline(2, 5 + _wLinePos, 2 - (_uLinePos - 4), 4 - _wLinePos);
-                                       }
-                                       if(!_kln89->_blink) {
-                                               //_kln89->DrawText(_entWp->id, 2, 4, 2 - (_uLinePos - 4), false, _wLinePos);
-                                               _kln89->DrawEnt();
-                                       }
-                               } else {
-                                       if(!_delWp) _kln89->Underline(2, 4, 2 - (_uLinePos - 4), 5);
-                               }
-                       }
-               }
-               // ----------------------------------
-                       
-               _kln89->DrawChar('>', 2, 12, 2);
-               if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 3 && _kln89->_blink)) DrawFpMode(2);
-               // Sanity check the top position - remember that we can have an extra blank one at the bottom even if CRSR is off if crsr is switched on then off
-               if((int)_fplPos > ((int)waylist.size()) - 2) _fplPos = (((int)waylist.size()) - 2 < 0 ? 0 : waylist.size() - 2);
-               unsigned int last_pos;
-               if(waylist.empty()) {
-                       last_pos = 0;
-               } else {
-                       last_pos = ((int)_fplPos == ((int)waylist.size()) - 2 ? waylist.size() : waylist.size() - 1);
-               }
-               if(waylist.size() < 3) last_pos = waylist.size();
-               for(unsigned int i=0; i<3; ++i) {
-                       string s = GPSitoa(i < 2 ? _fplPos + i + 1 : last_pos + 1);
-                       s += ':';
-                       if(!(_delWp && _uLinePos == i+4)) _kln89->DrawText(s, 2, 4 - s.size(), 2 - i);
-                       bool drawID = true;
-                       if(_delWp && _uLinePos == i+4) {
-                               if(!_kln89->_blink) {
-                                       _kln89->DrawText("Del", 2, 0, 2-i);
-                                       _kln89->DrawChar('?', 2, 10, 2-i);
-                                       _kln89->Underline(2, 0, 2-i, 11);
-                                       _kln89->DrawEnt();
-                               }
-                       } else if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos == i+4) {
-                               if(!_kln89->_blink) {
-                                       if(_wLinePos >= _entWp->id.size()) {
-                                               _kln89->DrawText(_entWp->id, 2, 4, 2-i);
-                                               _kln89->DrawChar(' ', 2, 4+_wLinePos, 2-i, false, true);
-                                       } else {
-                                               _kln89->DrawText(_entWp->id.substr(0, _wLinePos), 2, 4, 2-i);
-                                               _kln89->DrawChar(_entWp->id[_wLinePos], 2, 4+_wLinePos, 2-i, false, true);
-                                               _kln89->DrawText(_entWp->id.substr(_wLinePos+1, _entWp->id.size()-_wLinePos-1), 2, 5+_wLinePos, 2-i);
-                                       }
-                               }
-                               drawID = false;
-                       }
-                       if(drawID) {
-                               if(i == 2 || _fplPos + i == waylist.size()) {
-                                       if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
-                                               _kln89->DrawText(last_pos < waylist.size() ? waylist[last_pos]->id : "_____", 2, 4, 2-i);
-                                       }
-                                       if(last_pos > 0 && last_pos < waylist.size() && i > 0) {
-                                               // Draw the param
-                                               if(_fpMode == 0) {
-                                                       string s = _params[last_pos - 1];
-                                                       _kln89->DrawText(s, 2, 16-s.size(), 2-i);
-                                               }
-                                       }
-                                       break;
-                               } else {
-                                       if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
-                                               _kln89->DrawText(waylist[_fplPos+i]->id, 2, 4, 2-i);
-                                       }
-                                       if(i > 0) {
-                                               // Draw the param
-                                               if(_fpMode == 0) {
-                                                       string s = _params[_fplPos + i - 1];
-                                                       _kln89->DrawText(s, 2, 16-s.size(), 2-i);
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-       
-       KLN89Page::Update(dt);
+            // Draw the number and (optional) colon for each row.
+            bool drawNum = true;
+            int n = (i < 3 ? _fplPos + i + 1 : last_pos + 1);
+            if(_kln89->_approachLoaded) {
+                if(n > _hdrPos) --n;
+                if(n > _fencePos) --n;
+            }
+            string s = GPSitoa(n);
+            if(_fplPos+i < waylist.size()) {
+                // Don't draw the waypoint number for the header or fence
+                if((waylist[_fplPos+i].appType == GPS_HDR || waylist[_fplPos+i].appType == GPS_FENCE) 
+                    && i != 3) {    // By definition, the header and fence lines can't be displayed on the last line hence the unconditional !i==3 is safe.
+                    drawNum = false;
+                } else {
+                    // Don't draw the colon for waypoints that are part of the published approach
+                    if(waylist[_fplPos+i].appType == GPS_APP_NONE) {
+                        s += ':';
+                    }
+                }
+            } else {
+                // We must be drawing the next entry field at the end of the list - this has a colon
+                s += ':';
+            }
+            if(drawNum) {
+                if(!(_delWp && _uLinePos == i+4)) _kln89->DrawText(s, 2, 4 - (s[s.size()-1] == ':' ? s.size() : s.size()+1), 3 - i);
+            }
+            // Done drawing numbers and colons.
+                
+            bool drawID = true;
+            if(_delWp && _uLinePos == i+4) {
+                if(!_kln89->_blink) {
+                    _kln89->DrawText("Del", 2, 0, 3-i);
+                    _kln89->DrawChar('?', 2, 10, 3-i);
+                    _kln89->Underline(2, 0, 3-i, 11);
+                    _kln89->DrawEnt();
+                }
+            } else if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos == i+4) {
+                if(!_kln89->_blink) {
+                    if(_wLinePos >= _entWp->id.size()) {
+                        _kln89->DrawText(_entWp->id, 2, 4, 3-i);
+                        _kln89->DrawChar(' ', 2, 4+_wLinePos, 3-i, false, true);
+                    } else {
+                        _kln89->DrawText(_entWp->id.substr(0, _wLinePos), 2, 4, 3-i);
+                        _kln89->DrawChar(_entWp->id[_wLinePos], 2, 4+_wLinePos, 3-i, false, true);
+                        _kln89->DrawText(_entWp->id.substr(_wLinePos+1, _entWp->id.size()-_wLinePos-1), 2, 5+_wLinePos, 3-i);
+                    }
+                }
+                drawID = false;
+            }
+            if(drawID) {
+                if(i == 3 || _fplPos + i == waylist.size()) {
+                    //cout << "_uLinePos = " << _uLinePos << ", i = " << i << ", waylist.size() = " << waylist.size() << endl;
+                    if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
+                        // Draw the underline symbol at the end of the flightplan
+                        _kln89->DrawText(last_pos < waylist.size() ? waylist[last_pos].GetAprId() : "_____", 2, 4, 3-i);
+                    }
+                    //cout << "last_pos = " << last_pos << endl;
+                    if(last_pos > 0 && last_pos < waylist.size() && i > 0) {
+                        // Draw the param
+                        if(_actFpMode == 0) {
+                            string s = _params[last_pos - 1];
+                            _kln89->DrawText(s, 2, 16-s.size(), 3-i);
+                        } else if(_actFpMode == 3) {
+                            string s = _params[last_pos - 1];
+                            _kln89->DrawText(s, 2, 15-s.size(), 3-i);
+                            _kln89->DrawSpecialChar(0, 2, 15, 3-i);
+                        }
+                    }
+                    break;
+                } else {
+                    if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
+                        if(waylist[_fplPos+i].appType == GPS_HDR) {
+                            if(_delAppr) {
+                                _kln89->DrawText("DELETE APPR?", 2, 1, 3-i);
+                            } else if(_changeAppr) {
+                                _kln89->DrawText("CHANGE APPR?", 2, 1, 3-i);
+                            } else {
+                                _kln89->DrawText(_kln89->_approachAbbrev, 2, 1, 3-i);
+                                _kln89->DrawText(_kln89->_approachRwyStr, 2, 7, 3-i);
+                                _kln89->DrawText(_kln89->_approachID, 2, 12, 3-i);
+                            }
+                        } else if(waylist[_fplPos+i].appType == GPS_FENCE) {
+                            _kln89->DrawText("*NO WPT SEQ", 2, 0, 3-i);
+                        } else {
+                            _kln89->DrawText(waylist[_fplPos+i].GetAprId(), 2, 4, 3-i);
+                        }
+                    }
+                }
+                if(i > 0) {
+                    // Draw the param
+                    //cout << "i > 0 param draw...\n";
+                    if(_actFpMode == 0) {
+                        string s = _params[_fplPos + i - 1];
+                        _kln89->DrawText(s, 2, 16-s.size(), 3-i);
+                    } else if(_actFpMode == 3) {
+                        string s = _params[_fplPos + i - 1];
+                        _kln89->DrawText(s, 2, 15-s.size(), 3-i);
+                        _kln89->DrawSpecialChar(0, 2, 15, 3-i);
+                    }
+                }
+            }
+        }
+    } else {  // Not active flightplan
+        //cout << "Top pos is " << _fplPos << ' ';
+        // For synatical convienience
+        //int nWp = (_subPage == 0 && !_delFP ? 4 : 3); // number of waypoints to display
+        vector<GPSWaypoint*> waylist = _kln89->_flightPlans[_subPage]->waypoints;
+        if(waylist.empty()) {
+            if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 1 && _kln89->_blink)) {
+                _kln89->DrawText(_delFP ? "Delete FPL?" : "Copy FPL 0?", 2, 0, 3);
+            }
+        } else {
+            if(!(_kln89->_mode == KLN89_MODE_CRSR && (_uLinePos == 1 || _uLinePos == 2) && _kln89->_blink)) {
+                _kln89->DrawText(_delFP ? "Delete FPL?" : "Use?", 2, 0, 3);
+            }
+            if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 2 && _kln89->_blink)) {
+                if(!_delFP) _kln89->DrawText("Inverted?", 2, 5, 3);
+            }
+        }
+        
+        // ----------------------------------
+        if(_kln89->_mode == KLN89_MODE_CRSR) {
+            if(_uLinePos == 1) {
+                if(!_kln89->_blink) {
+                    _kln89->Underline(2, 0, 3, (waylist.empty() || _delFP ? 11 : 4));   // This underline is blinked
+                    _kln89->DrawEnt();
+                }
+            } else if(_uLinePos == 2) {
+                // assert(!waylist.empty());
+                if(!_kln89->_blink) {
+                    _kln89->Underline(2, 0, 3, 14); // This underline is blinked
+                    _kln89->DrawEnt();
+                }
+            } else if(_uLinePos == 3) {
+                _kln89->Underline(2, 13, 2, 3);
+            } else if(_uLinePos >= 4) {
+                if(_bEntWp) {
+                    if(_wLinePos == 0) {
+                        _kln89->Underline(2, 5, 2 - (_uLinePos - 4), 4);
+                    } else if(_wLinePos == 4) {
+                        _kln89->Underline(2, 4, 2 - (_uLinePos - 4), 4);
+                    } else {
+                        _kln89->Underline(2, 4, 2 - (_uLinePos - 4), _wLinePos);
+                        _kln89->Underline(2, 5 + _wLinePos, 2 - (_uLinePos - 4), 4 - _wLinePos);
+                    }
+                    if(!_kln89->_blink) {
+                        //_kln89->DrawText(_entWp->id, 2, 4, 2 - (_uLinePos - 4), false, _wLinePos);
+                        _kln89->DrawEnt();
+                    }
+                } else {
+                    if(!_delWp) _kln89->Underline(2, 4, 2 - (_uLinePos - 4), 5);
+                }
+            }
+        }
+        // ----------------------------------
+            
+        _kln89->DrawChar('>', 2, 12, 2);
+        if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 3 && _kln89->_blink)) DrawFpMode(2);
+        // Sanity check the top position - remember that we can have an extra blank one at the bottom even if CRSR is off if crsr is switched on then off
+        if((int)_fplPos > ((int)waylist.size()) - 2) _fplPos = (((int)waylist.size()) - 2 < 0 ? 0 : waylist.size() - 2);
+        unsigned int last_pos;
+        if(waylist.empty()) {
+            last_pos = 0;
+        } else {
+            last_pos = ((int)_fplPos == ((int)waylist.size()) - 2 ? waylist.size() : waylist.size() - 1);
+        }
+        if(waylist.size() < 3) last_pos = waylist.size();
+        for(unsigned int i=0; i<3; ++i) {
+            string s = GPSitoa(i < 2 ? _fplPos + i + 1 : last_pos + 1);
+            s += ':';
+            if(!(_delWp && _uLinePos == i+4)) _kln89->DrawText(s, 2, 4 - s.size(), 2 - i);
+            bool drawID = true;
+            if(_delWp && _uLinePos == i+4) {
+                if(!_kln89->_blink) {
+                    _kln89->DrawText("Del", 2, 0, 2-i);
+                    _kln89->DrawChar('?', 2, 10, 2-i);
+                    _kln89->Underline(2, 0, 2-i, 11);
+                    _kln89->DrawEnt();
+                }
+            } else if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos == i+4) {
+                if(!_kln89->_blink) {
+                    if(_wLinePos >= _entWp->id.size()) {
+                        _kln89->DrawText(_entWp->id, 2, 4, 2-i);
+                        _kln89->DrawChar(' ', 2, 4+_wLinePos, 2-i, false, true);
+                    } else {
+                        _kln89->DrawText(_entWp->id.substr(0, _wLinePos), 2, 4, 2-i);
+                        _kln89->DrawChar(_entWp->id[_wLinePos], 2, 4+_wLinePos, 2-i, false, true);
+                        _kln89->DrawText(_entWp->id.substr(_wLinePos+1, _entWp->id.size()-_wLinePos-1), 2, 5+_wLinePos, 2-i);
+                    }
+                }
+                drawID = false;
+            }
+            if(drawID) {
+                if(i == 2 || _fplPos + i == waylist.size()) {
+                    if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
+                        _kln89->DrawText(last_pos < waylist.size() ? waylist[last_pos]->id : "_____", 2, 4, 2-i);
+                    }
+                    if(last_pos > 0 && last_pos < waylist.size() && i > 0) {
+                        // Draw the param
+                        if(_fpMode == 0) {
+                            string s = _params[last_pos - 1];
+                            _kln89->DrawText(s, 2, 16-s.size(), 2-i);
+                        }
+                    }
+                    break;
+                } else {
+                    if(!(_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == (i + 4) && _kln89->_blink)) {
+                        _kln89->DrawText(waylist[_fplPos+i]->id, 2, 4, 2-i);
+                    }
+                    if(i > 0) {
+                        // Draw the param
+                        if(_fpMode == 0) {
+                            string s = _params[_fplPos + i - 1];
+                            _kln89->DrawText(s, 2, 16-s.size(), 2-i);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    KLN89Page::Update(dt);
 }
 
 void KLN89FplPage::DrawFpMode(int ypos) {
-       string s = "Dis";
-       if(0 == _subPage) {
-               if(_actFpMode == 1) {
-                       s = "ETE";
-               } else if(_actFpMode == 2) {
-                       s = "UTC";      // TODO - alter depending on chosen timezone
-               } else if(_actFpMode == 3) {
-                       s = (_kln89->_obsMode ? "OBS" : "Dtk");
-               }
-       } else {
-               if(_fpMode == 1) {
-                       s = "Dtk";
-               }
-       }
-       _kln89->DrawText(s, 2, 13, ypos);
+    string s = "Dis";
+    if(0 == _subPage) {
+        if(_actFpMode == 1) {
+            s = "ETE";
+        } else if(_actFpMode == 2) {
+            s = "UTC";  // TODO - alter depending on chosen timezone
+        } else if(_actFpMode == 3) {
+            s = (_kln89->_obsMode ? "OBS" : "Dtk");
+        }
+    } else {
+        if(_fpMode == 1) {
+            s = "Dtk";
+        }
+    }
+    _kln89->DrawText(s, 2, 13, ypos);
 }
 
 // Calculate the displayable parameters for the currently displayed flightplan.
@@ -505,545 +505,545 @@ void KLN89FplPage::DrawFpMode(int ypos) {
 // which is a really really really ugly and potentially bug-prone and hard to maintain way of doing this.
 // TODO: When the unit is fully working rip out _params and replace with a better solution.
 void KLN89FplPage::Calc() {
-       _params.clear();
-       GPSFlightPlan* fp = _kln89->_flightPlans[_subPage];
-       vector<GPSWaypoint*> wv = fp->waypoints;
-       // Some parameters are calculated differently for the active and the stored flightplans, so
-       // do the two cases seperately.
-       if(0 == _subPage) {
-               // Active FP - parameters are only displayed for the active waypoint onwards for the active plan,
-               // and distance is cumulative from the user position.
-               if(0 == _actFpMode) {
-                       // Dis
-                       double cum_tot = 0.0;
-                       if(wv.size() > 0) {
-                               cum_tot += _kln89->GetGreatCircleDistance(_kln89->_gpsLat, _kln89->_gpsLon, wv[0]->lat, wv[0]->lon);
-                       }
-                       for(unsigned int i=1; i<wv.size(); ++i) {
-                               cum_tot += _kln89->GetGreatCircleDistance(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);  // TODO - add units switch!
-                               int n = (int)(cum_tot + 0.5);
-                               _params.push_back(GPSitoa(n));
-                       }
-               } else if(1 == _actFpMode) {
-                       // TODO
-               } else if(2 == _actFpMode) {
-                       // TODO
-               } else {
-                       // Dtk
-                       for(unsigned int i=1; i<wv.size(); ++i) {
-                               double dtk = _kln89->GetMagHeadingFromTo(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);
-                               int n = (int)(dtk + 0.5);
-                               _params.push_back(GPSitoa(n));
-                       }
-                       
-               }
-       } else {
-               // other FPs
-               if(0 == _fpMode) {
-                       double cum_tot = 0.0;
-                       for(unsigned int i=1; i<wv.size(); ++i) {
-                               cum_tot += _kln89->GetGreatCircleDistance(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);  // TODO - add units switch!
-                               int n = (int)(cum_tot + 0.5);
-                               _params.push_back(GPSitoa(n));
-                       }
-               } else {
-                       // Dtk
-                       for(unsigned int i=1; i<wv.size(); ++i) {
-                               double dtk = _kln89->GetMagHeadingFromTo(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);
-                               int n = (int)(dtk + 0.5);
-                               _params.push_back(GPSitoa(n));
-                       }
-               }
-       }
+    _params.clear();
+    GPSFlightPlan* fp = _kln89->_flightPlans[_subPage];
+    vector<GPSWaypoint*> wv = fp->waypoints;
+    // Some parameters are calculated differently for the active and the stored flightplans, so
+    // do the two cases seperately.
+    if(0 == _subPage) {
+        // Active FP - parameters are only displayed for the active waypoint onwards for the active plan,
+        // and distance is cumulative from the user position.
+        if(0 == _actFpMode) {
+            // Dis
+            double cum_tot = 0.0;
+            if(wv.size() > 0) {
+                cum_tot += _kln89->GetGreatCircleDistance(_kln89->_gpsLat, _kln89->_gpsLon, wv[0]->lat, wv[0]->lon);
+            }
+            for(unsigned int i=1; i<wv.size(); ++i) {
+                cum_tot += _kln89->GetGreatCircleDistance(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);  // TODO - add units switch!
+                int n = (int)(cum_tot + 0.5);
+                _params.push_back(GPSitoa(n));
+            }
+        } else if(1 == _actFpMode) {
+            // TODO
+        } else if(2 == _actFpMode) {
+            // TODO
+        } else {
+            // Dtk
+            for(unsigned int i=1; i<wv.size(); ++i) {
+                double dtk = _kln89->GetMagHeadingFromTo(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);
+                int n = (int)(dtk + 0.5);
+                _params.push_back(GPSitoa(n));
+            }
+            
+        }
+    } else {
+        // other FPs
+        if(0 == _fpMode) {
+            double cum_tot = 0.0;
+            for(unsigned int i=1; i<wv.size(); ++i) {
+                cum_tot += _kln89->GetGreatCircleDistance(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);  // TODO - add units switch!
+                int n = (int)(cum_tot + 0.5);
+                _params.push_back(GPSitoa(n));
+            }
+        } else {
+            // Dtk
+            for(unsigned int i=1; i<wv.size(); ++i) {
+                double dtk = _kln89->GetMagHeadingFromTo(wv[i-1]->lat, wv[i-1]->lon, wv[i]->lat, wv[i]->lon);
+                int n = (int)(dtk + 0.5);
+                _params.push_back(GPSitoa(n));
+            }
+        }
+    }
 }
 
 void KLN89FplPage::CrsrPressed() {
-       if(_delFP || _delAppr) {
-               _delFP = _delAppr = false;
-               _kln89->_mode = KLN89_MODE_DISP;
-               return;
-       }
+    if(_delFP || _delAppr) {
+        _delFP = _delAppr = false;
+        _kln89->_mode = KLN89_MODE_DISP;
+        return;
+    }
 
-       _wLinePos = 0;
-       if(_kln89->_mode == KLN89_MODE_DISP) {
-               _fp0SelWpId.clear();
-               if(_bEntWp) {
-                       for(unsigned int i = 0; i < _kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
-                               if(_kln89->_flightPlans[_subPage]->waypoints[i] == _entWp) {
-                                       _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + i);
-                               }
-                       }
-                       delete _entWp;
-                       _entWp = NULL;
-                       _bEntWp = false;
-                       _entWpStr.clear();
-               }
-       } else {
-               if(_kln89->_obsMode) {
-                       _uLinePos = 0;
-               } else {
-                       if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
-                               _uLinePos = 4;
-                       } else {
-                               _uLinePos = (_subPage == 0 ? 3 : 1);
-                       }
-               }
-       }
+    _wLinePos = 0;
+    if(_kln89->_mode == KLN89_MODE_DISP) {
+        _fp0SelWpId.clear();
+        if(_bEntWp) {
+            for(unsigned int i = 0; i < _kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
+                if(_kln89->_flightPlans[_subPage]->waypoints[i] == _entWp) {
+                    _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + i);
+                }
+            }
+            delete _entWp;
+            _entWp = NULL;
+            _bEntWp = false;
+            _entWpStr.clear();
+        }
+    } else {
+        if(_kln89->_obsMode) {
+            _uLinePos = 0;
+        } else {
+            if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
+                _uLinePos = 4;
+            } else {
+                _uLinePos = (_subPage == 0 ? 3 : 1);
+            }
+        }
+    }
 }
 
 void KLN89FplPage::ClrPressed() {
-       if(_delFP || _delAppr) {
-               _delFP = _delAppr = false;
-               _kln89->_mode = KLN89_MODE_DISP;
-       } else {
-               if(KLN89_MODE_CRSR == _kln89->_mode) {
-                       // TODO - see if we need to delete a waypoint
-                       if(_uLinePos >= 4) {
-                               if(_delWp) {
-                                       _kln89->_mode = KLN89_MODE_DISP;
-                                       _delWp = false;
-                               } else {
-                                       // First check that we're not trying to delete an approach waypoint.  Note that we can delete the approach by deleting the header though.
-                                       // Check for approach waypoints or header/fences in flightplan 0
-                                       int n = _fplPos + _uLinePos - 4;
-                                       bool hdrPos = false;
-                                       bool fencePos = false;
-                                       //cout << "_fplPos = " << _fplPos << ", _uLinePos = " << _uLinePos << ", n = " << n << ", _hdrPos = " << _hdrPos << ", _fencePos = " << _fencePos << '\n';
-                                       if(n == _hdrPos) {
-                                               //cout << "HEADER POS\n";
-                                               hdrPos = true;
-                                       }
-                                       if(n == _fencePos) {
-                                               //cout << "FENCE POS\n";
-                                               fencePos = true;
-                                       }
-                                       if(_hdrPos >= 0 && n > _hdrPos) --n;
-                                       if(_fencePos >= 0 && n >= _fencePos) --n;       // This one needs to be >= since n is already decremented by 1 in the line above!
-                                       //cout << "New n = " << n << '\n';
-                                       if(hdrPos) {
-                                               //cout << "HDRP\n";
-                                               _delAppr = true;
-                                       } else if(fencePos) {
-                                               //cout << "FENP\n";
-                                               // no-op
-                                       } else if(n >= static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size())) {
-                                               // no-op - off the end of the list on the entry field
-                                       } else if(_kln89->_flightPlans[_subPage]->waypoints[n]->appType == GPS_APP_NONE) {
-                                               //cout << "DELFP\n";
-                                               _kln89->_mode = KLN89_MODE_CRSR;
-                                               _delWp = true;
-                                       } else {
-                                               ShowScratchpadMessage("Invald", " Del  ");
-                                       }
-                               }
-                       } else if(_uLinePos == 3) {
-                               if(_subPage == 0) {
-                                       _actFpMode++;
-                                       if(_actFpMode > 3) _actFpMode = 0;
-                               } else {
-                                       _fpMode++;
-                                       if(_fpMode > 1) _fpMode = 0;
-                               }
-                       }
-               } else {
-                       _delFP = true;
-                       _uLinePos = 1;
-                       _kln89->_mode = KLN89_MODE_CRSR;
-               }
-       }
+    if(_delFP || _delAppr) {
+        _delFP = _delAppr = false;
+        _kln89->_mode = KLN89_MODE_DISP;
+    } else {
+        if(KLN89_MODE_CRSR == _kln89->_mode) {
+            // TODO - see if we need to delete a waypoint
+            if(_uLinePos >= 4) {
+                if(_delWp) {
+                    _kln89->_mode = KLN89_MODE_DISP;
+                    _delWp = false;
+                } else {
+                    // First check that we're not trying to delete an approach waypoint.  Note that we can delete the approach by deleting the header though.
+                    // Check for approach waypoints or header/fences in flightplan 0
+                    int n = _fplPos + _uLinePos - 4;
+                    bool hdrPos = false;
+                    bool fencePos = false;
+                    //cout << "_fplPos = " << _fplPos << ", _uLinePos = " << _uLinePos << ", n = " << n << ", _hdrPos = " << _hdrPos << ", _fencePos = " << _fencePos << '\n';
+                    if(n == _hdrPos) {
+                        //cout << "HEADER POS\n";
+                        hdrPos = true;
+                    }
+                    if(n == _fencePos) {
+                        //cout << "FENCE POS\n";
+                        fencePos = true;
+                    }
+                    if(_hdrPos >= 0 && n > _hdrPos) --n;
+                    if(_fencePos >= 0 && n >= _fencePos) --n;   // This one needs to be >= since n is already decremented by 1 in the line above!
+                    //cout << "New n = " << n << '\n';
+                    if(hdrPos) {
+                        //cout << "HDRP\n";
+                        _delAppr = true;
+                    } else if(fencePos) {
+                        //cout << "FENP\n";
+                        // no-op
+                    } else if(n >= static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size())) {
+                        // no-op - off the end of the list on the entry field
+                    } else if(_kln89->_flightPlans[_subPage]->waypoints[n]->appType == GPS_APP_NONE) {
+                        //cout << "DELFP\n";
+                        _kln89->_mode = KLN89_MODE_CRSR;
+                        _delWp = true;
+                    } else {
+                        ShowScratchpadMessage("Invald", " Del  ");
+                    }
+                }
+            } else if(_uLinePos == 3) {
+                if(_subPage == 0) {
+                    _actFpMode++;
+                    if(_actFpMode > 3) _actFpMode = 0;
+                } else {
+                    _fpMode++;
+                    if(_fpMode > 1) _fpMode = 0;
+                }
+            }
+        } else {
+            _delFP = true;
+            _uLinePos = 1;
+            _kln89->_mode = KLN89_MODE_CRSR;
+        }
+    }
 }
 
 void KLN89FplPage::CleanUp() {
-       // TODO - possibly need to clean up _delWp here as well, since it goes off if dto and then ent are pressed.
-       
-       _bEntWp = false;
-       for(unsigned int i = 0; i < _kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
-               if(_kln89->_flightPlans[_subPage]->waypoints[i] == _entWp) {
-                       _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + i);
-               }
-       }
-       delete _entWp;
-       _entWp = NULL;
-       _entWpStr.clear();
-       KLN89Page::CleanUp();
+    // TODO - possibly need to clean up _delWp here as well, since it goes off if dto and then ent are pressed.
+    
+    _bEntWp = false;
+    for(unsigned int i = 0; i < _kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
+        if(_kln89->_flightPlans[_subPage]->waypoints[i] == _entWp) {
+            _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + i);
+        }
+    }
+    delete _entWp;
+    _entWp = NULL;
+    _entWpStr.clear();
+    KLN89Page::CleanUp();
 }
 
 void KLN89FplPage::LooseFocus() {
-       _fplPos = 0;
-       _resetFplPos0 = true;
-       _wLinePos = 0;
-       _uLinePos = 0;
-       _fp0SelWpId.clear();
-       _scratchpadMsg = false;
+    _fplPos = 0;
+    _resetFplPos0 = true;
+    _wLinePos = 0;
+    _uLinePos = 0;
+    _fp0SelWpId.clear();
+    _scratchpadMsg = false;
 }
 
 void KLN89FplPage::EntPressed() {
-       if(_delFP) {
-               _kln89->ClearFlightPlan(_subPage);
-               CrsrPressed();
-       } else if(_delWp) {
-               int pos = _uLinePos - 4 + _fplPos;
-               // Sanity check - the calculated wp position should never be off the end of the waypoint list.
-               if(pos > static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size()) - 1) {
-                       cout << "ERROR - _uLinePos too big in KLN89FplPage::EntPressed!\n";
-                       return;
-               }
-               _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + pos);
-               _delWp = false;
-               // Do we need to re-calc _fplPos here?
-       } else if(_bEntExp) {
-               _bEntWp = false;
-               _bEntExp = false;
-               _entWp = NULL;  // DON'T delete it! - it's been pushed onto the waypoint list at this point.
-               _entWpStr.clear();
-               _kln89->_cleanUpPage = -1;
-               _wLinePos = 0;
-               // TODO - in actual fact the previously underlined waypoint stays in the same position and underlined
-               // in some or possibly all circumstances - need to check this out and match it, but not too important
-               // for now.
-       } else if(_bEntWp) {
-               if(_entWp != NULL) {
-                       // TODO - should be able to get rid of this switch I think and use the enum values.
-                       switch(_entWp->type) {
-                       case GPS_WP_APT:
-                               _kln89->_activePage = _kln89->_pages[0];
-                               _kln89->_curPage = 0;
-                               ((KLN89Page*)_kln89->_pages[0])->SetEntInvert(true);
-                               break;
-                       case GPS_WP_VOR:
-                               _kln89->_activePage = _kln89->_pages[1];
-                               _kln89->_curPage = 1;
-                               ((KLN89Page*)_kln89->_pages[1])->SetEntInvert(true);
-                               break;
-                       case GPS_WP_NDB:
-                               _kln89->_activePage = _kln89->_pages[2];
-                               _kln89->_curPage = 2;
-                               ((KLN89Page*)_kln89->_pages[2])->SetEntInvert(true);
-                               break;
-                       case GPS_WP_INT:
-                               _kln89->_activePage = _kln89->_pages[3];
-                               _kln89->_curPage = 3;
-                               ((KLN89Page*)_kln89->_pages[3])->SetEntInvert(true);
-                               break;
-                       case GPS_WP_USR:
-                               _kln89->_activePage = _kln89->_pages[4];
-                               _kln89->_curPage = 4;
-                               ((KLN89Page*)_kln89->_pages[4])->SetEntInvert(true);
-                               break;
-                       default:
-                               cout << "Error - unknown waypoint type found in KLN89::FplPage::EntPressed()\n";
-                       }
-                       _kln89->_activePage->SetId(_entWp->id);
-                       _kln89->_entJump = 7;
-                       _kln89->_cleanUpPage = 7;
-                       _kln89->_entRestoreCrsr = true;
-                       _kln89->_mode = KLN89_MODE_DISP;
-               }
-               _bEntExp = true;
-       } else if(_uLinePos == 1) {
-               if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
-                       // Copy fpl 0
-                       for(unsigned int i=0; i<_kln89->_flightPlans[0]->waypoints.size(); ++i) {
-                               GPSWaypoint* wp = new GPSWaypoint;
-                               *wp = *(_kln89->_flightPlans[0]->waypoints[i]);
-                               _kln89->_flightPlans[_subPage]->waypoints.push_back(wp);
-                       }
-               } else {
-                       // Use
-                       _kln89->ClearFlightPlan(0);
-                       for(unsigned int i=0; i<_kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
-                               GPSWaypoint* wp = new GPSWaypoint;
-                               *wp = *(_kln89->_flightPlans[_subPage]->waypoints[i]);
-                               _kln89->_flightPlans[0]->waypoints.push_back(wp);
-                       }
-                       _kln89->OrientateToActiveFlightPlan();
-                       _subPage = 0;
-               }
-               _kln89->CrsrPressed();
-       } else if(_uLinePos == 2) {
-               if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
-                       // ERROR !!!
-               } else {
-                       // Use Invert
-                       _kln89->ClearFlightPlan(0);
-                       for(unsigned int i=0; i<_kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
-                               GPSWaypoint* wp = new GPSWaypoint;
-                               *wp = *(_kln89->_flightPlans[_subPage]->waypoints[i]);
-                               // FIXME - very inefficient - use a reverse iterator on the source array and push_back instead!!!!!!!!
-                               _kln89->_flightPlans[0]->waypoints.insert(_kln89->_flightPlans[0]->waypoints.begin(), wp);
-                       }
-                       _kln89->OrientateToActiveFlightPlan();
-               }
-               _kln89->CrsrPressed();
-               _subPage = 0;
-       }
+    if(_delFP) {
+        _kln89->ClearFlightPlan(_subPage);
+        CrsrPressed();
+    } else if(_delWp) {
+        int pos = _uLinePos - 4 + _fplPos;
+        // Sanity check - the calculated wp position should never be off the end of the waypoint list.
+        if(pos > static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size()) - 1) {
+            cout << "ERROR - _uLinePos too big in KLN89FplPage::EntPressed!\n";
+            return;
+        }
+        _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + pos);
+        _delWp = false;
+        // Do we need to re-calc _fplPos here?
+    } else if(_bEntExp) {
+        _bEntWp = false;
+        _bEntExp = false;
+        _entWp = NULL;  // DON'T delete it! - it's been pushed onto the waypoint list at this point.
+        _entWpStr.clear();
+        _kln89->_cleanUpPage = -1;
+        _wLinePos = 0;
+        // TODO - in actual fact the previously underlined waypoint stays in the same position and underlined
+        // in some or possibly all circumstances - need to check this out and match it, but not too important
+        // for now.
+    } else if(_bEntWp) {
+        if(_entWp != NULL) {
+            // TODO - should be able to get rid of this switch I think and use the enum values.
+            switch(_entWp->type) {
+            case GPS_WP_APT:
+                _kln89->_activePage = _kln89->_pages[0];
+                _kln89->_curPage = 0;
+                ((KLN89Page*)_kln89->_pages[0])->SetEntInvert(true);
+                break;
+            case GPS_WP_VOR:
+                _kln89->_activePage = _kln89->_pages[1];
+                _kln89->_curPage = 1;
+                ((KLN89Page*)_kln89->_pages[1])->SetEntInvert(true);
+                break;
+            case GPS_WP_NDB:
+                _kln89->_activePage = _kln89->_pages[2];
+                _kln89->_curPage = 2;
+                ((KLN89Page*)_kln89->_pages[2])->SetEntInvert(true);
+                break;
+            case GPS_WP_INT:
+                _kln89->_activePage = _kln89->_pages[3];
+                _kln89->_curPage = 3;
+                ((KLN89Page*)_kln89->_pages[3])->SetEntInvert(true);
+                break;
+            case GPS_WP_USR:
+                _kln89->_activePage = _kln89->_pages[4];
+                _kln89->_curPage = 4;
+                ((KLN89Page*)_kln89->_pages[4])->SetEntInvert(true);
+                break;
+            default:
+                cout << "Error - unknown waypoint type found in KLN89::FplPage::EntPressed()\n";
+            }
+            _kln89->_activePage->SetId(_entWp->id);
+            _kln89->_entJump = 7;
+            _kln89->_cleanUpPage = 7;
+            _kln89->_entRestoreCrsr = true;
+            _kln89->_mode = KLN89_MODE_DISP;
+        }
+        _bEntExp = true;
+    } else if(_uLinePos == 1) {
+        if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
+            // Copy fpl 0
+            for(unsigned int i=0; i<_kln89->_flightPlans[0]->waypoints.size(); ++i) {
+                GPSWaypoint* wp = new GPSWaypoint;
+                *wp = *(_kln89->_flightPlans[0]->waypoints[i]);
+                _kln89->_flightPlans[_subPage]->waypoints.push_back(wp);
+            }
+        } else {
+            // Use
+            _kln89->ClearFlightPlan(0);
+            for(unsigned int i=0; i<_kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
+                GPSWaypoint* wp = new GPSWaypoint;
+                *wp = *(_kln89->_flightPlans[_subPage]->waypoints[i]);
+                _kln89->_flightPlans[0]->waypoints.push_back(wp);
+            }
+            _kln89->OrientateToActiveFlightPlan();
+            _subPage = 0;
+        }
+        _kln89->CrsrPressed();
+    } else if(_uLinePos == 2) {
+        if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
+            // ERROR !!!
+        } else {
+            // Use Invert
+            _kln89->ClearFlightPlan(0);
+            for(unsigned int i=0; i<_kln89->_flightPlans[_subPage]->waypoints.size(); ++i) {
+                GPSWaypoint* wp = new GPSWaypoint;
+                *wp = *(_kln89->_flightPlans[_subPage]->waypoints[i]);
+                // FIXME - very inefficient - use a reverse iterator on the source array and push_back instead!!!!!!!!
+                _kln89->_flightPlans[0]->waypoints.insert(_kln89->_flightPlans[0]->waypoints.begin(), wp);
+            }
+            _kln89->OrientateToActiveFlightPlan();
+        }
+        _kln89->CrsrPressed();
+        _subPage = 0;
+    }
 }
 
 void KLN89FplPage::Knob1Left1() {
-       if(_delFP) {
-               _delFP = false;
-               return;
-       }
-       _delWp = false;
-       _changeAppr = false;
+    if(_delFP) {
+        _delFP = false;
+        return;
+    }
+    _delWp = false;
+    _changeAppr = false;
 
-       if(_kln89->_mode == KLN89_MODE_CRSR) {
-               if(_bEntWp) {
-                       if(_wLinePos > 0) _wLinePos--;
-               } else {
-                       // _uLinePos with empty/not-empty plan: 1 = Copy FPL 0? / Use?, 2 = unused if empty / Invert?, 3 = >Dis/Dtk field, 4+ = Waypoint 1+
-                       if(_uLinePos == 0) {
-                               // No-op
-                       } else if(_uLinePos == 1 || _uLinePos == 2) {
-                               _uLinePos--;
-                       } else if(_uLinePos == 3) {
-                               _uLinePos = 4;
-                       } else if(_uLinePos == 4) {
-                               if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
-                                       _uLinePos = (_subPage == 0 ? 0 : 1);
-                               } else if(_fplPos == 0) {
-                                       _uLinePos = (_subPage == 0 ? 0 : 2);
-                               } else {
-                                       _fplPos--;
-                               }
-                       } else if(_uLinePos == 5) {
-                               _uLinePos = 3;
-                       } else {
-                               _uLinePos--;
-                       }
+    if(_kln89->_mode == KLN89_MODE_CRSR) {
+        if(_bEntWp) {
+            if(_wLinePos > 0) _wLinePos--;
+        } else {
+            // _uLinePos with empty/not-empty plan: 1 = Copy FPL 0? / Use?, 2 = unused if empty / Invert?, 3 = >Dis/Dtk field, 4+ = Waypoint 1+
+            if(_uLinePos == 0) {
+                // No-op
+            } else if(_uLinePos == 1 || _uLinePos == 2) {
+                _uLinePos--;
+            } else if(_uLinePos == 3) {
+                _uLinePos = 4;
+            } else if(_uLinePos == 4) {
+                if(_kln89->_flightPlans[_subPage]->IsEmpty()) {
+                    _uLinePos = (_subPage == 0 ? 0 : 1);
+                } else if(_fplPos == 0) {
+                    _uLinePos = (_subPage == 0 ? 0 : 2);
+                } else {
+                    _fplPos--;
+                }
+            } else if(_uLinePos == 5) {
+                _uLinePos = 3;
+            } else {
+                _uLinePos--;
+            }
 
-                       if(_subPage == 0 && _uLinePos > 3) {
-                               int ix = _fplPos + (_uLinePos - 4);
-                               if(_fencePos >= 0 && ix >= _fencePos) ix--;
-                               if(_hdrPos >= 0 && ix >= _hdrPos) ix--;
-                               if(ix >= static_cast<int>(_kln89->_activeFP->waypoints.size())) {
-                                       _fp0SelWpId.clear();
-                               } else {
-                                       _fp0SelWpId = _kln89->_activeFP->waypoints[ix]->id;
-                               }
-                       } else {
-                               _fp0SelWpId.clear();
-                               //cout << "Not page 0, or not in waypoints, clearing id!\n";
-                       }
-               }
-       }
+            if(_subPage == 0 && _uLinePos > 3) {
+                int ix = _fplPos + (_uLinePos - 4);
+                if(_fencePos >= 0 && ix >= _fencePos) ix--;
+                if(_hdrPos >= 0 && ix >= _hdrPos) ix--;
+                if(ix >= static_cast<int>(_kln89->_activeFP->waypoints.size())) {
+                    _fp0SelWpId.clear();
+                } else {
+                    _fp0SelWpId = _kln89->_activeFP->waypoints[ix]->id;
+                }
+            } else {
+                _fp0SelWpId.clear();
+                //cout << "Not page 0, or not in waypoints, clearing id!\n";
+            }
+        }
+    }
 }
 
 void KLN89FplPage::Knob1Right1() {
-       if(_delFP) {
-               _delFP = false;
-               return;
-       }
-       _delWp = false;
-       _changeAppr = false;
-       
-       if(_kln89->_mode == KLN89_MODE_CRSR) {
-               if(_bEntWp) {
-                       if(_wLinePos < 4) _wLinePos++;
-               } else {
-                       // _uLinePos with empty/not-empty plan: 
-                       // 1 = Copy FPL 0? / Use?, 2 = unused if empty / Invert?, 3 = >Dis/Dtk field, 4+ = Waypoint 1+
-                       if(_uLinePos == 0) {
-                               _uLinePos = (_subPage == 0 ? 4 : 1);
-                       } else if(_uLinePos == 1) {
-                               _uLinePos = (_kln89->_flightPlans[_subPage]->IsEmpty() ? 4 : 2);
-                       } else if(_uLinePos == 2) {
-                               _uLinePos = 4;
-                       } else if(_uLinePos == 3) {
-                               if(!_kln89->_flightPlans[_subPage]->IsEmpty()) _uLinePos = 5;
-                       } else if(_uLinePos == 4) {
-                               _uLinePos = 3;
-                       } else if((_subPage == 0 && _uLinePos == 6) || (_subPage > 0 && _uLinePos == 5)) {
-                               // Urrggh - complicated!
-                               // 3 possibilities:
-                               // 1: We're on the entry field at the end of the list, and can't move any more.
-                               // 2: We're on the last or second-last field, and move to the last position
-                               // 3: We're on a field before the second-last one, and don't move, but change the list-head position
-                               // And 4: _subPage 0 can be complicated by the presence of header/fence lines in an approach.
-                               int hfcount = 0;
-                               if(_subPage == 0) {
-                                       if(_hdrPos >= 0) hfcount++;
-                                       if(_fencePos >= 0) hfcount++;
-                               }
-                               if(_kln89->_flightPlans[_subPage]->waypoints.size() == 1 || _fplPos == _kln89->_flightPlans[_subPage]->waypoints.size() + hfcount - 1) {
-                                       // 1: Don't move
-                               } else if(_fplPos >= _kln89->_flightPlans[_subPage]->waypoints.size() + hfcount - (_subPage == 0 ? 4 : 3)) {
-                                       _uLinePos++;
-                               } else {
-                                       _fplPos++;
-                               }
-                       } else if(_uLinePos == 5) {
-                               // Must be _subPage 0
-                               _uLinePos++;
-                       } else {
-                               // Must be the last line - either _uLinePos 6 or 7 depending on _subPage
-                               const unsigned thresh = (_subPage == 0 ? 3 : 2);
-                               if(_kln89->_flightPlans[_subPage]->waypoints.size() == thresh || _fplPos == _kln89->_flightPlans[_subPage]->waypoints.size() - thresh) {
-                                       // Don't move
-                               } else {
-                                       _fplPos++;
-                               }
-                       }
-                       
-                       if(_subPage == 0 && _uLinePos > 3) {
-                               int ix = _fplPos + (_uLinePos - 4);
-                               if(_fencePos >= 0 && ix >= _fencePos) ix--;
-                               if(_hdrPos >= 0 && ix >= _hdrPos) ix--;
-                               if(ix >= static_cast<int>(_kln89->_activeFP->waypoints.size())) {
-                                       _fp0SelWpId.clear();
-                               } else {
-                                       _fp0SelWpId = _kln89->_activeFP->waypoints[ix]->id;
-                               }
-                       } else {
-                               _fp0SelWpId.clear();
-                               //cout << "Not page 0, or not in waypoints, clearing id!\n";
-                       }
-               }
-       }
+    if(_delFP) {
+        _delFP = false;
+        return;
+    }
+    _delWp = false;
+    _changeAppr = false;
+    
+    if(_kln89->_mode == KLN89_MODE_CRSR) {
+        if(_bEntWp) {
+            if(_wLinePos < 4) _wLinePos++;
+        } else {
+            // _uLinePos with empty/not-empty plan: 
+            // 1 = Copy FPL 0? / Use?, 2 = unused if empty / Invert?, 3 = >Dis/Dtk field, 4+ = Waypoint 1+
+            if(_uLinePos == 0) {
+                _uLinePos = (_subPage == 0 ? 4 : 1);
+            } else if(_uLinePos == 1) {
+                _uLinePos = (_kln89->_flightPlans[_subPage]->IsEmpty() ? 4 : 2);
+            } else if(_uLinePos == 2) {
+                _uLinePos = 4;
+            } else if(_uLinePos == 3) {
+                if(!_kln89->_flightPlans[_subPage]->IsEmpty()) _uLinePos = 5;
+            } else if(_uLinePos == 4) {
+                _uLinePos = 3;
+            } else if((_subPage == 0 && _uLinePos == 6) || (_subPage > 0 && _uLinePos == 5)) {
+                // Urrggh - complicated!
+                // 3 possibilities:
+                // 1: We're on the entry field at the end of the list, and can't move any more.
+                // 2: We're on the last or second-last field, and move to the last position
+                // 3: We're on a field before the second-last one, and don't move, but change the list-head position
+                // And 4: _subPage 0 can be complicated by the presence of header/fence lines in an approach.
+                int hfcount = 0;
+                if(_subPage == 0) {
+                    if(_hdrPos >= 0) hfcount++;
+                    if(_fencePos >= 0) hfcount++;
+                }
+                if(_kln89->_flightPlans[_subPage]->waypoints.size() == 1 || _fplPos == _kln89->_flightPlans[_subPage]->waypoints.size() + hfcount - 1) {
+                    // 1: Don't move
+                } else if(_fplPos >= _kln89->_flightPlans[_subPage]->waypoints.size() + hfcount - (_subPage == 0 ? 4 : 3)) {
+                    _uLinePos++;
+                } else {
+                    _fplPos++;
+                }
+            } else if(_uLinePos == 5) {
+                // Must be _subPage 0
+                _uLinePos++;
+            } else {
+                // Must be the last line - either _uLinePos 6 or 7 depending on _subPage
+                const unsigned thresh = (_subPage == 0 ? 3 : 2);
+                if(_kln89->_flightPlans[_subPage]->waypoints.size() == thresh || _fplPos == _kln89->_flightPlans[_subPage]->waypoints.size() - thresh) {
+                    // Don't move
+                } else {
+                    _fplPos++;
+                }
+            }
+            
+            if(_subPage == 0 && _uLinePos > 3) {
+                int ix = _fplPos + (_uLinePos - 4);
+                if(_fencePos >= 0 && ix >= _fencePos) ix--;
+                if(_hdrPos >= 0 && ix >= _hdrPos) ix--;
+                if(ix >= static_cast<int>(_kln89->_activeFP->waypoints.size())) {
+                    _fp0SelWpId.clear();
+                } else {
+                    _fp0SelWpId = _kln89->_activeFP->waypoints[ix]->id;
+                }
+            } else {
+                _fp0SelWpId.clear();
+                //cout << "Not page 0, or not in waypoints, clearing id!\n";
+            }
+        }
+    }
 }
 
 void KLN89FplPage::Knob2Left1() {
-       if(_delFP) {
-               _delFP = false;
-               return;
-       }
-       _delWp = false;
+    if(_delFP) {
+        _delFP = false;
+        return;
+    }
+    _delWp = false;
 
-       if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
-               if(_kln89->_mode != KLN89_MODE_CRSR) _resetFplPos0 = true;
-               KLN89Page::Knob2Left1();
-       } else {
-               if(_uLinePos > 3) {
-                       // Check for approach waypoints or header/fences in flightplan 0
-                       int n = _fplPos + _uLinePos - 4;
-                       bool hdrPos = false;
-                       bool fencePos = false;
-                       bool appWp = false;
-                       //cout << "_fplPos = " << _fplPos << ", _uLinePos = " << _uLinePos << ", n = " << n << ", _hdrPos = " << _hdrPos << ", _fencePos = " << _fencePos << '\n';
-                       if(n == _hdrPos) {
-                               //cout << "HEADER POS\n";
-                               hdrPos = true;
-                       }
-                       if(n == _fencePos) {
-                               //cout << "FENCE POS\n";
-                               fencePos = true;
-                       }
-                       if(_hdrPos >= 0 && n > _hdrPos) --n;
-                       if(_fencePos >= 0 && n >= _fencePos) --n;       // This one needs to be >= since n is already decremented by 1 in the line above!
-                       //cout << "New n = " << n << '\n';
-                       
-                       if(n < static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size())) {
-                               if(_kln89->_flightPlans[_subPage]->waypoints[n]->appType != GPS_APP_NONE) {
-                                       appWp = true;
-                               }
-                       }
-                       
-                       if(hdrPos) {
-                               // TODO - not sure what we actually do in this condition
-                               _changeAppr = true;
-                       } else if(fencePos) {
-                               // no-op?
-                       } else if(appWp) {
-                               ShowScratchpadMessage("Invald", " Add  ");
-                       } else {
-                               if((_wLinePos + 1) > _entWpStr.size()) {
-                                       _entWpStr += '9';
-                               } else {
-                                       _entWpStr[_wLinePos] = _kln89->DecChar(_entWpStr[_wLinePos], (_wLinePos == 0 ? false : true));
-                               }
-                               _bEntWp = true;
-                               _fp0SelWpId.clear();    // Waypoints don't become the DTO default whilst being entered.
-                               
-        GPSWaypoint* wp = _kln89->FindFirstById(_entWpStr.substr(0, _wLinePos+1));
-                               if(NULL == wp) {
-                                       // no-op
-                               } else {
-                                       if(_entWp) {
-            *_entWp = *wp; // copy
-            delete wp;
-          } else {
-            _entWp = wp;
-            if(_fplPos + (_uLinePos - 4) >= _kln89->_flightPlans[_subPage]->waypoints.size()) {
-                                                       _kln89->_flightPlans[_subPage]->waypoints.push_back(_entWp);
-                                               } else {
-                                                       _kln89->_flightPlans[_subPage]->waypoints.insert(_kln89->_flightPlans[_subPage]->waypoints.begin()+(_fplPos + (_uLinePos - 4)), _entWp);
-                                               }
-          }
-                               }
-                       }
-               }
-       }
+    if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
+        if(_kln89->_mode != KLN89_MODE_CRSR) _resetFplPos0 = true;
+        KLN89Page::Knob2Left1();
+    } else {
+        if(_uLinePos > 3) {
+            // Check for approach waypoints or header/fences in flightplan 0
+            int n = _fplPos + _uLinePos - 4;
+            bool hdrPos = false;
+            bool fencePos = false;
+            bool appWp = false;
+            //cout << "_fplPos = " << _fplPos << ", _uLinePos = " << _uLinePos << ", n = " << n << ", _hdrPos = " << _hdrPos << ", _fencePos = " << _fencePos << '\n';
+            if(n == _hdrPos) {
+                //cout << "HEADER POS\n";
+                hdrPos = true;
+            }
+            if(n == _fencePos) {
+                //cout << "FENCE POS\n";
+                fencePos = true;
+            }
+            if(_hdrPos >= 0 && n > _hdrPos) --n;
+            if(_fencePos >= 0 && n >= _fencePos) --n;   // This one needs to be >= since n is already decremented by 1 in the line above!
+            //cout << "New n = " << n << '\n';
+            
+            if(n < static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size())) {
+                if(_kln89->_flightPlans[_subPage]->waypoints[n]->appType != GPS_APP_NONE) {
+                    appWp = true;
+                }
+            }
+            
+            if(hdrPos) {
+                // TODO - not sure what we actually do in this condition
+                _changeAppr = true;
+            } else if(fencePos) {
+                // no-op?
+            } else if(appWp) {
+                ShowScratchpadMessage("Invald", " Add  ");
+            } else {
+                if((_wLinePos + 1) > _entWpStr.size()) {
+                    _entWpStr += '9';
+                } else {
+                    _entWpStr[_wLinePos] = _kln89->DecChar(_entWpStr[_wLinePos], (_wLinePos == 0 ? false : true));
+                }
+                _bEntWp = true;
+                _fp0SelWpId.clear();    // Waypoints don't become the DTO default whilst being entered.
+                
+                GPSWaypoint* wp = _kln89->FindFirstById(_entWpStr.substr(0, _wLinePos+1));
+                if(NULL == wp) {
+                    // no-op
+                } else {
+                    if(_entWp) {
+                        *_entWp = *wp; // copy
+                        delete wp;
+                    } else {
+                        _entWp = wp;
+                        if(_fplPos + (_uLinePos - 4) >= _kln89->_flightPlans[_subPage]->waypoints.size()) {
+                            _kln89->_flightPlans[_subPage]->waypoints.push_back(_entWp);
+                        } else {
+                            _kln89->_flightPlans[_subPage]->waypoints.insert(_kln89->_flightPlans[_subPage]->waypoints.begin()+(_fplPos + (_uLinePos - 4)), _entWp);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
 
 void KLN89FplPage::Knob2Right1() {
-       if(_delFP) {
-               _delFP = false;
-               return;
-       }
-       _delWp = false;
+    if(_delFP) {
+        _delFP = false;
+        return;
+    }
+    _delWp = false;
 
-       if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
-               if(_kln89->_mode != KLN89_MODE_CRSR) _resetFplPos0 = true;
-               KLN89Page::Knob2Right1();
-       } else {
-               if(_uLinePos > 3) {
-                       // Check for approach waypoints or header/fences in flightplan 0
-                       int n = _fplPos + _uLinePos - 4;
-                       bool hdrPos = false;
-                       bool fencePos = false;
-                       bool appWp = false;
-                       //cout << "_fplPos = " << _fplPos << ", _uLinePos = " << _uLinePos << ", n = " << n << ", _hdrPos = " << _hdrPos << ", _fencePos = " << _fencePos << '\n';
-                       if(n == _hdrPos) {
-                               //cout << "HEADER POS\n";
-                               hdrPos = true;
-                       }
-                       if(n == _fencePos) {
-                               //cout << "FENCE POS\n";
-                               fencePos = true;
-                       }
-                       if(_hdrPos >= 0 && n > _hdrPos) --n;
-                       if(_fencePos >= 0 && n >= _fencePos) --n;       // This one needs to be >= since n is already decremented by 1 in the line above!
-                       //cout << "New n = " << n << '\n';
-                       
-                       if(n < static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size())) {
-                               if(_kln89->_flightPlans[_subPage]->waypoints[n]->appType != GPS_APP_NONE) {
-                                       appWp = true;
-                               }
-                       }
-                       
-                       if(hdrPos) {
-                               // TODO - not sure what we actually do in this condition
-                               _changeAppr = true;
-                       } else if(fencePos) {
-                               // no-op?
-                       } else if(appWp) {
-                               ShowScratchpadMessage("Invald", " Add  ");
-                       } else {
-                               if((_wLinePos + 1) > _entWpStr.size()) {
-                                       _entWpStr += '9';
-                               } else {
-                                       _entWpStr[_wLinePos] = _kln89->DecChar(_entWpStr[_wLinePos], (_wLinePos == 0 ? false : true));
-                               }
-                               _bEntWp = true;
-                               _fp0SelWpId.clear();    // Waypoints don't become the DTO default whilst being entered.
-                               
-        GPSWaypoint* wp = _kln89->FindFirstById(_entWpStr.substr(0, _wLinePos+1));
-                               if(NULL == wp) {
-                                       // no-op
-                               } else {
-                                       if(_entWp) {
-            *_entWp = *wp; // copy
-            delete wp;
-          } else {
-            _entWp = wp;
-            if(_fplPos + (_uLinePos - 4) >= _kln89->_flightPlans[_subPage]->waypoints.size()) {
-                                                       _kln89->_flightPlans[_subPage]->waypoints.push_back(_entWp);
-                                               } else {
-                                                       _kln89->_flightPlans[_subPage]->waypoints.insert(_kln89->_flightPlans[_subPage]->waypoints.begin()+(_fplPos + (_uLinePos - 4)), _entWp);
-                                               }
-          }
-                               }
-                       }
-               }
-       }
+    if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
+        if(_kln89->_mode != KLN89_MODE_CRSR) _resetFplPos0 = true;
+        KLN89Page::Knob2Right1();
+    } else {
+        if(_uLinePos > 3) {
+            // Check for approach waypoints or header/fences in flightplan 0
+            int n = _fplPos + _uLinePos - 4;
+            bool hdrPos = false;
+            bool fencePos = false;
+            bool appWp = false;
+            //cout << "_fplPos = " << _fplPos << ", _uLinePos = " << _uLinePos << ", n = " << n << ", _hdrPos = " << _hdrPos << ", _fencePos = " << _fencePos << '\n';
+            if(n == _hdrPos) {
+                //cout << "HEADER POS\n";
+                hdrPos = true;
+            }
+            if(n == _fencePos) {
+                //cout << "FENCE POS\n";
+                fencePos = true;
+            }
+            if(_hdrPos >= 0 && n > _hdrPos) --n;
+            if(_fencePos >= 0 && n >= _fencePos) --n;   // This one needs to be >= since n is already decremented by 1 in the line above!
+            //cout << "New n = " << n << '\n';
+            
+            if(n < static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size())) {
+                if(_kln89->_flightPlans[_subPage]->waypoints[n]->appType != GPS_APP_NONE) {
+                    appWp = true;
+                }
+            }
+            
+            if(hdrPos) {
+                // TODO - not sure what we actually do in this condition
+                _changeAppr = true;
+            } else if(fencePos) {
+                // no-op?
+            } else if(appWp) {
+                ShowScratchpadMessage("Invald", " Add  ");
+            } else {
+                if((_wLinePos + 1) > _entWpStr.size()) {
+                    _entWpStr += '9';
+                } else {
+                    _entWpStr[_wLinePos] = _kln89->DecChar(_entWpStr[_wLinePos], (_wLinePos == 0 ? false : true));
+                }
+                _bEntWp = true;
+                _fp0SelWpId.clear();    // Waypoints don't become the DTO default whilst being entered.
+                
+                GPSWaypoint* wp = _kln89->FindFirstById(_entWpStr.substr(0, _wLinePos+1));
+                if(NULL == wp) {
+                    // no-op
+                } else {
+                    if(_entWp) {
+                        *_entWp = *wp; // copy
+                        delete wp;
+                    } else {
+                        _entWp = wp;
+                        if(_fplPos + (_uLinePos - 4) >= _kln89->_flightPlans[_subPage]->waypoints.size()) {
+                            _kln89->_flightPlans[_subPage]->waypoints.push_back(_entWp);
+                        } else {
+                            _kln89->_flightPlans[_subPage]->waypoints.insert(_kln89->_flightPlans[_subPage]->waypoints.begin()+(_fplPos + (_uLinePos - 4)), _entWp);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }