├── menu.h
├── .gitattributes
├── MenuGenerator.exe
├── Example_Menu.xml
├── menu.c
└── Example_Menu.c
/menu.h:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TubeChip404/EmbeddedMenuLib/HEAD/menu.h
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/MenuGenerator.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TubeChip404/EmbeddedMenuLib/HEAD/MenuGenerator.exe
--------------------------------------------------------------------------------
/Example_Menu.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/menu.c:
--------------------------------------------------------------------------------
1 | #include "menu.h"
2 |
3 | MenuStruct *CurrentMenu;
4 | uint8_t MenuState;//bit0:Open(1) or Close(0)
5 | char MenuStringTemp[21]={0};
6 |
7 |
8 | void Screen_Clear(void){
9 | //屏幕清除函数(可选)
10 | }
11 |
12 | void Screen_DispString(char*mystr,uint16_t offset_x,uint8_t lines,uint8_t fontsize,uint8_t anticolor){
13 | //字符串显示函数
14 | /*
15 | mystr 字符串指针
16 | offset_x 横向偏移量(单位:像素)
17 | lines 纵向坐标(单位:行)
18 | fontsize 字体大小
19 | anticolor 是否反色(菜单项选中时该值为1,未选中时该值为0)
20 | */
21 | }
22 |
23 | void Screen_Refresh(void){
24 | //屏幕刷新函数(可选)
25 | }
26 |
27 | void Menu_Keys_Scan(void){
28 | //按键扫描函数
29 | /*
30 | if((GPIOA->IDR&GPIO_Pin_8)==0){
31 | delay_ms(50);
32 | if((GPIOA->IDR&GPIO_Pin_8)==0){
33 | Menu_Forward();
34 | }
35 | }
36 | if((GPIOA->IDR&GPIO_Pin_9)==0){
37 | delay_ms(50);
38 | if((GPIOA->IDR&GPIO_Pin_9)==0){
39 | Menu_Entry();
40 | }
41 | }
42 | if((GPIOA->IDR&GPIO_Pin_10)==0){
43 | delay_ms(50);
44 | if((GPIOA->IDR&GPIO_Pin_10)==0){
45 | Menu_Next();
46 | }
47 | }*/
48 | }
49 |
50 | void Menu_ProgressBar(void){
51 | //滚动条显示函数,该函数由于不同屏幕之间操作差异较大,故没有统一的实现过程
52 | /*
53 | uint8_t i,t,m;
54 | uint64_t bar=0;
55 | if(CurrentMenu->TotalNum<=6)return;
56 | for(i=1;i<7;i++)UC1701X_Gram[i][125]=0xff;
57 | t=288/CurrentMenu->TotalNum+1;
58 | for(i=0;iStartNum*(48-t)/(CurrentMenu->TotalNum-6);
60 | bar<<=m;
61 | for(i=0;i<6;i++){
62 | t=bar>>(i*8);
63 | UC1701X_Gram[i+1][124]=t;
64 | UC1701X_Gram[i+1][126]=t;
65 | }*/
66 | }
67 |
68 | void StringSplit(char *instr,uint8_t index){
69 | uint16_t i=0,t=0,last=0,now=0,flag=1;
70 | while(flag){
71 | if(instr[i]=='|'||instr[i]==0){
72 | t++;
73 | last=now;
74 | now=i;
75 | if(t==index+1)break;
76 | }
77 | if(instr[i]==0)flag=0;
78 | i++;
79 | }
80 | t=0;
81 | for(i=last==0?0:last+1;iTitleString,0,0,0,0);
89 | m=(menu->TotalNum)+(menu->isShowBackItem?1:0);
90 | t=(m-menu->StartNum)>SHOWLINES?menu->StartNum+SHOWLINES:m;
91 | for(i=menu->StartNum;iisShowBackItem)if(i==m-1){
93 | Screen_DispString("<-- Back ",0,i-menu->StartNum+1,0,i==menu->SelectedNum?1:0);
94 | continue;
95 | }
96 | StringSplit(menu->ItemString,i);
97 | Screen_DispString(MenuStringTemp,0,i-menu->StartNum+1,0,i==menu->SelectedNum?1:0);
98 | if(CurrentMenu->SonMenu[i]!=NULL)Screen_DispString("->",110,i-menu->StartNum+1,0,0);
99 | }
100 | if(SHOWBOTTOMBAR)Screen_DispString(" Up OK Down ",0,SHOWTITLE+SHOWBOTTOMBAR+SHOWLINES,0,0);
101 | if(SHOWSCOLLBAR)Menu_ProgressBar();
102 | Screen_Refresh();
103 | }
104 |
105 | void Menu_Next(void){
106 | uint8_t m=(CurrentMenu->TotalNum)+(CurrentMenu->isShowBackItem?1:0);
107 | if((CurrentMenu->SelectedNum+1)SelectedNum++;
108 | else return;
109 | if(CurrentMenu->SelectedNum>CurrentMenu->StartNum+5)CurrentMenu->StartNum++;
110 | Menu_ShowString(CurrentMenu);
111 | }
112 | void Menu_Forward(void){
113 | if((CurrentMenu->SelectedNum-1)>=0)CurrentMenu->SelectedNum--;
114 | else return;
115 | if(CurrentMenu->SelectedNumStartNum)CurrentMenu->StartNum--;
116 | Menu_ShowString(CurrentMenu);
117 | }
118 | void Menu_Entry(void){
119 | void (*myfunc)(void);
120 | if((CurrentMenu->isShowBackItem)&&(CurrentMenu->SelectedNum==CurrentMenu->TotalNum)){
121 | CurrentMenu=CurrentMenu->ParentsMenu;
122 | CurrentMenu->StartNum=0;
123 | CurrentMenu->SelectedNum=0;
124 | }else if(CurrentMenu->SonMenu[CurrentMenu->SelectedNum]!=NULL){
125 | CurrentMenu=CurrentMenu->SonMenu[CurrentMenu->SelectedNum];
126 | CurrentMenu->StartNum=0;
127 | CurrentMenu->SelectedNum=0;
128 | }else if(CurrentMenu->Function[CurrentMenu->SelectedNum]!=NULL){
129 | myfunc=((CurrentMenu->Function[CurrentMenu->SelectedNum]));
130 | myfunc();
131 | }
132 | Menu_ShowString(CurrentMenu);
133 | }
134 | void Menu_Close(void){
135 | Screen_Clear();
136 | MenuState&=~0x01;
137 | }
138 | void Menu_Open(MenuStruct *menu){
139 | CurrentMenu=menu;
140 | CurrentMenu->StartNum=0;
141 | CurrentMenu->SelectedNum=0;
142 | Menu_ShowString(CurrentMenu);
143 | MenuState|=0x01;
144 | }
145 |
--------------------------------------------------------------------------------
/Example_Menu.c:
--------------------------------------------------------------------------------
1 | #include "menu.h"
2 |
3 | void Beep_ON(void);
4 | void Beep_OFF(void);
5 | void Unit_Sv(void);
6 | void Unit_R(void);
7 | void Unit_CPM(void);
8 | void Unit_CPS(void);
9 | void BKL_Level(void);
10 | void BKL_Auto_OFF(void);
11 | void BKL_Auto_30s(void);
12 | void BKL_Auto_1min(void);
13 | void BKL_Auto_5min(void);
14 | void Alarm_OFF(void);
15 | void Alarm_1uSv(void);
16 | void Alarm_10uSv(void);
17 | void Alarm_100uSv(void);
18 | void Beep_ON(void);
19 | void Beep_OFF(void);
20 | void Unit_Sv(void);
21 | void Unit_R(void);
22 | void Unit_CPM(void);
23 | void Unit_CPS(void);
24 | void BKL_Level(void);
25 | void BKL_Auto_OFF(void);
26 | void BKL_Auto_30s(void);
27 | void BKL_Auto_1min(void);
28 | void BKL_Auto_5min(void);
29 | void Alarm_OFF(void);
30 | void Alarm_1uSv(void);
31 | void Alarm_10uSv(void);
32 | void Alarm_100uSv(void);
33 | void Dose_ON(void);
34 | void Dose_OFF(void);
35 | MenuStruct *beepmenu_menupoint[]={NULL,NULL};
36 | void *beepmenu_voidpoint[]={Beep_ON,Beep_OFF};
37 | MenuStruct beepmenu;
38 | MenuStruct *unitmenu_menupoint[]={NULL,NULL,NULL,NULL};
39 | void *unitmenu_voidpoint[]={Unit_Sv,Unit_R,Unit_CPM,Unit_CPS};
40 | MenuStruct unitmenu;
41 | MenuStruct *bklautomenu_menupoint[]={NULL,NULL,NULL,NULL};
42 | void *bklautomenu_voidpoint[]={BKL_Auto_OFF,BKL_Auto_30s,BKL_Auto_1min,BKL_Auto_5min};
43 | MenuStruct bklautomenu;
44 | MenuStruct *bklmenu_menupoint[]={NULL,&bklautomenu};
45 | void *bklmenu_voidpoint[]={BKL_Level,NULL};
46 | MenuStruct bklmenu;
47 | MenuStruct *alarmmenu_menupoint[]={NULL,NULL,NULL,NULL};
48 | void *alarmmenu_voidpoint[]={Alarm_OFF,Alarm_1uSv,Alarm_10uSv,Alarm_100uSv};
49 | MenuStruct alarmmenu;
50 | MenuStruct *dosemenu_menupoint[]={NULL,NULL};
51 | void *dosemenu_voidpoint[]={Dose_ON,Dose_OFF};
52 | MenuStruct dosemenu;
53 | MenuStruct *MainMenu_menupoint[]={&beepmenu,&unitmenu,&bklmenu,&alarmmenu,&dosemenu};
54 | void *MainMenu_voidpoint[]={NULL,NULL,NULL,NULL,NULL};
55 | MenuStruct MainMenu;
56 |
57 |
58 |
59 | void Menu_Init(void){
60 | beepmenu.TotalNum=2;
61 | beepmenu.ItemString="1.ON|2.OFF";
62 | beepmenu.SonMenu=beepmenu_menupoint;
63 | beepmenu.TitleString="Set Beep State";
64 | beepmenu.Function=beepmenu_voidpoint;
65 | beepmenu.ParentsMenu=&MainMenu;
66 | beepmenu.isShowBackItem=1;
67 |
68 | unitmenu.TotalNum=4;
69 | unitmenu.ItemString="1.Sv/h|2.R/h|3.CPM|4.CPS";
70 | unitmenu.SonMenu=unitmenu_menupoint;
71 | unitmenu.TitleString="Set Unit State";
72 | unitmenu.Function=unitmenu_voidpoint;
73 | unitmenu.ParentsMenu=&MainMenu;
74 | unitmenu.isShowBackItem=1;
75 |
76 | bklautomenu.TotalNum=4;
77 | bklautomenu.ItemString="1.OFF|2. 30s|3. 1min|4. 5min";
78 | bklautomenu.SonMenu=bklautomenu_menupoint;
79 | bklautomenu.TitleString="Set Auto OFF";
80 | bklautomenu.Function=bklautomenu_voidpoint;
81 | bklautomenu.ParentsMenu=&bklmenu;
82 | bklautomenu.isShowBackItem=1;
83 |
84 | bklmenu.TotalNum=2;
85 | bklmenu.ItemString="1.Level|2.Auto OFF";
86 | bklmenu.SonMenu=bklmenu_menupoint;
87 | bklmenu.TitleString="Set Backlight";
88 | bklmenu.Function=bklmenu_voidpoint;
89 | bklmenu.ParentsMenu=&MainMenu;
90 | bklmenu.isShowBackItem=1;
91 |
92 | alarmmenu.TotalNum=4;
93 | alarmmenu.ItemString="1.OFF|2.1uSv/h|3.10uSv/h|4.100uSv/h";
94 | alarmmenu.SonMenu=alarmmenu_menupoint;
95 | alarmmenu.TitleString="Set Alarm State";
96 | alarmmenu.Function=alarmmenu_voidpoint;
97 | alarmmenu.ParentsMenu=&MainMenu;
98 | alarmmenu.isShowBackItem=1;
99 |
100 | dosemenu.TotalNum=2;
101 | dosemenu.ItemString="1.ON|2.OFF";
102 | dosemenu.SonMenu=dosemenu_menupoint;
103 | dosemenu.TitleString="Set Dose Param";
104 | dosemenu.Function=dosemenu_voidpoint;
105 | dosemenu.ParentsMenu=&MainMenu;
106 | dosemenu.isShowBackItem=1;
107 |
108 | MainMenu.TotalNum=5;
109 | MainMenu.ItemString="1.Beep|2.Unit|3.Backlight|4.Alarm|5.Dose";
110 | MainMenu.SonMenu=MainMenu_menupoint;
111 | MainMenu.TitleString="MainMenu";
112 | MainMenu.Function=MainMenu_voidpoint;
113 | MainMenu.ParentsMenu=&MainMenu;
114 | MainMenu.isShowBackItem=0;
115 |
116 |
117 | }
118 |
119 | void Beep_ON(void){
120 |
121 | }
122 | void Beep_OFF(void){
123 |
124 | }
125 | void Unit_Sv(void){
126 |
127 | }
128 | void Unit_R(void){
129 |
130 | }
131 | void Unit_CPM(void){
132 |
133 | }
134 | void Unit_CPS(void){
135 |
136 | }
137 | void BKL_Level(void){
138 |
139 | }
140 | void BKL_Auto_OFF(void){
141 |
142 | }
143 | void BKL_Auto_30s(void){
144 |
145 | }
146 | void BKL_Auto_1min(void){
147 |
148 | }
149 | void BKL_Auto_5min(void){
150 |
151 | }
152 | void Alarm_OFF(void){
153 |
154 | }
155 | void Alarm_1uSv(void){
156 |
157 | }
158 | void Alarm_10uSv(void){
159 |
160 | }
161 | void Alarm_100uSv(void){
162 |
163 | }
164 | void Beep_ON(void){
165 |
166 | }
167 | void Beep_OFF(void){
168 |
169 | }
170 | void Unit_Sv(void){
171 |
172 | }
173 | void Unit_R(void){
174 |
175 | }
176 | void Unit_CPM(void){
177 |
178 | }
179 | void Unit_CPS(void){
180 |
181 | }
182 | void BKL_Level(void){
183 |
184 | }
185 | void BKL_Auto_OFF(void){
186 |
187 | }
188 | void BKL_Auto_30s(void){
189 |
190 | }
191 | void BKL_Auto_1min(void){
192 |
193 | }
194 | void BKL_Auto_5min(void){
195 |
196 | }
197 | void Alarm_OFF(void){
198 |
199 | }
200 | void Alarm_1uSv(void){
201 |
202 | }
203 | void Alarm_10uSv(void){
204 |
205 | }
206 | void Alarm_100uSv(void){
207 |
208 | }
209 | void Dose_ON(void){
210 |
211 | }
212 | void Dose_OFF(void){
213 |
214 | }
215 |
--------------------------------------------------------------------------------