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 May 01 16:12:44 2015 +0000
Revision:
4:800a75ffea3c
Parent:
3:f308cd7a34ed
Child:
6:e992366d0684
Builds and runs toggling IO on Nucleo Board

Who changed what in which revision?

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