Demo of the Cmdb Command Interpreter. Replaces the old cmbd demo as it had name clashes on this website.
main.cpp@2:75de65a8711a, 2022-01-19 (annotated)
- Committer:
- wvd_vegt
- Date:
- Wed Jan 19 12:34:50 2022 +0000
- Revision:
- 2:75de65a8711a
- Parent:
- 1:4e699312b5c8
Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wvd_vegt | 0:7b62ec9a3f53 | 1 | #include <vector> |
wvd_vegt | 0:7b62ec9a3f53 | 2 | |
wvd_vegt | 0:7b62ec9a3f53 | 3 | #include "mbed.h" |
wvd_vegt | 0:7b62ec9a3f53 | 4 | #include "cmdb.h" |
wvd_vegt | 0:7b62ec9a3f53 | 5 | |
wvd_vegt | 0:7b62ec9a3f53 | 6 | DigitalOut myled(LED1); |
wvd_vegt | 0:7b62ec9a3f53 | 7 | |
wvd_vegt | 0:7b62ec9a3f53 | 8 | //We'll be using the Usb Serial port |
wvd_vegt | 0:7b62ec9a3f53 | 9 | Serial serial(USBTX, USBRX); //tx, rx |
wvd_vegt | 0:7b62ec9a3f53 | 10 | |
wvd_vegt | 1:4e699312b5c8 | 11 | #define CID_TEST (int)1 |
wvd_vegt | 1:4e699312b5c8 | 12 | #define CID_INT (int)2 |
wvd_vegt | 0:7b62ec9a3f53 | 13 | |
wvd_vegt | 0:7b62ec9a3f53 | 14 | /** Sample User Command Dispatcher. |
wvd_vegt | 0:7b62ec9a3f53 | 15 | * |
wvd_vegt | 0:7b62ec9a3f53 | 16 | * @parm cmdb the command interpreter object. |
wvd_vegt | 0:7b62ec9a3f53 | 17 | * @parm cid the command id. |
wvd_vegt | 0:7b62ec9a3f53 | 18 | */ |
wvd_vegt | 0:7b62ec9a3f53 | 19 | void my_dispatcher(Cmdb& cmdb, int cid) { |
wvd_vegt | 0:7b62ec9a3f53 | 20 | cmdb.printf("my_dispatcher: cid=%d\r\n", cid); |
wvd_vegt | 0:7b62ec9a3f53 | 21 | |
wvd_vegt | 0:7b62ec9a3f53 | 22 | switch (cid) { |
wvd_vegt | 0:7b62ec9a3f53 | 23 | case CID_INT : |
wvd_vegt | 0:7b62ec9a3f53 | 24 | cmdb.printf("my_dispatcher: parm 0=%d\r\n",cmdb.INTPARM(0)); |
wvd_vegt | 0:7b62ec9a3f53 | 25 | break; |
wvd_vegt | 0:7b62ec9a3f53 | 26 | } |
wvd_vegt | 0:7b62ec9a3f53 | 27 | } |
wvd_vegt | 0:7b62ec9a3f53 | 28 | |
wvd_vegt | 1:4e699312b5c8 | 29 | static const cmd c1 = {"Test",SUBSYSTEM,CID_TEST,"" ,"* Test Subsystem"}; |
wvd_vegt | 1:4e699312b5c8 | 30 | static const cmd c2 = {"Int" ,CID_TEST ,CID_INT ,"%i","* Int as parameter" ,"dummy"}; |
wvd_vegt | 0:7b62ec9a3f53 | 31 | |
wvd_vegt | 0:7b62ec9a3f53 | 32 | int main() { |
wvd_vegt | 0:7b62ec9a3f53 | 33 | // Set the Baudrate. |
wvd_vegt | 0:7b62ec9a3f53 | 34 | serial.baud(115200); |
wvd_vegt | 0:7b62ec9a3f53 | 35 | |
wvd_vegt | 0:7b62ec9a3f53 | 36 | // Test the serial connection by |
wvd_vegt | 0:7b62ec9a3f53 | 37 | serial.printf("\r\n\r\nCmdb Command Interpreter Demo Version %0.2f.\r\n\r\n", Cmdb::version()); |
wvd_vegt | 0:7b62ec9a3f53 | 38 | |
wvd_vegt | 0:7b62ec9a3f53 | 39 | //Create a Command Table Vector. |
wvd_vegt | 0:7b62ec9a3f53 | 40 | std::vector<cmd> cmds; |
wvd_vegt | 0:7b62ec9a3f53 | 41 | |
wvd_vegt | 0:7b62ec9a3f53 | 42 | //Add some of our own first... |
wvd_vegt | 0:7b62ec9a3f53 | 43 | cmds.push_back(c1); //Test Subsystem is handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 44 | cmds.push_back(c2); //The Int Command is handled by our 'my_dispatcher' method. |
wvd_vegt | 0:7b62ec9a3f53 | 45 | |
wvd_vegt | 0:7b62ec9a3f53 | 46 | //Add some predefined... |
wvd_vegt | 0:7b62ec9a3f53 | 47 | cmds.push_back(COMMANDS); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 48 | cmds.push_back(BOOT); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 49 | |
wvd_vegt | 0:7b62ec9a3f53 | 50 | cmds.push_back(ECHO); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 51 | cmds.push_back(BOLD); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 52 | cmds.push_back(CLS); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 53 | |
wvd_vegt | 0:7b62ec9a3f53 | 54 | cmds.push_back(MACRO); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 55 | cmds.push_back(RUN); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 56 | cmds.push_back(MACROS); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 57 | |
wvd_vegt | 0:7b62ec9a3f53 | 58 | //Add some predefined and mandatory... |
wvd_vegt | 0:7b62ec9a3f53 | 59 | cmds.push_back(IDLE); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 60 | cmds.push_back(HELP); //Handled by Cmdb internally. |
wvd_vegt | 0:7b62ec9a3f53 | 61 | |
wvd_vegt | 0:7b62ec9a3f53 | 62 | //Create and initialize the Command Interpreter. |
wvd_vegt | 0:7b62ec9a3f53 | 63 | Cmdb cmdb(serial, cmds, &my_dispatcher); |
wvd_vegt | 0:7b62ec9a3f53 | 64 | |
wvd_vegt | 1:4e699312b5c8 | 65 | cmdb.printf("%d=%d\r\n",cmds[0].subs,cmds[0].cid); |
wvd_vegt | 1:4e699312b5c8 | 66 | cmdb.printf("%d=%d\r\n",cmds[1].subs,cmds[1].cid); |
wvd_vegt | 1:4e699312b5c8 | 67 | |
wvd_vegt | 0:7b62ec9a3f53 | 68 | while (1) { |
wvd_vegt | 0:7b62ec9a3f53 | 69 | //Check for input... |
wvd_vegt | 0:7b62ec9a3f53 | 70 | if (cmdb.hasnext()==true) { |
wvd_vegt | 0:7b62ec9a3f53 | 71 | |
wvd_vegt | 0:7b62ec9a3f53 | 72 | //Supply input to Command Interpreter |
wvd_vegt | 0:7b62ec9a3f53 | 73 | if (cmdb.scan(cmdb.next())) { |
wvd_vegt | 0:7b62ec9a3f53 | 74 | |
wvd_vegt | 0:7b62ec9a3f53 | 75 | //Flash led when a command has been parsed and dispatched. |
wvd_vegt | 0:7b62ec9a3f53 | 76 | myled = 1; |
wvd_vegt | 0:7b62ec9a3f53 | 77 | wait(0.2); |
wvd_vegt | 0:7b62ec9a3f53 | 78 | |
wvd_vegt | 0:7b62ec9a3f53 | 79 | //cmdb.print("Command Parsed and Dispatched\r\n"); |
wvd_vegt | 0:7b62ec9a3f53 | 80 | |
wvd_vegt | 0:7b62ec9a3f53 | 81 | myled = 0; |
wvd_vegt | 0:7b62ec9a3f53 | 82 | wait(0.2); |
wvd_vegt | 0:7b62ec9a3f53 | 83 | } |
wvd_vegt | 0:7b62ec9a3f53 | 84 | } |
wvd_vegt | 0:7b62ec9a3f53 | 85 | |
wvd_vegt | 0:7b62ec9a3f53 | 86 | //For Macro Support we basically do the same but take characters from the macro buffer. |
wvd_vegt | 0:7b62ec9a3f53 | 87 | //Example Macro: Test|Int_42|Idle |
wvd_vegt | 0:7b62ec9a3f53 | 88 | while (cmdb.macro_hasnext()) { |
wvd_vegt | 0:7b62ec9a3f53 | 89 | //Get and process next character. |
wvd_vegt | 0:7b62ec9a3f53 | 90 | cmdb.scan(cmdb.macro_next()); |
wvd_vegt | 1:4e699312b5c8 | 91 | |
wvd_vegt | 1:4e699312b5c8 | 92 | //After the last character we need to add a cr to force execution. |
wvd_vegt | 0:7b62ec9a3f53 | 93 | if (!cmdb.macro_peek()) { |
wvd_vegt | 0:7b62ec9a3f53 | 94 | cmdb.scan(cr); |
wvd_vegt | 0:7b62ec9a3f53 | 95 | } |
wvd_vegt | 0:7b62ec9a3f53 | 96 | } |
wvd_vegt | 0:7b62ec9a3f53 | 97 | } |
wvd_vegt | 0:7b62ec9a3f53 | 98 | } |