Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1687 | - | 1 | |
2 | /****************************************************************/ |
||
3 | /* */ |
||
4 | /* NG-Video 5,8GHz */ |
||
5 | /* */ |
||
6 | /* Copyright (C) 2011 - gebad */ |
||
7 | /* */ |
||
8 | /* This code is distributed under the GNU Public License */ |
||
9 | /* which can be found at http://www.gnu.org/licenses/gpl.txt */ |
||
10 | /* */ |
||
11 | /****************************************************************/ |
||
12 | |||
13 | #include <avr/interrupt.h> |
||
14 | #include <avr/eeprom.h> |
||
15 | #include <util/delay.h> |
||
16 | #include <stdlib.h> |
||
17 | #include <string.h> |
||
18 | |||
19 | #include "config.h" |
||
20 | #include "ngvideo.h" |
||
21 | #include "keys.h" |
||
22 | #include "menue.h" |
||
23 | #include "servo.h" |
||
24 | #include "tracking.h" |
||
25 | #include "messages.c" |
||
26 | #include "dogm.h" |
||
27 | #include "tools.h" |
||
28 | #include "usart.h" |
||
29 | #include "ngvideo.h" |
||
30 | |||
31 | typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX]; |
||
32 | char pmenu[6] = {"0"}; // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen |
||
33 | uint8_t m_pkt; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt), Scroll_Menu zeigen |
||
34 | uint8_t servo_nr; // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden |
||
35 | uint8_t chrxs; // zum Laden lcdSpecialChrLs oder lcdSpecialChrRs |
||
36 | uint8_t exit_while = 0; // unabhängige Task (z.B: Menu_MK_BatteryChangeNr() - Aufruf) kann Eingabe while-Schleife beenden, wenn 1 |
||
37 | |||
38 | // Menügliederung im Flash belassen |
||
39 | const char cmdStr0[] PROGMEM = "0"; |
||
40 | const char cmdStr01[] PROGMEM = "01"; |
||
41 | const char cmdStr02[] PROGMEM = "02"; |
||
42 | const char cmdStr03[] PROGMEM = "03"; |
||
43 | const char cmdStr031[] PROGMEM = "031"; |
||
44 | const char cmdStr032[] PROGMEM = "032"; |
||
45 | const char cmdStr033[] PROGMEM = "033"; |
||
46 | const char cmdStr034[] PROGMEM = "034"; |
||
47 | const char cmdStr035[] PROGMEM = "035"; |
||
48 | const char cmdStr0351[] PROGMEM = "0351"; |
||
49 | const char cmdStr0352[] PROGMEM = "0352"; |
||
50 | const char cmdStr04[] PROGMEM = "04"; |
||
51 | const char cmdStr05[] PROGMEM = "05"; |
||
52 | const char cmdStr051[] PROGMEM = "051"; |
||
53 | const char cmdStr052[] PROGMEM = "052"; // zwischen Servo 1 und 2 wird danach |
||
54 | const char cmdStr0521[] PROGMEM = "0521"; // mit global servo_nr unterschieden |
||
55 | const char cmdStr0522[] PROGMEM = "0522"; |
||
56 | const char cmdStr0523[] PROGMEM = "0523"; |
||
57 | const char cmdStr0524[] PROGMEM = "0524"; |
||
58 | const char cmdStr053[] PROGMEM = "053"; |
||
59 | const char cmdStr0531[] PROGMEM = "0531"; |
||
60 | const char cmdStr0532[] PROGMEM = "0532"; |
||
61 | const char cmdStr0533[] PROGMEM = "0533"; |
||
62 | const char cmdStr0534[] PROGMEM = "0534"; |
||
63 | const char cmdStr06[] PROGMEM = "06"; |
||
64 | const char cmdStr061[] PROGMEM = "061"; |
||
65 | const char cmdStr062[] PROGMEM = "062"; |
||
66 | const char cmdStr0621[] PROGMEM = "0621"; |
||
67 | const char cmdStr0622[] PROGMEM = "0622"; |
||
68 | const char cmdStr0623[] PROGMEM = "0623"; |
||
69 | const char cmdStr0624[] PROGMEM = "0624"; |
||
70 | const char cmdStr0625[] PROGMEM = "0625"; |
||
71 | const char cmdStr063[] PROGMEM = "063"; |
||
72 | const char cmdStr064[] PROGMEM = "064"; |
||
73 | const char cmdStr07[] PROGMEM = "07"; |
||
74 | const char cmdStr071[] PROGMEM = "071"; |
||
75 | const char cmdStr072[] PROGMEM = "072"; |
||
76 | const char cmdStr08[] PROGMEM = "08"; |
||
77 | const char cmdStr081[] PROGMEM = "081"; |
||
78 | const char cmdStr082[] PROGMEM = "082"; |
||
79 | const char cmdStr083[] PROGMEM = "083"; |
||
80 | const char cmdStr0831[] PROGMEM = "0831"; |
||
81 | const char cmdStr0832[] PROGMEM = "0832"; |
||
82 | const char cmdStr0833[] PROGMEM = "0833"; |
||
83 | const char cmdStr0834[] PROGMEM = "0834"; |
||
84 | const char cmdStr0835[] PROGMEM = "0835"; |
||
85 | const char cmdStr09[] PROGMEM = "09"; |
||
86 | const char cmdStr0d[] PROGMEM = "0:"; // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert |
||
87 | const char cmdStr0e[] PROGMEM = "0;"; // wird nur bei Tracking GPS eingeblendet - SCROLL_MAIN_MAX wird geändert |
||
88 | const char cmdStr0e1[] PROGMEM = "0;1"; // nach '9' (0x39) folgt ':' (0x3a) ';' (0x3b) |
||
89 | const char cmdStr0e2[] PROGMEM = "0;2"; |
||
90 | const char cmdStr0e3[] PROGMEM = "0;3"; |
||
91 | const char cmdStr0e4[] PROGMEM = "0;4"; |
||
92 | const char cmdStr0e5[] PROGMEM = RXTimeStr; |
||
93 | |||
94 | command_table_t command_table[] PROGMEM = // Befehls-Tabelle |
||
95 | { |
||
96 | {cmdStr0, Menu_Main}, |
||
97 | {cmdStr01, Menu_AV_Source}, |
||
98 | {cmdStr02, Menu_RX_Channel}, |
||
99 | {cmdStr03, Menu_RSSI_Calibr}, |
||
100 | {cmdStr031, Menu_RSSI_min}, |
||
101 | {cmdStr032, Menu_RSSI_min_all}, |
||
102 | {cmdStr033, Menu_RSSI_max}, |
||
103 | {cmdStr034, Menu_RSSI_invert}, |
||
104 | {cmdStr035, Menu_TX_identyfy}, |
||
105 | {cmdStr0351, Menu_TX_status_off}, |
||
106 | {cmdStr0352, Menu_TX_status_on}, |
||
107 | {cmdStr04, Menu_Language}, |
||
108 | {cmdStr05, Menu_Servo_Calibr}, |
||
109 | {cmdStr051, Menu_Servo_Steps}, |
||
110 | {cmdStr052, Menu_Servo1}, // zwischen Servo 1 und 2 wird danach |
||
111 | {cmdStr0521, Menu_Servo1_rev}, // mit global servo_nr unterschieden |
||
112 | {cmdStr0522, Menu_Servo1_left}, |
||
113 | {cmdStr0523, Menu_Servo1_right}, |
||
114 | {cmdStr0524, Menu_Servo1_middle}, |
||
115 | {cmdStr053, Menu_Servo2}, |
||
116 | {cmdStr0531, Menu_Servo2_rev}, |
||
117 | {cmdStr0532, Menu_Servo2_left}, |
||
118 | {cmdStr0533, Menu_Servo2_right}, |
||
119 | {cmdStr0534, Menu_Servo2_middle}, |
||
120 | {cmdStr06, Menu_Servo_Test}, |
||
121 | {cmdStr061, Menu_Test_PulseWidth}, |
||
122 | {cmdStr062, Menu_Test_Continuous}, |
||
123 | {cmdStr0621, Menu_Test_Start}, |
||
124 | {cmdStr0622, Menu_Test_SingleStep}, |
||
125 | {cmdStr0623, Menu_Test_Repeat}, |
||
126 | {cmdStr0624, Menu_Test_Pause}, |
||
127 | {cmdStr0625, Menu_Test_Pause_Step}, |
||
128 | {cmdStr063, Menu_Test_ServoNr}, |
||
129 | {cmdStr064, Menu_Test_Frame}, |
||
130 | {cmdStr07, Menu_lcd}, |
||
131 | {cmdStr071, Menu_lcd_Contrast}, |
||
132 | {cmdStr072, Menu_lcd_Backgr_Light}, |
||
133 | {cmdStr08, Menu_Battery}, |
||
134 | {cmdStr081, Menu_Low_U_Setup}, |
||
135 | {cmdStr082, Menu_U_Offset}, |
||
136 | {cmdStr083, Menu_MK_Battery}, |
||
137 | {cmdStr0831, Menu_MK_BatteryNr}, |
||
138 | {cmdStr0832, Menu_MK_BatteryCapacity}, |
||
139 | {cmdStr0833, Menu_MK_I_Offset}, |
||
140 | {cmdStr0834, Menu_MK_I_Faktor}, |
||
141 | {cmdStr0835, Menu_MK_W_Faktor}, |
||
142 | {cmdStr09, Menu_Tracking_Ant}, |
||
143 | {cmdStr0d, Menu_Tracking_Option}, // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert |
||
144 | {cmdStr0e, Menu_GPS_Display}, // wird nur bei Tracking GPS oder NMEA eingeblendet - SCROLL_MAIN_MAX wird geändert |
||
145 | {cmdStr0e1, Menu_GPS_Display_FLAG}, // nach '9' (0x39) folgt ':' (0x3a) |
||
146 | {cmdStr0e2, Menu_GPS_Display_FLAG}, |
||
147 | {cmdStr0e3, Menu_GPS_Display_FLAG}, |
||
148 | {cmdStr0e4, Menu_GPS_Display_FLAG}, |
||
149 | {cmdStr0e5, Menu_GPS_Displ_RX_Time} // bei NMEA wird dieser Menüpunkt um 1 vorgezogen (anstelle GPS_MISC) |
||
150 | }; |
||
151 | |||
152 | |||
153 | uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct); |
||
154 | |||
155 | |||
156 | /**************************************************************/ |
||
157 | /* */ |
||
158 | /* Steuerung der Menüs */ |
||
159 | /* */ |
||
160 | /**************************************************************/ |
||
161 | |||
162 | /************************************************************************************/ |
||
163 | /* sucht nach übergebenen String in der Kommandotabelle und springt zum daneben */ |
||
164 | /* stehenden Menü-Programm */ |
||
165 | /* Parameter: */ |
||
166 | /* char *pmenu :zu suchender String in Kommandotabelle */ |
||
167 | /* */ |
||
168 | /************************************************************************************/ |
||
169 | void Jump_Menu(char *pmenu) |
||
170 | { uint8_t i; |
||
171 | void (*func)(void); |
||
172 | |||
173 | if (pmenu[0] != '\0'){ |
||
174 | for (i=0; i < sizeof(command_table) / sizeof(command_table_t); i++) { |
||
175 | // Ist das der gesuchte String? |
||
176 | if (!(strcmp_P(pmenu, (char*)pgm_read_word(&(command_table[i].menu_nr))))) { |
||
177 | func = (void(*)(void))pgm_read_word(&(command_table[i].fp)); |
||
178 | func(); |
||
179 | break; |
||
180 | } |
||
181 | } |
||
182 | } |
||
183 | } |
||
184 | |||
185 | /************************************************************************************/ |
||
186 | /* */ |
||
187 | /* Abfrage Short- oder Long-Enter */ |
||
188 | /* verbleibt in Abfrage bis Enter betätigt; Rückgabe => Short-Enter True/False */ |
||
189 | /* */ |
||
190 | /************************************************************************************/ |
||
191 | uint8_t Long_Enter(void) |
||
192 | { |
||
193 | Tasks_invisible(); // Dadurch ist Doppelaufruf von MK-GPS möglich!!! Nur bei Menu_MK_BatteryChangeNr() |
||
194 | // falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW |
||
195 | U_Messen_cmp(DISABLE_BTIMER); |
||
196 | if (Get_Key_Long( 1<<SW_ENTER ) || bat_low) { |
||
197 | pmenu[0] ='\0'; // direkt in das Hauptprogramm |
||
198 | return 1; |
||
199 | } |
||
200 | else return 0; |
||
201 | } |
||
202 | |||
203 | uint8_t Short_Enter(void) |
||
204 | { uint8_t ret; |
||
205 | |||
206 | // bis Short- oder Long-Enter, auch Akku leer |
||
207 | while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while); |
||
208 | lcdClear(); |
||
209 | if (pmenu[0] == '\0') Displ_Main_Disp(); else Beep(BEEPENTER); // bei ShortEnter Beep |
||
210 | ret = (pmenu[0] != '\0') && !exit_while; |
||
211 | exit_while = 0; |
||
212 | return(ret); // ShortEnter bringt 1 zurück |
||
213 | } |
||
214 | |||
215 | /************************************************************************************/ |
||
216 | /* */ |
||
217 | /* Unterprogramm vom Scroll_Menu(...) stellt Menüpunkte dar */ |
||
218 | /* Parameter: */ |
||
219 | /* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */ |
||
220 | /* uint8_t scr_idx : ausgewählter Menüpunkt */ |
||
221 | /* uint8_t scroll_max : scrollen bis Wert */ |
||
222 | /* */ |
||
223 | /************************************************************************************/ |
||
224 | void Displ_Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx) |
||
225 | { uint8_t i; |
||
226 | |||
227 | if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0]; |
||
228 | for (i = 0; i < LCD_LINES; i++) { |
||
229 | lcdGotoXY(2, i); // LCD Beginn x-Position, 2 Zeichen rechts eingerückt |
||
230 | lcdPuts(Msg(scr_menu[scr_idx + 1])); |
||
231 | lcdClearEOL(); // ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr |
||
232 | if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0; |
||
233 | } |
||
234 | } |
||
235 | |||
236 | /************************************************************************************/ |
||
237 | /* */ |
||
238 | /* Unterprogramm vom Scroll_Menu(...) und Change_Value(...) */ |
||
239 | /* bei Rücksprung auf ursprünglichen Menüpunkt zeigen */ |
||
240 | /* Parameter: */ |
||
241 | /* uint8_t l : Strinlänge von pmenue */ |
||
242 | /* */ |
||
243 | /************************************************************************************/ |
||
244 | void return_m_pkt(uint8_t l) |
||
245 | { |
||
246 | if (l > 1) { // bei l=1 und Subtraktion 1 wird sowieso Displ_Main_Disp() ausgeführt und dort pmenu[0] = '\0' gesetzt |
||
247 | l--; |
||
248 | m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen |
||
249 | pmenu[l] ='\0'; // auf letztes Zeichen Stringende schreiben |
||
250 | } |
||
251 | else Displ_Main_Disp(); |
||
252 | } |
||
253 | |||
254 | /************************************************************************************/ |
||
255 | /* */ |
||
256 | /* scrollt Menü über Mehrzeilige LCD */ |
||
257 | /* */ |
||
258 | /* Taste<Enter> lang springt in Hauptanzeige, kurz geht in den angewälten Menüpunkt*/ |
||
259 | /* Taste<+> eine Zeile nach oben */ |
||
260 | /* Taste<-> eine Zeile nach unten */ |
||
261 | /* Parameter: */ |
||
262 | /* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */ |
||
263 | /* uint8_t scroll_max : scrollen bis Wert */ |
||
264 | /* uint8_t scr_idx : Index für array von Displ_Scroll_Menu(...) */ |
||
265 | /* */ |
||
266 | /************************************************************************************/ |
||
267 | void Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx) |
||
268 | { uint8_t l; |
||
269 | |||
270 | lcdClear(); |
||
271 | lcdGotoXY(0, 1); |
||
272 | lcdPutc(MARKER_SELECT); // '>>' |
||
273 | Displ_Scroll_Menu(scr_menu, scr_idx); |
||
274 | // bis Menueeingabe bestätigt oder zum vorherigen Menue |
||
275 | while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while) |
||
276 | { |
||
277 | // >> Menueauswahl nach oben |
||
278 | if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )) { |
||
279 | if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0]; |
||
280 | Displ_Scroll_Menu(scr_menu, scr_idx); |
||
281 | } |
||
282 | // >> Menueauswahl nach unten |
||
283 | if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) { |
||
284 | if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0; |
||
285 | Displ_Scroll_Menu(scr_menu, scr_idx); |
||
286 | } |
||
287 | } |
||
288 | |||
289 | lcdClear(); |
||
290 | if (exit_while) // wegen Aufruf Menu_MK_BatteryChangeNr() in Task |
||
291 | m_pkt = scr_idx; // nach Task Menu_MK_BatteryChangeNr() wieder zum ursprünlichen Anzeigepunkt |
||
292 | else { |
||
293 | l = strlen(pmenu); |
||
294 | if ((scr_idx == 0) || (l == 0)) // long Enter wird durch l == 0 brücksichtigt |
||
295 | return_m_pkt(l); // um bei Rücksprung auf ursprünglichen Menüpunkt zu zeigen oder Displ_Main_Disp() |
||
296 | else { |
||
297 | m_pkt = 1; // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt |
||
298 | pmenu[l] = scr_idx + '0'; // nächsten MenueIndex anhängen 1 oder 2 oder ... |
||
299 | pmenu[++l] ='\0'; |
||
300 | Beep(BEEPENTER); |
||
301 | } |
||
302 | } |
||
303 | exit_while = 0; |
||
304 | } |
||
305 | |||
306 | /************************************************************************************/ |
||
307 | /* */ |
||
308 | /* Ändern der Werte mit Tasten +,- und Anzeige */ |
||
309 | /* z.B. für U-Offset, Batterie leer Eingabe ... */ |
||
310 | /* */ |
||
311 | /* Parameter: */ |
||
312 | /* uint16_t val :zu ändernter Wert */ |
||
313 | /* uint16_t min_val, max_val :min, max Grenze Wert ändern darf */ |
||
314 | /* uint8_t posX, posY :Darstellung Wert xPos, YPos auf LCD */ |
||
315 | /* Displ_Fnct_t Displ_Fnct :Pointer auf Funktion Addr. Display(val) */ |
||
316 | /* uint8_t cycle :0 begrenzt Anzeige bei man_val, bzw. max_val */ |
||
317 | /* :1 springt nach max_val auf min_val und umgedreht */ |
||
318 | /* uint8_t vrepeat :beschleunigte Repeat-Funktion aus/ein */ |
||
319 | /* uint16_t Change_Value_plmi(...) :Rückgabe geänderter Wert */ |
||
320 | /* */ |
||
321 | /************************************************************************************/ |
||
322 | uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_t max_val, uint8_t posX, uint8_t posY, \ |
||
323 | Displ_Fnct_t Displ_Fnct, uint8_t cycle, uint8_t vrepeat) |
||
324 | { |
||
325 | // >> Menueauswahl nach oben |
||
326 | if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )){ |
||
327 | if (val < max_val) { |
||
328 | val++; |
||
329 | Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion |
||
330 | } |
||
331 | else |
||
332 | if (cycle) val = min_val; |
||
333 | lcdGotoXY(posX, posY); // lcd Position Wert |
||
334 | Displ_Fnct(val); // geänderten Wert darstellen, je nach Menüpunkt |
||
335 | } |
||
336 | // >> Menueauswahl nach unten |
||
337 | if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) { |
||
338 | if (val > min_val) { |
||
339 | val--; |
||
340 | Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion |
||
341 | } |
||
342 | else |
||
343 | if (cycle) val = max_val; |
||
344 | lcdGotoXY(posX, posY); // noch einmal lcd Position, sonst zum Teil + und - gleichzeitig, Anzeige verrutscht |
||
345 | Displ_Fnct(val); // geänderten Wert darstellen, je nach Menüpunkt |
||
346 | } |
||
347 | return(val); |
||
348 | } |
||
349 | |||
350 | /************************************************************************************/ |
||
351 | /* */ |
||
352 | /* Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige */ |
||
353 | /* z.B. für U-Offset, Batterie leer Eingabe ... */ |
||
354 | /* */ |
||
355 | /* Parameter: */ |
||
356 | /* uint16_t *val :zu ändernter Wert */ |
||
357 | /* uint16_t min_val, max_val :min, max Grenze Wert ändern darf */ |
||
358 | /* uint8_t fl_pos :Bit 7 beschleunigte Repeat-Funktion aus/ein */ |
||
359 | /* Bit 6 zyklische Werteänderung aus/ein */ |
||
360 | /* Bit 4-5 z.Z. ohne Funktion */ |
||
361 | /* Bit 0-3 Wert xPos auf LCD */ |
||
362 | /* Displ_Fnct_t Displ_Fnct :Pointer auf Funktion Addr. Display(val) */ |
||
363 | /* uint8_t Change_Value(...) :Rückgabe geändert ergibt TRUE */ |
||
364 | /* */ |
||
365 | /************************************************************************************/ |
||
366 | // Bei Bedarf könnte einfach innerhalp fl_pos auch noch pos_y (Bit 4-5) übergeben werden |
||
367 | uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct) |
||
368 | { uint16_t tmp_val; |
||
369 | |||
370 | tmp_val = *val; |
||
371 | lcdGotoXY(fl_pos & POSXMASK, ZLE_VAL); // Position Wert |
||
372 | Displ_Fnct(tmp_val); // initiale Wertdarstellung, je nach Menüpunkt |
||
373 | if (pmenu[0] =='\0') strcpy(pmenu, "0"); // sonst wird eventuell nachfolgende while-Schleife nicht ausgeführt |
||
374 | // bis Menueeingabe bestätigt oder zum vorherigen Menue |
||
375 | while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while) |
||
376 | *val = Change_Value_plmi(*val, min_val, max_val, fl_pos & POSXMASK, ZLE_VAL, Displ_Fnct, fl_pos & (1<<CYCLE), fl_pos & (1<<V_REPEAT)); |
||
377 | |||
378 | lcdClear(); |
||
379 | if (exit_while) { |
||
380 | exit_while = 0; |
||
381 | *val = tmp_val; |
||
382 | } |
||
383 | else |
||
384 | return_m_pkt(strlen(pmenu)); // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp() |
||
385 | return(tmp_val != *val); |
||
386 | } |
||
387 | |||
388 | /**************************************************************/ |
||
389 | /* */ |
||
390 | /* LCD-Darstellungen der Menüs */ |
||
391 | /* Zur Unterstützung der Auswahl werden einige Einstellungen */ |
||
392 | /* sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag */ |
||
393 | /* */ |
||
394 | /**************************************************************/ |
||
395 | |||
396 | /************************************************************************************/ |
||
397 | /* zeigt Menü- * Überschrift * auf erste Zeile mittig auf Display an */ |
||
398 | /* Parameter: */ |
||
399 | /* uint8_t message : index (MSG_) der darzustellenden Zeichenkette */ |
||
400 | /* */ |
||
401 | /************************************************************************************/ |
||
402 | void Displ_Title(uint8_t message) |
||
403 | { uint8_t l; |
||
404 | uint8_t x = 0; |
||
405 | |||
406 | l = strlen(Msg(message)); |
||
407 | if ( LCD_COLS > l) x = (LCD_COLS - l)/2; |
||
408 | if (x > 1) { |
||
409 | lcdGotoXY(x - 2, 0); |
||
410 | lcdPuts("* "); |
||
411 | lcdPuts(Msg(message)); |
||
412 | lcdPutc(' '); |
||
413 | } |
||
414 | else { |
||
415 | lcdGotoXY(0, 0); |
||
416 | lcdPutc('*'); |
||
417 | lcdGotoXY(x, 0); |
||
418 | lcdPuts(Msg(message)); |
||
419 | lcdGotoXY(LCD_COLS - 1, 0); |
||
420 | } |
||
421 | lcdPutc('*'); |
||
422 | } |
||
423 | |||
424 | /************************************************************************************/ |
||
425 | /* zeigt bei Programmstart Firmware- und DOGM-Version auf Display an */ |
||
426 | /* */ |
||
427 | /************************************************************************************/ |
||
428 | void Displ_Version(void) |
||
429 | { |
||
430 | lcdGotoXY(0, 0); |
||
431 | lcdPuts(Msg(MSG_VERSION1)); |
||
432 | if (dogm_vers == DOGM3V) |
||
433 | lcdPuts(Msg(MSG_UHW33V)); |
||
434 | else |
||
435 | lcdPuts(Msg(MSG_UHW5V)); |
||
436 | lcdPuts(Msg(MSG_VERSION2)); |
||
437 | delay_ms100x(30); |
||
438 | lcdClear(); |
||
439 | } |
||
440 | |||
441 | /************************************************************************************/ |
||
442 | /* zeigt auszuwählenden/-gewählten Kanal und Frequenz auf Display an */ |
||
443 | /* Parameter: */ |
||
444 | /* uint16_t k :Index anzuzeigender Wert = Kanal + 0x30 als Char, */ |
||
445 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
446 | /* */ |
||
447 | /************************************************************************************/ |
||
448 | void Displ_Channels(uint16_t k) |
||
449 | { char *channels[] = {"5740", "5760","5780", "5800", "5820", "5840", "5860"}; |
||
450 | |||
451 | lcdPutc(k+0x30); |
||
452 | lcdPuts(": "); |
||
453 | lcdPuts(channels[k-1]); |
||
454 | lcdPuts("MHz"); |
||
455 | } |
||
456 | |||
457 | /************************************************************************************/ |
||
458 | /* zeigt Source AV1, AV2 oder Diversity zur Auswahl auf Display an */ |
||
459 | /* Parameter: */ |
||
460 | /* uint16_t q :Index anzuzeigender Wert, */ |
||
461 | /* unint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
462 | /* */ |
||
463 | /************************************************************************************/ |
||
464 | void Displ_AV_Source(uint16_t q) |
||
465 | { uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY}; |
||
466 | |||
467 | lcdPutStrMid(Msg(av_src_table[q]), ZLE_VAL); |
||
468 | } |
||
469 | |||
470 | /************************************************************************************/ |
||
471 | /* zeigt Tracking-Varianten zur Auswahl auf Display an */ |
||
472 | /* Parameter: */ |
||
473 | /* uint16_t q :Index anzuzeigender Wert, */ |
||
474 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
475 | /* */ |
||
476 | /************************************************************************************/ |
||
477 | void Displ_sel_Tracking(uint16_t q) |
||
478 | { uint8_t track_sel_table[] = {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT, MSG_TRACK_NMEA}; |
||
479 | |||
480 | lcdPutStrMid(Msg(track_sel_table[q]), ZLE_VAL); |
||
481 | } |
||
482 | |||
483 | /************************************************************************************/ |
||
484 | /* zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an */ |
||
485 | /* Parameter: */ |
||
486 | /* uint16_t q :Index anzuzeigender Wert, */ |
||
487 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
488 | /* */ |
||
489 | /************************************************************************************/ |
||
490 | void Displ_track_TX(uint16_t q) |
||
491 | { uint8_t track_TX_table[] = {MSG_OFF, MSG_TRACK_TX_ON}; |
||
492 | |||
493 | lcdPutStrMid(Msg(track_TX_table[q]), ZLE_VAL); |
||
494 | } |
||
495 | |||
496 | /************************************************************************************/ |
||
497 | /* zeigt einen max. 3-stelligen Integerwert auf Display an */ |
||
498 | /* Parameter: */ |
||
499 | /* uint16_t val :anzuzeigender Wert, */ |
||
500 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
501 | /* */ |
||
502 | /************************************************************************************/ |
||
503 | void Displ_Format_Int(uint16_t val) |
||
504 | { |
||
505 | lcdPuts(my_itoa(val, 3, 0, 0)); |
||
506 | } |
||
507 | |||
508 | /************************************************************************************/ |
||
509 | /* zeigt den Kontrastwert auf Display an mit sofortiger Änderung */ |
||
510 | /* Parameter: */ |
||
511 | /* uint16_t val :anzuzeigender Wert, */ |
||
512 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
513 | /* */ |
||
514 | /************************************************************************************/ |
||
515 | void Displ_Set_Contrast(uint16_t val) |
||
516 | { |
||
517 | Displ_Format_Int(val); |
||
518 | lcdContrast(dogm_vers, val); |
||
519 | } |
||
520 | |||
521 | /************************************************************************************/ |
||
522 | /* zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an */ |
||
523 | /* Parameter: */ |
||
524 | /* uint16_t val :anzuzeigender Wert, */ |
||
525 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
526 | /* */ |
||
527 | /************************************************************************************/ |
||
528 | void Displ_Backgr_Light(uint16_t val) |
||
529 | { char str[5]; |
||
530 | |||
531 | switch(val) { |
||
532 | case BACKGR_LIGHT_MIN : lcdPuts(Msg(MSG_LIGHT_OFF)); |
||
533 | break; |
||
534 | case BACKGR_LIGHT_MAX : lcdPuts(Msg(MSG_LIGHT_ON)); |
||
535 | break; |
||
536 | default : itoa (val * 10, str, 10); |
||
537 | lcdPutc(' '); |
||
538 | lcdPuts(str); |
||
539 | lcdPuts(Msg(MSG_SEC)); |
||
540 | } |
||
541 | lcdClearEOL(); |
||
542 | } |
||
543 | |||
544 | /************************************************************************************/ |
||
545 | /* zeigt ein oder aus zur Auswahl auf Display an */ |
||
546 | /* Parameter: */ |
||
547 | /* uint16_t val :0 = aus oder 1 = ein, */ |
||
548 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
549 | /* */ |
||
550 | /************************************************************************************/ |
||
551 | void Displ_Off_On(uint16_t val) |
||
552 | { |
||
553 | if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON)); |
||
554 | } |
||
555 | |||
556 | /************************************************************************************/ |
||
557 | /* zeigt Servoschritte zur Auswahl auf Display an */ |
||
558 | /* Parameter: */ |
||
559 | /* uint16_t val :0 = 255 oder 1 = 1023, */ |
||
560 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
561 | /* */ |
||
562 | /************************************************************************************/ |
||
563 | void Displ_Servo_Steps(uint16_t val) |
||
564 | { uint8_t servo_step_table[] = {MSG_STEPS_255, MSG_STEPS_1023}; |
||
565 | |||
566 | lcdPutStrMid(Msg(servo_step_table[val]), ZLE_VAL); |
||
567 | } |
||
568 | |||
569 | /************************************************************************************/ |
||
570 | /* zeigt Servo-Anschlagposition links auf Display an */ |
||
571 | /* mit sofortiger Wirkung auf Servo */ |
||
572 | /* Parameter: */ |
||
573 | /* uint16_t val :anzuzeigender Wert, */ |
||
574 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
575 | /* */ |
||
576 | /************************************************************************************/ |
||
577 | void Displ_Servo_Min(uint16_t val) |
||
578 | { uint16_t steps = 0; |
||
579 | |||
580 | Displ_Format_Int(val); |
||
581 | servoSet_min(servo_nr, val); // Wert setzen damit nachfolgend die |
||
582 | if (servo[servo_nr].rev) steps = ServoSteps(); |
||
583 | servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist |
||
584 | } |
||
585 | |||
586 | /************************************************************************************/ |
||
587 | /* zeigt Servo-Anschlagposition rechts auf Display an */ |
||
588 | /* mit sofortiger Wirkung auf Servo */ |
||
589 | /* Parameter: */ |
||
590 | /* uint16_t val :anzuzeigender Wert, */ |
||
591 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
592 | /* */ |
||
593 | /************************************************************************************/ |
||
594 | void Displ_Servo_Max(uint16_t val) |
||
595 | { uint16_t steps = ServoSteps(); |
||
596 | |||
597 | Displ_Format_Int(val); |
||
598 | servoSet_max(servo_nr, val); // Wert setzen damit nachfolgend die |
||
599 | if (servo[servo_nr].rev) steps = 0; |
||
600 | servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist |
||
601 | } |
||
602 | |||
603 | /************************************************************************************/ |
||
604 | /* zeigt Servo-Anschlagposition Mitte auf Display an */ |
||
605 | /* mit sofortiger Wirkung auf Servo */ |
||
606 | /* Parameter: */ |
||
607 | /* uint16_t val :anzuzeigender Wert, */ |
||
608 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
609 | /* */ |
||
610 | /************************************************************************************/ |
||
611 | void Displ_Servo_Mid(uint16_t val) |
||
612 | { int16_t mid_val; |
||
613 | |||
614 | mid_val = val - ServoSteps()/2; |
||
615 | lcdPuts(my_itoa(mid_val, 4, 0, 0)); |
||
616 | servoSet_mid(servo_nr, val); // Wert setzen damit nachfolgend die |
||
617 | servoSetPosition(servo_nr, ServoSteps()/2); // Änderung direkt am Servo sichtbar ist |
||
618 | } |
||
619 | |||
620 | /************************************************************************************/ |
||
621 | /* zeigt zu testende Servonummer zur Auswahl auf Display an */ |
||
622 | /* Parameter: */ |
||
623 | /* uint16_t val :0 = Servo 1 oder 1 = Servo 2, */ |
||
624 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
625 | /* */ |
||
626 | /************************************************************************************/ |
||
627 | void Displ_ServoNr(uint16_t val) |
||
628 | { |
||
629 | if (val == 0) lcdPuts(Msg(MSG_SERVO1)); else lcdPuts(Msg(MSG_SERVO2)); |
||
630 | } |
||
631 | |||
632 | |||
633 | /************************************************************************************/ |
||
634 | /* zeigt Servoausschlag in ms, in % und als Bargraph auf Display an */ |
||
635 | /* Parameter: */ |
||
636 | /* int16_t PosProzent : aktuell eingestellte Position vom 0-Punkt (Mitte) aus */ |
||
637 | /* int16_t range : maximaler absoluter Ausschlag vom 0-Punkt aus */ |
||
638 | /* */ |
||
639 | /************************************************************************************/ |
||
640 | // leerer Rahmen für Bar |
||
641 | char* empty_Bar(void) |
||
642 | { static char tmp_empty[LCD_COLS]; |
||
643 | uint8_t i; |
||
644 | |||
645 | tmp_empty[0] = '\0'; // '[' |
||
646 | for (i = 1; i < 15; i++) |
||
647 | tmp_empty[i] = '\x07'; |
||
648 | tmp_empty[i] = '\x06'; // ']' |
||
649 | return(tmp_empty); |
||
650 | } |
||
651 | |||
652 | void draw_bar(int16_t PosProzent, int16_t range, uint8_t zle) |
||
653 | { int8_t i, sp_quad, sp_ch; |
||
654 | int8_t lz = 8; |
||
655 | char* bar; |
||
656 | |||
657 | bar = empty_Bar(); // leerer Rahmen für Bar |
||
658 | sp_quad = abs(PosProzent) * 7 / range; // Anzahl der vollen Kästchen |
||
659 | |||
660 | sp_ch = (abs(PosProzent) -(range * sp_quad / 7)) * 35 / range; // Unterteilung Kästchen in 6 senkrechte Striche |
||
661 | if (sp_ch > 4) sp_ch = 4; // bei 28 (7*4) wäre keine Korrektur erforderlich aber so kontinuierlicher |
||
662 | if (PosProzent < 0){ |
||
663 | lz -= sp_quad; // Position für volles Kästchen bei Linksausschlag |
||
664 | if (sp_ch > 0) bar[lz-1] = sp_ch; // vor erstes volles Kästchen Kästchenunterteilung schreiben |
||
665 | } // Unterteilung Kästchen der 4 senkrechte Striche nach Bar (0 und 5 entfallen) |
||
666 | else |
||
667 | if (sp_ch > 0) bar[lz+sp_quad] = sp_ch;// nach lezten vollen Kästchen Kästchenunterteilung schreiben |
||
668 | |||
669 | for (i = 0; i < sp_quad; i++) |
||
670 | bar[i+lz] = '\x05'; // volle Kästchen schreiben |
||
671 | lcdGotoXY(0,zle); |
||
672 | for (uint8_t i = 0; i < LCD_COLS; i++) lcdPutc(bar[i]);// kpl. Bar zum Display |
||
673 | } |
||
674 | |||
675 | uint16_t calc_range(int16_t PosProzent, int16_t min, int16_t max, int16_t mid) |
||
676 | { uint16_t range; |
||
677 | |||
678 | if (PosProzent < 0) { |
||
679 | range = mid - min; |
||
680 | if (chrxs == CHRRS) { // falls Richtung geändert, anderen Zeichensatz laden |
||
681 | chrxs = CHRLS; |
||
682 | lcdWriteCGRAM_Array(lcdSpecialChrLs, 5);// LCD-Char mit Rahmensymbole vom Graph |
||
683 | } |
||
684 | } |
||
685 | else { |
||
686 | range = max - mid; |
||
687 | if (chrxs == CHRLS) { // falls Richtung geändert, anderen Zeichensatz laden |
||
688 | lcdWriteCGRAM_Array(lcdSpecialChrRs, 5);// LCD-Char mit Rahmensymbole vom Graph |
||
689 | chrxs = CHRRS; |
||
690 | } |
||
691 | } |
||
692 | return(range); |
||
693 | } |
||
694 | |||
695 | void Displ_PulseWidth(uint16_t val) |
||
696 | { int16_t PosProzent, range; |
||
697 | uint16_t Pos_us; |
||
698 | char me[3] = {"ms"}; |
||
699 | |||
700 | servoSetPositionRaw(servo_nr, val); |
||
701 | |||
702 | PosProzent = val - steps_pw[sIdxSteps].mid; |
||
703 | range = calc_range(PosProzent, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, steps_pw[sIdxSteps].mid); |
||
704 | draw_bar(PosProzent, range, 2); // auf 3. Display-Zeile |
||
705 | PosProzent = (int32_t)1000 * PosProzent / range; |
||
706 | lcdGotoXY(1, 1); |
||
707 | Pos_us = pw_us(val); // Zeit in µs bei x Servoschritte |
||
708 | if (Pos_us < 1000) { |
||
709 | me[0] = 'u'; // soll 'µ' => programmierbarer Zeichensatz zu klein |
||
710 | lcdPuts(" "); |
||
711 | Displ_Format_Int(Pos_us); |
||
712 | } |
||
713 | else { |
||
714 | lcdPuts(my_itoa(Pos_us, 5, 3, 3)); |
||
715 | } |
||
716 | lcdPuts(me); |
||
717 | lcdGotoXY(8, 1); |
||
718 | lcdPuts(my_itoa(PosProzent, 6, 1, 1)); |
||
719 | lcdPutc('%'); |
||
720 | } |
||
721 | |||
722 | /************************************************************************************/ |
||
723 | /* zeigt Pausenlänge der Links-, Mittel- und Rechtsposition auf Display an */ |
||
724 | /* Parameter: */ |
||
725 | /* uint16_t val : Zeit in 1ms * 100 */ |
||
726 | /* */ |
||
727 | /************************************************************************************/ |
||
728 | void Displ_Pause(uint16_t val) |
||
729 | { |
||
730 | if (val > 9) { |
||
731 | lcdPuts(my_itoa(val, 3, 1, 1)); |
||
732 | lcdPuts("s "); |
||
733 | } |
||
734 | else { |
||
735 | Displ_Format_Int(val * 100); |
||
736 | lcdPuts("ms"); |
||
737 | } |
||
738 | } |
||
739 | |||
740 | /************************************************************************************/ |
||
741 | /* zeigt aus oder Integerwert auf Display an */ |
||
742 | /* Parameter: */ |
||
743 | /* uint16_t val : val = 0 ==> aus, sont Integerwert */ |
||
744 | /* */ |
||
745 | /************************************************************************************/ |
||
746 | void Displ_Off_Format_Int(uint16_t val) |
||
747 | { |
||
748 | if (val == 0) |
||
749 | lcdPutStrMid(Msg(MSG_OFF), ZLE_VAL); |
||
750 | else { |
||
751 | lcdGotoXY(5,ZLE_VAL); |
||
752 | Displ_Format_Int(val); |
||
753 | lcdPutc(' '); |
||
754 | } |
||
755 | } |
||
756 | |||
757 | /************************************************************************************/ |
||
758 | /* zeigt aus oder Pausenzeit zwischen 2 Servoschritte auf Display an */ |
||
759 | /* Parameter: */ |
||
760 | /* uint16_t val : val = 0 ==> aus, sont Integerwert */ |
||
761 | /* */ |
||
762 | /************************************************************************************/ |
||
763 | void Displ_Pause_Step(uint16_t val) |
||
764 | { |
||
765 | Displ_Off_Format_Int(val); |
||
766 | if (val > 0) { |
||
767 | lcdGotoXY(8,ZLE_VAL); |
||
768 | lcdPuts("ms"); |
||
769 | } |
||
770 | } |
||
771 | /************************************************************************************/ |
||
772 | /* zeigt Baudrate für COM bei MKCockpit zur Auswahl auf Display an */ |
||
773 | /* Parameter: */ |
||
774 | /* uint16_t q :Index anzuzeigender Wert, */ |
||
775 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
776 | /* */ |
||
777 | /************************************************************************************/ |
||
778 | void Displ_Baudrate(uint16_t q) |
||
779 | { char str[7]; |
||
780 | |||
781 | ltoa(getBaud(q), str, 10); |
||
782 | lcdPutStrMid(str, ZLE_VAL); |
||
783 | } |
||
784 | |||
785 | /************************************************************************************/ |
||
786 | /* zeigt aktive Empfängerzeiten auf Display an */ |
||
787 | /* */ |
||
788 | /************************************************************************************/ |
||
789 | void Displ_RX_Time(void) |
||
790 | { |
||
791 | lcdGotoXY(6, 1); |
||
792 | Displ_TimeHMS(rxcount0); |
||
793 | lcdGotoXY(6, 2); |
||
794 | Displ_TimeHMS(rxcount1); |
||
795 | } |
||
796 | |||
797 | /************************************************************************************/ |
||
798 | /* zeigt eingestellte Akku-Kapazität des MK auf Display an */ |
||
799 | /* Parameter: */ |
||
800 | /* uint16_t val :Akku-Kapazität in 50mAh Schritte */ |
||
801 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
802 | /* */ |
||
803 | /************************************************************************************/ |
||
804 | void Displ_MK_Capacity(uint16_t val) |
||
805 | { |
||
806 | lcdPuts(my_itoa(val * 50, 4, 0, 0)); |
||
807 | lcdPuts("mAh"); |
||
808 | } |
||
809 | |||
810 | /************************************************************************************/ |
||
811 | /* zeigt Offset (Korrektur Ruhestrom) für Strom des MK auf Display an */ |
||
812 | /* Parameter: */ |
||
813 | /* uint16_t val :Korrekturfaktor */ |
||
814 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
815 | /* */ |
||
816 | /************************************************************************************/ |
||
817 | void Displ_I_Offset(uint16_t val) |
||
818 | { |
||
819 | lcdPuts(my_itoa((int8_t)val - MK_I_OFFSET_5,4,1,1)); |
||
820 | lcdPutc('A'); |
||
821 | } |
||
822 | |||
823 | |||
824 | /************************************************************************************/ |
||
825 | /* zeigt Korrekturfaktor für Strom und Arbeit des MK auf Display an */ |
||
826 | /* Parameter: */ |
||
827 | /* uint16_t val :Korrekturfaktor */ |
||
828 | /* uint16_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
829 | /* */ |
||
830 | /************************************************************************************/ |
||
831 | void Displ_Faktor_2Nk(uint16_t val) |
||
832 | { |
||
833 | lcdPuts(my_itoa(val,4,2,2)); |
||
834 | } |
||
835 | |||
836 | /************************************************************************************/ |
||
837 | /* zeigt den Marker in Hauptdarstellung auf selektierten RX an */ |
||
838 | /* d Diversity, << fester RX */ |
||
839 | /* Parameter: */ |
||
840 | /* uint8_t p :x-Position des Markers */ |
||
841 | /* uint8_t marker :Markerzeichen z.B.:'' oder 'd' oder 's' */ |
||
842 | /* */ |
||
843 | /************************************************************************************/ |
||
844 | void Displ_AV_Mark(uint8_t p, char marker) |
||
845 | { |
||
846 | if (p < 2) { |
||
847 | lcdGotoXY(15,2 - p); // da p immer neue Position 0 oder 1 |
||
848 | lcdPutc(' '); // bisherigen AVx-, Diversity-Marker löschen |
||
849 | lcdGotoXY(15,p + 1); // an neuer Positon |
||
850 | lcdPutc(marker); // übergebenes Markerzeichen darstellen |
||
851 | } |
||
852 | else { // falls beim Einschalten Diversity auf aktiv, keine Marker |
||
853 | lcdGotoXY(15,1); |
||
854 | lcdPutc(' '); |
||
855 | lcdGotoXY(15,2); |
||
856 | lcdPutc(' '); |
||
857 | } |
||
858 | } |
||
859 | |||
860 | /************************************************************************************/ |
||
861 | /* Hauptanzeige unter Berücksichtigung von VBat */ |
||
862 | /* */ |
||
863 | /************************************************************************************/ |
||
864 | void SetAndDispl_AV_Mark(void) |
||
865 | { char marker; |
||
866 | |||
867 | marker = av_source < DIVERSITY? MARKER_AV : MARKER_RSSI; // wird nur bei gesetzten Diversity überschrieben |
||
868 | Displ_AV_Mark(sw_avx, marker); |
||
869 | } |
||
870 | |||
871 | void Displ_Main_Disp(void) |
||
872 | { |
||
873 | pmenu[0] ='\0'; // bei Direktansprung z.B. von Menu_RSSI_min() erforderlich |
||
874 | lcdClear(); |
||
875 | if (!bat_low) { |
||
876 | lcdClear(); |
||
877 | Displ_Channels(channel); |
||
878 | lcdGotoXY(LCD_COLS - 1, 0); |
||
879 | lcdPuts("V\n1\n2"); |
||
880 | SetAndDispl_AV_Mark(); |
||
881 | Displ_VBat(); // muss zuletzt stehen |
||
882 | } |
||
883 | else { |
||
884 | lcdPutStrMid(Msg(MSG_ACCU_LOW), 0); |
||
885 | } |
||
886 | } |
||
887 | |||
888 | |||
889 | |||
890 | /**************************************************************/ |
||
891 | /* */ |
||
892 | /* Menüs */ |
||
893 | /* */ |
||
894 | /**************************************************************/ |
||
895 | |||
896 | /**************************/ |
||
897 | /* */ |
||
898 | /* Haupmenü */ |
||
899 | /* */ |
||
900 | /**************************/ |
||
901 | void Menu_Main(void) |
||
902 | { scr_menu_t scr_main_menu = {SCROLL_MAIN_MAX-4, MSG_RETURN, MSG_AV_SOURCE, MSG_RX_CHANNEL, MSG_RSSI_CALIBR, MSG_LANGUAGE, \ |
||
903 | MSG_SERVO_CALIBR, MSG_TEST_SERVO, MSG_LCD , MSG_BATTERY, MSG_TRACKING, 0, MSG_GPS_DISPLAY}; |
||
904 | |||
905 | switch(tracking) { |
||
906 | case TRACKING_RSSI: scr_main_menu[11] = MSG_TRACK_SERVO_HYTERESE; |
||
907 | scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen |
||
908 | break; |
||
909 | case TRACKING_GPS: scr_main_menu[11] = MSG_TRACK_TX_OSD_DATA; |
||
910 | scr_main_menu[0] += 2; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS MSG_GPS_DISPLAY |
||
911 | break; |
||
912 | case TRACKING_NMEA: scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS |
||
913 | case TRACKING_MKCOCKPIT: scr_main_menu[0]++; // SCROLL_MAIN_MAX erhöhen |
||
914 | scr_main_menu[11] = MSG_COM; |
||
915 | break; |
||
916 | } |
||
917 | |||
918 | strcpy(pmenu, "0"); |
||
919 | Scroll_Menu(scr_main_menu, m_pkt); // pmenu global |
||
920 | Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return |
||
921 | } |
||
922 | |||
923 | /**************************/ |
||
924 | /* */ |
||
925 | /* AV-Quelle */ |
||
926 | /* */ |
||
927 | /**************************/ |
||
928 | void Menu_AV_Source(void) |
||
929 | { uint16_t tmp_val; |
||
930 | |||
931 | Displ_Title(MSG_AV_SOURCE); |
||
932 | tmp_val = av_source; |
||
933 | if (Change_Value(&tmp_val, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, Displ_AV_Source)) { // pmenu global |
||
934 | cli(); |
||
935 | av_source = tmp_val; |
||
936 | eeprom_write_byte(&ep_av_source, av_source); |
||
937 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
938 | sw_avx = Set_AV_Source(av_source); |
||
939 | if (pmenu[0] == '\0') // sonst ist AV-Source marker bei long Enter im Hauptdisplay nicht aktuallisiert |
||
940 | SetAndDispl_AV_Mark(); |
||
941 | sei(); |
||
942 | } |
||
943 | Jump_Menu(pmenu); |
||
944 | } |
||
945 | |||
946 | /**************************/ |
||
947 | /* */ |
||
948 | /* Kanal */ |
||
949 | /* */ |
||
950 | /**************************/ |
||
951 | void Menu_RX_Channel(void) |
||
952 | { uint16_t tmp_val; |
||
953 | |||
954 | Displ_Title(MSG_RX_CHANNEL); |
||
955 | tmp_val = channel; |
||
956 | if (Change_Value(&tmp_val, CHANNEL_MIN, CHANNEL_MAX, 3, Displ_Channels) || (tmp_val != ch_stored)) { // pmenu global |
||
957 | channel = tmp_val; |
||
958 | ch_stored = tmp_val; |
||
959 | eeprom_write_byte(&ep_channel, channel); |
||
960 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
961 | Set_Channel(channel); |
||
962 | if (pmenu[0] == '\0') { // sonst ist channel im Hauptdisplay nicht aktuallisiert |
||
963 | lcdGotoXY(0,0); |
||
964 | Displ_Channels(channel); // da erst jetzt die Variable für main_display geändert ist! |
||
965 | } |
||
966 | } |
||
967 | Jump_Menu(pmenu); |
||
968 | } |
||
969 | |||
970 | /**************************/ |
||
971 | /* */ |
||
972 | /* RSSI */ |
||
973 | /* */ |
||
974 | /**************************/ |
||
975 | void Menu_RSSI_Calibr(void) |
||
976 | { uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7-2, MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MIN_ALL, MSG_RSSI_MAX, MSG_RSSI_INVERT, MSG_TX_IDENTIFY}; |
||
977 | |||
978 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
979 | Jump_Menu(pmenu); |
||
980 | } |
||
981 | |||
982 | void AdviceTX(uint8_t msg) |
||
983 | { char str[20]; |
||
984 | |||
985 | strcpy(str, Msg(MSG_TX)); |
||
986 | strcat(str, Msg(msg)); |
||
987 | lcdPutStrMid(str, 1); |
||
988 | lcdPutStrMid(Msg(MSG_CONTINUE), 2); |
||
989 | } |
||
990 | |||
991 | void Menu_RSSI_min(void) |
||
992 | { |
||
993 | Displ_Title(MSG_RSSI_MIN); |
||
994 | AdviceTX(MSG_TX_OFF); |
||
995 | if (Short_Enter()) { // pmenu global |
||
996 | RSSI_Min_Calibrate(0, bar_udbm); |
||
997 | Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist! |
||
998 | } |
||
999 | else |
||
1000 | Jump_Menu(pmenu); |
||
1001 | } |
||
1002 | |||
1003 | void Displ_RSSImin_allError(char *str_ch) |
||
1004 | { char str[LCD_COLS + 1]; |
||
1005 | |||
1006 | lcdClear(); |
||
1007 | strcpy(str, Msg(MSG_CALIB)); |
||
1008 | strcat(str, "-"); |
||
1009 | strcat(str, Msg(MSG_ERROR)); |
||
1010 | lcdPutStrMid(str,0); |
||
1011 | lcdPutStrMid(Msg(MSG_RX_CHANNEL),1); |
||
1012 | lcdPutStrMid(str_ch, 2); |
||
1013 | delay_ms100x(30); |
||
1014 | } |
||
1015 | |||
1016 | void Menu_RSSI_min_all(void) |
||
1017 | { char not_cal[15]; |
||
1018 | uint8_t f = 0; |
||
1019 | |||
1020 | Displ_Title(MSG_RSSI_MIN_ALL); |
||
1021 | AdviceTX(MSG_TX_OFF); |
||
1022 | if (Short_Enter()) { // pmenu global |
||
1023 | for ( uint8_t i = 1; i <= CHANNEL_MAX; i++) { |
||
1024 | Set_Channel(i); |
||
1025 | if (!RSSI_Min_Calibrate(i, bar_udbm)) { |
||
1026 | not_cal[f++] = i + 0x30; |
||
1027 | not_cal[f++] = ','; |
||
1028 | } |
||
1029 | } |
||
1030 | Set_Channel(channel); |
||
1031 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1032 | if (f > 0) { // Konnten einige Kanäle nicht auf RSSI-Min kalibiert werden? |
||
1033 | not_cal[--f] = '\0'; // letzes Komma durch Stringende ersetzen |
||
1034 | Displ_RSSImin_allError(not_cal); |
||
1035 | } |
||
1036 | Displ_Main_Disp(); |
||
1037 | } |
||
1038 | else |
||
1039 | Jump_Menu(pmenu); |
||
1040 | } |
||
1041 | |||
1042 | void Menu_RSSI_max(void) |
||
1043 | { |
||
1044 | Displ_Title(MSG_RSSI_MAX); |
||
1045 | AdviceTX(MSG_TX_ON); |
||
1046 | if (Short_Enter()) { // pmenu global |
||
1047 | RSSI_Max_Calibrate(bar_udbm); |
||
1048 | Displ_Main_Disp(); |
||
1049 | } |
||
1050 | else |
||
1051 | Jump_Menu(pmenu); |
||
1052 | } |
||
1053 | |||
1054 | |||
1055 | /* Wichtig bei invertierten RX-RSSI */ |
||
1056 | void Menu_RSSI_invert(void) |
||
1057 | { uint16_t tmp_val; |
||
1058 | |||
1059 | Displ_Title(MSG_RSSI_INVERT); |
||
1060 | tmp_val = rssi_inv; |
||
1061 | if (Change_Value(&tmp_val, 0, 1, 6, Displ_Off_On)) { // pmenu global; RSSI invertieren gibt es nur 0=off, 1=on |
||
1062 | rssi_inv = tmp_val; |
||
1063 | eeprom_write_byte(&ep_rssi_inv, rssi_inv); |
||
1064 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1065 | } |
||
1066 | Jump_Menu(pmenu); |
||
1067 | |||
1068 | } |
||
1069 | |||
1070 | |||
1071 | /* Schwellwert-Einstellungen für Erkennung Sender ein/aus */ |
||
1072 | void Displ_TX_status(uint16_t val) // für Min_Calibrate |
||
1073 | { |
||
1074 | Displ_Off_Format_Int(val); |
||
1075 | lcdGotoXY(strlen(Msg(MSG_TX_STATUS)), 2); |
||
1076 | if (ADC_Read_inv(RSSI0) + ADC_Read_inv(RSSI1) > val) |
||
1077 | lcdPuts(Msg(MSG_OFF)); |
||
1078 | else |
||
1079 | lcdPuts(Msg(MSG_ON)); |
||
1080 | } |
||
1081 | |||
1082 | void Menu_TX_identyfy(void) |
||
1083 | { uint8_t scr_sub_menu[SCROLL_MAX_6] = {SCROLL_MAX_4-2, MSG_RETURN, MSG_TX_STATUS_OFF, MSG_TX_STATUS_ON}; |
||
1084 | |||
1085 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1086 | Jump_Menu(pmenu); |
||
1087 | } |
||
1088 | |||
1089 | void Menu_TX_status_off(void) // für Min_Calibrate |
||
1090 | { uint16_t tmp_val; |
||
1091 | |||
1092 | Displ_Title(MSG_TX_STATUS_OFF); |
||
1093 | lcdGotoXY(0, 2); |
||
1094 | lcdPuts(Msg(MSG_TX_STATUS)); |
||
1095 | tmp_val = tx_value_off; |
||
1096 | if (Change_Value(&tmp_val, TX_VALUE_OFF_MIN, TX_VALUE_OFF_MAX, 5|(1<<V_REPEAT), Displ_TX_status)) { // pmenu global |
||
1097 | tx_value_off = tmp_val; |
||
1098 | eeprom_write_word(&ep_tx_value_off, tx_value_off); |
||
1099 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1100 | } |
||
1101 | Jump_Menu(pmenu); |
||
1102 | } |
||
1103 | |||
1104 | void Menu_TX_status_on(void) |
||
1105 | { uint16_t tmp_val; |
||
1106 | |||
1107 | Displ_Title(MSG_TX_STATUS_ON); |
||
1108 | lcdGotoXY(0, 2); |
||
1109 | lcdPuts(Msg(MSG_TX_STATUS)); |
||
1110 | tmp_val = tx_value_on; |
||
1111 | if (Change_Value(&tmp_val, TX_VALUE_ON_MIN, TX_VALUE_ON_MAX, 5|(1<<V_REPEAT), Displ_TX_status)) { // pmenu global |
||
1112 | tx_value_on = tmp_val; |
||
1113 | eeprom_write_word(&ep_tx_value_on, tx_value_on); |
||
1114 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1115 | } |
||
1116 | Jump_Menu(pmenu); |
||
1117 | } |
||
1118 | |||
1119 | /**************************/ |
||
1120 | /* */ |
||
1121 | /* Sprache */ |
||
1122 | /* */ |
||
1123 | /**************************/ |
||
1124 | void Displ_Language(uint16_t i) |
||
1125 | { uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH}; |
||
1126 | |||
1127 | lcdPutStrMid(Msg(lanuage_table[i]), ZLE_VAL); |
||
1128 | } |
||
1129 | |||
1130 | void Menu_Language(void) |
||
1131 | { uint16_t tmp_val; |
||
1132 | |||
1133 | Displ_Title(MSG_LANGUAGE); |
||
1134 | tmp_val = language; |
||
1135 | language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE |
||
1136 | Change_Value(&tmp_val, GERMAN, LAST_LANG, 3, Displ_Language); // pmenu global |
||
1137 | if (tmp_val != language) { |
||
1138 | language = tmp_val; |
||
1139 | eeprom_write_byte(&ep_language, language); |
||
1140 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1141 | } |
||
1142 | Jump_Menu(pmenu); |
||
1143 | } |
||
1144 | |||
1145 | /**************************/ |
||
1146 | /* */ |
||
1147 | /* Servo-Einstellungen */ |
||
1148 | /* */ |
||
1149 | /**************************/ |
||
1150 | void Menu_Servo_Calibr(void) |
||
1151 | { uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2}; |
||
1152 | |||
1153 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1154 | Jump_Menu(pmenu); |
||
1155 | } |
||
1156 | |||
1157 | void NoTracking_ServosOff(void) |
||
1158 | { |
||
1159 | if (tracking == TRACKING_MIN) { |
||
1160 | delay_ms100x(4); // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet |
||
1161 | servoOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet |
||
1162 | } |
||
1163 | } |
||
1164 | |||
1165 | void Servo_NewValues(uint8_t idx_presc) |
||
1166 | { |
||
1167 | for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) { |
||
1168 | if (idx_presc == STEPS_255) { // Werte umrechnen für Prescaler = 256 |
||
1169 | servo[i].min /= 4; |
||
1170 | servo[i].max /= 4; |
||
1171 | servo[i].mid /= 4; |
||
1172 | } |
||
1173 | else { // Werte umrechnen für Prescaler = 64 |
||
1174 | servo[i].min *= 4; |
||
1175 | servo[i].max *= 4; |
||
1176 | servo[i].mid = (servo[i].mid + 1) * 4 - 1; |
||
1177 | } |
||
1178 | servoSet_min(i, servo[i].min); |
||
1179 | servoSet_max(i, servo[i].max); |
||
1180 | servoSet_mid(i, servo[i].mid); |
||
1181 | eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t)); |
||
1182 | } |
||
1183 | // Vorberechnung von ServoChannels[channel].duty |
||
1184 | servoSetDefaultPos(); // Ausgangsstellung beider Servos |
||
1185 | } |
||
1186 | |||
1187 | void Menu_Servo_Steps(void) |
||
1188 | { uint16_t tmp_val; |
||
1189 | |||
1190 | Displ_Title(MSG_SERVO_STEPS); |
||
1191 | lcdGotoXY(8, ZLE_VAL); |
||
1192 | tmp_val = sIdxSteps; |
||
1193 | if (Change_Value(&tmp_val, STEPS_255, STEPS_1023, 5, Displ_Servo_Steps)) { // pmenu global |
||
1194 | cli(); |
||
1195 | sIdxSteps = tmp_val; |
||
1196 | eeprom_write_byte(&ep_sIdxSteps, sIdxSteps); |
||
1197 | Servo_NewValues(sIdxSteps); // hier ist der neue Index anzugeben! |
||
1198 | servoInit(SERVO_PERIODE); |
||
1199 | sei(); |
||
1200 | NoTracking_ServosOff(); |
||
1201 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1202 | } |
||
1203 | Jump_Menu(pmenu); |
||
1204 | } |
||
1205 | |||
1206 | void Menu_Servo1(void) |
||
1207 | { uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE}; |
||
1208 | |||
1209 | Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global |
||
1210 | servo_nr = 0; |
||
1211 | Jump_Menu(pmenu); |
||
1212 | } |
||
1213 | |||
1214 | void Menu_Servo2(void) |
||
1215 | { uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE}; |
||
1216 | |||
1217 | Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global |
||
1218 | servo_nr = 1; |
||
1219 | Jump_Menu(pmenu); |
||
1220 | } |
||
1221 | |||
1222 | uint8_t Servo_tmp_on(uint8_t servo_period) |
||
1223 | { uint8_t tmp_tracking = tracking; |
||
1224 | |||
1225 | tracking = 0; // Servopositionierung durch tracking abschalten |
||
1226 | if (tracking == TRACKING_MIN) servoInit(servo_period); // falls aus, Servos einschalten |
||
1227 | lcdGotoXY(0, 0); // lcd Cursor vorpositionieren |
||
1228 | return(tmp_tracking); |
||
1229 | } |
||
1230 | |||
1231 | void Servo_tmp_Original(uint8_t track) |
||
1232 | { |
||
1233 | servoSetDefaultPos(); |
||
1234 | tracking = track; // ursprünglicher Wert Tracking aus, RSSI oder GPS |
||
1235 | NoTracking_ServosOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet |
||
1236 | Jump_Menu(pmenu); |
||
1237 | } |
||
1238 | |||
1239 | void Menu_Servo_rev(void) |
||
1240 | { uint16_t tmp_val; |
||
1241 | uint8_t tmp_tracking; |
||
1242 | |||
1243 | tmp_tracking = Servo_tmp_on(SERVO_PERIODE); |
||
1244 | tmp_val = servo[servo_nr].rev; |
||
1245 | if (Change_Value(&tmp_val , 0, 1, 6, Displ_Off_On)) { // pmenu global; reverse gibt es nur 0=off, 1=on |
||
1246 | servo[servo_nr].rev = tmp_val ; |
||
1247 | servoSet_rev(servo_nr, tmp_val ); |
||
1248 | eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t)); |
||
1249 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1250 | } |
||
1251 | Servo_tmp_Original(tmp_tracking); |
||
1252 | } |
||
1253 | |||
1254 | void Menu_Servo1_rev(void) |
||
1255 | { |
||
1256 | Displ_Title(MSG_SERVO1_REVERSE); |
||
1257 | Menu_Servo_rev(); |
||
1258 | } |
||
1259 | |||
1260 | void Menu_Servo2_rev(void) |
||
1261 | { |
||
1262 | Displ_Title(MSG_SERVO2_REVERSE); |
||
1263 | Menu_Servo_rev(); |
||
1264 | } |
||
1265 | |||
1266 | void Menu_Servo_left(void) |
||
1267 | { uint16_t tmp_val; |
||
1268 | uint8_t tmp_tracking; |
||
1269 | |||
1270 | tmp_tracking = Servo_tmp_on(SERVO_PERIODE); |
||
1271 | servoSetPosition(servo_nr, ServoSteps()); // Linkssanschlag um Kalibrierung am Servo zu sehen |
||
1272 | tmp_val = servo[servo_nr].max; |
||
1273 | if (Change_Value(&tmp_val, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6|(1<<V_REPEAT), Displ_Servo_Max)) { // pmenu global |
||
1274 | servo[servo_nr].max = tmp_val; |
||
1275 | eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t)); |
||
1276 | servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben |
||
1277 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1278 | } |
||
1279 | Servo_tmp_Original(tmp_tracking); |
||
1280 | } |
||
1281 | |||
1282 | void Menu_Servo1_left(void) |
||
1283 | { |
||
1284 | Displ_Title(MSG_CALIB1_LEFT); |
||
1285 | Menu_Servo_left(); |
||
1286 | } |
||
1287 | |||
1288 | void Menu_Servo2_left(void) |
||
1289 | { |
||
1290 | Displ_Title(MSG_CALIB2_LEFT); |
||
1291 | Menu_Servo_left(); |
||
1292 | } |
||
1293 | |||
1294 | void Menu_Servo_right(void) |
||
1295 | { uint16_t tmp_val; |
||
1296 | uint8_t tmp_tracking; |
||
1297 | |||
1298 | tmp_tracking = Servo_tmp_on(SERVO_PERIODE); |
||
1299 | servoSetPosition(servo_nr, 0); // Rechtsanschlag um Kalibrierung am Servo zu sehen |
||
1300 | tmp_val = servo[servo_nr].min; |
||
1301 | if (Change_Value(&tmp_val, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6|(1<<V_REPEAT), Displ_Servo_Min)) { // pmenu global |
||
1302 | servo[servo_nr].min = tmp_val; |
||
1303 | eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t)); |
||
1304 | servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben |
||
1305 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1306 | } |
||
1307 | Servo_tmp_Original(tmp_tracking); |
||
1308 | } |
||
1309 | |||
1310 | void Menu_Servo1_right(void) |
||
1311 | { |
||
1312 | Displ_Title(MSG_CALIB1_RIGHT); |
||
1313 | Menu_Servo_right(); |
||
1314 | } |
||
1315 | |||
1316 | void Menu_Servo2_right(void) |
||
1317 | { |
||
1318 | Displ_Title(MSG_CALIB2_RIGHT); |
||
1319 | Menu_Servo_right(); |
||
1320 | } |
||
1321 | |||
1322 | void Menu_Servo_middle(void) |
||
1323 | { uint16_t tmp_val; |
||
1324 | uint8_t tmp_tracking; |
||
1325 | |||
1326 | tmp_tracking = Servo_tmp_on(SERVO_PERIODE); |
||
1327 | servoSetPosition(servo_nr, ServoSteps()/2); // Mittelposition um Kalibrierung am Servo zu sehen |
||
1328 | tmp_val = servo[servo_nr].mid; |
||
1329 | if (Change_Value(&tmp_val, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 5|(1<<V_REPEAT), Displ_Servo_Mid)) { // pmenu global |
||
1330 | servo[servo_nr].mid = tmp_val; |
||
1331 | eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t)); |
||
1332 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1333 | } |
||
1334 | Servo_tmp_Original(tmp_tracking); |
||
1335 | } |
||
1336 | |||
1337 | void Menu_Servo1_middle(void) |
||
1338 | { |
||
1339 | Displ_Title(MSG_CALIB1_MIDDLE); |
||
1340 | Menu_Servo_middle(); |
||
1341 | } |
||
1342 | |||
1343 | void Menu_Servo2_middle(void) |
||
1344 | { |
||
1345 | Displ_Title(MSG_CALIB2_MIDDLE); |
||
1346 | Menu_Servo_middle(); |
||
1347 | } |
||
1348 | |||
1349 | /**************************/ |
||
1350 | /* */ |
||
1351 | /* Servos-Tests */ |
||
1352 | /* */ |
||
1353 | /**************************/ |
||
1354 | void Menu_Servo_Test(void) |
||
1355 | { uint8_t scr_sub_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_PULSE_WIDTH, MSG_CONTINOUS, MSG_SERVO, MSG_FRAME}; |
||
1356 | |||
1357 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1358 | servo_nr = eeprom_read_byte(&ep_servo_nr); |
||
1359 | Jump_Menu(pmenu); |
||
1360 | } |
||
1361 | |||
1362 | void Menu_Test_Frame(void) |
||
1363 | { uint16_t tmp_val; |
||
1364 | |||
1365 | Displ_Title(MSG_FRAME); |
||
1366 | lcdGotoXY(8, ZLE_VAL); |
||
1367 | lcdPuts("ms"); |
||
1368 | tmp_val = servo_frame; |
||
1369 | if (Change_Value(&tmp_val, SERVO_PERIODE_MIN, SERVO_PERIODE_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global |
||
1370 | servo_frame = tmp_val; |
||
1371 | eeprom_write_byte(&ep_servo_frame, servo_frame); |
||
1372 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1373 | } |
||
1374 | Jump_Menu(pmenu); |
||
1375 | } |
||
1376 | |||
1377 | void Menu_Test_ServoNr(void) |
||
1378 | { uint16_t tmp_val; |
||
1379 | |||
1380 | Displ_Title(MSG_SERVO); |
||
1381 | tmp_val = servo_nr; |
||
1382 | if (Change_Value(&tmp_val, 0, 1, 4, Displ_ServoNr)) { // pmenu global; es gibt nur 0=Servo1, 1=Servo2 |
||
1383 | servo_nr = tmp_val; |
||
1384 | eeprom_write_byte(&ep_servo_nr, servo_nr); |
||
1385 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1386 | } |
||
1387 | Jump_Menu(pmenu); |
||
1388 | } |
||
1389 | |||
1390 | // Dieser Test im raw-Modus ohne Anschlagkalibrierung (normiert) z.B.: für Modelleinstellungen ohne Empfänger |
||
1391 | void Menu_Test_PulseWidth(void) |
||
1392 | { uint8_t tmp_tracking; |
||
1393 | uint16_t tmp_val; |
||
1394 | |||
1395 | tmp_tracking = Servo_tmp_on(servo_frame); |
||
1396 | lcdWriteCGRAM_Array(lcdSpecialChrLs, 8); // LCD-Char mit Rahmensymbole vom Graph |
||
1397 | chrxs = CHRLS; // verhindert wiederholtes Lesen bereits geladener LCD-Char |
||
1398 | Displ_Title(MSG_PULSE_WIDTH); |
||
1399 | tmp_val = steps_pw[sIdxSteps].mid; |
||
1400 | Change_Value(&tmp_val, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, 4|(1<<V_REPEAT), Displ_PulseWidth); // pmenu global |
||
1401 | lcdWriteCGRAM_Array(lcdSpecialChr, 7); // LCD-Char für Bargraph zurückschreiben |
||
1402 | cli(); |
||
1403 | servoInit(SERVO_PERIODE); |
||
1404 | sei(); |
||
1405 | Servo_tmp_Original(tmp_tracking); |
||
1406 | } |
||
1407 | |||
1408 | void Menu_Test_Continuous(void) |
||
1409 | { uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_START, MSG_SINGLE_STEP, MSG_REPEAT, MSG_PAUSE, MSG_PAUSE_STEP}; |
||
1410 | |||
1411 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1412 | Jump_Menu(pmenu); |
||
1413 | } |
||
1414 | |||
1415 | void Menu_Test_SingleStep(void) |
||
1416 | {uint16_t tmp_val; |
||
1417 | |||
1418 | Displ_Title(MSG_SINGLE_STEP); |
||
1419 | tmp_val = single_step; |
||
1420 | if (Change_Value(&tmp_val, SINGLE_STEP_MIN, SINGLE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Off_Format_Int)) { // pmenu global |
||
1421 | single_step = tmp_val; |
||
1422 | eeprom_write_byte(&ep_single_step, single_step); |
||
1423 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1424 | } |
||
1425 | Jump_Menu(pmenu); |
||
1426 | } |
||
1427 | |||
1428 | void Menu_Test_Repeat(void) |
||
1429 | {uint16_t tmp_val; |
||
1430 | |||
1431 | Displ_Title(MSG_REPEAT); |
||
1432 | tmp_val = repeat; |
||
1433 | if (Change_Value(&tmp_val, REPEAT_MIN, REPEAT_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global |
||
1434 | repeat = tmp_val; |
||
1435 | eeprom_write_byte(&ep_repeat, repeat); |
||
1436 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1437 | } |
||
1438 | Jump_Menu(pmenu); |
||
1439 | } |
||
1440 | |||
1441 | void Menu_Test_Pause(void) |
||
1442 | {uint16_t tmp_val; |
||
1443 | |||
1444 | Displ_Title(MSG_PAUSE); |
||
1445 | tmp_val = pause; |
||
1446 | if (Change_Value(&tmp_val, PAUSE_MIN, PAUSE_MAX, 5|(1<<V_REPEAT), Displ_Pause)) { // pmenu global |
||
1447 | pause = tmp_val; |
||
1448 | eeprom_write_byte(&ep_pause, pause); |
||
1449 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1450 | } |
||
1451 | Jump_Menu(pmenu); |
||
1452 | } |
||
1453 | |||
1454 | void Menu_Test_Pause_Step(void) |
||
1455 | {uint16_t tmp_val; |
||
1456 | |||
1457 | Displ_Title(MSG_PAUSE_STEP); |
||
1458 | tmp_val = pause_step; |
||
1459 | if (Change_Value(&tmp_val, PAUSE_STEP_MIN, PAUSE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Pause_Step)) { // pmenu global |
||
1460 | pause_step = tmp_val; |
||
1461 | eeprom_write_byte(&ep_pause_step, pause_step); |
||
1462 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1463 | } |
||
1464 | Jump_Menu(pmenu); |
||
1465 | } |
||
1466 | |||
1467 | int8_t calc_dir(uint8_t idx, int16_t *Position) |
||
1468 | { uint8_t nextIdx; |
||
1469 | int8_t nextDir = 1; |
||
1470 | |||
1471 | nextIdx = idx; |
||
1472 | if ((idx + 1) < POSIDX_MAX) |
||
1473 | nextIdx++; |
||
1474 | else |
||
1475 | nextIdx = 0; |
||
1476 | if (Position[PosIdx[idx]] > Position[PosIdx[nextIdx]]) nextDir = -1; |
||
1477 | return(nextDir); |
||
1478 | } |
||
1479 | |||
1480 | void Displ_LoopCounter(uint8_t val) |
||
1481 | { |
||
1482 | lcdGotoXY(2,2); |
||
1483 | lcdPuts(Msg(MSG_COUNTER)); |
||
1484 | lcdPuts(my_itoa(val, 4, 0, 0)); |
||
1485 | } |
||
1486 | |||
1487 | // Test über Scalierung der Servos mit Anschlagkalibrierung |
||
1488 | void Menu_Test_Start(void) |
||
1489 | { uint8_t tmp_tracking, idx, rep; |
||
1490 | int8_t dir; |
||
1491 | int16_t sPos; |
||
1492 | int16_t Position[3]; |
||
1493 | int16_t range; |
||
1494 | |||
1495 | tmp_tracking = Servo_tmp_on(servo_frame); |
||
1496 | lcdWriteCGRAM_Array(lcdSpecialChrLs, 8); // LCD-Char mit Rahmensymbole vom Graph |
||
1497 | chrxs = CHRLS; // Flag, welche Kästchensymbole geladen |
||
1498 | Displ_Title(MSG_CONTINOUS); |
||
1499 | Displ_LoopCounter(repeat); |
||
1500 | Position[0] = 0; // skalierte Servoposition aber unterschiedliche Schrittanzahl möglich |
||
1501 | Position[1] = ServoSteps()/2; |
||
1502 | Position[2] = ServoSteps(); |
||
1503 | // init Einzelschritt |
||
1504 | idx = 0; |
||
1505 | dir = calc_dir(idx, Position); |
||
1506 | sPos = Position[PosIdx[idx]]; |
||
1507 | idx++; |
||
1508 | rep = repeat; |
||
1509 | |||
1510 | // Test bis Ende der Wiederholungen oder irgendein Enter |
||
1511 | while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && (rep > 0)) { |
||
1512 | range = calc_range(sPos - Position[1], Position[0], Position[2], Position[1]); |
||
1513 | draw_bar(sPos - Position[1], range, 1); // eingerahmter Balkengraph auf 2. Display-Zeile |
||
1514 | servoSetPosition(servo_nr, sPos); |
||
1515 | |||
1516 | if ( sPos != Position[PosIdx[idx]]) { // Links-, Mittel- oder Rechtsposotion erreicht? |
||
1517 | sPos += (single_step * dir); // variable Schrittweite subtrahieren oder addieren |
||
1518 | if (((dir < 0) && (sPos < Position[PosIdx[idx]])) || ((dir > 0) && (sPos > Position[PosIdx[idx]])) || !(single_step)) |
||
1519 | sPos = Position[PosIdx[idx]]; // Überlauf bei variabler Schrittweite berücksichtigen oder Einzelschritt |
||
1520 | _delay_ms(servo_frame + 1 + pause_step);// Bei Schrittweite um 1 würden welche übersprungen, zusätzlich pro Servoschritt verzögert |
||
1521 | } |
||
1522 | else { |
||
1523 | dir = calc_dir(idx, Position); // Richtungsänderung |
||
1524 | if (idx < (POSIDX_MAX - 1)) { |
||
1525 | if (idx == 0) { |
||
1526 | rep--; // bei jeden vollen Durchlauf Wiederholzähler verringern |
||
1527 | Displ_LoopCounter(rep); |
||
1528 | } |
||
1529 | idx++; // Index für nächsten Positionswert ==> Array PosIdx[] bestimmt Anschlagreihenfolge |
||
1530 | } |
||
1531 | else |
||
1532 | idx = 0; |
||
1533 | delay_ms100x(pause); // variable Pause bei Links-, Mittel- und Rechtsposotion Mindestzeit 400ms (Servolauf) |
||
1534 | } |
||
1535 | } |
||
1536 | |||
1537 | lcdClear(); |
||
1538 | if (pmenu[0] == '\0') |
||
1539 | Displ_Main_Disp(); |
||
1540 | else |
||
1541 | return_m_pkt(strlen(pmenu)); // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp() |
||
1542 | lcdWriteCGRAM_Array(lcdSpecialChr, 7); // LCD-Char für Bargraph zurückschreiben |
||
1543 | cli(); |
||
1544 | servoInit(SERVO_PERIODE); |
||
1545 | sei(); |
||
1546 | Servo_tmp_Original(tmp_tracking); |
||
1547 | } |
||
1548 | |||
1549 | |||
1550 | /**************************/ |
||
1551 | /* */ |
||
1552 | /* LCD */ |
||
1553 | /* */ |
||
1554 | /**************************/ |
||
1555 | void Menu_lcd(void) |
||
1556 | { uint8_t scr_sub_menu[SCROLL_MAX_4] = {SCROLL_MAX_4 - 2, MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT}; |
||
1557 | |||
1558 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1559 | Jump_Menu(pmenu); |
||
1560 | } |
||
1561 | |||
1562 | void Menu_lcd_Contrast(void) |
||
1563 | { uint16_t tmp_val; |
||
1564 | |||
1565 | Displ_Title(MSG_LCD); |
||
1566 | lcdGotoXY(2, ZLE_VAL); |
||
1567 | lcdPuts(Msg(MSG_CONTRAST)); |
||
1568 | lcdPuts(": "); |
||
1569 | tmp_val = contrast; |
||
1570 | if (Change_Value(&tmp_val, CONTRAST_MIN, CONTRAST_MAX, 11, Displ_Set_Contrast)) { // pmenu global |
||
1571 | contrast = tmp_val; |
||
1572 | eeprom_write_byte(&ep_contrast, contrast); |
||
1573 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1574 | } |
||
1575 | Jump_Menu(pmenu); |
||
1576 | } |
||
1577 | |||
1578 | void Menu_lcd_Backgr_Light(void) |
||
1579 | { uint16_t tmp_val; |
||
1580 | |||
1581 | Displ_Title(MSG_BACKGR_LIGHT); |
||
1582 | lcdGotoXY(0, ZLE_VAL); |
||
1583 | lcdPuts(Msg(MSG_LIGHT)); |
||
1584 | tmp_val = light_time; |
||
1585 | if (Change_Value(&tmp_val, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6|(1<<V_REPEAT), Displ_Backgr_Light)) { // pmenu global |
||
1586 | light_time = tmp_val; |
||
1587 | eeprom_write_byte(&ep_light_time, light_time); |
||
1588 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1589 | if (light_time == BACKGR_LIGHT_MIN) lcdSet_BackgrLight_Off(); // Hintergrundbeleuchtung immer aus ==> sofort schalten |
||
1590 | } |
||
1591 | Jump_Menu(pmenu); |
||
1592 | } |
||
1593 | |||
1594 | /**************************/ |
||
1595 | /* */ |
||
1596 | /* Batterie */ |
||
1597 | /* */ |
||
1598 | /**************************/ |
||
1599 | void Menu_Battery(void) |
||
1600 | { uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET, MSG_MK_BATTERY}; |
||
1601 | |||
1602 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1603 | Jump_Menu(pmenu); |
||
1604 | } |
||
1605 | |||
1606 | /*****************/ |
||
1607 | /* NG-Video Akku */ |
||
1608 | /*****************/ |
||
1609 | void Menu_Low_U_Setup(void) |
||
1610 | { uint16_t tmp_val; |
||
1611 | |||
1612 | Displ_Title(MSG_U_MIN); |
||
1613 | tmp_val = u_min; |
||
1614 | if (Change_Value(&tmp_val, U_MIN_MIN, U_MIN_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global |
||
1615 | u_min = tmp_val; |
||
1616 | eeprom_write_word(&ep_u_min, u_min); |
||
1617 | hyst_u_min = u_min; |
||
1618 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1619 | } |
||
1620 | Jump_Menu(pmenu); |
||
1621 | } |
||
1622 | |||
1623 | void Menu_U_Offset(void) |
||
1624 | { uint16_t tmp_val; |
||
1625 | |||
1626 | Displ_Title(MSG_U_OFFSET); |
||
1627 | tmp_val = u_offset; |
||
1628 | if (Change_Value(&tmp_val, U_OFFSET_MIN, U_OFFSET_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global |
||
1629 | u_offset = tmp_val; |
||
1630 | eeprom_write_byte(&ep_u_offset, u_offset); |
||
1631 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1632 | } |
||
1633 | Jump_Menu(pmenu); |
||
1634 | } |
||
1635 | |||
1636 | /******************/ |
||
1637 | /* MK-Akku(s) */ |
||
1638 | /******************/ |
||
1639 | void Menu_MK_Battery(void) |
||
1640 | { uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_MK_BAT_NR, MSG_MK_BAT_CAPACITY, MSG_MK_I_OFFSET, MSG_MK_I_FAKTOR, MSG_MK_W_FAKTOR}; |
||
1641 | |||
1642 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1643 | Jump_Menu(pmenu); |
||
1644 | } |
||
1645 | |||
1646 | // für Nutzung verschiedener Akku's unterschiedlicher Kapazität |
||
1647 | // könnte auch für Statistik Ladezyklen erweitert werden aber sinnlos bei Verwendung gleicher Akku's in anderen Modellen |
||
1648 | void Menu_MK_BatteryChangeNr(void) |
||
1649 | { uint16_t tmp_val; |
||
1650 | |||
1651 | Displ_Title(MSG_MK_BAT_NR); |
||
1652 | tmp_val = mk_akku_nr+1; |
||
1653 | if (Change_Value(&tmp_val, AKKU_NR_MIN+1, AKKU_NR_MAX+1, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global |
||
1654 | mk_akku_nr = --tmp_val; |
||
1655 | eeprom_write_byte(&ep_mk_akku_nr, mk_akku_nr); |
||
1656 | eeprom_read_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t)); |
||
1657 | mk_dUsedCapacity = mk_lipo.UsedCapacity; |
||
1658 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1659 | } |
||
1660 | } |
||
1661 | |||
1662 | void Menu_MK_BatteryNr(void) |
||
1663 | { |
||
1664 | Menu_MK_BatteryChangeNr(); |
||
1665 | Jump_Menu(pmenu); |
||
1666 | } |
||
1667 | |||
1668 | void Menu_MK_BatteryCapacity(void) |
||
1669 | { uint16_t tmp_val; |
||
1670 | |||
1671 | Displ_Title(MSG_MK_BAT_CAPACITY); |
||
1672 | tmp_val = mk_lipo.Capacity/50; |
||
1673 | if (Change_Value(&tmp_val, AKKU_CAPACITY_MIN/50, AKKU_CAPACITY_MAX/50, 5|(1<<V_REPEAT), Displ_MK_Capacity)) { // pmenu global |
||
1674 | mk_lipo.Capacity = tmp_val * 50; |
||
1675 | eeprom_write_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t)); |
||
1676 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1677 | } |
||
1678 | Jump_Menu(pmenu); |
||
1679 | } |
||
1680 | |||
1681 | void Menu_MK_I_Offset(void) |
||
1682 | { uint16_t tmp_val; |
||
1683 | |||
1684 | Displ_Title(MSG_MK_I_OFFSET); |
||
1685 | tmp_val = mk_i_offset; |
||
1686 | if (Change_Value(&tmp_val, MK_I_OFFSET_MIN, MK_I_OFFSET_MAX, 5|(1<<V_REPEAT), Displ_I_Offset)) { // pmenu global |
||
1687 | mk_i_offset = tmp_val; |
||
1688 | eeprom_write_byte(&ep_mk_i_offset, mk_i_offset); |
||
1689 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1690 | } |
||
1691 | Jump_Menu(pmenu); |
||
1692 | } |
||
1693 | |||
1694 | void Menu_MK_I_Faktor(void) |
||
1695 | { uint16_t tmp_val; |
||
1696 | |||
1697 | Displ_Title(MSG_MK_I_FAKTOR); |
||
1698 | tmp_val = mk_i_faktor; |
||
1699 | if (Change_Value(&tmp_val, MK_I_FAKTOR_MIN, MK_I_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global |
||
1700 | mk_i_faktor = tmp_val; |
||
1701 | eeprom_write_byte(&ep_mk_i_faktor, mk_i_faktor); |
||
1702 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1703 | } |
||
1704 | Jump_Menu(pmenu); |
||
1705 | } |
||
1706 | |||
1707 | void Menu_MK_W_Faktor(void) |
||
1708 | { uint16_t tmp_val; |
||
1709 | |||
1710 | Displ_Title(MSG_MK_W_FAKTOR); |
||
1711 | tmp_val = mk_w_faktor; |
||
1712 | if (Change_Value(&tmp_val, MK_W_FAKTOR_MIN, MK_W_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global |
||
1713 | mk_w_faktor = tmp_val; |
||
1714 | eeprom_write_byte(&ep_mk_w_faktor, mk_w_faktor); |
||
1715 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1716 | } |
||
1717 | Jump_Menu(pmenu); |
||
1718 | } |
||
1719 | |||
1720 | |||
1721 | /**************************/ |
||
1722 | /* */ |
||
1723 | /* Antennennachführung */ |
||
1724 | /* */ |
||
1725 | /**************************/ |
||
1726 | void Menu_Tracking_Ant(void) |
||
1727 | { uint16_t tmp_val; |
||
1728 | |||
1729 | Displ_Title(MSG_TRACKING); |
||
1730 | tmp_val = tracking; |
||
1731 | if (Change_Value(&tmp_val, TRACKING_MIN, TRACKING_MAX, 3, Displ_sel_Tracking)) { // pmenu global |
||
1732 | cli(); |
||
1733 | tracking = tmp_val; |
||
1734 | sei(); |
||
1735 | eeprom_write_byte(&ep_tracking, tracking); |
||
1736 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1737 | USART_RX_Mode(tracking); // Unterschied Datenempfang GPS/MKCockpit/NMEA |
||
1738 | coldstart = 1; |
||
1739 | rxcount0 = 0; |
||
1740 | rxcount1 = 0; |
||
1741 | servoSetDefaultPos(); // Ausgangsstellung beider Servos |
||
1742 | if (tracking > TRACKING_MIN) |
||
1743 | servoInit(SERVO_PERIODE); |
||
1744 | NoTracking_ServosOff(); |
||
1745 | USART_Init_Baudrate(); |
||
1746 | } |
||
1747 | Jump_Menu(pmenu); |
||
1748 | } |
||
1749 | |||
1750 | /**************************/ |
||
1751 | /* Optionen */ |
||
1752 | /* Antennennachführung */ |
||
1753 | /* */ |
||
1754 | /**************************/ |
||
1755 | void Menu_Tracking_HYST(void) |
||
1756 | { uint16_t tmp_val; |
||
1757 | |||
1758 | Displ_Title(MSG_HYSTERESE); |
||
1759 | tmp_val = track_hyst; |
||
1760 | if (Change_Value(&tmp_val, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu gloabal |
||
1761 | track_hyst = tmp_val; |
||
1762 | eeprom_write_byte(&ep_track_hyst, track_hyst); |
||
1763 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1764 | } |
||
1765 | Jump_Menu(pmenu); |
||
1766 | } |
||
1767 | |||
1768 | void Menu_Tracking_TXOSD(void) |
||
1769 | { uint16_t tmp_val; |
||
1770 | |||
1771 | Displ_Title(MSG_TRACK_TX_OSD_DATA); |
||
1772 | tmp_val = track_tx; |
||
1773 | if (Change_Value(&tmp_val, 0, 1, 3, Displ_track_TX)) { // pmenu global; Senden gibt es nur 0=off, 1=on |
||
1774 | track_tx = tmp_val; |
||
1775 | eeprom_write_byte(&ep_track_tx, track_tx); |
||
1776 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1777 | } |
||
1778 | Jump_Menu(pmenu); |
||
1779 | } |
||
1780 | |||
1781 | void Menu_Baudrate(void) |
||
1782 | { uint16_t tmp_val; |
||
1783 | |||
1784 | Displ_Title(MSG_BAUDRATE); |
||
1785 | tmp_val = baudrate; |
||
1786 | if (Change_Value(&tmp_val, BAUDRATE_MIN, BAUDRATE_MAX, 3, Displ_Baudrate)) { // pmenu global |
||
1787 | baudrate = tmp_val; |
||
1788 | eeprom_write_byte(&ep_baudrate, baudrate); |
||
1789 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1790 | USART_Init(getBaud(baudrate)); |
||
1791 | } |
||
1792 | Jump_Menu(pmenu); |
||
1793 | } |
||
1794 | |||
1795 | void Menu_Tracking_Option(void) |
||
1796 | { // im Menü ist dies der gleiche Gliederungspunkt aber mit geänderter Auswahl |
||
1797 | switch(tracking) { |
||
1798 | case TRACKING_RSSI: Menu_Tracking_HYST(); |
||
1799 | break; |
||
1800 | case TRACKING_GPS: Menu_Tracking_TXOSD(); |
||
1801 | break; |
||
1802 | case TRACKING_MKCOCKPIT: |
||
1803 | case TRACKING_NMEA: Menu_Baudrate(); |
||
1804 | break; |
||
1805 | } |
||
1806 | } |
||
1807 | |||
1808 | /**************************/ |
||
1809 | /* */ |
||
1810 | /* Anzeige GPS */ |
||
1811 | /* */ |
||
1812 | /**************************/ |
||
1813 | void Menu_GPS_Display(void) |
||
1814 | { uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME, \ |
||
1815 | MSG_GPS_MISC, MSG_RX_TIME}; |
||
1816 | |||
1817 | if (tracking == TRACKING_NMEA) { // Manipulierung der Menüanzeige/-ausführung |
||
1818 | scr_sub_menu[0] = SCROLL_MAX_7 - 3; // Only show MISC in GPS mode, not NMEA |
||
1819 | scr_sub_menu[5] = MSG_RX_TIME; |
||
1820 | } |
||
1821 | else |
||
1822 | if (tracking != TRACKING_GPS) scr_sub_menu[0] = SCROLL_MAX_7 - 4; |
||
1823 | Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global |
||
1824 | Jump_Menu(pmenu); |
||
1825 | } |
||
1826 | |||
1827 | void Menu_GPS_Display_FLAG(void) // ist Flag in tracking.c Tracking_GPS(void) |
||
1828 | { uint8_t slen; |
||
1829 | |||
1830 | slen = strlen(pmenu) - 1; |
||
1831 | gps_display = pmenu[slen] - '0'; // char to byte 1 bis 3 im String enthalten |
||
1832 | if ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC)) |
||
1833 | pmenu[slen] = RXTimeChr[0]; // Manipulierung der Menüausführung |
||
1834 | else { |
||
1835 | m_pkt = gps_display; |
||
1836 | gps_disp_clear = 1; // damit Text "...keine Daten empf..." nach Datenempfang gelöscht wird |
||
1837 | if (gps_display != GPS_MISC) lcdPuts(Msg(MSG_GPS_NO_DATA)); |
||
1838 | if (Short_Enter()) // pmenu global |
||
1839 | pmenu[slen] = '\0'; // Menüpunkt zurück |
||
1840 | gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü |
||
1841 | } |
||
1842 | Jump_Menu(pmenu); |
||
1843 | } |
||
1844 | |||
1845 | void Menu_GPS_Displ_RX_Time(void) |
||
1846 | { |
||
1847 | Displ_Title(MSG_RX_TIME); |
||
1848 | lcdGotoXY(0, 1); |
||
1849 | lcdPuts(Msg(MSG_RX1)); |
||
1850 | lcdGotoXY(0, 2); |
||
1851 | lcdPuts(Msg(MSG_RX2)); |
||
1852 | Displ_RX_Time(); |
||
1853 | // bei Menüpunktmanipulatin TRACKING_NMEA und vorgezogen Menu_GPS_Displ_RX_Time ist Rücksprung real GPS_MISC |
||
1854 | m_pkt = ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))? GPS_MISC: GPS_RX_COUNT; |
||
1855 | gps_display = GPS_RX_COUNT; |
||
1856 | if (Short_Enter()) // pmenu global |
||
1857 | pmenu[strlen(pmenu) - 1] = '\0';// Menüpunkt zurück |
||
1858 | gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü |
||
1859 | Jump_Menu(pmenu); |
||
1860 | } |