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 13:34:09 2015 +0000
Revision:
2:399e080c4909
Parent:
1:c6deb449c132
Child:
3:f308cd7a34ed
Updates for bug fixes

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){
glansberry 0:907d2d5e77f7 44
glansberry 0:907d2d5e77f7 45
glansberry 2:399e080c4909 46 if('x' == cmd) {
glansberry 2:399e080c4909 47 page_change(previous_page);
glansberry 2:399e080c4909 48 return 0;
glansberry 2:399e080c4909 49 }
glansberry 2:399e080c4909 50
glansberry 2:399e080c4909 51 for(int index=0; index < page[current_page].num_menuitems; index++){
glansberry 2:399e080c4909 52
glansberry 0:907d2d5e77f7 53
glansberry 0:907d2d5e77f7 54 if(page[current_page].command_letter[index] == cmd) {
glansberry 0:907d2d5e77f7 55
glansberry 0:907d2d5e77f7 56 //for menuitems that goto other menus, just change the page
glansberry 0:907d2d5e77f7 57 if(page[current_page].item[index].type == menu) {
glansberry 0:907d2d5e77f7 58 page_change(page[current_page].item[index].target_page);
glansberry 0:907d2d5e77f7 59 return 0;
glansberry 0:907d2d5e77f7 60 }
glansberry 0:907d2d5e77f7 61
glansberry 0:907d2d5e77f7 62 //otherwise call the callaback
glansberry 0:907d2d5e77f7 63 page[current_page].item[index].callback(true);
glansberry 0:907d2d5e77f7 64 return 0;
glansberry 0:907d2d5e77f7 65 }
glansberry 0:907d2d5e77f7 66 }
glansberry 0:907d2d5e77f7 67
glansberry 0:907d2d5e77f7 68 return 1;
glansberry 0:907d2d5e77f7 69 }
glansberry 0:907d2d5e77f7 70
glansberry 0:907d2d5e77f7 71 int TestConsole::tick(void){
glansberry 0:907d2d5e77f7 72 if (term.readable()){ //if there is a character
glansberry 0:907d2d5e77f7 73 if(process_cmd(term.getc())){
glansberry 0:907d2d5e77f7 74 term.locate(TERM_LOC_FEEDBACK);
glansberry 0:907d2d5e77f7 75 term.printf("invalid command");
glansberry 0:907d2d5e77f7 76 }
glansberry 0:907d2d5e77f7 77 }
glansberry 0:907d2d5e77f7 78
glansberry 0:907d2d5e77f7 79 //go through the list of pages, and see if any want to become active
glansberry 0:907d2d5e77f7 80 for(int index=0; index < page[current_page].num_menuitems; index++){
glansberry 0:907d2d5e77f7 81 if(page[index].check_active()) page_change(index);
glansberry 0:907d2d5e77f7 82 }
glansberry 0:907d2d5e77f7 83
glansberry 0:907d2d5e77f7 84
glansberry 0:907d2d5e77f7 85 page[current_page].update();
glansberry 0:907d2d5e77f7 86 return 0;
glansberry 0:907d2d5e77f7 87 }