1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
|
//Includes
#include <stdio.h>
//------------------Defines------------------
#define BOOL char
#define FALSE 0
#define TRUE (!FALSE)
//Number of menu entry
#define STATE_MAINMENU 10
#define STATE_SUB1MENU 20
#define STATE_SUB1SUB1MENU 21
#define STATE_SUB2MENU 30
//Key numbers
#define KEY_NULL 0
#define KEY_ENTER 1
#define KEY_VORWAERTS 2
#define KEY_RUECKWAERTS 3
//------------------Vars------------------
unsigned char state;
//Text for the entries
char ITEM_MAINMENU[] = "Hauptmenue\n";
char ITEM_SUB1MENU[] = "1. Untermenue\n";
char ITEM_SUB1SUB1MENU[] = "1. Untermenue im Untermenue\n";
char ITEM_SUB2MENU[] = "2. Untermenue\n";
//---------Function prototypes------------
unsigned char StateMachine(char state, unsigned char stimuli);
char Submenu1(char input);
char Submenu2(char input);
char Sub1submenu1(char input);
typedef struct
{
unsigned char state;
unsigned char input;
unsigned char nextstate;
} MENU_NEXTSTATE;
typedef struct
{
unsigned char state;
char *pText;
char (*pFunc)(char input);
} MENU_STATE;
MENU_NEXTSTATE menu_nextstate[] = {
// STATE INPUT NEXT STATE
{STATE_MAINMENU, KEY_ENTER, STATE_SUB1MENU},
{STATE_SUB1MENU, KEY_ENTER, STATE_SUB1SUB1MENU},
{STATE_SUB1MENU, KEY_VORWAERTS, STATE_SUB2MENU},
{STATE_SUB1MENU, KEY_RUECKWAERTS, STATE_MAINMENU},
{STATE_SUB2MENU, KEY_RUECKWAERTS, STATE_SUB1MENU},
{STATE_SUB1SUB1MENU, KEY_RUECKWAERTS, STATE_SUB1MENU},
{0, 0, 0},
};
MENU_STATE menu_state[] = {
// STATE STATE TEXT STATE_FUNC
{STATE_MAINMENU, ITEM_MAINMENU, NULL},
{STATE_SUB1MENU, ITEM_SUB1MENU, Submenu1},
{STATE_SUB1SUB1MENU, ITEM_SUB1SUB1MENU, Sub1submenu1},
{STATE_SUB2MENU, ITEM_SUB2MENU, Submenu2},
{0, NULL, NULL},
};
void main(void)
{
unsigned char nextstate;
static char *statetext;
char (*pStateFunc)(char);
char input=0;
char i;
// Initial state variables
state = nextstate = STATE_MAINMENU;
statetext = ITEM_MAINMENU;
pStateFunc = NULL;
for (;;) // Main loop
{
// Plain menu text
if (statetext)
{
printf(statetext);
statetext = NULL;
}
scanf( "%d", &input);
if (pStateFunc)
{
// When in this state, we must call the state function
nextstate = pStateFunc(input);
}
else if (input != KEY_NULL)
{
// Plain menu, clock the state machine
nextstate = StateMachine(state, input);
}
if (nextstate != state)
{
state = nextstate;
for (i=0; menu_state[i].state; i++)
{
if (menu_state[i].state == state)
{
statetext = menu_state[i].pText;
pStateFunc = menu_state[i].pFunc;
break;
}
}
}
}
}
unsigned char StateMachine(char state, unsigned char stimuli)
{
unsigned char nextstate = state; // Default stay in same state
unsigned char i;
for (i=0; menu_nextstate[i].state; i++)
{
if (menu_nextstate[i].state == state && menu_nextstate[i].input == stimuli)
{
// This is the one!
nextstate = menu_nextstate[i].nextstate;
break;
}
}
return nextstate;
}
char Submenu1(char input){
static char enter = 1;
if(enter)
{
enter = 0;
printf("la le lu Untermenue 1");
}
else if (input == KEY_RUECKWAERTS)
{
enter = 1;
return STATE_MAINMENU;
}
return STATE_SUB1MENU;
}
char Submenu2(char input)
{
static char enter = 1;
if(enter)
{
enter = 0;
printf("lu lu lu Untermenu 2");
}
else if (input == KEY_RUECKWAERTS)
{
enter = 1;
return STATE_SUB1MENU;
}
return STATE_SUB2MENU;
}
char Sub1submenu1(char input)
{
static char enter = 1;
if(enter)
{
enter = 0;
printf("lala le: Unter Untermenu");
}
else if (input == KEY_RUECKWAERTS)
{
enter = 1;
return STATE_SUB1MENU;
}
return STATE_SUB1SUB1MENU;
}
|