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 pkt.c |
||
36 | //# |
||
37 | //# 25.06.2014 OG |
||
38 | //# - chg: PKT_Ask(), PKT_Ask_P() auf PKT_AskX() angepasst |
||
39 | //# - add: PKT_AskX() - ehemals _pkt_ask(), jetzt erweitert um zusaetzliche progmen Parameter und exportiert |
||
40 | //# |
||
41 | //# 24.06.2014 OG |
||
42 | //# - add: PKT_Gauge_Begin(), PKT_Gauge_End(), PKT_Gauge_Next() |
||
43 | //# |
||
44 | //# 15.06.2014 OG |
||
45 | //# - add: PKT_Progress_Init(), PKT_Progress_Next() |
||
46 | //# |
||
47 | //# 14.06.2014 OG |
||
48 | //# - add: PKT_TitlePKTlipo() fuer optionale Anzeige der LiPo-Spannung |
||
49 | //# |
||
50 | //# 13.06.2014 OG |
||
51 | //# - add: PKT_Ask_Restart() |
||
52 | //# |
||
53 | //# 12.06.2014 OG |
||
54 | //# - add: PKT_Reset_EEprom() (ehemals in setup.c) |
||
55 | //# - chg: PKT_Update() auf PKT_Ask_P() umgestellt |
||
56 | //# - add: PKT_Ask(), PKT_Ask_P(), _pkt_ask() |
||
57 | //# |
||
58 | //# 11.06.2014 OG |
||
59 | //# - add: PKT_Title(), PKT_Title_P(), _pkt_title() |
||
60 | //# - chg: PKT_TitleFromMenuItem() umgestellt auf _pkt_title() |
||
61 | //# - chg: PKT_TitlePKTVersion() umbenannt zu PKT_TitlePKT() |
||
62 | //# - fix: PKT_TitleFromMenuItem() funktioniert jetzt auch wenn kein Menue vorhanden ist |
||
63 | //# |
||
64 | //# 04.06.2014 OG |
||
65 | //# - add: PKT_Message_Datenverlust() |
||
66 | //# |
||
67 | //# 31.05.2014 OG |
||
68 | //# - fix: PKT_CtrlHook() bzgl. PKT_CheckUpdate() - seit Februar 2014 Probleme |
||
69 | //# mit Update-Anforderung vom PKT-Updatetool -> PKT war zu schnell |
||
70 | //# Es wurde jetzt ein Timer in PKT_CtrlHook() eingebaut der den Aufruf |
||
71 | //# von PKT_CheckUpdate() etwas einbremst ohne das PKT auszubremsen. |
||
72 | //# Ich hoffe, das es ist Loesung ist (bin guter Dinge nach Test's) |
||
73 | //# - chg: PKT_CheckUpdate() - Code optimiert |
||
74 | //# - add: PKT_Info() - Anzeige ob SV2-Patch vorhanden ist oder nicht (ganz oben) |
||
75 | //# - add: PKT_Info() - Anzeige fuer USE_OSD_SCREEN_WAYPOINTS |
||
76 | //# - add: PKT_KeylineUpDown() |
||
77 | //# |
||
78 | //# 23.05.2014 OG |
||
79 | //# - add: PKT_TitleFromMenuItem() |
||
80 | //# - add: #include "../utils/menuctrl.h" |
||
81 | //# |
||
82 | //# 06.05.2014 OG |
||
83 | //# - chg: PKT_CheckUpdate() - seit Februar funktioniert die Update-Anforderung |
||
84 | //# vom PKT-Updatetool an das PKT nicht immer zuverlaessig - fgf. weil sich |
||
85 | //# seitens des PKT's Timings etwas geaendert haben (durch weglassen von Code). |
||
86 | //# Hier ein Versuch etwas daran wieder zu aendern... its zwar weiterhin |
||
87 | //# nicht immer zuverlaessig aber vieleicht etwas besser. |
||
88 | //# Wahrscheinlich kann man das nur richtig korrigieren in Verbindung mit |
||
89 | //# Anpassungen am PKT-Updatetool - aber das ist ein anderes Thema... |
||
90 | //# - chg: PKT_Update() - ein kurzer Beep wenn das PKT-Update aufgerufen wird |
||
91 | //# |
||
92 | //# 05.05.2014 OG |
||
93 | //# - add: PKT_Popup(), PKT_Popup_P(), _pkt_popup() |
||
94 | //# |
||
95 | //# 11.04.2014 OG |
||
96 | //# - chg: _pkt_message() ergaenzt um clear_key_all() |
||
97 | //# |
||
98 | //# 09.04.2014 OG |
||
99 | //# - chg: PKT_Update() - umgestellt auf ShowTitle_P() |
||
100 | //# |
||
101 | //# 08.04.2014 OG |
||
102 | //# - chg: PKT_Update() - Text bzgl. "Druecke Start..." zentriert |
||
103 | //# |
||
104 | //# 04.04.2014 OG |
||
105 | //# - fix: define ESC umbenannt zu PKTESC da es einen Namenskonflikt mit enum |
||
106 | //# STR in messages.h gab |
||
107 | //# - add: _pkt_message() zeigt einen Titel mit PKT Version und Lipo an |
||
108 | //# |
||
109 | //# 03.04.2014 OG |
||
110 | //# - chg: _pkt_message() abgesichert bzgl. zu langen Texten |
||
111 | //# |
||
112 | //# 27.03.2014 OG |
||
113 | //# - chg: PKT_SwitchOff() Anzeige optimiert |
||
114 | //# |
||
115 | //# 21.02.2014 OG |
||
116 | //# - fix: PKT_CheckUpdate() Zeile 0 flimmerte wegen einer nicht mehr |
||
117 | //# benoetigten Textausgabe |
||
118 | //# - chg: PKT_SwitchOff() auf PKT_TitlePKTVersion() angepasst |
||
119 | //# - chg: PKT_TitlePKTVersion() |
||
120 | //# |
||
121 | //# 17.02.2014 OG |
||
122 | //# - add: PKT_Message(), PKT_Message_P(), _pkt_message() |
||
123 | //# - chg: MK_Info() auf USE_MKSETTINGS angepasst (ehemals MKPARAMETER) |
||
124 | //# |
||
125 | //# 13.02.2014 OG |
||
126 | //# - chg: Screenlayout von PKT_Update() |
||
127 | //# - chg: Screenlayout von PKT_SwitchOff() |
||
128 | //# |
||
129 | //# 11.02.2014 OG |
||
130 | //# - chg: PKT_Info() Anzeige der FC-Version entfernt |
||
131 | //# |
||
132 | //# 04.02.2014 OG |
||
133 | //# - fix: #include "../lipo/lipo.h" hinzugefuegt |
||
134 | //# |
||
135 | //# 03.02.2014 OG |
||
136 | //# - chg: Layout von PKT_SwitchOff() und bessere Unterstuetzung von PKT_CtrlHook() |
||
137 | //# - add: PKT_ShowTitleVersion() |
||
138 | //# |
||
139 | //# 30.01.2014 OG |
||
140 | //# - chg: geaenderte Anzeige der Reihenfolgen unterstuetzter Module in PKT_Info() |
||
141 | //# - add: Unterstuetzung fuer USE_BLUETOOTH |
||
142 | //# |
||
143 | //# 24.01.2014 OG |
||
144 | //# - chg: PKT_SwitchOff(): Layout; Code eliminiert; Beep; |
||
145 | //# add PKT_Hook() (für PKT-Update) |
||
146 | //# - chg: PKT_Update(): Layout |
||
147 | //# |
||
148 | //# 21.10.2013 CB |
||
149 | //# - add: PKT_Info WyFly hinzugefügt |
||
150 | //# |
||
151 | //# 07.07.2013 OG |
||
152 | //# - del: PKT_Info(): USE_OSD_SCREEN_ELECTRIC_N |
||
153 | |||
154 | //# 26.06.2013 OG |
||
155 | //# - del: PKT_Info(): USE_PKT_STARTINFO |
||
156 | //# |
||
157 | //# 13.06.2013 OG |
||
158 | //# - add: PKT-Hardwareversion in der Titelanzeige von PKT_Info() |
||
159 | //# - chg: Layout Titelanzeige von PKT_Info() |
||
160 | //# - del: USE_PCFASTCONNECT in PKT_Info() (nicht mehr benoetigt) |
||
161 | //# - del: PC_Fast_Connect() - ersetzt durch Menu_PKTTools() in menu.c |
||
162 | //# |
||
163 | //# 20.05.2013 OG |
||
164 | //# - chg: PKT_CtrlHook() bei PKT-Update um WriteParameter() ergaenzt |
||
165 | //# |
||
166 | //# 19.05.2013 OG |
||
167 | //# - add: PKT_CtrlHook() ruft ggf. PKT_Update() auf und kann spaeter weitere |
||
168 | //# PKT interne Sachen verarbeiten wie z.B. senden von Daten an den PC |
||
169 | //# - chg: PKT_CheckUpdate() umgestellt auf timer_pktctrl um Konflikte mit |
||
170 | //# mit z.B. osd zu vermeiden |
||
171 | //# - chg: PKT_Info() bzgl. Codeverbrauch verringert |
||
172 | //# - fix: PKT_Info() Anzeige von USE_OSD_SCREEN_NAVIGATION |
||
173 | //# - add: PC_Fast_Connect() aus menu.c |
||
174 | //# - add: PKT_* Funktionen aus main.c bzw. menu.c |
||
175 | //############################################################################ |
||
176 | |||
177 | |||
178 | #include "../cpu.h" |
||
179 | #include <avr/io.h> |
||
180 | #include <inttypes.h> |
||
181 | #include <stdlib.h> |
||
182 | #include <avr/pgmspace.h> |
||
183 | #include <avr/wdt.h> |
||
184 | #include <util/delay.h> |
||
185 | #include <avr/eeprom.h> |
||
186 | #include <util/atomic.h> |
||
187 | |||
188 | #include "../main.h" |
||
189 | #include "../lcd/lcd.h" |
||
190 | #include "../uart/usart.h" |
||
191 | |||
192 | #include "../uart/uart1.h" |
||
193 | #include "../mk-data-structs.h" |
||
194 | #include "../timer/timer.h" |
||
195 | #include "../eeprom/eeprom.h" |
||
196 | #include "../messages.h" |
||
197 | #include "../utils/scrollbox.h" |
||
198 | #include "../utils/xutils.h" |
||
199 | #include "../lipo/lipo.h" |
||
200 | #include "../utils/menuctrl.h" |
||
201 | #include "pkt.h" |
||
202 | |||
203 | |||
204 | //############################################################################################# |
||
205 | //############################################################################################# |
||
206 | |||
207 | uint8_t pkt_progress_act = 0; |
||
208 | uint8_t pkt_progress_max = 0; |
||
209 | int8_t pkt_progress_yoffs = 0; |
||
210 | uint8_t pkt_progress_width = 0; |
||
211 | uint8_t pkt_progress_height = 0; |
||
212 | |||
213 | #define PROGRESS_YOFFS -8 |
||
214 | #define PROGRESS_WIDTH 96 |
||
215 | |||
216 | |||
217 | |||
218 | //############################################################################################# |
||
219 | //############################################################################################# |
||
220 | |||
221 | //-------------------------------------------------------------- |
||
222 | //-------------------------------------------------------------- |
||
223 | void PKT_Progress_Init( uint8_t max, int8_t yoffs, uint8_t width, uint8_t height) |
||
224 | { |
||
225 | pkt_progress_act = 0; |
||
226 | pkt_progress_max = max; |
||
227 | pkt_progress_yoffs = yoffs; |
||
228 | pkt_progress_width = 0; // Parameter width - aktuell nicht unterstuetzt |
||
229 | pkt_progress_height = 0; // Parameter height - aktuell nicht unterstuetzt |
||
230 | |||
231 | if( pkt_progress_width == 0 ) |
||
232 | pkt_progress_width = PROGRESS_WIDTH; |
||
233 | |||
234 | lcd_rect_round( 13, 32+pkt_progress_yoffs, 102, 6, 1, R1); // Rahmen fuer Progress |
||
235 | } |
||
236 | |||
237 | |||
238 | |||
239 | //-------------------------------------------------------------- |
||
240 | //-------------------------------------------------------------- |
||
241 | uint8_t PKT_Progress_Next( void ) |
||
242 | { |
||
243 | uint8_t width; |
||
244 | |||
245 | pkt_progress_act++; // Progress: hochzaehlen |
||
246 | width = (pkt_progress_act*pkt_progress_width) / pkt_progress_max; // Progress: Breite berechnen |
||
247 | lcd_frect( 16, 34+pkt_progress_yoffs, width, 2, 1); // Progress: anzeigen |
||
248 | |||
249 | return true; |
||
250 | } |
||
251 | |||
252 | |||
253 | |||
254 | //############################################################################################# |
||
255 | //# Anzeigefunktionen |
||
256 | //############################################################################################# |
||
257 | |||
258 | |||
259 | //-------------------------------------------------------------- |
||
260 | // PKT_KeylineUpDown( xUp, xDown, xoffs,yoffs) |
||
261 | // |
||
262 | // gibt in der Keyline (y=7) ein Up- und Down-Zeichen aus. |
||
263 | // Das Up-Zeichen wird dabei um einen Pixel versetzt damit |
||
264 | // es besser aussieht |
||
265 | // |
||
266 | // Parameter: |
||
267 | // xUp : x-Position des Up-Zeichens in Zeile 7 |
||
268 | // xDown: x-Position des Down-Zeichens in Zeile 7 |
||
269 | // xoffs, yoffs: normalerweise 0,0 |
||
270 | //-------------------------------------------------------------- |
||
271 | void PKT_KeylineUpDown( uint8_t xUp, uint8_t xDown, uint8_t xoffs, uint8_t yoffs) |
||
272 | { |
||
273 | lcdx_printp_at( xUp , 7, PSTR("\x1a") , MNORMAL, xoffs,yoffs+1); // Up |
||
274 | lcdx_printp_at( xDown, 7, PSTR("\x1b") , MNORMAL, xoffs,yoffs); // Down |
||
275 | } |
||
276 | |||
277 | |||
278 | |||
279 | //############################################################################################# |
||
280 | //# Titel Funktionen |
||
281 | //############################################################################################# |
||
282 | |||
283 | //-------------------------------------------------------------- |
||
284 | //-------------------------------------------------------------- |
||
285 | void _pkt_title( uint8_t progmem, const char *text, uint8_t lShowLipo, uint8_t clearscreen ) |
||
286 | { |
||
287 | const char *pMask; |
||
288 | |||
289 | if( clearscreen ) lcd_cls(); |
||
290 | |||
291 | lcd_frect( 0, 0, 127, 7, 1); // Titel: Invers |
||
292 | |||
293 | if( progmem ) pMask = PSTR("%19S"); |
||
294 | else pMask = PSTR("%19s"); |
||
295 | |||
296 | lcdx_printf_at_P( 1, 0, MINVERS, 0,0, pMask, text ); |
||
297 | |||
298 | if( lShowLipo ) show_Lipo(); |
||
299 | } |
||
300 | |||
301 | |||
302 | |||
303 | //-------------------------------------------------------------- |
||
304 | // PKT_Title( text, lShowLipo, clearscreen ) |
||
305 | // |
||
306 | // text im RAM |
||
307 | //-------------------------------------------------------------- |
||
308 | void PKT_Title( const char *text, uint8_t lShowLipo, uint8_t clearscreen ) |
||
309 | { |
||
310 | _pkt_title( false, text, lShowLipo, clearscreen ); |
||
311 | } |
||
312 | |||
313 | |||
314 | |||
315 | //-------------------------------------------------------------- |
||
316 | // PKT_Title_P( text, lShowLipo, clearscreen ) |
||
317 | // |
||
318 | // text im PROGMEM |
||
319 | //-------------------------------------------------------------- |
||
320 | void PKT_Title_P( const char *text, uint8_t lShowLipo, uint8_t clearscreen ) |
||
321 | { |
||
322 | _pkt_title( true, text, lShowLipo, clearscreen ); |
||
323 | } |
||
324 | |||
325 | |||
326 | |||
327 | //-------------------------------------------------------------- |
||
328 | // zeigt als Titel die PKT-Version (invers) |
||
329 | // optional: rechts die PKT Lipo-Spannung anzeigen |
||
330 | //-------------------------------------------------------------- |
||
331 | void PKT_TitlePKTlipo( uint8_t lShowLipo ) |
||
332 | { |
||
333 | //PKT_Title( buffered_sprintf_P(PSTR("PKT v%S"),PSTR(PKTSWVersion)), true, false ); // showlipo, kein clearscreen |
||
334 | PKT_Title( buffered_sprintf_P(PSTR("PKT v%S"),PSTR(PKTSWVersion)), lShowLipo, true ); // showlipo und clearscreen |
||
335 | } |
||
336 | |||
337 | |||
338 | |||
339 | //-------------------------------------------------------------- |
||
340 | // zeigt als Titel die PKT-Version (invers) |
||
341 | // und rechts die PKT Lipo-Spannung |
||
342 | //-------------------------------------------------------------- |
||
343 | void PKT_TitlePKT( void ) |
||
344 | { |
||
345 | PKT_TitlePKTlipo( true ); |
||
346 | } |
||
347 | |||
348 | |||
349 | |||
350 | //-------------------------------------------------------------- |
||
351 | // PKT_TitleFromMenuItem( lShowLipo ) |
||
352 | // |
||
353 | // zeigt eine PKT-Titelzeile mit Text vom aufrufenden Menuepunkt |
||
354 | // optional kann die PKT LiPo-Spannung angezeigt werden |
||
355 | // |
||
356 | // wenn kein Menue vorhandenist wird die PKT-Version angezeigt |
||
357 | //-------------------------------------------------------------- |
||
358 | void PKT_TitleFromMenuItem( uint8_t lShowLipo ) |
||
359 | { |
||
360 | const char *pStr; |
||
361 | uint8_t isPGM; |
||
362 | |||
363 | if( MenuCtrl_GetMenuIndex() < 0 ) |
||
364 | { |
||
365 | PKT_TitlePKT(); // kein Menue vorhanden -> PKT-Version anzeigen |
||
366 | return; |
||
367 | } |
||
368 | |||
369 | pStr = MenuCtrl_GetItemText(); |
||
370 | isPGM = MenuCtrl_IsItemTextPGM(); |
||
371 | |||
372 | _pkt_title( isPGM, pStr, lShowLipo, true ); // true = clearscreen |
||
373 | } |
||
374 | |||
375 | |||
376 | |||
377 | //############################################################################################# |
||
378 | //# PKT Message |
||
379 | //############################################################################################# |
||
380 | |||
381 | //-------------------------------------------------------------- |
||
382 | // _pkt_message( progmem, text, error, timeout, beep, clearscreen) |
||
383 | // |
||
384 | // INTERN |
||
385 | // fuer: PKT_Message(), PKT_Message_P() |
||
386 | // Parameter? -> siehe dort... |
||
387 | //-------------------------------------------------------------- |
||
388 | void _pkt_message( uint8_t progmem, const char *text, uint8_t error, uint16_t timeout, uint8_t beep, uint8_t clearscreen ) |
||
389 | { |
||
390 | char *pStr; |
||
391 | |||
392 | if( clearscreen ) |
||
393 | lcd_cls(); |
||
394 | |||
395 | PKT_TitlePKT(); |
||
396 | |||
397 | if( error ) |
||
398 | { |
||
399 | //lcd_frect_round( 0+36, (2*8)-2, 127-73, 8+2, 1, R1); // Fill: Schwarz |
||
400 | lcd_frect_round( 0+36, (2*8)-1, 127-74, 8+2, 1, R1); // Fill: Schwarz |
||
401 | lcdx_printp_center( 2, strGet(STR_ERROR), MINVERS, 0,1); // "FEHLER" |
||
402 | } |
||
403 | else |
||
404 | lcdx_printp_center( 2, strGet(STR_PKT) , MNORMAL, 0,1); // "PKT" |
||
405 | |||
406 | |||
407 | //----------------------- |
||
408 | // Ausgabe der Nachricht |
||
409 | //----------------------- |
||
410 | pStr = buffered_sprintf_P( ( progmem ? PSTR("%20S") : PSTR("%20s")), text); // max. 20 Zeichen |
||
411 | strrtrim( pStr ); // alle Leerzeichen rechts loeschen |
||
412 | lcdx_print_center( 4, (uint8_t *)pStr, MNORMAL, 0,5); // Text zentriert; String im RAM |
||
413 | lcd_rect_round( 0, 32, 127, 16, 1, R2); // Rahmen |
||
414 | |||
415 | if( beep ) |
||
416 | { |
||
417 | if( error ) |
||
418 | set_beep( 1000, 0xffff, BeepNormal ); // langer Error-Beep |
||
419 | else |
||
420 | set_beep( 25, 0xffff, BeepNormal ); // kurzer Bestaetigungs-Beep |
||
421 | } |
||
422 | |||
423 | if( timeout ) |
||
424 | { |
||
425 | //lcd_printp_at( 19, 7, strGet(OK), MNORMAL); // Keyline... tja, welche Variante nehmen wir denn nun Final??? OK oder ENDE? |
||
426 | lcd_printp_at(12, 7, strGet(ENDE), MNORMAL); // Keyline |
||
427 | |||
428 | clear_key_all(); |
||
429 | |||
430 | timer2 = timeout; // max. Anzeigezeit (z.B. 800 = 8 Sekunden) |
||
431 | while( timer2 > 0 ) |
||
432 | { |
||
433 | //if( get_key_short(1 << KEY_ENTER) ) break; |
||
434 | if( get_key_short(1 << KEY_ESC) ) break; |
||
435 | PKT_CtrlHook(); |
||
436 | } |
||
437 | } |
||
438 | clear_key_all(); |
||
439 | } |
||
440 | |||
441 | |||
442 | |||
443 | //-------------------------------------------------------------- |
||
444 | // PKT_Message( text, error, timeout, beep, clearscreen) |
||
445 | // |
||
446 | // zeigt eine Nachricht an ggf. mit Display-Timeout, Tasten, Beep (String im RAM) |
||
447 | // |
||
448 | // Parameter: |
||
449 | // text : String im RAM |
||
450 | // error : true/false |
||
451 | // timeout : 0 = direktes Verlassen der Funktion ohne warten |
||
452 | // 1..nnnn = max. Anzeigezeit (timer); Keyline wird |
||
453 | // eingeblendet -> Benutzer kann auch eher beenden |
||
454 | // beep : true/false - bei true haengt die Art des Beep's von 'error' ab |
||
455 | // clearscreen: true/false - ggf. Bildschirm loeschen |
||
456 | //-------------------------------------------------------------- |
||
457 | void PKT_Message( const char *text, uint8_t error, uint16_t timeout, uint8_t beep, uint8_t clearscreen ) |
||
458 | { |
||
459 | _pkt_message( false, text, error, timeout, beep, clearscreen ); |
||
460 | } |
||
461 | |||
462 | |||
463 | |||
464 | //-------------------------------------------------------------- |
||
465 | // PKT_Message_P( text, error, timeout, beep, clearscreen) |
||
466 | // |
||
467 | // zeigt eine Nachricht an ggf. mit Display-Timeout, Tasten, Beep (String im PROGMEM) |
||
468 | // |
||
469 | // Parameter: |
||
470 | // text : String im PROGMEM |
||
471 | // error : true/false |
||
472 | // timeout : 0 = direktes Verlassen der Funktion ohne warten |
||
473 | // 1..nnnn = max. Anzeigezeit (timer); Keyline wird |
||
474 | // eingeblendet -> Benutzer kann auch eher beenden |
||
475 | // beep : true/false - bei true haengt die Art des Beep's von 'error' ab |
||
476 | // clrscreen: true/false - ggf. Bildschirm loeschen |
||
477 | //-------------------------------------------------------------- |
||
478 | void PKT_Message_P( const char *text, uint8_t error, uint16_t timeout, uint8_t beep, uint8_t clearscreen ) |
||
479 | { |
||
480 | _pkt_message( true, text, error, timeout, beep, clearscreen ); |
||
481 | } |
||
482 | |||
483 | |||
484 | |||
485 | //-------------------------------------------------------------- |
||
486 | // PKT_Message_Datenverlust( timeout, beep) |
||
487 | //-------------------------------------------------------------- |
||
488 | void PKT_Message_Datenverlust( uint16_t timeout, uint8_t beep ) |
||
489 | { |
||
490 | //_pkt_message( true, text, error, timeout, beep, clearscreen ); |
||
491 | _pkt_message( true, strGet(ERROR_NODATA), true, timeout, beep, true ); |
||
492 | } |
||
493 | |||
494 | |||
495 | |||
496 | //############################################################################################# |
||
497 | //# PKT Popup |
||
498 | //############################################################################################# |
||
499 | |||
500 | //-------------------------------------------------------------- |
||
501 | // INTERN |
||
502 | // |
||
503 | // PARAMETER: |
||
504 | // progmem : true = Texte in PROGMEM |
||
505 | // false = Texte im RAM (RAM geht noch nicht!) |
||
506 | // timeout : Zeit bis zum automatischen beenden (z.B. 400 = 4 Sekunden) |
||
507 | // wenn timeout == 0 dann direkt beenden ohne auf Tastendruck zu warten |
||
508 | // text1..4: Text (die Hoehe des Popups berechnet sich aus der Anzahl der Texte) |
||
509 | // -> ein nicht benutzer Text wird mit NULL oder Dezimal 0 uebergeben |
||
510 | //-------------------------------------------------------------- |
||
511 | void _pkt_popup( uint8_t progmem, uint16_t timeout, const char *text1, const char *text2, const char *text3, const char *text4) |
||
512 | { |
||
513 | uint8_t n = 0; |
||
514 | uint8_t yoffs = 0; |
||
515 | |||
516 | if( text1 ) { n = 1; yoffs = 1; } |
||
517 | if( text2 ) { n = 2; yoffs = 2; } |
||
518 | if( text3 ) { n = 3; yoffs = 2; } |
||
519 | if( text4 ) { n = 4; yoffs = 3; } |
||
520 | |||
521 | Popup_Draw(n+1); |
||
522 | |||
523 | if( text1 ) lcdx_printp_center( 8-n, text1, MINVERS, 0,-5-yoffs); // Text zentriert; String im PROGMEM |
||
524 | if( text2 ) lcdx_printp_center( 9-n, text2, MINVERS, 0,-4-yoffs); // Text zentriert; String im PROGMEM |
||
525 | if( text3 ) lcdx_printp_center( 10-n, text3, MINVERS, 0,-3-yoffs); // Text zentriert; String im PROGMEM |
||
526 | if( text4 ) lcdx_printp_center( 11-n, text4, MINVERS, 0,-2-yoffs); // Text zentriert; String im PROGMEM |
||
527 | |||
528 | if( timeout ) |
||
529 | { |
||
530 | clear_key_all(); |
||
531 | |||
532 | timer2 = timeout; // max. Anzeigezeit (z.B. 800 = 8 Sekunden) |
||
533 | while( timer2 > 0 ) |
||
534 | { |
||
535 | if( get_key_short(1<<KEY_ESC) |
||
536 | || get_key_short(1<<KEY_ENTER) |
||
537 | || get_key_short(1<<KEY_PLUS) |
||
538 | || get_key_short(1<<KEY_MINUS) ) |
||
539 | { |
||
540 | break; |
||
541 | } |
||
542 | } |
||
543 | |||
544 | lcd_frect( 0, 58-((n+1)*8), 127, 5+((n+1)*8), 0); // Box clear - der Bereich des Popup's wird wieder geloescht (nur wenn timeout > 0!) |
||
545 | } |
||
546 | clear_key_all(); |
||
547 | } |
||
548 | |||
549 | |||
550 | |||
551 | //-------------------------------------------------------------- |
||
552 | // PKT_Popup( timeout, text1, text2, text3, text4 ) |
||
553 | // |
||
554 | // Texte im RAM |
||
555 | //-------------------------------------------------------------- |
||
556 | void PKT_Popup( uint16_t timeout, const char *text1, const char *text2, const char *text3, const char *text4 ) |
||
557 | { |
||
558 | _pkt_popup( false, timeout, text1, text2, text3, text4 ); |
||
559 | } |
||
560 | |||
561 | |||
562 | |||
563 | //-------------------------------------------------------------- |
||
564 | // PKT_Popup_P( timeout, text1, text2, text3, text4 ) |
||
565 | // |
||
566 | // Texte im PROGMEM |
||
567 | //-------------------------------------------------------------- |
||
568 | void PKT_Popup_P( uint16_t timeout, const char *text1, const char *text2, const char *text3, const char *text4 ) |
||
569 | { |
||
570 | _pkt_popup( true, timeout, text1, text2, text3, text4 ); |
||
571 | } |
||
572 | |||
573 | |||
574 | |||
575 | //############################################################################################# |
||
576 | //# PKT Ask |
||
577 | //############################################################################################# |
||
578 | |||
579 | //-------------------------------------------------------------- |
||
580 | // wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem) |
||
581 | // |
||
582 | // PARAMETER: |
||
583 | // asktype : ASK_YES_NO, ASK_NO_YES, ASK_CANCEL_OK, ASK_END_OK, ASK_END_START |
||
584 | // text1 : 1. Zeile Text |
||
585 | // text2 : optionale 2. Zeile Text |
||
586 | // text_progmem : text1 & text2 in PROGMEM oder RAM (PROGMEM = true) |
||
587 | // headline : Ueberschrift |
||
588 | // headline_progmem: -> PROGMEM oder RAM |
||
589 | // title : ganz oben der Titel (Zeile 0, Invers) |
||
590 | // title_progmem : -> PROGMEM oder RAM |
||
591 | // |
||
592 | // RUECKGABE: |
||
593 | // true : Ja |
||
594 | // false : Nein |
||
595 | //-------------------------------------------------------------- |
||
596 | uint8_t PKT_AskX( uint8_t asktype, const char *text1, const char *text2, uint8_t text_progmem, const char *headline, uint8_t headline_progmem, const char *title, uint8_t title_progmem ) |
||
597 | { |
||
598 | uint8_t redraw = true; |
||
599 | uint8_t keyenter = false; |
||
600 | uint8_t retcode = false; |
||
601 | const char *pMaskP; |
||
602 | const char *pMaskR; |
||
603 | const char *pMask; |
||
604 | |||
605 | pMaskP = PSTR("%S"); |
||
606 | pMaskR = PSTR("%s"); |
||
607 | |||
608 | set_beep( 35, 0xffff, BeepNormal ); // kurzer Beep |
||
609 | |||
610 | while( true ) |
||
611 | { |
||
612 | //------------------------ |
||
613 | // Screen zeichnen |
||
614 | //------------------------ |
||
615 | if( redraw ) |
||
616 | { |
||
617 | if( title == NULL ) PKT_TitlePKT(); // Titel mit PKT-Version anzeigen (und clearscreen) |
||
618 | else if( title_progmem ) PKT_Title_P( title, true, true ); // uebergebenen Titel anzeigen (und clearscreen) (PROGMEM) |
||
619 | else PKT_Title( title, true, true ); // uebergebenen Titel anzeigen (und clearscreen) (RAM) |
||
620 | |||
621 | if( text2 == NULL ) |
||
622 | { |
||
623 | // 1 zeiliger Text |
||
624 | pMask = (headline_progmem ? pMaskP : pMaskR); // Formatmaske fuer headline je nach PROGMEN oder RAM |
||
625 | lcdx_printf_center_P( 2, MNORMAL, 0,2, pMask, headline); // headline |
||
626 | |||
627 | lcd_rect_round( 0, 3*7+2+10, 127, 16+0, 1, R2); // Rahmen |
||
628 | |||
629 | pMask = (text_progmem ? pMaskP : pMaskR); // Formatmaske fuer text1 und text2 je nach PROGMEN oder RAM |
||
630 | lcdx_printf_center_P( 4, MNORMAL, 0,6, pMask, text1); // text1 |
||
631 | } |
||
632 | else |
||
633 | { |
||
634 | // 2 zeiliger Text |
||
635 | pMask = (headline_progmem ? pMaskP : pMaskR); // Formatmaske fuer headline je nach PROGMEN oder RAM |
||
636 | lcdx_printf_center_P( 2, MNORMAL, 0,-1, pMask, headline); // headline |
||
637 | |||
638 | lcd_rect_round(0, 4*8-5, 127, 16+7, 1, R2); // Rahmen |
||
639 | |||
640 | pMask = (text_progmem ? pMaskP : pMaskR); // Formatmaske fuer text1 und text2 je nach PROGMEN oder RAM |
||
641 | lcdx_printf_center_P( 4, MNORMAL, 0,-1, pMask, text1); // text1 |
||
642 | lcdx_printf_center_P( 5, MNORMAL, 0, 0, pMask, text2); // text2 |
||
643 | } |
||
644 | |||
645 | |||
646 | //------------------------ |
||
647 | // Keyline |
||
648 | //------------------------ |
||
649 | switch( asktype ) |
||
650 | { |
||
651 | case ASK_NO_YES: lcd_printp_at(12, 7, strGet(NOYES), MNORMAL); // Keyline: "Nein Ja" |
||
652 | break; |
||
653 | |||
654 | case ASK_YES_NO: lcd_printp_at(12, 7, strGet(YESNO), MNORMAL); // Keyline: "Nein Ja" |
||
655 | break; |
||
656 | |||
657 | case ASK_CANCEL_OK: lcd_printp_at(11, 7, strGet(KEYCANCEL), MNORMAL); // Keyline: "Abbr. OK" |
||
658 | lcd_printp_at(19, 7, PSTR("OK") , MNORMAL); |
||
659 | break; |
||
660 | |||
661 | case ASK_END_OK: lcd_printp_at(12, 7, strGet(KEYLINE4), MNORMAL); // Keyline: "Ende OK" |
||
662 | break; |
||
663 | |||
664 | case ASK_END_START: lcd_printp_at(11, 7, strGet(ENDSTART), MNORMAL); // Keyline: "Ende Start" |
||
665 | break; |
||
666 | } |
||
667 | |||
668 | redraw = false; |
||
669 | } |
||
670 | |||
671 | //------------------------ |
||
672 | // LiPo Spannung zeigen |
||
673 | //------------------------ |
||
674 | show_Lipo(); |
||
675 | |||
676 | //------------------------ |
||
677 | // ggf. auf PKT-Update reagieren |
||
678 | //------------------------ |
||
679 | if( PKT_CtrlHook() ) |
||
680 | { |
||
681 | redraw = true; |
||
682 | } |
||
683 | |||
684 | //------------------------ |
||
685 | // Tasten abfragen |
||
686 | //------------------------ |
||
687 | if( get_key_short(1 << KEY_ESC) ) // 3. Taste |
||
688 | { |
||
689 | break; |
||
690 | } |
||
691 | |||
692 | if( get_key_press(1 << KEY_ENTER) ) // 4. Taste |
||
693 | { |
||
694 | keyenter = true; |
||
695 | break; |
||
696 | } |
||
697 | } // end: while( true ) |
||
698 | |||
699 | |||
700 | //------------------------- |
||
701 | retcode = keyenter; |
||
702 | if( asktype == ASK_YES_NO ) retcode = !retcode; |
||
703 | |||
704 | clear_key_all(); |
||
705 | |||
706 | return retcode; |
||
707 | } |
||
708 | |||
709 | |||
710 | //-------------------------------------------------------------- |
||
711 | // wahl = PKT_Ask( asktype, text1, text2, headline, title) |
||
712 | // |
||
713 | // text1 und text2 im RAM |
||
714 | //-------------------------------------------------------------- |
||
715 | uint8_t PKT_Ask( uint8_t asktype, const char *text1, const char *text2, const char *headline, const char *title ) |
||
716 | { |
||
717 | //wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem) |
||
718 | return PKT_AskX( asktype, text1, text2, false, headline, true, title, true); |
||
719 | //return _pkt_ask( false, asktype, text1, text2, headline, title); |
||
720 | } |
||
721 | |||
722 | |||
723 | |||
724 | //-------------------------------------------------------------- |
||
725 | // wahl = PKT_Ask_P( asktype, text1, text2, headline, title) |
||
726 | // |
||
727 | // text1 und text2 im PROGMEM |
||
728 | //-------------------------------------------------------------- |
||
729 | uint8_t PKT_Ask_P( uint8_t asktype, const char *text1, const char *text2, const char *headline, const char *title ) |
||
730 | { |
||
731 | //wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem) |
||
732 | return PKT_AskX( asktype, text1, text2, true, headline, true, title, true); |
||
733 | //return _pkt_ask( true, asktype, text1, text2, headline, title); |
||
734 | } |
||
735 | |||
736 | |||
737 | //############################################################################################# |
||
738 | //# PKT Gauge |
||
739 | //############################################################################################# |
||
740 | |||
741 | uint8_t Gauge_px; |
||
742 | uint8_t Gauge_py; |
||
743 | uint8_t Gauge_rx; |
||
744 | uint8_t Gauge_ry; |
||
745 | uint8_t Gauge_step; |
||
746 | volatile uint8_t Gauge_active; // wird in timer.c abgefragt |
||
747 | |||
748 | #define GAUGE_DEFAULT_PX 64 // Default X (Pixel) |
||
749 | #define GAUGE_DEFAULT_PY 40 // Default Y (Pixel) |
||
750 | #define GAUGE_DEFAULT_RX 10 // Default Radius X Gauge-Kreis |
||
751 | #define GAUGE_DEFAULT_RY 8 // Default Radius Y Gauge-Kreis |
||
752 | |||
753 | #define GAUGE_TIMER 40 // alle n aktualisieren (Timer Intervall) |
||
754 | #define GAUGE_DEGREE 45 // Winkel von Schritt zu Schritt |
||
755 | #define GAUGE_LROFFS -2 // die Laenge der Gauge-Linie verringern/vergroessern |
||
756 | |||
757 | //-------------------------------------------------------------- |
||
758 | // PKT_Gauge_Begin( py ) |
||
759 | //-------------------------------------------------------------- |
||
760 | void PKT_Gauge_Begin( uint8_t py ) |
||
761 | { |
||
762 | Gauge_px = GAUGE_DEFAULT_PX; |
||
763 | Gauge_py = GAUGE_DEFAULT_PY; |
||
764 | Gauge_rx = GAUGE_DEFAULT_RX; |
||
765 | Gauge_ry = GAUGE_DEFAULT_RY; |
||
766 | |||
767 | if( py>0 ) Gauge_py = py; |
||
768 | |||
769 | Gauge_step = 0; |
||
770 | timer_gauge = GAUGE_TIMER; |
||
771 | Gauge_active = true; |
||
772 | |||
773 | lcd_ellipse_line( Gauge_px, Gauge_py, Gauge_rx+GAUGE_LROFFS, Gauge_ry+GAUGE_LROFFS, (0), 1); |
||
774 | lcd_ellipse( Gauge_px, Gauge_py, Gauge_rx, Gauge_ry, 1); |
||
775 | } |
||
776 | |||
777 | |||
778 | //-------------------------------------------------------------- |
||
779 | // PKT_Gauge_End() |
||
780 | //-------------------------------------------------------------- |
||
781 | void PKT_Gauge_End( void ) |
||
782 | { |
||
783 | Gauge_active = false; |
||
784 | } |
||
785 | |||
786 | |||
787 | // uint8_t old_step; |
||
788 | |||
789 | //-------------------------------------------------------------- |
||
790 | // PKT_Gauge_Next() |
||
791 | // |
||
792 | // INTERN fuer Timer ISR! |
||
793 | //-------------------------------------------------------------- |
||
794 | void PKT_Gauge_Next( void ) |
||
795 | { |
||
796 | uint8_t old_step; |
||
797 | |||
798 | old_step = Gauge_step; |
||
799 | Gauge_step++; |
||
800 | if( Gauge_step >= (360/GAUGE_DEGREE)) Gauge_step = 0; |
||
801 | |||
802 | lcd_ellipse_line( Gauge_px, Gauge_py, Gauge_rx+GAUGE_LROFFS, Gauge_ry+GAUGE_LROFFS, (old_step*GAUGE_DEGREE) , 0); |
||
803 | lcd_ellipse_line( Gauge_px, Gauge_py, Gauge_rx+GAUGE_LROFFS, Gauge_ry+GAUGE_LROFFS, (Gauge_step*GAUGE_DEGREE), 1); |
||
804 | |||
805 | timer_gauge = GAUGE_TIMER; |
||
806 | } |
||
807 | |||
808 | |||
809 | |||
810 | //############################################################################################# |
||
811 | //# PKT Kontrollfunktionen |
||
812 | //############################################################################################# |
||
813 | |||
814 | //-------------------------------------------------------------- |
||
815 | //-------------------------------------------------------------- |
||
816 | void PKT_Reset_EEprom( void ) |
||
817 | { |
||
818 | // Text1: "PKT-EEProm" (EEPROM1) |
||
819 | // Text2: "wirklich löschen?" (EEPROM2) |
||
820 | // Head : "* ACHTUNG '" (STR_ATTENTION) |
||
821 | // Titel: PKT-Version (NULL) |
||
822 | |||
823 | if( PKT_Ask_P( ASK_YES_NO, strGet(EEPROM1), strGet(EEPROM2), strGet(STR_ATTENTION), NULL) ) |
||
824 | { |
||
825 | Delete_EEPROM(); |
||
826 | clr_V_On(); |
||
827 | } |
||
828 | } |
||
829 | |||
830 | |||
831 | |||
832 | //-------------------------------------------------------------- |
||
833 | //-------------------------------------------------------------- |
||
834 | void PKT_SwitchOff( void ) |
||
835 | { |
||
836 | // Text1: "PKT ausschalten?" (SHUTDOWN) |
||
837 | // Text2: NULL |
||
838 | // Head : "PKT" (STR_PKT) |
||
839 | // Titel: PKT-Version (NULL) |
||
840 | |||
841 | if( PKT_Ask_P( ASK_NO_YES, strGet(SHUTDOWN), NULL, strGet(STR_PKT), NULL) ) |
||
842 | { |
||
843 | WriteParameter(); // am Ende alle Parameter sichern |
||
844 | clr_V_On(); // Spannung abschalten |
||
845 | } |
||
846 | } |
||
847 | |||
848 | |||
849 | |||
850 | //-------------------------------------------------------------- |
||
851 | //-------------------------------------------------------------- |
||
852 | void PKT_Ask_Restart( const char *title ) |
||
853 | { |
||
854 | // Text1: "jetzt ausschalten?" (STR_PKT_SWITCHOFF_NOW) |
||
855 | // Text2: NULL |
||
856 | // Head : "PKT neu starten!" (STR_PKT_RESTART_NOW) |
||
857 | // Titel: via Parameter |
||
858 | |||
859 | if( PKT_Ask_P( ASK_NO_YES, strGet(STR_PKT_SWITCHOFF_NOW), NULL, strGet(STR_PKT_RESTART_NOW), title) ) |
||
860 | { |
||
861 | WriteParameter(); // am Ende alle Parameter sichern |
||
862 | clr_V_On(); // Spannung abschalten |
||
863 | } |
||
864 | } |
||
865 | |||
866 | |||
867 | |||
868 | //-------------------------------------------------------------- |
||
869 | //-------------------------------------------------------------- |
||
870 | void PKT_Update( void ) |
||
871 | { |
||
872 | // Text1: "Drücke 'Start' für" (UPDATE2) |
||
873 | // Text2: "min. 2 Sekunden" (UPDATE3) |
||
874 | // Head : "Verbinde PKT mit PC!" (UPDATE1) |
||
875 | // Titel: "PKT Update" |
||
876 | |||
877 | if( PKT_Ask_P( ASK_END_START, strGet(UPDATE2), strGet(UPDATE3), strGet(UPDATE1), PSTR("PKT Update")) ) |
||
878 | { |
||
879 | uart1_putc('S'); // Startzeichen zum Updatetool schicken |
||
880 | wdt_enable( WDTO_250MS ); // start bootloader with Reset, Hold KEY_ENTER |
||
881 | while(true); |
||
882 | } |
||
883 | } |
||
884 | |||
885 | |||
886 | |||
887 | //void PKT_Update( void ) |
||
888 | //{ |
||
889 | // ShowTitle_P( PSTR("PKT Update"), true ); |
||
890 | // lcdx_printp_center( 2, strGet(UPDATE1), MNORMAL, 0,-1); // "Verbinde PKT mit PC!" |
||
891 | // lcd_rect_round(0, 4*8-5, 127, 16+7, 1, R2); // Rahmen |
||
892 | // lcdx_printp_center( 4, strGet(UPDATE2), MNORMAL, 0,-1); // "Drücke 'Start' für" |
||
893 | // lcdx_printp_center( 5, strGet(UPDATE3), MNORMAL, 0, 0); // "min. 2 Sekunden" |
||
894 | // lcd_printp_at(11, 7, strGet(ENDSTART), MNORMAL); // Keyline |
||
895 | // //PKTupdate = false; // Flag löschen |
||
896 | // |
||
897 | // set_beep( 80, 0x000f, BeepNormal); // kurzer Beep |
||
898 | // |
||
899 | // do |
||
900 | // { |
||
901 | // if( get_key_press (1 << KEY_ESC) ) |
||
902 | // { |
||
903 | // //get_key_press(KEY_ALL); |
||
904 | // clear_key_all(); |
||
905 | // return; |
||
906 | // } |
||
907 | // } |
||
908 | // while( !(get_key_press (1 << KEY_ENTER)) ); |
||
909 | // |
||
910 | // uart1_putc('S'); // Startzeichen zum Updatetool schicken |
||
911 | // wdt_enable( WDTO_250MS ); // start bootloader with Reset, Hold KEY_ENTER |
||
912 | // while(true); |
||
913 | //} |
||
914 | |||
915 | |||
916 | |||
917 | //-------------------------------------------------------------- |
||
918 | // prueft im Menue ob das Updatetool ein Update machen will |
||
919 | //-------------------------------------------------------------- |
||
920 | uint8_t PKT_CheckUpdate(void) |
||
921 | { |
||
922 | unsigned int uart_data; |
||
923 | uint8_t state = 0; |
||
924 | uint8_t update = false; |
||
925 | uint8_t error = false; |
||
926 | uint8_t SendVersion = false; |
||
927 | char s[7]; |
||
928 | |||
929 | |||
930 | //---------------------------- |
||
931 | // empfangen |
||
932 | //---------------------------- |
||
933 | if( uart1_available() > 0 ) // Zeichen von der USB-Schnittstelle vorhanden? |
||
934 | { |
||
935 | timer_pktupdatecheck = 100; // Timeouttimer um die Funktion abzubrechen |
||
936 | |||
937 | while( !timer_pktupdatecheck==0 && !update && !error && !SendVersion ) |
||
938 | { |
||
939 | uart_data = uart1_getc(); |
||
940 | if( !((uart_data & 0xFF00) == UART_NO_DATA) ) |
||
941 | { |
||
942 | switch (state) |
||
943 | { |
||
944 | case 0: if( uart_data == PKTESC ) |
||
945 | { |
||
946 | state = 1; |
||
947 | } |
||
948 | else error = true; |
||
949 | break; |
||
950 | |||
951 | case 1: if( uart_data == PKTESC ) |
||
952 | { |
||
953 | state = 2; |
||
954 | } |
||
955 | else error = true; |
||
956 | break; |
||
957 | |||
958 | case 2: if( uart_data == PKTUPDATE ) update = true; |
||
959 | else if (uart_data == PKTVERSION) SendVersion = true; |
||
960 | else error = true; |
||
961 | break; |
||
962 | } // end: switch |
||
963 | } // end: if |
||
964 | } // end: while |
||
965 | |||
966 | |||
967 | //---------------------------- |
||
968 | // Rueckmeldungen |
||
969 | //---------------------------- |
||
970 | if( error ) |
||
971 | { |
||
972 | uart1_putc('E'); // Rueckmeldungen zum Updatetool |
||
973 | } |
||
974 | else if( update ) |
||
975 | { |
||
976 | uart1_putc('U'); |
||
977 | } |
||
978 | else if( SendVersion ) |
||
979 | { |
||
980 | uart1_putc('V'); |
||
981 | itoa( EEpromVersion, s, 10 ); |
||
982 | uart1_puts(s); |
||
983 | } |
||
984 | else if( timer_pktupdatecheck==0 ) |
||
985 | { |
||
986 | uart1_putc('T'); |
||
987 | } |
||
988 | |||
989 | //uart1_flush(); |
||
990 | } |
||
991 | |||
992 | return update; |
||
993 | } |
||
994 | |||
995 | |||
996 | |||
997 | //-------------------------------------------------------------- |
||
998 | // retcode = PKT_CtrlHook() |
||
999 | // |
||
1000 | // ruft ggf. PKT_Update() auf und kann spaeter weitere PKT interne |
||
1001 | // Sachen verarbeiten wenn der Hook (=Nagel) in entsprechende |
||
1002 | // Routienen eingebaut ist (z.B. senden von Daten an den PC) |
||
1003 | // |
||
1004 | // Aktuell verwendet von: menuctrl, scrollbox, osd |
||
1005 | // |
||
1006 | // Rueckgabe: |
||
1007 | // retcode: 0 = nichts wurde gemacht (false) |
||
1008 | // 1 = es wurde etwas durchgefuehrt und die Aufruffunktion |
||
1009 | // muss gff. einen Screenrefresh durchfuehren |
||
1010 | // (z.B. wenn der PKT-Update Screen gezeigt wurde) |
||
1011 | //-------------------------------------------------------------- |
||
1012 | uint8_t PKT_CtrlHook( void ) |
||
1013 | { |
||
1014 | uint8_t retcode = 0; |
||
1015 | |||
1016 | // 31.05.2014 OG: PKT_CheckUpdate() darf nicht in 'Hoechstgeschwindigkeit' |
||
1017 | // aufgerufen werden da es sonst seitens des PKT-Updatetools ggf. zu einer |
||
1018 | // Fehlermeldung kommt - deswegen hier timer_pktupdatecheck der PKT_CheckUpdate |
||
1019 | // etwas einbremst sich aber nicht negativ auf die PKT-Performance auswirkt. |
||
1020 | if( !timer_pktupdatecheck ) |
||
1021 | { |
||
1022 | if( PKT_CheckUpdate() ) // Update vom Updatetool angefordert? |
||
1023 | { |
||
1024 | WriteParameter(); |
||
1025 | PKT_Update(); |
||
1026 | retcode = 1; |
||
1027 | } |
||
1028 | timer_pktupdatecheck = 10; |
||
1029 | } |
||
1030 | |||
1031 | return retcode; |
||
1032 | } |
||
1033 | |||
1034 | |||
1035 | |||
1036 | //-------------------------------------------------------------- |
||
1037 | // zeigt PKT-Version und Credits / Entwickler |
||
1038 | //-------------------------------------------------------------- |
||
1039 | void PKT_Info( void ) |
||
1040 | { |
||
1041 | char *HWV_39m = "3.9m"; |
||
1042 | char *HWV_39x = "3.9x"; |
||
1043 | char *HWV = "????"; |
||
1044 | |||
1045 | if( PCB_Version == PKT39m ) HWV = HWV_39m; |
||
1046 | if( PCB_Version == PKT39x ) HWV = HWV_39x; |
||
1047 | |||
1048 | lcd_cls(); |
||
1049 | |||
1050 | if( !ScrollBox_Create(55) ) // max. 55 Zeilen |
||
1051 | return; // kein RAM mehr |
||
1052 | |||
1053 | ScrollBox_Push_P( MINVERS, PSTR(" PKT v%8S %s"), PSTR(PKTSWVersion), HWV ); // "3.6.8a..." und die PKT-Hardwareversion |
||
1054 | ScrollBox_Push_P( MINVERS, PSTR(" %S SV2-Patch"), (PCB_SV2RxTxPatch ? strGet(STR_WITH) : strGet(STR_WITHOUT)) ); |
||
1055 | ScrollBox_Push_P( MNORMAL, PSTR("") ); |
||
1056 | ScrollBox_Push_P( MNORMAL, PSTR("(C) GNU GPL License") ); |
||
1057 | ScrollBox_Push_P( MNORMAL, PSTR(" NO WARRANTY") ); |
||
1058 | ScrollBox_Push_P( MNORMAL, PSTR("") ); |
||
1059 | |||
1060 | |||
1061 | #ifdef USE_MODULEINFO |
||
1062 | |||
1063 | const char *fmt = PSTR("%15S %4S"); |
||
1064 | |||
1065 | //--- MODULE SUPPORT INFO --- |
||
1066 | ScrollBox_Push_P( MINVERS, PSTR(" Modules installed") ); |
||
1067 | |||
1068 | #ifdef USE_BLUETOOTH |
||
1069 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Bluetooth"), strGet(YES) ); |
||
1070 | #else |
||
1071 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Bluetooth"), strGet(NOO) ); |
||
1072 | #endif |
||
1073 | |||
1074 | |||
1075 | #ifdef USE_WLAN |
||
1076 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("WLAN WyFly"), strGet(YES) ); |
||
1077 | #else |
||
1078 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("WLAN WyFly"), strGet(NOO) ); |
||
1079 | #endif |
||
1080 | |||
1081 | |||
1082 | #ifdef USE_MKSETTINGS |
||
1083 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Settings"), strGet(YES) ); |
||
1084 | #else |
||
1085 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Settings"), strGet(NOO) ); |
||
1086 | #endif |
||
1087 | |||
1088 | |||
1089 | #ifdef USE_MKDEBUGDATA |
||
1090 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Debug Data"), strGet(YES) ); |
||
1091 | #else |
||
1092 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Debug Data"), strGet(NOO) ); |
||
1093 | #endif |
||
1094 | |||
1095 | |||
1096 | #ifdef USE_MKDISPLAY |
||
1097 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Display"), strGet(YES) ); |
||
1098 | #else |
||
1099 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Display"), strGet(NOO) ); |
||
1100 | #endif |
||
1101 | |||
1102 | |||
1103 | #ifdef USE_OSDDATA |
||
1104 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD-Data"), strGet(YES) ); |
||
1105 | #else |
||
1106 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD-Data"), strGet(NOO) ); |
||
1107 | #endif |
||
1108 | |||
1109 | |||
1110 | #ifdef USE_OSD_SCREEN_OLD |
||
1111 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Old Screens"), strGet(YES) ); |
||
1112 | #else |
||
1113 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Old Screens"), strGet(NOO) ); |
||
1114 | #endif |
||
1115 | |||
1116 | |||
1117 | #ifdef USE_OSD_SCREEN_NAVIGATION |
||
1118 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Navigation"), strGet(YES) ); |
||
1119 | #else |
||
1120 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Navigation"), strGet(NOO) ); |
||
1121 | #endif |
||
1122 | |||
1123 | |||
1124 | #ifdef USE_OSD_SCREEN_WAYPOINTS |
||
1125 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Waypoints"), strGet(YES) ); |
||
1126 | #else |
||
1127 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Waypoints"), strGet(NOO) ); |
||
1128 | #endif |
||
1129 | |||
1130 | |||
1131 | #ifdef USE_OSD_SCREEN_ELECTRIC |
||
1132 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Electric"), strGet(YES) ); |
||
1133 | #else |
||
1134 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Electric"), strGet(NOO) ); |
||
1135 | #endif |
||
1136 | |||
1137 | |||
1138 | #ifdef USE_OSD_SCREEN_MKSTATUS |
||
1139 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD MKStatus"), strGet(YES) ); |
||
1140 | #else |
||
1141 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD MKStatus"), strGet(NOO) ); |
||
1142 | #endif |
||
1143 | |||
1144 | |||
1145 | #ifdef USE_OSD_SCREEN_USERGPS |
||
1146 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD UserGPS"), strGet(YES) ); |
||
1147 | #else |
||
1148 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD UserGPS"), strGet(NOO) ); |
||
1149 | #endif |
||
1150 | |||
1151 | |||
1152 | #ifdef USE_OSD_SCREEN_3DLAGE |
||
1153 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD 3D-Lage"), strGet(YES) ); |
||
1154 | #else |
||
1155 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD 3D-Lage"), strGet(NOO) ); |
||
1156 | #endif |
||
1157 | |||
1158 | |||
1159 | #ifdef USE_OSD_SCREEN_STATISTIC |
||
1160 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Statistic"), strGet(YES) ); |
||
1161 | #else |
||
1162 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Statistic"), strGet(NOO) ); |
||
1163 | #endif |
||
1164 | |||
1165 | |||
1166 | #ifdef USE_TRACKING |
||
1167 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Tracking"), strGet(YES) ); |
||
1168 | #else |
||
1169 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Tracking"), strGet(NOO) ); |
||
1170 | #endif |
||
1171 | |||
1172 | |||
1173 | #ifdef USE_FOLLOWME |
||
1174 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Follow Me"), strGet(YES) ); |
||
1175 | #else |
||
1176 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Follow Me"), strGet(NOO) ); |
||
1177 | #endif |
||
1178 | |||
1179 | |||
1180 | #ifdef USE_JOYSTICK |
||
1181 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Joystick"), strGet(YES) ); |
||
1182 | #else |
||
1183 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Joystick"), strGet(NOO) ); |
||
1184 | #endif |
||
1185 | |||
1186 | |||
1187 | #ifdef USE_I2CMOTORTEST |
||
1188 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("I2C Motortest"), strGet(YES) ); |
||
1189 | #else |
||
1190 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("I2C Motortest"), strGet(NOO) ); |
||
1191 | #endif |
||
1192 | |||
1193 | |||
1194 | #ifdef USE_SOUND |
||
1195 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Sound"), strGet(YES) ); |
||
1196 | #else |
||
1197 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Sound"), strGet(NOO) ); |
||
1198 | #endif |
||
1199 | |||
1200 | |||
1201 | #ifdef USE_FONT_BIG |
||
1202 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Font Big"), strGet(YES) ); |
||
1203 | #else |
||
1204 | ScrollBox_Push_P( MNORMAL, fmt, PSTR("Font Big"), strGet(NOO) ); |
||
1205 | #endif |
||
1206 | |||
1207 | ScrollBox_Push_P( MNORMAL, PSTR("") ); |
||
1208 | |||
1209 | #endif // USE_MODULEINFO |
||
1210 | |||
1211 | |||
1212 | //--- CREDITS INFO --- |
||
1213 | ScrollBox_Push_P( MINVERS, PSTR(" Credits") ); |
||
1214 | ScrollBox_Push_P( MNORMAL, PSTR("2013 Oliver Gemesi") ); |
||
1215 | ScrollBox_Push_P( MNORMAL, PSTR("2012 Chr. Brandtner" ) ); |
||
1216 | ScrollBox_Push_P( MNORMAL, PSTR(" Harald Bongartz") ); |
||
1217 | ScrollBox_Push_P( MNORMAL, PSTR("2012 Martin Runkel") ); |
||
1218 | ScrollBox_Push_P( MNORMAL, PSTR("2012 gebad") ); |
||
1219 | ScrollBox_Push_P( MNORMAL, PSTR("2010 Sebastian Boehm") ); |
||
1220 | ScrollBox_Push_P( MNORMAL, PSTR("2009-2010 Peter Mack") ); |
||
1221 | ScrollBox_Push_P( MNORMAL, PSTR("2008 Thomas Kaiser") ); |
||
1222 | |||
1223 | ScrollBox_Show(); |
||
1224 | ScrollBox_Destroy(); // free memory |
||
1225 | } |
||
1226 | |||
1227 |