main.c


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
}