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 May 01 03:56:34 2015 +0000
Revision:
0:907d2d5e77f7
Child:
1:c6deb449c132
Planned Menu is constructed,  needs callbacks

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