1 // kln89_page_*.[ch]xx - this file is one of the "pages" that
2 // are used in the KLN89 GPS unit simulation.
4 // Written by David Luff, started 2005.
6 // Copyright (C) 2005 - David C Luff - david.luff@nottingham.ac.uk
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "kln89_page_ndb.hxx"
26 KLN89NDBPage::KLN89NDBPage(KLN89* parent)
35 KLN89NDBPage::~KLN89NDBPage() {
38 void KLN89NDBPage::Update(double dt) {
39 bool actPage = (_kln89->_activePage->GetName() == "ACT" ? true : false);
40 bool multi; // Not set by FindFirst...
42 if(_ndb_id.size() == 3) exact = true;
44 np = _kln89->FindFirstNDBById(_ndb_id, multi, exact);
45 } else if(np->get_ident() != _ndb_id) {
46 np = _kln89->FindFirstNDBById(_ndb_id, multi, exact);
48 //if(np == NULL) cout << "NULL... ";
49 //if(b == false) cout << "false...\n";
52 cout << "VOR FOUND!\n";
58 //cout << np->id << '\n';
59 _ndb_id = np->get_ident();
60 if(_kln89->GetActiveWaypoint()) {
61 if(_ndb_id == _kln89->GetActiveWaypoint()->id) {
62 if(!(_kln89->_waypointAlert && _kln89->_blink)) {
63 // Active waypoint arrow
64 _kln89->DrawSpecialChar(4, 2, 0, 3);
68 if(_kln89->_mode != KLN89_MODE_CRSR) {
71 _kln89->DrawText(np->get_ident(), 2, 1, 3);
73 // If it's the ACT page, The ID is shifted slightly right to make space for the waypoint index.
74 _kln89->DrawText(np->get_ident(), 2, 4, 3);
76 int n = snprintf(buf, 3, "%i", _kln89->GetActiveWaypointIndex() + 1);
77 _kln89->DrawText((string)buf, 2, 3 - n, 3);
81 _kln89->DrawText(np->get_ident(), 2, 1, 3, false, 99);
87 // TODO - trim VOR-DME from the name, convert to uppercase, abbreviate, etc
88 _kln89->DrawText(np->get_name(), 2, 0, 2);
89 _kln89->DrawLatitude(np->get_lat(), 2, 3, 1);
90 _kln89->DrawLongitude(np->get_lon(), 2, 3, 0);
92 _kln89->DrawDirDistField(np->get_lat() * SG_DEGREES_TO_RADIANS, np->get_lon() * SG_DEGREES_TO_RADIANS,
93 2, 0, 0, _to_flag, (_kln89->_mode == KLN89_MODE_CRSR && _uLinePos == 4 ? true : false));
96 if(_kln89->_mode != KLN89_MODE_CRSR) _kln89->DrawText(_ndb_id, 2, 1, 3);
98 _kln89->DrawText("----.-", 2, 9, 3);
99 _kln89->DrawText("--------------", 2, 0, 2);
100 _kln89->DrawText("- -- --.--'", 2, 3, 1);
101 _kln89->DrawText("---- --.--'", 2, 3, 0);
102 _kln89->DrawSpecialChar(0, 2, 7, 1);
103 _kln89->DrawSpecialChar(0, 2, 7, 0);
107 if(_kln89->_mode == KLN89_MODE_CRSR) {
108 if(_uLinePos > 0 && _uLinePos < 4) {
109 // TODO - blink as well
110 _kln89->Underline(2, _uLinePos, 3, 1);
112 for(unsigned int i = 0; i < _ndb_id.size(); ++i) {
113 if(_uLinePos != (i + 1)) {
114 _kln89->DrawChar(_ndb_id[i], 2, i + 1, 3);
116 if(!_kln89->_blink) _kln89->DrawChar(_ndb_id[i], 2, i + 1, 3);
123 KLN89Page::Update(dt);
126 void KLN89NDBPage::SetId(const string& s) {
127 _last_ndb_id = _ndb_id;
128 _save_ndb_id = _ndb_id;
133 void KLN89NDBPage::CrsrPressed() {
134 if(_kln89->_mode == KLN89_MODE_DISP) return;
135 if(_kln89->_obsMode) {
147 void KLN89NDBPage::ClrPressed() {
148 if(_subPage == 1 && _uLinePos == 4) {
149 _to_flag = !_to_flag;
153 void KLN89NDBPage::EntPressed() {
156 _last_ndb_id = _ndb_id;
157 _ndb_id = _save_ndb_id;
161 void KLN89NDBPage::Knob2Left1() {
162 if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
163 KLN89Page::Knob2Left1();
166 // Same logic for both pages - set the ID
167 _ndb_id = _ndb_id.substr(0, _uLinePos);
168 // ASSERT(_uLinePos > 0);
169 if(_uLinePos == (_ndb_id.size() + 1)) {
172 _ndb_id[_uLinePos - 1] = _kln89->DecChar(_ndb_id[_uLinePos - 1], (_uLinePos == 1 ? false : true));
178 // NO-OP - from/to field is switched by clr button, not inner knob.
184 void KLN89NDBPage::Knob2Right1() {
185 if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
186 KLN89Page::Knob2Right1();
189 // Same logic for both pages - set the ID
190 _ndb_id = _ndb_id.substr(0, _uLinePos);
191 // ASSERT(_uLinePos > 0);
192 if(_uLinePos == (_ndb_id.size() + 1)) {
195 _ndb_id[_uLinePos - 1] = _kln89->IncChar(_ndb_id[_uLinePos - 1], (_uLinePos == 1 ? false : true));
201 // NO-OP - from/to field is switched by clr button, not inner knob.