/* ******************************************************************** * * private: go in a menu item and start function * @param * @return * ******************************************************************** */ void LCDMenuLib::goEnter() /* ******************************************************************** */ { LCDMenu *tmp; // declare opjects uint8_t name = function; uint8_t j = 0; if (function == _LCDML_NO_FUNC) { //check button lock //check if element has childs if ((tmp = curMenu->getChild(curloc + curloc_correction())) != NULL) { // check child goMenu(*tmp); name = tmp->name; //check if element has childs if ((tmp = tmp->getChild(0)) != NULL) { while ((tmp = tmp->getSibling(1)) != NULL) { if (bitRead(group_en, tmp->disp) || bitRead(control, _LCDML_control_disable_hidden)) { j++; } } } if (j == 0) { function = name; countChilds(); } } } }
/* ******************************************************************** * * public: display the current menu * @param * @return * ******************************************************************** */ void LCDMenuLib::display() /* ******************************************************************** */ { //declaration LCDMenu * tmp; uint8_t i = scroll; uint8_t maxi = (rows + scroll); char buffer[_LCDML_DISP_cfg_max_string_length]; child_cnt = countChilds(); //check children if ((tmp = curMenu->getChild(i))) { if (!bitRead(control, _LCDML_control_search_display)) { //clear lcd display_clear(); //show menu structure do { if (bitRead(group_en, tmp->disp)) { strcpy_P(content[i-scroll], (char*)pgm_read_word(&(flash_table[tmp->name]))); content_id[i-scroll] = tmp->name; i++; } } while ((tmp = tmp->getSibling(1)) != NULL && i<maxi); bitSet(control, _LCDML_control_disp_update); } } else { // no children goBack(); // function can run ... } setCursor(); }
/* ******************************************************************** * * private: curloc correction * @param * @return * correction (uint8) * ******************************************************************** */ uint8_t LCDMenuLib::curloc_correction() { LCDMenu *tmp; // declare opjects uint8_t curloc_cor = 0; uint8_t j = 0; //correct function / menu element to open for hidden menu elements if ((tmp = curMenu->getChild(0)) != NULL) { do { if (bitRead(group_en, tmp->disp) || bitRead(control, _LCDML_control_disable_hidden)) { j++; } else { if (j <= curloc) { curloc_cor++; } } } while ((tmp = tmp->getSibling(1)) != NULL); } return curloc_cor; }
/* ******************************************************************** * * private: count sibling for an menu item if exists * @param * @return * sibling count 0 = one * ******************************************************************** */ uint8_t LCDMenuLib::countChilds() /* ******************************************************************** */ { //declaration LCDMenu * tmp; uint8_t j = 0; //check if element has childs if ((tmp = curMenu->getChild(0)) != NULL) { do { if (bitRead(group_en, tmp->disp) || bitRead(control, _LCDML_control_disable_hidden)) { j++; } } while ((tmp = tmp->getSibling(1)) != NULL); } if(j == 0) { return 0; } else { return --j; } }
/* ******************************************************************** * * private * @param * menu instance (pointer) * menu element (pointer) * @return * search status (uint8) * ******************************************************************** */ uint8_t LCDMenuLib::selectElementDirect(LCDMenu &p_m, uint8_t p_search) /* ******************************************************************** */ { //deklaration LCDMenu * search = &p_m; LCDMenu * tmp; uint8_t found = 0; bitSet(control, _LCDML_control_search_display); do { tmp = search->getChild(0); if (tmp) {//check elements for childs goEnter(); if (tmp->name == p_search) { //search elements in this layer found = 1; break; } else { function = _LCDML_NO_FUNC; } found = selectElementDirect(*tmp, p_search); //recursive search until found is true or last item reached if (found == 1) { //check result //something found break; } else { function = _LCDML_NO_FUNC; //nothing found //goto next root element goBack(); Button_udlr(_LCDML_button_down); } } else { //no childs found if (search->name == p_search) { //search //found something found = 1; break; } else { function = _LCDML_NO_FUNC; //select next element Button_udlr(_LCDML_button_down); } } } while ((search=search->getSibling(1)) != NULL && found == 0); if (found == 1) { bitClear(control, _LCDML_control_search_display); } //return result return found; }