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

Committer:
wvd_vegt
Date:
Thu Feb 10 19:10:42 2011 +0000
Revision:
3:abbf43fab7d5
Parent:
2:7d00f6d78090
Child:
4:e7673688a9c8
Alpha

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 3:abbf43fab7d5 57 char *cmdstr;
wvd_vegt 3:abbf43fab7d5 58 int subs;
wvd_vegt 3:abbf43fab7d5 59 int id; //Changed to int as signed char won't compile
wvd_vegt 3:abbf43fab7d5 60 char *parms;
wvd_vegt 3:abbf43fab7d5 61 char *cmddescr;
wvd_vegt 3:abbf43fab7d5 62 char *parmdescr;
wvd_vegt 3:abbf43fab7d5 63 };
wvd_vegt 3:abbf43fab7d5 64
wvd_vegt 3:abbf43fab7d5 65 //----Escape Codes and Strings
wvd_vegt 3:abbf43fab7d5 66
wvd_vegt 3:abbf43fab7d5 67 const char cr = '\r';
wvd_vegt 3:abbf43fab7d5 68 const char lf = '\n';
wvd_vegt 3:abbf43fab7d5 69 const char bell = '\7';
wvd_vegt 3:abbf43fab7d5 70 const char esc = '\033';
wvd_vegt 3:abbf43fab7d5 71 const char sp = ' ';
wvd_vegt 3:abbf43fab7d5 72 const char crlf[] = "\r\n\0";
wvd_vegt 3:abbf43fab7d5 73
wvd_vegt 3:abbf43fab7d5 74 const char bs[] = "\b \b\0";
wvd_vegt 3:abbf43fab7d5 75
wvd_vegt 3:abbf43fab7d5 76 const char boldon[] = "\033[1m\0";
wvd_vegt 3:abbf43fab7d5 77 const char boldoff[] = "\033[0m\0";
wvd_vegt 3:abbf43fab7d5 78 const char cls[] = "\033[2J\0";
wvd_vegt 3:abbf43fab7d5 79 const char home[] = "\033[H\0";
wvd_vegt 3:abbf43fab7d5 80
wvd_vegt 3:abbf43fab7d5 81 const char prompt[] = "CMD>";
wvd_vegt 3:abbf43fab7d5 82
wvd_vegt 3:abbf43fab7d5 83 //Before including this file, define CID_LAST as the last value from the enum with commands.
wvd_vegt 3:abbf43fab7d5 84
wvd_vegt 3:abbf43fab7d5 85 //#define CMD_TBL_LEN CID_LAST
wvd_vegt 3:abbf43fab7d5 86
wvd_vegt 3:abbf43fab7d5 87 #define SUBSYSTEM -1
wvd_vegt 3:abbf43fab7d5 88 #define GLOBALCMD -2
wvd_vegt 3:abbf43fab7d5 89 #define HIDDENSUB -3
wvd_vegt 3:abbf43fab7d5 90
wvd_vegt 3:abbf43fab7d5 91 #define CID_BOOT 9991
wvd_vegt 3:abbf43fab7d5 92 #define CID_MACRO 9992
wvd_vegt 3:abbf43fab7d5 93 #define CID_RUN 9993
wvd_vegt 3:abbf43fab7d5 94 #define CID_MACROS 9994
wvd_vegt 3:abbf43fab7d5 95
wvd_vegt 3:abbf43fab7d5 96 #define CID_ECHO 9995
wvd_vegt 3:abbf43fab7d5 97 #define CID_BOLD 9996
wvd_vegt 3:abbf43fab7d5 98 #define CID_CLS 9997
wvd_vegt 3:abbf43fab7d5 99 #define CID_IDLE 9998
wvd_vegt 3:abbf43fab7d5 100 #define CID_HELP 9999
wvd_vegt 3:abbf43fab7d5 101
wvd_vegt 3:abbf43fab7d5 102 //You need to add the following commands to your command table.
wvd_vegt 3:abbf43fab7d5 103
wvd_vegt 3:abbf43fab7d5 104 //Optional
wvd_vegt 3:abbf43fab7d5 105 cmdb_cmd BOOT = { "Boot", GLOBALCMD ,CID_BOOT ,"" ,"Boot" ,""};
wvd_vegt 3:abbf43fab7d5 106
wvd_vegt 3:abbf43fab7d5 107 //Optional
wvd_vegt 3:abbf43fab7d5 108 cmdb_cmd MACRO = { "Macro", GLOBALCMD ,CID_MACRO ,"%s" ,"Define macro (sp->_, cr->|)" ,"command(s)"};
wvd_vegt 3:abbf43fab7d5 109 cmdb_cmd RUN = { "Run", GLOBALCMD ,CID_RUN ,"" ,"Run a macro" ,""};
wvd_vegt 3:abbf43fab7d5 110 cmdb_cmd MACROS = { "Macros", GLOBALCMD ,CID_MACROS ,"" ,"List macro(s)" ,""};
wvd_vegt 3:abbf43fab7d5 111
wvd_vegt 3:abbf43fab7d5 112 //Optional
wvd_vegt 3:abbf43fab7d5 113 cmdb_cmd ECHO = { "Echo", GLOBALCMD ,CID_ECHO ,"%bu" ,"Echo On|Off (1|0)" ,"state"};
wvd_vegt 3:abbf43fab7d5 114 cmdb_cmd BOLD = { "Bold", GLOBALCMD ,CID_BOLD ,"%bu" ,"Bold On|Off (1|0)" ,"state"};
wvd_vegt 3:abbf43fab7d5 115 cmdb_cmd CLS = { "Cls", GLOBALCMD ,CID_CLS ,"" ,"Clears the terminal screen" ,""};
wvd_vegt 3:abbf43fab7d5 116
wvd_vegt 3:abbf43fab7d5 117 //Mandatory!
wvd_vegt 3:abbf43fab7d5 118 cmdb_cmd IDLE = { "Idle", GLOBALCMD ,CID_IDLE ,"" ,"Deselect Subsystems" ,""};
wvd_vegt 3:abbf43fab7d5 119
wvd_vegt 3:abbf43fab7d5 120 //Mandatory!
wvd_vegt 3:abbf43fab7d5 121 cmdb_cmd HELP = { "Help", GLOBALCMD ,CID_HELP ,"%s" ,"Help" ,""};
wvd_vegt 3:abbf43fab7d5 122
wvd_vegt 3:abbf43fab7d5 123 #define ESC_TBL_LEN 4
wvd_vegt 3:abbf43fab7d5 124
wvd_vegt 3:abbf43fab7d5 125 struct esc_st {
wvd_vegt 3:abbf43fab7d5 126 char *escstr;
wvd_vegt 3:abbf43fab7d5 127 int id;
wvd_vegt 3:abbf43fab7d5 128 };
wvd_vegt 3:abbf43fab7d5 129
wvd_vegt 3:abbf43fab7d5 130 enum {
wvd_vegt 3:abbf43fab7d5 131 EID_CURSOR_UP,
wvd_vegt 3:abbf43fab7d5 132 EID_CURSOR_DOWN,
wvd_vegt 3:abbf43fab7d5 133 EID_CURSOR_RIGHT,
wvd_vegt 3:abbf43fab7d5 134 EID_CURSOR_LEFT,
wvd_vegt 3:abbf43fab7d5 135 EID_LAST
wvd_vegt 3:abbf43fab7d5 136 };
wvd_vegt 3:abbf43fab7d5 137
wvd_vegt 3:abbf43fab7d5 138 const struct esc_st esc_tbl [ESC_TBL_LEN] = {
wvd_vegt 3:abbf43fab7d5 139 { "\033[A", EID_CURSOR_UP },
wvd_vegt 3:abbf43fab7d5 140 { "\033[B", EID_CURSOR_DOWN },
wvd_vegt 3:abbf43fab7d5 141 { "\033[C", EID_CURSOR_RIGHT },
wvd_vegt 3:abbf43fab7d5 142 { "\033[D", EID_CURSOR_LEFT },
wvd_vegt 3:abbf43fab7d5 143 };
wvd_vegt 3:abbf43fab7d5 144
wvd_vegt 3:abbf43fab7d5 145 //Define a const struct cmbd_cmd cmdb_tbl [CMD_TBL_LEN] {}; that is passed into the constructor.
wvd_vegt 3:abbf43fab7d5 146
wvd_vegt 3:abbf43fab7d5 147 /** Command Interpreter class.<br/>
wvd_vegt 3:abbf43fab7d5 148 * <br/>
wvd_vegt 3:abbf43fab7d5 149 * Steps to take:<br/>
wvd_vegt 3:abbf43fab7d5 150 * <br/>
wvd_vegt 3:abbf43fab7d5 151 * 1) Create a std::vector<cmdb_cmd> and fill it with at least<br/>
wvd_vegt 3:abbf43fab7d5 152 * the mandatory commands IDLE and HELP.<br/>
wvd_vegt 3:abbf43fab7d5 153 * 2) Create an Cmdb class instance and pass it both the vector and<br/>
wvd_vegt 3:abbf43fab7d5 154 * a Serial port object like Serial serial(USBTX, USBRX);<br/>
wvd_vegt 3:abbf43fab7d5 155 * 3) Feed the interpreter with characters received from your serial port.<br/>
wvd_vegt 3:abbf43fab7d5 156 * Note Cmdb self does not retrieve input it must be handed to it<br/>
wvd_vegt 3:abbf43fab7d5 157 * 4) Handle commands added by the application by the Id and parameters passed.<br/>
wvd_vegt 3:abbf43fab7d5 158 *
wvd_vegt 3:abbf43fab7d5 159 */
wvd_vegt 3:abbf43fab7d5 160 class Cmdb {
wvd_vegt 3:abbf43fab7d5 161 public:
wvd_vegt 3:abbf43fab7d5 162 /** Create a Command Interpreter.
wvd_vegt 3:abbf43fab7d5 163 *
wvd_vegt 3:abbf43fab7d5 164 * @param serial a Serial port used for communication.
wvd_vegt 3:abbf43fab7d5 165 * @param cmds a vector with the command table.
wvd_vegt 3:abbf43fab7d5 166 */
wvd_vegt 3:abbf43fab7d5 167 Cmdb(const Serial serial, const std::vector<cmdb_cmd>& cmds);
wvd_vegt 3:abbf43fab7d5 168
wvd_vegt 3:abbf43fab7d5 169 /** Checks if the macro buffer has any characters left.
wvd_vegt 3:abbf43fab7d5 170 *
wvd_vegt 3:abbf43fab7d5 171 * @returns true if any characters left.
wvd_vegt 3:abbf43fab7d5 172 */
wvd_vegt 3:abbf43fab7d5 173 bool cmdb_macro_hasnext();
wvd_vegt 3:abbf43fab7d5 174
wvd_vegt 3:abbf43fab7d5 175 /** Gets the next character from the macro buffer and
wvd_vegt 3:abbf43fab7d5 176 * advances the macro buffer pointer.
wvd_vegt 3:abbf43fab7d5 177 *
wvd_vegt 3:abbf43fab7d5 178 * Do not call if no more characters are left!
wvd_vegt 3:abbf43fab7d5 179 *
wvd_vegt 3:abbf43fab7d5 180 * @returns the next character.
wvd_vegt 3:abbf43fab7d5 181 */
wvd_vegt 3:abbf43fab7d5 182 char cmdb_macro_next();
wvd_vegt 3:abbf43fab7d5 183
wvd_vegt 3:abbf43fab7d5 184 /** Gets the next character from the macro buffer
wvd_vegt 3:abbf43fab7d5 185 * but does not advance the macro buffer pointer.
wvd_vegt 3:abbf43fab7d5 186 *
wvd_vegt 3:abbf43fab7d5 187 * Do not call if no more characters are left!
wvd_vegt 3:abbf43fab7d5 188 *
wvd_vegt 3:abbf43fab7d5 189 * @returns the next character.
wvd_vegt 3:abbf43fab7d5 190 */
wvd_vegt 3:abbf43fab7d5 191 char cmdb_macro_peek();
wvd_vegt 3:abbf43fab7d5 192
wvd_vegt 3:abbf43fab7d5 193 /** Resets the macro buffer and macro buffer pointer.
wvd_vegt 3:abbf43fab7d5 194 *
wvd_vegt 3:abbf43fab7d5 195 */
wvd_vegt 3:abbf43fab7d5 196 void cmdb_macro_reset();
wvd_vegt 3:abbf43fab7d5 197
wvd_vegt 3:abbf43fab7d5 198 /** Checks if the serial port has any characters
wvd_vegt 3:abbf43fab7d5 199 * left to read by calling serial.readable().
wvd_vegt 3:abbf43fab7d5 200 *
wvd_vegt 3:abbf43fab7d5 201 * @returns true if any characters available.
wvd_vegt 3:abbf43fab7d5 202 */
wvd_vegt 3:abbf43fab7d5 203 bool cmdb_hasnext();
wvd_vegt 3:abbf43fab7d5 204
wvd_vegt 3:abbf43fab7d5 205 /** Gets the next character from the serial port by
wvd_vegt 3:abbf43fab7d5 206 * calling serial.getc().
wvd_vegt 3:abbf43fab7d5 207 *
wvd_vegt 3:abbf43fab7d5 208 * Do not call if no characters are left!
wvd_vegt 3:abbf43fab7d5 209 *
wvd_vegt 3:abbf43fab7d5 210 * @returns the next character.
wvd_vegt 3:abbf43fab7d5 211 */
wvd_vegt 3:abbf43fab7d5 212 char cmdb_next();
wvd_vegt 3:abbf43fab7d5 213
wvd_vegt 3:abbf43fab7d5 214 /** Add a character to the command being processed.
wvd_vegt 3:abbf43fab7d5 215 * If a cr is added, the command is parsed and executed if possible
wvd_vegt 3:abbf43fab7d5 216 * If supported special keys are encountered (like backspace, delete and cursor up) they are processed.
wvd_vegt 3:abbf43fab7d5 217 *
wvd_vegt 3:abbf43fab7d5 218 * @parmam c the character to add.
wvd_vegt 3:abbf43fab7d5 219 *
wvd_vegt 3:abbf43fab7d5 220 * @returns true if a command was recognized and executed.
wvd_vegt 3:abbf43fab7d5 221 */
wvd_vegt 3:abbf43fab7d5 222 bool cmdb_scan(const char c);
wvd_vegt 3:abbf43fab7d5 223
wvd_vegt 3:abbf43fab7d5 224 private:
wvd_vegt 3:abbf43fab7d5 225 /** Searches the escape code list for a match.
wvd_vegt 3:abbf43fab7d5 226 *
wvd_vegt 3:abbf43fab7d5 227 * @param char* escstr the escape code to lookup.
wvd_vegt 3:abbf43fab7d5 228 *
wvd_vegt 3:abbf43fab7d5 229 * @returns the index of the escape code or -1.
wvd_vegt 3:abbf43fab7d5 230 */
wvd_vegt 3:abbf43fab7d5 231 int cmdb_escid_search(char *escstr);
wvd_vegt 3:abbf43fab7d5 232
wvd_vegt 3:abbf43fab7d5 233 /** Checks if the command table for a match.
wvd_vegt 3:abbf43fab7d5 234 *
wvd_vegt 3:abbf43fab7d5 235 * @param char* cmdstr the command to lookup.
wvd_vegt 3:abbf43fab7d5 236 *
wvd_vegt 3:abbf43fab7d5 237 * @returns the id of the command or -1.
wvd_vegt 3:abbf43fab7d5 238 */
wvd_vegt 3:abbf43fab7d5 239 int cmdb_cmdid_search(char *cmdstr);
wvd_vegt 3:abbf43fab7d5 240
wvd_vegt 3:abbf43fab7d5 241 /** Converts an command id to an index of the command table.
wvd_vegt 3:abbf43fab7d5 242 *
wvd_vegt 3:abbf43fab7d5 243 * @param cmdid the command id to lookup.
wvd_vegt 3:abbf43fab7d5 244 *
wvd_vegt 3:abbf43fab7d5 245 * @returns the index of the command or -1.
wvd_vegt 3:abbf43fab7d5 246 */
wvd_vegt 3:abbf43fab7d5 247 int cmdb_cmdid_index(int cmdid);
wvd_vegt 3:abbf43fab7d5 248
wvd_vegt 3:abbf43fab7d5 249 /** Initializes the parser.
wvd_vegt 3:abbf43fab7d5 250 *
wvd_vegt 3:abbf43fab7d5 251 * @parm full if true the macro buffer is also cleared else only the command interpreter is reset.
wvd_vegt 3:abbf43fab7d5 252 */
wvd_vegt 3:abbf43fab7d5 253 void cmdb_init(const char full);
wvd_vegt 3:abbf43fab7d5 254
wvd_vegt 3:abbf43fab7d5 255 /** Writes a prompt to the serial port.
wvd_vegt 3:abbf43fab7d5 256 *
wvd_vegt 3:abbf43fab7d5 257 */
wvd_vegt 3:abbf43fab7d5 258 void cmdb_prompt(void);
wvd_vegt 3:abbf43fab7d5 259
wvd_vegt 3:abbf43fab7d5 260 /** Called by cmdb_cmd_proc it parses the command against the command table.
wvd_vegt 3:abbf43fab7d5 261 *
wvd_vegt 3:abbf43fab7d5 262 * @param cmd the command and paramaters to parse.
wvd_vegt 3:abbf43fab7d5 263 *
wvd_vegt 3:abbf43fab7d5 264 * @returns the id of the parsed command.
wvd_vegt 3:abbf43fab7d5 265 */
wvd_vegt 3:abbf43fab7d5 266 int cmdb_parse(char *cmd);
wvd_vegt 3:abbf43fab7d5 267
wvd_vegt 3:abbf43fab7d5 268 //TODO Must call Callback function.
wvd_vegt 3:abbf43fab7d5 269
wvd_vegt 3:abbf43fab7d5 270 /** Called by cmdb_scan it processes the arguments and Executes the command.
wvd_vegt 3:abbf43fab7d5 271 *
wvd_vegt 3:abbf43fab7d5 272 * @param cmd the command to execute.
wvd_vegt 3:abbf43fab7d5 273 */
wvd_vegt 3:abbf43fab7d5 274 void cmdb_cmd_proc(char *cmd);
wvd_vegt 3:abbf43fab7d5 275
wvd_vegt 3:abbf43fab7d5 276 /** Generates Help from the command table and prints it.
wvd_vegt 3:abbf43fab7d5 277 *
wvd_vegt 3:abbf43fab7d5 278 * @param pre leading text
wvd_vegt 3:abbf43fab7d5 279 * @param ndx the index of the command in the command table.
wvd_vegt 3:abbf43fab7d5 280 * @param post trailing text.
wvd_vegt 3:abbf43fab7d5 281 */
wvd_vegt 3:abbf43fab7d5 282 void cmdb_cmdhelp(char *pre, int ndx, char *post);
wvd_vegt 3:abbf43fab7d5 283
wvd_vegt 3:abbf43fab7d5 284 //Output.
wvd_vegt 3:abbf43fab7d5 285 int cmdb_printf(const char *format, ...);
wvd_vegt 3:abbf43fab7d5 286 int cmdb_print(const char *msg);
wvd_vegt 3:abbf43fab7d5 287 char cmdb_printch(const char ch);
wvd_vegt 3:abbf43fab7d5 288
wvd_vegt 3:abbf43fab7d5 289 //Utilities.
wvd_vegt 3:abbf43fab7d5 290 void zeromemory(char *p,unsigned int siz);
wvd_vegt 3:abbf43fab7d5 291 int stricmp (char *s1, char *s2);
wvd_vegt 3:abbf43fab7d5 292
wvd_vegt 3:abbf43fab7d5 293
wvd_vegt 3:abbf43fab7d5 294 //Storage, see http://www.cplusplus.com/reference/stl/vector/
wvd_vegt 3:abbf43fab7d5 295 std::vector<cmdb_cmd> _cmds;
wvd_vegt 3:abbf43fab7d5 296 Serial _serial;
wvd_vegt 3:abbf43fab7d5 297 bool echo;
wvd_vegt 3:abbf43fab7d5 298 bool bold;
wvd_vegt 3:abbf43fab7d5 299
wvd_vegt 3:abbf43fab7d5 300 int CID_LAST;
wvd_vegt 3:abbf43fab7d5 301 int CMD_TBL_LEN;
wvd_vegt 3:abbf43fab7d5 302
wvd_vegt 3:abbf43fab7d5 303 //Macro's.
wvd_vegt 3:abbf43fab7d5 304 int macro_ptr;
wvd_vegt 3:abbf43fab7d5 305 char macro_buf[1 + MAX_CMD_LEN];
wvd_vegt 3:abbf43fab7d5 306
wvd_vegt 3:abbf43fab7d5 307 enum parmtype {
wvd_vegt 3:abbf43fab7d5 308 PARM_UNUSED, //0
wvd_vegt 3:abbf43fab7d5 309
wvd_vegt 3:abbf43fab7d5 310 PARM_FLOAT, //1 (f)
wvd_vegt 3:abbf43fab7d5 311
wvd_vegt 3:abbf43fab7d5 312 PARM_LONG, //2 (l/ul)
wvd_vegt 3:abbf43fab7d5 313 PARM_INT, //3 (i/ui)
wvd_vegt 3:abbf43fab7d5 314 PARM_SHORT, //4 (w/uw)
wvd_vegt 3:abbf43fab7d5 315
wvd_vegt 3:abbf43fab7d5 316 PARM_CHAR, //5 (c/uc)
wvd_vegt 3:abbf43fab7d5 317 PARM_STRING //6 (s)
wvd_vegt 3:abbf43fab7d5 318 };
wvd_vegt 3:abbf43fab7d5 319
wvd_vegt 3:abbf43fab7d5 320 union value {
wvd_vegt 3:abbf43fab7d5 321 float f;
wvd_vegt 3:abbf43fab7d5 322
wvd_vegt 3:abbf43fab7d5 323 unsigned long ul;
wvd_vegt 3:abbf43fab7d5 324 long l;
wvd_vegt 3:abbf43fab7d5 325
wvd_vegt 3:abbf43fab7d5 326 int i;
wvd_vegt 3:abbf43fab7d5 327 unsigned int ui;
wvd_vegt 3:abbf43fab7d5 328
wvd_vegt 3:abbf43fab7d5 329 short w;
wvd_vegt 3:abbf43fab7d5 330 unsigned short uw;
wvd_vegt 3:abbf43fab7d5 331
wvd_vegt 3:abbf43fab7d5 332 char c;
wvd_vegt 3:abbf43fab7d5 333 unsigned char uc;
wvd_vegt 3:abbf43fab7d5 334
wvd_vegt 3:abbf43fab7d5 335 char s[MAX_PARM_LEN];
wvd_vegt 3:abbf43fab7d5 336 };
wvd_vegt 3:abbf43fab7d5 337
wvd_vegt 3:abbf43fab7d5 338 struct parm {
wvd_vegt 3:abbf43fab7d5 339 enum parmtype type;
wvd_vegt 3:abbf43fab7d5 340 union value val;
wvd_vegt 3:abbf43fab7d5 341 };
wvd_vegt 3:abbf43fab7d5 342
wvd_vegt 3:abbf43fab7d5 343 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 344 //----These helper functions retieve parameters in the correct format.
wvd_vegt 3:abbf43fab7d5 345 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 346
wvd_vegt 3:abbf43fab7d5 347 //TODO Add tests for correct type of parameter.
wvd_vegt 3:abbf43fab7d5 348
wvd_vegt 3:abbf43fab7d5 349 bool BOOLPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 350 return parms[ndx].val.uc!=0;
wvd_vegt 3:abbf43fab7d5 351 }
wvd_vegt 3:abbf43fab7d5 352
wvd_vegt 3:abbf43fab7d5 353 unsigned char BYTEPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 354 return parms[ndx].val.uc;
wvd_vegt 3:abbf43fab7d5 355 }
wvd_vegt 3:abbf43fab7d5 356
wvd_vegt 3:abbf43fab7d5 357 char CHARPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 358 return parms[ndx].val.c;
wvd_vegt 3:abbf43fab7d5 359 }
wvd_vegt 3:abbf43fab7d5 360
wvd_vegt 3:abbf43fab7d5 361 unsigned int WORDPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 362 return parms[ndx].val.ui;
wvd_vegt 3:abbf43fab7d5 363 }
wvd_vegt 3:abbf43fab7d5 364
wvd_vegt 3:abbf43fab7d5 365 unsigned int UINTPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 366 return parms[ndx].val.ui;
wvd_vegt 3:abbf43fab7d5 367 }
wvd_vegt 3:abbf43fab7d5 368
wvd_vegt 3:abbf43fab7d5 369 int INTPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 370 return parms[ndx].val.i;
wvd_vegt 3:abbf43fab7d5 371 }
wvd_vegt 3:abbf43fab7d5 372
wvd_vegt 3:abbf43fab7d5 373 unsigned long DWORDPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 374 return parms[ndx].val.ul;
wvd_vegt 3:abbf43fab7d5 375 }
wvd_vegt 3:abbf43fab7d5 376
wvd_vegt 3:abbf43fab7d5 377 long LONGPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 378 return parms[ndx].val.l;
wvd_vegt 3:abbf43fab7d5 379 }
wvd_vegt 3:abbf43fab7d5 380
wvd_vegt 3:abbf43fab7d5 381 float FLOATPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 382 return parms[ndx].val.f;
wvd_vegt 3:abbf43fab7d5 383 }
wvd_vegt 3:abbf43fab7d5 384
wvd_vegt 3:abbf43fab7d5 385 char* STRINGPARM(int ndx) {
wvd_vegt 3:abbf43fab7d5 386 return parms[ndx].val.s;
wvd_vegt 3:abbf43fab7d5 387 }
wvd_vegt 3:abbf43fab7d5 388
wvd_vegt 3:abbf43fab7d5 389 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 390 //----Buffers
wvd_vegt 3:abbf43fab7d5 391 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 392
wvd_vegt 3:abbf43fab7d5 393 char cmdbuf [1 + MAX_CMD_LEN]; // command buffer
wvd_vegt 3:abbf43fab7d5 394 char cmdndx; // command index
wvd_vegt 3:abbf43fab7d5 395
wvd_vegt 3:abbf43fab7d5 396 char lstbuf [1 + MAX_CMD_LEN]; // last command buffer
wvd_vegt 3:abbf43fab7d5 397
wvd_vegt 3:abbf43fab7d5 398 char escbuf [1 + MAX_ESC_LEN]; // command buffer
wvd_vegt 3:abbf43fab7d5 399 unsigned char escndx; // command index
wvd_vegt 3:abbf43fab7d5 400
wvd_vegt 3:abbf43fab7d5 401 struct parm parms[MAX_ARGS];
wvd_vegt 3:abbf43fab7d5 402 int noparms;
wvd_vegt 3:abbf43fab7d5 403
wvd_vegt 3:abbf43fab7d5 404 int subsystem;
wvd_vegt 3:abbf43fab7d5 405
wvd_vegt 3:abbf43fab7d5 406 int argcnt; //No of arguments found in command
wvd_vegt 3:abbf43fab7d5 407 int argfnd; //No of arguments to find in parameter definition.
wvd_vegt 3:abbf43fab7d5 408 int error; //strtoXX() Error detection
wvd_vegt 3:abbf43fab7d5 409
wvd_vegt 3:abbf43fab7d5 410 };
wvd_vegt 3:abbf43fab7d5 411
wvd_vegt 0:4d95ee0b4c37 412 #endif