editable serial input line buffer

Dependents:   MAX5715BOB_Tester MAX11131BOB_Tester MAX5171BOB_Tester MAX11410BOB_Tester ... more

Committer:
whismanoid
Date:
Tue Apr 27 03:47:33 2021 -0700
Revision:
15:34b039027e5f
Parent:
14:9abcdf4eb4e4
Child:
16:592df067fe14
cmdLine.quiet support datalogger and button events

Who changed what in which revision?

UserRevisionLine numberNew contents of line
whismanoid 0:4d7de8b5c800 1 // /*******************************************************************************
whismanoid 0:4d7de8b5c800 2 // * Copyright (C) 2019 Maxim Integrated Products, Inc., All Rights Reserved.
whismanoid 0:4d7de8b5c800 3 // *
whismanoid 0:4d7de8b5c800 4 // * Permission is hereby granted, free of charge, to any person obtaining a
whismanoid 0:4d7de8b5c800 5 // * copy of this software and associated documentation files (the "Software"),
whismanoid 0:4d7de8b5c800 6 // * to deal in the Software without restriction, including without limitation
whismanoid 0:4d7de8b5c800 7 // * the rights to use, copy, modify, merge, publish, distribute, sublicense,
whismanoid 0:4d7de8b5c800 8 // * and/or sell copies of the Software, and to permit persons to whom the
whismanoid 0:4d7de8b5c800 9 // * Software is furnished to do so, subject to the following conditions:
whismanoid 0:4d7de8b5c800 10 // *
whismanoid 0:4d7de8b5c800 11 // * The above copyright notice and this permission notice shall be included
whismanoid 0:4d7de8b5c800 12 // * in all copies or substantial portions of the Software.
whismanoid 0:4d7de8b5c800 13 // *
whismanoid 0:4d7de8b5c800 14 // * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
whismanoid 0:4d7de8b5c800 15 // * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
whismanoid 0:4d7de8b5c800 16 // * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
whismanoid 0:4d7de8b5c800 17 // * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
whismanoid 0:4d7de8b5c800 18 // * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
whismanoid 0:4d7de8b5c800 19 // * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
whismanoid 0:4d7de8b5c800 20 // * OTHER DEALINGS IN THE SOFTWARE.
whismanoid 0:4d7de8b5c800 21 // *
whismanoid 0:4d7de8b5c800 22 // * Except as contained in this notice, the name of Maxim Integrated
whismanoid 0:4d7de8b5c800 23 // * Products, Inc. shall not be used except as stated in the Maxim Integrated
whismanoid 0:4d7de8b5c800 24 // * Products, Inc. Branding Policy.
whismanoid 0:4d7de8b5c800 25 // *
whismanoid 0:4d7de8b5c800 26 // * The mere transfer of this software does not imply any licenses
whismanoid 0:4d7de8b5c800 27 // * of trade secrets, proprietary technology, copyrights, patents,
whismanoid 0:4d7de8b5c800 28 // * trademarks, maskwork rights, or any other form of intellectual
whismanoid 0:4d7de8b5c800 29 // * property whatsoever. Maxim Integrated Products, Inc. retains all
whismanoid 0:4d7de8b5c800 30 // * ownership rights.
whismanoid 0:4d7de8b5c800 31 // *******************************************************************************
whismanoid 0:4d7de8b5c800 32 // */
whismanoid 0:4d7de8b5c800 33 // *********************************************************************
whismanoid 0:4d7de8b5c800 34 // @file CmdLine.cpp
whismanoid 0:4d7de8b5c800 35 // *********************************************************************
whismanoid 0:4d7de8b5c800 36
whismanoid 0:4d7de8b5c800 37 #include "CmdLine.h"
whismanoid 12:447a747099e6 38 // toupper requires include <ctype.h>
whismanoid 12:447a747099e6 39 #include <ctype.h>
whismanoid 0:4d7de8b5c800 40
whismanoid 0:4d7de8b5c800 41 CmdLine::CmdLine(Stream& AssociatedSerialPort, const char *Name)
whismanoid 0:4d7de8b5c800 42 : associatedSerialPort(AssociatedSerialPort)
whismanoid 0:4d7de8b5c800 43 , name(Name)
whismanoid 0:4d7de8b5c800 44 , onEOLcommandParser()
whismanoid 0:4d7de8b5c800 45 {
whismanoid 0:4d7de8b5c800 46 indexOfNextEmptyCell = 0;
whismanoid 0:4d7de8b5c800 47 memset(buf, 0, COMMAND_BUFFER_LENGTH);
whismanoid 10:3e2ff983be1c 48 chSeparator = 0;
whismanoid 10:3e2ff983be1c 49 match_is_case_sensitive = false;
whismanoid 15:34b039027e5f 50 quiet = false;
whismanoid 0:4d7de8b5c800 51 }
whismanoid 0:4d7de8b5c800 52 /** CmdLine::clear empties the command-line buffer */
whismanoid 0:4d7de8b5c800 53 void CmdLine::clear(void)
whismanoid 0:4d7de8b5c800 54 {
whismanoid 0:4d7de8b5c800 55 indexOfNextEmptyCell = 0;
whismanoid 0:4d7de8b5c800 56 memset(buf, 0, COMMAND_BUFFER_LENGTH);
whismanoid 0:4d7de8b5c800 57 }
whismanoid 0:4d7de8b5c800 58 //void CmdLine::idleAppendIfReadable()
whismanoid 0:4d7de8b5c800 59 //{
whismanoid 0:4d7de8b5c800 60 // // append ch to buf, unless BS or EOL or other editing character
whismanoid 0:4d7de8b5c800 61 // // Polymorphism fail: associatedSerialPort.readable()
whismanoid 0:4d7de8b5c800 62 // if (associatedSerialPort.readable()) {
whismanoid 0:4d7de8b5c800 63 // append(associatedSerialPort.getc());
whismanoid 0:4d7de8b5c800 64 // //
whismanoid 0:4d7de8b5c800 65 // // TODO1: set EOL timeout, so that we don't get lingering buffer cruft
whismanoid 0:4d7de8b5c800 66 // //
whismanoid 0:4d7de8b5c800 67 // }
whismanoid 0:4d7de8b5c800 68 //}
whismanoid 0:4d7de8b5c800 69 /** CmdLine::append handles an input character by appending the buffer,
whismanoid 0:4d7de8b5c800 70 * or handling an immediate function like backspace/delete
whismanoid 0:4d7de8b5c800 71 * or other custom immediate motor control functions.
whismanoid 0:4d7de8b5c800 72 */
whismanoid 0:4d7de8b5c800 73 void CmdLine::append(char ch)
whismanoid 0:4d7de8b5c800 74 {
whismanoid 6:88e92f832c9a 75 // void diagnostic_led_EOF();
whismanoid 0:4d7de8b5c800 76 void main_menu_status(CmdLine & cmdLine);
whismanoid 0:4d7de8b5c800 77
whismanoid 0:4d7de8b5c800 78 // append ch to buf, unless BS or EOL or other editing character
whismanoid 0:4d7de8b5c800 79 switch (ch)
whismanoid 0:4d7de8b5c800 80 {
whismanoid 0:4d7de8b5c800 81 case '\b': // Unicode (U+0008) BS BACKSPACE as destructive backspace
whismanoid 0:4d7de8b5c800 82 case '\x7f': // Unicode (U+007F) DEL DELETE as destructive backspace
whismanoid 0:4d7de8b5c800 83 if (indexOfNextEmptyCell > 0)
whismanoid 0:4d7de8b5c800 84 {
whismanoid 0:4d7de8b5c800 85 buf[--indexOfNextEmptyCell] = '\0'; // pre-decrement index, overwrite with null
whismanoid 15:34b039027e5f 86 if (!quiet) associatedSerialPort.printf("\b \b"); // tty: backspace, overwrite with space, backspace
whismanoid 0:4d7de8b5c800 87 }
whismanoid 0:4d7de8b5c800 88 break;
whismanoid 0:4d7de8b5c800 89 case '\r': // Unicode (U+000D) CR CARRIAGE RETURN(CR) as EOL end of line
whismanoid 0:4d7de8b5c800 90 case '\n': // Unicode (U+000A) LF LINE FEED(LF) as EOL end of line
whismanoid 0:4d7de8b5c800 91 //associatedSerialPort.printf("%c", ch); // echo line end
whismanoid 15:34b039027e5f 92 if (!quiet) associatedSerialPort.printf("\r\n"); // echo line end
whismanoid 0:4d7de8b5c800 93 //~ associatedSerialPort.printf("\r\n~%s~\r\n", buf); // DIAGNOSTIC: print line buffer
whismanoid 0:4d7de8b5c800 94 // parse and handle the command by invoking onEOLcommandParser callback
whismanoid 0:4d7de8b5c800 95 if (onEOLcommandParser) {
whismanoid 0:4d7de8b5c800 96 onEOLcommandParser(*this);
whismanoid 0:4d7de8b5c800 97 }
whismanoid 0:4d7de8b5c800 98 clear();
whismanoid 0:4d7de8b5c800 99 break;
whismanoid 0:4d7de8b5c800 100 #define ECHO_EOF_IMMEDIATELY 1
whismanoid 0:4d7de8b5c800 101 #if ECHO_EOF_IMMEDIATELY
whismanoid 0:4d7de8b5c800 102 case '\x04': // Unicode (U+0004) EOT END OF TRANSMISSION = CTRL+D as EOF end of file
whismanoid 6:88e92f832c9a 103 if (diagnostic_led_EOF) { diagnostic_led_EOF(); }
whismanoid 0:4d7de8b5c800 104 //~ main_menu_status(*this);
whismanoid 15:34b039027e5f 105 if (!quiet) associatedSerialPort.printf("** U+0004 EOT = EOF **"); // immediately echo EOF for test scripting
whismanoid 6:88e92f832c9a 106 if (diagnostic_led_EOF) { diagnostic_led_EOF(); }
whismanoid 15:34b039027e5f 107 if (!quiet) associatedSerialPort.printf("\r\n\x04\r\n"); // immediately echo EOF for test scripting
whismanoid 0:4d7de8b5c800 108 //~ associatedSerialPort.printf("\x1a"); // immediately echo EOF for test scripting
whismanoid 0:4d7de8b5c800 109 //~ associatedSerialPort.printf("\x04"); // immediately echo EOF for test scripting
whismanoid 0:4d7de8b5c800 110 //~ associatedSerialPort.printf("\x1a"); // immediately echo EOF for test scripting
whismanoid 0:4d7de8b5c800 111 clear(); // EOF discard any pending commands, to avoid surprise
whismanoid 0:4d7de8b5c800 112 break;
whismanoid 0:4d7de8b5c800 113 case '\x1a': // Unicode (U+001A) SUB SUBSTITUTE = CTRL+Z as EOF end of file
whismanoid 6:88e92f832c9a 114 if (diagnostic_led_EOF) { diagnostic_led_EOF(); }
whismanoid 0:4d7de8b5c800 115 //~ main_menu_status(*this);
whismanoid 15:34b039027e5f 116 if (!quiet) associatedSerialPort.printf("** U+001A SUB = EOF **"); // immediately echo EOF for test scripting
whismanoid 6:88e92f832c9a 117 if (diagnostic_led_EOF) { diagnostic_led_EOF(); }
whismanoid 15:34b039027e5f 118 if (!quiet) associatedSerialPort.printf("\x1a"); // immediately echo EOF for test scripting
whismanoid 15:34b039027e5f 119 if (!quiet) associatedSerialPort.printf("\x04"); // immediately echo EOF for test scripting
whismanoid 15:34b039027e5f 120 if (!quiet) associatedSerialPort.printf("\x1a"); // immediately echo EOF for test scripting
whismanoid 15:34b039027e5f 121 if (!quiet) associatedSerialPort.printf("\x04"); // immediately echo EOF for test scripting
whismanoid 0:4d7de8b5c800 122 clear(); // EOF discard any pending commands, to avoid surprise
whismanoid 0:4d7de8b5c800 123 break;
whismanoid 0:4d7de8b5c800 124 #endif
whismanoid 0:4d7de8b5c800 125 //
whismanoid 0:4d7de8b5c800 126 // Support commands that get handled immediately w/o waiting for EOL
whismanoid 0:4d7de8b5c800 127 // Avoid using characters that may appear in other commands,
whismanoid 0:4d7de8b5c800 128 // such as 0-9 A-Z a-z and some punctuation %*+-./=
whismanoid 0:4d7de8b5c800 129 // so these 25 characters are available: !"#$&'(),:;<>?@[\]^_`{|}~
whismanoid 0:4d7de8b5c800 130 //case '!': // immediate command !) example
whismanoid 0:4d7de8b5c800 131 // do_some_immediate_action();
whismanoid 0:4d7de8b5c800 132 // clear();
whismanoid 0:4d7de8b5c800 133 // break;
whismanoid 0:4d7de8b5c800 134 //case ' ':
whismanoid 0:4d7de8b5c800 135 // on_immediate_0x20(); // Unicode (U+0020) SPACE
whismanoid 0:4d7de8b5c800 136 // break;
whismanoid 14:9abcdf4eb4e4 137 //
whismanoid 14:9abcdf4eb4e4 138 // Note: these on_immediate case may fall through, by design.
whismanoid 14:9abcdf4eb4e4 139 // #if __GNUC__
whismanoid 14:9abcdf4eb4e4 140 // #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
whismanoid 14:9abcdf4eb4e4 141 // #endif
whismanoid 14:9abcdf4eb4e4 142 #if 1
whismanoid 0:4d7de8b5c800 143 case '!':
whismanoid 1:5b33e7447601 144 //~ on_immediate_0x21(); // Unicode (U+0021) ! EXCLAMATION MARK
whismanoid 1:5b33e7447601 145 //~ break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 146 if (on_immediate_0x21) {
whismanoid 1:5b33e7447601 147 on_immediate_0x21(); // Unicode (U+0021) ! EXCLAMATION MARK
whismanoid 1:5b33e7447601 148 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 149 }
whismanoid 0:4d7de8b5c800 150 case '{':
whismanoid 1:5b33e7447601 151 //~ on_immediate_0x7b(); // Unicode (U+007B) { LEFT CURLY BRACKET
whismanoid 1:5b33e7447601 152 //~ break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 153 if (on_immediate_0x7b) {
whismanoid 1:5b33e7447601 154 on_immediate_0x7b(); // Unicode (U+007B) { LEFT CURLY BRACKET
whismanoid 1:5b33e7447601 155 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 156 }
whismanoid 0:4d7de8b5c800 157 case '}':
whismanoid 1:5b33e7447601 158 //~ on_immediate_0x7d(); // Unicode (U+007D) } RIGHT CURLY BRACKET
whismanoid 1:5b33e7447601 159 //~ break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 160 if (on_immediate_0x7d) {
whismanoid 1:5b33e7447601 161 on_immediate_0x7d(); // Unicode (U+007D) } RIGHT CURLY BRACKET
whismanoid 1:5b33e7447601 162 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 163 }
whismanoid 0:4d7de8b5c800 164 //
whismanoid 0:4d7de8b5c800 165 // default:
whismanoid 0:4d7de8b5c800 166 case '"':
whismanoid 1:5b33e7447601 167 if (on_immediate_0x22) {
whismanoid 1:5b33e7447601 168 on_immediate_0x22(); // Unicode (U+0022) " QUOTATION MARK
whismanoid 1:5b33e7447601 169 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 170 }
whismanoid 0:4d7de8b5c800 171 case '#':
whismanoid 1:5b33e7447601 172 if (on_immediate_0x23) {
whismanoid 1:5b33e7447601 173 on_immediate_0x23(); // Unicode (U+0023) # NUMBER SIGN = pound sign, hash, crosshatch
whismanoid 1:5b33e7447601 174 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 175 }
whismanoid 0:4d7de8b5c800 176 case '$':
whismanoid 1:5b33e7447601 177 if (on_immediate_0x24) {
whismanoid 1:5b33e7447601 178 on_immediate_0x24(); // Unicode (U+0024) $ DOLLAR SIGN
whismanoid 1:5b33e7447601 179 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 180 }
whismanoid 0:4d7de8b5c800 181 //~ on_immediate_0x24(); // Unicode (U+0024) $ DOLLAR SIGN
whismanoid 0:4d7de8b5c800 182 //~ break; // handled as immediate command, do not append to buffer
whismanoid 0:4d7de8b5c800 183 //case '%':
whismanoid 0:4d7de8b5c800 184 // on_immediate_0x25(); // Unicode (U+0025) % PERCENT SIGN
whismanoid 0:4d7de8b5c800 185 // break;
whismanoid 0:4d7de8b5c800 186 case '&':
whismanoid 1:5b33e7447601 187 if (on_immediate_0x26) {
whismanoid 1:5b33e7447601 188 on_immediate_0x26(); // Unicode (U+0026) & AMPERSAND
whismanoid 1:5b33e7447601 189 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 190 }
whismanoid 0:4d7de8b5c800 191 case '\'':
whismanoid 1:5b33e7447601 192 if (on_immediate_0x27) {
whismanoid 1:5b33e7447601 193 on_immediate_0x27(); // Unicode (U+0027) ' APOSTROPHE
whismanoid 1:5b33e7447601 194 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 195 }
whismanoid 0:4d7de8b5c800 196 case '(':
whismanoid 1:5b33e7447601 197 if (on_immediate_0x28) {
whismanoid 1:5b33e7447601 198 on_immediate_0x28(); // Unicode (U+0028) ( LEFT PARENTHESIS
whismanoid 1:5b33e7447601 199 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 200 }
whismanoid 0:4d7de8b5c800 201 case ')':
whismanoid 1:5b33e7447601 202 if (on_immediate_0x29) {
whismanoid 1:5b33e7447601 203 on_immediate_0x29(); // Unicode (U+0029) ) RIGHT PARENTHESIS
whismanoid 1:5b33e7447601 204 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 205 }
whismanoid 0:4d7de8b5c800 206 //case '*':
whismanoid 0:4d7de8b5c800 207 // on_immediate_0x2a(); // Unicode (U+002A) * ASTERISK
whismanoid 0:4d7de8b5c800 208 // break;
whismanoid 0:4d7de8b5c800 209 //case '+':
whismanoid 0:4d7de8b5c800 210 // on_immediate_0x2b(); // Unicode (U+002B) + PLUS SIGN
whismanoid 0:4d7de8b5c800 211 // break;
whismanoid 0:4d7de8b5c800 212 case ',':
whismanoid 1:5b33e7447601 213 if (on_immediate_0x2c) {
whismanoid 1:5b33e7447601 214 on_immediate_0x2c(); // Unicode (U+002C) , COMMA
whismanoid 1:5b33e7447601 215 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 216 }
whismanoid 0:4d7de8b5c800 217 //case '-':
whismanoid 0:4d7de8b5c800 218 // on_immediate_0x2d(); // Unicode (U+002D) - HYPHEN-MINUS
whismanoid 0:4d7de8b5c800 219 // break;
whismanoid 0:4d7de8b5c800 220 //case '.':
whismanoid 0:4d7de8b5c800 221 // on_immediate_0x2e(); // Unicode (U+002E) . FULL STOP
whismanoid 0:4d7de8b5c800 222 // break;
whismanoid 0:4d7de8b5c800 223 //case '/':
whismanoid 0:4d7de8b5c800 224 // on_immediate_0x2f(); // Unicode (U+002F) / SOLIDUS =SLASH
whismanoid 0:4d7de8b5c800 225 // break;
whismanoid 0:4d7de8b5c800 226 case ':':
whismanoid 1:5b33e7447601 227 if (on_immediate_0x3a) {
whismanoid 1:5b33e7447601 228 on_immediate_0x3a(); // Unicode (U+003A) : COLON
whismanoid 1:5b33e7447601 229 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 230 }
whismanoid 0:4d7de8b5c800 231 case ';':
whismanoid 1:5b33e7447601 232 if (on_immediate_0x3b) {
whismanoid 1:5b33e7447601 233 on_immediate_0x3b(); // Unicode (U+003B) ; SEMICOLON
whismanoid 1:5b33e7447601 234 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 235 }
whismanoid 0:4d7de8b5c800 236 case '<':
whismanoid 1:5b33e7447601 237 if (on_immediate_0x3c) {
whismanoid 1:5b33e7447601 238 on_immediate_0x3c(); // Unicode (U+003C) < LESS-THAN SIGN
whismanoid 1:5b33e7447601 239 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 240 }
whismanoid 0:4d7de8b5c800 241 //case '=':
whismanoid 0:4d7de8b5c800 242 // on_immediate_0x3d(); // Unicode (U+003D) = EQUALS SIGN
whismanoid 0:4d7de8b5c800 243 // break;
whismanoid 0:4d7de8b5c800 244 case '>':
whismanoid 1:5b33e7447601 245 if (on_immediate_0x3e) {
whismanoid 1:5b33e7447601 246 on_immediate_0x3e(); // Unicode (U+003E) > GREATER-THAN SIGN
whismanoid 1:5b33e7447601 247 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 248 }
whismanoid 0:4d7de8b5c800 249 case '?':
whismanoid 1:5b33e7447601 250 if (on_immediate_0x3f) {
whismanoid 1:5b33e7447601 251 on_immediate_0x3f(); // Unicode (U+003F) ? QUESTION MARK
whismanoid 1:5b33e7447601 252 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 253 }
whismanoid 0:4d7de8b5c800 254 case '@':
whismanoid 1:5b33e7447601 255 if (on_immediate_0x40) {
whismanoid 1:5b33e7447601 256 on_immediate_0x40(); // Unicode (U+0040) @ COMMERCIAL AT = at sign
whismanoid 1:5b33e7447601 257 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 258 }
whismanoid 0:4d7de8b5c800 259 case '[':
whismanoid 1:5b33e7447601 260 if (on_immediate_0x5b) {
whismanoid 1:5b33e7447601 261 on_immediate_0x5b(); // Unicode (U+005B) [ LEFT SQUARE BRACKET
whismanoid 1:5b33e7447601 262 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 263 }
whismanoid 0:4d7de8b5c800 264 case '\\':
whismanoid 1:5b33e7447601 265 if (on_immediate_0x5c) {
whismanoid 1:5b33e7447601 266 on_immediate_0x5c(); // Unicode (U+005C) \ REVERSE SOLIDUS
whismanoid 1:5b33e7447601 267 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 268 }
whismanoid 0:4d7de8b5c800 269 case ']':
whismanoid 1:5b33e7447601 270 if (on_immediate_0x5d) {
whismanoid 1:5b33e7447601 271 on_immediate_0x5d(); // Unicode (U+005D) ] RIGHT SQUARE BRACKET
whismanoid 1:5b33e7447601 272 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 273 }
whismanoid 0:4d7de8b5c800 274 case '^':
whismanoid 1:5b33e7447601 275 if (on_immediate_0x5e) {
whismanoid 1:5b33e7447601 276 on_immediate_0x5e(); // Unicode (U+005E) ^ CIRCUMFLEX ACCENT
whismanoid 1:5b33e7447601 277 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 278 }
whismanoid 0:4d7de8b5c800 279 case '_':
whismanoid 1:5b33e7447601 280 if (on_immediate_0x5f) {
whismanoid 1:5b33e7447601 281 on_immediate_0x5f(); // Unicode (U+005F) _ LOW LINE =SPACING UNDERSCORE
whismanoid 1:5b33e7447601 282 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 283 }
whismanoid 0:4d7de8b5c800 284 case '`':
whismanoid 1:5b33e7447601 285 if (on_immediate_0x60) {
whismanoid 1:5b33e7447601 286 on_immediate_0x60(); // Unicode (U+0060) ` GRAVE ACCENT (also called backtick)
whismanoid 1:5b33e7447601 287 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 288 }
whismanoid 0:4d7de8b5c800 289 case '|':
whismanoid 1:5b33e7447601 290 if (on_immediate_0x7c) {
whismanoid 1:5b33e7447601 291 on_immediate_0x7c(); // Unicode (U+007C) | VERTICAL LINE
whismanoid 1:5b33e7447601 292 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 293 }
whismanoid 0:4d7de8b5c800 294 case '~':
whismanoid 1:5b33e7447601 295 if (on_immediate_0x7e) {
whismanoid 1:5b33e7447601 296 on_immediate_0x7e(); // Unicode (U+007E) ~ TILDE
whismanoid 1:5b33e7447601 297 break; // handled as immediate command, do not append to buffer
whismanoid 1:5b33e7447601 298 }
whismanoid 14:9abcdf4eb4e4 299 #endif
whismanoid 14:9abcdf4eb4e4 300 // #if __GNUC__
whismanoid 14:9abcdf4eb4e4 301 // #pragma GCC diagnostic pop
whismanoid 14:9abcdf4eb4e4 302 // #endif
whismanoid 14:9abcdf4eb4e4 303 // Note: these on_immediate case may fall through, by design.
whismanoid 0:4d7de8b5c800 304 //
whismanoid 0:4d7de8b5c800 305 default:
whismanoid 0:4d7de8b5c800 306 MBED_ASSERT(indexOfNextEmptyCell <= COMMAND_BUFFER_LENGTH - 2);
whismanoid 0:4d7de8b5c800 307 buf[indexOfNextEmptyCell++] = ch; // append character, post-increment index
whismanoid 0:4d7de8b5c800 308 buf[indexOfNextEmptyCell] = '\0'; // null-terminate the buffer
whismanoid 0:4d7de8b5c800 309 MBED_ASSERT(indexOfNextEmptyCell <= COMMAND_BUFFER_LENGTH - 1);
whismanoid 15:34b039027e5f 310 if (!quiet) associatedSerialPort.printf("%c", ch); // echo
whismanoid 0:4d7de8b5c800 311 if (indexOfNextEmptyCell == COMMAND_BUFFER_LENGTH - 1)
whismanoid 0:4d7de8b5c800 312 {
whismanoid 0:4d7de8b5c800 313 // buffer is full, parse what we've got
whismanoid 0:4d7de8b5c800 314 if (onEOLcommandParser) {
whismanoid 0:4d7de8b5c800 315 onEOLcommandParser(*this);
whismanoid 0:4d7de8b5c800 316 }
whismanoid 0:4d7de8b5c800 317 clear();
whismanoid 0:4d7de8b5c800 318 }
whismanoid 0:4d7de8b5c800 319 break;
whismanoid 0:4d7de8b5c800 320 }
whismanoid 0:4d7de8b5c800 321 }
whismanoid 1:5b33e7447601 322
whismanoid 0:4d7de8b5c800 323 /** CmdLine::parse_and_remove_key matches "key"
whismanoid 0:4d7de8b5c800 324 *
whismanoid 0:4d7de8b5c800 325 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 326 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 327 * @param[out] valueBuf buffer is populated with the substring between key= and the first space delimiter (or end of string)
whismanoid 0:4d7de8b5c800 328 * @param[in] valueBufLen limits the size of valueBuf
whismanoid 0:4d7de8b5c800 329 *
whismanoid 0:4d7de8b5c800 330 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 9:12e37800ecdd 331 * @post chSeparator is populated with the separator character '=' or '?' following key=, or null character if no separator
whismanoid 0:4d7de8b5c800 332 *
whismanoid 0:4d7de8b5c800 333 */
whismanoid 0:4d7de8b5c800 334 bool CmdLine::parse_and_remove_key(const char *key, char *valueBuf, size_t valueBufLen)
whismanoid 0:4d7de8b5c800 335 {
whismanoid 0:4d7de8b5c800 336 // serial().printf("\r\n parse_and_remove_key(\"%s\")...", key);
whismanoid 0:4d7de8b5c800 337 // match key inside buf[]?
whismanoid 0:4d7de8b5c800 338 for (unsigned int idxSearch = 0; idxSearch < indexOfNextEmptyCell; idxSearch++)
whismanoid 0:4d7de8b5c800 339 {
whismanoid 0:4d7de8b5c800 340 if (buf[idxSearch] == '\0') {
whismanoid 0:4d7de8b5c800 341 // serial().printf("\r\n parse_and_remove_key(\"%s\") no match", key);
whismanoid 0:4d7de8b5c800 342 return false; /* no match */
whismanoid 0:4d7de8b5c800 343 }
whismanoid 10:3e2ff983be1c 344 if (match_is_case_sensitive) {
whismanoid 11:e8a4162d4fd1 345 // case-sensitive string comparison
whismanoid 10:3e2ff983be1c 346 if (buf[idxSearch] != key[0]) { continue; }
whismanoid 10:3e2ff983be1c 347 }
whismanoid 10:3e2ff983be1c 348 else {
whismanoid 11:e8a4162d4fd1 349 // case-insensitive string comparison using toupper()
whismanoid 10:3e2ff983be1c 350 if (toupper(buf[idxSearch]) != toupper(key[0])) { continue; }
whismanoid 10:3e2ff983be1c 351 }
whismanoid 0:4d7de8b5c800 352 // possible match; compare buf[idxSearch..] to key[0..]
whismanoid 0:4d7de8b5c800 353 unsigned int idxKey = idxSearch; // test whether buf[idxKey..] == key[0..]
whismanoid 9:12e37800ecdd 354 unsigned int idxSeparator = idxSearch; // test whether key=value pair
whismanoid 0:4d7de8b5c800 355 unsigned int idxSpace = idxSearch; // end of key=value word
whismanoid 0:4d7de8b5c800 356 for (unsigned int offset = 0; offset < strlen(key); offset++)
whismanoid 0:4d7de8b5c800 357 {
whismanoid 11:e8a4162d4fd1 358 if (match_is_case_sensitive) {
whismanoid 11:e8a4162d4fd1 359 // case-sensitive string comparison
whismanoid 11:e8a4162d4fd1 360 if (buf[idxKey + offset] != key[offset]) { idxKey = 0; break; }
whismanoid 11:e8a4162d4fd1 361 }
whismanoid 11:e8a4162d4fd1 362 else {
whismanoid 11:e8a4162d4fd1 363 // case-insensitive string comparison using toupper()
whismanoid 11:e8a4162d4fd1 364 if (toupper(buf[idxKey + offset]) != toupper(key[offset])) { idxKey = 0; break; }
whismanoid 11:e8a4162d4fd1 365 }
whismanoid 9:12e37800ecdd 366 idxSpace = idxKey + offset + 1; // assume next char is a word break
whismanoid 9:12e37800ecdd 367 idxSeparator = idxKey + offset + 1; // assume next char is a separator
whismanoid 9:12e37800ecdd 368 if ((buf[idxSeparator] != '=') && (buf[idxSeparator] != '?')) { idxSeparator = 0; }
whismanoid 0:4d7de8b5c800 369 }
whismanoid 0:4d7de8b5c800 370 if (idxKey == 0) continue; // no match at idxSearch but keep searching
whismanoid 0:4d7de8b5c800 371 // ASSERT buf[idxKey..] == key[0..]
whismanoid 0:4d7de8b5c800 372 while ((buf[idxSpace] != ' ') && idxSpace < indexOfNextEmptyCell) { idxSpace++; }
whismanoid 0:4d7de8b5c800 373 // serial().printf("\r\n parse_and_remove_key(\"%s\") match at index %d length %d, '=' index %d, ' ' index %d",
whismanoid 9:12e37800ecdd 374 // key, idxKey, strlen(key), idxSeparator, idxSpace);
whismanoid 9:12e37800ecdd 375 if (idxSeparator != 0) {
whismanoid 9:12e37800ecdd 376 // found key=value: copy buf[idxSeparator+1..' '-1] into valueBuf[0..valueBufLen-1]
whismanoid 9:12e37800ecdd 377 chSeparator = buf[idxSeparator];
whismanoid 0:4d7de8b5c800 378 for (unsigned int offset = 0; offset < valueBufLen - 1; offset++)
whismanoid 0:4d7de8b5c800 379 {
whismanoid 9:12e37800ecdd 380 if (buf[idxSeparator + 1 + offset] == ' ') break;
whismanoid 9:12e37800ecdd 381 valueBuf[offset] = buf[idxSeparator + 1 + offset];
whismanoid 0:4d7de8b5c800 382 valueBuf[offset + 1] = '\0';
whismanoid 0:4d7de8b5c800 383 }
whismanoid 0:4d7de8b5c800 384 } else {
whismanoid 0:4d7de8b5c800 385 // found key but no =value: valueBuf[] = ""
whismanoid 9:12e37800ecdd 386 chSeparator = '\0';
whismanoid 0:4d7de8b5c800 387 valueBuf[0] = '\0';
whismanoid 0:4d7de8b5c800 388 }
whismanoid 0:4d7de8b5c800 389 // on successful match, the key=value should be deleted from cmdbuf
whismanoid 0:4d7de8b5c800 390 //serial().printf("\r\n parse_and_remove_key(\"%s\") buf=\"%s\" valueBuf=\"%s\" before deleting key",
whismanoid 0:4d7de8b5c800 391 // key, buf, valueBuf);
whismanoid 0:4d7de8b5c800 392 for (unsigned int offset = 0; offset < indexOfNextEmptyCell; offset++)
whismanoid 0:4d7de8b5c800 393 {
whismanoid 0:4d7de8b5c800 394 unsigned int idxCopyDst = idxKey + offset;
whismanoid 0:4d7de8b5c800 395 unsigned int idxCopySrc = idxSpace + 1 + offset;
whismanoid 0:4d7de8b5c800 396 if (idxCopyDst > indexOfNextEmptyCell) break;
whismanoid 0:4d7de8b5c800 397 if (idxCopySrc > indexOfNextEmptyCell) break;
whismanoid 0:4d7de8b5c800 398 buf[idxCopyDst] = buf[idxCopySrc];
whismanoid 0:4d7de8b5c800 399 }
whismanoid 0:4d7de8b5c800 400 // serial().printf("\r\n parse_and_remove_key(\"%s\") buf=\"%s\" valueBuf=\"%s\" after deleting key",
whismanoid 0:4d7de8b5c800 401 // key, buf, valueBuf);
whismanoid 0:4d7de8b5c800 402 // serial().printf("\r\n parse_and_remove_key(\"%s\") returning true: valueBuf=\"%s\"", key, valueBuf);
whismanoid 0:4d7de8b5c800 403 return true;
whismanoid 0:4d7de8b5c800 404 }
whismanoid 0:4d7de8b5c800 405 // serial().printf("\r\n parse_and_remove_key(\"%s\") no match", key);
whismanoid 0:4d7de8b5c800 406 return false; // no match
whismanoid 0:4d7de8b5c800 407 }
whismanoid 0:4d7de8b5c800 408
whismanoid 0:4d7de8b5c800 409 /** CmdLine::parse_frequency_Hz matches "key"=digits
whismanoid 0:4d7de8b5c800 410 *
whismanoid 0:4d7de8b5c800 411 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 412 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 413 * @param[out] frequency_Hz updated from value string if match "key"=value,
whismanoid 0:4d7de8b5c800 414 * optional suffix kHz or MHz scales the value by 1000 or 10000000
whismanoid 0:4d7de8b5c800 415 *
whismanoid 0:4d7de8b5c800 416 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 417 *
whismanoid 0:4d7de8b5c800 418 */
whismanoid 0:4d7de8b5c800 419 bool CmdLine::parse_frequency_Hz(const char *key, uint32_t& frequency_Hz)
whismanoid 0:4d7de8b5c800 420 {
whismanoid 0:4d7de8b5c800 421 char valueBuf[16];
whismanoid 0:4d7de8b5c800 422 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 423 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 424 {
whismanoid 0:4d7de8b5c800 425 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 0:4d7de8b5c800 426 // parse cmdLine arg (SCLK=\d+(kHZ|MHZ)?)? --> g_SPI_SCLK_Hz
whismanoid 0:4d7de8b5c800 427 frequency_Hz = strtoul(valueBuf, NULL, 10);
whismanoid 0:4d7de8b5c800 428 if (strstr(valueBuf, "M")) {
whismanoid 0:4d7de8b5c800 429 frequency_Hz = frequency_Hz * 1000000;
whismanoid 0:4d7de8b5c800 430 }
whismanoid 0:4d7de8b5c800 431 if (strstr(valueBuf, "k")) {
whismanoid 0:4d7de8b5c800 432 frequency_Hz = frequency_Hz * 1000;
whismanoid 0:4d7de8b5c800 433 }
whismanoid 0:4d7de8b5c800 434 return true;
whismanoid 0:4d7de8b5c800 435 }
whismanoid 0:4d7de8b5c800 436 return false; // no match
whismanoid 0:4d7de8b5c800 437 }
whismanoid 0:4d7de8b5c800 438
whismanoid 4:700b71cd3bd2 439 /** CmdLine::parse_interval_usec matches "key"=digits
whismanoid 4:700b71cd3bd2 440 *
whismanoid 4:700b71cd3bd2 441 * @return true if keyword was found in buffer
whismanoid 4:700b71cd3bd2 442 * @param[in] key string value to match
whismanoid 4:700b71cd3bd2 443 * @param[out] interval_usec updated from value string if match "key"=value,
whismanoid 4:700b71cd3bd2 444 * optional suffix Hz kHz or MHz 1/x inverts and scales the value
whismanoid 4:700b71cd3bd2 445 * optional suffix s or ms or msec or us or usec scales the value
whismanoid 4:700b71cd3bd2 446 *
whismanoid 4:700b71cd3bd2 447 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 4:700b71cd3bd2 448 *
whismanoid 4:700b71cd3bd2 449 */
whismanoid 4:700b71cd3bd2 450 bool CmdLine::parse_interval_usec(const char *key, us_timestamp_t& interval_usec)
whismanoid 4:700b71cd3bd2 451 {
whismanoid 4:700b71cd3bd2 452 char valueBuf[32];
whismanoid 4:700b71cd3bd2 453 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 4:700b71cd3bd2 454 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 4:700b71cd3bd2 455 {
whismanoid 4:700b71cd3bd2 456 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 4:700b71cd3bd2 457 interval_usec = strtoul(valueBuf, NULL, 10);
whismanoid 4:700b71cd3bd2 458 if (strstr(valueBuf, "ms")) {
whismanoid 4:700b71cd3bd2 459 interval_usec = interval_usec * 1000;
whismanoid 5:1a14de1c4d7b 460 } else if (strstr(valueBuf, "us")) {
whismanoid 5:1a14de1c4d7b 461 // avoid matching "s" which is a subset of "us"
whismanoid 5:1a14de1c4d7b 462 // interval_usec = interval_usec * 1;
whismanoid 4:700b71cd3bd2 463 } else if (strstr(valueBuf, "s")) {
whismanoid 4:700b71cd3bd2 464 interval_usec = interval_usec * 1000000;
whismanoid 4:700b71cd3bd2 465 } else if (strstr(valueBuf, "MHz")) {
whismanoid 4:700b71cd3bd2 466 interval_usec = 1. / interval_usec;
whismanoid 4:700b71cd3bd2 467 } else if (strstr(valueBuf, "kHz")) {
whismanoid 4:700b71cd3bd2 468 interval_usec = 1000. / interval_usec;
whismanoid 4:700b71cd3bd2 469 } else if (strstr(valueBuf, "Hz")) {
whismanoid 4:700b71cd3bd2 470 interval_usec = 1000000. / interval_usec;
whismanoid 4:700b71cd3bd2 471 }
whismanoid 4:700b71cd3bd2 472 return true;
whismanoid 4:700b71cd3bd2 473 }
whismanoid 4:700b71cd3bd2 474 return false; // no match
whismanoid 4:700b71cd3bd2 475 }
whismanoid 4:700b71cd3bd2 476
whismanoid 0:4d7de8b5c800 477 /** CmdLine::parse_flag matches "key"=0 or 1
whismanoid 0:4d7de8b5c800 478 *
whismanoid 0:4d7de8b5c800 479 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 480 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 481 * @param[out] nFlagVar variable to be updated by setting or clearing bits specified by nFlagBitMask.
whismanoid 0:4d7de8b5c800 482 * If match "key"=0 then the nFlagBitMask bits in nFlagVar are cleared.
whismanoid 0:4d7de8b5c800 483 * If match "key"=1 then the nFlagBitMask bits in nFlagVar are set.
whismanoid 0:4d7de8b5c800 484 * @param[in] nFlagBitMask bit mask contains binary 1 in the bit to be controlled by the key=value setting
whismanoid 0:4d7de8b5c800 485 *
whismanoid 0:4d7de8b5c800 486 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 487 *
whismanoid 0:4d7de8b5c800 488 */
whismanoid 0:4d7de8b5c800 489 bool CmdLine::parse_flag(const char *key, uint8_t& nFlagVar, const uint8_t nFlagBitMask)
whismanoid 0:4d7de8b5c800 490 {
whismanoid 0:4d7de8b5c800 491 char valueBuf[16];
whismanoid 0:4d7de8b5c800 492 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 493 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 494 {
whismanoid 0:4d7de8b5c800 495 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 0:4d7de8b5c800 496 // parse cmdLine arg (CPHA=\d)? --> g_SPI_dataMode | SPI_MODE1
whismanoid 0:4d7de8b5c800 497 int x = strtoul(valueBuf, NULL, 10);
whismanoid 0:4d7de8b5c800 498 if (x)
whismanoid 0:4d7de8b5c800 499 {
whismanoid 0:4d7de8b5c800 500 nFlagVar |= nFlagBitMask;
whismanoid 0:4d7de8b5c800 501 }
whismanoid 0:4d7de8b5c800 502 else
whismanoid 0:4d7de8b5c800 503 {
whismanoid 0:4d7de8b5c800 504 nFlagVar &= ~nFlagBitMask;
whismanoid 0:4d7de8b5c800 505 }
whismanoid 0:4d7de8b5c800 506 return true;
whismanoid 0:4d7de8b5c800 507 }
whismanoid 0:4d7de8b5c800 508 return false; // no match
whismanoid 0:4d7de8b5c800 509 }
whismanoid 0:4d7de8b5c800 510
whismanoid 0:4d7de8b5c800 511 /** CmdLine::parse_byte_hex matches "key"=value
whismanoid 0:4d7de8b5c800 512 *
whismanoid 0:4d7de8b5c800 513 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 514 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 515 * @param[out] nByteVar updated from value string if match "key"=value
whismanoid 0:4d7de8b5c800 516 *
whismanoid 0:4d7de8b5c800 517 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 518 *
whismanoid 2:0f702da53f2a 519 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 2:0f702da53f2a 520 * Default number conversion radix is base-16 hexadecimal.
whismanoid 0:4d7de8b5c800 521 */
whismanoid 0:4d7de8b5c800 522 bool CmdLine::parse_byte_hex(const char *key, uint8_t& nByteVar)
whismanoid 0:4d7de8b5c800 523 {
whismanoid 0:4d7de8b5c800 524 char valueBuf[16];
whismanoid 0:4d7de8b5c800 525 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 526 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 527 {
whismanoid 0:4d7de8b5c800 528 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 0:4d7de8b5c800 529 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 0:4d7de8b5c800 530 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 0:4d7de8b5c800 531 if (valueBuf[0] == '$')
whismanoid 0:4d7de8b5c800 532 {
whismanoid 0:4d7de8b5c800 533 nByteVar = strtoul(valueBuf + 1, NULL, 16);
whismanoid 0:4d7de8b5c800 534 return true;
whismanoid 0:4d7de8b5c800 535 }
whismanoid 0:4d7de8b5c800 536 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 0:4d7de8b5c800 537 {
whismanoid 0:4d7de8b5c800 538 nByteVar = strtoul(valueBuf + 2, NULL, 16);
whismanoid 0:4d7de8b5c800 539 return true;
whismanoid 0:4d7de8b5c800 540 }
whismanoid 2:0f702da53f2a 541 nByteVar = strtoul(valueBuf, NULL, 16); // default radix hex
whismanoid 0:4d7de8b5c800 542 return true;
whismanoid 0:4d7de8b5c800 543 }
whismanoid 0:4d7de8b5c800 544 return false; // no match
whismanoid 0:4d7de8b5c800 545 }
whismanoid 0:4d7de8b5c800 546
whismanoid 0:4d7de8b5c800 547 /** CmdLine::parse_byte_dec matches "key"=value
whismanoid 0:4d7de8b5c800 548 *
whismanoid 0:4d7de8b5c800 549 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 550 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 551 * @param[out] nByteVar updated from value string if match "key"=value
whismanoid 0:4d7de8b5c800 552 *
whismanoid 0:4d7de8b5c800 553 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 554 *
whismanoid 2:0f702da53f2a 555 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 2:0f702da53f2a 556 * Default number conversion radix is base-10 decimal.
whismanoid 0:4d7de8b5c800 557 */
whismanoid 0:4d7de8b5c800 558 bool CmdLine::parse_byte_dec(const char *key, uint8_t& nByteVar)
whismanoid 0:4d7de8b5c800 559 {
whismanoid 0:4d7de8b5c800 560 char valueBuf[16];
whismanoid 0:4d7de8b5c800 561 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 562 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 563 {
whismanoid 0:4d7de8b5c800 564 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 0:4d7de8b5c800 565 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 0:4d7de8b5c800 566 // TODO1: parse_byte_dec take hex prefix 0x 0X or suffix $ h H
whismanoid 0:4d7de8b5c800 567 if (valueBuf[0] == '$')
whismanoid 0:4d7de8b5c800 568 {
whismanoid 0:4d7de8b5c800 569 nByteVar = strtoul(valueBuf + 1, NULL, 16);
whismanoid 0:4d7de8b5c800 570 return true;
whismanoid 0:4d7de8b5c800 571 }
whismanoid 0:4d7de8b5c800 572 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 0:4d7de8b5c800 573 {
whismanoid 0:4d7de8b5c800 574 nByteVar = strtoul(valueBuf + 2, NULL, 16);
whismanoid 0:4d7de8b5c800 575 return true;
whismanoid 0:4d7de8b5c800 576 }
whismanoid 2:0f702da53f2a 577 nByteVar = strtoul(valueBuf, NULL, 10); // default radix decimal
whismanoid 0:4d7de8b5c800 578 return true;
whismanoid 0:4d7de8b5c800 579 }
whismanoid 0:4d7de8b5c800 580 return false; // no match
whismanoid 0:4d7de8b5c800 581 }
whismanoid 0:4d7de8b5c800 582
whismanoid 0:4d7de8b5c800 583 /** CmdLine::parse_uint16_hex matches "key"=value
whismanoid 0:4d7de8b5c800 584 *
whismanoid 0:4d7de8b5c800 585 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 586 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 587 * @param[out] uint16Var updated from value string if match "key"=value
whismanoid 0:4d7de8b5c800 588 *
whismanoid 0:4d7de8b5c800 589 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 590 *
whismanoid 2:0f702da53f2a 591 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 2:0f702da53f2a 592 * Default number conversion radix is base-16 hexadecimal.
whismanoid 0:4d7de8b5c800 593 */
whismanoid 0:4d7de8b5c800 594 bool CmdLine::parse_uint16_hex(const char *key, uint16_t& uint16Var)
whismanoid 0:4d7de8b5c800 595 {
whismanoid 0:4d7de8b5c800 596 char valueBuf[16];
whismanoid 0:4d7de8b5c800 597 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 598 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 599 {
whismanoid 0:4d7de8b5c800 600 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 0:4d7de8b5c800 601 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 0:4d7de8b5c800 602 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 0:4d7de8b5c800 603 if (valueBuf[0] == '$')
whismanoid 0:4d7de8b5c800 604 {
whismanoid 0:4d7de8b5c800 605 uint16Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 0:4d7de8b5c800 606 return true;
whismanoid 0:4d7de8b5c800 607 }
whismanoid 0:4d7de8b5c800 608 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 0:4d7de8b5c800 609 {
whismanoid 0:4d7de8b5c800 610 uint16Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 0:4d7de8b5c800 611 return true;
whismanoid 0:4d7de8b5c800 612 }
whismanoid 2:0f702da53f2a 613 uint16Var = strtoul(valueBuf, NULL, 16); // default radix hex
whismanoid 2:0f702da53f2a 614 return true;
whismanoid 2:0f702da53f2a 615 }
whismanoid 2:0f702da53f2a 616 return false; // no match
whismanoid 2:0f702da53f2a 617 }
whismanoid 2:0f702da53f2a 618
whismanoid 2:0f702da53f2a 619 /** CmdLine::parse_uint16_dec matches "key"=value
whismanoid 2:0f702da53f2a 620 *
whismanoid 2:0f702da53f2a 621 * @return true if keyword was found in buffer
whismanoid 2:0f702da53f2a 622 * @param[in] key string value to match
whismanoid 2:0f702da53f2a 623 * @param[out] uint16Var updated from value string if match "key"=value
whismanoid 2:0f702da53f2a 624 *
whismanoid 2:0f702da53f2a 625 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 2:0f702da53f2a 626 *
whismanoid 2:0f702da53f2a 627 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 2:0f702da53f2a 628 * Default number conversion radix is base-10 decimal.
whismanoid 2:0f702da53f2a 629 */
whismanoid 2:0f702da53f2a 630 bool CmdLine::parse_uint16_dec(const char *key, uint16_t& uint16Var)
whismanoid 2:0f702da53f2a 631 {
whismanoid 2:0f702da53f2a 632 char valueBuf[16];
whismanoid 2:0f702da53f2a 633 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 2:0f702da53f2a 634 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 2:0f702da53f2a 635 {
whismanoid 2:0f702da53f2a 636 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 2:0f702da53f2a 637 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 2:0f702da53f2a 638 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 2:0f702da53f2a 639 if (valueBuf[0] == '$')
whismanoid 2:0f702da53f2a 640 {
whismanoid 2:0f702da53f2a 641 uint16Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 2:0f702da53f2a 642 return true;
whismanoid 2:0f702da53f2a 643 }
whismanoid 2:0f702da53f2a 644 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 2:0f702da53f2a 645 {
whismanoid 2:0f702da53f2a 646 uint16Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 2:0f702da53f2a 647 return true;
whismanoid 2:0f702da53f2a 648 }
whismanoid 2:0f702da53f2a 649 uint16Var = strtoul(valueBuf, NULL, 10); // default radix decimal
whismanoid 0:4d7de8b5c800 650 return true;
whismanoid 0:4d7de8b5c800 651 }
whismanoid 0:4d7de8b5c800 652 return false; // no match
whismanoid 0:4d7de8b5c800 653 }
whismanoid 0:4d7de8b5c800 654
whismanoid 13:abedfe18f924 655 /** CmdLine::parse_int_dec matches "key"=value
whismanoid 13:abedfe18f924 656 *
whismanoid 13:abedfe18f924 657 * @return true if keyword was found in buffer
whismanoid 13:abedfe18f924 658 * @param[in] key string value to match
whismanoid 13:abedfe18f924 659 * @param[out] intVar updated from value string if match "key"=value
whismanoid 13:abedfe18f924 660 *
whismanoid 13:abedfe18f924 661 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 13:abedfe18f924 662 *
whismanoid 13:abedfe18f924 663 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 13:abedfe18f924 664 * Default number conversion radix is base-10 decimal.
whismanoid 13:abedfe18f924 665 */
whismanoid 13:abedfe18f924 666 bool CmdLine::parse_int_dec(const char *key, int& intVar)
whismanoid 13:abedfe18f924 667 {
whismanoid 13:abedfe18f924 668 char valueBuf[16];
whismanoid 13:abedfe18f924 669 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 13:abedfe18f924 670 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 13:abedfe18f924 671 {
whismanoid 13:abedfe18f924 672 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 13:abedfe18f924 673 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 13:abedfe18f924 674 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 13:abedfe18f924 675 if (valueBuf[0] == '$')
whismanoid 13:abedfe18f924 676 {
whismanoid 13:abedfe18f924 677 intVar = strtoul(valueBuf + 1, NULL, 16);
whismanoid 13:abedfe18f924 678 return true;
whismanoid 13:abedfe18f924 679 }
whismanoid 13:abedfe18f924 680 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 13:abedfe18f924 681 {
whismanoid 13:abedfe18f924 682 intVar = strtoul(valueBuf + 2, NULL, 16);
whismanoid 13:abedfe18f924 683 return true;
whismanoid 13:abedfe18f924 684 }
whismanoid 13:abedfe18f924 685 intVar = strtoul(valueBuf, NULL, 10); // default radix decimal
whismanoid 13:abedfe18f924 686 return true;
whismanoid 13:abedfe18f924 687 }
whismanoid 13:abedfe18f924 688 return false; // no match
whismanoid 13:abedfe18f924 689 }
whismanoid 13:abedfe18f924 690
whismanoid 0:4d7de8b5c800 691 /** CmdLine::parse_int16_hex matches "key"=value
whismanoid 0:4d7de8b5c800 692 *
whismanoid 0:4d7de8b5c800 693 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 694 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 695 * @param[out] int16Var updated from value string if match "key"=value
whismanoid 0:4d7de8b5c800 696 *
whismanoid 0:4d7de8b5c800 697 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 698 *
whismanoid 2:0f702da53f2a 699 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 2:0f702da53f2a 700 * Default number conversion radix is base-16 hexadecimal.
whismanoid 0:4d7de8b5c800 701 */
whismanoid 0:4d7de8b5c800 702 bool CmdLine::parse_int16_hex(const char *key, int16_t& int16Var)
whismanoid 0:4d7de8b5c800 703 {
whismanoid 0:4d7de8b5c800 704 char valueBuf[16];
whismanoid 0:4d7de8b5c800 705 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 706 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 707 {
whismanoid 0:4d7de8b5c800 708 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 0:4d7de8b5c800 709 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 0:4d7de8b5c800 710 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 0:4d7de8b5c800 711 if (valueBuf[0] == '$')
whismanoid 0:4d7de8b5c800 712 {
whismanoid 0:4d7de8b5c800 713 int16Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 0:4d7de8b5c800 714 return true;
whismanoid 0:4d7de8b5c800 715 }
whismanoid 0:4d7de8b5c800 716 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 0:4d7de8b5c800 717 {
whismanoid 0:4d7de8b5c800 718 int16Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 0:4d7de8b5c800 719 return true;
whismanoid 0:4d7de8b5c800 720 }
whismanoid 2:0f702da53f2a 721 int16Var = strtoul(valueBuf, NULL, 16); // default radix hex
whismanoid 2:0f702da53f2a 722 return true;
whismanoid 2:0f702da53f2a 723 }
whismanoid 2:0f702da53f2a 724 return false; // no match
whismanoid 2:0f702da53f2a 725 }
whismanoid 2:0f702da53f2a 726
whismanoid 2:0f702da53f2a 727 /** CmdLine::parse_int16_dec matches "key"=value
whismanoid 2:0f702da53f2a 728 *
whismanoid 2:0f702da53f2a 729 * @return true if keyword was found in buffer
whismanoid 2:0f702da53f2a 730 * @param[in] key string value to match
whismanoid 2:0f702da53f2a 731 * @param[out] int16Var updated from value string if match "key"=value
whismanoid 2:0f702da53f2a 732 *
whismanoid 2:0f702da53f2a 733 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 2:0f702da53f2a 734 *
whismanoid 2:0f702da53f2a 735 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 2:0f702da53f2a 736 * Default number conversion radix is base-10 decimal.
whismanoid 2:0f702da53f2a 737 */
whismanoid 2:0f702da53f2a 738 bool CmdLine::parse_int16_dec(const char *key, int16_t& int16Var)
whismanoid 2:0f702da53f2a 739 {
whismanoid 2:0f702da53f2a 740 char valueBuf[16];
whismanoid 2:0f702da53f2a 741 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 2:0f702da53f2a 742 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 2:0f702da53f2a 743 {
whismanoid 2:0f702da53f2a 744 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 2:0f702da53f2a 745 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 2:0f702da53f2a 746 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 2:0f702da53f2a 747 if (valueBuf[0] == '$')
whismanoid 2:0f702da53f2a 748 {
whismanoid 2:0f702da53f2a 749 int16Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 2:0f702da53f2a 750 return true;
whismanoid 2:0f702da53f2a 751 }
whismanoid 2:0f702da53f2a 752 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 2:0f702da53f2a 753 {
whismanoid 2:0f702da53f2a 754 int16Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 2:0f702da53f2a 755 return true;
whismanoid 2:0f702da53f2a 756 }
whismanoid 2:0f702da53f2a 757 int16Var = strtoul(valueBuf, NULL, 10); // default radix decimal
whismanoid 0:4d7de8b5c800 758 return true;
whismanoid 0:4d7de8b5c800 759 }
whismanoid 0:4d7de8b5c800 760 return false; // no match
whismanoid 0:4d7de8b5c800 761 }
whismanoid 0:4d7de8b5c800 762
whismanoid 9:12e37800ecdd 763 /** CmdLine::parse_uint32_hex matches "key"=value
whismanoid 9:12e37800ecdd 764 *
whismanoid 9:12e37800ecdd 765 * @return true if keyword was found in buffer
whismanoid 9:12e37800ecdd 766 * @param[in] key string value to match
whismanoid 9:12e37800ecdd 767 * @param[out] uint32Var updated from value string if match "key"=value
whismanoid 9:12e37800ecdd 768 *
whismanoid 9:12e37800ecdd 769 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 9:12e37800ecdd 770 *
whismanoid 9:12e37800ecdd 771 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 9:12e37800ecdd 772 * Default number conversion radix is base-16 hexadecimal.
whismanoid 9:12e37800ecdd 773 */
whismanoid 9:12e37800ecdd 774 bool CmdLine::parse_uint32_hex(const char *key, uint32_t& uint32Var)
whismanoid 9:12e37800ecdd 775 {
whismanoid 9:12e37800ecdd 776 char valueBuf[16];
whismanoid 9:12e37800ecdd 777 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 9:12e37800ecdd 778 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 9:12e37800ecdd 779 {
whismanoid 9:12e37800ecdd 780 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 9:12e37800ecdd 781 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 9:12e37800ecdd 782 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 9:12e37800ecdd 783 if (valueBuf[0] == '$')
whismanoid 9:12e37800ecdd 784 {
whismanoid 9:12e37800ecdd 785 uint32Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 9:12e37800ecdd 786 return true;
whismanoid 9:12e37800ecdd 787 }
whismanoid 9:12e37800ecdd 788 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 9:12e37800ecdd 789 {
whismanoid 9:12e37800ecdd 790 uint32Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 9:12e37800ecdd 791 return true;
whismanoid 9:12e37800ecdd 792 }
whismanoid 9:12e37800ecdd 793 uint32Var = strtoul(valueBuf, NULL, 16); // default radix hex
whismanoid 9:12e37800ecdd 794 return true;
whismanoid 9:12e37800ecdd 795 }
whismanoid 9:12e37800ecdd 796 return false; // no match
whismanoid 9:12e37800ecdd 797 }
whismanoid 9:12e37800ecdd 798
whismanoid 9:12e37800ecdd 799 /** CmdLine::parse_uint32_dec matches "key"=value
whismanoid 9:12e37800ecdd 800 *
whismanoid 9:12e37800ecdd 801 * @return true if keyword was found in buffer
whismanoid 9:12e37800ecdd 802 * @param[in] key string value to match
whismanoid 9:12e37800ecdd 803 * @param[out] uint32Var updated from value string if match "key"=value
whismanoid 9:12e37800ecdd 804 *
whismanoid 9:12e37800ecdd 805 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 9:12e37800ecdd 806 *
whismanoid 9:12e37800ecdd 807 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 9:12e37800ecdd 808 * Default number conversion radix is base-10 decimal.
whismanoid 9:12e37800ecdd 809 */
whismanoid 9:12e37800ecdd 810 bool CmdLine::parse_uint32_dec(const char *key, uint32_t& uint32Var)
whismanoid 9:12e37800ecdd 811 {
whismanoid 9:12e37800ecdd 812 char valueBuf[16];
whismanoid 9:12e37800ecdd 813 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 9:12e37800ecdd 814 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 9:12e37800ecdd 815 {
whismanoid 9:12e37800ecdd 816 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 9:12e37800ecdd 817 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 9:12e37800ecdd 818 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 9:12e37800ecdd 819 if (valueBuf[0] == '$')
whismanoid 9:12e37800ecdd 820 {
whismanoid 9:12e37800ecdd 821 uint32Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 9:12e37800ecdd 822 return true;
whismanoid 9:12e37800ecdd 823 }
whismanoid 9:12e37800ecdd 824 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 9:12e37800ecdd 825 {
whismanoid 9:12e37800ecdd 826 uint32Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 9:12e37800ecdd 827 return true;
whismanoid 9:12e37800ecdd 828 }
whismanoid 9:12e37800ecdd 829 uint32Var = strtoul(valueBuf, NULL, 10); // default radix decimal
whismanoid 9:12e37800ecdd 830 return true;
whismanoid 9:12e37800ecdd 831 }
whismanoid 9:12e37800ecdd 832 return false; // no match
whismanoid 9:12e37800ecdd 833 }
whismanoid 9:12e37800ecdd 834
whismanoid 9:12e37800ecdd 835 /** CmdLine::parse_int32_hex matches "key"=value
whismanoid 9:12e37800ecdd 836 *
whismanoid 9:12e37800ecdd 837 * @return true if keyword was found in buffer
whismanoid 9:12e37800ecdd 838 * @param[in] key string value to match
whismanoid 9:12e37800ecdd 839 * @param[out] int32Var updated from value string if match "key"=value
whismanoid 9:12e37800ecdd 840 *
whismanoid 9:12e37800ecdd 841 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 9:12e37800ecdd 842 *
whismanoid 9:12e37800ecdd 843 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 9:12e37800ecdd 844 * Default number conversion radix is base-16 hexadecimal.
whismanoid 9:12e37800ecdd 845 */
whismanoid 9:12e37800ecdd 846 bool CmdLine::parse_int32_hex(const char *key, int32_t& int32Var)
whismanoid 9:12e37800ecdd 847 {
whismanoid 9:12e37800ecdd 848 char valueBuf[16];
whismanoid 9:12e37800ecdd 849 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 9:12e37800ecdd 850 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 9:12e37800ecdd 851 {
whismanoid 9:12e37800ecdd 852 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 9:12e37800ecdd 853 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 9:12e37800ecdd 854 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 9:12e37800ecdd 855 if (valueBuf[0] == '$')
whismanoid 9:12e37800ecdd 856 {
whismanoid 9:12e37800ecdd 857 int32Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 9:12e37800ecdd 858 return true;
whismanoid 9:12e37800ecdd 859 }
whismanoid 9:12e37800ecdd 860 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 9:12e37800ecdd 861 {
whismanoid 9:12e37800ecdd 862 int32Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 9:12e37800ecdd 863 return true;
whismanoid 9:12e37800ecdd 864 }
whismanoid 9:12e37800ecdd 865 int32Var = strtoul(valueBuf, NULL, 16); // default radix hex
whismanoid 9:12e37800ecdd 866 return true;
whismanoid 9:12e37800ecdd 867 }
whismanoid 9:12e37800ecdd 868 return false; // no match
whismanoid 9:12e37800ecdd 869 }
whismanoid 9:12e37800ecdd 870
whismanoid 9:12e37800ecdd 871 /** CmdLine::parse_int32_dec matches "key"=value
whismanoid 9:12e37800ecdd 872 *
whismanoid 9:12e37800ecdd 873 * @return true if keyword was found in buffer
whismanoid 9:12e37800ecdd 874 * @param[in] key string value to match
whismanoid 9:12e37800ecdd 875 * @param[out] int32Var updated from value string if match "key"=value
whismanoid 9:12e37800ecdd 876 *
whismanoid 9:12e37800ecdd 877 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 9:12e37800ecdd 878 *
whismanoid 9:12e37800ecdd 879 * Prefix '$' or '0x' or '0X' selects radix base-16 hexadecimal.
whismanoid 9:12e37800ecdd 880 * Default number conversion radix is base-10 decimal.
whismanoid 9:12e37800ecdd 881 */
whismanoid 9:12e37800ecdd 882 bool CmdLine::parse_int32_dec(const char *key, int32_t& int32Var)
whismanoid 9:12e37800ecdd 883 {
whismanoid 9:12e37800ecdd 884 char valueBuf[16];
whismanoid 9:12e37800ecdd 885 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 9:12e37800ecdd 886 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 9:12e37800ecdd 887 {
whismanoid 9:12e37800ecdd 888 // ASSERT: buf[matched_index] contains '=' followed by value
whismanoid 9:12e37800ecdd 889 // parse cmdLine arg (CMD=\d)? --> g_I2C_command_regAddress
whismanoid 9:12e37800ecdd 890 // TODO1: parse_byte_hex take hex prefix 0x 0X or suffix $ h H
whismanoid 9:12e37800ecdd 891 if (valueBuf[0] == '$')
whismanoid 9:12e37800ecdd 892 {
whismanoid 9:12e37800ecdd 893 int32Var = strtoul(valueBuf + 1, NULL, 16);
whismanoid 9:12e37800ecdd 894 return true;
whismanoid 9:12e37800ecdd 895 }
whismanoid 9:12e37800ecdd 896 if (valueBuf[0] == '0' && (valueBuf[1] == 'X' || valueBuf[1] == 'x'))
whismanoid 9:12e37800ecdd 897 {
whismanoid 9:12e37800ecdd 898 int32Var = strtoul(valueBuf + 2, NULL, 16);
whismanoid 9:12e37800ecdd 899 return true;
whismanoid 9:12e37800ecdd 900 }
whismanoid 9:12e37800ecdd 901 int32Var = strtoul(valueBuf, NULL, 10); // default radix decimal
whismanoid 9:12e37800ecdd 902 return true;
whismanoid 9:12e37800ecdd 903 }
whismanoid 9:12e37800ecdd 904 return false; // no match
whismanoid 9:12e37800ecdd 905 }
whismanoid 9:12e37800ecdd 906
whismanoid 7:0bda7cfee767 907 /** CmdLine::parse_double matches "key"=value
whismanoid 7:0bda7cfee767 908 *
whismanoid 7:0bda7cfee767 909 * @return true if keyword was found in buffer
whismanoid 7:0bda7cfee767 910 * @param[in] key string value to match
whismanoid 7:0bda7cfee767 911 * @param[out] doubleVar updated from value string if match "key"=value
whismanoid 7:0bda7cfee767 912 *
whismanoid 7:0bda7cfee767 913 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 7:0bda7cfee767 914 *
whismanoid 7:0bda7cfee767 915 */
whismanoid 7:0bda7cfee767 916 bool CmdLine::parse_double(const char *key, double& doubleVar)
whismanoid 7:0bda7cfee767 917 {
whismanoid 7:0bda7cfee767 918 char valueBuf[16];
whismanoid 7:0bda7cfee767 919 char *end;
whismanoid 7:0bda7cfee767 920 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 7:0bda7cfee767 921 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 7:0bda7cfee767 922 {
whismanoid 7:0bda7cfee767 923 doubleVar = strtof(valueBuf, &end);
whismanoid 7:0bda7cfee767 924 return true;
whismanoid 7:0bda7cfee767 925 }
whismanoid 7:0bda7cfee767 926 return false; // no match
whismanoid 7:0bda7cfee767 927 }
whismanoid 7:0bda7cfee767 928
whismanoid 0:4d7de8b5c800 929 /** CmdLine::parse_float matches "key"=value
whismanoid 0:4d7de8b5c800 930 *
whismanoid 0:4d7de8b5c800 931 * @return true if keyword was found in buffer
whismanoid 0:4d7de8b5c800 932 * @param[in] key string value to match
whismanoid 0:4d7de8b5c800 933 * @param[out] floatVar updated from value string if match "key"=value
whismanoid 0:4d7de8b5c800 934 *
whismanoid 0:4d7de8b5c800 935 * @post on successful match, the key=value substring is deleted from cmdbuf
whismanoid 0:4d7de8b5c800 936 *
whismanoid 0:4d7de8b5c800 937 */
whismanoid 0:4d7de8b5c800 938 bool CmdLine::parse_float(const char *key, float& floatVar)
whismanoid 0:4d7de8b5c800 939 {
whismanoid 0:4d7de8b5c800 940 char valueBuf[16];
whismanoid 0:4d7de8b5c800 941 char *end;
whismanoid 0:4d7de8b5c800 942 // bool parse_and_remove_key(const char *key, char *valueBuf, int valueBufLen);
whismanoid 0:4d7de8b5c800 943 if (parse_and_remove_key(key, valueBuf, sizeof(valueBuf)))
whismanoid 0:4d7de8b5c800 944 {
whismanoid 0:4d7de8b5c800 945 floatVar = strtof(valueBuf, &end);
whismanoid 0:4d7de8b5c800 946 return true;
whismanoid 0:4d7de8b5c800 947 }
whismanoid 0:4d7de8b5c800 948 return false; // no match
whismanoid 0:4d7de8b5c800 949 }
whismanoid 0:4d7de8b5c800 950
whismanoid 0:4d7de8b5c800 951 /** CmdLine::parse_byteCount_byteList_hex matches hexadecimal digits separated by spaces.
whismanoid 0:4d7de8b5c800 952 * The 0x / 0X prefix is optional. The numbers must be hexadecimal.
whismanoid 0:4d7de8b5c800 953 *
whismanoid 0:4d7de8b5c800 954 * @return true if more than one hex byte found in buffer
whismanoid 0:4d7de8b5c800 955 * @param[out] byteCount is populated with the number of hex bytes found
whismanoid 0:4d7de8b5c800 956 * @param[out] mosiDataBuf buffer mosiDataBuf[0..byteCount-1] is populated with the hex bytes found
whismanoid 0:4d7de8b5c800 957 * @param[in] mosiDataBufSize limits the number of bytes that will be used
whismanoid 0:4d7de8b5c800 958 *
whismanoid 0:4d7de8b5c800 959 */
whismanoid 0:4d7de8b5c800 960 bool CmdLine::parse_byteCount_byteList_hex(size_t& byteCount, char *mosiDataBuf, size_t mosiDataBufSize)
whismanoid 0:4d7de8b5c800 961 {
whismanoid 0:4d7de8b5c800 962 //serial().printf("\r\n parse_byteCount_byteList_hex (buf=\"%s\")...", buf);
whismanoid 0:4d7de8b5c800 963 // parse cmdLine hex byte list --> int byteCount; int mosiData[MAX_SPI_BYTE_COUNT];
whismanoid 0:4d7de8b5c800 964 byteCount = 0;
whismanoid 0:4d7de8b5c800 965 bool got_value = false;
whismanoid 0:4d7de8b5c800 966 uint8_t nybbleValue;
whismanoid 0:4d7de8b5c800 967 uint8_t temp_value = 0;
whismanoid 0:4d7de8b5c800 968 for (unsigned int idxSearch = 0; idxSearch < indexOfNextEmptyCell; idxSearch++)
whismanoid 0:4d7de8b5c800 969 {
whismanoid 0:4d7de8b5c800 970 if (buf[idxSearch] == '\0') {
whismanoid 0:4d7de8b5c800 971 break; // end of buffer
whismanoid 0:4d7de8b5c800 972 }
whismanoid 0:4d7de8b5c800 973 switch (buf[idxSearch])
whismanoid 0:4d7de8b5c800 974 {
whismanoid 0:4d7de8b5c800 975 case '0': case '1': case '2': case '3':
whismanoid 0:4d7de8b5c800 976 case '4': case '5': case '6': case '7':
whismanoid 0:4d7de8b5c800 977 case '8': case '9':
whismanoid 0:4d7de8b5c800 978 nybbleValue = buf[idxSearch] - '0';
whismanoid 0:4d7de8b5c800 979 temp_value = temp_value * 0x10;
whismanoid 0:4d7de8b5c800 980 temp_value = temp_value + nybbleValue;
whismanoid 0:4d7de8b5c800 981 got_value = true;
whismanoid 0:4d7de8b5c800 982 break;
whismanoid 0:4d7de8b5c800 983 case 'a': case 'b': case 'c':
whismanoid 0:4d7de8b5c800 984 case 'd': case 'e': case 'f':
whismanoid 0:4d7de8b5c800 985 nybbleValue = buf[idxSearch] - 'a' + 0x0a;
whismanoid 0:4d7de8b5c800 986 temp_value = temp_value * 0x10;
whismanoid 0:4d7de8b5c800 987 temp_value = temp_value + nybbleValue;
whismanoid 0:4d7de8b5c800 988 got_value = true;
whismanoid 0:4d7de8b5c800 989 break;
whismanoid 0:4d7de8b5c800 990 case 'A': case 'B': case 'C':
whismanoid 0:4d7de8b5c800 991 case 'D': case 'E': case 'F':
whismanoid 0:4d7de8b5c800 992 nybbleValue = buf[idxSearch] - 'A' + 0x0a;
whismanoid 0:4d7de8b5c800 993 temp_value = temp_value * 0x10;
whismanoid 0:4d7de8b5c800 994 temp_value = temp_value + nybbleValue;
whismanoid 0:4d7de8b5c800 995 got_value = true;
whismanoid 0:4d7de8b5c800 996 break;
whismanoid 0:4d7de8b5c800 997 case 'x': case 'X':
whismanoid 0:4d7de8b5c800 998 temp_value = 0;
whismanoid 0:4d7de8b5c800 999 break;
whismanoid 0:4d7de8b5c800 1000 case ' ': case ',':
whismanoid 0:4d7de8b5c800 1001 if ((got_value) && (byteCount < mosiDataBufSize))
whismanoid 0:4d7de8b5c800 1002 {
whismanoid 0:4d7de8b5c800 1003 //serial().printf("\r\n parse_byteCount_byteList_hex mosiDataBuf[%d] = 0x%2.2x", byteCount, temp_value);
whismanoid 0:4d7de8b5c800 1004 mosiDataBuf[byteCount++] = temp_value;
whismanoid 0:4d7de8b5c800 1005 temp_value = 0;
whismanoid 0:4d7de8b5c800 1006 got_value = false;
whismanoid 0:4d7de8b5c800 1007 }
whismanoid 0:4d7de8b5c800 1008 break;
whismanoid 0:4d7de8b5c800 1009 }
whismanoid 0:4d7de8b5c800 1010 } // for idxSearch
whismanoid 0:4d7de8b5c800 1011 if ((got_value) && (byteCount < mosiDataBufSize))
whismanoid 0:4d7de8b5c800 1012 {
whismanoid 0:4d7de8b5c800 1013 //serial().printf("\r\n parse_byteCount_byteList_hex mosiDataBuf[%d] = 0x%2.2x", byteCount, temp_value);
whismanoid 0:4d7de8b5c800 1014 mosiDataBuf[byteCount++] = temp_value;
whismanoid 0:4d7de8b5c800 1015 temp_value = 0;
whismanoid 0:4d7de8b5c800 1016 got_value = false;
whismanoid 0:4d7de8b5c800 1017 }
whismanoid 0:4d7de8b5c800 1018 //serial().printf("\r\n parse_byteCount_byteList_hex (buf=\"%s\") returning: byteCount=%d", buf, byteCount);
whismanoid 0:4d7de8b5c800 1019 return (byteCount > 0);
whismanoid 0:4d7de8b5c800 1020 }
whismanoid 0:4d7de8b5c800 1021
whismanoid 0:4d7de8b5c800 1022 /** CmdLine::parse_byteCount_byteList_dec matches a list of numbers, separated by spaces.
whismanoid 0:4d7de8b5c800 1023 * The 0x / 0X prefix may be used to select hexadecimal instead of decimal.
whismanoid 0:4d7de8b5c800 1024 *
whismanoid 0:4d7de8b5c800 1025 * @return true if more than one number found in buffer
whismanoid 0:4d7de8b5c800 1026 * @param[out] byteCount is populated with the number of numbers found
whismanoid 0:4d7de8b5c800 1027 * @param[out] mosiDataBuf buffer mosiDataBuf[0..byteCount-1] is populated with the numbers found
whismanoid 0:4d7de8b5c800 1028 * @param[in] mosiDataBufSize limits the number of bytes that will be used
whismanoid 0:4d7de8b5c800 1029 *
whismanoid 0:4d7de8b5c800 1030 */
whismanoid 0:4d7de8b5c800 1031 bool CmdLine::parse_byteCount_byteList_dec(size_t& byteCount, char *mosiDataBuf, size_t mosiDataBufSize)
whismanoid 0:4d7de8b5c800 1032 {
whismanoid 0:4d7de8b5c800 1033 //serial().printf("\r\n parse_byteCount_byteList_dec (buf=\"%s\")...", buf);
whismanoid 0:4d7de8b5c800 1034 // parse cmdLine hex byte list --> int byteCount; int mosiData[MAX_SPI_BYTE_COUNT];
whismanoid 0:4d7de8b5c800 1035 byteCount = 0;
whismanoid 0:4d7de8b5c800 1036 bool got_value = false;
whismanoid 0:4d7de8b5c800 1037 uint8_t nybbleValue;
whismanoid 0:4d7de8b5c800 1038 uint8_t temp_value = 0;
whismanoid 0:4d7de8b5c800 1039 uint8_t radix = 10;
whismanoid 0:4d7de8b5c800 1040 for (unsigned int idxSearch = 0; idxSearch < indexOfNextEmptyCell; idxSearch++)
whismanoid 0:4d7de8b5c800 1041 {
whismanoid 0:4d7de8b5c800 1042 if (buf[idxSearch] == '\0') {
whismanoid 0:4d7de8b5c800 1043 break; // end of buffer
whismanoid 0:4d7de8b5c800 1044 }
whismanoid 0:4d7de8b5c800 1045 switch (buf[idxSearch])
whismanoid 0:4d7de8b5c800 1046 {
whismanoid 0:4d7de8b5c800 1047 case '0': case '1': case '2': case '3':
whismanoid 0:4d7de8b5c800 1048 case '4': case '5': case '6': case '7':
whismanoid 0:4d7de8b5c800 1049 case '8': case '9':
whismanoid 0:4d7de8b5c800 1050 nybbleValue = buf[idxSearch] - '0';
whismanoid 0:4d7de8b5c800 1051 temp_value = temp_value * radix;
whismanoid 0:4d7de8b5c800 1052 temp_value = temp_value + nybbleValue;
whismanoid 0:4d7de8b5c800 1053 got_value = true;
whismanoid 0:4d7de8b5c800 1054 break;
whismanoid 0:4d7de8b5c800 1055 case 'a': case 'b': case 'c':
whismanoid 0:4d7de8b5c800 1056 case 'd': case 'e': case 'f':
whismanoid 0:4d7de8b5c800 1057 nybbleValue = buf[idxSearch] - 'a' + 0x0a;
whismanoid 0:4d7de8b5c800 1058 radix = 0x10;
whismanoid 0:4d7de8b5c800 1059 temp_value = temp_value * radix;
whismanoid 0:4d7de8b5c800 1060 temp_value = temp_value + nybbleValue;
whismanoid 0:4d7de8b5c800 1061 got_value = true;
whismanoid 0:4d7de8b5c800 1062 break;
whismanoid 0:4d7de8b5c800 1063 case 'A': case 'B': case 'C':
whismanoid 0:4d7de8b5c800 1064 case 'D': case 'E': case 'F':
whismanoid 0:4d7de8b5c800 1065 nybbleValue = buf[idxSearch] - 'A' + 0x0a;
whismanoid 0:4d7de8b5c800 1066 radix = 0x10;
whismanoid 0:4d7de8b5c800 1067 temp_value = temp_value * radix;
whismanoid 0:4d7de8b5c800 1068 temp_value = temp_value + nybbleValue;
whismanoid 0:4d7de8b5c800 1069 got_value = true;
whismanoid 0:4d7de8b5c800 1070 break;
whismanoid 0:4d7de8b5c800 1071 case 'x': case 'X':
whismanoid 0:4d7de8b5c800 1072 temp_value = 0;
whismanoid 0:4d7de8b5c800 1073 radix = 0x10;
whismanoid 0:4d7de8b5c800 1074 break;
whismanoid 0:4d7de8b5c800 1075 case ' ': case ',':
whismanoid 0:4d7de8b5c800 1076 if ((got_value) && (byteCount < mosiDataBufSize))
whismanoid 0:4d7de8b5c800 1077 {
whismanoid 0:4d7de8b5c800 1078 //serial().printf("\r\n parse_byteCount_byteList_dec mosiDataBuf[%d] = 0x%2.2x", byteCount, temp_value);
whismanoid 0:4d7de8b5c800 1079 mosiDataBuf[byteCount++] = temp_value;
whismanoid 0:4d7de8b5c800 1080 temp_value = 0;
whismanoid 0:4d7de8b5c800 1081 radix = 10;
whismanoid 0:4d7de8b5c800 1082 got_value = false;
whismanoid 0:4d7de8b5c800 1083 }
whismanoid 0:4d7de8b5c800 1084 break;
whismanoid 0:4d7de8b5c800 1085 }
whismanoid 0:4d7de8b5c800 1086 } // for idxSearch
whismanoid 0:4d7de8b5c800 1087 if ((got_value) && (byteCount < mosiDataBufSize))
whismanoid 0:4d7de8b5c800 1088 {
whismanoid 0:4d7de8b5c800 1089 //serial().printf("\r\n parse_byteCount_byteList_dec mosiDataBuf[%d] = 0x%2.2x", byteCount, temp_value);
whismanoid 0:4d7de8b5c800 1090 mosiDataBuf[byteCount++] = temp_value;
whismanoid 0:4d7de8b5c800 1091 temp_value = 0;
whismanoid 0:4d7de8b5c800 1092 got_value = false;
whismanoid 0:4d7de8b5c800 1093 }
whismanoid 0:4d7de8b5c800 1094 //serial().printf("\r\n parse_byteCount_byteList_dec (buf=\"%s\") returning: byteCount=%d", buf, byteCount);
whismanoid 0:4d7de8b5c800 1095 return (byteCount > 0);
whismanoid 0:4d7de8b5c800 1096 }
whismanoid 0:4d7de8b5c800 1097
whismanoid 0:4d7de8b5c800 1098
whismanoid 0:4d7de8b5c800 1099 // End of file