Subversion Repositories Projects

Rev

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