Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
962 | - | 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 <util/delay.h> |
||
14 | |||
15 | #include "config.h" |
||
16 | #include "ngvideo.h" |
||
17 | #include "keys.h" |
||
18 | #include "menue.h" |
||
19 | #include "servo.h" |
||
20 | #include "messages.c" |
||
21 | |||
22 | typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX + 3]; // einmal, da Index mit 0 beginnt plus Vergrößerung für 2 zusätzlich eingeblendete Punkte |
||
23 | uint8_t m_pkt; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen |
||
24 | uint8_t servo_nr; // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden |
||
25 | |||
26 | COMMAND_STRUCTUR COMMAND_TABELLE[] = // Befehls-Tabelle |
||
27 | { |
||
28 | {"0", Menu_Main}, |
||
29 | {"01", Menu_AV_Source}, |
||
30 | {"02", Menu_RX_Channel}, |
||
31 | {"03", Menu_RSSI_Calibr}, |
||
32 | {"031", Menu_RSSI_min}, |
||
33 | {"032", Menu_RSSI_max}, |
||
34 | {"04", Menu_Language}, |
||
35 | {"05", Menu_Servo_Calibr}, |
||
36 | {"051", Menu_Servo_Steps}, |
||
37 | {"052", Menu_Servo1}, // zwischen Servo 1 und 2 wird danach |
||
38 | {"0521", Menu_Servo1_rev}, // mit global servo_nr unterschieden |
||
39 | {"0522", Menu_Servo1_left}, |
||
40 | {"0523", Menu_Servo1_right}, |
||
41 | {"0524", Menu_Servo1_middle}, |
||
42 | {"053", Menu_Servo2}, |
||
43 | {"0531", Menu_Servo2_rev}, |
||
44 | {"0532", Menu_Servo2_left}, |
||
45 | {"0533", Menu_Servo2_right}, |
||
46 | {"0534", Menu_Servo2_middle}, |
||
47 | {"06", Menu_lcd}, |
||
48 | {"061", Menu_lcd_Contrast}, |
||
49 | {"062", Menu_lcd_Backgr_Light}, |
||
50 | {"07", Menu_Battery}, |
||
51 | {"071", Menu_Low_U_Setup}, |
||
52 | {"072", Menu_U_Offset}, |
||
53 | {"08", Menu_Tracking_Ant}, |
||
54 | {"09", Menu_Tracking_Option}, // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert |
||
55 | {"0:", Menu_GPS_Display}, // wird nur bei Tracking GPS eingeblendet - SCROLL_MAIN_MAX wird geändert |
||
56 | {"0:1", Menu_GPS_Display_FLAG}, // nach '9' (0x39) folgt ':' (0x3a) |
||
57 | {"0:2", Menu_GPS_Display_FLAG}, |
||
58 | {"0:3", Menu_GPS_Display_FLAG}, |
||
59 | {NULL,NULL} |
||
60 | }; |
||
61 | |||
62 | |||
63 | uint32_t Change_Value(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t pos, uint8_t fu_index, uint8_t vrepeat); |
||
64 | |||
65 | void Displ_AV_Source(uint32_t q); |
||
66 | void Displ_Channels(uint32_t k); |
||
67 | void Displ_Set_Contrast(uint32_t val); |
||
68 | void Displ_Backgr_Light(uint32_t val); |
||
69 | void Displ_U_2Nk(uint32_t u); |
||
70 | void Displ_Off_On(uint32_t val); |
||
71 | void Displ_Language(uint32_t q); |
||
72 | void DISPL_Servo_Steps(uint32_t val); |
||
73 | void Displ_Servo_Min(uint32_t val); |
||
74 | void Displ_Servo_Max(uint32_t val); |
||
75 | void Displ_Servo_Mid(uint32_t val); |
||
76 | void Displ_Format_Int(uint32_t val); |
||
77 | void Displ_sel_Tracking(uint32_t q); |
||
78 | void Displ_track_TX(uint32_t q); |
||
79 | void Displ_Baudrate(uint32_t q); |
||
80 | typedef void (*Displ_Ptr_Fnct)( uint32_t ); |
||
81 | Displ_Ptr_Fnct Displ_Fnct[] = {Displ_U_2Nk, Displ_Set_Contrast, Displ_Backgr_Light, Displ_Channels, Displ_AV_Source, \ |
||
82 | Displ_Off_On, Displ_Language, DISPL_Servo_Steps, Displ_Servo_Min, Displ_Servo_Max, \ |
||
83 | Displ_Servo_Mid, Displ_Format_Int, Displ_sel_Tracking, Displ_track_TX, Displ_Baudrate}; |
||
84 | |||
85 | |||
86 | /**************************************************************/ |
||
87 | /* */ |
||
88 | /* Steuerung der Menüs */ |
||
89 | /* */ |
||
90 | /**************************************************************/ |
||
91 | |||
92 | /************************************************************************************/ |
||
93 | /* sucht nach übergebenen String in der Kommandotabelle und springt zum daneben */ |
||
94 | /* stehenden Menü-Programm */ |
||
95 | /* Parameter: */ |
||
96 | /* char *string_pointer :zu suchender String in Kommandotabelle */ |
||
97 | /* */ |
||
98 | /************************************************************************************/ |
||
99 | void Jump_Menu(char *string_pointer) |
||
100 | { |
||
101 | //Stringzeiger; |
||
102 | char *string_pointer_tmp; |
||
103 | unsigned char menu_index = 0; |
||
104 | |||
105 | if (strlen(string_pointer) > 0) |
||
106 | { |
||
107 | string_pointer_tmp = strsep(&string_pointer,","); |
||
108 | //Kommando in Tabelle suchen |
||
109 | while(strcasecmp(COMMAND_TABELLE[menu_index].menu_nr,string_pointer_tmp)) |
||
110 | { |
||
111 | //Abruch Whileschleife und Unterprogramm verlassen |
||
112 | if (COMMAND_TABELLE[++menu_index].menu_nr == 0); |
||
113 | } |
||
114 | COMMAND_TABELLE[menu_index].fp(); //Kommando ausführen |
||
115 | } |
||
116 | } |
||
117 | |||
118 | /************************************************************************************/ |
||
119 | /* */ |
||
120 | /* Unterprogramm von Scroll_Menu(...) stellt Menüpunkte dar */ |
||
121 | /* Parameter: */ |
||
122 | /* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */ |
||
123 | /* uint8_t scr_idx : ausgewählter Menüpunkt */ |
||
124 | /* uint8_t scroll_max: scrollen bis Wert */ |
||
125 | /* */ |
||
126 | /************************************************************************************/ |
||
127 | void Displ_Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx, uint8_t scroll_max) |
||
128 | { |
||
129 | uint8_t i; |
||
130 | const uint8_t p = 2; // LCD Beginn x-Position |
||
131 | |||
132 | if (scr_idx > 0) scr_idx--; else scr_idx = scroll_max; |
||
133 | for (i = 0; i < LCD_LINES; i++) { |
||
134 | lcdGotoXY(p, i); |
||
135 | lcdPuts(Msg(scr_menu[scr_idx])); |
||
136 | // ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr |
||
137 | for (int8_t n = LCD_COLS - strlen(Msg(scr_menu[scr_idx])) - p; n > 0; n--) |
||
138 | lcdPutc(' '); |
||
139 | if (scr_idx < scroll_max) scr_idx++; else scr_idx = 0; |
||
140 | } |
||
141 | } |
||
142 | |||
143 | /************************************************************************************/ |
||
144 | /* */ |
||
145 | /* scrollt Menü über Mehrzeilige LCD */ |
||
146 | /* */ |
||
147 | /* Taste<Enter> lang springt in Hauptanzeige, kurz geht in den angewälten Menüpunkt*/ |
||
148 | /* Taste<+> eine Zeile nach oben */ |
||
149 | /* Taste<-> eine Zeile nach unten */ |
||
150 | /* Parameter: */ |
||
151 | /* scr_menu_t scr_menu : Array mit Strings der Menüanzeige */ |
||
152 | /* uint8_t scroll_max: scrollen bis Wert */ |
||
153 | /* uint8_t scr_idx : Index für array von Displ_Scroll_Menu(...) */ |
||
154 | /* */ |
||
155 | /************************************************************************************/ |
||
156 | //void Scroll_Menu(scr_menu_t scr_menu, uint8_t scroll_max, uint8_t scr_idx, char *str) |
||
157 | void Scroll_Menu(scr_menu_t scr_menu, uint8_t scroll_max, uint8_t scr_idx) |
||
158 | { uint8_t l; |
||
159 | uint8_t end = 1; // false |
||
160 | |||
161 | // pmenu[1] == '\0' entspricht <wenn Hauptmenue>, da jetzt nur noch Servo x für Scrollemenue (rev,min,max,mid) |
||
162 | if ((pmenu[1] == '\0') && ((tracking == TRACKING_RSSI) || (tracking == TRACKING_GPS) || (tracking == TRACKING_MKCOCKPIT))) { |
||
163 | ++scroll_max; |
||
164 | if (tracking == TRACKING_RSSI) scr_menu[scroll_max] = MSG_TRACK_SERVO_HYTERESE; |
||
165 | if (tracking == TRACKING_GPS) { |
||
166 | scr_menu[scroll_max] = MSG_TRACK_TX_OSD_DATA; |
||
167 | ++scroll_max; // zusätzliche Anzeige zu GPS |
||
168 | } |
||
169 | if (tracking == TRACKING_MKCOCKPIT) scr_menu[scroll_max] = MSG_COM; |
||
170 | } |
||
171 | lcdClear(); |
||
172 | lcdGotoXY(0, 1); |
||
173 | lcdPutc(MARKER_SELECT); // '>>' |
||
174 | Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max); |
||
175 | // bis Menueeingabe bestätigt oder zum vorherigen Menue |
||
176 | while( !Get_Key_Short( 1<<SW_ENTER ) && end) |
||
177 | { |
||
178 | // >> Menueauswahl nach oben |
||
179 | if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )) |
||
180 | { |
||
181 | if (scr_idx > 0) scr_idx--; else scr_idx = scroll_max; |
||
182 | Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max); |
||
183 | } |
||
184 | // >> Menueauswahl nach unten |
||
185 | if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) |
||
186 | { |
||
187 | if (scr_idx < scroll_max) scr_idx++; else scr_idx = 0; |
||
188 | Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max); |
||
189 | } |
||
190 | // direkt in das Hauptprogramm |
||
191 | if (Get_Key_Long( 1<<SW_ENTER )) end = 0; |
||
192 | Tasks_unvisible(); |
||
193 | // falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW |
||
194 | U_Messen_cmp(DISABLE_BTIMER); |
||
195 | if (bat_low == 0) end = 0; |
||
196 | } |
||
197 | lcdClear(); |
||
198 | if (end) { |
||
199 | l = strlen(pmenu); |
||
200 | if (scr_idx > 0) { |
||
201 | m_pkt = 1; // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt |
||
202 | pmenu[l] = scr_idx + '0'; // nächsten MenueIndex anhängen 1 oder 2 oder ... |
||
203 | pmenu[l + 1] ='\0'; |
||
204 | Beep(BEEPENTER); |
||
205 | } |
||
206 | else { |
||
207 | l--; |
||
208 | m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen |
||
209 | pmenu[l] ='\0'; // auf letztes Zeichen Stringende schreiben |
||
210 | if (l == 0) Displ_Main_Disp(); |
||
211 | } |
||
212 | } |
||
213 | else { |
||
214 | pmenu[0] = '\0'; |
||
215 | Displ_Main_Disp(); |
||
216 | } |
||
217 | } |
||
218 | |||
219 | /************************************************************************************/ |
||
220 | /* */ |
||
221 | /* Abfrage Short- oder Long-Enter */ |
||
222 | /* verbleibt in Abfrage bis Enter betätigt; Rückgabe => Short-Enter True/False */ |
||
223 | /* */ |
||
224 | /************************************************************************************/ |
||
225 | uint8_t Short_Enter(void) |
||
226 | { uint8_t ShortEnter = 1; |
||
227 | |||
228 | // bis Enter |
||
229 | while( !Get_Key_Short( 1<<SW_ENTER ) && (ShortEnter > 0)) { |
||
230 | // direkt in das Hauptprogramm |
||
231 | if (Get_Key_Long( 1<<SW_ENTER )) { |
||
232 | ShortEnter = 0; |
||
233 | pmenu[0] ='\0'; |
||
234 | } |
||
235 | Tasks_unvisible(); |
||
236 | // falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW |
||
237 | U_Messen_cmp(DISABLE_BTIMER); |
||
238 | if (bat_low == 0) pmenu[0] ='\0'; |
||
239 | } |
||
240 | lcdClear(); |
||
241 | if (ShortEnter) Beep(BEEPENTER); |
||
242 | if (pmenu[0] == '\0') Displ_Main_Disp(); |
||
243 | return(ShortEnter); |
||
244 | } |
||
245 | |||
246 | /************************************************************************************/ |
||
247 | /* */ |
||
248 | /* Ändern der Werte mit Tasten +,- und Anzeige */ |
||
249 | /* z.B. für U-Offset, Batterie leer Eingabe ... */ |
||
250 | /* */ |
||
251 | /* Parameter: */ |
||
252 | /* uint32_t val :zu ändernter Wert */ |
||
253 | /* uint32_t min_val, max_val :min, max Grenze Wert ändern darf */ |
||
254 | /* uint8_t posX, posY :Darstellung Wert xPos, YPos auf LCD */ |
||
255 | /* uint8_t fu_index :Index um Adresse der Display Funktion aufzurufen */ |
||
256 | /* uint8_t cycle :0 begrenzt Anzeige bei man_val, bzw. max_val */ |
||
257 | /* :1 springt nach max_val auf min_val und umgedreht */ |
||
258 | /* uint8_t vrepeat :beschleunigte Repeat-Funktion aus/ein */ |
||
259 | /* uint32_t Change_Value_plmi(...) :Rückgabe geänderter Wert */ |
||
260 | /* */ |
||
261 | /************************************************************************************/ |
||
262 | uint32_t Change_Value_plmi(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t posX, uint8_t posY, \ |
||
263 | uint8_t fu_index, uint8_t cycle, uint8_t vrepeat) |
||
264 | { |
||
265 | // >> Menueauswahl nach oben |
||
266 | if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )){ |
||
267 | if (val < max_val) { |
||
268 | val++; |
||
269 | Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion |
||
270 | } |
||
271 | else |
||
272 | if (cycle) { |
||
273 | val = min_val; |
||
274 | } |
||
275 | lcdGotoXY(posX, posY); // lcd Position Wert |
||
276 | Displ_Fnct[fu_index](val); // geänderten Wert darstellen, je nach Menüpunkt |
||
277 | } |
||
278 | // >> Menueauswahl nach unten |
||
279 | if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) { |
||
280 | if (val > min_val) { |
||
281 | val--; |
||
282 | Key_Speedup_rpt(vrepeat); // beschleunigte Repeat-Funktion |
||
283 | } |
||
284 | else |
||
285 | if (cycle) { |
||
286 | val = max_val; |
||
287 | } |
||
288 | lcdGotoXY(posX, posY); // noch einmal lcd Position, sonst zum Teil + und - gleichzeitig, Anzeige verrutscht |
||
289 | Displ_Fnct[fu_index](val); // geänderten Wert darstellen, je nach Menüpunkt |
||
290 | } |
||
291 | return(val); |
||
292 | } |
||
293 | |||
294 | /************************************************************************************/ |
||
295 | /* */ |
||
296 | /* Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige */ |
||
297 | /* z.B. für U-Offset, Batterie leer Eingabe ... */ |
||
298 | /* */ |
||
299 | /* Parameter: */ |
||
300 | /* uint32_t val :zu ändernter Wert */ |
||
301 | /* uint32_t min_val, max_val :min, max Grenze Wert ändern darf */ |
||
302 | /* uint8_t pos :Darstellung Wert xPos auf LCD */ |
||
303 | /* uint8_t fu_index :Index um Adresse der Display Funktion aufzurufen */ |
||
304 | /* uint8_t vrepeat :beschleunigte Repeat-Funktion aus/ein */ |
||
305 | /* uint32_t Change_Value(...) :Rückgabe geänderter Wert */ |
||
306 | /* */ |
||
307 | /************************************************************************************/ |
||
308 | uint32_t Change_Value(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t pos, uint8_t fu_index, \ |
||
309 | uint8_t vrepeat) |
||
310 | { uint8_t l; |
||
311 | |||
312 | lcdGotoXY(pos, ZLE_VAL); // Position Wert |
||
313 | Displ_Fnct[fu_index](val); // initiale Wertdarstellung, je nach Menüpunkt |
||
314 | // bis Menueeingabe bestätigt oder zum vorherigen Menue |
||
315 | while( !Get_Key_Short( 1<<SW_ENTER ) && (strlen(pmenu) > 0)) |
||
316 | { |
||
317 | val = Change_Value_plmi(val, min_val, max_val, pos, ZLE_VAL, fu_index, 0, vrepeat); |
||
318 | // direkt in das Hauptprogramm zurück |
||
319 | if (Get_Key_Long( 1<<SW_ENTER )) pmenu[0] ='\0'; |
||
320 | Tasks_unvisible(); |
||
321 | // falls Akku leer ==> Menü verlassen und Anzeige MSG_ACCU_LOW |
||
322 | U_Messen_cmp(DISABLE_BTIMER); |
||
323 | if (bat_low == 0) pmenu[0] ='\0'; |
||
324 | } |
||
325 | lcdClear(); |
||
326 | l = strlen(pmenu); |
||
327 | if (l > 0) { |
||
328 | l--; |
||
329 | m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen |
||
330 | pmenu[l] ='\0'; // auf letztes Zeichen Stringende schreiben |
||
331 | } |
||
332 | else |
||
333 | Displ_Main_Disp(); |
||
334 | return(val); |
||
335 | } |
||
336 | |||
337 | |||
338 | |||
339 | /**************************************************************/ |
||
340 | /* */ |
||
341 | /* LCD-Darstellungen der Menüs */ |
||
342 | /* Zur Unterstützung der Auswahl werden einige Einstellungen */ |
||
343 | /* sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag */ |
||
344 | /* */ |
||
345 | /**************************************************************/ |
||
346 | |||
347 | /************************************************************************************/ |
||
348 | /* stellt eine String mittig auf Display dar */ |
||
349 | /* Parameter: */ |
||
350 | /* char *str : darzustellende Zeichenkette */ |
||
351 | /* uint8_t zle : Display-Zeile */ |
||
352 | /* */ |
||
353 | /************************************************************************************/ |
||
354 | void Disp_Str_mid(char *str, uint8_t zle) |
||
355 | { int8_t x; |
||
356 | |||
357 | lcdGotoXY(0,zle); |
||
358 | for (x = 0; x < LCD_COLS; x++) lcdPutc(' '); // Zeile löschen |
||
359 | x = (LCD_COLS - strlen(str))/2; // Array-String mittig schreiben |
||
360 | lcdGotoXY(x,zle); |
||
361 | lcdPuts(str); |
||
362 | } |
||
363 | |||
364 | /************************************************************************************/ |
||
365 | /* zeigt Menü- * Überschrift * auf erste Zeile mittig auf Display an */ |
||
366 | /* Parameter: */ |
||
367 | /* uint8_t message : index (MSG_) der darzustellenden Zeichenkette */ |
||
368 | /* */ |
||
369 | /************************************************************************************/ |
||
370 | void Disp_Title(uint8_t message) |
||
371 | { uint8_t l; |
||
372 | uint8_t x = 0; |
||
373 | |||
374 | l = strlen(Msg(message)); |
||
375 | if ( LCD_COLS > l) x = (LCD_COLS - l)/2; |
||
376 | if (x > 1) { |
||
377 | lcdGotoXY(x - 2, 0); |
||
378 | lcdPuts("* "); |
||
379 | lcdPuts(Msg(message)); |
||
380 | lcdPutc(' '); |
||
381 | } |
||
382 | else { |
||
383 | lcdGotoXY(0, 0); |
||
384 | lcdPutc('*'); |
||
385 | lcdGotoXY(x, 0); |
||
386 | lcdPuts(Msg(message)); |
||
387 | lcdGotoXY(LCD_COLS - 1, 0); |
||
388 | } |
||
389 | lcdPutc('*'); |
||
390 | } |
||
391 | |||
392 | /************************************************************************************/ |
||
393 | /* zeigt bei Programmstart Firmware- und DOGM-Version auf Display an */ |
||
394 | /* */ |
||
395 | /************************************************************************************/ |
||
396 | void Displ_Version(void) |
||
397 | { |
||
398 | lcdGotoXY(0, 0); |
||
399 | lcdPuts(Msg(MSG_VERSION1)); |
||
400 | if (dogm_vers == DOGM3V) |
||
401 | lcdPuts(Msg(MSG_UHW33V)); |
||
402 | else |
||
403 | lcdPuts(Msg(MSG_UHW5V)); |
||
404 | lcdPuts(Msg(MSG_VERSION2)); |
||
405 | for ( uint8_t i=0; i<=30;i++) |
||
406 | _delay_ms(100); |
||
407 | lcdClear(); |
||
408 | } |
||
409 | |||
410 | /************************************************************************************/ |
||
411 | /* zeigt auszuwählenden/-gewählten Kanal und Frequenz auf Display an */ |
||
412 | /* Parameter: */ |
||
413 | /* uint32_t k :Index anzuzeigender Wert = Kanal + 0x30 als Char, */ |
||
414 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
415 | /* */ |
||
416 | /************************************************************************************/ |
||
417 | void Displ_Channels(uint32_t k) |
||
418 | { char *channels[] = {"5740", "5760","5780", "5800", "5820", "5840", "5860"}; |
||
419 | |||
420 | lcdPutc(k+0x30); |
||
421 | lcdPuts(": "); |
||
422 | lcdPuts(channels[k-1]); |
||
423 | lcdPuts("MHz"); |
||
424 | } |
||
425 | |||
426 | /************************************************************************************/ |
||
427 | /* zeigt Source AV1, AV2 oder Diversity zur Auswahl auf Display an */ |
||
428 | /* Parameter: */ |
||
429 | /* uint32_t q :Index anzuzeigender Wert, */ |
||
430 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
431 | /* */ |
||
432 | /************************************************************************************/ |
||
433 | void Displ_AV_Source(uint32_t q) |
||
434 | { uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY}; |
||
435 | |||
436 | Disp_Str_mid(Msg(av_src_table[q]), ZLE_VAL); |
||
437 | } |
||
438 | |||
439 | /************************************************************************************/ |
||
440 | /* zeigt Tracking-Varianten zur Auswahl auf Display an */ |
||
441 | /* Parameter: */ |
||
442 | /* uint32_t q :Index anzuzeigender Wert, */ |
||
443 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
444 | /* */ |
||
445 | /************************************************************************************/ |
||
446 | void Displ_sel_Tracking(uint32_t q) |
||
447 | { uint8_t track_sel_table[] = {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT}; |
||
448 | |||
449 | Disp_Str_mid(Msg(track_sel_table[q]), ZLE_VAL); |
||
450 | } |
||
451 | |||
452 | /************************************************************************************/ |
||
453 | /* zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an */ |
||
454 | /* Parameter: */ |
||
455 | /* uint32_t q :Index anzuzeigender Wert, */ |
||
456 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
457 | /* */ |
||
458 | /************************************************************************************/ |
||
459 | void Displ_track_TX(uint32_t q) |
||
460 | { uint8_t track_TX_table[] = {MSG_OFF, MSG_TRACK_TX_ON}; |
||
461 | |||
462 | Disp_Str_mid(Msg(track_TX_table[q]), ZLE_VAL); |
||
463 | } |
||
464 | |||
465 | /************************************************************************************/ |
||
466 | /* zeigt einen max. 3-stelligen Integerwert auf Display an */ |
||
467 | /* Parameter: */ |
||
468 | /* uint32_t val :anzuzeigender Wert, */ |
||
469 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
470 | /* */ |
||
471 | /************************************************************************************/ |
||
472 | void Displ_Format_Int(uint32_t val) |
||
473 | { char s[4]; |
||
474 | |||
475 | if (val < 100) lcdPutc(' '); |
||
476 | if (val < 10) lcdPutc(' '); |
||
477 | utoa(val ,s ,10 ); |
||
478 | lcdPuts(s); |
||
479 | } |
||
480 | |||
481 | /************************************************************************************/ |
||
482 | /* zeigt den Kontrastwert auf Display an mit sofortiger Änderung */ |
||
483 | /* Parameter: */ |
||
484 | /* uint32_t val :anzuzeigender Wert, */ |
||
485 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
486 | /* */ |
||
487 | /************************************************************************************/ |
||
488 | void Displ_Set_Contrast(uint32_t val) |
||
489 | { |
||
490 | Displ_Format_Int(val); |
||
491 | lcdContrast(dogm_vers, val); |
||
492 | } |
||
493 | |||
494 | /************************************************************************************/ |
||
495 | /* zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an */ |
||
496 | /* Parameter: */ |
||
497 | /* uint32_t val :anzuzeigender Wert, */ |
||
498 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
499 | /* */ |
||
500 | /************************************************************************************/ |
||
501 | void Displ_Backgr_Light(uint32_t val) |
||
502 | { char str[5]; |
||
503 | uint8_t l; |
||
504 | |||
505 | l = strlen(Msg(MSG_LIGHT)); // etwas Aufwand um Zeilenende sauber zu löschen |
||
506 | switch(val) { |
||
507 | case BACKGR_LIGHT_MIN : l += strlen(Msg(MSG_LIGHT_OFF)); |
||
508 | lcdPuts(Msg(MSG_LIGHT_OFF)); |
||
509 | break; |
||
510 | case BACKGR_LIGHT_MAX : l += strlen(Msg(MSG_LIGHT_ON)); |
||
511 | lcdPuts(Msg(MSG_LIGHT_ON)); |
||
512 | break; |
||
513 | default : itoa (val * 10, str, 10); |
||
514 | lcdPutc(' '); |
||
515 | lcdPuts(str); |
||
516 | lcdPuts(Msg(MSG_SEC)); |
||
517 | l += 1 + strlen(str) + strlen(Msg(MSG_SEC)); |
||
518 | } |
||
519 | l = LCD_COLS - l; |
||
520 | for (uint8_t x = 0; x < l; x++) lcdPutc(' '); // Zeilenende löschen |
||
521 | } |
||
522 | |||
523 | /************************************************************************************/ |
||
524 | /* zeigt ein oder aus zur Auswahl auf Display an */ |
||
525 | /* Parameter: */ |
||
526 | /* uint32_t val :0 = aus oder 1 = ein, */ |
||
527 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
528 | /* */ |
||
529 | /************************************************************************************/ |
||
530 | void Displ_Off_On(uint32_t val) |
||
531 | { |
||
532 | if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON)); |
||
533 | } |
||
534 | |||
535 | /************************************************************************************/ |
||
536 | /* zeigt Servoschritte zur Auswahl auf Display an */ |
||
537 | /* Parameter: */ |
||
538 | /* uint32_t val :0 = 255 oder 1 = 1023, */ |
||
539 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
540 | /* */ |
||
541 | /************************************************************************************/ |
||
542 | void DISPL_Servo_Steps(uint32_t val) |
||
543 | { uint8_t servo_step_table[] = {MSG_STEPS_255, MSG_STEPS_1023}; |
||
544 | |||
545 | Disp_Str_mid(Msg(servo_step_table[val]), ZLE_VAL); |
||
546 | } |
||
547 | |||
548 | /************************************************************************************/ |
||
549 | /* zeigt Servo-Anschlagposition links auf Display an */ |
||
550 | /* mit sofortiger Wirkung auf Servo */ |
||
551 | /* Parameter: */ |
||
552 | /* uint32_t val :anzuzeigender Wert, */ |
||
553 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
554 | /* */ |
||
555 | /************************************************************************************/ |
||
556 | void Displ_Servo_Min(uint32_t val) |
||
557 | { uint16_t steps = 0; |
||
558 | |||
559 | Displ_Format_Int(val); |
||
560 | servoSet_min(servo_nr, val); // Wert setzen damit nachfolgend die |
||
561 | if (servo[servo_nr].rev) steps = ServoSteps(); |
||
562 | servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist |
||
563 | } |
||
564 | |||
565 | /************************************************************************************/ |
||
566 | /* zeigt Servo-Anschlagposition rechts auf Display an */ |
||
567 | /* mit sofortiger Wirkung auf Servo */ |
||
568 | /* Parameter: */ |
||
569 | /* uint32_t val :anzuzeigender Wert, */ |
||
570 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
571 | /* */ |
||
572 | /************************************************************************************/ |
||
573 | void Displ_Servo_Max(uint32_t val) |
||
574 | { uint16_t steps = ServoSteps(); |
||
575 | |||
576 | Displ_Format_Int(val); |
||
577 | servoSet_max(servo_nr, val); // Wert setzen damit nachfolgend die |
||
578 | if (servo[servo_nr].rev) steps = 0; |
||
579 | servoSetPosition(servo_nr, steps); // Änderung direkt am Servo sichtbar ist |
||
580 | } |
||
581 | |||
582 | /************************************************************************************/ |
||
583 | /* zeigt Servo-Anschlagposition Mitte auf Display an */ |
||
584 | /* mit sofortiger Wirkung auf Servo */ |
||
585 | /* Parameter: */ |
||
586 | /* uint32_t val :anzuzeigender Wert, */ |
||
587 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
588 | /* */ |
||
589 | /************************************************************************************/ |
||
590 | void Displ_Servo_Mid(uint32_t val) |
||
591 | { char s[6]; |
||
592 | int16_t mid_val; |
||
593 | |||
594 | mid_val = val - ServoSteps()/2; |
||
595 | if (abs(mid_val) < 10) lcdPutc(' '); // einstellige Ausgabe eins nach rechts rücken |
||
596 | if (mid_val > -1) lcdPutc(' '); // ohne Vorzeichen Ausgabe eins nach rechts rücken |
||
597 | itoa(mid_val ,s ,10 ); |
||
598 | lcdPuts(s); |
||
599 | lcdPutc(' '); // nach Werten > 99 letzte 0 wieder löschen |
||
600 | servoSet_mid(servo_nr, val); // Wert setzen damit nachfolgend die |
||
601 | servoSetPosition(servo_nr, ServoSteps()/2);// Änderung direkt am Servo sichtbar ist |
||
602 | } |
||
603 | |||
604 | /************************************************************************************/ |
||
605 | /* zeigt Baudrate für COM bei MKCockpit zur Auswahl auf Display an */ |
||
606 | /* Parameter: */ |
||
607 | /* uint32_t q :Index anzuzeigender Wert, */ |
||
608 | /* unint32_t wegen Vereinheitlichung f. Funktionsaufrauf */ |
||
609 | /* */ |
||
610 | /************************************************************************************/ |
||
611 | void Displ_Baudrate(uint32_t q) |
||
612 | { char str[7]; |
||
613 | |||
614 | ltoa(baud[q], str, 10); |
||
615 | Disp_Str_mid(str, ZLE_VAL); |
||
616 | } |
||
617 | |||
618 | /************************************************************************************/ |
||
619 | /* zeigt den Marker in Hauptdarstellung auf selektierten RX an */ |
||
620 | /* d Diversity, << fester RX */ |
||
621 | /* Parameter: */ |
||
622 | /* uint8_t p :x-Position des Markers */ |
||
623 | /* uint8_t marker :Markerzeichen z.B.:'' oder 'd' oder 's' */ |
||
624 | /* */ |
||
625 | /************************************************************************************/ |
||
626 | void Displ_AV_Mark(uint8_t p, char marker) |
||
627 | { |
||
628 | if (p < 2) { |
||
629 | lcdGotoXY(15,2 - p); // da p immer neue Position 0 oder 1 |
||
630 | lcdPutc(' '); // bisherigen AVx-, Diversity-Marker löschen |
||
631 | lcdGotoXY(15,p + 1); // an neuer Positon |
||
632 | lcdPutc(marker); // übergebenes Markerzeichen darstellen |
||
633 | } |
||
634 | else { // falls beim Einschalten Diversity auf aktiv, keine Marker |
||
635 | lcdGotoXY(15,1); |
||
636 | lcdPutc(' '); |
||
637 | lcdGotoXY(15,2); |
||
638 | lcdPutc(' '); |
||
639 | } |
||
640 | } |
||
641 | |||
642 | /************************************************************************************/ |
||
643 | /* Hauptanzeige unter Berücksichtigung von VBat */ |
||
644 | /* */ |
||
645 | /************************************************************************************/ |
||
646 | void Displ_Main_Disp(void) |
||
647 | { char marker; |
||
648 | |||
649 | lcdClear(); |
||
650 | if (bat_low != 0) { |
||
651 | lcdClear(); |
||
652 | Displ_Channels(channel); |
||
653 | lcdGotoXY(LCD_COLS - 1, 0); |
||
654 | lcdPuts("V\n1\n2"); |
||
655 | if (av_source < DIVERSITY) |
||
656 | marker = MARKER_AV; // wird nur bei gesetzten Diversity überschrieben |
||
657 | else |
||
658 | marker = MARKER_RSSI; // nur Schönheit, damit man sofort Umschaltung sieht |
||
659 | Displ_AV_Mark(sw_avx, marker); |
||
660 | Displ_VBat(); // muss zuletzt stehen |
||
661 | } |
||
662 | else { |
||
663 | Disp_Str_mid(Msg(MSG_ACCU_LOW), 0); |
||
664 | } |
||
665 | } |
||
666 | |||
667 | |||
668 | |||
669 | /**************************************************************/ |
||
670 | /* */ |
||
671 | /* Menüs */ |
||
672 | /* */ |
||
673 | /**************************************************************/ |
||
674 | |||
675 | /**************************/ |
||
676 | /* */ |
||
677 | /* Haupmenü */ |
||
678 | /* */ |
||
679 | /**************************/ |
||
680 | void Menu_Main(void) |
||
681 | { scr_menu_t scr_main_menu = {MSG_RETURN, MSG_AV_SOURCE, MSG_RX_CHANNEL, MSG_RSSI_CALIBR, MSG_LANGUAGE, MSG_SERVO_CALIBR, \ |
||
682 | MSG_LCD , MSG_BATTERY, MSG_TRACKING, 0, MSG_GPS_DISPLAY}; |
||
683 | |||
684 | strcpy(pmenu, "0"); |
||
685 | Scroll_Menu(scr_main_menu, SCROLL_MAIN_MAX, m_pkt); // pmenu global |
||
686 | Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return |
||
687 | } |
||
688 | |||
689 | /**************************/ |
||
690 | /* */ |
||
691 | /* AV-Quelle */ |
||
692 | /* */ |
||
693 | /**************************/ |
||
694 | void Menu_AV_Source(void) |
||
695 | { char marker; |
||
696 | uint32_t eep_val; |
||
697 | |||
698 | Disp_Title(MSG_AV_SOURCE); |
||
699 | eep_val = Change_Value(av_source, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, IDX_DISPL_AV_SOURCE, C_REPEAT); // pmenu global |
||
700 | if (eep_val != av_source) { |
||
701 | cli(); |
||
702 | av_source = eep_val; |
||
703 | eeprom_write_byte(&ep_av_source, av_source); |
||
704 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
705 | sw_avx = Set_AV_Source(av_source); |
||
706 | if (pmenu[0] == '\0') { // sonst ist AV-Source marker im Hauptdisplay nicht aktuallisiert |
||
707 | if (av_source < DIVERSITY) |
||
708 | marker = MARKER_AV; // wird nur bei gesetzten Diversity überschrieben |
||
709 | else |
||
710 | marker = MARKER_RSSI; // nur Schönheit, damit man sofort Umschaltung sieht |
||
711 | Displ_AV_Mark(sw_avx, marker);// da erst jetzt die Variable für main_display geändert ist! |
||
712 | } |
||
713 | sei(); |
||
714 | } |
||
715 | Jump_Menu(pmenu); |
||
716 | } |
||
717 | |||
718 | /**************************/ |
||
719 | /* */ |
||
720 | /* Kanal */ |
||
721 | /* */ |
||
722 | /**************************/ |
||
723 | void Menu_RX_Channel(void) |
||
724 | { uint32_t eep_val; |
||
725 | |||
726 | Disp_Title(MSG_RX_CHANNEL); |
||
727 | eep_val = Change_Value(channel, CHANNEL_MIN, CHANNEL_MAX, 3, IDX_DISPL_CHANNEL, C_REPEAT); // pmenu global |
||
728 | if ((eep_val != channel) || (eep_val != ch_stored)) { // oder Channel wurde im Hauptdisplay geändert |
||
729 | channel = eep_val; |
||
730 | ch_stored = eep_val; |
||
731 | eeprom_write_byte(&ep_channel, channel); |
||
732 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
733 | Set_Channel(channel); |
||
734 | if (pmenu[0] == '\0') { // sonst ist channel im Hauptdisplay nicht aktuallisiert |
||
735 | lcdGotoXY(0,0); |
||
736 | Displ_Channels(channel); // da erst jetzt die Variable für main_display geändert ist! |
||
737 | } |
||
738 | } |
||
739 | Jump_Menu(pmenu); |
||
740 | } |
||
741 | |||
742 | /**************************/ |
||
743 | /* */ |
||
744 | /* RSSI */ |
||
745 | /* */ |
||
746 | /**************************/ |
||
747 | void Menu_RSSI_Calibr(void) |
||
748 | { uint8_t scr_sub_menu[3] = {MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MAX}; |
||
749 | |||
750 | Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global |
||
751 | Jump_Menu(pmenu); |
||
752 | } |
||
753 | |||
754 | void Menu_RSSI_min(void) |
||
755 | { char str[20]; |
||
756 | |||
757 | Disp_Title(MSG_RSSI_MIN); |
||
758 | strcpy(str, Msg(MSG_TX)); |
||
759 | strcat(str, Msg(MSG_TX_OFF)); |
||
760 | Disp_Str_mid(str, 1); |
||
761 | Disp_Str_mid(Msg(MSG_CONTINUE), 2); |
||
762 | if (Short_Enter()) { // pmenu global |
||
763 | RSSI_Min_Calibrate(pudbm); |
||
764 | pmenu[0] = '\0'; // zur Hauptdarstellung |
||
765 | Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist! |
||
766 | } |
||
767 | else |
||
768 | Jump_Menu(pmenu); |
||
769 | } |
||
770 | |||
771 | void Menu_RSSI_max(void) |
||
772 | { char str[20]; |
||
773 | |||
774 | Disp_Title(MSG_RSSI_MAX); |
||
775 | strcpy(str, Msg(MSG_TX)); |
||
776 | strcat(str, Msg(MSG_TX_ON)); |
||
777 | Disp_Str_mid(str, 1); |
||
778 | Disp_Str_mid(Msg(MSG_CONTINUE), 2); |
||
779 | if (Short_Enter()) { // pmenu global |
||
780 | RSSI_Max_Calibrate(pudbm); |
||
781 | pmenu[0] = '\0'; // zur Hauptdarstellung |
||
782 | Displ_Main_Disp(); // da erst jetzt die Variable für main_display geändert ist! |
||
783 | } |
||
784 | else |
||
785 | Jump_Menu(pmenu); |
||
786 | } |
||
787 | |||
788 | /**************************/ |
||
789 | /* */ |
||
790 | /* Sprache */ |
||
791 | /* */ |
||
792 | /**************************/ |
||
793 | void Displ_Language(uint32_t i) |
||
794 | { uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH}; |
||
795 | |||
796 | Disp_Str_mid(Msg(lanuage_table[i]), ZLE_VAL); |
||
797 | } |
||
798 | |||
799 | void Menu_Language(void) |
||
800 | { uint32_t eep_val; |
||
801 | |||
802 | Disp_Title(MSG_LANGUAGE); |
||
803 | eep_val = Change_Value(language, GERMAN, LAST_LANG, 3, IDX_DISPL_LANGUAGE, C_REPEAT); // pmenu global |
||
804 | language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE |
||
805 | if (eep_val != language) { |
||
806 | language = eep_val; |
||
807 | eeprom_write_byte(&ep_language, language); |
||
808 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
809 | } |
||
810 | Jump_Menu(pmenu); |
||
811 | } |
||
812 | |||
813 | /**************************/ |
||
814 | /* */ |
||
815 | /* Servos */ |
||
816 | /* */ |
||
817 | /**************************/ |
||
818 | void Menu_Servo_Calibr(void) |
||
819 | { uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2}; |
||
820 | |||
821 | Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global |
||
822 | Jump_Menu(pmenu); |
||
823 | } |
||
824 | |||
825 | void Servo_NewValues(uint8_t idx_presc) |
||
826 | { |
||
827 | for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) { |
||
828 | if (idx_presc == STEPS_255) { // Werte umrechnen für Prescaler = 256 |
||
829 | servo[i].min /= 4; |
||
830 | servo[i].max /= 4; |
||
831 | servo[i].mid /= 4; |
||
832 | } |
||
833 | else { // Werte umrechnen für Prescaler = 64 |
||
834 | servo[i].min *= 4; |
||
835 | servo[i].max *= 4; |
||
836 | servo[i].mid *= 4; |
||
837 | } |
||
838 | servoSet_min(i, servo[i].min); |
||
839 | servoSet_max(i, servo[i].max); |
||
840 | servoSet_mid(i, servo[i].mid); |
||
841 | eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t)); |
||
842 | } |
||
843 | // Vorberechnung von ServoChannels[channel].duty |
||
844 | servoSetDefaultPos(); // Ausgangsstellung beider Servos |
||
845 | } |
||
846 | |||
847 | void Menu_Servo_Steps(void) |
||
848 | { uint32_t eep_val; |
||
849 | |||
850 | Disp_Title(MSG_SERVO_STEPS); |
||
851 | lcdGotoXY(8, ZLE_VAL); |
||
852 | eep_val = Change_Value(sIdxSteps, STEPS_255, STEPS_1023, 5, IDX_DISPL_SERVO_STEPS, C_REPEAT); // pmenu global |
||
853 | if (eep_val != sIdxSteps) { |
||
854 | cli(); |
||
855 | sIdxSteps = eep_val; |
||
856 | eeprom_write_byte(&ep_sIdxSteps, sIdxSteps); |
||
857 | Servo_NewValues(sIdxSteps); // hier ist der neue Index anzugeben! |
||
858 | servoInit(); |
||
859 | sei(); |
||
860 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
861 | } |
||
862 | Jump_Menu(pmenu); |
||
863 | } |
||
864 | |||
865 | void Menu_Servo1(void) |
||
866 | { uint8_t scr_servo_menu[5] = {MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE}; |
||
867 | |||
868 | Scroll_Menu(scr_servo_menu, SCROLL_SERVO_MAX, m_pkt); // pmenu global |
||
869 | servo_nr = 0; |
||
870 | Jump_Menu(pmenu); |
||
871 | } |
||
872 | |||
873 | void Menu_Servo2(void) |
||
874 | { uint8_t scr_servo_menu[5] = {MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE}; |
||
875 | |||
876 | Scroll_Menu(scr_servo_menu, SCROLL_SERVO_MAX, m_pkt); // pmenu global |
||
877 | servo_nr = 1; |
||
878 | Jump_Menu(pmenu); |
||
879 | } |
||
880 | |||
881 | uint8_t Servo_tmp_on(void) |
||
882 | { uint8_t tmp_tracking = tracking; |
||
883 | |||
884 | tracking = 0; // Servopositionierung durch tracking abschalten |
||
885 | if (tracking == TRACKING_MIN) servoInit(); // falls aus, Servos einschalten |
||
886 | lcdGotoXY(0, 0); // lcd Cursor vorpositionieren |
||
887 | return(tmp_tracking); |
||
888 | } |
||
889 | |||
890 | void Servo_tmp_Original(uint8_t track) |
||
891 | { uint16_t steps; |
||
892 | |||
893 | if (servo_nr == SERVO_PAN) |
||
894 | steps = ServoSteps()/2; // PAN auf Mittelstellung |
||
895 | else |
||
896 | steps = 0; // Tilt auf Endausschlag |
||
897 | servoSetPosition(servo_nr, steps); // Bei PAN auf ServoSteps/2 und bei Tilt auf 0 oder ServoSteps NICHT!!! reverse beachten |
||
898 | tracking = track; // ursprünglicher Wert Tracking aus, RSSI oder GPS |
||
899 | if (tracking == TRACKING_MIN) { |
||
900 | for (uint8_t i = 0; i < 2; i++) |
||
901 | _delay_ms(200); // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet |
||
902 | servoOff(); // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet |
||
903 | } |
||
904 | Jump_Menu(pmenu); |
||
905 | } |
||
906 | |||
907 | void Menu_Servo_rev(void) |
||
908 | { uint32_t eep_val; |
||
909 | uint8_t tmp_tracking; |
||
910 | |||
911 | tmp_tracking = Servo_tmp_on(); |
||
912 | eep_val = Change_Value(servo[servo_nr].rev, 0, 1, 6, IDX_DISPL_OFF_ON, C_REPEAT); // pmenu global; reverse gibt es nur 0=off, 1=on |
||
913 | if (eep_val != servo[servo_nr].rev) { |
||
914 | servo[servo_nr].rev = eep_val; |
||
915 | servoSet_rev(servo_nr, eep_val); |
||
916 | eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t)); |
||
917 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
918 | } |
||
919 | Servo_tmp_Original(tmp_tracking); |
||
920 | } |
||
921 | |||
922 | void Menu_Servo1_rev(void) |
||
923 | { |
||
924 | Disp_Title(MSG_SERVO1_REVERSE); |
||
925 | Menu_Servo_rev(); |
||
926 | } |
||
927 | |||
928 | void Menu_Servo2_rev(void) |
||
929 | { |
||
930 | Disp_Title(MSG_SERVO2_REVERSE); |
||
931 | Menu_Servo_rev(); |
||
932 | } |
||
933 | |||
934 | void Menu_Servo_left(void) |
||
935 | { uint32_t eep_val; |
||
936 | uint8_t tmp_tracking; |
||
937 | |||
938 | tmp_tracking = Servo_tmp_on(); |
||
939 | servoSetPosition(servo_nr, ServoSteps()); // Linkssanschlag um Kalibrierung am Servo zu sehen |
||
940 | eep_val = Change_Value(servo[servo_nr].max, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6, IDX_DISPL_SERVO_MAX, V_REPEAT); // pmenu global |
||
941 | if (eep_val != servo[servo_nr].max) { |
||
942 | servo[servo_nr].max = eep_val; |
||
943 | eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t)); |
||
944 | servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben |
||
945 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
946 | } |
||
947 | Servo_tmp_Original(tmp_tracking); |
||
948 | } |
||
949 | |||
950 | void Menu_Servo1_left(void) |
||
951 | { |
||
952 | Disp_Title(MSG_CALIB1_LEFT); |
||
953 | Menu_Servo_left(); |
||
954 | } |
||
955 | |||
956 | void Menu_Servo2_left(void) |
||
957 | { |
||
958 | Disp_Title(MSG_CALIB2_LEFT); |
||
959 | Menu_Servo_left(); |
||
960 | } |
||
961 | |||
962 | void Menu_Servo_right(void) |
||
963 | { uint32_t eep_val; |
||
964 | uint8_t tmp_tracking; |
||
965 | |||
966 | tmp_tracking = Servo_tmp_on(); |
||
967 | servoSetPosition(servo_nr, 0); // Rechtsanschlag um Kalibrierung am Servo zu sehen |
||
968 | eep_val = Change_Value(servo[servo_nr].min, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6, IDX_DISPL_SERVO_MIN, V_REPEAT); // pmenu global |
||
969 | if (eep_val != servo[servo_nr].min) { |
||
970 | servo[servo_nr].min = eep_val; |
||
971 | eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t)); |
||
972 | servoSet_mid(servo_nr, servo[servo_nr].mid); // Mittelposition muss sich bei Ausschlagsänderung verschieben |
||
973 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
974 | } |
||
975 | Servo_tmp_Original(tmp_tracking); |
||
976 | } |
||
977 | |||
978 | void Menu_Servo1_right(void) |
||
979 | { |
||
980 | Disp_Title(MSG_CALIB1_RIGHT); |
||
981 | Menu_Servo_right(); |
||
982 | } |
||
983 | |||
984 | void Menu_Servo2_right(void) |
||
985 | { |
||
986 | Disp_Title(MSG_CALIB2_RIGHT); |
||
987 | Menu_Servo_right(); |
||
988 | } |
||
989 | |||
990 | void Menu_Servo_middle(void) |
||
991 | { uint32_t eep_val; |
||
992 | uint8_t tmp_tracking; |
||
993 | |||
994 | tmp_tracking = Servo_tmp_on(); |
||
995 | servoSetPosition(servo_nr, ServoSteps()/2); // Mittelposition um Kalibrierung am Servo zu sehen |
||
996 | eep_val = Change_Value(servo[servo_nr].mid, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 6, IDX_DISPL_SERVO_MID, V_REPEAT); // pmenu global |
||
997 | if (eep_val != servo[servo_nr].mid) { |
||
998 | servo[servo_nr].mid = eep_val; |
||
999 | eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t)); |
||
1000 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1001 | } |
||
1002 | Servo_tmp_Original(tmp_tracking); |
||
1003 | } |
||
1004 | |||
1005 | void Menu_Servo1_middle(void) |
||
1006 | { |
||
1007 | Disp_Title(MSG_CALIB1_MIDDLE); |
||
1008 | Menu_Servo_middle(); |
||
1009 | } |
||
1010 | |||
1011 | void Menu_Servo2_middle(void) |
||
1012 | { |
||
1013 | Disp_Title(MSG_CALIB2_MIDDLE); |
||
1014 | Menu_Servo_middle(); |
||
1015 | } |
||
1016 | |||
1017 | /**************************/ |
||
1018 | /* */ |
||
1019 | /* LCD */ |
||
1020 | /* */ |
||
1021 | /**************************/ |
||
1022 | void Menu_lcd(void) |
||
1023 | { uint8_t scr_sub_menu[3] = {MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT}; |
||
1024 | |||
1025 | Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global |
||
1026 | Jump_Menu(pmenu); |
||
1027 | } |
||
1028 | |||
1029 | void Menu_lcd_Contrast(void) |
||
1030 | { uint32_t eep_val; |
||
1031 | |||
1032 | Disp_Title(MSG_LCD); |
||
1033 | lcdGotoXY(2, ZLE_VAL); |
||
1034 | lcdPuts(Msg(MSG_CONTRAST)); |
||
1035 | lcdPuts(": "); |
||
1036 | eep_val = Change_Value(contrast, CONTRAST_MIN, CONTRAST_MAX, 11, IDX_DISPL_SET_CONTRAST, C_REPEAT); // pmenu global |
||
1037 | if (eep_val != contrast) { |
||
1038 | contrast = eep_val; |
||
1039 | eeprom_write_byte(&ep_contrast, contrast); |
||
1040 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1041 | } |
||
1042 | Jump_Menu(pmenu); |
||
1043 | } |
||
1044 | |||
1045 | void Menu_lcd_Backgr_Light(void) |
||
1046 | { uint32_t eep_val; |
||
1047 | |||
1048 | Disp_Title(MSG_BACKGR_LIGHT); |
||
1049 | lcdGotoXY(0, ZLE_VAL); |
||
1050 | lcdPuts(Msg(MSG_LIGHT)); |
||
1051 | eep_val = Change_Value(light_time, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6, IDX_DISPL_BACKGR_LIGHT, V_REPEAT); // pmenu global |
||
1052 | if (eep_val != light_time) { |
||
1053 | light_time = eep_val; |
||
1054 | eeprom_write_byte(&ep_light_time, light_time); |
||
1055 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1056 | if (light_time == BACKGR_LIGHT_MIN) lcdSet_BackgrLight_Off(); // Hintergrundbeleuchtung immer aus ==> sofort schalten |
||
1057 | } |
||
1058 | Jump_Menu(pmenu); |
||
1059 | } |
||
1060 | |||
1061 | /**************************/ |
||
1062 | /* */ |
||
1063 | /* Batterie */ |
||
1064 | /* */ |
||
1065 | /**************************/ |
||
1066 | void Menu_Battery(void) |
||
1067 | { uint8_t scr_sub_menu[3] = {MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET}; |
||
1068 | |||
1069 | Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global |
||
1070 | Jump_Menu(pmenu); |
||
1071 | } |
||
1072 | |||
1073 | void Menu_Low_U_Setup(void) |
||
1074 | { uint32_t eep_val; |
||
1075 | |||
1076 | Disp_Title(MSG_U_MIN); |
||
1077 | eep_val = Change_Value(u_min, U_MIN_MIN, U_MIN_MAX, 4, IDX_DISPL_U_2Nk, V_REPEAT); // pmenu global |
||
1078 | if (eep_val != u_min) { |
||
1079 | u_min = eep_val; |
||
1080 | eeprom_write_dword(&ep_u_min, u_min); |
||
1081 | hyst_u_min = u_min; |
||
1082 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1083 | } |
||
1084 | Jump_Menu(pmenu); |
||
1085 | } |
||
1086 | |||
1087 | void Menu_U_Offset(void) |
||
1088 | { uint32_t eep_val; |
||
1089 | |||
1090 | Disp_Title(MSG_U_OFFSET); |
||
1091 | eep_val = Change_Value(u_offset, U_OFFSET_MIN, U_OFFSET_MAX, 4, IDX_DISPL_U_2Nk, V_REPEAT); // pmenu global |
||
1092 | if (eep_val != u_offset) { |
||
1093 | u_offset = eep_val; |
||
1094 | eeprom_write_byte(&ep_u_offset, u_offset); |
||
1095 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1096 | } |
||
1097 | Jump_Menu(pmenu); |
||
1098 | } |
||
1099 | |||
1100 | /**************************/ |
||
1101 | /* */ |
||
1102 | /* Antennennachführung */ |
||
1103 | /* */ |
||
1104 | /**************************/ |
||
1105 | void Menu_Tracking_Ant(void) |
||
1106 | { uint32_t eep_val; |
||
1107 | |||
1108 | Disp_Title(MSG_TRACKING); |
||
1109 | eep_val = Change_Value(tracking, TRACKING_MIN, TRACKING_MAX, 3, IDX_DISPL_SEL_TRACKING, C_REPEAT); // pmenu global |
||
1110 | if (eep_val != tracking) { |
||
1111 | cli(); |
||
1112 | tracking = eep_val; |
||
1113 | sei(); |
||
1114 | eeprom_write_byte(&ep_tracking, tracking); |
||
1115 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1116 | USART_RX_Mode(tracking); // Unterschied Datenempfang GPS/MKCockpit |
||
1117 | coldstart = 1; |
||
1118 | servoSetDefaultPos(); // Ausgangsstellung beider Servos |
||
1119 | if (tracking > TRACKING_MIN) |
||
1120 | servoInit(); |
||
1121 | else { |
||
1122 | for (uint8_t i = 0; i < 2; i++) |
||
1123 | _delay_ms(200); // sonst wird Impuls bereits vor erreichen der Mittelstellung abgeschaltet |
||
1124 | servoOff(); |
||
1125 | } |
||
1126 | USART_Init_Baudrate(); |
||
1127 | } |
||
1128 | Jump_Menu(pmenu); |
||
1129 | } |
||
1130 | |||
1131 | /**************************/ |
||
1132 | /* Optionen */ |
||
1133 | /* Antennennachführung */ |
||
1134 | /* */ |
||
1135 | /**************************/ |
||
1136 | void Menu_Tracking_HYST(void) |
||
1137 | { uint32_t eep_val; |
||
1138 | |||
1139 | Disp_Title(MSG_HYSTERESE); |
||
1140 | eep_val = Change_Value(track_hyst, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7, IDX_DISPL_FORMAT_INT, V_REPEAT); // pmenu gloabal |
||
1141 | if (eep_val != track_hyst) { |
||
1142 | track_hyst = eep_val; |
||
1143 | eeprom_write_byte(&ep_track_hyst, track_hyst); |
||
1144 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1145 | } |
||
1146 | Jump_Menu(pmenu); |
||
1147 | } |
||
1148 | |||
1149 | void Menu_Tracking_TXOSD(void) |
||
1150 | { uint32_t eep_val; |
||
1151 | |||
1152 | Disp_Title(MSG_TRACK_TX_OSD_DATA); |
||
1153 | eep_val = Change_Value(track_tx, 0, 1, 3, IDX_DISPL_TRACK_TX, C_REPEAT); // pmenu global; Senden gibt es nur 0=off, 1=on |
||
1154 | if (eep_val != track_tx) { |
||
1155 | track_tx = eep_val; |
||
1156 | eeprom_write_byte(&ep_track_tx, track_tx); |
||
1157 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1158 | } |
||
1159 | Jump_Menu(pmenu); |
||
1160 | } |
||
1161 | |||
1162 | void Menu_Baudrate(void) |
||
1163 | { uint32_t eep_val; |
||
1164 | |||
1165 | Disp_Title(MSG_BAUDRATE); |
||
1166 | eep_val = Change_Value(baudrate, BAUDRATE_MIN, BAUDRATE_MAX, 3, IDX_DISPL_BAUDRATE, C_REPEAT); // pmenu global; Senden gibt es nur 0=off, 1=on |
||
1167 | if (eep_val != baudrate) { |
||
1168 | baudrate = eep_val; |
||
1169 | eeprom_write_byte(&ep_baudrate, baudrate); |
||
1170 | Double_Beep(DBEEPWR, DBEEPWRP); |
||
1171 | USART_Init(baud[baudrate]); |
||
1172 | } |
||
1173 | Jump_Menu(pmenu); |
||
1174 | } |
||
1175 | |||
1176 | void Menu_Tracking_Option(void) |
||
1177 | { // im Menü ist dies der gleiche Gliederungspunkt aber mit geänderter Auswahl |
||
1178 | switch(tracking) { |
||
1179 | case TRACKING_RSSI: Menu_Tracking_HYST(); |
||
1180 | break; |
||
1181 | case TRACKING_GPS: Menu_Tracking_TXOSD(); |
||
1182 | break; |
||
1183 | case TRACKING_MKCOCKPIT: Menu_Baudrate(); |
||
1184 | } |
||
1185 | } |
||
1186 | |||
1187 | /**************************/ |
||
1188 | /* */ |
||
1189 | /* Anzeige GPS */ |
||
1190 | /* */ |
||
1191 | /**************************/ |
||
1192 | void Menu_GPS_Display(void) |
||
1193 | { uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME}; |
||
1194 | |||
1195 | Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global |
||
1196 | Jump_Menu(pmenu); |
||
1197 | } |
||
1198 | |||
1199 | void Menu_GPS_Display_FLAG(void) // ist Flag in tracking.c Tracking_GPS(void) |
||
1200 | { uint8_t slen; |
||
1201 | |||
1202 | slen = strlen(pmenu) - 1; |
||
1203 | gps_display = pmenu[slen] - '0'; // char to byte 1 bis 3 im String enthalten |
||
1204 | m_pkt = gps_display; |
||
1205 | gps_disp_clear = 1; // damit Text "...keine Daten empf..." nach Datenempfang gelöscht wird |
||
1206 | lcdPuts(Msg(MSG_GPS_NO_DATA)); |
||
1207 | if (Short_Enter()) // pmenu global |
||
1208 | pmenu[slen] = '\0'; // Menüpunkt zurück |
||
1209 | gps_display = GPS_DISP_NONE; // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü |
||
1210 | Jump_Menu(pmenu); |
||
1211 | } |