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@9:b1fdd7ea6f72, 2015-07-24 (annotated)
- Committer:
- glansberry
- Date:
- Fri Jul 24 22:18:19 2015 +0000
- Revision:
- 9:b1fdd7ea6f72
- Parent:
- 7:903c8e16ed25
Fixed bug is choosing the first page.
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 | 6:e992366d0684 | 3 | TestConsole::TestConsole(const char * name_p, PinName tx, PinName rx, int baud_rate): |
glansberry | 6:e992366d0684 | 4 | term(tx, rx), |
glansberry | 6:e992366d0684 | 5 | name(name_p), |
glansberry | 0:907d2d5e77f7 | 6 | num_pages(0), |
glansberry | 0:907d2d5e77f7 | 7 | current_page(0) |
glansberry | 0:907d2d5e77f7 | 8 | { |
glansberry | 6:e992366d0684 | 9 | term.baud(baud_rate); |
glansberry | 6:e992366d0684 | 10 | // term.printf("TestConsole::TestConsole('%')\r\n",name); |
glansberry | 1:c6deb449c132 | 11 | term.HideCursor(); |
glansberry | 9:b1fdd7ea6f72 | 12 | for(int i = 0; i < MAX_PAGES; i++) page[i] = NULL; //init all pages to NULL |
glansberry | 9:b1fdd7ea6f72 | 13 | active_page = page[current_page]; |
glansberry | 1:c6deb449c132 | 14 | |
glansberry | 0:907d2d5e77f7 | 15 | } |
glansberry | 0:907d2d5e77f7 | 16 | |
glansberry | 6:e992366d0684 | 17 | //Page& TestConsole::add_page(Page const &page_p){ |
glansberry | 6:e992366d0684 | 18 | Page* TestConsole::add_page(const char * name_p){ |
glansberry | 6:e992366d0684 | 19 | if(num_pages >= MAX_PAGES) |
glansberry | 6:e992366d0684 | 20 | { |
glansberry | 6:e992366d0684 | 21 | term.printf("MAX_PAGES Exceeded adding'%s'\r\n", name_p); |
glansberry | 6:e992366d0684 | 22 | return NULL; //return valid reference to home page on |
glansberry | 6:e992366d0684 | 23 | |
glansberry | 6:e992366d0684 | 24 | } |
glansberry | 6:e992366d0684 | 25 | |
glansberry | 6:e992366d0684 | 26 | page[num_pages] = new Page(name_p, &term); |
glansberry | 6:e992366d0684 | 27 | Page* this_page = page[num_pages]; |
glansberry | 6:e992366d0684 | 28 | this_page->page_num = num_pages; //let the page know what number it is to help with lookups |
glansberry | 0:907d2d5e77f7 | 29 | |
glansberry | 0:907d2d5e77f7 | 30 | if(num_pages == 0) { //if this is the first page, set it active |
glansberry | 6:e992366d0684 | 31 | this_page->set_active(); |
glansberry | 0:907d2d5e77f7 | 32 | } |
glansberry | 6:e992366d0684 | 33 | //term.printf("Added page '%s'\r\n", this_page->name); |
glansberry | 6:e992366d0684 | 34 | num_pages++; |
glansberry | 6:e992366d0684 | 35 | return this_page; |
glansberry | 0:907d2d5e77f7 | 36 | |
glansberry | 0:907d2d5e77f7 | 37 | } |
glansberry | 0:907d2d5e77f7 | 38 | |
glansberry | 0:907d2d5e77f7 | 39 | int TestConsole::page_change(int new_page){ |
glansberry | 6:e992366d0684 | 40 | if(NULL == page[current_page]) { |
glansberry | 6:e992366d0684 | 41 | term.printf("invalid page passed to page_chage\r\n"); |
glansberry | 6:e992366d0684 | 42 | return current_page; |
glansberry | 6:e992366d0684 | 43 | } |
glansberry | 0:907d2d5e77f7 | 44 | previous_page = current_page; //save a copy of the page so we can go back |
glansberry | 0:907d2d5e77f7 | 45 | current_page = new_page; |
glansberry | 6:e992366d0684 | 46 | active_page = page[current_page]; |
glansberry | 6:e992366d0684 | 47 | |
glansberry | 6:e992366d0684 | 48 | active_page->display(); |
glansberry | 0:907d2d5e77f7 | 49 | |
glansberry | 6:e992366d0684 | 50 | active_page->ack_active(); |
glansberry | 7:903c8e16ed25 | 51 | |
glansberry | 7:903c8e16ed25 | 52 | term.locate((TERMINAL_WIDTH - strlen(name))/2, 0); |
glansberry | 7:903c8e16ed25 | 53 | term.printf("%s", name); |
glansberry | 7:903c8e16ed25 | 54 | |
glansberry | 0:907d2d5e77f7 | 55 | return current_page; |
glansberry | 0:907d2d5e77f7 | 56 | } |
glansberry | 0:907d2d5e77f7 | 57 | |
glansberry | 0:907d2d5e77f7 | 58 | //here, using knowledge of the page, we process commands |
glansberry | 0:907d2d5e77f7 | 59 | int TestConsole::process_cmd(char cmd){ |
iillyyaa | 3:f308cd7a34ed | 60 | if('x' == cmd) { |
iillyyaa | 3:f308cd7a34ed | 61 | page_change(previous_page); |
iillyyaa | 3:f308cd7a34ed | 62 | return 0; |
iillyyaa | 3:f308cd7a34ed | 63 | } |
glansberry | 7:903c8e16ed25 | 64 | |
glansberry | 7:903c8e16ed25 | 65 | if('\r' == cmd) { //refresh the page on enter |
glansberry | 7:903c8e16ed25 | 66 | active_page->set_active(); |
glansberry | 7:903c8e16ed25 | 67 | } |
glansberry | 7:903c8e16ed25 | 68 | |
iillyyaa | 3:f308cd7a34ed | 69 | for(int index=0; index < active_page->num_menuitems; index++) { |
iillyyaa | 3:f308cd7a34ed | 70 | MenuItem *item = &active_page->item[index]; |
iillyyaa | 3:f308cd7a34ed | 71 | if(active_page->command_letter[index] != cmd) continue; |
glansberry | 0:907d2d5e77f7 | 72 | |
iillyyaa | 3:f308cd7a34ed | 73 | if(item->type == menu) { |
iillyyaa | 3:f308cd7a34ed | 74 | // for menuitems that goto other menus, just change the page |
iillyyaa | 3:f308cd7a34ed | 75 | page_change(item->target_page); |
iillyyaa | 3:f308cd7a34ed | 76 | } else if(item->action) { |
iillyyaa | 3:f308cd7a34ed | 77 | // otherwise call the callaback |
iillyyaa | 3:f308cd7a34ed | 78 | item->action->doAction(); |
glansberry | 0:907d2d5e77f7 | 79 | } |
iillyyaa | 3:f308cd7a34ed | 80 | return 0; |
iillyyaa | 3:f308cd7a34ed | 81 | } |
iillyyaa | 3:f308cd7a34ed | 82 | |
glansberry | 0:907d2d5e77f7 | 83 | return 1; |
iillyyaa | 3:f308cd7a34ed | 84 | } |
glansberry | 0:907d2d5e77f7 | 85 | |
glansberry | 0:907d2d5e77f7 | 86 | int TestConsole::tick(void){ |
glansberry | 0:907d2d5e77f7 | 87 | if (term.readable()){ //if there is a character |
glansberry | 0:907d2d5e77f7 | 88 | if(process_cmd(term.getc())){ |
glansberry | 0:907d2d5e77f7 | 89 | term.locate(TERM_LOC_FEEDBACK); |
glansberry | 0:907d2d5e77f7 | 90 | term.printf("invalid command"); |
glansberry | 0:907d2d5e77f7 | 91 | } |
glansberry | 0:907d2d5e77f7 | 92 | } |
glansberry | 0:907d2d5e77f7 | 93 | |
glansberry | 7:903c8e16ed25 | 94 | //go through the list of pages, and see if any are set to become active |
glansberry | 6:e992366d0684 | 95 | for(int index=0; index < num_pages; index++){ |
glansberry | 9:b1fdd7ea6f72 | 96 | if(page[index]->check_active()){ |
glansberry | 6:e992366d0684 | 97 | page_change(index); |
glansberry | 6:e992366d0684 | 98 | } |
glansberry | 0:907d2d5e77f7 | 99 | } |
glansberry | 0:907d2d5e77f7 | 100 | |
glansberry | 9:b1fdd7ea6f72 | 101 | if(active_page != NULL) |
glansberry | 9:b1fdd7ea6f72 | 102 | { |
glansberry | 9:b1fdd7ea6f72 | 103 | active_page->update(); |
glansberry | 9:b1fdd7ea6f72 | 104 | } else |
glansberry | 9:b1fdd7ea6f72 | 105 | { |
glansberry | 9:b1fdd7ea6f72 | 106 | term.printf("invalid page %p", active_page); |
glansberry | 9:b1fdd7ea6f72 | 107 | } |
glansberry | 0:907d2d5e77f7 | 108 | return 0; |
glansberry | 0:907d2d5e77f7 | 109 | } |