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

Committer:
wvd_vegt
Date:
Fri Feb 11 00:51:37 2011 +0000
Revision:
6:76b033971c3c
Parent:
5:68d3a351c3ea
Child:
7:269c2445b8f5
0.5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wvd_vegt 3:abbf43fab7d5 1 /* mbed Command Interpreter Library
wvd_vegt 3:abbf43fab7d5 2 * Copyright (c) 2011 wvd_vegt
wvd_vegt 3:abbf43fab7d5 3 *
wvd_vegt 3:abbf43fab7d5 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
wvd_vegt 3:abbf43fab7d5 5 * of this software and associated documentation files (the "Software"), to deal
wvd_vegt 3:abbf43fab7d5 6 * in the Software without restriction, including without limitation the rights
wvd_vegt 3:abbf43fab7d5 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
wvd_vegt 3:abbf43fab7d5 8 * copies of the Software, and to permit persons to whom the Software is
wvd_vegt 3:abbf43fab7d5 9 * furnished to do so, subject to the following conditions:
wvd_vegt 3:abbf43fab7d5 10 *
wvd_vegt 3:abbf43fab7d5 11 * The above copyright notice and this permission notice shall be included in
wvd_vegt 3:abbf43fab7d5 12 * all copies or substantial portions of the Software.
wvd_vegt 3:abbf43fab7d5 13 *
wvd_vegt 3:abbf43fab7d5 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
wvd_vegt 3:abbf43fab7d5 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
wvd_vegt 3:abbf43fab7d5 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
wvd_vegt 3:abbf43fab7d5 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
wvd_vegt 3:abbf43fab7d5 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
wvd_vegt 3:abbf43fab7d5 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
wvd_vegt 3:abbf43fab7d5 20 * THE SOFTWARE.
wvd_vegt 3:abbf43fab7d5 21 */
wvd_vegt 3:abbf43fab7d5 22
wvd_vegt 3:abbf43fab7d5 23 #ifndef MBED_CMDB_H
wvd_vegt 3:abbf43fab7d5 24 #define MBED_CMDB_H
wvd_vegt 3:abbf43fab7d5 25
wvd_vegt 3:abbf43fab7d5 26 #include "mbed.h"
wvd_vegt 3:abbf43fab7d5 27
wvd_vegt 3:abbf43fab7d5 28 #include <vector>
wvd_vegt 3:abbf43fab7d5 29
wvd_vegt 3:abbf43fab7d5 30 //Max size of an Ansi escape code.
wvd_vegt 3:abbf43fab7d5 31 #define MAX_ESC_LEN 5
wvd_vegt 3:abbf43fab7d5 32
wvd_vegt 3:abbf43fab7d5 33 //Max (strlen) of a Param.
wvd_vegt 3:abbf43fab7d5 34 #define MAX_PARM_LEN 32
wvd_vegt 3:abbf43fab7d5 35
wvd_vegt 3:abbf43fab7d5 36 //Max eight parms.
wvd_vegt 3:abbf43fab7d5 37 #define MAX_ARGS 8
wvd_vegt 3:abbf43fab7d5 38
wvd_vegt 3:abbf43fab7d5 39 //Max 132 characters commandline.
wvd_vegt 3:abbf43fab7d5 40 #define MAX_CMD_LEN 132
wvd_vegt 3:abbf43fab7d5 41
wvd_vegt 3:abbf43fab7d5 42 //'Show' hidden subsystems and commands.
wvd_vegt 3:abbf43fab7d5 43 #define SHOWHIDDEN
wvd_vegt 3:abbf43fab7d5 44
wvd_vegt 3:abbf43fab7d5 45 #define MIN_BYTE -128
wvd_vegt 3:abbf43fab7d5 46 #define MAX_BYTE +127
wvd_vegt 3:abbf43fab7d5 47
wvd_vegt 3:abbf43fab7d5 48 #define MIN_SHORT -32768
wvd_vegt 3:abbf43fab7d5 49 #define MAX_SHORT +32767
wvd_vegt 3:abbf43fab7d5 50
wvd_vegt 3:abbf43fab7d5 51 #define MIN_INT -32768
wvd_vegt 3:abbf43fab7d5 52 #define MAX_INT +32767
wvd_vegt 3:abbf43fab7d5 53
wvd_vegt 3:abbf43fab7d5 54 //TODO Make sure we use id and array index properly!!
wvd_vegt 3:abbf43fab7d5 55
wvd_vegt 3:abbf43fab7d5 56 struct cmdb_cmd {
wvd_vegt 6:76b033971c3c 57 public:
wvd_vegt 3:abbf43fab7d5 58 char *cmdstr;
wvd_vegt 3:abbf43fab7d5 59 int subs;
wvd_vegt 3:abbf43fab7d5 60 int id; //Changed to int as signed char won't compile
wvd_vegt 3:abbf43fab7d5 61 char *parms;
wvd_vegt 3:abbf43fab7d5 62 char *cmddescr;
wvd_vegt 3:abbf43fab7d5 63 char *parmdescr;
wvd_vegt 5:68d3a351c3ea 64
wvd_vegt 6:76b033971c3c 65 cmdb_cmd(char *_cmdstr, int _subs, int _id, char *_parms, char *_cmddescr, char *_parmdescr = "") {
wvd_vegt 6:76b033971c3c 66 cmdstr = (char*)malloc(strlen(_cmdstr)+1);
wvd_vegt 6:76b033971c3c 67 strcpy(cmdstr,_cmdstr);
wvd_vegt 6:76b033971c3c 68
wvd_vegt 6:76b033971c3c 69 subs = _subs;
wvd_vegt 6:76b033971c3c 70 id = _id;
wvd_vegt 5:68d3a351c3ea 71
wvd_vegt 6:76b033971c3c 72 parms = (char*)malloc(strlen(_parms)+1);
wvd_vegt 5:68d3a351c3ea 73 strcpy(parms,_parms);
wvd_vegt 6:76b033971c3c 74
wvd_vegt 6:76b033971c3c 75 cmddescr = (char*)malloc(strlen(_cmddescr)+1);
wvd_vegt 5:68d3a351c3ea 76 strcpy(cmddescr,_cmddescr);
wvd_vegt 6:76b033971c3c 77
wvd_vegt 6:76b033971c3c 78 parmdescr = (char*)malloc(strlen(_parmdescr)+1);
wvd_vegt 5:68d3a351c3ea 79 strcpy(parmdescr,_parmdescr);
wvd_vegt 5:68d3a351c3ea 80 }
wvd_vegt 3:abbf43fab7d5 81 };
wvd_vegt 3:abbf43fab7d5 82
wvd_vegt 5:68d3a351c3ea 83 //----Escape Codes and Strings
wvd_vegt 5:68d3a351c3ea 84
wvd_vegt 5:68d3a351c3ea 85 const char cr = '\r';
wvd_vegt 5:68d3a351c3ea 86 const char lf = '\n';
wvd_vegt 5:68d3a351c3ea 87 const char bell = '\7';
wvd_vegt 5:68d3a351c3ea 88 const char esc = '\033';
wvd_vegt 5:68d3a351c3ea 89 const char sp = ' ';
wvd_vegt 5:68d3a351c3ea 90 const char crlf[] = "\r\n\0";
wvd_vegt 5:68d3a351c3ea 91
wvd_vegt 5:68d3a351c3ea 92 const char bs[] = "\b \b\0";
wvd_vegt 5:68d3a351c3ea 93
wvd_vegt 5:68d3a351c3ea 94 const char boldon[] = "\033[1m\0";
wvd_vegt 5:68d3a351c3ea 95 const char boldoff[] = "\033[0m\0";
wvd_vegt 5:68d3a351c3ea 96 const char cls[] = "\033[2J\0";
wvd_vegt 5:68d3a351c3ea 97 const char home[] = "\033[H\0";
wvd_vegt 5:68d3a351c3ea 98
wvd_vegt 5:68d3a351c3ea 99 const char prompt[] = "CMD>";
wvd_vegt 5:68d3a351c3ea 100
wvd_vegt 3:abbf43fab7d5 101 //Before including this file, define CID_LAST as the last value from the enum with commands.
wvd_vegt 3:abbf43fab7d5 102
wvd_vegt 3:abbf43fab7d5 103 //#define CMD_TBL_LEN CID_LAST
wvd_vegt 3:abbf43fab7d5 104
wvd_vegt 3:abbf43fab7d5 105 #define SUBSYSTEM -1
wvd_vegt 3:abbf43fab7d5 106 #define GLOBALCMD -2
wvd_vegt 3:abbf43fab7d5 107 #define HIDDENSUB -3
wvd_vegt 3:abbf43fab7d5 108
wvd_vegt 6:76b033971c3c 109 #define CID_BOOT 9990
wvd_vegt 6:76b033971c3c 110 #define CID_MACRO 9991
wvd_vegt 6:76b033971c3c 111 #define CID_RUN 9992
wvd_vegt 6:76b033971c3c 112 #define CID_MACROS 9993
wvd_vegt 3:abbf43fab7d5 113
wvd_vegt 6:76b033971c3c 114 #define CID_ECHO 9994
wvd_vegt 6:76b033971c3c 115 #define CID_BOLD 9995
wvd_vegt 6:76b033971c3c 116 #define CID_CLS 9996
wvd_vegt 6:76b033971c3c 117 #define CID_IDLE 9997
wvd_vegt 6:76b033971c3c 118 #define CID_HELP 9998
wvd_vegt 6:76b033971c3c 119 #define CID_LAST 9999
wvd_vegt 3:abbf43fab7d5 120
wvd_vegt 3:abbf43fab7d5 121 //You need to add the following commands to your command table.
wvd_vegt 3:abbf43fab7d5 122
wvd_vegt 3:abbf43fab7d5 123 //Optional
wvd_vegt 5:68d3a351c3ea 124 const cmdb_cmd BOOT("Boot",GLOBALCMD,CID_BOOT,"","Boot");
wvd_vegt 3:abbf43fab7d5 125
wvd_vegt 3:abbf43fab7d5 126 //Optional
wvd_vegt 5:68d3a351c3ea 127 const cmdb_cmd MACRO("Macro",GLOBALCMD,CID_MACRO,"%s","Define macro (sp->_, cr->|)","command(s)");
wvd_vegt 5:68d3a351c3ea 128 const cmdb_cmd RUN("Run",GLOBALCMD,CID_RUN,"","Run a macro");
wvd_vegt 5:68d3a351c3ea 129 const cmdb_cmd MACROS("Macros",GLOBALCMD,CID_MACROS,"","List macro(s)");
wvd_vegt 3:abbf43fab7d5 130
wvd_vegt 3:abbf43fab7d5 131 //Optional
wvd_vegt 5:68d3a351c3ea 132 const cmdb_cmd ECHO("Echo",GLOBALCMD,CID_ECHO,"%bu","Echo On|Off (1|0)","state");
wvd_vegt 5:68d3a351c3ea 133 const cmdb_cmd BOLD("Bold",GLOBALCMD,CID_BOLD,"%bu","Bold On|Off (1|0)","state");
wvd_vegt 5:68d3a351c3ea 134 const cmdb_cmd CLS("Cls",GLOBALCMD,CID_CLS,"","Clears the terminal screen");
wvd_vegt 3:abbf43fab7d5 135
wvd_vegt 3:abbf43fab7d5 136 //Mandatory!
wvd_vegt 5:68d3a351c3ea 137 const cmdb_cmd IDLE("Idle",GLOBALCMD,CID_IDLE,"","Deselect Subsystems");
wvd_vegt 3:abbf43fab7d5 138
wvd_vegt 3:abbf43fab7d5 139 //Mandatory!
wvd_vegt 5:68d3a351c3ea 140 const cmdb_cmd HELP("Help",GLOBALCMD,CID_HELP,"%s","Help");
wvd_vegt 3:abbf43fab7d5 141
wvd_vegt 3:abbf43fab7d5 142 #define ESC_TBL_LEN 4
wvd_vegt 3:abbf43fab7d5 143
wvd_vegt 3:abbf43fab7d5 144 struct esc_st {
wvd_vegt 3:abbf43fab7d5 145 char *escstr;
wvd_vegt 3:abbf43fab7d5 146 int id;
wvd_vegt 3:abbf43fab7d5 147 };
wvd_vegt 3:abbf43fab7d5 148
wvd_vegt 5:68d3a351c3ea 149 enum {
wvd_vegt 3:abbf43fab7d5 150 EID_CURSOR_UP,
wvd_vegt 3:abbf43fab7d5 151 EID_CURSOR_DOWN,
wvd_vegt 3:abbf43fab7d5 152 EID_CURSOR_RIGHT,
wvd_vegt 3:abbf43fab7d5 153 EID_CURSOR_LEFT,
wvd_vegt 3:abbf43fab7d5 154 EID_LAST
wvd_vegt 3:abbf43fab7d5 155 };
wvd_vegt 3:abbf43fab7d5 156
wvd_vegt 3:abbf43fab7d5 157 const struct esc_st esc_tbl [ESC_TBL_LEN] = {
wvd_vegt 3:abbf43fab7d5 158 { "\033[A", EID_CURSOR_UP },
wvd_vegt 3:abbf43fab7d5 159 { "\033[B", EID_CURSOR_DOWN },
wvd_vegt 3:abbf43fab7d5 160 { "\033[C", EID_CURSOR_RIGHT },
wvd_vegt 3:abbf43fab7d5 161 { "\033[D", EID_CURSOR_LEFT },
wvd_vegt 3:abbf43fab7d5 162 };
wvd_vegt 3:abbf43fab7d5 163
wvd_vegt 6:76b033971c3c 164 //class Cmdb;
wvd_vegt 6:76b033971c3c 165
wvd_vegt 6:76b033971c3c 166 //See http://stackoverflow.com/questions/9410/how-do-you-pass-a-function-as-a-parameter-in-c
wvd_vegt 6:76b033971c3c 167 //void func ( void (*f)(Cmdb&, int) );
wvd_vegt 6:76b033971c3c 168
wvd_vegt 3:abbf43fab7d5 169 //Define a const struct cmbd_cmd cmdb_tbl [CMD_TBL_LEN] {}; that is passed into the constructor.
wvd_vegt 3:abbf43fab7d5 170
wvd_vegt 3:abbf43fab7d5 171 /** Command Interpreter class.<br/>
wvd_vegt 3:abbf43fab7d5 172 * <br/>
wvd_vegt 3:abbf43fab7d5 173 * Steps to take:<br/>
wvd_vegt 3:abbf43fab7d5 174 * <br/>
wvd_vegt 3:abbf43fab7d5 175 * 1) Create a std::vector<cmdb_cmd> and fill it with at least<br/>
wvd_vegt 3:abbf43fab7d5 176 * the mandatory commands IDLE and HELP.<br/>
wvd_vegt 3:abbf43fab7d5 177 * 2) Create an Cmdb class instance and pass it both the vector and<br/>
wvd_vegt 3:abbf43fab7d5 178 * a Serial port object like Serial serial(USBTX, USBRX);<br/>
wvd_vegt 3:abbf43fab7d5 179 * 3) Feed the interpreter with characters received from your serial port.<br/>
wvd_vegt 3:abbf43fab7d5 180 * Note Cmdb self does not retrieve input it must be handed to it<br/>
wvd_vegt 3:abbf43fab7d5 181 * 4) Handle commands added by the application by the Id and parameters passed.<br/>
wvd_vegt 3:abbf43fab7d5 182 *
wvd_vegt 3:abbf43fab7d5 183 */
wvd_vegt 3:abbf43fab7d5 184 class Cmdb {
wvd_vegt 3:abbf43fab7d5 185 public:
wvd_vegt 3:abbf43fab7d5 186 /** Create a Command Interpreter.
wvd_vegt 3:abbf43fab7d5 187 *
wvd_vegt 6:76b033971c3c 188 * See http://www.newty.de/fpt/fpt.html#chapter2 for function pointers.
wvd_vegt 6:76b033971c3c 189 *
wvd_vegt 3:abbf43fab7d5 190 * @param serial a Serial port used for communication.
wvd_vegt 3:abbf43fab7d5 191 * @param cmds a vector with the command table.
wvd_vegt 3:abbf43fab7d5 192 */
wvd_vegt 6:76b033971c3c 193 Cmdb(const Serial& serial, const std::vector<cmdb_cmd>& cmds, void (*cmdb_callback)(Cmdb&,int) );
wvd_vegt 3:abbf43fab7d5 194
wvd_vegt 3:abbf43fab7d5 195 /** Checks if the macro buffer has any characters left.
wvd_vegt 3:abbf43fab7d5 196 *
wvd_vegt 3:abbf43fab7d5 197 * @returns true if any characters left.
wvd_vegt 3:abbf43fab7d5 198 */
wvd_vegt 3:abbf43fab7d5 199 bool cmdb_macro_hasnext();
wvd_vegt 3:abbf43fab7d5 200
wvd_vegt 4:e7673688a9c8 201 /** Gets the next character from the macro buffer and
wvd_vegt 3:abbf43fab7d5 202 * advances the macro buffer pointer.
wvd_vegt 3:abbf43fab7d5 203 *
wvd_vegt 3:abbf43fab7d5 204 * Do not call if no more characters are left!
wvd_vegt 3:abbf43fab7d5 205 *
wvd_vegt 3:abbf43fab7d5 206 * @returns the next character.
wvd_vegt 3:abbf43fab7d5 207 */
wvd_vegt 3:abbf43fab7d5 208 char cmdb_macro_next();
wvd_vegt 3:abbf43fab7d5 209
wvd_vegt 3:abbf43fab7d5 210 /** Gets the next character from the macro buffer
wvd_vegt 3:abbf43fab7d5 211 * but does not advance the macro buffer pointer.
wvd_vegt 3:abbf43fab7d5 212 *
wvd_vegt 3:abbf43fab7d5 213 * Do not call if no more characters are left!
wvd_vegt 3:abbf43fab7d5 214 *
wvd_vegt 3:abbf43fab7d5 215 * @returns the next character.
wvd_vegt 3:abbf43fab7d5 216 */
wvd_vegt 3:abbf43fab7d5 217 char cmdb_macro_peek();
wvd_vegt 4:e7673688a9c8 218
wvd_vegt 3:abbf43fab7d5 219 /** Resets the macro buffer and macro buffer pointer.
wvd_vegt 4:e7673688a9c8 220 *
wvd_vegt 3:abbf43fab7d5 221 */
wvd_vegt 3:abbf43fab7d5 222 void cmdb_macro_reset();
wvd_vegt 3:abbf43fab7d5 223
wvd_vegt 4:e7673688a9c8 224 /** Checks if the serial port has any characters
wvd_vegt 3:abbf43fab7d5 225 * left to read by calling serial.readable().
wvd_vegt 3:abbf43fab7d5 226 *
wvd_vegt 3:abbf43fab7d5 227 * @returns true if any characters available.
wvd_vegt 3:abbf43fab7d5 228 */
wvd_vegt 3:abbf43fab7d5 229 bool cmdb_hasnext();
wvd_vegt 3:abbf43fab7d5 230
wvd_vegt 4:e7673688a9c8 231 /** Gets the next character from the serial port by
wvd_vegt 3:abbf43fab7d5 232 * calling serial.getc().
wvd_vegt 3:abbf43fab7d5 233 *
wvd_vegt 3:abbf43fab7d5 234 * Do not call if no characters are left!
wvd_vegt 3:abbf43fab7d5 235 *
wvd_vegt 3:abbf43fab7d5 236 * @returns the next character.
wvd_vegt 3:abbf43fab7d5 237 */
wvd_vegt 3:abbf43fab7d5 238 char cmdb_next();
wvd_vegt 3:abbf43fab7d5 239
wvd_vegt 4:e7673688a9c8 240 /** Add a character to the command being processed.
wvd_vegt 3:abbf43fab7d5 241 * If a cr is added, the command is parsed and executed if possible
wvd_vegt 3:abbf43fab7d5 242 * If supported special keys are encountered (like backspace, delete and cursor up) they are processed.
wvd_vegt 3:abbf43fab7d5 243 *
wvd_vegt 3:abbf43fab7d5 244 * @parmam c the character to add.
wvd_vegt 3:abbf43fab7d5 245 *
wvd_vegt 3:abbf43fab7d5 246 * @returns true if a command was recognized and executed.
wvd_vegt 3:abbf43fab7d5 247 */
wvd_vegt 3:abbf43fab7d5 248 bool cmdb_scan(const char c);
wvd_vegt 3:abbf43fab7d5 249
wvd_vegt 3:abbf43fab7d5 250 //Output.
wvd_vegt 3:abbf43fab7d5 251 int cmdb_printf(const char *format, ...);
wvd_vegt 3:abbf43fab7d5 252 int cmdb_print(const char *msg);
wvd_vegt 3:abbf43fab7d5 253 char cmdb_printch(const char ch);
wvd_vegt 3:abbf43fab7d5 254
wvd_vegt 3:abbf43fab7d5 255 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 256 //----These helper functions retieve parameters in the correct format.
wvd_vegt 3:abbf43fab7d5 257 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 258
wvd_vegt 3:abbf43fab7d5 259 //TODO Add tests for correct type of parameter.
wvd_vegt 3:abbf43fab7d5 260
wvd_vegt 3:abbf43fab7d5 261 bool BOOLPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 262 return parms[ndx].val.uc!=0;
wvd_vegt 3:abbf43fab7d5 263 }
wvd_vegt 3:abbf43fab7d5 264
wvd_vegt 3:abbf43fab7d5 265 unsigned char BYTEPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 266 return parms[ndx].val.uc;
wvd_vegt 3:abbf43fab7d5 267 }
wvd_vegt 3:abbf43fab7d5 268
wvd_vegt 3:abbf43fab7d5 269 char CHARPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 270 return parms[ndx].val.c;
wvd_vegt 3:abbf43fab7d5 271 }
wvd_vegt 3:abbf43fab7d5 272
wvd_vegt 3:abbf43fab7d5 273 unsigned int WORDPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 274 return parms[ndx].val.ui;
wvd_vegt 3:abbf43fab7d5 275 }
wvd_vegt 3:abbf43fab7d5 276
wvd_vegt 3:abbf43fab7d5 277 unsigned int UINTPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 278 return parms[ndx].val.ui;
wvd_vegt 3:abbf43fab7d5 279 }
wvd_vegt 3:abbf43fab7d5 280
wvd_vegt 3:abbf43fab7d5 281 int INTPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 282 return parms[ndx].val.i;
wvd_vegt 3:abbf43fab7d5 283 }
wvd_vegt 3:abbf43fab7d5 284
wvd_vegt 3:abbf43fab7d5 285 unsigned long DWORDPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 286 return parms[ndx].val.ul;
wvd_vegt 3:abbf43fab7d5 287 }
wvd_vegt 3:abbf43fab7d5 288
wvd_vegt 3:abbf43fab7d5 289 long LONGPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 290 return parms[ndx].val.l;
wvd_vegt 3:abbf43fab7d5 291 }
wvd_vegt 3:abbf43fab7d5 292
wvd_vegt 3:abbf43fab7d5 293 float FLOATPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 294 return parms[ndx].val.f;
wvd_vegt 3:abbf43fab7d5 295 }
wvd_vegt 3:abbf43fab7d5 296
wvd_vegt 3:abbf43fab7d5 297 char* STRINGPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 298 return parms[ndx].val.s;
wvd_vegt 3:abbf43fab7d5 299 }
wvd_vegt 3:abbf43fab7d5 300
wvd_vegt 6:76b033971c3c 301 private:
wvd_vegt 6:76b033971c3c 302 //See http://www.newty.de/fpt/fpt.html#chapter2 for function pointers.
wvd_vegt 6:76b033971c3c 303
wvd_vegt 6:76b033971c3c 304 //C++ member
wvd_vegt 6:76b033971c3c 305 //void (Cmdb::*cmdb_callback)(Cmdb&,int);
wvd_vegt 6:76b033971c3c 306
wvd_vegt 6:76b033971c3c 307 //C function
wvd_vegt 6:76b033971c3c 308 void (*cmdb_callback)(Cmdb&,int);
wvd_vegt 6:76b033971c3c 309
wvd_vegt 6:76b033971c3c 310 //void(*_cmdb_callback)(Cmdb&,int);
wvd_vegt 6:76b033971c3c 311
wvd_vegt 6:76b033971c3c 312 /** Searches the escape code list for a match.
wvd_vegt 6:76b033971c3c 313 *
wvd_vegt 6:76b033971c3c 314 * @param char* escstr the escape code to lookup.
wvd_vegt 6:76b033971c3c 315 *
wvd_vegt 6:76b033971c3c 316 * @returns the index of the escape code or -1.
wvd_vegt 6:76b033971c3c 317 */
wvd_vegt 6:76b033971c3c 318 int cmdb_escid_search(char *escstr);
wvd_vegt 6:76b033971c3c 319
wvd_vegt 6:76b033971c3c 320 /** Checks if the command table for a match.
wvd_vegt 6:76b033971c3c 321 *
wvd_vegt 6:76b033971c3c 322 * @param char* cmdstr the command to lookup.
wvd_vegt 6:76b033971c3c 323 *
wvd_vegt 6:76b033971c3c 324 * @returns the id of the command or -1.
wvd_vegt 6:76b033971c3c 325 */
wvd_vegt 6:76b033971c3c 326 int cmdb_cmdid_search(char *cmdstr);
wvd_vegt 6:76b033971c3c 327
wvd_vegt 6:76b033971c3c 328 /** Converts an command id to an index of the command table.
wvd_vegt 6:76b033971c3c 329 *
wvd_vegt 6:76b033971c3c 330 * @param cmdid the command id to lookup.
wvd_vegt 6:76b033971c3c 331 *
wvd_vegt 6:76b033971c3c 332 * @returns the index of the command or -1.
wvd_vegt 6:76b033971c3c 333 */
wvd_vegt 6:76b033971c3c 334 int cmdb_cmdid_index(int cmdid);
wvd_vegt 6:76b033971c3c 335
wvd_vegt 6:76b033971c3c 336 /** Initializes the parser.
wvd_vegt 6:76b033971c3c 337 *
wvd_vegt 6:76b033971c3c 338 * @parm full if true the macro buffer is also cleared else only the command interpreter is reset.
wvd_vegt 6:76b033971c3c 339 */
wvd_vegt 6:76b033971c3c 340 void cmdb_init(const char full);
wvd_vegt 6:76b033971c3c 341
wvd_vegt 6:76b033971c3c 342 /** Writes a prompt to the serial port.
wvd_vegt 6:76b033971c3c 343 *
wvd_vegt 6:76b033971c3c 344 */
wvd_vegt 6:76b033971c3c 345 void cmdb_prompt(void);
wvd_vegt 6:76b033971c3c 346
wvd_vegt 6:76b033971c3c 347 /** Called by cmdb_cmd_dispatch it parses the command against the command table.
wvd_vegt 6:76b033971c3c 348 *
wvd_vegt 6:76b033971c3c 349 * @param cmd the command and paramaters to parse.
wvd_vegt 6:76b033971c3c 350 *
wvd_vegt 6:76b033971c3c 351 * @returns the id of the parsed command.
wvd_vegt 6:76b033971c3c 352 */
wvd_vegt 6:76b033971c3c 353 int cmdb_parse(char *cmd);
wvd_vegt 6:76b033971c3c 354
wvd_vegt 6:76b033971c3c 355 /** Called by cmdb_scan it processes the arguments and dispatches the command.
wvd_vegt 6:76b033971c3c 356 *
wvd_vegt 6:76b033971c3c 357 * Note: This member calls the cmdb_callback callback function.
wvd_vegt 6:76b033971c3c 358 *
wvd_vegt 6:76b033971c3c 359 * @param cmd the command to dispatch.
wvd_vegt 6:76b033971c3c 360 */
wvd_vegt 6:76b033971c3c 361 void cmdb_cmd_dispatcher(char *cmd);
wvd_vegt 6:76b033971c3c 362
wvd_vegt 6:76b033971c3c 363 /** Generates Help from the command table and prints it.
wvd_vegt 6:76b033971c3c 364 *
wvd_vegt 6:76b033971c3c 365 * @param pre leading text
wvd_vegt 6:76b033971c3c 366 * @param ndx the index of the command in the command table.
wvd_vegt 6:76b033971c3c 367 * @param post trailing text.
wvd_vegt 6:76b033971c3c 368 */
wvd_vegt 6:76b033971c3c 369 void cmdb_cmdhelp(char *pre, int ndx, char *post);
wvd_vegt 6:76b033971c3c 370
wvd_vegt 6:76b033971c3c 371 //Utilities.
wvd_vegt 6:76b033971c3c 372 void zeromemory(char *p,unsigned int siz);
wvd_vegt 6:76b033971c3c 373 int stricmp (char *s1, char *s2);
wvd_vegt 6:76b033971c3c 374
wvd_vegt 6:76b033971c3c 375 //Storage, see http://www.cplusplus.com/reference/stl/vector/
wvd_vegt 6:76b033971c3c 376 std::vector<cmdb_cmd> _cmds;
wvd_vegt 6:76b033971c3c 377 Serial _serial;
wvd_vegt 6:76b033971c3c 378 bool echo;
wvd_vegt 6:76b033971c3c 379 bool bold;
wvd_vegt 6:76b033971c3c 380
wvd_vegt 6:76b033971c3c 381 int CMD_TBL_LEN;
wvd_vegt 6:76b033971c3c 382
wvd_vegt 6:76b033971c3c 383 //Macro's.
wvd_vegt 6:76b033971c3c 384 int macro_ptr;
wvd_vegt 6:76b033971c3c 385 char macro_buf[1 + MAX_CMD_LEN];
wvd_vegt 6:76b033971c3c 386
wvd_vegt 6:76b033971c3c 387 enum parmtype {
wvd_vegt 6:76b033971c3c 388 PARM_UNUSED, //0
wvd_vegt 6:76b033971c3c 389
wvd_vegt 6:76b033971c3c 390 PARM_FLOAT, //1 (f)
wvd_vegt 6:76b033971c3c 391
wvd_vegt 6:76b033971c3c 392 PARM_LONG, //2 (l/ul)
wvd_vegt 6:76b033971c3c 393 PARM_INT, //3 (i/ui)
wvd_vegt 6:76b033971c3c 394 PARM_SHORT, //4 (w/uw)
wvd_vegt 6:76b033971c3c 395
wvd_vegt 6:76b033971c3c 396 PARM_CHAR, //5 (c/uc)
wvd_vegt 6:76b033971c3c 397 PARM_STRING //6 (s)
wvd_vegt 6:76b033971c3c 398 };
wvd_vegt 6:76b033971c3c 399
wvd_vegt 6:76b033971c3c 400 union value {
wvd_vegt 6:76b033971c3c 401 float f;
wvd_vegt 6:76b033971c3c 402
wvd_vegt 6:76b033971c3c 403 unsigned long ul;
wvd_vegt 6:76b033971c3c 404 long l;
wvd_vegt 6:76b033971c3c 405
wvd_vegt 6:76b033971c3c 406 int i;
wvd_vegt 6:76b033971c3c 407 unsigned int ui;
wvd_vegt 6:76b033971c3c 408
wvd_vegt 6:76b033971c3c 409 short w;
wvd_vegt 6:76b033971c3c 410 unsigned short uw;
wvd_vegt 6:76b033971c3c 411
wvd_vegt 6:76b033971c3c 412 char c;
wvd_vegt 6:76b033971c3c 413 unsigned char uc;
wvd_vegt 6:76b033971c3c 414
wvd_vegt 6:76b033971c3c 415 char s[MAX_PARM_LEN];
wvd_vegt 6:76b033971c3c 416 };
wvd_vegt 6:76b033971c3c 417
wvd_vegt 6:76b033971c3c 418 struct parm {
wvd_vegt 6:76b033971c3c 419 enum parmtype type;
wvd_vegt 6:76b033971c3c 420 union value val;
wvd_vegt 6:76b033971c3c 421 };
wvd_vegt 6:76b033971c3c 422
wvd_vegt 3:abbf43fab7d5 423 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 424 //----Buffers
wvd_vegt 3:abbf43fab7d5 425 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 426
wvd_vegt 3:abbf43fab7d5 427 char cmdbuf [1 + MAX_CMD_LEN]; // command buffer
wvd_vegt 3:abbf43fab7d5 428 char cmdndx; // command index
wvd_vegt 3:abbf43fab7d5 429
wvd_vegt 3:abbf43fab7d5 430 char lstbuf [1 + MAX_CMD_LEN]; // last command buffer
wvd_vegt 3:abbf43fab7d5 431
wvd_vegt 3:abbf43fab7d5 432 char escbuf [1 + MAX_ESC_LEN]; // command buffer
wvd_vegt 3:abbf43fab7d5 433 unsigned char escndx; // command index
wvd_vegt 3:abbf43fab7d5 434
wvd_vegt 3:abbf43fab7d5 435 struct parm parms[MAX_ARGS];
wvd_vegt 3:abbf43fab7d5 436 int noparms;
wvd_vegt 3:abbf43fab7d5 437
wvd_vegt 3:abbf43fab7d5 438 int subsystem;
wvd_vegt 3:abbf43fab7d5 439
wvd_vegt 3:abbf43fab7d5 440 int argcnt; //No of arguments found in command
wvd_vegt 3:abbf43fab7d5 441 int argfnd; //No of arguments to find in parameter definition.
wvd_vegt 3:abbf43fab7d5 442 int error; //strtoXX() Error detection
wvd_vegt 3:abbf43fab7d5 443
wvd_vegt 3:abbf43fab7d5 444 };
wvd_vegt 3:abbf43fab7d5 445
wvd_vegt 0:4d95ee0b4c37 446 #endif