Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1517 - 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
#include "cpu.h"
36
#include <avr/io.h>
37
#include <inttypes.h>
38
#include <stdlib.h>
39
#include <avr/pgmspace.h>
40
#include <avr/wdt.h>
41
#include <util/delay.h>
42
#include <avr/eeprom.h>
43
 
44
//************************************************************************************
45
// Watchdog integrieren und abschalten, wird für Bootloader benötigt
46
// !!muss hier stehen bleiben!!
47
 
48
//--------------------------------------------------------------
49
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
50
 
51
//--------------------------------------------------------------
52
void wdt_init(void)
53
{
54
        MCUSR = 0;
55
        wdt_disable();
56
        return;
57
}
58
 
59
//************************************************************************************
60
// erst ab hier weitere #includes
61
 
62
 
63
#include "lipo.h"
64
#include "main.h"
65
#include "lcd.h"
66
#include "usart.h"
67
#include "uart1.h"
68
#include "mk-data-structs.h"
69
#include "parameter.h"
70
#include "menu.h"
71
#include "display.h"
72
#include "timer.h"
73
#include "eeprom.h"
74
#include "Wi232.h"
75
#include "twimaster.h"
76
#include "messages.h"
77
 
78
//#define MTEST 0       // Menu Test (skip FC/NC detection)
79
 
80
Version_t *version;
81
 
82
volatile uint8_t mode = 0;
83
uint8_t hardware = 0;
84
uint8_t current_hardware = 0;
85
mk_param_struct_t *mk_param_struct;
86
 
87
 
88
//--------------------------------------------------------------
89
int main (void)
90
{
91
#ifndef DEBUG
92
        uint8_t timeout;
93
        uint8_t val =0;
94
        uint8_t spalte =0;
95
#endif
96
 
97
        InitHWPorts();                  // Hardwareanhängige Ports konfigurieren
98
                                                        // dafür wird je nach Hardware die HAL_HWxxx verwendet
99
                                                        // Define dazu in der main.h
100
 
101
        hardware = NO;
102
        current_hardware = 0;
103
 
104
 
105
        if (PKT_StartInfo == true)
106
        {
107
                lcd_cls ();
108
//              lcd_printp_at (0,0,PSTR("Portables Kopter Tool"), 0);
109
                 lcd_puts_at(0, 0, strGet(START_MSG1), 0);
110
                 lcd_puts_at(0, 1, strGet(START_MSG2), 0);
111
//              lcd_printp_at (0,1,PSTR("für FC Ver "), 0);
112
//              lcd_printp_at (11,1,PSTR(FC_Version),0);
113
//              lcd_printp_at (0,3,PSTR("GNU GPL License"), 0);
114
                lcd_puts_at(0, 3, strGet(GNU_GPL), 0);
115
 
116
#ifdef HWVERSION1_2
117
//              lcd_printp_at (0,4,PSTR("Hardware 1.2"), 0);
118
//              lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
119
                lcd_puts_at(0, 4, strGet(HW12), 0);
120
                lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
121
#endif
122
 
123
#ifdef HWVERSION1_2W
124
//              lcd_printp_at (0,4,PSTR("Hardware 1.2W"), 0);
125
//              lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
126
                lcd_puts_at(0, 4, strGet(HW12W), 0);
127
                lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
128
#endif
129
 
130
#ifdef HWVERSION1_3
131
//              lcd_printp_at (0,4,PSTR("Hardware 1.3"), 0);
132
//              lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
133
                lcd_puts_at(0, 4, strGet(HW13), 0);
134
                lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
135
#endif
136
 
137
#ifdef HWVERSION1_3W
138
//              lcd_printp_at (0,4,PSTR("Hardware 1.3W"), 0);
139
//              lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
140
                lcd_puts_at(0, 4, strGet(HW13W), 0);
141
                lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
142
#endif
143
 
144
#ifdef HWVERSION3_9
145
//              lcd_printp_at (0,4,PSTR("Hardware 3.9"), 0);
146
//              lcd_printp_at (0,5,PSTR("ATmega 1284P"), 0);
147
                lcd_puts_at(0, 4, strGet(HW39), 0);
148
                lcd_puts_at(0, 5, strGet(ATMEGA1284P), 0);
149
#endif
150
 
151
        _delay_ms(1500);
152
        }
153
 
154
#ifndef DEBUG
155
 
156
        ReadLastPosition ();
157
 
158
        if (LastLongitude>0x00000000 && LastLatitude>0x00000000)
159
        {
160
                lcd_cls ();
161
//              lcd_printp_at (0, 4, PSTR("   Letzte Position   "), 2);
162
//              lcd_printp_at (0, 5, PSTR(" Breitengr  Längengr "), 2);
163
//              lcd_printp_at (0, 7, PSTR("löschen        weiter"), 0);
164
                lcd_puts_at(0, 0, strGet(START_LASTPOS), 2);
165
                lcd_puts_at(0, 1, strGet(START_LASTPOS3), 2);
166
                lcd_puts_at(0, 2, strGet(START_LASTPOS1), 2);
167
                lcd_puts_at(0, 7, strGet(START_LASTPOS2), 0);
168
 
169
 
170
                write_ndigit_number_u (1, 4, (uint16_t)(LastLatitude/10000000), 2, 0);
171
                lcd_printp_at (3, 4, PSTR("."), 0);
172
                write_ndigit_number_u (4, 4, (uint16_t)((LastLatitude/1000) % 10000), 4, 1);
173
                write_ndigit_number_u (8, 4, (uint16_t)((LastLatitude/10) % 100), 2, 1);
174
 
175
 
176
                write_ndigit_number_u (12, 4, (uint16_t)(LastLongitude/10000000), 2, 0);
177
                lcd_printp_at (14, 4, PSTR("."), 0);
178
                write_ndigit_number_u (15, 4, (uint16_t)((LastLongitude/1000) % 10000), 4, 1);
179
                write_ndigit_number_u (19, 4, (uint16_t)((LastLongitude/10) % 100), 2, 1);
180
 
181
                for (;;)
182
                {
183
                        if (get_key_press (1 << KEY_MINUS))
184
                        {
185
                                WriteLastPosition(0x00000000,0x00000000);  // Löschen
186
                                lcd_frect (0, (8*4), 128, 8, 0);  // Zeile löschen (x, y, l, h, in Pixel)
187
                                lcd_frect (0, (8*5), 128, 8, 0);
188
//                              lcd_printp_at (0,5,PSTR("      gelöscht       "), 0);
189
                                lcd_puts_at(0, 5, strGet(START_LASTPOSDEL), 0);
190
 
191
                                lcd_cls_line (0, 6, 21);
192
                                lcd_cls_line (0, 7, 21);
193
 
194
                                _delay_ms(1000);
195
                                break;
196
                        }
197
                        if (get_key_press (1 << KEY_ENTER))
198
                        {
199
                                lcd_cls_line (0, 4, 21);
200
                                lcd_cls_line (0, 5, 21);
201
                                lcd_cls_line (0, 6, 21);
202
                                lcd_cls_line (0, 7, 21);
203
                                break;
204
                        }
205
                }
206
        }
207
#endif
208
 
209
        // switch to NC
210
        USART_putc (0x1b);
211
        USART_putc (0x1b);
212
        USART_putc (0x55);
213
        USART_putc (0xaa);
214
        USART_putc (0x00);
215
 
216
        mode = 'V';
217
 
218
#ifndef DEBUG
219
 
220
        do
221
        {
222
                timeout = 50;
223
 
224
                lcd_cls();
225
//              lcd_printp_at (0,4,PSTR("Suche FC..."), 0);
226
//              lcd_printp_at (12, 7, PSTR("Ende"), 0);
227
                lcd_puts_at(0, 4, strGet(START_SEARCHFC), 0);
228
                lcd_puts_at(12, 7, strGet(ENDE), 0);
229
 
230
                while (!rxd_buffer_locked && timeout)
231
                {
232
                        SendOutData('v', ADDRESS_ANY, 0);
233
 
234
                        timer = 20;
235
 
236
                        while (timer > 0);
237
                                timeout--;
238
 
239
                        if (spalte <= 20)
240
                        {
241
                                lcd_printp_at (spalte,6,PSTR("?"),0);
242
                                spalte++;
243
                        }
244
                        else
245
                        {
246
                                lcd_cls_line (0,6,21);
247
                                spalte=0;
248
                        }
249
 
250
                        if (get_key_press (1 << KEY_ESC))
251
                        {
252
                                get_key_press(KEY_ALL);
253
                                for (;;)
254
                                {
255
                                        Debug = 0;
256
                                        hardware = NO;
257
                                        main_menu ();
258
                                }
259
                        }
260
 
261
                }
262
 
263
                if(timeout == 0)
264
                {
265
//                      lcd_printp_at (0,5,PSTR("FC nicht gefunden!"), 0);
266
                        lcd_puts_at(0, 5, strGet(START_FCNOTFOUND), 0);
267
                        timer = 90;
268
                        while (timer > 0);
269
                }
270
        }
271
        while(timeout == 0);
272
 
273
        if (timeout != 0)
274
                Decode64 ();
275
 
276
        version = (Version_t *) pRxData;
277
 
278
        if (PKT_StartInfo == true)
279
        {
280
                lcd_cls ();
281
//              lcd_printp (PSTR("PKT-Tool GNU GPL\r\n"), 0);
282
//              lcd_printp (PSTR("gefunden:\r\n\n"), 0);
283
                lcd_puts_at(0, 0, strGet(START_FCFOUND), 0);
284
                lcd_puts_at(0, 1, strGet(START_FCFOUND1), 0);
285
 
286
        }
287
 
288
        if ((rxd_buffer[1] - 'a') == ADDRESS_FC)
289
        {
290
                if (PKT_StartInfo == true)
291
                {
292
//                      lcd_printp (PSTR("Flight-Ctrl\r\n"), 0);
293
                        lcd_puts_at(0, 1, strGet(START_FCFOUND2), 0);
294
                }
295
                hardware = FC;
296
                current_hardware = hardware;
297
        }
298
        else if ((rxd_buffer[1] - 'a') == ADDRESS_NC)
299
        {
300
                if (PKT_StartInfo == true)
301
                {
302
//                      lcd_printp (PSTR("Navi-Ctrl\r\n"), 0);
303
                        lcd_puts_at(0, 1, strGet(START_FCFOUND3), 0);
304
                }
305
                hardware = NC;
306
                current_hardware = hardware;
307
        }
308
 
309
        if (PKT_StartInfo == true)
310
        {
311
//              lcd_printp (PSTR("Version: "), 0);
312
                lcd_puts_at(0, 2, strGet(START_VERSIONCHECK), 0);
313
                lcd_write_number_u (version->SWMajor);
314
                lcd_printp (PSTR("."), 0);
315
                lcd_write_number_u (version->SWMinor);
316
                lcd_putc (lcd_xpos, lcd_ypos, version->SWPatch + 'a', 0);
317
                _delay_ms(1500);
318
        }
319
        SwitchToFC();
320
#else
321
        if (PKT_StartInfo == true)
322
        {
323
                lcd_cls ();
324
                lcd_printp (PSTR("PKT-Test DEBUG\r\n"), 0);
325
                _delay_ms(1500);
326
        }
327
 
328
#endif
329
 
330
 
331
#ifndef DEBUG
332
 
333
        // EEprom Version / Struktur prüfen
334
//      val = load_setting(1); // Parameterset 1 holen
335
        val = load_setting(0xff); // aktuelles Parameterset holen
336
        if (mk_param_struct->Revision != EEProm_Version)
337
        {
338
                lcd_cls ();
339
 
340
 
341
                lcd_printp_at (0, 0, PSTR("EEPromRev.:"), 0);
342
                lcd_write_number_u (EEProm_Version);
343
 
344
                lcd_puts_at(0, 1, strGet(START_VERSIONCHECK1), 0);
345
//              lcd_printp (PSTR(" erwartet\r\n"), 0);
346
 
347
                lcd_printp_at (0, 1, PSTR("EEPromRev.:"), 0);
348
                lcd_write_number_u (mk_param_struct->Revision);
349
                lcd_puts_at(0, 2, strGet(START_VERSIONCHECK2), 0);
350
 
351
//              lcd_printp (PSTR(" gefunden\r\n"), 0);
352
 
353
//              lcd_printp (PSTR("PKT-Tool nur mit\r\n"), 0);
354
//              lcd_printp (PSTR("FC Software "), 0);
355
                lcd_puts_at(0, 3, strGet(START_VERSIONCHECK3), 0);
356
                lcd_puts_at(0, 4, strGet(START_VERSIONCHECK4), 0);
357
 
358
                lcd_printp (PSTR(FC_Version),0);
359
 
360
//              lcd_printp (PSTR("\r\nkompatibel"), 0);
361
                lcd_puts_at(0, 5, strGet(START_VERSIONCHECK5), 0);
362
                hardware = NO;
363
                BeepTime = 1500;
364
                BeepMuster = 0x0040;
365
                _delay_ms(4000);
366
        }
367
 
368
#endif
369
        mode = 0;
370
        rxd_buffer_locked = FALSE;
371
 
372
        timer = 50;
373
        while (timer > 0);
374
 
375
        for (;;)
376
        {
377
                main_menu ();
378
        }
379
}
380