editable serial input line buffer

Dependents:   MAX5715BOB_Tester MAX11131BOB_Tester MAX5171BOB_Tester MAX11410BOB_Tester ... more

Committer:
whismanoid
Date:
Thu Dec 19 01:28:54 2019 +0000
Revision:
12:447a747099e6
Parent:
11:e8a4162d4fd1
Child:
13:abedfe18f924
toupper requires ctype.h

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