Auxiliaries I use for CreaBot
Bot_Auxiliaries.cpp
- Committer:
- sepp_nepp
- Date:
- 2018-10-31
- Revision:
- 0:32b17da1ddae
File content as of revision 0:32b17da1ddae:
// ***************************************************************** // Handle all the LEDs with some general function wrappers functions // ***************************************************************** #include "Bot_Auxiliaries.h" // Added a lookup function from a color number to a color, used by Creabot int LED_CAR::ColNr2Color( char ColNr) { switch (ColNr) { case 0: return BLACK; case 1: return WHITE; case 2: return RED; case 3: return GREEN; case 4: return BLUE; case 5: return PURPLE; default: return BLACK; } } void LED_CAR::LEDsOff( void ) { StopRotation(); StopBlink() ; for (int lNr=0; lNr<NumLEDs; lNr++) { SetColor(BLACK,lNr); } } void LED_CAR::LEDsRainbow( void ) { for (int Nr=0; Nr<NumLEDs; Nr++) { SetColor(ColNr2Color(Nr + 1),Nr); } } void LED_CAR::LEDNrCol(LED_Nr aNr, int parameter) { SetColor( ColNr2Color( aNr ), aNr); } void LED_CAR::LEDsRainbowMove( double speed ) { LEDsRainbow( ); StartRotation(0.3); } void LED_CAR::LEDClignote(LED_Nr aNr, int OnOff) { if (OnOff == 1) { SetColor( ORANGE, aNr); StartBlink(0.5) ;} else { LEDsOff(); } } // ***************************************************************** // Handle all the LEDs specifically with the LED Position definitions // ***************************************************************** void LED_CAR::LEDFront(int ColNr) { SetColor( ColNr2Color( ColNr ), ledAvD); SetColor( ColNr2Color( ColNr ), ledAvG); } void LED_CAR::LEDRear(int ColNr) { SetColor( ColNr2Color( ColNr ), ledArD); SetColor( ColNr2Color( ColNr ), ledArG); } void LED_CAR::LEDCligR(int speed) { if ( (speed>0) && (speed<4) ) { SetColor(ORANGE, ledAvD) ; SetColor(ORANGE, ledArD) ; StartBlink(float(speed)/4) ;} else { LEDsOff(); } } void LED_CAR::LEDCligL(int speed) { if ( (speed>0) && (speed<4) ) { SetColor(ORANGE, ledAvG) ; SetColor(ORANGE, ledArG) ; StartBlink(float(speed)/4) ;} else { LEDsOff(); } } void LED_CAR::LEDAnim(int speed) { if ( (speed>0) && (speed<4) ) { LEDsRainbowMove(float(speed)/4); } else { LEDsOff(); } } //************************************ // Interpreter Class Creation //************************************ // Strategy: the interpreter accumulates characters in its input buffer // it flags the presence of complete lines // it also flags Overflow of the buffer in which case all subsequent characters // are lost until the queue is emptied, and a CR-LF is received // Defined States of the interpreter: // MyState = isStartNew, isLineFilling, isOverflow, isWaitNewLine}; Interpreter::Interpreter() { Reinit( ); MyState = isStartNew; } void Interpreter::Reinit( void ) { MyState = isWaitNewLine; // indicates no buffer overflow WriteIndex = 0; // points to next index to write to LinesComplete = 0; // indicates that no complete line is currently available // Start Scanning at the start ScanIndex = 0; BufAvail = BuffLen;// the full buffer size is available } // Barebone function, assumes that checks havee been performed by writeBuf! void Interpreter::AddChar( char aChar ) { if (WriteIndex == BuffLen) {WriteIndex=0;} else {WriteIndex++;} RingBuf[WriteIndex]=aChar; // all right, buffer it! BufAvail--; // Buffer is shrinking if (BufAvail==0) { MyState = isOverflow; } } // High level method to add a Char to the buffer, // Separates at Chars 10, 13, 0; replaced by a single 0 char // Blocking write when buffer has overflowed void Interpreter::writeBuf(char aChar) { bool LineEnds = aChar==10 || aChar==13 || aChar==0; switch (MyState) { case isOverflow: break; case isStartNew: // avoid that consecutive CR LF are counted as multiple lines if (!LineEnds) {AddChar(aChar ); MyState = isLineFilling; } break; case isLineFilling: if (!LineEnds) {AddChar(aChar);} else {MyState = isStartNew; // ready for the next line // Between consecutive commands, the endstring=NULL character is inserted // this is to indicate that line was already counted as completed AddChar(0 ); // append a line end char, will detect bufferFull! LinesComplete++; } // count completed lines break; case isWaitNewLine: // waiting for a new line end to arrive after an overflow if (LineEnds) { MyState = isStartNew; } break; default: MyState = isOverflow; // goes into error state, should never happen though } } // writeBuf // Barebone function, that performs the checks to be performed! // Passes back the actC, and reads already the nextChar into actC char Interpreter::GetAChar( void ) { char oldC = actC; if (BufAvail==BuffLen) { actC = 0; } // buffer is empty else // something is in the buffer { if (ScanIndex == BuffLen) {ScanIndex=0;} else {ScanIndex++;} actC=RingBuf[ScanIndex]; // all right, get it BufAvail++; // Buffer is increasing } // something is in the buffer return oldC; } // skip true blank, but also Tab characters void Interpreter::SkipBlanks( void ) { while(BufAvail<BuffLen && (actC==' ' || actC==9|| actC==0)) { GetAChar(); } } // SkipBlanks int Interpreter::ReadAnInt( void ) { bool Negative = false; int Result = 0; if (actC=='-') {Negative = true; GetAChar(); } else if (actC=='+') {Negative = false; GetAChar(); } while(BufAvail<BuffLen && actC>='0' && actC<='9') { Result = Result * 10 + (GetAChar()-'0') ; } return Negative? -Result : Result; } // ReadAnInt RD_CMD_TYPE Interpreter::ParseCommand( void ) { RD_CMD_TYPE cmd; // locally built command actC=RingBuf[ScanIndex]; SkipBlanks(); // Next Character is the command cmd.Command = GetAChar(); // Next Blanks are to be omitted, but are not even mandatory SkipBlanks(); if ((actC>='0' && actC<='9') || actC=='-' || actC=='+' ) { cmd.Parameter= ReadAnInt(); cmd.NumParam = 1; } else { cmd.Parameter= 0; cmd.NumParam = 0; } SkipBlanks( ); // There should be at least a trailing NUL character to be removed LinesComplete--; // one line less in the storage return cmd; // return the built command }