]> git.mxchange.org Git - flightgear.git/blob - src/Instrumentation/KLN89/kln89_page_ndb.cxx
Alex Romosan: Pass strings by reference not value
[flightgear.git] / src / Instrumentation / KLN89 / kln89_page_ndb.cxx
1 // kln89_page_*.[ch]xx - this file is one of the "pages" that
2 //                       are used in the KLN89 GPS unit simulation. 
3 //
4 // Written by David Luff, started 2005.
5 //
6 // Copyright (C) 2005 - David C Luff - david.luff@nottingham.ac.uk
7 //
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.
12 //
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.
17 //
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.
21 //
22 // $Id$
23
24 #include "kln89_page_ndb.hxx"
25
26 KLN89NDBPage::KLN89NDBPage(KLN89* parent) 
27 : KLN89Page(parent) {
28         _nSubPages = 2;
29         _subPage = 0;
30         _name = "NDB";
31         _ndb_id = "SF";
32         np = NULL;
33 }
34
35 KLN89NDBPage::~KLN89NDBPage() {
36 }
37
38 void KLN89NDBPage::Update(double dt) {
39         bool actPage = (_kln89->_activePage->GetName() == "ACT" ? true : false);
40         bool multi;  // Not set by FindFirst...
41         bool exact = false;
42         if(_ndb_id.size() == 3) exact = true;
43         if(np == NULL) {
44                 np = _kln89->FindFirstNDBById(_ndb_id, multi, exact);
45         } else if(np->get_ident() != _ndb_id) {
46                 np = _kln89->FindFirstNDBById(_ndb_id, multi, exact);
47         }
48         //if(np == NULL) cout << "NULL... ";
49         //if(b == false) cout << "false...\n";
50         /*
51         if(np && b) {
52                 cout << "VOR FOUND!\n";
53         } else {
54                 cout << ":-(\n";
55         }
56         */
57         if(np) {
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);
65                                 }
66                         }
67                 }
68                 if(_kln89->_mode != KLN89_MODE_CRSR) {
69                         if(!_entInvert) {
70                                 if(!actPage) {
71                                         _kln89->DrawText(np->get_ident(), 2, 1, 3);
72                                 } else {
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);
75                                         char buf[3];
76                                         int n = snprintf(buf, 3, "%i", _kln89->GetActiveWaypointIndex() + 1);
77                                         _kln89->DrawText((string)buf, 2, 3 - n, 3);
78                                 }
79                         } else {
80                                 if(!_kln89->_blink) {
81                                         _kln89->DrawText(np->get_ident(), 2, 1, 3, false, 99);
82                                         _kln89->DrawEnt();
83                                 }
84                         }
85                 }
86                 if(_subPage == 0) {
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);
91                 } else {
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));
94                 }
95         } else {
96                 if(_kln89->_mode != KLN89_MODE_CRSR) _kln89->DrawText(_ndb_id, 2, 1, 3);
97                 if(_subPage == 0) {
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);
104                 }
105         }
106         
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);
111                 }
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);
115                         } else {
116                                 if(!_kln89->_blink) _kln89->DrawChar(_ndb_id[i], 2, i + 1, 3);
117                         }
118                 }
119         }
120         
121         _id = _ndb_id;
122
123         KLN89Page::Update(dt);
124 }
125
126 void KLN89NDBPage::SetId(const string& s) {
127         _last_ndb_id = _ndb_id;
128         _save_ndb_id = _ndb_id;
129         _ndb_id = s;
130         np = NULL;
131 }
132
133 void KLN89NDBPage::CrsrPressed() {
134         if(_kln89->_mode == KLN89_MODE_DISP) return;
135         if(_kln89->_obsMode) {
136                 _uLinePos = 0;
137         } else {
138                 _uLinePos = 1;
139         }
140         if(_subPage == 0) {
141                 _maxULinePos = 17;
142         } else {
143                 _maxULinePos = 4;
144         }
145 }
146
147 void KLN89NDBPage::ClrPressed() {
148         if(_subPage == 1 && _uLinePos == 4) {
149                 _to_flag = !_to_flag;
150         }
151 }
152
153 void KLN89NDBPage::EntPressed() {
154         if(_entInvert) {
155                 _entInvert = false;
156                 _last_ndb_id = _ndb_id;
157                 _ndb_id = _save_ndb_id;
158         }
159 }
160
161 void KLN89NDBPage::Knob2Left1() {
162         if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
163                 KLN89Page::Knob2Left1();
164         } else {
165                 if(_uLinePos < 4) {
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)) {
170                                 _ndb_id += '9';
171                         } else {
172                                 _ndb_id[_uLinePos - 1] = _kln89->DecChar(_ndb_id[_uLinePos - 1], (_uLinePos == 1 ? false : true));
173                         }
174                 } else {
175                         if(_subPage == 0) {
176                                 // set by name
177                         } else {
178                                 // NO-OP - from/to field is switched by clr button, not inner knob.
179                         }
180                 }
181         }
182 }
183
184 void KLN89NDBPage::Knob2Right1() {
185         if(_kln89->_mode != KLN89_MODE_CRSR || _uLinePos == 0) {
186                 KLN89Page::Knob2Right1();
187         } else {
188                 if(_uLinePos < 4) {
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)) {
193                                 _ndb_id += 'A';
194                         } else {
195                                 _ndb_id[_uLinePos - 1] = _kln89->IncChar(_ndb_id[_uLinePos - 1], (_uLinePos == 1 ? false : true));
196                         }
197                 } else {
198                         if(_subPage == 0) {
199                                 // set by name
200                         } else {
201                                 // NO-OP - from/to field is switched by clr button, not inner knob.
202                         }
203                 }
204         }
205 }