Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2136 | - | 1 | /***************************************************************************** |
2 | * Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de * |
||
3 | * Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net * |
||
4 | * Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net * |
||
5 | * Copyright (C) 2011 Harald Bongartz * |
||
6 | * * |
||
7 | * This program is free software; you can redistribute it and/or modify * |
||
8 | * it under the terms of the GNU General Public License as published by * |
||
9 | * the Free Software Foundation; either version 2 of the License. * |
||
10 | * * |
||
11 | * This program is distributed in the hope that it will be useful, * |
||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
||
14 | * GNU General Public License for more details. * |
||
15 | * * |
||
16 | * You should have received a copy of the GNU General Public License * |
||
17 | * along with this program; if not, write to the * |
||
18 | * Free Software Foundation, Inc., * |
||
19 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * |
||
20 | * * |
||
21 | * * |
||
22 | * Credits to: * |
||
23 | * Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN * |
||
24 | * http://www.mikrokopter.de * |
||
25 | * Gregor "killagreg" Stobrawa for his version of the MK code * |
||
26 | * Thomas Kaiser "thkais" for the original project. See * |
||
27 | * http://www.ft-fanpage.de/mikrokopter/ * |
||
28 | * http://forum.mikrokopter.de/topic-4061-1.html * |
||
29 | * Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code * |
||
30 | * http://www.mylifesucks.de/oss/c-osd/ * |
||
31 | * Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility* |
||
32 | *****************************************************************************/ |
||
33 | |||
34 | //############################################################################ |
||
35 | //# HISTORY mkbase.c |
||
36 | //# |
||
37 | //# 21.06.2014 OG |
||
38 | //# - chg: searchMK() schaltet am Ende wieder auf die NC um sofern diese |
||
39 | //# vorhanden ist |
||
40 | //# |
||
41 | //# 19.05.2014 OG |
||
42 | //# - chg: MKVersion_Setting_print() umgestellt auf strGet(STR_ERROR) fuer |
||
43 | //# Multi-Sprachenunterstuetzung |
||
44 | //# |
||
45 | //# 14.05.2014 OG |
||
46 | //# - chg: include "paramset.h" geaendert auf "../mksettings/paramset.h" |
||
47 | //# |
||
48 | //# 13.05.2014 OG |
||
49 | //# - chg: MK_Info() - del: MKINFO_AUTO_REFRESH (nicht mehr unterstuetzt) |
||
50 | //# - chg: MK_Setting_write() - del: unused variable 'lsetting' |
||
51 | //# |
||
52 | //# 17.04.2014 OG |
||
53 | //# - chg: MK_Setting_load - Ansprechverhalten verbessert wenn Windows |
||
54 | //# Mikrokoptertool aktiv ist |
||
55 | //# |
||
56 | //# 29.03.2014 OG |
||
57 | //# - del: MK_Show_LastGPS_Position() -> jetzt: OSDDATA_ShowLastGPSPosition()/osddata.c |
||
58 | //# |
||
59 | //# 28.03.2014 OG |
||
60 | //# - add: MK_Show_LastGPS_Position() - ehemals in main.c |
||
61 | //# |
||
62 | //# 24.03.2014 OG |
||
63 | //# - chg: searchMK(): doppeltes MK_SwitchToNC() um evtl. vorhandene NC |
||
64 | //# zuverlaessiger zu erkennen |
||
65 | //# - fix: searchMK(): RetVal initialisiert |
||
66 | //# - chg: Default-Anzeigezeit von MK_Info() in searchMK() auf 5 Sek. reduziert |
||
67 | //# |
||
68 | //# 21.02.2014 OG |
||
69 | //# - fix: MKVersion_Setting_print() Anzeige der Settings-Nummer gekuerzt |
||
70 | //# |
||
71 | //# 20.02.2014 OG |
||
72 | //#- chg: searchMK() auf aktuelle Version von PKT_TitlePKTVersion() angepasst |
||
73 | //# |
||
74 | //# 20.02.2014 OG |
||
75 | //# - chg: MKVersion_Setting_print() um ein paar Bytes zu sparen |
||
76 | //# - chg: MK_Info() um ein paar Bytes zu sparen |
||
77 | //# |
||
78 | //# 16.02.2014 OG |
||
79 | //# - add: MK_SwitchToNC(), MK_SwitchToFC(), MK_SwitchToMAG(), MK_SwitchToGPS() |
||
80 | //# - add: MK_Setting_write(), MK_Setting_change() |
||
81 | //# - chg: umbenannt: MK_load_setting() zu MK_Setting_load() |
||
82 | //# |
||
83 | //# 13.02.2014 OG |
||
84 | //# - add: MKVersion_Cmp() (Anleitung bei der Funktion beachten!) |
||
85 | //# - del: WrongFCVersion |
||
86 | //# |
||
87 | //# 12.02.2014 OG |
||
88 | //# - chg: verschiedene Verbesserungen an MK_Info(), MK_load_settings(), searckMK() |
||
89 | //# |
||
90 | //# 10.02.2014 OG |
||
91 | //# - add: MKVersion_Setting_print() |
||
92 | //# |
||
93 | //# 09.02.2014 OG |
||
94 | //# - add: MK_Info() |
||
95 | //# |
||
96 | //# 08.02.2014 OG |
||
97 | //# - chg: searckMK() Anpassung an MKVersion |
||
98 | //# - chg: MK_load_setting() Anpassung an MKVersion und Parameter geaendert |
||
99 | //# - add: MKVersion_Init(), MKVersion_print_at() |
||
100 | //# |
||
101 | //# 03.02.2014 OG |
||
102 | //# - chg: Titelanzeige in searchMK() umgestellt auf PKT_ShowTitlePKTVersion() |
||
103 | //# - chg: kleine Aenderung in der Anzeige "für FC..." in searchMK() |
||
104 | //# |
||
105 | //# 29.01.2014 OG |
||
106 | //# - Ausgliederungen aus main.c: MK_load_setting(), searchMK() |
||
107 | //############################################################################ |
||
108 | |||
109 | |||
110 | #include "../cpu.h" |
||
111 | #include <avr/io.h> |
||
112 | #include <inttypes.h> |
||
113 | #include <stdlib.h> |
||
114 | #include <avr/pgmspace.h> |
||
115 | #include <util/delay.h> |
||
116 | #include <string.h> |
||
117 | #include <util/atomic.h> |
||
118 | #include <avr/wdt.h> |
||
119 | #include <avr/eeprom.h> |
||
120 | |||
121 | |||
122 | //#include "../lipo/lipo.h" |
||
123 | #include "../main.h" |
||
124 | #include "../lipo/lipo.h" |
||
125 | #include "../lcd/lcd.h" |
||
126 | #include "../uart/usart.h" |
||
127 | |||
128 | #include "../uart/uart1.h" |
||
129 | #include "../mk-data-structs.h" |
||
130 | //#include "../menu.h" |
||
131 | #include "../timer/timer.h" |
||
132 | #include "../eeprom/eeprom.h" |
||
133 | #include "../messages.h" |
||
134 | #include "../utils/scrollbox.h" |
||
135 | #include "../utils/xutils.h" |
||
136 | #include "../pkt/pkt.h" |
||
137 | #include "../mksettings/paramset.h" |
||
138 | #include "mkbase.h" |
||
139 | |||
140 | |||
141 | |||
142 | //---------------------------- |
||
143 | // MK-Versionsinformationen |
||
144 | // global verfuegbar |
||
145 | //---------------------------- |
||
146 | MKVersion_t MKVersion; |
||
147 | |||
148 | uint8_t cmd; |
||
149 | |||
150 | |||
151 | //############################################################################################# |
||
152 | //# 1. MKVersion |
||
153 | //############################################################################################# |
||
154 | |||
155 | |||
156 | //-------------------------------------------------------------- |
||
157 | // MKVersion_Init() |
||
158 | // |
||
159 | // initialisiert MKVersion auf 0 |
||
160 | //-------------------------------------------------------------- |
||
161 | void MKVersion_Init( void ) |
||
162 | { |
||
163 | memset( &MKVersion, 0, sizeof(MKVersion_t) ); |
||
164 | } |
||
165 | |||
166 | |||
167 | |||
168 | //-------------------------------------------------------------- |
||
169 | // value = MKVersion_Cmp( FC/NCver, SWMajor,SWMinor,SWPatch ) |
||
170 | // |
||
171 | // Vergleicht eine uebergebene FC/NC-Version mit der vom MK |
||
172 | // ermittelten Version |
||
173 | // |
||
174 | // Parameter: |
||
175 | // |
||
176 | // FC/NCver: MKVersion.FCVer oder MKVersion.NCVer |
||
177 | // |
||
178 | // SWMajor,SWMinor,SWPatch: siehe nachfolgendes... |
||
179 | // |
||
180 | //--- |
||
181 | // Beispiel aus osd.c/OSD_MK_GetData(): |
||
182 | // |
||
183 | // v = MKVersion_Cmp( MKVersion.NCVer, 0,30,'g' ); // pruefe auf NC-Version "0.30g" |
||
184 | // |
||
185 | // if( v && (v >= GIVEN_VERSION) ) // wenn aktuelle NC-Version >= "0.30g"... |
||
186 | // { ... |
||
187 | // |
||
188 | // Sowas geht auch: |
||
189 | // |
||
190 | // if( v && (v == GIVEN_VERSION) ) // nur wenn aktuelle NC-Version == "0.30g"... |
||
191 | // |
||
192 | // oder: |
||
193 | // |
||
194 | // if( v && (v < GIVEN_VERSION) ) // nur wenn aktuelle NC-Version kleiner als "0.30g"... |
||
195 | // |
||
196 | //--- |
||
197 | // Warum "if( v && ..." ? |
||
198 | // |
||
199 | // Wenn das PKT keine FC/NC-Version ermitteln konnte, und somit kein |
||
200 | // Vergleich moeglich ist, gibt MKVersion_Cmp() false (=0) zurueck! |
||
201 | //-------------------------------------------------------------- |
||
202 | uint8_t MKVersion_Cmp( Version_t ver, unsigned char SWMajor, unsigned char SWMinor, unsigned char SWPatch ) |
||
203 | { |
||
204 | SWPatch = SWPatch -'a'; |
||
205 | |||
206 | if( ver.SWMajor > 0 || ver.SWMinor > 0 ) // NC/FC Version erkannt? |
||
207 | { |
||
208 | if( (ver.SWMajor == SWMajor) && (ver.SWMinor == SWMinor) && (ver.SWPatch == SWPatch) ) |
||
209 | return VERSION_EQUAL; // ==2 |
||
210 | |||
211 | if( ver.SWMajor != SWMajor ) |
||
212 | { |
||
213 | if( ver.SWMajor < SWMajor ) |
||
214 | return VERSION_LOWER; // ==1 |
||
215 | else |
||
216 | return VERSION_GREATER; // ==3 |
||
217 | } |
||
218 | |||
219 | if( ver.SWMinor != SWMinor ) |
||
220 | { |
||
221 | if( ver.SWMinor < SWMinor ) |
||
222 | return VERSION_LOWER; // ==1 |
||
223 | else |
||
224 | return VERSION_GREATER; // ==3 |
||
225 | } |
||
226 | |||
227 | if( ver.SWPatch < SWPatch ) |
||
228 | return VERSION_LOWER; // ==1 |
||
229 | else |
||
230 | return VERSION_GREATER; // ==3 |
||
231 | } |
||
232 | return VERSION_NO; // ==0 |
||
233 | } |
||
234 | |||
235 | |||
236 | |||
237 | //-------------------------------------------------------------- |
||
238 | // MKVersion_print_at() |
||
239 | // |
||
240 | // zeigt die aktuelle FC, NC Version auf dem LCD an |
||
241 | // |
||
242 | // Parameter: |
||
243 | // what: NC, FC, |
||
244 | //-------------------------------------------------------------- |
||
245 | void MKVersion_print_at( uint8_t x, uint8_t y, uint8_t what, uint8_t drawmode, int8_t xoffs, int8_t yoffs ) |
||
246 | { |
||
247 | const char *mask = PSTR("%1u.%02u%c"); |
||
248 | const char *nostr = PSTR("-----"); |
||
249 | |||
250 | switch(what) |
||
251 | { |
||
252 | case FC: if( MKVersion.FCVer.SWMajor > 0 || MKVersion.FCVer.SWMinor > 0 ) |
||
253 | lcdx_printf_at_P( x, y, drawmode, xoffs, yoffs, mask, MKVersion.FCVer.SWMajor, MKVersion.FCVer.SWMinor, MKVersion.FCVer.SWPatch+'a' ); |
||
254 | else |
||
255 | lcdx_printp_at( x,y, nostr, drawmode, xoffs, yoffs); |
||
256 | break; |
||
257 | |||
258 | case NC: if( (MKVersion.NCVer.SWMajor != 0) || (MKVersion.NCVer.SWMinor != 0) ) |
||
259 | lcdx_printf_at_P( x, y, drawmode, xoffs, yoffs, PSTR("%1u.%02u%c"), MKVersion.NCVer.SWMajor, MKVersion.NCVer.SWMinor, MKVersion.NCVer.SWPatch+'a' ); |
||
260 | else |
||
261 | lcdx_printp_at( x,y, nostr, drawmode, xoffs, yoffs); |
||
262 | break; |
||
263 | } |
||
264 | } |
||
265 | |||
266 | |||
267 | |||
268 | //-------------------------------------------------------------- |
||
269 | // MKVersion_Setting_print( y, drawmode, xoffs,yoffs) |
||
270 | // |
||
271 | // Zeigt das aktuelle MK-Setting aus MKVersion zentriert in der |
||
272 | // Zeile y auf dem PKT-Screen an |
||
273 | //-------------------------------------------------------------- |
||
274 | void MKVersion_Setting_print( uint8_t y, uint8_t drawmode, uint8_t xoffs, uint8_t yoffs ) |
||
275 | { |
||
276 | char buffer[18]; // String Buffer fuer eine Zeile |
||
277 | |||
278 | if( MKVersion.mksetting == 0 ) |
||
279 | xsnprintf_P( buffer, 18, PSTR("* %S *"), strGet(STR_ERROR) ); // FC Setting konnte NICHT gelesen werden |
||
280 | |||
281 | else if( MKVersion.mksetting != 0 && MKVersion.paramsetOK ) // FC-Setting wurde gelesen... |
||
282 | xsnprintf_P( buffer, 18, PSTR("%u %s"), MKVersion.mksetting, MKVersion.mksettingName ); // ... passende FC-Reversion -> Nummer und Name anzeigen |
||
283 | |||
284 | else |
||
285 | xsnprintf_P( buffer, 18, PSTR("%u"), MKVersion.mksetting ); // ... aber FALSCHE FC-Version -> nicht den Namen anzeigen (nur die Nummer) |
||
286 | |||
287 | lcdx_print_center( y, (unsigned char *)buffer, drawmode, xoffs,yoffs); // Ausgabe Setting-Name (zentriert) |
||
288 | } |
||
289 | |||
290 | |||
291 | |||
292 | |||
293 | //############################################################################################# |
||
294 | //# 2. Sonstiges - MK-Suche, Settings laden, MK-Info |
||
295 | //############################################################################################# |
||
296 | |||
297 | #define SWITCH_DELAY 25 // alt 50 |
||
298 | |||
299 | //-------------------------------------------------------------- |
||
300 | //-------------------------------------------------------------- |
||
301 | void MK_SwitchToNC( void ) |
||
302 | { |
||
303 | // switch to NC |
||
304 | USART_putc (0x1b); |
||
305 | USART_putc (0x1b); |
||
306 | USART_putc (0x55); |
||
307 | USART_putc (0xaa); |
||
308 | USART_putc (0x00); |
||
309 | current_hardware = NC; |
||
310 | _delay_ms( SWITCH_DELAY ); |
||
311 | } |
||
312 | |||
313 | |||
314 | //-------------------------------------------------------------- |
||
315 | //-------------------------------------------------------------- |
||
316 | void MK_SwitchToFC( void ) |
||
317 | { |
||
318 | // switch to FC |
||
319 | cmd = 0x00; // 0 = FC, 1 = MK3MAG, 2 = MKGPS |
||
320 | SendOutData('u', ADDRESS_NC, 1, &cmd, 1); |
||
321 | current_hardware = FC; |
||
322 | _delay_ms( SWITCH_DELAY ); |
||
323 | } |
||
324 | |||
325 | |||
326 | //-------------------------------------------------------------- |
||
327 | //-------------------------------------------------------------- |
||
328 | void MK_SwitchToMAG( void ) |
||
329 | { |
||
330 | // switch to MK3MAG |
||
331 | cmd = 0x01; // 0 = FC, 1 = MK3MAG, 2 = MKGPS |
||
332 | SendOutData('u', ADDRESS_NC, 1, &cmd, 1); |
||
333 | current_hardware = MK3MAG; |
||
334 | _delay_ms( SWITCH_DELAY ); |
||
335 | } |
||
336 | |||
337 | |||
338 | //-------------------------------------------------------------- |
||
339 | //-------------------------------------------------------------- |
||
340 | void MK_SwitchToGPS( void ) |
||
341 | { |
||
342 | // switch to MKGPS |
||
343 | cmd = 0x02; // 0 = FC, 1 = MK3MAG, 2 = MKGPS |
||
344 | SendOutData('u', ADDRESS_NC, 1, &cmd, 1); |
||
345 | current_hardware = MKGPS; |
||
346 | _delay_ms( SWITCH_DELAY ); |
||
347 | } |
||
348 | |||
349 | |||
350 | |||
351 | //-------------------------------------------------------------- |
||
352 | // ret = MK_Setting_load( lsetting, &mk_param_struct, showerror) |
||
353 | // |
||
354 | // holt MK-Settings - es wird auf die FC umgeschaltet! |
||
355 | //-------------------------------------------------------------- |
||
356 | uint8_t MK_Setting_load( uint8_t lsetting, uint8_t timeout ) |
||
357 | { |
||
358 | // timeout = 15 bis 20 ist meist ein guter Wert |
||
359 | |||
360 | //MK_SwitchToFC(); |
||
361 | |||
362 | mode = 'Q'; // Settings Request |
||
363 | rxd_buffer_locked = FALSE; |
||
364 | |||
365 | while( !rxd_buffer_locked && timeout ) |
||
366 | { |
||
367 | MK_SwitchToFC(); |
||
368 | SendOutData( 'q', ADDRESS_FC, 1, &lsetting, 1); // lsetting == 0xff -> aktuelles MK-Setting laden |
||
369 | |||
370 | timer2 = 25; // timer ist ggf. belegt von MK_Info() -> versuchen wir es mit timer2.... |
||
371 | while( timer2 > 0 && !rxd_buffer_locked ); |
||
372 | |||
373 | timeout--; |
||
374 | } |
||
375 | |||
376 | mode = 0; |
||
377 | |||
378 | // Initialisierungen |
||
379 | paramsetInit(0); |
||
380 | |||
381 | if( rxd_buffer_locked ) |
||
382 | { |
||
383 | Decode64(); |
||
384 | paramsetInit( (unsigned char *) pRxData ); // fuellt u.a. auch MKVersion.paramsetRevision |
||
385 | } |
||
386 | |||
387 | return MKVersion.mksetting; // wird von paramsetInit() gesetzt/initialisert |
||
388 | } |
||
389 | |||
390 | |||
391 | |||
392 | //-------------------------------------------------------------- |
||
393 | //-------------------------------------------------------------- |
||
394 | uint8_t MK_Setting_write( uint8_t wsetting, uint8_t timeout) |
||
395 | { |
||
396 | //uint8_t timeout = 50; |
||
397 | uint8_t setting; |
||
398 | |||
399 | if( !MKVersion.paramsetOK ) |
||
400 | { |
||
401 | return 0; // Error |
||
402 | } |
||
403 | |||
404 | //MK_SwitchToFC(); // ? |
||
405 | |||
406 | setting = 0; |
||
407 | mode = 'S'; // Settings |
||
408 | |||
409 | rxd_buffer_locked = FALSE; |
||
410 | |||
411 | while( !rxd_buffer_locked && timeout && !setting) |
||
412 | { |
||
413 | SendOutData( 's', ADDRESS_FC, 2, &wsetting, 1, (pRxData+1), paramsetSize() ); // pRxData+1 = die mk_datastruct beginnt bei +1; bei 0 ist die Settingsnummer |
||
414 | |||
415 | timer2 = 70; |
||
416 | while( timer2 > 0 && !rxd_buffer_locked ); |
||
417 | timeout--; |
||
418 | |||
419 | if( rxd_buffer_locked ) |
||
420 | { |
||
421 | Decode64(); |
||
422 | setting = *pRxData; |
||
423 | |||
424 | if( !setting ) |
||
425 | rxd_buffer_locked = FALSE; |
||
426 | } |
||
427 | } |
||
428 | |||
429 | setting = MK_Setting_load( 0xff, 15); // damit pRxData & MKVersion initialisiert sind |
||
430 | |||
431 | return setting; |
||
432 | } |
||
433 | |||
434 | |||
435 | |||
436 | //-------------------------------------------------------------- |
||
437 | //-------------------------------------------------------------- |
||
438 | uint8_t MK_Setting_change( uint8_t setting ) |
||
439 | { |
||
440 | uint8_t lsetting = 0; |
||
441 | uint8_t wsetting = 0; |
||
442 | |||
443 | lsetting = MK_Setting_load( setting, 20); |
||
444 | |||
445 | if( lsetting == setting ) |
||
446 | { |
||
447 | wsetting = MK_Setting_write( setting, 50); |
||
448 | } |
||
449 | |||
450 | /* |
||
451 | //-------------------- |
||
452 | // DEBUG... |
||
453 | //-------------------- |
||
454 | lcd_printf_at_P( 0, 1, MNORMAL, PSTR("load : %1u (req:%1u)"), lsetting, setting ); |
||
455 | lcd_printf_at_P( 0, 2, MNORMAL, PSTR("write: %1u "), wsetting ); |
||
456 | if( (setting != lsetting) || (setting != wsetting) ) |
||
457 | set_beep( 1000, 0x0f0f, BeepNormal ); // Error |
||
458 | timer2 = 500; while( timer2 > 0 ); |
||
459 | */ |
||
460 | |||
461 | return wsetting; // 0 = Fehler; oder 1..5 = geschriebenes Setting |
||
462 | } |
||
463 | |||
464 | |||
465 | |||
466 | //-------------------------------------------------------------- |
||
467 | // ok = searchMK( showMKInfo ) |
||
468 | // |
||
469 | // Parameter: |
||
470 | // showMKInfo: true/false |
||
471 | //-------------------------------------------------------------- |
||
472 | uint8_t searchMK( uint8_t showMKInfo ) |
||
473 | { |
||
474 | uint8_t timeout; |
||
475 | //uint8_t setting; // aktuelles FC-Setting (1..5) |
||
476 | uint8_t RetVal = false; |
||
477 | uint8_t redraw = true; |
||
478 | uint8_t searchbar_y; |
||
479 | uint8_t searchbar_w = 0; |
||
480 | |||
481 | |||
482 | MKVersion_Init(); |
||
483 | |||
484 | //---------------- |
||
485 | // Switch to NC |
||
486 | //---------------- |
||
487 | MK_SwitchToNC(); |
||
488 | _delay_ms(50); // 24.03.2014 OG: manchmal wurde nicht auf eine vorhandene NC umgeschaltet |
||
489 | MK_SwitchToNC(); // evtl. wird das durch doppeltes Senden verbessert |
||
490 | |||
491 | //--------------------------------------- |
||
492 | // MK-Suchscreen - Versionsabfrage NC |
||
493 | //--------------------------------------- |
||
494 | mode = 'V'; |
||
495 | |||
496 | rxd_buffer_locked = FALSE; |
||
497 | timeout = 50; |
||
498 | |||
499 | //searchbar_y = 5*8-1; |
||
500 | searchbar_y = 5*8+2; |
||
501 | |||
502 | while( !rxd_buffer_locked ) |
||
503 | { |
||
504 | //------------------------ |
||
505 | // MK Suchscreen anzeigen |
||
506 | //------------------------ |
||
507 | if( redraw ) |
||
508 | { |
||
509 | PKT_TitlePKT(); // Titel mit PKT-Version anzeigen (mit Lipo-Anzeige) |
||
510 | lcdx_printp_center( 2, strGet(STR_PKT), MNORMAL, 0,2); // "PKT" |
||
511 | lcdx_printp_at( 0, 3, strGet(START_SEARCHFC), MNORMAL, 0,8); // "suche Mikrokopter..." |
||
512 | |||
513 | lcd_printp_at(12, 7, strGet(ENDE), MNORMAL); // Keyline |
||
514 | |||
515 | lcd_rect ( 0, searchbar_y , 126, 8, 1); // Rahmen fuer Bar-Anzeige |
||
516 | |||
517 | searchbar_w = 2; |
||
518 | |||
519 | redraw = false; |
||
520 | } |
||
521 | |||
522 | //------------------------ |
||
523 | // PKT-LiPo Anzeige |
||
524 | //------------------------ |
||
525 | show_Lipo(); |
||
526 | |||
527 | //------------------------ |
||
528 | // MK Datenanfrage |
||
529 | //------------------------ |
||
530 | SendOutData( 'v', ADDRESS_ANY, 0); // Versions-Anfrage an MK senden |
||
531 | |||
532 | timer = 16; // kurze Verögerung fuer Datenanfrage und Fortschrittsbalken |
||
533 | while( timer > 0 ); |
||
534 | |||
535 | //------------------------ |
||
536 | // Fortschrittsbalken |
||
537 | //------------------------ |
||
538 | lcd_frect( 2, searchbar_y+2, searchbar_w, 4, 1); // Fortschrittsbalken zeichnen... |
||
539 | searchbar_w += 2; |
||
540 | if( searchbar_w >= 125 ) |
||
541 | { |
||
542 | searchbar_w = 0; |
||
543 | lcd_frect( 2, searchbar_y+2, 123, 4, 0); |
||
544 | } |
||
545 | |||
546 | //------------------------ |
||
547 | // Tasten abfragen |
||
548 | //------------------------ |
||
549 | if( get_key_press(1 << KEY_ESC) ) |
||
550 | { |
||
551 | hardware = NO; |
||
552 | return false; |
||
553 | } |
||
554 | |||
555 | //------------------------------------------ |
||
556 | // Pruefe PKT-Update oder andere PKT-Aktion |
||
557 | //------------------------------------------ |
||
558 | if( PKT_CtrlHook() ) // Update vom Updatetool angefordert? |
||
559 | { |
||
560 | redraw = true; |
||
561 | } |
||
562 | } |
||
563 | |||
564 | |||
565 | |||
566 | //-------------------------- |
||
567 | // MK gefunden? |
||
568 | //-------------------------- |
||
569 | if( rxd_buffer_locked ) |
||
570 | { |
||
571 | Decode64(); |
||
572 | |||
573 | //--- |
||
574 | // TODO OG: testen mit entsprechendem Hardware Setup des MK's! |
||
575 | //--- |
||
576 | if( (rxd_buffer[1] - 'a') == ADDRESS_FC ) |
||
577 | { |
||
578 | hardware = FC; |
||
579 | current_hardware = hardware; |
||
580 | MKVersion.isFC = true; |
||
581 | RetVal = true; |
||
582 | memcpy( &MKVersion.FCVer, (Version_t *) (pRxData), sizeof(Version_t) ); |
||
583 | } |
||
584 | |||
585 | if( (rxd_buffer[1] - 'a') == ADDRESS_NC ) |
||
586 | { |
||
587 | hardware = NC; |
||
588 | current_hardware = hardware; |
||
589 | MKVersion.isNC = true; |
||
590 | RetVal = true; |
||
591 | memcpy( &MKVersion.NCVer, (Version_t *) (pRxData), sizeof(Version_t) ); |
||
592 | } |
||
593 | |||
594 | |||
595 | //-------------------------- |
||
596 | // jetzt: Version der FC abfragen |
||
597 | //-------------------------- |
||
598 | if( hardware == NC ) |
||
599 | { |
||
600 | MK_SwitchToFC(); |
||
601 | |||
602 | mode = 'V'; |
||
603 | rxd_buffer_locked = FALSE; |
||
604 | timeout = 40; |
||
605 | |||
606 | while( !rxd_buffer_locked && timeout) |
||
607 | { |
||
608 | SendOutData( 'v', ADDRESS_FC, 0); |
||
609 | timer = 20; |
||
610 | while( timer > 0 ); |
||
611 | timeout--; |
||
612 | } |
||
613 | |||
614 | //-------------------------- |
||
615 | // FC gefunden! |
||
616 | // -> Version kopieren |
||
617 | //-------------------------- |
||
618 | if( rxd_buffer_locked ) |
||
619 | { |
||
620 | Decode64(); |
||
621 | MKVersion.isFC = true; |
||
622 | memcpy( &MKVersion.FCVer, (Version_t *) (pRxData), sizeof(Version_t) ); |
||
623 | } |
||
624 | } |
||
625 | |||
626 | } // end: if( rxd_buffer_locked ) |
||
627 | |||
628 | |||
629 | //--------------------------------------- |
||
630 | // FC EEprom Version / Struktur pruefen |
||
631 | //--------------------------------------- |
||
632 | MK_Setting_load( 0xff, 15 ); // 0xff == aktuelles Parameterset holen; 15 == timeout; Ergebnisse in MKVersion |
||
633 | |||
634 | mode = 0; |
||
635 | rxd_buffer_locked = FALSE; |
||
636 | |||
637 | if( MKVersion.isNC ) |
||
638 | { |
||
639 | MK_SwitchToNC(); // wieder auf NC umschalten als default |
||
640 | } |
||
641 | |||
642 | |||
643 | if( MKVersion.paramsetOK ) // FC Revision OK? |
||
644 | { |
||
645 | set_beep( 25, 0xffff, BeepNormal ); // kurzer Beep (FC-Revision ok) |
||
646 | if( showMKInfo ) MK_Info( 500, true ); // Anzeige von MK_Info() max. 5 Sekunden (mit Settings-Refresh) |
||
647 | } |
||
648 | else // FC Revision nicht unterstuetzt... |
||
649 | { |
||
650 | set_beep( 1000, 0xffff, BeepNormal ); // langer Error-Beep (FC-Revision nicht unterstuetzt) |
||
651 | if( showMKInfo ) MK_Info( 1600, true ); // Anzeige von MK_Info() max. 16 Sekunden (mit Settings-Refresh) |
||
652 | } |
||
653 | |||
654 | |||
655 | //timer = 50; |
||
656 | //while (timer > 0); |
||
657 | |||
658 | get_key_press(KEY_ALL); |
||
659 | |||
660 | return RetVal; |
||
661 | |||
662 | } // searchMK() |
||
663 | |||
664 | |||
665 | |||
666 | |||
667 | //-------------------------------------------------------------- |
||
668 | // chg = MK_Info( displaytimeout, refreshSettings ) |
||
669 | // |
||
670 | // Parameter: |
||
671 | // displaytimeout : 0 = kein autom. Timeout |
||
672 | // n = Anzeige verschwindet automatisch nach n Zeit |
||
673 | // (bei z.B. n=600 nach 6 Sekunden) |
||
674 | // |
||
675 | // refreshSettings: true/false |
||
676 | // true = in bestimmten Zeitintervallen (RELOAD_SETTING_TIME) |
||
677 | // wird MK_Setting_load() durchgeführt um ggf. einen Kopterwechsel |
||
678 | // automatisch zu erkennen. |
||
679 | // Dazu muss MKINFO_AUTO_REFRESH in main.h eingeschaltet sein! |
||
680 | // |
||
681 | // Rueckgabe: |
||
682 | // hardwarechange: true/false |
||
683 | //-------------------------------------------------------------- |
||
684 | uint8_t MK_Info( uint16_t displaytimeout, uint8_t refreshSettings ) |
||
685 | { |
||
686 | uint8_t redraw; |
||
687 | uint8_t old_isFC; |
||
688 | uint8_t old_isNC; |
||
689 | |||
690 | old_isFC = MKVersion.isFC; |
||
691 | old_isNC = MKVersion.isNC; |
||
692 | |||
693 | |||
694 | //displaytimeout = 0; |
||
695 | |||
696 | if( displaytimeout ) |
||
697 | timer = displaytimeout; |
||
698 | |||
699 | #define RELOAD_SETTING_TIME 350 // alle 0.35 sec neue Settings vom MK laden |
||
700 | timer_get_tidata = RELOAD_SETTING_TIME; // ich brauche weitere timer... und bediene mich jetzt mal bei einem osd-timer |
||
701 | // (timer2 ist belegt von MK_Setting_load) |
||
702 | |||
703 | //get_key_press(KEY_ALL); |
||
704 | |||
705 | |||
706 | redraw = true; |
||
707 | |||
708 | while( true ) |
||
709 | { |
||
710 | //------------------------------------------ |
||
711 | // Screen neu zeichnen |
||
712 | //------------------------------------------ |
||
713 | if( redraw ) |
||
714 | { |
||
715 | if( redraw != 2 ) |
||
716 | lcd_cls(); |
||
717 | |||
718 | show_Lipo(); // LiPo direkt anzeigen damit es nicht flackert |
||
719 | |||
720 | lcd_frect( 0, 0, 101, 8, 1); // Headline: Box fill Black mit Platz fuer PKT-LiPo rechts |
||
721 | lcdx_printp_at( 1, 0, PSTR("MK Info"), MINVERS, 0,0); // Titel |
||
722 | |||
723 | if( MKVersion.isFC || MKVersion.isNC ) // MK gefunden... |
||
724 | { |
||
725 | lcd_frect_round( 0, 30, 127, 22, 1, R2); // Fill: Anzeigebereich der Settings in Schwarz |
||
726 | |||
727 | //-------------------- |
||
728 | // FC-Version |
||
729 | //-------------------- |
||
730 | lcdx_printp_at( 0, 2, PSTR("FC:") , MNORMAL, 4,-5); |
||
731 | MKVersion_print_at( 4, 2, FC , MNORMAL, 2,-5); |
||
732 | |||
733 | //-------------------- |
||
734 | // FC-Revision |
||
735 | //-------------------- |
||
736 | lcdx_printp_at( 12, 2, PSTR("Rev:"), MNORMAL, 5,-5); |
||
737 | lcdx_printf_at_P( 17, 2, MNORMAL, 2,-5, PSTR("%03u"), MKVersion.paramsetRevision ); |
||
738 | |||
739 | if( !MKVersion.paramsetOK ) |
||
740 | lcdx_printp_at( 11, 3, PSTR(" Rev-ERR!"), MINVERS, 5,-4); // Fehler FC-Revision (nicht vom PKT unterstuetzt) |
||
741 | else |
||
742 | lcd_frect( 11*6+5, 3*8-4, 9*6, 8, 0); // ggf. Fehleranzeige loeschen (nach refreshSettings) |
||
743 | |||
744 | |||
745 | //-------------------- |
||
746 | // NC-Version |
||
747 | //-------------------- |
||
748 | lcdx_printp_at( 0, 3, PSTR("NC:") , MNORMAL, 4,-3); |
||
749 | MKVersion_print_at( 4, 3, NC , MNORMAL, 2,-3); |
||
750 | |||
751 | |||
752 | //-------------------- |
||
753 | // aktuelles Setting |
||
754 | //-------------------- |
||
755 | lcdx_printp_center( 4, PSTR("MK Setting"), MINVERS, 0,1); // "MK Setting" (zentriert) |
||
756 | |||
757 | //lcdx_printp_at( 5, 4, PSTR("MK Setting"), MINVERS, 4,1); |
||
758 | MKVersion_Setting_print( 5, MINVERS, 0,3); |
||
759 | } |
||
760 | else // else: if( MKVersion.isFC || MKVersion.isNC ) // KEINEN MK gefunden... |
||
761 | { |
||
762 | //PKT_Message_P( *text, error, timeout, beep, clearscreen ) |
||
763 | PKT_Message_P( strGet(NOMKFOUND), false, 0, true, false ); // FEHLER! nodata (max. 8 Sekunden anzeigen) |
||
764 | |||
765 | } // end: if( MKVersion.isFC || MKVersion.isNC ) |
||
766 | |||
767 | |||
768 | //lcd_printp_at( 19, 7, strGet(OK), MNORMAL); // Keyline |
||
769 | lcd_printp_at(12, 7, strGet(ENDE), MNORMAL); // Keyline |
||
770 | |||
771 | if( displaytimeout == 0 ) |
||
772 | lcd_printp_at( 0, 7, PSTR("Refresh"), MNORMAL); // Keyline: Refresh |
||
773 | |||
774 | redraw = false; |
||
775 | |||
776 | } // end: if( redraw ) |
||
777 | |||
778 | |||
779 | //------------------------------------------ |
||
780 | // PKT-LiPo Anzeige |
||
781 | //------------------------------------------ |
||
782 | show_Lipo(); |
||
783 | |||
784 | |||
785 | //------------------------ |
||
786 | // Tasten abfragen |
||
787 | //------------------------ |
||
788 | if( get_key_press(1 << KEY_MINUS) && (displaytimeout == 0) ) |
||
789 | { |
||
790 | searchMK( false ); // false = zeige nicht MK_Info() an |
||
791 | redraw = true; |
||
792 | } |
||
793 | |||
794 | if( get_key_short(1 << KEY_ESC) ) |
||
795 | { |
||
796 | break; |
||
797 | } |
||
798 | |||
799 | |||
800 | //------------------------------------------ |
||
801 | // Pruefe PKT-Update oder andere PKT-Aktion |
||
802 | //------------------------------------------ |
||
803 | if( PKT_CtrlHook() ) // Update vom Updatetool angefordert? |
||
804 | { |
||
805 | redraw = true; |
||
806 | } |
||
807 | |||
808 | //------------------------------------------ |
||
809 | // displaytimeout? |
||
810 | //------------------------------------------ |
||
811 | if( displaytimeout && !timer ) |
||
812 | { |
||
813 | break; |
||
814 | } |
||
815 | |||
816 | } // end: while( true ) |
||
817 | |||
818 | get_key_press(KEY_ALL); |
||
819 | |||
820 | return( (old_isFC != MKVersion.isFC) || (old_isNC != MKVersion.isNC) ); |
||
821 | |||
822 | } // MK_Info() |
||
823 | |||
824 | |||
825 |