Typical controller demo program based on Seeed Arch Max. Features: - Multi-thread architecture - Inter-thread message communication - Independent command shell using thread - HTTPD with CGI, WS, RPC - Key & value pair configuration load/save

Dependencies:   CMDB EthernetInterface HTTPD dconfig mbed-rpc mbed-rtos mbed storage_on_flash

Committer:
hillkim7
Date:
Wed Mar 25 21:56:51 2015 +0000
Revision:
0:2ffd10976643
Child:
2:d7ffadba49b9
Typical controller demo program based on Seeed Arch Max.; Features:; - Multi-thread architecture; - Inter-thread message communication; - Independent command shell using thread; - HTTPD with CGI, WS, RPC; - Key & value pair configuration load/save

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hillkim7 0:2ffd10976643 1 /**
hillkim7 0:2ffd10976643 2 * @file console.cpp
hillkim7 0:2ffd10976643 3 *
hillkim7 0:2ffd10976643 4 * @brief console implementation using CMDB library.
hillkim7 0:2ffd10976643 5 *
hillkim7 0:2ffd10976643 6 * After boot, it prompts "CMD>" in console. Type "help" command to get help.
hillkim7 0:2ffd10976643 7 */
hillkim7 0:2ffd10976643 8
hillkim7 0:2ffd10976643 9 #include <vector>
hillkim7 0:2ffd10976643 10 #include "mbed.h"
hillkim7 0:2ffd10976643 11 #include "cmdb.h"
hillkim7 0:2ffd10976643 12 #include "util.h"
hillkim7 0:2ffd10976643 13 #include "main.h"
hillkim7 0:2ffd10976643 14
hillkim7 0:2ffd10976643 15 #define CID_TEST 1
hillkim7 0:2ffd10976643 16 #define CID_FREE 2
hillkim7 0:2ffd10976643 17 #define CID_CFG_SET 3
hillkim7 0:2ffd10976643 18 #define CID_CFG_SAVE 4
hillkim7 0:2ffd10976643 19 #define CID_CFG_PRINT 5
hillkim7 0:2ffd10976643 20 #define CID_IF_UP 6
hillkim7 0:2ffd10976643 21 #define CID_IF_DOWN 7
hillkim7 0:2ffd10976643 22 #define CID_IF_STAT 8
hillkim7 0:2ffd10976643 23
hillkim7 0:2ffd10976643 24 /** Sample User Command Dispatcher.
hillkim7 0:2ffd10976643 25 *
hillkim7 0:2ffd10976643 26 * @parm cmdb the command interpreter object.
hillkim7 0:2ffd10976643 27 * @parm cid the command id.
hillkim7 0:2ffd10976643 28 */
hillkim7 0:2ffd10976643 29 void my_dispatcher(Cmdb& cmdb, int cid)
hillkim7 0:2ffd10976643 30 {
hillkim7 0:2ffd10976643 31 //cmdb.printf("my_dispatcher: cid=%d\r\n", cid);
hillkim7 0:2ffd10976643 32
hillkim7 0:2ffd10976643 33 switch (cid) {
hillkim7 0:2ffd10976643 34 case CID_FREE :
hillkim7 0:2ffd10976643 35 //cmdb.printf("my_dispatcher: parm 0=%d\r\n",cmdb.INTPARM(0));
hillkim7 0:2ffd10976643 36 print_memstat();
hillkim7 0:2ffd10976643 37 break;
hillkim7 0:2ffd10976643 38 case CID_CFG_SET :
hillkim7 0:2ffd10976643 39 _config.lock_config();
hillkim7 0:2ffd10976643 40 if (!_config.value_replace(cmdb.STRINGPARM(0), cmdb.STRINGPARM(1))) {
hillkim7 0:2ffd10976643 41 cmdb.printf("invalid key='%s'\r\n", cmdb.STRINGPARM(0));
hillkim7 0:2ffd10976643 42 }
hillkim7 0:2ffd10976643 43 _config.unlock_config();
hillkim7 0:2ffd10976643 44 break;
hillkim7 0:2ffd10976643 45 case CID_CFG_SAVE :
hillkim7 0:2ffd10976643 46 _config.lock_config();
hillkim7 0:2ffd10976643 47 if (!_config.save_config()) {
hillkim7 0:2ffd10976643 48 cmdb.printf("save fail\r\n");
hillkim7 0:2ffd10976643 49 }
hillkim7 0:2ffd10976643 50 _config.unlock_config();
hillkim7 0:2ffd10976643 51 break;
hillkim7 0:2ffd10976643 52 case CID_CFG_PRINT :
hillkim7 0:2ffd10976643 53 _config.lock_config();
hillkim7 0:2ffd10976643 54 _config.print_all();
hillkim7 0:2ffd10976643 55 _config.unlock_config();
hillkim7 0:2ffd10976643 56 break;
hillkim7 0:2ffd10976643 57 case CID_IF_UP :
hillkim7 0:2ffd10976643 58 send_main_message(MSG_IFUP, 0, 0);
hillkim7 0:2ffd10976643 59 break;
hillkim7 0:2ffd10976643 60 case CID_IF_DOWN:
hillkim7 0:2ffd10976643 61 send_main_message(MSG_IFDOWN, 0, 0);
hillkim7 0:2ffd10976643 62 break;
hillkim7 0:2ffd10976643 63 case CID_IF_STAT :
hillkim7 0:2ffd10976643 64 send_main_message(MSG_IFSTAT, 0, 0);
hillkim7 0:2ffd10976643 65 break;
hillkim7 0:2ffd10976643 66 default:
hillkim7 0:2ffd10976643 67 printf("unknown CID=%u\r\n", cid);
hillkim7 0:2ffd10976643 68 break;
hillkim7 0:2ffd10976643 69 }
hillkim7 0:2ffd10976643 70 }
hillkim7 0:2ffd10976643 71
hillkim7 0:2ffd10976643 72 static const cmd user_cmd[] = {
hillkim7 0:2ffd10976643 73 {"Test",SUBSYSTEM,CID_TEST,"" ,"* Test Subsystem"},
hillkim7 0:2ffd10976643 74 {"free",CID_TEST,CID_FREE,"" ,"show amount of free memory", ""},
hillkim7 0:2ffd10976643 75 {"cfgset",CID_TEST,CID_CFG_SET,"%s %s" ,"config set", "config_key value"},
hillkim7 0:2ffd10976643 76 {"cfgsave",CID_TEST,CID_CFG_SAVE,"" ,"config save to flash"},
hillkim7 0:2ffd10976643 77 {"cfgprint",CID_TEST,CID_CFG_PRINT,"" ,"print all config"},
hillkim7 0:2ffd10976643 78 {"ifup",CID_TEST,CID_IF_UP,"" ,"bring a network interface up"},
hillkim7 0:2ffd10976643 79 {"ifdown",CID_TEST,CID_IF_DOWN,"" ,"bring a network interface down"},
hillkim7 0:2ffd10976643 80 {"ifstat",CID_TEST,CID_IF_STAT,"" ,"print network info"},
hillkim7 0:2ffd10976643 81 };
hillkim7 0:2ffd10976643 82
hillkim7 0:2ffd10976643 83
hillkim7 0:2ffd10976643 84 void console_thread(void const *args)
hillkim7 0:2ffd10976643 85 {
hillkim7 0:2ffd10976643 86 Serial &serial = *((Serial *)args);
hillkim7 0:2ffd10976643 87
hillkim7 0:2ffd10976643 88 // Test the serial connection by
hillkim7 0:2ffd10976643 89 serial.printf("\r\n\r\nCmdb Command Interpreter Demo Version %0.2f.\r\n\r\n", Cmdb::version());
hillkim7 0:2ffd10976643 90
hillkim7 0:2ffd10976643 91 //Create a Command Table Vector.
hillkim7 0:2ffd10976643 92 std::vector<cmd> cmds(&user_cmd[0], &user_cmd[sizeof(user_cmd)/sizeof(user_cmd[0])]);
hillkim7 0:2ffd10976643 93
hillkim7 0:2ffd10976643 94 //Add some of our own first...
hillkim7 0:2ffd10976643 95 //Add some predefined...
hillkim7 0:2ffd10976643 96 cmds.push_back(COMMANDS); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 97 cmds.push_back(BOOT); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 98
hillkim7 0:2ffd10976643 99 cmds.push_back(ECHO); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 100 cmds.push_back(BOLD); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 101 cmds.push_back(CLS); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 102
hillkim7 0:2ffd10976643 103 cmds.push_back(MACRO); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 104 cmds.push_back(RUN); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 105 cmds.push_back(MACROS); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 106
hillkim7 0:2ffd10976643 107 //Add some predefined and mandatory...
hillkim7 0:2ffd10976643 108 cmds.push_back(IDLE); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 109 cmds.push_back(HELP); //Handled by Cmdb internally.
hillkim7 0:2ffd10976643 110
hillkim7 0:2ffd10976643 111 //Create and initialize the Command Interpreter.
hillkim7 0:2ffd10976643 112 Cmdb cmdb(serial, cmds, &my_dispatcher);
hillkim7 0:2ffd10976643 113
hillkim7 0:2ffd10976643 114 //cmdb.printf("%d=%d\r\n",cmds[0].subs,cmds[0].cid);
hillkim7 0:2ffd10976643 115 //cmdb.printf("%d=%d\r\n",cmds[1].subs,cmds[1].cid);
hillkim7 0:2ffd10976643 116
hillkim7 0:2ffd10976643 117 while (1) {
hillkim7 0:2ffd10976643 118 //Check for input...
hillkim7 0:2ffd10976643 119 if (cmdb.hasnext()==true) {
hillkim7 0:2ffd10976643 120
hillkim7 0:2ffd10976643 121 //Supply input to Command Interpreter
hillkim7 0:2ffd10976643 122 if (cmdb.scan(cmdb.next())) {
hillkim7 0:2ffd10976643 123 }
hillkim7 0:2ffd10976643 124 }
hillkim7 0:2ffd10976643 125
hillkim7 0:2ffd10976643 126 //For Macro Support we basically do the same but take characters from the macro buffer.
hillkim7 0:2ffd10976643 127 //Example Macro: Test|Int_42|Idle
hillkim7 0:2ffd10976643 128 while (cmdb.macro_hasnext()) {
hillkim7 0:2ffd10976643 129 //Get and process next character.
hillkim7 0:2ffd10976643 130 cmdb.scan(cmdb.macro_next());
hillkim7 0:2ffd10976643 131
hillkim7 0:2ffd10976643 132 //After the last character we need to add a cr to force execution.
hillkim7 0:2ffd10976643 133 if (!cmdb.macro_peek()) {
hillkim7 0:2ffd10976643 134 cmdb.scan(cr);
hillkim7 0:2ffd10976643 135 }
hillkim7 0:2ffd10976643 136 }
hillkim7 0:2ffd10976643 137 }
hillkim7 0:2ffd10976643 138 }
hillkim7 0:2ffd10976643 139