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

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