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
  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
}