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@3:f308cd7a34ed, 2015-05-01 (annotated)
- Committer:
- iillyyaa
- Date:
- Fri May 01 15:08:49 2015 +0000
- Revision:
- 3:f308cd7a34ed
- Parent:
- 2:399e080c4909
- Child:
- 6:e992366d0684
Next pass at menu population;
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){ |
iillyyaa | 3:f308cd7a34ed | 44 | if('x' == cmd) { |
iillyyaa | 3:f308cd7a34ed | 45 | page_change(previous_page); |
iillyyaa | 3:f308cd7a34ed | 46 | return 0; |
iillyyaa | 3:f308cd7a34ed | 47 | } |
iillyyaa | 3:f308cd7a34ed | 48 | Page* active_page = &page[current_page]; |
iillyyaa | 3:f308cd7a34ed | 49 | for(int index=0; index < active_page->num_menuitems; index++) { |
iillyyaa | 3:f308cd7a34ed | 50 | MenuItem *item = &active_page->item[index]; |
iillyyaa | 3:f308cd7a34ed | 51 | if(active_page->command_letter[index] != cmd) continue; |
glansberry | 0:907d2d5e77f7 | 52 | |
iillyyaa | 3:f308cd7a34ed | 53 | if(item->type == menu) { |
iillyyaa | 3:f308cd7a34ed | 54 | // for menuitems that goto other menus, just change the page |
iillyyaa | 3:f308cd7a34ed | 55 | page_change(item->target_page); |
iillyyaa | 3:f308cd7a34ed | 56 | } else if(item->action) { |
iillyyaa | 3:f308cd7a34ed | 57 | // otherwise call the callaback |
iillyyaa | 3:f308cd7a34ed | 58 | item->action->doAction(); |
glansberry | 0:907d2d5e77f7 | 59 | } |
iillyyaa | 3:f308cd7a34ed | 60 | return 0; |
iillyyaa | 3:f308cd7a34ed | 61 | } |
iillyyaa | 3:f308cd7a34ed | 62 | |
glansberry | 0:907d2d5e77f7 | 63 | return 1; |
iillyyaa | 3:f308cd7a34ed | 64 | } |
glansberry | 0:907d2d5e77f7 | 65 | |
glansberry | 0:907d2d5e77f7 | 66 | int TestConsole::tick(void){ |
glansberry | 0:907d2d5e77f7 | 67 | if (term.readable()){ //if there is a character |
glansberry | 0:907d2d5e77f7 | 68 | if(process_cmd(term.getc())){ |
glansberry | 0:907d2d5e77f7 | 69 | term.locate(TERM_LOC_FEEDBACK); |
glansberry | 0:907d2d5e77f7 | 70 | term.printf("invalid command"); |
glansberry | 0:907d2d5e77f7 | 71 | } |
glansberry | 0:907d2d5e77f7 | 72 | } |
glansberry | 0:907d2d5e77f7 | 73 | |
glansberry | 0:907d2d5e77f7 | 74 | //go through the list of pages, and see if any want to become active |
glansberry | 0:907d2d5e77f7 | 75 | for(int index=0; index < page[current_page].num_menuitems; index++){ |
glansberry | 0:907d2d5e77f7 | 76 | if(page[index].check_active()) page_change(index); |
glansberry | 0:907d2d5e77f7 | 77 | } |
glansberry | 0:907d2d5e77f7 | 78 | |
glansberry | 0:907d2d5e77f7 | 79 | |
glansberry | 0:907d2d5e77f7 | 80 | page[current_page].update(); |
glansberry | 0:907d2d5e77f7 | 81 | return 0; |
glansberry | 0:907d2d5e77f7 | 82 | } |