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 | void (*ExecFunc)(void) ;
|
21 |
|
22 | unsigned char Name[16] ;
|
23 | void *NextMenu ;
|
24 | void *PrevMenu ;
|
25 | void *SubMenu ;
|
26 | void *ParentMenu ;
|
27 |
|
28 | } MenuPunkt ;
|
29 |
|
30 | MenuPunkt* print_menu(MenuPunkt *Current) {
|
31 |
|
32 | // Farbenfrohe Ausgabe des aktuellen Menupunktes
|
33 |
|
34 | return Current ;
|
35 | }
|
36 |
|
37 | inline MenuPunkt* next_menu(MenuPunkt *Current) {
|
38 | if (Current->NextMenu) {
|
39 | Current = (MenuPunkt*)Current->NextMenu ;
|
40 | }
|
41 | return print_menu(Current) ;
|
42 | }
|
43 |
|
44 | inline MenuPunkt* prev_menu(MenuPunkt *Current) {
|
45 | if (Current->PrevMenu) {
|
46 | Current = (MenuPunkt*)Current->PrevMenu ;
|
47 | }
|
48 | return print_menu(Current) ;
|
49 | }
|
50 |
|
51 | inline MenuPunkt* sub_menu(MenuPunkt *Current) {
|
52 | if (Current->SubMenu) {
|
53 | Current = (MenuPunkt*)Current->SubMenu ;
|
54 | return print_menu(Current) ;
|
55 | }
|
56 | return exec_menu(Current) ;
|
57 | }
|
58 |
|
59 | inline MenuPunkt* parent_menu(MenuPunkt *Current) {
|
60 | if (Current->ParentMenu) {
|
61 | Current = (MenuPunkt*)Current->ParentMenu ;
|
62 | }
|
63 | return print_menu(Current) ;
|
64 | }
|
65 |
|
66 | MenuPunkt* exec_menu(MenuPunkt* Current) {
|
67 |
|
68 | // Aktionen ausfüren
|
69 |
|
70 | //hier war meine Idee über switch(current) zu unterscheiden -> Compiler error: switch quantity not an integer
|
71 | // geht das evtl. irgendwie anders?
|
72 |
|
73 | Current->ExecFunc();
|
74 |
|
75 |
|
76 |
|
77 | /* 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
|
78 | switch (Current->ID)
|
79 | {
|
80 | case MENU_1:
|
81 | //do something
|
82 | break;
|
83 |
|
84 | case MENU_2:
|
85 | //dos something else
|
86 | break;
|
87 |
|
88 | case MENU_3:
|
89 | //
|
90 | break;
|
91 | }*/
|
92 |
|
93 | return print_menu(Current) ;
|
94 | }
|
95 |
|
96 | static void topmenu1_func(void)
|
97 | {
|
98 | // do something
|
99 | }
|
100 |
|
101 | static void topmenu2_func(void)
|
102 | {
|
103 | // do something else
|
104 | }
|
105 |
|
106 | static void topmenu3_func(void)
|
107 | {
|
108 | // ...
|
109 | }
|
110 |
|
111 | int main() {
|
112 |
|
113 | // Hier Menus frei definieren
|
114 |
|
115 | // MenuPunkt Topmenu1 = {"Menu1"};
|
116 | // MenuPunkt Topmenu2 = {"Menu2"};
|
117 | // MenuPunkt Topmenu3 = {"Menu3"};
|
118 |
|
119 | MenuPunkt Topmenu1 = {topmenu1_func, "Menu1"};
|
120 | MenuPunkt Topmenu2 = {topmenu2_func, "Menu2"};
|
121 | MenuPunkt Topmenu3 = {topmenu3_func, "Menu3"};
|
122 |
|
123 | /* MenuPunkt Topmenu1 = {MENU_1, "Menu1"} ;
|
124 | MenuPunkt Topmenu2 = {MENU_2, "Menu2"};
|
125 | MenuPunkt Topmenu3 = {MENU_3, "Menu3"};*/
|
126 |
|
127 | Topmenu1.NextMenu = &Topmenu2 ;
|
128 | Topmenu1.PrevMenu = &Topmenu3 ;
|
129 | Topmenu1.SubMenu = 0 ;
|
130 | Topmenu1.ParentMenu = 0 ;
|
131 |
|
132 | Topmenu2.NextMenu = &Topmenu3 ;
|
133 | Topmenu2.PrevMenu = &Topmenu1 ;
|
134 | Topmenu2.SubMenu = 0 ;
|
135 | Topmenu2.ParentMenu = 0 ;
|
136 |
|
137 | Topmenu3.NextMenu = &Topmenu1 ;
|
138 | Topmenu3.PrevMenu = &Topmenu2 ;
|
139 | Topmenu3.SubMenu = 0 ;
|
140 | Topmenu1.ParentMenu = 0 ;
|
141 |
|
142 | // Menus Ende
|
143 |
|
144 |
|
145 | MenuPunkt *Current ;
|
146 |
|
147 | Current = print_menu(&Topmenu1) ;
|
148 |
|
149 | while (1) {
|
150 | if (debounce(&PIND, 4)) { // debounce -> siehe AVR-GCC-Tutorial
|
151 | Current = parent_menu(Current) ;
|
152 | }
|
153 |
|
154 | if (debounce(&PIND, 5)) {
|
155 | Current = next_menu(Current) ;
|
156 | }
|
157 |
|
158 | if (debounce(&PIND, 6)) {
|
159 | Current = prev_menu(Current) ;
|
160 | }
|
161 | if (debounce(&PIND, 7)) {
|
162 | Current = sub_menu(Current) ;
|
163 | }
|
164 | }
|
165 | }
|