You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
7.1 KiB
204 lines
7.1 KiB
#ifndef LCD_MENU_C |
|
#define LCD_MENU_C |
|
|
|
#include "lcd_menu.h" |
|
|
|
Menu menu; |
|
LiquidCrystal_I2C lcd(0x27,16, 2); |
|
|
|
|
|
|
|
//init menu// |
|
void Menu::init(uint8_t width, uint8_t height){ |
|
//Serial.println("=============[init:start]=============="); |
|
menu_data_head = new menu_data; |
|
menu_data_end = menu_data_head; |
|
menu_data_head->next_data = NULL; |
|
setDataValue(menu_data_head, NULL, NULL, 0, 0); |
|
setDataIndex(menu_data_head, NULL, 255); |
|
lcd_width = width; |
|
lcd_height = height; |
|
lcd.init(); |
|
lcd.backlight(); |
|
//Serial.print("[init]first data index: "); Serial.println(first_data_idx); |
|
//Serial.println("=============[init:end]=============="); |
|
} |
|
|
|
//add element// |
|
void Menu::add(uint8_t new_gid, uint8_t new_id, const __FlashStringHelper* new_title){ |
|
//Serial.println("=============[add:start]=============="); |
|
//Serial.print("[add]static: "); Serial.println(new_title); |
|
menu_data* new_data = getInsertDataAddress(new_gid, new_id); |
|
//Serial.print("[add]: "); Serial.println(unsigned(new_data)); |
|
setDataValue(new_data, new_title, NULL, new_gid, new_id); |
|
//debugPrint(new_data); |
|
|
|
updateScreen(); |
|
//Serial.println("=============[add:end]==============\n"); |
|
} |
|
|
|
//add element// |
|
void Menu::add(uint8_t new_gid, uint8_t new_id, const char* new_title){ |
|
//Serial.println("=============[add:start]=============="); |
|
//Serial.print("[add]dynamic: "); Serial.println(new_title); |
|
menu_data* new_data = getInsertDataAddress(new_gid, new_id); |
|
//Serial.print("[add]: "); Serial.println(unsigned(new_data)); |
|
setDataValue(new_data, NULL , new_title, new_gid, new_id); |
|
//debugPrint(new_data); |
|
|
|
updateScreen(); |
|
//Serial.println("=============[add:end]==============\n"); |
|
} |
|
|
|
//link element to group// |
|
void Menu::link(uint8_t src_gid, uint8_t src_id, uint8_t dst_gid){ |
|
//Serial.println("======================="); |
|
menu_data* data_src = getDataAddress(src_gid, src_id); |
|
data_src->sub_group = dst_gid; |
|
getDataAddress(data_src->sub_group,0)->parent = data_src; |
|
menu_data* finder = getDataAddress(data_src->sub_group,0); |
|
//Serial.print("[link]src gid: "); //Serial.print(src_gid); //Serial.print(" id: "); //Serial.println(src_id); |
|
//debugPrint(data_src); |
|
//Serial.print("[link]dst gid: "); //Serial.println(dst_gid); |
|
//debugPrint(data_src->sub_group); |
|
do{ |
|
finder->parent = data_src; |
|
finder = getNextMemberAddress(finder); |
|
}while(finder != NULL); |
|
//Serial.println("======================="); |
|
} |
|
|
|
//remove element// |
|
void Menu::remove(uint8_t del_gid, uint8_t del_id){ |
|
//Serial.println("=============[remove:start]=============="); |
|
menu_data* group_head = getDataAddress(del_gid, 0); |
|
menu_data* del_data = getDataAddress(del_gid, del_id); |
|
menu_data* next_del_data = del_data; |
|
|
|
//if del all group, show parent |
|
if(del_data == group_head && screen_select_line->gid == del_data->gid){ |
|
//Serial.println("[Remove]del group"); |
|
back(); |
|
} |
|
//if del screen top line or screen select line |
|
if(screen_top_line == del_data){ |
|
//Serial.println("[Remove]change top line"); |
|
//show pre data |
|
if(getPreMemberAddress(screen_top_line) != NULL){ |
|
screen_top_line = getPreMemberAddress(screen_top_line); |
|
//show next data |
|
}else if(getNextMemberAddress(screen_top_line) != NULL){ |
|
screen_top_line = getNextMemberAddress(screen_top_line); |
|
} |
|
} |
|
if(screen_select_line == del_data){ |
|
//Serial.println("[Remove]change select line"); |
|
//show pre data |
|
if(getPreMemberAddress(screen_select_line) != NULL){ |
|
screen_select_line = getPreMemberAddress(screen_select_line); |
|
//show next data |
|
}else if(getNextMemberAddress(screen_select_line) != NULL){ |
|
screen_select_line = getNextMemberAddress(screen_select_line); |
|
} |
|
} |
|
|
|
//Serial.print("[Remove]: "); Serial.println((unsigned)del_data); |
|
//if del group head, del this group |
|
if(del_data == group_head){ |
|
//Serial.println("[Remove]del group"); |
|
do{ |
|
del_data = next_del_data; |
|
next_del_data = getNextMemberAddress(next_del_data); |
|
//Serial.print("[Remove]: "); Serial.println((unsigned)del_data); |
|
deleteData(del_data); |
|
}while(next_del_data != NULL); |
|
}else{ |
|
deleteData(del_data); |
|
} |
|
updateScreen(); |
|
//Serial.println("=============[remove:end]=============="); |
|
} |
|
|
|
//start menu// |
|
void Menu::start(){ |
|
//Serial.println("[start]start"); |
|
menu_started = 1; |
|
initScreenHead(0); |
|
} |
|
|
|
//rollup// |
|
void Menu::rollUp(){ |
|
//Serial.println("[rollup]start"); |
|
//if can rollup |
|
if(getPreMemberAddress(screen_select_line) != NULL){ |
|
screen_select_line = getPreMemberAddress(screen_select_line); |
|
//Serial.print("[rollup]select_line: "); Serial.println((unsigned)screen_select_line); |
|
} |
|
updateScreen(); |
|
//printf("[rollup] end\n"); |
|
} |
|
|
|
//rolldown// |
|
void Menu::rollDown(){ |
|
//Serial.println("[rolldown]start"); |
|
//if only one member |
|
if(getNextMemberAddress(screen_select_line) != NULL){ |
|
screen_select_line = getNextMemberAddress(screen_select_line); |
|
} |
|
updateScreen(); |
|
} |
|
|
|
//back to parent element// |
|
void Menu::back(){ |
|
screen_select_line = screen_select_line->parent; |
|
screen_top_line = screen_select_line; |
|
updateScreen(); |
|
} |
|
|
|
//enter select element// |
|
void Menu::enter(){ |
|
//Serial.println("[enter]start"); |
|
//soft back |
|
String buffer; |
|
|
|
if(screen_select_line->dynamic_title != NULL){ |
|
buffer = screen_select_line->dynamic_title; |
|
}else if(screen_select_line->static_title != NULL){ |
|
buffer = screen_select_line->static_title; |
|
} |
|
|
|
menu_select_gid = screen_select_line->gid; |
|
menu_select_id = screen_select_line->id; |
|
if(soft_back){ |
|
if(!buffer.compareTo("...")){ |
|
back(); |
|
onSelect(); |
|
return; |
|
} |
|
} |
|
|
|
if(screen_select_line->sub_group != 255){ |
|
screen_select_line = getDataAddress(screen_select_line->sub_group,0); |
|
screen_top_line = screen_select_line; |
|
} |
|
updateScreen(); |
|
onSelect(); |
|
} |
|
|
|
//check select element// |
|
bool Menu::checkSelect(uint8_t dst_gid, uint8_t dst_id){ |
|
if(dst_gid == menu_select_gid && dst_id == menu_select_id){ |
|
return 1; |
|
}else{ |
|
return 0; |
|
} |
|
} |
|
|
|
//jump to group// |
|
void Menu::jump(uint8_t dst_gid, uint8_t dst_id){ |
|
screen_top_line = getDataAddress(dst_gid, dst_id); |
|
screen_select_line = screen_top_line; |
|
updateScreen(); |
|
} |
|
|
|
#endif |