A Command Interpreter with support for used defined commands, subsystems, macros, help and parameter parsing.

Committer:
wvd_vegt
Date:
Fri Feb 11 10:51:08 2011 +0000
Revision:
8:83edd6addbd5
Parent:
7:269c2445b8f5
Child:
9:dc9faec79298
0.71

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wvd_vegt 6:76b033971c3c 1 /*
wvd_vegt 6:76b033971c3c 2 _____________________________________________________________________________
wvd_vegt 6:76b033971c3c 3
wvd_vegt 6:76b033971c3c 4 Project: mBed Command Interpreter
wvd_vegt 6:76b033971c3c 5 Filename: cmdb.h
wvd_vegt 6:76b033971c3c 6 Version: 0.5.0
wvd_vegt 6:76b033971c3c 7 _____________________________________________________________________________
wvd_vegt 6:76b033971c3c 8 Date Comment
wvd_vegt 6:76b033971c3c 9 -------- --------------------------------------------------------------
wvd_vegt 6:76b033971c3c 10 10022011 -Rewritten into C++ class.
wvd_vegt 6:76b033971c3c 11 -Pass Serial into constructor for printf, putc and getc.
wvd_vegt 6:76b033971c3c 12 -CID_<subsystem> must be handled internally.
wvd_vegt 6:76b033971c3c 13 -Fixed a number of old Index/Id conflicts.
wvd_vegt 6:76b033971c3c 14 -Got a working version. Much work to be done though.
wvd_vegt 6:76b033971c3c 15 -Handle CID_HELP internally (like all system commands (IDLE/MACRO etc).
wvd_vegt 6:76b033971c3c 16 -Defined CID_LAST as Vector Size or Last Command Id fails.
wvd_vegt 7:269c2445b8f5 17 -Removed CMD_TBL_LEN.
wvd_vegt 7:269c2445b8f5 18 -CID_LAST is now defined as CID_HELP+1.
wvd_vegt 7:269c2445b8f5 19 -Added Documentation.
wvd_vegt 7:269c2445b8f5 20 -Added code to take number limits from the C++ Runtime instead of hard defined values.
wvd_vegt 8:83edd6addbd5 21 -Renamed id to cid in cmd.
wvd_vegt 7:269c2445b8f5 22 -Added MAX_LONG and MIN_LONG (long==int on mbed).
wvd_vegt 7:269c2445b8f5 23 -Removed cmdb_ prefix from members.
wvd_vegt 8:83edd6addbd5 24 -Tested Macro Support and added it to the Demo.
wvd_vegt 6:76b033971c3c 25 -------- --------------------------------------------------------------
wvd_vegt 6:76b033971c3c 26 TODO's
wvd_vegt 7:269c2445b8f5 27 10022011 -Tweak and Review Documentation.
wvd_vegt 7:269c2445b8f5 28 11022011 -Check & Test **PARM masks.
wvd_vegt 7:269c2445b8f5 29 -Remove prefix from class members?
wvd_vegt 6:76b033971c3c 30 -------- --------------------------------------------------------------
wvd_vegt 6:76b033971c3c 31 _____________________________________________________________________________
wvd_vegt 6:76b033971c3c 32 */
wvd_vegt 6:76b033971c3c 33
wvd_vegt 3:abbf43fab7d5 34 #include <vector>
wvd_vegt 3:abbf43fab7d5 35 #include <stdlib.h>
wvd_vegt 3:abbf43fab7d5 36 #include <stdio.h>
wvd_vegt 3:abbf43fab7d5 37 #include <stdarg.h>
wvd_vegt 3:abbf43fab7d5 38 #include <ctype.h>
wvd_vegt 3:abbf43fab7d5 39 #include <string.h>
wvd_vegt 3:abbf43fab7d5 40
wvd_vegt 3:abbf43fab7d5 41 #include "cmdb.h"
wvd_vegt 3:abbf43fab7d5 42 #include "mbed.h"
wvd_vegt 3:abbf43fab7d5 43
wvd_vegt 7:269c2445b8f5 44 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 45
wvd_vegt 7:269c2445b8f5 46 Cmdb::Cmdb(const Serial& serial, const std::vector<cmd>& cmds, void (*callback)(Cmdb&,int)) :
wvd_vegt 7:269c2445b8f5 47 serial(serial), cmds(cmds) {
wvd_vegt 3:abbf43fab7d5 48 echo = true;
wvd_vegt 3:abbf43fab7d5 49 bold = true;
wvd_vegt 8:83edd6addbd5 50
wvd_vegt 3:abbf43fab7d5 51 subsystem = -1;
wvd_vegt 3:abbf43fab7d5 52
wvd_vegt 7:269c2445b8f5 53 callback = callback;
wvd_vegt 6:76b033971c3c 54
wvd_vegt 7:269c2445b8f5 55 init(true);
wvd_vegt 3:abbf43fab7d5 56 }
wvd_vegt 3:abbf43fab7d5 57
wvd_vegt 7:269c2445b8f5 58 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 59 // Public Stuff.
wvd_vegt 7:269c2445b8f5 60 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 61
wvd_vegt 7:269c2445b8f5 62 bool Cmdb::macro_hasnext() {
wvd_vegt 3:abbf43fab7d5 63 return macro_ptr!=-1 && macro_ptr<MAX_CMD_LEN && macro_buf[macro_ptr];
wvd_vegt 3:abbf43fab7d5 64 }
wvd_vegt 3:abbf43fab7d5 65
wvd_vegt 7:269c2445b8f5 66 char Cmdb::macro_next() {
wvd_vegt 3:abbf43fab7d5 67 char ch = macro_buf[macro_ptr++];
wvd_vegt 6:76b033971c3c 68
wvd_vegt 3:abbf43fab7d5 69 if (macro_ptr==MAX_CMD_LEN) {
wvd_vegt 7:269c2445b8f5 70 macro_reset();
wvd_vegt 3:abbf43fab7d5 71 }
wvd_vegt 6:76b033971c3c 72
wvd_vegt 8:83edd6addbd5 73 //Translate Special Characters Back
wvd_vegt 8:83edd6addbd5 74 switch (ch) {
wvd_vegt 8:83edd6addbd5 75 case '|':
wvd_vegt 8:83edd6addbd5 76 return cr;
wvd_vegt 8:83edd6addbd5 77 case '_':
wvd_vegt 8:83edd6addbd5 78 return sp;
wvd_vegt 8:83edd6addbd5 79 default:
wvd_vegt 8:83edd6addbd5 80 return ch;
wvd_vegt 8:83edd6addbd5 81 }
wvd_vegt 3:abbf43fab7d5 82 }
wvd_vegt 3:abbf43fab7d5 83
wvd_vegt 7:269c2445b8f5 84 char Cmdb::macro_peek() {
wvd_vegt 3:abbf43fab7d5 85 return macro_buf[macro_ptr];
wvd_vegt 3:abbf43fab7d5 86 }
wvd_vegt 3:abbf43fab7d5 87
wvd_vegt 7:269c2445b8f5 88 void Cmdb::macro_reset() {
wvd_vegt 3:abbf43fab7d5 89 macro_ptr = -1;
wvd_vegt 3:abbf43fab7d5 90 macro_buf[0] = '\0';
wvd_vegt 3:abbf43fab7d5 91 }
wvd_vegt 3:abbf43fab7d5 92
wvd_vegt 7:269c2445b8f5 93 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 94
wvd_vegt 7:269c2445b8f5 95 bool Cmdb::hasnext() {
wvd_vegt 7:269c2445b8f5 96 return serial.readable()==1;
wvd_vegt 7:269c2445b8f5 97 }
wvd_vegt 7:269c2445b8f5 98
wvd_vegt 7:269c2445b8f5 99 char Cmdb::next() {
wvd_vegt 7:269c2445b8f5 100 return serial.getc();
wvd_vegt 3:abbf43fab7d5 101 }
wvd_vegt 3:abbf43fab7d5 102
wvd_vegt 7:269c2445b8f5 103 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 104
wvd_vegt 7:269c2445b8f5 105 bool Cmdb::scan(const char c) {
wvd_vegt 7:269c2445b8f5 106 int i;
wvd_vegt 7:269c2445b8f5 107
wvd_vegt 7:269c2445b8f5 108 //See http://www.interfacebus.com/ASCII_Table.html
wvd_vegt 7:269c2445b8f5 109
wvd_vegt 7:269c2445b8f5 110 if (c == '\r') { // cr?
wvd_vegt 7:269c2445b8f5 111 print(crlf); // Output it and ...
wvd_vegt 7:269c2445b8f5 112 if (cmdndx) {
wvd_vegt 7:269c2445b8f5 113 strncpy(lstbuf,cmdbuf,cmdndx);
wvd_vegt 7:269c2445b8f5 114 lstbuf[cmdndx]='\0';
wvd_vegt 7:269c2445b8f5 115
wvd_vegt 7:269c2445b8f5 116 cmd_dispatcher(cmdbuf);
wvd_vegt 7:269c2445b8f5 117 }
wvd_vegt 7:269c2445b8f5 118 init(false);
wvd_vegt 7:269c2445b8f5 119 prompt();
wvd_vegt 7:269c2445b8f5 120
wvd_vegt 7:269c2445b8f5 121 return true;
wvd_vegt 7:269c2445b8f5 122 }
wvd_vegt 7:269c2445b8f5 123
wvd_vegt 7:269c2445b8f5 124 //TODO BACKSPACE NOT CORRECT FOR TELNET!
wvd_vegt 7:269c2445b8f5 125
wvd_vegt 7:269c2445b8f5 126 if (c == '\b') { // Backspace
wvd_vegt 7:269c2445b8f5 127 if (cmdndx != 0) {
wvd_vegt 7:269c2445b8f5 128 print(bs);
wvd_vegt 7:269c2445b8f5 129 cmdbuf [--cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 130 } else {
wvd_vegt 7:269c2445b8f5 131 printch(bell); // Output Error
wvd_vegt 7:269c2445b8f5 132 }
wvd_vegt 7:269c2445b8f5 133 return false;
wvd_vegt 7:269c2445b8f5 134 }
wvd_vegt 7:269c2445b8f5 135
wvd_vegt 7:269c2445b8f5 136 if (c == '\177') { // Delete
wvd_vegt 7:269c2445b8f5 137 while (cmdndx>0) {
wvd_vegt 7:269c2445b8f5 138 print(bs);
wvd_vegt 7:269c2445b8f5 139 cmdbuf [--cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 140 }
wvd_vegt 7:269c2445b8f5 141 return false;
wvd_vegt 7:269c2445b8f5 142 }
wvd_vegt 7:269c2445b8f5 143
wvd_vegt 7:269c2445b8f5 144 //Reset Escape Buffer.
wvd_vegt 7:269c2445b8f5 145 if (c == '\033') {
wvd_vegt 7:269c2445b8f5 146 if (escndx!=0) {
wvd_vegt 7:269c2445b8f5 147 //_putchar(bell); // Output Error
wvd_vegt 7:269c2445b8f5 148 //printf("%s\r\n",escbuf);
wvd_vegt 7:269c2445b8f5 149 }
wvd_vegt 7:269c2445b8f5 150 escndx = 0;
wvd_vegt 7:269c2445b8f5 151 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 152 }
wvd_vegt 7:269c2445b8f5 153
wvd_vegt 7:269c2445b8f5 154 //Extract Escape Sequence.
wvd_vegt 7:269c2445b8f5 155 if (c == '\033' || escndx ) { // Wait for escape
wvd_vegt 7:269c2445b8f5 156 escbuf [escndx++] = (unsigned char) c; // Add to the buffer
wvd_vegt 7:269c2445b8f5 157 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 158 if (isalpha(c)) {
wvd_vegt 7:269c2445b8f5 159 switch (escid_search(escbuf)) {
wvd_vegt 7:269c2445b8f5 160 case EID_CURSOR_LEFT : {
wvd_vegt 7:269c2445b8f5 161 if (cmdndx != 0) { // Backspace?
wvd_vegt 7:269c2445b8f5 162 print(bs);
wvd_vegt 7:269c2445b8f5 163 cmdbuf [--cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 164 } else {
wvd_vegt 7:269c2445b8f5 165 printch(bell); // Output char
wvd_vegt 7:269c2445b8f5 166 }
wvd_vegt 7:269c2445b8f5 167 break;
wvd_vegt 7:269c2445b8f5 168 }
wvd_vegt 7:269c2445b8f5 169 case EID_CURSOR_UP : {
wvd_vegt 7:269c2445b8f5 170 for (i=0;i<cmdndx;i++) {
wvd_vegt 7:269c2445b8f5 171 print(bs);
wvd_vegt 7:269c2445b8f5 172 }
wvd_vegt 7:269c2445b8f5 173 cmdndx=strlen(lstbuf);
wvd_vegt 7:269c2445b8f5 174 strncpy(cmdbuf,lstbuf,cmdndx);
wvd_vegt 7:269c2445b8f5 175 cmdbuf[cmdndx]='\0';
wvd_vegt 7:269c2445b8f5 176 printf("%s",cmdbuf);
wvd_vegt 7:269c2445b8f5 177 break;
wvd_vegt 7:269c2445b8f5 178 }
wvd_vegt 7:269c2445b8f5 179 case EID_CURSOR_RIGHT:
wvd_vegt 7:269c2445b8f5 180 break;
wvd_vegt 7:269c2445b8f5 181 case EID_CURSOR_DOWN :
wvd_vegt 7:269c2445b8f5 182 break;
wvd_vegt 7:269c2445b8f5 183 case EID_LAST :
wvd_vegt 7:269c2445b8f5 184 break;
wvd_vegt 7:269c2445b8f5 185 default :
wvd_vegt 7:269c2445b8f5 186 printch(bell);
wvd_vegt 7:269c2445b8f5 187 break;
wvd_vegt 7:269c2445b8f5 188 }
wvd_vegt 7:269c2445b8f5 189 escndx=0;
wvd_vegt 7:269c2445b8f5 190 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 191 }
wvd_vegt 7:269c2445b8f5 192 return false;
wvd_vegt 7:269c2445b8f5 193 }
wvd_vegt 7:269c2445b8f5 194
wvd_vegt 7:269c2445b8f5 195 if (c=='\n') { // LF
wvd_vegt 7:269c2445b8f5 196 return false; // Dump it
wvd_vegt 7:269c2445b8f5 197 }
wvd_vegt 7:269c2445b8f5 198
wvd_vegt 7:269c2445b8f5 199 if (!isprint (c)) { // Printable character?
wvd_vegt 7:269c2445b8f5 200 printch(bell);
wvd_vegt 7:269c2445b8f5 201 return false;
wvd_vegt 7:269c2445b8f5 202 }
wvd_vegt 7:269c2445b8f5 203
wvd_vegt 7:269c2445b8f5 204 if (cmdndx >= MAX_CMD_LEN) { // Past buffer length?
wvd_vegt 7:269c2445b8f5 205 printch(bell);
wvd_vegt 7:269c2445b8f5 206 return false;
wvd_vegt 7:269c2445b8f5 207 }
wvd_vegt 7:269c2445b8f5 208
wvd_vegt 7:269c2445b8f5 209 cmdbuf [cmdndx++] = (unsigned char) c; // Add to the buffer
wvd_vegt 7:269c2445b8f5 210 cmdbuf [cmdndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 211
wvd_vegt 7:269c2445b8f5 212 if (echo) {
wvd_vegt 7:269c2445b8f5 213 printch(c); // Output char
wvd_vegt 7:269c2445b8f5 214 }
wvd_vegt 7:269c2445b8f5 215
wvd_vegt 7:269c2445b8f5 216 return false;
wvd_vegt 3:abbf43fab7d5 217 }
wvd_vegt 3:abbf43fab7d5 218
wvd_vegt 7:269c2445b8f5 219 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 220
wvd_vegt 7:269c2445b8f5 221 int Cmdb::printf(const char *format, ...) {
wvd_vegt 7:269c2445b8f5 222 int cnt;
wvd_vegt 7:269c2445b8f5 223
wvd_vegt 7:269c2445b8f5 224 va_list args;
wvd_vegt 7:269c2445b8f5 225 char buf[1024];
wvd_vegt 7:269c2445b8f5 226
wvd_vegt 7:269c2445b8f5 227 memset(buf,'\0',sizeof(buf));
wvd_vegt 7:269c2445b8f5 228
wvd_vegt 7:269c2445b8f5 229 va_start(args, format);
wvd_vegt 7:269c2445b8f5 230 cnt = vsnprintf(buf, sizeof(buf), format, args);
wvd_vegt 7:269c2445b8f5 231 if (cnt==-1) {
wvd_vegt 7:269c2445b8f5 232 //Error
wvd_vegt 7:269c2445b8f5 233 }
wvd_vegt 7:269c2445b8f5 234 va_end(args);
wvd_vegt 7:269c2445b8f5 235
wvd_vegt 7:269c2445b8f5 236 return print(buf);
wvd_vegt 7:269c2445b8f5 237 }
wvd_vegt 7:269c2445b8f5 238
wvd_vegt 7:269c2445b8f5 239 int Cmdb::print(const char *msg) {
wvd_vegt 7:269c2445b8f5 240 return serial.printf(msg);
wvd_vegt 7:269c2445b8f5 241 }
wvd_vegt 7:269c2445b8f5 242
wvd_vegt 7:269c2445b8f5 243 char Cmdb::printch(const char ch) {
wvd_vegt 7:269c2445b8f5 244 return serial.putc(ch);
wvd_vegt 7:269c2445b8f5 245 }
wvd_vegt 3:abbf43fab7d5 246
wvd_vegt 7:269c2445b8f5 247 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 248
wvd_vegt 7:269c2445b8f5 249 void Cmdb::init(const char full) {
wvd_vegt 7:269c2445b8f5 250 if (full) {
wvd_vegt 7:269c2445b8f5 251 echo = true;
wvd_vegt 7:269c2445b8f5 252 bold = true;
wvd_vegt 7:269c2445b8f5 253
wvd_vegt 7:269c2445b8f5 254 subsystem = -1;
wvd_vegt 7:269c2445b8f5 255
wvd_vegt 7:269c2445b8f5 256 lstbuf [cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 257
wvd_vegt 7:269c2445b8f5 258 macro_reset();
wvd_vegt 7:269c2445b8f5 259
wvd_vegt 7:269c2445b8f5 260 prompt();
wvd_vegt 7:269c2445b8f5 261 }
wvd_vegt 7:269c2445b8f5 262
wvd_vegt 7:269c2445b8f5 263 cmdndx = 0;
wvd_vegt 7:269c2445b8f5 264 cmdbuf [cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 265
wvd_vegt 7:269c2445b8f5 266 escndx = 0;
wvd_vegt 7:269c2445b8f5 267 escbuf [escndx] = '\0';
wvd_vegt 7:269c2445b8f5 268 }
wvd_vegt 7:269c2445b8f5 269
wvd_vegt 7:269c2445b8f5 270 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 271 //Private Stuff.
wvd_vegt 7:269c2445b8f5 272 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 273
wvd_vegt 7:269c2445b8f5 274 int Cmdb::escid_search(char *escstr) {
wvd_vegt 3:abbf43fab7d5 275 for (int i=0; i<ESC_TBL_LEN; i++) {
wvd_vegt 3:abbf43fab7d5 276 if (strcmp (esc_tbl[i].escstr, escstr) == 0)
wvd_vegt 3:abbf43fab7d5 277 return (esc_tbl[i].id);
wvd_vegt 3:abbf43fab7d5 278 }
wvd_vegt 3:abbf43fab7d5 279
wvd_vegt 3:abbf43fab7d5 280 return (EID_LAST);
wvd_vegt 3:abbf43fab7d5 281 }
wvd_vegt 3:abbf43fab7d5 282
wvd_vegt 7:269c2445b8f5 283 int Cmdb::cmdid_search(char *cmdstr) {
wvd_vegt 3:abbf43fab7d5 284 //Warning, we return the ID but somewhere assume it's equal to the array index!
wvd_vegt 7:269c2445b8f5 285 for (int i=0; i<cmds.size(); i++) {
wvd_vegt 7:269c2445b8f5 286 if ((stricmp(cmds[i].cmdstr, cmdstr) == 0) && ((cmds[i].subs == subsystem) || (cmds[i].subs<0)))
wvd_vegt 7:269c2445b8f5 287 return (cmds[i].cid);
wvd_vegt 3:abbf43fab7d5 288 }
wvd_vegt 3:abbf43fab7d5 289
wvd_vegt 6:76b033971c3c 290 return CID_LAST;
wvd_vegt 3:abbf43fab7d5 291 }
wvd_vegt 3:abbf43fab7d5 292
wvd_vegt 7:269c2445b8f5 293 int Cmdb::cmdid_index(int cmdid) {
wvd_vegt 7:269c2445b8f5 294 for (int i=0; i<cmds.size(); i++) {
wvd_vegt 7:269c2445b8f5 295 if (cmds[i].cid==cmdid)
wvd_vegt 3:abbf43fab7d5 296 return i;
wvd_vegt 3:abbf43fab7d5 297 }
wvd_vegt 3:abbf43fab7d5 298
wvd_vegt 3:abbf43fab7d5 299 return -1;
wvd_vegt 3:abbf43fab7d5 300 }
wvd_vegt 3:abbf43fab7d5 301
wvd_vegt 7:269c2445b8f5 302 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 303
wvd_vegt 7:269c2445b8f5 304 int Cmdb::parse(char *cmd) {
wvd_vegt 3:abbf43fab7d5 305 //Command
wvd_vegt 3:abbf43fab7d5 306 char cmdstr_buf [1 + MAX_CMD_LEN];
wvd_vegt 3:abbf43fab7d5 307
wvd_vegt 3:abbf43fab7d5 308 //Parameters
wvd_vegt 3:abbf43fab7d5 309 char argstr_buf [1 + MAX_CMD_LEN];
wvd_vegt 3:abbf43fab7d5 310 char *argsep;
wvd_vegt 3:abbf43fab7d5 311
wvd_vegt 3:abbf43fab7d5 312 char prmstr_buf [1 + MAX_CMD_LEN]; //copy of sscanf pattern
wvd_vegt 3:abbf43fab7d5 313 char *tok; //current token
wvd_vegt 3:abbf43fab7d5 314 void *toks[MAX_ARGS]; //pointers to string tokens IN commandline (argstr_buf)
wvd_vegt 3:abbf43fab7d5 315 char *prms[MAX_ARGS]; //patterns IN copy of sscanf string (*parms)
wvd_vegt 3:abbf43fab7d5 316
wvd_vegt 3:abbf43fab7d5 317 char typ = '\0'; //Var type
wvd_vegt 3:abbf43fab7d5 318 char mod = '\0'; //Var modifier (for cardinal types)
wvd_vegt 3:abbf43fab7d5 319 unsigned int base; //Var number base (8,10,16)
wvd_vegt 3:abbf43fab7d5 320 //unsigned int bytes; //Var size in bytes (used for malloc)
wvd_vegt 3:abbf43fab7d5 321
wvd_vegt 3:abbf43fab7d5 322 float f; //Temp var for conversion, 4 bytes
wvd_vegt 3:abbf43fab7d5 323 //unsigned char b; //Temp var for conversion, 1 byte
wvd_vegt 3:abbf43fab7d5 324 //char c; //Temp var for conversion, 1 byte
wvd_vegt 3:abbf43fab7d5 325 //short h; //Temp var for conversion, 2 bytes
wvd_vegt 3:abbf43fab7d5 326 //int k; //Temp var for conversion, 2 bytes
wvd_vegt 3:abbf43fab7d5 327 long l; //Temp var for conversion, 4 bytes
wvd_vegt 3:abbf43fab7d5 328
wvd_vegt 3:abbf43fab7d5 329 char* endptr; //strtoXX() Error detection
wvd_vegt 3:abbf43fab7d5 330
wvd_vegt 6:76b033971c3c 331 int cid = -1; //Signals empty string...
wvd_vegt 6:76b033971c3c 332 int ndx = -1;
wvd_vegt 3:abbf43fab7d5 333
wvd_vegt 3:abbf43fab7d5 334 //Init (global) variables.
wvd_vegt 3:abbf43fab7d5 335 argfnd=0;
wvd_vegt 3:abbf43fab7d5 336 argcnt=0;
wvd_vegt 3:abbf43fab7d5 337 error =0;
wvd_vegt 3:abbf43fab7d5 338
wvd_vegt 3:abbf43fab7d5 339 //Zero the two string buffers for splitting cmd string into.
wvd_vegt 3:abbf43fab7d5 340 zeromemory((char*)cmdstr_buf,sizeof(cmdstr_buf));
wvd_vegt 3:abbf43fab7d5 341 zeromemory(argstr_buf,sizeof(argstr_buf));
wvd_vegt 3:abbf43fab7d5 342
wvd_vegt 3:abbf43fab7d5 343 //Make it worse in Lint
wvd_vegt 6:76b033971c3c 344 for (int i=0;i<MAX_ARGS;i++) {
wvd_vegt 3:abbf43fab7d5 345 parms[i].type=PARM_UNUSED;
wvd_vegt 3:abbf43fab7d5 346 zeromemory((char*)&(parms[i].val),sizeof(parms[i].val));
wvd_vegt 3:abbf43fab7d5 347 }
wvd_vegt 3:abbf43fab7d5 348
wvd_vegt 3:abbf43fab7d5 349 /*------------------------------------------------
wvd_vegt 3:abbf43fab7d5 350 First, copy the command and convert it to all
wvd_vegt 3:abbf43fab7d5 351 uppercase.
wvd_vegt 3:abbf43fab7d5 352 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 353
wvd_vegt 3:abbf43fab7d5 354 strncpy(cmdstr_buf, cmd, sizeof (cmdstr_buf) - 1);
wvd_vegt 3:abbf43fab7d5 355 cmdstr_buf [sizeof (cmdstr_buf) - 1] = '\0';
wvd_vegt 3:abbf43fab7d5 356
wvd_vegt 3:abbf43fab7d5 357 /*------------------------------------------------
wvd_vegt 3:abbf43fab7d5 358 Next, find the end of the first thing in the
wvd_vegt 3:abbf43fab7d5 359 buffer. Since the command ends with a space,
wvd_vegt 3:abbf43fab7d5 360 we'll look for that. NULL-Terminate the command
wvd_vegt 3:abbf43fab7d5 361 and keep a pointer to the arguments.
wvd_vegt 3:abbf43fab7d5 362 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 363
wvd_vegt 3:abbf43fab7d5 364 argsep = strchr(cmdstr_buf, ' ');
wvd_vegt 3:abbf43fab7d5 365
wvd_vegt 3:abbf43fab7d5 366 if (argsep == NULL) {
wvd_vegt 3:abbf43fab7d5 367 argstr_buf [0] = '\0';
wvd_vegt 3:abbf43fab7d5 368 } else {
wvd_vegt 3:abbf43fab7d5 369 strcpy (argstr_buf, argsep + 1);
wvd_vegt 3:abbf43fab7d5 370 *argsep = '\0';
wvd_vegt 3:abbf43fab7d5 371 }
wvd_vegt 3:abbf43fab7d5 372
wvd_vegt 3:abbf43fab7d5 373 /*------------------------------------------------
wvd_vegt 6:76b033971c3c 374 Search for a command ID, then switch on it.
wvd_vegt 3:abbf43fab7d5 375 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 376
wvd_vegt 3:abbf43fab7d5 377 //1) Find the Command Id
wvd_vegt 7:269c2445b8f5 378 cid = cmdid_search(cmdstr_buf);
wvd_vegt 3:abbf43fab7d5 379
wvd_vegt 6:76b033971c3c 380 if (cid!=CID_LAST) {
wvd_vegt 3:abbf43fab7d5 381 //2) Tokenize a copy of the parms from the cmd_tbl.
wvd_vegt 3:abbf43fab7d5 382
wvd_vegt 7:269c2445b8f5 383 ndx = cmdid_index(cid);
wvd_vegt 6:76b033971c3c 384
wvd_vegt 3:abbf43fab7d5 385 //Get Format patterns from cmd_tbl[id].parms.
wvd_vegt 7:269c2445b8f5 386 //note: strtok inserts \0 into the original string. Hence the copy.
wvd_vegt 3:abbf43fab7d5 387 zeromemory((char *)(&prmstr_buf),sizeof(prmstr_buf));
wvd_vegt 3:abbf43fab7d5 388
wvd_vegt 7:269c2445b8f5 389 strncpy (prmstr_buf, cmds[ndx].parms, sizeof (prmstr_buf) - 1);
wvd_vegt 3:abbf43fab7d5 390
wvd_vegt 3:abbf43fab7d5 391 argcnt=0;
wvd_vegt 3:abbf43fab7d5 392 tok = strtok(prmstr_buf, " ");
wvd_vegt 3:abbf43fab7d5 393 while (tok != NULL) {
wvd_vegt 3:abbf43fab7d5 394 //Store Pointers
wvd_vegt 3:abbf43fab7d5 395 prms[argcnt++] = tok;
wvd_vegt 3:abbf43fab7d5 396
wvd_vegt 7:269c2445b8f5 397 //printf("prm_%2.2d='%s'\r\n",argcnt, tok);
wvd_vegt 3:abbf43fab7d5 398
wvd_vegt 3:abbf43fab7d5 399 tok = strtok(NULL, " ");
wvd_vegt 3:abbf43fab7d5 400 }
wvd_vegt 3:abbf43fab7d5 401
wvd_vegt 3:abbf43fab7d5 402 //3) Tokenize the commandline.
wvd_vegt 3:abbf43fab7d5 403
wvd_vegt 3:abbf43fab7d5 404 //Get Tokens from arguments.
wvd_vegt 3:abbf43fab7d5 405 //Note: strtok inserts \0 into the original string. Won't harm here as we do not re-use it.
wvd_vegt 3:abbf43fab7d5 406
wvd_vegt 3:abbf43fab7d5 407 argfnd=0;
wvd_vegt 3:abbf43fab7d5 408
wvd_vegt 3:abbf43fab7d5 409 if (strlen(argstr_buf)!=0) {
wvd_vegt 3:abbf43fab7d5 410 tok = strtok(argstr_buf, " ");
wvd_vegt 3:abbf43fab7d5 411 } else {
wvd_vegt 3:abbf43fab7d5 412 tok=NULL;
wvd_vegt 3:abbf43fab7d5 413 }
wvd_vegt 3:abbf43fab7d5 414
wvd_vegt 3:abbf43fab7d5 415 while (tok != NULL) {
wvd_vegt 3:abbf43fab7d5 416 //Store Pointers
wvd_vegt 3:abbf43fab7d5 417 toks[argfnd++]=tok;
wvd_vegt 3:abbf43fab7d5 418
wvd_vegt 7:269c2445b8f5 419 //printf("tok_%2.2d='%s'\r\n",argfnd, tok);
wvd_vegt 3:abbf43fab7d5 420
wvd_vegt 3:abbf43fab7d5 421 tok = strtok(NULL, " ");
wvd_vegt 3:abbf43fab7d5 422 }
wvd_vegt 3:abbf43fab7d5 423
wvd_vegt 6:76b033971c3c 424 if (argfnd==argcnt || (cid==CID_HELP && argfnd==0)) {
wvd_vegt 3:abbf43fab7d5 425
wvd_vegt 3:abbf43fab7d5 426 error = 0;
wvd_vegt 3:abbf43fab7d5 427
wvd_vegt 6:76b033971c3c 428 for (int i=0;i<argcnt;i++) {
wvd_vegt 7:269c2445b8f5 429 //printf("prm_%2.2d=%s\r\n",i, prms[i]);
wvd_vegt 3:abbf43fab7d5 430
wvd_vegt 3:abbf43fab7d5 431 switch (strlen(prms[i])) {
wvd_vegt 3:abbf43fab7d5 432 case 0:
wvd_vegt 3:abbf43fab7d5 433 break;
wvd_vegt 3:abbf43fab7d5 434 case 1:
wvd_vegt 3:abbf43fab7d5 435 break;
wvd_vegt 3:abbf43fab7d5 436 case 2: //Simple pattern, no modifier
wvd_vegt 3:abbf43fab7d5 437 mod='\0';
wvd_vegt 3:abbf43fab7d5 438 typ=prms[i][1];
wvd_vegt 3:abbf43fab7d5 439
wvd_vegt 3:abbf43fab7d5 440 break;
wvd_vegt 3:abbf43fab7d5 441 case 3: //pattern with Modifier.
wvd_vegt 3:abbf43fab7d5 442 mod=prms[i][1];
wvd_vegt 3:abbf43fab7d5 443 typ=prms[i][2];
wvd_vegt 3:abbf43fab7d5 444
wvd_vegt 3:abbf43fab7d5 445 break;
wvd_vegt 3:abbf43fab7d5 446 default:
wvd_vegt 3:abbf43fab7d5 447 break;
wvd_vegt 3:abbf43fab7d5 448 }
wvd_vegt 3:abbf43fab7d5 449
wvd_vegt 3:abbf43fab7d5 450 switch (typ) {
wvd_vegt 3:abbf43fab7d5 451 case 'o' :
wvd_vegt 3:abbf43fab7d5 452 base=8;
wvd_vegt 3:abbf43fab7d5 453 break;
wvd_vegt 3:abbf43fab7d5 454 case 'x' :
wvd_vegt 3:abbf43fab7d5 455 base=16;
wvd_vegt 3:abbf43fab7d5 456 break;
wvd_vegt 3:abbf43fab7d5 457 default:
wvd_vegt 3:abbf43fab7d5 458 base=10;
wvd_vegt 3:abbf43fab7d5 459 break;
wvd_vegt 3:abbf43fab7d5 460 }
wvd_vegt 3:abbf43fab7d5 461
wvd_vegt 3:abbf43fab7d5 462 endptr = (char*)toks[i];
wvd_vegt 3:abbf43fab7d5 463
wvd_vegt 3:abbf43fab7d5 464 //Cardinal Types
wvd_vegt 3:abbf43fab7d5 465 switch (typ) {
wvd_vegt 3:abbf43fab7d5 466 case 'd' : //Check mod
wvd_vegt 3:abbf43fab7d5 467 case 'i' : //Check mod
wvd_vegt 3:abbf43fab7d5 468 case 'u' : //Check mod
wvd_vegt 3:abbf43fab7d5 469 case 'o' : //Check mod
wvd_vegt 3:abbf43fab7d5 470 case 'x' : //Check mod
wvd_vegt 3:abbf43fab7d5 471 switch (mod) {
wvd_vegt 3:abbf43fab7d5 472 case 'b' : //char
wvd_vegt 3:abbf43fab7d5 473 //test range
wvd_vegt 3:abbf43fab7d5 474 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 475 if (l>=MIN_BYTE && l<=MAX_BYTE) {
wvd_vegt 3:abbf43fab7d5 476 parms[i].type=PARM_CHAR;
wvd_vegt 3:abbf43fab7d5 477 parms[i].val.uc =(unsigned char)l;
wvd_vegt 3:abbf43fab7d5 478 } else {
wvd_vegt 3:abbf43fab7d5 479 error = i+1;
wvd_vegt 3:abbf43fab7d5 480 }
wvd_vegt 3:abbf43fab7d5 481
wvd_vegt 3:abbf43fab7d5 482 break;
wvd_vegt 3:abbf43fab7d5 483 case 'h' : //short
wvd_vegt 3:abbf43fab7d5 484 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 485 if (l>=MIN_SHORT && l<=MAX_SHORT) {
wvd_vegt 3:abbf43fab7d5 486 parms[i].type=PARM_SHORT;
wvd_vegt 3:abbf43fab7d5 487 parms[i].val.w=(short)l;
wvd_vegt 3:abbf43fab7d5 488 } else {
wvd_vegt 3:abbf43fab7d5 489 error = i+1;
wvd_vegt 3:abbf43fab7d5 490 }
wvd_vegt 3:abbf43fab7d5 491
wvd_vegt 3:abbf43fab7d5 492 break;
wvd_vegt 3:abbf43fab7d5 493 case 'l' : //long
wvd_vegt 3:abbf43fab7d5 494 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 495 parms[i].type=PARM_LONG;
wvd_vegt 3:abbf43fab7d5 496 parms[i].val.l=l;
wvd_vegt 3:abbf43fab7d5 497
wvd_vegt 3:abbf43fab7d5 498 break;
wvd_vegt 7:269c2445b8f5 499 default: //int
wvd_vegt 3:abbf43fab7d5 500 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 501 if (l>=MIN_INT && l<=MAX_INT) {
wvd_vegt 3:abbf43fab7d5 502 parms[i].type=PARM_INT;
wvd_vegt 3:abbf43fab7d5 503 parms[i].val.l=(int)l;
wvd_vegt 3:abbf43fab7d5 504 } else {
wvd_vegt 3:abbf43fab7d5 505 error = i+1;
wvd_vegt 3:abbf43fab7d5 506 }
wvd_vegt 3:abbf43fab7d5 507 break;
wvd_vegt 3:abbf43fab7d5 508 }
wvd_vegt 3:abbf43fab7d5 509
wvd_vegt 3:abbf43fab7d5 510 if (error==0 &&
wvd_vegt 3:abbf43fab7d5 511 (endptr==toks[i] //No Conversion at all.
wvd_vegt 3:abbf43fab7d5 512 || *endptr)) { //Incomplete conversion.
wvd_vegt 3:abbf43fab7d5 513 error = i+1;
wvd_vegt 3:abbf43fab7d5 514 }
wvd_vegt 3:abbf43fab7d5 515
wvd_vegt 3:abbf43fab7d5 516 break;
wvd_vegt 3:abbf43fab7d5 517 }
wvd_vegt 3:abbf43fab7d5 518
wvd_vegt 3:abbf43fab7d5 519 //Floating Point Types
wvd_vegt 3:abbf43fab7d5 520 switch (typ) {
wvd_vegt 3:abbf43fab7d5 521 case 'e' :
wvd_vegt 3:abbf43fab7d5 522 case 'f' :
wvd_vegt 3:abbf43fab7d5 523 case 'g' :
wvd_vegt 3:abbf43fab7d5 524 f = strtod((char*)toks[i], &endptr);
wvd_vegt 3:abbf43fab7d5 525
wvd_vegt 3:abbf43fab7d5 526 parms[i].type=PARM_FLOAT;
wvd_vegt 3:abbf43fab7d5 527 parms[i].val.f=f;
wvd_vegt 3:abbf43fab7d5 528
wvd_vegt 3:abbf43fab7d5 529 if (error==0 &&
wvd_vegt 3:abbf43fab7d5 530 (endptr==toks[i] //No Conversion at all.
wvd_vegt 3:abbf43fab7d5 531 || *endptr)) { //Incomplete conversion.
wvd_vegt 3:abbf43fab7d5 532 error = i;
wvd_vegt 3:abbf43fab7d5 533 }
wvd_vegt 3:abbf43fab7d5 534
wvd_vegt 3:abbf43fab7d5 535 break;
wvd_vegt 3:abbf43fab7d5 536 }
wvd_vegt 3:abbf43fab7d5 537
wvd_vegt 3:abbf43fab7d5 538 //String types
wvd_vegt 3:abbf43fab7d5 539 switch (typ) {
wvd_vegt 3:abbf43fab7d5 540 case 'c' :
wvd_vegt 3:abbf43fab7d5 541 parms[i].type=PARM_CHAR;
wvd_vegt 3:abbf43fab7d5 542 parms[i].val.c=((char*)toks[i])[0];
wvd_vegt 3:abbf43fab7d5 543
wvd_vegt 3:abbf43fab7d5 544 if (error==0 && strlen((char*)toks[i])!=1) { //Incomplete conversion.
wvd_vegt 3:abbf43fab7d5 545 error = i;
wvd_vegt 3:abbf43fab7d5 546 }
wvd_vegt 3:abbf43fab7d5 547
wvd_vegt 3:abbf43fab7d5 548 break;
wvd_vegt 3:abbf43fab7d5 549
wvd_vegt 3:abbf43fab7d5 550 case 's' :
wvd_vegt 3:abbf43fab7d5 551 parms[i].type=PARM_STRING;
wvd_vegt 3:abbf43fab7d5 552 strncpy(parms[i].val.s,(char*)toks[i], strlen((char*)toks[i]));
wvd_vegt 3:abbf43fab7d5 553
wvd_vegt 3:abbf43fab7d5 554 break;
wvd_vegt 3:abbf43fab7d5 555 }
wvd_vegt 3:abbf43fab7d5 556 }
wvd_vegt 3:abbf43fab7d5 557 } else {
wvd_vegt 7:269c2445b8f5 558 cid=CID_LAST;
wvd_vegt 3:abbf43fab7d5 559 }
wvd_vegt 3:abbf43fab7d5 560 }
wvd_vegt 3:abbf43fab7d5 561
wvd_vegt 6:76b033971c3c 562 return cid;
wvd_vegt 3:abbf43fab7d5 563 }
wvd_vegt 3:abbf43fab7d5 564
wvd_vegt 7:269c2445b8f5 565 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 566
wvd_vegt 7:269c2445b8f5 567 void Cmdb::cmd_dispatcher(char *cmd) {
wvd_vegt 3:abbf43fab7d5 568 int cid;
wvd_vegt 3:abbf43fab7d5 569 int ndx;
wvd_vegt 3:abbf43fab7d5 570
wvd_vegt 7:269c2445b8f5 571 cid = parse(cmd);
wvd_vegt 7:269c2445b8f5 572 ndx = cmdid_index(cid);
wvd_vegt 3:abbf43fab7d5 573
wvd_vegt 3:abbf43fab7d5 574 if (cid!=-1) {
wvd_vegt 7:269c2445b8f5 575 //printf("cmds[%d]=%d\r\n",ndx, cid);
wvd_vegt 3:abbf43fab7d5 576
wvd_vegt 3:abbf43fab7d5 577 /*------------------------------------------------
wvd_vegt 3:abbf43fab7d5 578 Process the command and it's arguments that are
wvd_vegt 3:abbf43fab7d5 579 found. id contains the command id and argcnt &
wvd_vegt 3:abbf43fab7d5 580 argfnd the number of found and expected paramaters
wvd_vegt 3:abbf43fab7d5 581 parms contains the parsed argument values and their
wvd_vegt 3:abbf43fab7d5 582 types.
wvd_vegt 3:abbf43fab7d5 583 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 584
wvd_vegt 3:abbf43fab7d5 585 if (cid==CID_LAST) {
wvd_vegt 7:269c2445b8f5 586 print("Unknown command, type 'Help' for a list of available commands.\r\n");
wvd_vegt 3:abbf43fab7d5 587 } else {
wvd_vegt 7:269c2445b8f5 588 //printf("cmds[%d]=%d [%s]\r\n",ndx, cid, _cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 589
wvd_vegt 3:abbf43fab7d5 590 //Test for more commandline than allowed too.
wvd_vegt 3:abbf43fab7d5 591 //i.e. run 1 is wrong.
wvd_vegt 3:abbf43fab7d5 592
wvd_vegt 7:269c2445b8f5 593 if (argcnt==0 && argfnd==0 && error==0 && ndx!=-1 && cmds[ndx].subs==SUBSYSTEM) {
wvd_vegt 6:76b033971c3c 594 //Handle all SubSystems.
wvd_vegt 3:abbf43fab7d5 595 subsystem=cid;
wvd_vegt 3:abbf43fab7d5 596 } else if ( ((cid==CID_HELP) || (argcnt==argfnd)) && error==0 ) {
wvd_vegt 3:abbf43fab7d5 597 switch (cid) {
wvd_vegt 3:abbf43fab7d5 598
wvd_vegt 7:269c2445b8f5 599 #ifdef ENABLEMACROS
wvd_vegt 3:abbf43fab7d5 600 /////// GLOBAL MACRO COMMANDS ///////
wvd_vegt 3:abbf43fab7d5 601
wvd_vegt 3:abbf43fab7d5 602 //Define Macro from commandline
wvd_vegt 3:abbf43fab7d5 603 case CID_MACRO:
wvd_vegt 3:abbf43fab7d5 604 macro_ptr=-1;
wvd_vegt 8:83edd6addbd5 605
wvd_vegt 8:83edd6addbd5 606 zeromemory((char*)macro_buf, sizeof(macro_buf));
wvd_vegt 3:abbf43fab7d5 607 strncpy(macro_buf, STRINGPARM(0), sizeof(macro_buf) - 1);
wvd_vegt 8:83edd6addbd5 608
wvd_vegt 8:83edd6addbd5 609 //DEBUG
wvd_vegt 8:83edd6addbd5 610 printf("Macro=%s\r\n",macro_buf);
wvd_vegt 3:abbf43fab7d5 611 break;
wvd_vegt 3:abbf43fab7d5 612
wvd_vegt 3:abbf43fab7d5 613 //Run Macro
wvd_vegt 3:abbf43fab7d5 614 case CID_RUN:
wvd_vegt 3:abbf43fab7d5 615 macro_ptr=0;
wvd_vegt 3:abbf43fab7d5 616 break;
wvd_vegt 3:abbf43fab7d5 617
wvd_vegt 3:abbf43fab7d5 618 //List Macro's
wvd_vegt 3:abbf43fab7d5 619 case CID_MACROS:
wvd_vegt 7:269c2445b8f5 620 print("[Macro]\r\n");
wvd_vegt 8:83edd6addbd5 621 if (macro_buf[0]!='\0') {
wvd_vegt 7:269c2445b8f5 622 printf("Value=%s\r\n",macro_buf);
wvd_vegt 3:abbf43fab7d5 623 } else {
wvd_vegt 7:269c2445b8f5 624 printf(";No Macro Defined\r\n");
wvd_vegt 3:abbf43fab7d5 625 }
wvd_vegt 3:abbf43fab7d5 626 break;
wvd_vegt 3:abbf43fab7d5 627
wvd_vegt 7:269c2445b8f5 628 #endif //ENABLEMACROS
wvd_vegt 3:abbf43fab7d5 629
wvd_vegt 3:abbf43fab7d5 630 #ifdef STATEMACHINE
wvd_vegt 7:269c2445b8f5 631 /////// GLOBAL STATEMACHINE COMMANDS ///////
wvd_vegt 3:abbf43fab7d5 632
wvd_vegt 3:abbf43fab7d5 633 //Start State Machine
wvd_vegt 3:abbf43fab7d5 634 case CID_STATE:
wvd_vegt 3:abbf43fab7d5 635 statemachine(BYTEPARM(0));
wvd_vegt 3:abbf43fab7d5 636
wvd_vegt 3:abbf43fab7d5 637 break;
wvd_vegt 3:abbf43fab7d5 638 #endif
wvd_vegt 3:abbf43fab7d5 639
wvd_vegt 3:abbf43fab7d5 640 /////// GLOBAL COMMANDS ///////
wvd_vegt 3:abbf43fab7d5 641
wvd_vegt 3:abbf43fab7d5 642 //Echo
wvd_vegt 3:abbf43fab7d5 643 case CID_ECHO:
wvd_vegt 3:abbf43fab7d5 644 echo = BOOLPARM(0);
wvd_vegt 3:abbf43fab7d5 645 break;
wvd_vegt 3:abbf43fab7d5 646
wvd_vegt 3:abbf43fab7d5 647 //Bold
wvd_vegt 3:abbf43fab7d5 648 case CID_BOLD:
wvd_vegt 3:abbf43fab7d5 649 bold = BOOLPARM(0);
wvd_vegt 3:abbf43fab7d5 650 break;
wvd_vegt 3:abbf43fab7d5 651
wvd_vegt 3:abbf43fab7d5 652 //Warm Boot
wvd_vegt 3:abbf43fab7d5 653 case CID_BOOT:
wvd_vegt 7:269c2445b8f5 654 mbed_reset();
wvd_vegt 3:abbf43fab7d5 655 break;
wvd_vegt 3:abbf43fab7d5 656
wvd_vegt 3:abbf43fab7d5 657 //Sends an ANSI escape code to clear the screen.
wvd_vegt 3:abbf43fab7d5 658 case CID_CLS:
wvd_vegt 7:269c2445b8f5 659 print(cls);
wvd_vegt 3:abbf43fab7d5 660 break;
wvd_vegt 3:abbf43fab7d5 661
wvd_vegt 3:abbf43fab7d5 662 //Returns to CMD> prompt where most commands are disabled.
wvd_vegt 3:abbf43fab7d5 663 case CID_IDLE:
wvd_vegt 3:abbf43fab7d5 664 subsystem=-1;
wvd_vegt 3:abbf43fab7d5 665 break;
wvd_vegt 3:abbf43fab7d5 666
wvd_vegt 3:abbf43fab7d5 667 //Help
wvd_vegt 3:abbf43fab7d5 668 case CID_HELP: {
wvd_vegt 7:269c2445b8f5 669 print("\r\n");
wvd_vegt 3:abbf43fab7d5 670
wvd_vegt 3:abbf43fab7d5 671 if (argfnd>0) {
wvd_vegt 7:269c2445b8f5 672 cid = cmdid_search(STRINGPARM(0));
wvd_vegt 3:abbf43fab7d5 673 } else {
wvd_vegt 3:abbf43fab7d5 674 cid=CID_LAST;
wvd_vegt 3:abbf43fab7d5 675 }
wvd_vegt 3:abbf43fab7d5 676
wvd_vegt 3:abbf43fab7d5 677 if (argfnd>0 && cid!=CID_LAST) {
wvd_vegt 3:abbf43fab7d5 678
wvd_vegt 3:abbf43fab7d5 679 //Help with a valid command as first parameter
wvd_vegt 7:269c2445b8f5 680 ndx = cmdid_index(cid);
wvd_vegt 7:269c2445b8f5 681
wvd_vegt 7:269c2445b8f5 682 switch (cmds[ndx].subs) {
wvd_vegt 7:269c2445b8f5 683 case SUBSYSTEM: { //Dump whole subsystem
wvd_vegt 7:269c2445b8f5 684 printf("%s subsystem commands:\r\n\r\n",cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 685
wvd_vegt 7:269c2445b8f5 686 //Count SubSystem Commands.
wvd_vegt 7:269c2445b8f5 687 int subcmds =0;
wvd_vegt 7:269c2445b8f5 688 for (int i=0;i<cmds.size();i++) {
wvd_vegt 7:269c2445b8f5 689 if (cmds[i].subs==cid) {
wvd_vegt 7:269c2445b8f5 690 subcmds++;
wvd_vegt 3:abbf43fab7d5 691 }
wvd_vegt 3:abbf43fab7d5 692 }
wvd_vegt 3:abbf43fab7d5 693
wvd_vegt 7:269c2445b8f5 694 //Print SubSystem Commands.
wvd_vegt 7:269c2445b8f5 695 for (int i=0;i<cmds.size()-1;i++) {
wvd_vegt 7:269c2445b8f5 696 if (cmds[i].subs==cid) {
wvd_vegt 7:269c2445b8f5 697 subcmds--;
wvd_vegt 7:269c2445b8f5 698 if (subcmds!=0) {
wvd_vegt 7:269c2445b8f5 699 cmdhelp("",i,",\r\n");
wvd_vegt 7:269c2445b8f5 700 } else {
wvd_vegt 7:269c2445b8f5 701 cmdhelp("",i,".\r\n");
wvd_vegt 7:269c2445b8f5 702 }
wvd_vegt 7:269c2445b8f5 703 }
wvd_vegt 7:269c2445b8f5 704 }
wvd_vegt 7:269c2445b8f5 705 }
wvd_vegt 7:269c2445b8f5 706 break;
wvd_vegt 3:abbf43fab7d5 707
wvd_vegt 3:abbf43fab7d5 708 case GLOBALCMD: //Dump command only
wvd_vegt 7:269c2445b8f5 709 //print("Global command:\r\n\r\n",cmd_tbl[cmd_tbl[ndx].subs].cmdstr);
wvd_vegt 7:269c2445b8f5 710 cmdhelp("Syntax: ",ndx,".\r\n");
wvd_vegt 3:abbf43fab7d5 711 break;
wvd_vegt 3:abbf43fab7d5 712
wvd_vegt 3:abbf43fab7d5 713 default: //Dump one subsystem command
wvd_vegt 7:269c2445b8f5 714 printf("%s subsystem command:\r\n\r\n",cmds[cmds[ndx].subs].cmdstr);
wvd_vegt 7:269c2445b8f5 715 cmdhelp("Syntax: ",ndx,".\r\n");
wvd_vegt 3:abbf43fab7d5 716 break;
wvd_vegt 3:abbf43fab7d5 717 }
wvd_vegt 3:abbf43fab7d5 718 } else {
wvd_vegt 3:abbf43fab7d5 719 if (argfnd>0) {
wvd_vegt 3:abbf43fab7d5 720 //Help with invalid command as first parameter
wvd_vegt 7:269c2445b8f5 721 print("Unknown command, type 'Help' for a list of available commands.\r\n");
wvd_vegt 3:abbf43fab7d5 722 } else {
wvd_vegt 3:abbf43fab7d5 723 //Help
wvd_vegt 3:abbf43fab7d5 724
wvd_vegt 3:abbf43fab7d5 725 //Dump Active Subsystem, Global & Other (dormant) Subsystems
wvd_vegt 7:269c2445b8f5 726 //-1 because we want comma's and for the last a .
wvd_vegt 7:269c2445b8f5 727 for (int i=0;i<cmds.size()-1;i++) {
wvd_vegt 7:269c2445b8f5 728 if ((cmds[i].subs<0) || (cmds[i].subs==subsystem)) {
wvd_vegt 7:269c2445b8f5 729 cmdhelp("",i,",\r\n");
wvd_vegt 3:abbf43fab7d5 730 }
wvd_vegt 3:abbf43fab7d5 731 }
wvd_vegt 7:269c2445b8f5 732 cmdhelp("",cmds.size()-1,".\r\n");
wvd_vegt 3:abbf43fab7d5 733 }
wvd_vegt 3:abbf43fab7d5 734 }
wvd_vegt 7:269c2445b8f5 735 print("\r\n");
wvd_vegt 3:abbf43fab7d5 736 break;
wvd_vegt 3:abbf43fab7d5 737 } //CID_HELP
wvd_vegt 7:269c2445b8f5 738
wvd_vegt 6:76b033971c3c 739 default : {
wvd_vegt 7:269c2445b8f5 740 // Do a Call to the Application's Command Dispatcher.
wvd_vegt 7:269c2445b8f5 741 (*callback)(*this, cid);
wvd_vegt 6:76b033971c3c 742 }
wvd_vegt 3:abbf43fab7d5 743 }
wvd_vegt 3:abbf43fab7d5 744 } else {
wvd_vegt 7:269c2445b8f5 745 cmdhelp("Syntax: ",ndx,".\r\n");
wvd_vegt 3:abbf43fab7d5 746 }
wvd_vegt 6:76b033971c3c 747
wvd_vegt 7:269c2445b8f5 748 }
wvd_vegt 3:abbf43fab7d5 749
wvd_vegt 3:abbf43fab7d5 750 } else {
wvd_vegt 7:269c2445b8f5 751 //cid==-1
wvd_vegt 3:abbf43fab7d5 752 }
wvd_vegt 3:abbf43fab7d5 753 }
wvd_vegt 3:abbf43fab7d5 754
wvd_vegt 7:269c2445b8f5 755 void Cmdb::prompt(void) {
wvd_vegt 7:269c2445b8f5 756 #ifdef SUBSYSTEMPROMPTS
wvd_vegt 7:269c2445b8f5 757 if (subsystem!=-1) {
wvd_vegt 7:269c2445b8f5 758 int ndx = cmdid_index(subsystem);
wvd_vegt 3:abbf43fab7d5 759
wvd_vegt 7:269c2445b8f5 760 printf("%s>",_cmds[ndx].cmdstr);
wvd_vegt 7:269c2445b8f5 761
wvd_vegt 7:269c2445b8f5 762 return;
wvd_vegt 3:abbf43fab7d5 763 }
wvd_vegt 7:269c2445b8f5 764 #endif //SUBSYSTEMPROMPTS
wvd_vegt 3:abbf43fab7d5 765
wvd_vegt 7:269c2445b8f5 766 printf(PROMPT);
wvd_vegt 3:abbf43fab7d5 767 }
wvd_vegt 3:abbf43fab7d5 768
wvd_vegt 7:269c2445b8f5 769 void Cmdb::cmdhelp(char *pre, int ndx, char *post) {
wvd_vegt 3:abbf43fab7d5 770 int j;
wvd_vegt 3:abbf43fab7d5 771 int k;
wvd_vegt 3:abbf43fab7d5 772 int lastmod;
wvd_vegt 3:abbf43fab7d5 773
wvd_vegt 3:abbf43fab7d5 774 k=0;
wvd_vegt 3:abbf43fab7d5 775 lastmod=0;
wvd_vegt 3:abbf43fab7d5 776
wvd_vegt 7:269c2445b8f5 777 switch (cmds[ndx].subs) {
wvd_vegt 3:abbf43fab7d5 778 case SUBSYSTEM :
wvd_vegt 3:abbf43fab7d5 779 break;
wvd_vegt 3:abbf43fab7d5 780 case GLOBALCMD :
wvd_vegt 3:abbf43fab7d5 781 break;
wvd_vegt 3:abbf43fab7d5 782 case HIDDENSUB :
wvd_vegt 3:abbf43fab7d5 783 return;
wvd_vegt 3:abbf43fab7d5 784 default :
wvd_vegt 3:abbf43fab7d5 785 if (strlen(pre)==0 && bold) {
wvd_vegt 7:269c2445b8f5 786 print(boldon);
wvd_vegt 3:abbf43fab7d5 787 }
wvd_vegt 3:abbf43fab7d5 788 break;
wvd_vegt 3:abbf43fab7d5 789 }
wvd_vegt 3:abbf43fab7d5 790
wvd_vegt 7:269c2445b8f5 791 print(pre);
wvd_vegt 3:abbf43fab7d5 792 k+=strlen(pre);
wvd_vegt 3:abbf43fab7d5 793
wvd_vegt 3:abbf43fab7d5 794 if (k==0) {
wvd_vegt 7:269c2445b8f5 795 printf("%12s",cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 796 k+=12;
wvd_vegt 3:abbf43fab7d5 797 } else {
wvd_vegt 3:abbf43fab7d5 798 if (strlen(pre)>0 && bold) {
wvd_vegt 7:269c2445b8f5 799 print(boldon);
wvd_vegt 3:abbf43fab7d5 800 }
wvd_vegt 3:abbf43fab7d5 801
wvd_vegt 7:269c2445b8f5 802 printf("%s",cmds[ndx].cmdstr);
wvd_vegt 7:269c2445b8f5 803 k+=strlen(cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 804
wvd_vegt 3:abbf43fab7d5 805 if (strlen(pre)>0 && bold) {
wvd_vegt 7:269c2445b8f5 806 print(boldoff);
wvd_vegt 3:abbf43fab7d5 807 }
wvd_vegt 3:abbf43fab7d5 808 }
wvd_vegt 3:abbf43fab7d5 809
wvd_vegt 7:269c2445b8f5 810 if (strlen(cmds[ndx].parms)) {
wvd_vegt 7:269c2445b8f5 811 printch(sp);
wvd_vegt 3:abbf43fab7d5 812 k++;
wvd_vegt 3:abbf43fab7d5 813 }
wvd_vegt 3:abbf43fab7d5 814
wvd_vegt 7:269c2445b8f5 815 for (j=0;j<strlen(cmds[ndx].parms);j++) {
wvd_vegt 7:269c2445b8f5 816 switch (cmds[ndx].parms[j]) {
wvd_vegt 3:abbf43fab7d5 817 case '%' :
wvd_vegt 3:abbf43fab7d5 818 lastmod=0;
wvd_vegt 3:abbf43fab7d5 819 break;
wvd_vegt 3:abbf43fab7d5 820
wvd_vegt 3:abbf43fab7d5 821 case 'b' :
wvd_vegt 3:abbf43fab7d5 822 lastmod=8;
wvd_vegt 3:abbf43fab7d5 823 break;
wvd_vegt 3:abbf43fab7d5 824 case 'h' :
wvd_vegt 3:abbf43fab7d5 825 lastmod=16;
wvd_vegt 3:abbf43fab7d5 826 break;
wvd_vegt 3:abbf43fab7d5 827 case 'l' :
wvd_vegt 3:abbf43fab7d5 828 lastmod=32;
wvd_vegt 3:abbf43fab7d5 829 break;
wvd_vegt 3:abbf43fab7d5 830
wvd_vegt 3:abbf43fab7d5 831 case 'd' :
wvd_vegt 3:abbf43fab7d5 832 case 'i' : {
wvd_vegt 3:abbf43fab7d5 833 switch (lastmod) {
wvd_vegt 3:abbf43fab7d5 834 case 0 :
wvd_vegt 3:abbf43fab7d5 835 case 16 :
wvd_vegt 7:269c2445b8f5 836 print("int");
wvd_vegt 3:abbf43fab7d5 837 k+=3;
wvd_vegt 3:abbf43fab7d5 838 break;
wvd_vegt 3:abbf43fab7d5 839 case 8 :
wvd_vegt 7:269c2445b8f5 840 print("shortint");
wvd_vegt 3:abbf43fab7d5 841 k+=8;
wvd_vegt 3:abbf43fab7d5 842 break;
wvd_vegt 3:abbf43fab7d5 843 case 32:
wvd_vegt 7:269c2445b8f5 844 print("longint");
wvd_vegt 3:abbf43fab7d5 845 k+=7;
wvd_vegt 3:abbf43fab7d5 846 break;
wvd_vegt 3:abbf43fab7d5 847 }
wvd_vegt 3:abbf43fab7d5 848 break;
wvd_vegt 3:abbf43fab7d5 849 }
wvd_vegt 3:abbf43fab7d5 850
wvd_vegt 3:abbf43fab7d5 851 case 'u' :
wvd_vegt 3:abbf43fab7d5 852 case 'o' :
wvd_vegt 3:abbf43fab7d5 853 case 'x' : {
wvd_vegt 3:abbf43fab7d5 854 switch (lastmod) {
wvd_vegt 3:abbf43fab7d5 855 case 0 :
wvd_vegt 3:abbf43fab7d5 856 case 16 :
wvd_vegt 7:269c2445b8f5 857 print("word");
wvd_vegt 3:abbf43fab7d5 858 k+=4;
wvd_vegt 3:abbf43fab7d5 859 break;
wvd_vegt 3:abbf43fab7d5 860 case 8 :
wvd_vegt 7:269c2445b8f5 861 print("byte");
wvd_vegt 3:abbf43fab7d5 862 k+=4;
wvd_vegt 3:abbf43fab7d5 863 break;
wvd_vegt 3:abbf43fab7d5 864 case 32 :
wvd_vegt 7:269c2445b8f5 865 print("dword");
wvd_vegt 3:abbf43fab7d5 866 k+=5;
wvd_vegt 3:abbf43fab7d5 867 break;
wvd_vegt 3:abbf43fab7d5 868 }
wvd_vegt 3:abbf43fab7d5 869
wvd_vegt 7:269c2445b8f5 870 switch (cmds[ndx].parms[j]) {
wvd_vegt 3:abbf43fab7d5 871 case 'o' :
wvd_vegt 7:269c2445b8f5 872 print("[o]");
wvd_vegt 3:abbf43fab7d5 873 k+=3;
wvd_vegt 3:abbf43fab7d5 874 break;
wvd_vegt 3:abbf43fab7d5 875 case 'x' :
wvd_vegt 7:269c2445b8f5 876 print("[h]");
wvd_vegt 3:abbf43fab7d5 877 k+=3;
wvd_vegt 3:abbf43fab7d5 878 break;
wvd_vegt 3:abbf43fab7d5 879 }
wvd_vegt 3:abbf43fab7d5 880
wvd_vegt 3:abbf43fab7d5 881 break;
wvd_vegt 3:abbf43fab7d5 882 }
wvd_vegt 3:abbf43fab7d5 883
wvd_vegt 3:abbf43fab7d5 884 case 'e' :
wvd_vegt 3:abbf43fab7d5 885 case 'f' :
wvd_vegt 3:abbf43fab7d5 886 case 'g' :
wvd_vegt 7:269c2445b8f5 887 print("float");
wvd_vegt 3:abbf43fab7d5 888 k+=5;
wvd_vegt 3:abbf43fab7d5 889 break;
wvd_vegt 3:abbf43fab7d5 890
wvd_vegt 3:abbf43fab7d5 891 case 'c' :
wvd_vegt 7:269c2445b8f5 892 print("char");
wvd_vegt 3:abbf43fab7d5 893 k+=4;
wvd_vegt 3:abbf43fab7d5 894 break;
wvd_vegt 3:abbf43fab7d5 895
wvd_vegt 3:abbf43fab7d5 896 case 's' :
wvd_vegt 7:269c2445b8f5 897 print("string");
wvd_vegt 3:abbf43fab7d5 898 k+=6;
wvd_vegt 3:abbf43fab7d5 899 break;
wvd_vegt 3:abbf43fab7d5 900
wvd_vegt 3:abbf43fab7d5 901 case ' ' :
wvd_vegt 7:269c2445b8f5 902 printch(sp);
wvd_vegt 3:abbf43fab7d5 903 k++;
wvd_vegt 3:abbf43fab7d5 904 break;
wvd_vegt 3:abbf43fab7d5 905 }
wvd_vegt 3:abbf43fab7d5 906 }
wvd_vegt 3:abbf43fab7d5 907
wvd_vegt 7:269c2445b8f5 908 for (j=k;j<40;j++) printch(sp);
wvd_vegt 3:abbf43fab7d5 909
wvd_vegt 7:269c2445b8f5 910 switch (cmds[ndx].subs) {
wvd_vegt 3:abbf43fab7d5 911 case SUBSYSTEM :
wvd_vegt 3:abbf43fab7d5 912 if (ndx==subsystem) {
wvd_vegt 7:269c2445b8f5 913 printf("- %s (active subsystem)%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 914 } else {
wvd_vegt 7:269c2445b8f5 915 printf("- %s (dormant subsystem)%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 916 }
wvd_vegt 3:abbf43fab7d5 917 break;
wvd_vegt 3:abbf43fab7d5 918 case HIDDENSUB :
wvd_vegt 3:abbf43fab7d5 919 break;
wvd_vegt 3:abbf43fab7d5 920 case GLOBALCMD :
wvd_vegt 7:269c2445b8f5 921 printf("- %s (global command)%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 922 break;
wvd_vegt 3:abbf43fab7d5 923 default :
wvd_vegt 7:269c2445b8f5 924 printf("- %s%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 925 if (strlen(pre)==0 && bold) {
wvd_vegt 7:269c2445b8f5 926 print(boldoff);
wvd_vegt 3:abbf43fab7d5 927 }
wvd_vegt 3:abbf43fab7d5 928 break;
wvd_vegt 3:abbf43fab7d5 929 }
wvd_vegt 3:abbf43fab7d5 930
wvd_vegt 7:269c2445b8f5 931 if (strlen(pre)>0 && strlen(cmds[ndx].parmdescr)) {
wvd_vegt 7:269c2445b8f5 932 printf("Params: %s",cmds[ndx].parmdescr);
wvd_vegt 7:269c2445b8f5 933 print("\r\n");
wvd_vegt 3:abbf43fab7d5 934 }
wvd_vegt 3:abbf43fab7d5 935 }
wvd_vegt 3:abbf43fab7d5 936
wvd_vegt 3:abbf43fab7d5 937 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 938 //----Wrappers
wvd_vegt 3:abbf43fab7d5 939 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 940
wvd_vegt 3:abbf43fab7d5 941 void Cmdb::zeromemory(char *p,unsigned int siz) {
wvd_vegt 3:abbf43fab7d5 942 memset(p,'\0',siz);
wvd_vegt 3:abbf43fab7d5 943 }
wvd_vegt 3:abbf43fab7d5 944
wvd_vegt 3:abbf43fab7d5 945 int Cmdb::stricmp (char *s1, char *s2) {
wvd_vegt 3:abbf43fab7d5 946 int i;
wvd_vegt 3:abbf43fab7d5 947 int len1,len2;
wvd_vegt 3:abbf43fab7d5 948
wvd_vegt 3:abbf43fab7d5 949 len1=strlen(s1);
wvd_vegt 3:abbf43fab7d5 950 len2=strlen(s2);
wvd_vegt 3:abbf43fab7d5 951
wvd_vegt 3:abbf43fab7d5 952 for (i = 0; (i<len1) && (i<len2);i++) {
wvd_vegt 3:abbf43fab7d5 953 if ( toupper (s1[i])<toupper(s2[i]) ) return (-1);
wvd_vegt 3:abbf43fab7d5 954 if ( toupper (s1[i])>toupper(s2[i]) ) return (+1);
wvd_vegt 3:abbf43fab7d5 955 }
wvd_vegt 3:abbf43fab7d5 956
wvd_vegt 3:abbf43fab7d5 957 if (len1<len2) return (-1);
wvd_vegt 3:abbf43fab7d5 958 if (len1>len2) return (+1);
wvd_vegt 3:abbf43fab7d5 959
wvd_vegt 3:abbf43fab7d5 960 return (0);
wvd_vegt 3:abbf43fab7d5 961 }
wvd_vegt 7:269c2445b8f5 962
wvd_vegt 7:269c2445b8f5 963 //------------------------------------------------------------------------------