#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