Hallo,
vor einigen Jahren wollte ich eine Heizungsteuerung bauen, da die alte
defekt war.Leider ist sie nie ganz fertig geworden und mittlerweile auch
obsolet, da ich einen neuen Kessel habe.
Warum ich das hier trotzdem poste?
Weil ich hier im Forum viel gelernt habe und andere vielleicht von dem
implementierten Menü lernen können und weils Spaß macht und weil ich
auch einiges an Code geborgt habe.
Im Anhang der komplette Quellcode und ein Foto der Hardware auf dem ich
ihn entwickelt habe. Das war nicht die endgültige Hardware, sondern
wurde von einem anderen Projekt geborgt. Es ging mir ja erstmal ums Menü
und die Schaltpunkte.
So los gehts:
Als erstes mal die Menüs deklarieren, bei mir in der main.c:
1
t_MenuSettingsMenu={
2
.Text="Settings",//der Name des Menüs
3
.menu_id=1,//eine eindeutige ID
4
.Previous=NULL,//wird von der Menüroutine gebraucht und sollte NULL bleiben
5
.Count=2,//die Anzahl der Menuitems
6
.MenuItems={
7
{
8
.Text="BackLight",//der Name des Items
9
.item_id=15,//eine eindeutige ID
10
},
11
{
12
.Text="Set Time",
13
.item_id=14,
14
},
15
},
16
};
17
18
t_MenuEditSwitchpoints={
19
.Text="Edit Switp",
20
.menu_id=2,
21
.Previous=NULL,
22
.Count=SWITCHPOINTS_COUNT,
23
.ItemType=1//ein Spezialmenü
24
};
25
26
t_MenuMainMenu={
27
.Text="Hauptmenue",
28
.menu_id=0,
29
.Previous=NULL,
30
.Count=3,
31
.MenuItems={
32
{
33
.Text="@Settings",//hier habe ich einen Trick verwendet, um nicht alle Menüs geschachtelt aufschreiben zu müssen
34
//zeigt das @ an das dies ein Untermenü ist. Der Code findet das Untermenü anhand vom Namen
35
//selbst.
36
.item_id=16,//wieder eine eindeutige ID
37
},
38
{
39
.Text="@Edit Switp",
40
.item_id=19,
41
},
42
{
43
.Text="Fertig",
44
.item_id=20,
45
},
46
},
47
};
48
49
t_Menu*Menus[]={//ein Array von Menüs, wie gesagt die Untermenüs werden durch das @ selbständig gefunden
50
&MainMenu,
51
&SettingsMenu,
52
&EditSwitchpoints,
53
};
54
55
56
uint8_tMenuCount=3;//wieviele Menüs sind im Array
57
58
t_ActiveApplicationActiveApplication=&MenuApplication;// dem von mir erfundenen Menü die Kontrolle übergeben
Ein Wort zu den Applikationen. Ich habe alle Menuitems als Apps
definiert. Das heißt eine App hat die Kontrolle
über das Display und den Controller. Wenn zB. "Backlight" aufgerufen
wird, wird die backlightapp aktiv und zeigt
hier ihre Ausgaben auf dem Display. Auf dem Foto im Anhang sieht man zB.
die Ausgaben der idleapp.
So weiter geht es. MySelect wird gebraucht um auf die Menüitems
reagieren zu können und somit die entsprechenden
Apps zu aktivieren.
t_ranged_uint8_t habe ich dafür erfunden, um Zahlen zu inkremenitieren
und dekrementieren, die eine Ober und Untergrenze
haben. Um nicht bei jeder Verwendung dieser Zahl mit if Bedingungen
darauf prüfen zu müssen, habe ich das halt ausgelagert.
Zum Beispiel wird BackLightPWM so deklariert:
1
#define BackLightPWMStart 16
2
t_ranged_uint8_tvolatileBackLightPWM={
3
.value=BackLightPWMStart,
4
.top=BackLightPWMStart,
5
.bottom=0
6
};
Das BackLightPWM.value ist 16. BackLightPWM.top ist ebenfalls 16. Beim
incrementiern muß nach der 16 also
BackLightPWM.bottom kommen. Hier ist BackLightPWM.bottom 0.
ranged.h
1
#ifndef RANGED_H_INCLUDED
2
#define RANGED_H_INCLUDED
3
4
#include<stdio.h>
5
#include<stdlib.h>
6
#include<string.h>
7
#include<stdint.h>
8
9
typedefstruct{
10
uint8_tvalue;
11
uint8_ttop;
12
uint8_tbottom;
13
}t_ranged_uint8_t;
14
15
voidrangedInc_uint8_t(t_ranged_uint8_t*value);
16
voidrangedDec_uint8_t(t_ranged_uint8_t*value);
17
18
#endif // RANGED_H_INCLUDED
ranged.c
1
#include"ranged.h"
2
3
voidrangedInc_uint8_t(t_ranged_uint8_t*value){
4
if(value->value==value->top){
5
value->value=value->bottom;
6
}
7
else{
8
value->value+=1;
9
}
10
}
11
12
13
voidrangedDec_uint8_t(t_ranged_uint8_t*value){
14
if(value->value==value->bottom){
15
value->value=value->top;
16
}
17
else{
18
value->value-=1;
19
}
20
}
So erstmal genug geschrieben. Wer Fragen hat gerne Fragen und
diskutieren. Den mir ist klar,
das hier ist nicht der Weisheit letzter Schluß.
gruß ralf
Sorry Leute, ich habe gar nicht gesehen wie groß das Archiv mit dem
Quellcode ist. Deshalb hier noch mal kleiner.
Ich hatte das Datenblatt vom Atmega 88 noch mit im Archiv.