Library which creates a serial test console, it supports pages and menu items. The items are added and the pages are added as necessary when the user sets it up. This is a great too for creating an easy to maintain menu system, whether for a test sytem, or anything else.

Dependencies:   Terminal

Committer:
glansberry
Date:
Fri Jul 24 22:18:19 2015 +0000
Revision:
9:b1fdd7ea6f72
Parent:
6:e992366d0684
Fixed bug is choosing the first page.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
glansberry 0:907d2d5e77f7 1 #include "page.h"
glansberry 0:907d2d5e77f7 2
glansberry 6:e992366d0684 3 //default constructor
glansberry 0:907d2d5e77f7 4 Page::Page() :
glansberry 6:e992366d0684 5 make_active_flag(false),
glansberry 6:e992366d0684 6 name(NULL),
glansberry 6:e992366d0684 7 term(NULL),
glansberry 0:907d2d5e77f7 8 num_menuitems(0),
glansberry 0:907d2d5e77f7 9 data_start_x(0),
glansberry 0:907d2d5e77f7 10 page_num(0)
glansberry 6:e992366d0684 11 {}
glansberry 0:907d2d5e77f7 12
glansberry 6:e992366d0684 13 Page::Page(const char * name_p, Terminal * term_p):
glansberry 6:e992366d0684 14 make_active_flag(false),
glansberry 6:e992366d0684 15 name(name_p),
glansberry 6:e992366d0684 16 term(term_p),
glansberry 0:907d2d5e77f7 17 num_menuitems(0),
glansberry 0:907d2d5e77f7 18 data_start_x(0),
glansberry 0:907d2d5e77f7 19 max_upper_letter_cmd('A'-1),
glansberry 0:907d2d5e77f7 20 max_lower_letter_cmd('a'-1),
glansberry 0:907d2d5e77f7 21 max_number_cmd('1'-1),
glansberry 0:907d2d5e77f7 22 page_num(0)
glansberry 0:907d2d5e77f7 23 {
glansberry 6:e992366d0684 24 // term->printf("Page::Page('%s')\r\n",name);
glansberry 0:907d2d5e77f7 25 }
glansberry 0:907d2d5e77f7 26
iillyyaa 3:f308cd7a34ed 27 Page& Page::add(MenuItem const &item_p) {
glansberry 0:907d2d5e77f7 28 if(num_menuitems < MAX_MENUITEMS-1) {
glansberry 4:800a75ffea3c 29 item[num_menuitems] = item_p; //make a local copy of the item
glansberry 4:800a75ffea3c 30
glansberry 4:800a75ffea3c 31 MenuItem * active_item = &item[num_menuitems];
glansberry 4:800a75ffea3c 32 int item_data_start = active_item->name_len+ (LEVEL_INDENT * (active_item->level+1)) + DATA_GAP;
glansberry 0:907d2d5e77f7 33
glansberry 0:907d2d5e77f7 34 if (item_data_start > data_start_x) data_start_x = item_data_start; //keep track of length so we can put data after it
glansberry 0:907d2d5e77f7 35
glansberry 4:800a75ffea3c 36 if(active_item->type == heading) command_letter[num_menuitems]=0; //Headings don't get numbers
glansberry 0:907d2d5e77f7 37
glansberry 0:907d2d5e77f7 38 else {
glansberry 0:907d2d5e77f7 39
glansberry 4:800a75ffea3c 40 //Assign the command character for the menu item
glansberry 4:800a75ffea3c 41 if(active_item->level==1) //it gets an lower case letter
glansberry 0:907d2d5e77f7 42 {
glansberry 0:907d2d5e77f7 43 command_letter[num_menuitems] = ++max_lower_letter_cmd;
glansberry 0:907d2d5e77f7 44 }
glansberry 4:800a75ffea3c 45 else if(active_item->level==0) //it gets a number
glansberry 0:907d2d5e77f7 46 {
glansberry 0:907d2d5e77f7 47 command_letter[num_menuitems] = ++max_number_cmd;
glansberry 0:907d2d5e77f7 48 }
glansberry 0:907d2d5e77f7 49 else
glansberry 0:907d2d5e77f7 50 {
glansberry 0:907d2d5e77f7 51 command_letter[num_menuitems] = ++max_lower_letter_cmd;
glansberry 0:907d2d5e77f7 52 }
glansberry 0:907d2d5e77f7 53
glansberry 4:800a75ffea3c 54 }
glansberry 6:e992366d0684 55 //term->printf("Added menu item '%s' as index %d cmd %c to page %s\r\n", active_item->name, num_menuitems, command_letter[num_menuitems], name);
glansberry 6:e992366d0684 56 num_menuitems++;;
glansberry 0:907d2d5e77f7 57 }
glansberry 6:e992366d0684 58 else term->printf("Failed to add menu item #%d, '%s'\r\n", num_menuitems, item_p.name);
iillyyaa 3:f308cd7a34ed 59 return *this;
iillyyaa 3:f308cd7a34ed 60 }
glansberry 0:907d2d5e77f7 61
glansberry 0:907d2d5e77f7 62 void Page::display(void){
glansberry 6:e992366d0684 63 term->cls();
glansberry 6:e992366d0684 64 term->HideCursor();
glansberry 6:e992366d0684 65 term->locate(0,0);
glansberry 6:e992366d0684 66 term->printf("%s",name);
glansberry 0:907d2d5e77f7 67 int index;
glansberry 0:907d2d5e77f7 68
glansberry 0:907d2d5e77f7 69 for (index=0; index < num_menuitems; index++){
glansberry 6:e992366d0684 70 term->locate(LEVEL_INDENT*(item[index].level+1),index+ITEM_ROW_START);
glansberry 0:907d2d5e77f7 71
glansberry 0:907d2d5e77f7 72 //don't print command letter for messages without them
glansberry 6:e992366d0684 73 if(command_letter[index] != 0) term->printf("%c) ", command_letter[index]);
glansberry 0:907d2d5e77f7 74
glansberry 6:e992366d0684 75 term->printf("%s", item[index].name);
glansberry 0:907d2d5e77f7 76 }
glansberry 0:907d2d5e77f7 77
glansberry 0:907d2d5e77f7 78 index++; //add a space before the return line
glansberry 6:e992366d0684 79 term->locate(LEVEL_INDENT,index+ITEM_ROW_START);
glansberry 6:e992366d0684 80 term->printf("x) Back to previous page");
glansberry 0:907d2d5e77f7 81 update();
glansberry 0:907d2d5e77f7 82 }
glansberry 0:907d2d5e77f7 83 // Update the data on the Page
glansberry 0:907d2d5e77f7 84 void Page::update(void){
iillyyaa 3:f308cd7a34ed 85 char buf[32];
iillyyaa 3:f308cd7a34ed 86 for (int index=0; index < num_menuitems; index++){
iillyyaa 3:f308cd7a34ed 87 if(!item[index].action) continue;
glansberry 0:907d2d5e77f7 88
glansberry 6:e992366d0684 89 term->locate(data_start_x,index+ITEM_ROW_START);
iillyyaa 3:f308cd7a34ed 90 item[index].action->getString(buf, sizeof(buf));
glansberry 6:e992366d0684 91 term->printf("%s", buf);
iillyyaa 3:f308cd7a34ed 92 }
glansberry 1:c6deb449c132 93
glansberry 6:e992366d0684 94 term->HideCursor();
iillyyaa 3:f308cd7a34ed 95 }
glansberry 0:907d2d5e77f7 96