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

#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