Henk Meewis / Mbed 2 deprecated USB_serial_LED_controller

Dependencies:   mbed

Fork of frdm_echo by Henk Meewis

Committer:
silverpanda
Date:
Wed Apr 16 03:41:12 2014 +0000
Revision:
11:4c6c6d6c0ebe
Parent:
10:85a8da3b7e5e
Child:
12:b846b64e3980
shell turns LEDs on and off

Who changed what in which revision?

UserRevisionLine numberNew contents of line
silverpanda 5:03b7c237c4c4 1 #include "mbed.h"
silverpanda 7:19da09fe546b 2 #include "LEDColors.h"
silverpanda 5:03b7c237c4c4 3 #include "shell.h"
silverpanda 5:03b7c237c4c4 4
silverpanda 7:19da09fe546b 5 extern LEDColors *ledColors;
silverpanda 7:19da09fe546b 6
silverpanda 5:03b7c237c4c4 7 // create contructor
silverpanda 5:03b7c237c4c4 8 Shell::Shell(uint32_t thisBaudRate)
silverpanda 5:03b7c237c4c4 9 {
silverpanda 5:03b7c237c4c4 10 usbSerial = new Serial(USBTX, USBRX);
silverpanda 5:03b7c237c4c4 11 usbSerial->baud(115200);
silverpanda 8:b715912d684b 12 characterCount = 0;
silverpanda 8:b715912d684b 13 characterPointer = 0;
silverpanda 5:03b7c237c4c4 14 }
silverpanda 5:03b7c237c4c4 15 //-----------------------------------------------------------------------------
silverpanda 5:03b7c237c4c4 16
silverpanda 5:03b7c237c4c4 17 void Shell::sendText(char *thisText)
silverpanda 5:03b7c237c4c4 18 {
silverpanda 5:03b7c237c4c4 19 // this can send any text
silverpanda 5:03b7c237c4c4 20 usbSerial->printf(thisText);
silverpanda 5:03b7c237c4c4 21 }
silverpanda 5:03b7c237c4c4 22 //-----------------------------------------------------------------------------
silverpanda 5:03b7c237c4c4 23
silverpanda 5:03b7c237c4c4 24 void Shell::sendHelloWorld()
silverpanda 5:03b7c237c4c4 25 {
silverpanda 5:03b7c237c4c4 26 // sends the first greeting
silverpanda 10:85a8da3b7e5e 27 sendText(" ** K64 shell **\n>\n> ");
silverpanda 5:03b7c237c4c4 28 }
silverpanda 5:03b7c237c4c4 29 //-----------------------------------------------------------------------------
silverpanda 5:03b7c237c4c4 30
silverpanda 5:03b7c237c4c4 31 void Shell::scanUSBSerialRx()
silverpanda 5:03b7c237c4c4 32 {
silverpanda 5:03b7c237c4c4 33 // check if there is something to read
silverpanda 5:03b7c237c4c4 34 if(usbSerial->readable()) {
silverpanda 9:f9efd3a69c2d 35
silverpanda 5:03b7c237c4c4 36 // if so ...
silverpanda 5:03b7c237c4c4 37 char character = usbSerial->getc();
silverpanda 9:f9efd3a69c2d 38
silverpanda 5:03b7c237c4c4 39 // see if this is a semi colon or a carriage return
silverpanda 5:03b7c237c4c4 40 // if so, give a new line cursor
silverpanda 7:19da09fe546b 41 if((character == ';') || (character == 13)) {
silverpanda 9:f9efd3a69c2d 42 finishCharacterBuffer();
silverpanda 9:f9efd3a69c2d 43 parseCommands();
silverpanda 7:19da09fe546b 44 usbSerial->printf("\n> ");
silverpanda 11:4c6c6d6c0ebe 45 // ledColors->flashWhite(10);
silverpanda 11:4c6c6d6c0ebe 46 ledColors->flash(lcBlue, 10);
silverpanda 7:19da09fe546b 47 }
silverpanda 9:f9efd3a69c2d 48
silverpanda 5:03b7c237c4c4 49 // if not, just print the character
silverpanda 9:f9efd3a69c2d 50 else if(addCharacterToBuffer(character)) {
silverpanda 9:f9efd3a69c2d 51 usbSerial->printf("%c", character);
silverpanda 11:4c6c6d6c0ebe 52 ledColors->flash(lcGreen, 10);
silverpanda 7:19da09fe546b 53 }
silverpanda 5:03b7c237c4c4 54 }
silverpanda 5:03b7c237c4c4 55 }
silverpanda 5:03b7c237c4c4 56 //-----------------------------------------------------------------------------
silverpanda 9:f9efd3a69c2d 57
silverpanda 9:f9efd3a69c2d 58 bool Shell::addCharacterToBuffer(char newCharacter)
silverpanda 8:b715912d684b 59 {
silverpanda 9:f9efd3a69c2d 60 bool accept = (characterPointer < ItsInputBufferSize_);
silverpanda 9:f9efd3a69c2d 61 if(accept) {
silverpanda 8:b715912d684b 62 inputBuffer[characterPointer++] = newCharacter;
silverpanda 8:b715912d684b 63 characterCount = characterPointer;
silverpanda 8:b715912d684b 64 }
silverpanda 9:f9efd3a69c2d 65 return accept;
silverpanda 8:b715912d684b 66 }
silverpanda 8:b715912d684b 67 //-----------------------------------------------------------------------------
silverpanda 8:b715912d684b 68
silverpanda 8:b715912d684b 69 void Shell::finishCharacterBuffer()
silverpanda 8:b715912d684b 70 {
silverpanda 10:85a8da3b7e5e 71 inputBuffer[characterCount] = 0;
silverpanda 10:85a8da3b7e5e 72 characterCount = characterPointer;
silverpanda 8:b715912d684b 73 characterPointer = 0;
silverpanda 8:b715912d684b 74 }
silverpanda 9:f9efd3a69c2d 75 //-----------------------------------------------------------------------------
silverpanda 9:f9efd3a69c2d 76
silverpanda 11:4c6c6d6c0ebe 77 char Shell::lowercase(char thisChar)
silverpanda 11:4c6c6d6c0ebe 78 {
silverpanda 11:4c6c6d6c0ebe 79 // check if this character is uppercase
silverpanda 11:4c6c6d6c0ebe 80 if((thisChar >= 'A') && (thisChar <= 'Z')) thisChar += 32;
silverpanda 11:4c6c6d6c0ebe 81
silverpanda 11:4c6c6d6c0ebe 82 return thisChar;
silverpanda 11:4c6c6d6c0ebe 83 }
silverpanda 11:4c6c6d6c0ebe 84 //-----------------------------------------------------------------------------
silverpanda 11:4c6c6d6c0ebe 85
silverpanda 11:4c6c6d6c0ebe 86 bool Shell::findString(char *thisString)
silverpanda 9:f9efd3a69c2d 87 {
silverpanda 9:f9efd3a69c2d 88 bool found = false;
silverpanda 11:4c6c6d6c0ebe 89 uint32_t startPointer = 0, characterPointer, newStartLocation, stringLength = 0;
silverpanda 9:f9efd3a69c2d 90 char firstChar, secondChar;
silverpanda 11:4c6c6d6c0ebe 91
silverpanda 11:4c6c6d6c0ebe 92 // determine the length of thisString
silverpanda 11:4c6c6d6c0ebe 93 while(thisString[stringLength]) stringLength++;
silverpanda 11:4c6c6d6c0ebe 94
silverpanda 10:85a8da3b7e5e 95 // start at the start position (0) on the input buffer
silverpanda 11:4c6c6d6c0ebe 96 while(!found
silverpanda 11:4c6c6d6c0ebe 97 && (characterCount >= stringLength)
silverpanda 11:4c6c6d6c0ebe 98 && (startPointer <= characterCount - stringLength)) {
silverpanda 11:4c6c6d6c0ebe 99
silverpanda 10:85a8da3b7e5e 100 // start at the beginning of the compare string (thisString)
silverpanda 9:f9efd3a69c2d 101 found = true;
silverpanda 9:f9efd3a69c2d 102 characterPointer = 0;
silverpanda 9:f9efd3a69c2d 103 while(found && (characterPointer < stringLength)) {
silverpanda 11:4c6c6d6c0ebe 104
silverpanda 10:85a8da3b7e5e 105 // get and compare characters
silverpanda 9:f9efd3a69c2d 106 firstChar = inputBuffer[startPointer + characterPointer];
silverpanda 9:f9efd3a69c2d 107 secondChar = thisString[characterPointer];
silverpanda 11:4c6c6d6c0ebe 108 found = (lowercase(firstChar) == lowercase(secondChar));
silverpanda 11:4c6c6d6c0ebe 109
silverpanda 10:85a8da3b7e5e 110 // for debugging
silverpanda 9:f9efd3a69c2d 111 // usbSerial->printf("(compare %c with %c)\n", firstChar, secondChar);
silverpanda 11:4c6c6d6c0ebe 112
silverpanda 10:85a8da3b7e5e 113 // move up to next characters
silverpanda 9:f9efd3a69c2d 114 characterPointer++;
silverpanda 9:f9efd3a69c2d 115 }
silverpanda 11:4c6c6d6c0ebe 116
silverpanda 10:85a8da3b7e5e 117 // move start position
silverpanda 10:85a8da3b7e5e 118 if(found) {
silverpanda 10:85a8da3b7e5e 119 newStartLocation = startPointer + stringLength;
silverpanda 11:4c6c6d6c0ebe 120
silverpanda 10:85a8da3b7e5e 121 // clean up from buffer
silverpanda 10:85a8da3b7e5e 122 characterPointer = newStartLocation;
silverpanda 10:85a8da3b7e5e 123 while(characterPointer < characterCount) {
silverpanda 10:85a8da3b7e5e 124 firstChar = inputBuffer[characterPointer];
silverpanda 10:85a8da3b7e5e 125 inputBuffer[characterPointer - newStartLocation] = firstChar;
silverpanda 10:85a8da3b7e5e 126 characterPointer++;
silverpanda 10:85a8da3b7e5e 127 }
silverpanda 10:85a8da3b7e5e 128 characterCount -= newStartLocation;
silverpanda 10:85a8da3b7e5e 129 inputBuffer[characterCount] = 0;
silverpanda 11:4c6c6d6c0ebe 130
silverpanda 10:85a8da3b7e5e 131 // for debugging send buffer
silverpanda 10:85a8da3b7e5e 132 /*
silverpanda 10:85a8da3b7e5e 133 if(characterCount) {
silverpanda 10:85a8da3b7e5e 134 sendText(" is now \"");
silverpanda 10:85a8da3b7e5e 135 sendText(inputBuffer);
silverpanda 10:85a8da3b7e5e 136 sendText("\"");
silverpanda 10:85a8da3b7e5e 137 }
silverpanda 10:85a8da3b7e5e 138 */
silverpanda 10:85a8da3b7e5e 139 }
silverpanda 11:4c6c6d6c0ebe 140
silverpanda 9:f9efd3a69c2d 141 startPointer++;
silverpanda 9:f9efd3a69c2d 142 }
silverpanda 11:4c6c6d6c0ebe 143
silverpanda 10:85a8da3b7e5e 144 // report
silverpanda 9:f9efd3a69c2d 145 return found;
silverpanda 9:f9efd3a69c2d 146 }
silverpanda 9:f9efd3a69c2d 147 //-----------------------------------------------------------------------------
silverpanda 9:f9efd3a69c2d 148
silverpanda 9:f9efd3a69c2d 149 void Shell::parseCommands()
silverpanda 9:f9efd3a69c2d 150 {
silverpanda 11:4c6c6d6c0ebe 151 if(findString("set")) sendText(" -- \"set\" found!");
silverpanda 11:4c6c6d6c0ebe 152 if(findString("Clark")) sendText(" -- \"Clark\" found!");
silverpanda 11:4c6c6d6c0ebe 153 if(findString("Stefan")) sendText(" -- Hi \"Stefan\"!");
silverpanda 11:4c6c6d6c0ebe 154 if(findString("Ralph")) sendText(" -- Hey, that's me!");
silverpanda 11:4c6c6d6c0ebe 155
silverpanda 11:4c6c6d6c0ebe 156 if(findString("turn")) parseLED();
silverpanda 9:f9efd3a69c2d 157 }
silverpanda 9:f9efd3a69c2d 158 //-----------------------------------------------------------------------------
silverpanda 11:4c6c6d6c0ebe 159
silverpanda 11:4c6c6d6c0ebe 160 void Shell::parseLED()
silverpanda 11:4c6c6d6c0ebe 161 {
silverpanda 11:4c6c6d6c0ebe 162 // example text: turn blue LED on
silverpanda 11:4c6c6d6c0ebe 163
silverpanda 11:4c6c6d6c0ebe 164 eLEDColor ledColor = lcNone;
silverpanda 11:4c6c6d6c0ebe 165 if(findString("red")) ledColor = lcRed;
silverpanda 11:4c6c6d6c0ebe 166 if(findString("blue")) ledColor = lcBlue;
silverpanda 11:4c6c6d6c0ebe 167 if(findString("green")) ledColor = lcGreen;
silverpanda 11:4c6c6d6c0ebe 168
silverpanda 11:4c6c6d6c0ebe 169 if(ledColor == lcNone) {
silverpanda 11:4c6c6d6c0ebe 170 sendText(" -- missing LED color: red, blue or green");
silverpanda 11:4c6c6d6c0ebe 171 sendExample();
silverpanda 11:4c6c6d6c0ebe 172 }
silverpanda 11:4c6c6d6c0ebe 173 else {
silverpanda 11:4c6c6d6c0ebe 174 if(findString("LED")) {
silverpanda 11:4c6c6d6c0ebe 175
silverpanda 11:4c6c6d6c0ebe 176 eState state = stNone;
silverpanda 11:4c6c6d6c0ebe 177 if(findString("on")) state = stOn;
silverpanda 11:4c6c6d6c0ebe 178 if(findString("off")) state = stOff;
silverpanda 11:4c6c6d6c0ebe 179
silverpanda 11:4c6c6d6c0ebe 180 if(state == stNone) {
silverpanda 11:4c6c6d6c0ebe 181 sendText(" -- missing state: on or off");
silverpanda 11:4c6c6d6c0ebe 182 sendExample();
silverpanda 11:4c6c6d6c0ebe 183 }
silverpanda 11:4c6c6d6c0ebe 184 else {
silverpanda 11:4c6c6d6c0ebe 185 sendText(" -- done!");
silverpanda 11:4c6c6d6c0ebe 186 ledColors->turn(ledColor, state);
silverpanda 11:4c6c6d6c0ebe 187 }
silverpanda 11:4c6c6d6c0ebe 188 }
silverpanda 11:4c6c6d6c0ebe 189 else {
silverpanda 11:4c6c6d6c0ebe 190 sendText(" -- specify LED");
silverpanda 11:4c6c6d6c0ebe 191 sendExample();
silverpanda 11:4c6c6d6c0ebe 192 }
silverpanda 11:4c6c6d6c0ebe 193 }
silverpanda 11:4c6c6d6c0ebe 194 }
silverpanda 11:4c6c6d6c0ebe 195 //-----------------------------------------------------------------------------
silverpanda 11:4c6c6d6c0ebe 196
silverpanda 11:4c6c6d6c0ebe 197 void Shell::sendExample()
silverpanda 11:4c6c6d6c0ebe 198 {
silverpanda 11:4c6c6d6c0ebe 199 sendText(" -> example: turn red LED on");
silverpanda 11:4c6c6d6c0ebe 200 }
silverpanda 11:4c6c6d6c0ebe 201 //-----------------------------------------------------------------------------