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

Committer:
wvd_vegt
Date:
Thu Feb 10 18:38:23 2011 +0000
Revision:
1:6627eed48db5
Parent:
0:4d95ee0b4c37
Child:
2:7d00f6d78090
Alpha

Who changed what in which revision?

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