1 | #include <sys/cpu.h>
|
2 | #include <stdio.h>
|
3 | #include "compiler.h"
|
4 | #include "board.h"
|
5 | #include "pm.h"
|
6 | #include "flashc.h"
|
7 | #include "intc.h"
|
8 | #include "gpio.h"
|
9 | #include "spi.h"
|
10 |
|
11 | /*enum MENU_ID
|
12 | {
|
13 | MENU_1,
|
14 | MENU_2,
|
15 | MENU_3,
|
16 | };*/
|
17 |
|
18 | typedef struct {
|
19 | //evtl. enum MENU_ID id;
|
20 | unsigned char Name[16] ;
|
21 | void *NextMenu ;
|
22 | void *PrevMenu ;
|
23 | void *SubMenu ;
|
24 | void *ParentMenu ;
|
25 | } MenuPunkt ;
|
26 |
|
27 | MenuPunkt* print_menu(MenuPunkt *Current) {
|
28 |
|
29 | // Farbenfrohe Ausgabe des aktuellen Menupunktes
|
30 |
|
31 | return Current ;
|
32 | }
|
33 |
|
34 | inline MenuPunkt* next_menu(MenuPunkt *Current) {
|
35 | if (Current->NextMenu) {
|
36 | Current = (MenuPunkt*)Current->NextMenu ;
|
37 | }
|
38 | return print_menu(Current) ;
|
39 | }
|
40 |
|
41 | inline MenuPunkt* prev_menu(MenuPunkt *Current) {
|
42 | if (Current->PrevMenu) {
|
43 | Current = (MenuPunkt*)Current->PrevMenu ;
|
44 | }
|
45 | return print_menu(Current) ;
|
46 | }
|
47 |
|
48 | inline MenuPunkt* sub_menu(MenuPunkt *Current) {
|
49 | if (Current->SubMenu) {
|
50 | Current = (MenuPunkt*)Current->SubMenu ;
|
51 | return print_menu(Current) ;
|
52 | }
|
53 | return exec_menu(Current) ;
|
54 | }
|
55 |
|
56 | inline MenuPunkt* parent_menu(MenuPunkt *Current) {
|
57 | if (Current->ParentMenu) {
|
58 | Current = (MenuPunkt*)Current->ParentMenu ;
|
59 | }
|
60 | return print_menu(Current) ;
|
61 | }
|
62 |
|
63 | MenuPunkt* exec_menu(MenuPunkt* Current) {
|
64 |
|
65 | // Aktionen ausfüren
|
66 |
|
67 | //hier war meine Idee über switch(current) zu unterscheiden -> Compiler error: switch quantity not an integer
|
68 | // geht das evtl. irgendwie anders?
|
69 |
|
70 |
|
71 |
|
72 |
|
73 | /* diese möglichkeit ist mir klar, aber nicht so elegeant, da die id zusätzlich mit initialisiert werden muss und bei größeren menüs eine fehlerquelle bedeutet
|
74 | switch (Current->ID)
|
75 | {
|
76 | case MENU_1:
|
77 | //do something
|
78 | break;
|
79 |
|
80 | case MENU_2:
|
81 | //dos something else
|
82 | break;
|
83 |
|
84 | case MENU_3:
|
85 | //
|
86 | break;
|
87 | }*/
|
88 |
|
89 | return print_menu(Current) ;
|
90 | }
|
91 |
|
92 | int main() {
|
93 |
|
94 | // Hier Menus frei definieren
|
95 |
|
96 | MenuPunkt Topmenu1 = {"Menu1"} ;
|
97 | MenuPunkt Topmenu2 = {"Menu2"};
|
98 | MenuPunkt Topmenu3 = {"Menu3"};
|
99 |
|
100 | /* MenuPunkt Topmenu1 = {MENU_1, "Menu1"} ;
|
101 | MenuPunkt Topmenu2 = {MENU_2, "Menu2"};
|
102 | MenuPunkt Topmenu3 = {MENU_3, "Menu3"};*/
|
103 |
|
104 | Topmenu1.NextMenu = &Topmenu2 ;
|
105 | Topmenu1.PrevMenu = &Topmenu3 ;
|
106 | Topmenu1.SubMenu = 0 ;
|
107 | Topmenu1.ParentMenu = 0 ;
|
108 |
|
109 | Topmenu2.NextMenu = &Topmenu3 ;
|
110 | Topmenu2.PrevMenu = &Topmenu1 ;
|
111 | Topmenu2.SubMenu = 0 ;
|
112 | Topmenu2.ParentMenu = 0 ;
|
113 |
|
114 | Topmenu3.NextMenu = &Topmenu1 ;
|
115 | Topmenu3.PrevMenu = &Topmenu2 ;
|
116 | Topmenu3.SubMenu = 0 ;
|
117 | Topmenu1.ParentMenu = 0 ;
|
118 |
|
119 | // Menus Ende
|
120 |
|
121 |
|
122 | MenuPunkt *Current ;
|
123 |
|
124 | Current = print_menu(&Topmenu1) ;
|
125 |
|
126 | while (1) {
|
127 | if (debounce(&PIND, 4)) { // debounce -> siehe AVR-GCC-Tutorial
|
128 | Current = parent_menu(Current) ;
|
129 | }
|
130 |
|
131 | if (debounce(&PIND, 5)) {
|
132 | Current = next_menu(Current) ;
|
133 | }
|
134 |
|
135 | if (debounce(&PIND, 6)) {
|
136 | Current = prev_menu(Current) ;
|
137 | }
|
138 | if (debounce(&PIND, 7)) {
|
139 | Current = sub_menu(Current) ;
|
140 | }
|
141 | }
|
142 | }
|