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
test_main.cpp@0:907d2d5e77f7, 2015-05-01 (annotated)
- Committer:
- glansberry
- Date:
- Fri May 01 03:56:34 2015 +0000
- Revision:
- 0:907d2d5e77f7
- Child:
- 6:e992366d0684
Planned Menu is constructed, needs callbacks
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
glansberry | 0:907d2d5e77f7 | 1 | #ifdef TEST //define test to make this an active main |
glansberry | 0:907d2d5e77f7 | 2 | #include <mbed.h> |
glansberry | 0:907d2d5e77f7 | 3 | #include "Terminal.h" |
glansberry | 0:907d2d5e77f7 | 4 | #include "SerialTerm.h" |
glansberry | 0:907d2d5e77f7 | 5 | #include "ASCIIGraph.h" |
glansberry | 0:907d2d5e77f7 | 6 | #include "testconsole.h" |
glansberry | 0:907d2d5e77f7 | 7 | #include "page.h" |
glansberry | 0:907d2d5e77f7 | 8 | #include "menuitem.h" |
glansberry | 0:907d2d5e77f7 | 9 | |
glansberry | 0:907d2d5e77f7 | 10 | Terminal term(SERIAL_TX, SERIAL_RX); |
glansberry | 0:907d2d5e77f7 | 11 | Ticker heartbeat; |
glansberry | 0:907d2d5e77f7 | 12 | |
glansberry | 0:907d2d5e77f7 | 13 | |
glansberry | 0:907d2d5e77f7 | 14 | volatile bool tick = false; // this is the primary flag that indicates that it is time to run the control loop |
glansberry | 0:907d2d5e77f7 | 15 | static int ERROR_Overrun = 0; //this counts the number of times that the code was still running when the interrupt tried to trigger it again (ie code is running too slow) |
glansberry | 0:907d2d5e77f7 | 16 | |
glansberry | 0:907d2d5e77f7 | 17 | /*********************************************************************************************** |
glansberry | 0:907d2d5e77f7 | 18 | * \brief Interrupt for the main loop timer |
glansberry | 0:907d2d5e77f7 | 19 | * |
glansberry | 0:907d2d5e77f7 | 20 | **********************************************************************************************/ |
glansberry | 0:907d2d5e77f7 | 21 | void tick_int() { |
glansberry | 0:907d2d5e77f7 | 22 | if (!tick) tick = true; //detect if interrupt has not yet finished |
glansberry | 0:907d2d5e77f7 | 23 | else ERROR_Overrun++ ; |
glansberry | 0:907d2d5e77f7 | 24 | } |
glansberry | 0:907d2d5e77f7 | 25 | |
glansberry | 0:907d2d5e77f7 | 26 | //prototype callback for the menu system, if the command key has been pressed, then cmd is true |
glansberry | 0:907d2d5e77f7 | 27 | //otherwise it should simple return a string that gets printed |
glansberry | 0:907d2d5e77f7 | 28 | char * test_callback(bool cmd){ |
glansberry | 0:907d2d5e77f7 | 29 | |
glansberry | 0:907d2d5e77f7 | 30 | static int i; |
glansberry | 0:907d2d5e77f7 | 31 | static bool count = true; |
glansberry | 0:907d2d5e77f7 | 32 | static char buffer[20]; |
glansberry | 0:907d2d5e77f7 | 33 | |
glansberry | 0:907d2d5e77f7 | 34 | if(cmd) { |
glansberry | 0:907d2d5e77f7 | 35 | term.locate(TERM_LOC_DEBUG); |
glansberry | 0:907d2d5e77f7 | 36 | term.printf("test_callback"); |
glansberry | 0:907d2d5e77f7 | 37 | } |
glansberry | 0:907d2d5e77f7 | 38 | if(cmd) count = !count; |
glansberry | 0:907d2d5e77f7 | 39 | |
glansberry | 0:907d2d5e77f7 | 40 | if(count) i++; |
glansberry | 0:907d2d5e77f7 | 41 | |
glansberry | 0:907d2d5e77f7 | 42 | sprintf(buffer, "%d", i); |
glansberry | 0:907d2d5e77f7 | 43 | return buffer; |
glansberry | 0:907d2d5e77f7 | 44 | } |
glansberry | 0:907d2d5e77f7 | 45 | |
glansberry | 0:907d2d5e77f7 | 46 | char * null_callback(bool cmd){ |
glansberry | 0:907d2d5e77f7 | 47 | |
glansberry | 0:907d2d5e77f7 | 48 | return NULL; |
glansberry | 0:907d2d5e77f7 | 49 | } |
glansberry | 0:907d2d5e77f7 | 50 | |
glansberry | 0:907d2d5e77f7 | 51 | |
glansberry | 0:907d2d5e77f7 | 52 | int main(void){ |
glansberry | 0:907d2d5e77f7 | 53 | |
glansberry | 0:907d2d5e77f7 | 54 | term.baud(115200); |
glansberry | 0:907d2d5e77f7 | 55 | |
glansberry | 0:907d2d5e77f7 | 56 | //create the Pages for the console |
glansberry | 0:907d2d5e77f7 | 57 | // term.printf("\nsizeof page %d, menuitem %d\n",sizeof(Page), sizeof(MenuItem)); |
glansberry | 0:907d2d5e77f7 | 58 | TestConsole console("Test Program"); |
glansberry | 0:907d2d5e77f7 | 59 | |
glansberry | 0:907d2d5e77f7 | 60 | Page &pageHome = console.add_page(Page("Home")); |
glansberry | 0:907d2d5e77f7 | 61 | Page &pagePower = console.add_page(Page("Page1")); |
glansberry | 0:907d2d5e77f7 | 62 | Page &pageBattery = console.add_page(Page("Page2")); |
glansberry | 0:907d2d5e77f7 | 63 | Page &pageAccel = console.add_page(Page("Page3")); |
glansberry | 0:907d2d5e77f7 | 64 | |
glansberry | 0:907d2d5e77f7 | 65 | // pageHome.add_item(MenuItem(pagePower.Name, &pagePower.set_active(), 0, menu)); |
glansberry | 0:907d2d5e77f7 | 66 | #define CREATE_PAGE_SELECT_MENU_ITEM(x) add_item(MenuItem(x.Name, x.page_num)); |
glansberry | 0:907d2d5e77f7 | 67 | pageHome.CREATE_PAGE_SELECT_MENU_ITEM(pagePower); |
glansberry | 0:907d2d5e77f7 | 68 | pageHome.CREATE_PAGE_SELECT_MENU_ITEM(pageBattery); |
glansberry | 0:907d2d5e77f7 | 69 | pageHome.CREATE_PAGE_SELECT_MENU_ITEM(pageAccel); |
glansberry | 0:907d2d5e77f7 | 70 | |
glansberry | 0:907d2d5e77f7 | 71 | |
glansberry | 0:907d2d5e77f7 | 72 | pagePower.add_item(MenuItem("Display", NULL, 0, heading)); |
glansberry | 0:907d2d5e77f7 | 73 | pagePower.add_item(MenuItem("Eject Button Status", test_callback, 0, display)); |
glansberry | 0:907d2d5e77f7 | 74 | |
glansberry | 0:907d2d5e77f7 | 75 | pageBattery.add_item(MenuItem("Display", NULL, 0, heading)); |
glansberry | 0:907d2d5e77f7 | 76 | pageBattery.add_item(MenuItem("Battery Voltage", test_callback, 0, display)); |
glansberry | 0:907d2d5e77f7 | 77 | |
glansberry | 0:907d2d5e77f7 | 78 | pageAccel.add_item(MenuItem("Display", NULL, 0, heading)); |
glansberry | 0:907d2d5e77f7 | 79 | pageAccel.add_item(MenuItem("Battery Voltage", test_callback, 0, display)); |
glansberry | 0:907d2d5e77f7 | 80 | |
glansberry | 0:907d2d5e77f7 | 81 | |
glansberry | 0:907d2d5e77f7 | 82 | heartbeat.attach(&tick_int, 0.1); // the address of the function to be attached (tick_int) and the interval 10000uS |
glansberry | 0:907d2d5e77f7 | 83 | |
glansberry | 0:907d2d5e77f7 | 84 | |
glansberry | 0:907d2d5e77f7 | 85 | wait(2); //give the man a chance to read the messages, if any |
glansberry | 0:907d2d5e77f7 | 86 | |
glansberry | 0:907d2d5e77f7 | 87 | |
glansberry | 0:907d2d5e77f7 | 88 | while(1) { |
glansberry | 0:907d2d5e77f7 | 89 | while(tick){ //put real-time code in here |
glansberry | 0:907d2d5e77f7 | 90 | |
glansberry | 0:907d2d5e77f7 | 91 | console.tick(); |
glansberry | 0:907d2d5e77f7 | 92 | |
glansberry | 0:907d2d5e77f7 | 93 | tick=false; //keep this as the last item in the while loop |
glansberry | 0:907d2d5e77f7 | 94 | |
glansberry | 0:907d2d5e77f7 | 95 | } |
glansberry | 0:907d2d5e77f7 | 96 | |
glansberry | 0:907d2d5e77f7 | 97 | } |
glansberry | 0:907d2d5e77f7 | 98 | |
glansberry | 0:907d2d5e77f7 | 99 | } |
glansberry | 0:907d2d5e77f7 | 100 | |
glansberry | 0:907d2d5e77f7 | 101 | #endif |