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
page.cpp@4:800a75ffea3c, 2015-05-01 (annotated)
- 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?
User | Revision | Line number | New 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 |