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 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?

UserRevisionLine numberNew 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 }