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
testconsole.cpp@2:399e080c4909, 2015-05-01 (annotated)
- Committer:
- glansberry
- Date:
- Fri May 01 13:34:09 2015 +0000
- Revision:
- 2:399e080c4909
- Parent:
- 1:c6deb449c132
- Child:
- 3:f308cd7a34ed
Updates for bug fixes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
glansberry | 0:907d2d5e77f7 | 1 | #include "testconsole.h" |
glansberry | 0:907d2d5e77f7 | 2 | |
glansberry | 0:907d2d5e77f7 | 3 | TestConsole::TestConsole(const char * Name_p): |
glansberry | 0:907d2d5e77f7 | 4 | Name(Name_p), |
glansberry | 0:907d2d5e77f7 | 5 | num_pages(0), |
glansberry | 0:907d2d5e77f7 | 6 | current_page(0) |
glansberry | 0:907d2d5e77f7 | 7 | { |
glansberry | 0:907d2d5e77f7 | 8 | |
glansberry | 1:c6deb449c132 | 9 | // term.printf("TestConsole::TestConsole('%')\n",Name); |
glansberry | 1:c6deb449c132 | 10 | term.HideCursor(); |
glansberry | 0:907d2d5e77f7 | 11 | page_change(current_page); |
glansberry | 1:c6deb449c132 | 12 | |
glansberry | 0:907d2d5e77f7 | 13 | } |
glansberry | 0:907d2d5e77f7 | 14 | |
glansberry | 0:907d2d5e77f7 | 15 | Page& TestConsole::add_page(Page const &page_p){ |
glansberry | 0:907d2d5e77f7 | 16 | term.printf("TestConsole::add_page\n"); |
glansberry | 0:907d2d5e77f7 | 17 | if(num_pages < MAX_PAGES) { |
glansberry | 0:907d2d5e77f7 | 18 | page[num_pages] = page_p; |
glansberry | 0:907d2d5e77f7 | 19 | page[num_pages].page_num = num_pages; //let the page know what number it is to help with lookups |
glansberry | 0:907d2d5e77f7 | 20 | |
glansberry | 0:907d2d5e77f7 | 21 | if(num_pages == 0) { //if this is the first page, set it active |
glansberry | 0:907d2d5e77f7 | 22 | page[num_pages].set_active(); |
glansberry | 0:907d2d5e77f7 | 23 | } |
glansberry | 0:907d2d5e77f7 | 24 | term.printf("Added page '%s'\n", page[num_pages].Name); |
glansberry | 0:907d2d5e77f7 | 25 | return page[num_pages++]; |
glansberry | 0:907d2d5e77f7 | 26 | } |
glansberry | 0:907d2d5e77f7 | 27 | |
glansberry | 0:907d2d5e77f7 | 28 | term.printf("Failed to add page'%s'\n", page_p.Name); |
glansberry | 0:907d2d5e77f7 | 29 | return page[MAX_PAGES-1]; //return 0 if no error |
glansberry | 0:907d2d5e77f7 | 30 | |
glansberry | 0:907d2d5e77f7 | 31 | } |
glansberry | 0:907d2d5e77f7 | 32 | |
glansberry | 0:907d2d5e77f7 | 33 | int TestConsole::page_change(int new_page){ |
glansberry | 0:907d2d5e77f7 | 34 | previous_page = current_page; //save a copy of the page so we can go back |
glansberry | 0:907d2d5e77f7 | 35 | current_page = new_page; |
glansberry | 0:907d2d5e77f7 | 36 | page[current_page].display(); |
glansberry | 0:907d2d5e77f7 | 37 | |
glansberry | 0:907d2d5e77f7 | 38 | page[current_page].ack_active(); |
glansberry | 0:907d2d5e77f7 | 39 | return current_page; |
glansberry | 0:907d2d5e77f7 | 40 | } |
glansberry | 0:907d2d5e77f7 | 41 | |
glansberry | 0:907d2d5e77f7 | 42 | //here, using knowledge of the page, we process commands |
glansberry | 0:907d2d5e77f7 | 43 | int TestConsole::process_cmd(char cmd){ |
glansberry | 0:907d2d5e77f7 | 44 | |
glansberry | 0:907d2d5e77f7 | 45 | |
glansberry | 2:399e080c4909 | 46 | if('x' == cmd) { |
glansberry | 2:399e080c4909 | 47 | page_change(previous_page); |
glansberry | 2:399e080c4909 | 48 | return 0; |
glansberry | 2:399e080c4909 | 49 | } |
glansberry | 2:399e080c4909 | 50 | |
glansberry | 2:399e080c4909 | 51 | for(int index=0; index < page[current_page].num_menuitems; index++){ |
glansberry | 2:399e080c4909 | 52 | |
glansberry | 0:907d2d5e77f7 | 53 | |
glansberry | 0:907d2d5e77f7 | 54 | if(page[current_page].command_letter[index] == cmd) { |
glansberry | 0:907d2d5e77f7 | 55 | |
glansberry | 0:907d2d5e77f7 | 56 | //for menuitems that goto other menus, just change the page |
glansberry | 0:907d2d5e77f7 | 57 | if(page[current_page].item[index].type == menu) { |
glansberry | 0:907d2d5e77f7 | 58 | page_change(page[current_page].item[index].target_page); |
glansberry | 0:907d2d5e77f7 | 59 | return 0; |
glansberry | 0:907d2d5e77f7 | 60 | } |
glansberry | 0:907d2d5e77f7 | 61 | |
glansberry | 0:907d2d5e77f7 | 62 | //otherwise call the callaback |
glansberry | 0:907d2d5e77f7 | 63 | page[current_page].item[index].callback(true); |
glansberry | 0:907d2d5e77f7 | 64 | return 0; |
glansberry | 0:907d2d5e77f7 | 65 | } |
glansberry | 0:907d2d5e77f7 | 66 | } |
glansberry | 0:907d2d5e77f7 | 67 | |
glansberry | 0:907d2d5e77f7 | 68 | return 1; |
glansberry | 0:907d2d5e77f7 | 69 | } |
glansberry | 0:907d2d5e77f7 | 70 | |
glansberry | 0:907d2d5e77f7 | 71 | int TestConsole::tick(void){ |
glansberry | 0:907d2d5e77f7 | 72 | if (term.readable()){ //if there is a character |
glansberry | 0:907d2d5e77f7 | 73 | if(process_cmd(term.getc())){ |
glansberry | 0:907d2d5e77f7 | 74 | term.locate(TERM_LOC_FEEDBACK); |
glansberry | 0:907d2d5e77f7 | 75 | term.printf("invalid command"); |
glansberry | 0:907d2d5e77f7 | 76 | } |
glansberry | 0:907d2d5e77f7 | 77 | } |
glansberry | 0:907d2d5e77f7 | 78 | |
glansberry | 0:907d2d5e77f7 | 79 | //go through the list of pages, and see if any want to become active |
glansberry | 0:907d2d5e77f7 | 80 | for(int index=0; index < page[current_page].num_menuitems; index++){ |
glansberry | 0:907d2d5e77f7 | 81 | if(page[index].check_active()) page_change(index); |
glansberry | 0:907d2d5e77f7 | 82 | } |
glansberry | 0:907d2d5e77f7 | 83 | |
glansberry | 0:907d2d5e77f7 | 84 | |
glansberry | 0:907d2d5e77f7 | 85 | page[current_page].update(); |
glansberry | 0:907d2d5e77f7 | 86 | return 0; |
glansberry | 0:907d2d5e77f7 | 87 | } |