├── 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 | --------------------------------------------------------------------------------