Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI
command_decoder.cpp
00001 #include "command_decoder.h" 00002 #include <string.h> 00003 #include <stdlib.h> 00004 00005 #define TERMINATOR 0x20 00006 00007 enum Result { rOK, rERROR }; 00008 00009 struct Keyword asKeywordList[MAX_KEYWORD_NR] = { 00010 {ID, "id"}, 00011 {CALIB,"calib"}, 00012 {GOTO, "goto" }, 00013 {STEP, "step" } 00014 }; 00015 00016 unsigned char Token::ucFindTokensInString (char *pcString){ 00017 00018 unsigned char ucCharacterCounter = 0, ucCurrentCharacter; 00019 enum CharacterType eCharacterType = DELIMITER; 00020 unsigned char ucTokenCounter = 0; 00021 00022 for(ucCharacterCounter = 0; ;ucCharacterCounter++){ 00023 00024 ucCurrentCharacter = pcString[ucCharacterCounter]; 00025 00026 switch(eCharacterType){ 00027 00028 case TOKEN: 00029 if(ucCurrentCharacter == NULL){ 00030 return ucTokenCounter; 00031 } 00032 else if(ucTokenCounter == MAX_TOKEN_NR){ 00033 return ucTokenCounter; 00034 } 00035 else if(ucCurrentCharacter == ' '){ 00036 eCharacterType = DELIMITER; 00037 } 00038 break; 00039 00040 case DELIMITER: 00041 if(ucCurrentCharacter == NULL){ 00042 return ucTokenCounter; 00043 } 00044 else if(ucCurrentCharacter == ' '){ 00045 eCharacterType = DELIMITER; 00046 } 00047 else{ 00048 asToken[ucTokenCounter].uValue.pcString = (pcString + ucCharacterCounter); 00049 ucTokenCounter++; 00050 eCharacterType = TOKEN; 00051 } 00052 break; 00053 } 00054 } 00055 } 00056 00057 enum Result Token::eSringToKeyword (char pcStr[],enum KeywordCode *peKeywordCode){ 00058 00059 unsigned char ucKeywordCounter; 00060 00061 for(ucKeywordCounter = 0; ucKeywordCounter < MAX_KEYWORD_NR; ucKeywordCounter++){ 00062 00063 if(0 == strcmp(asKeywordList[ucKeywordCounter].cString, pcStr)){ 00064 *peKeywordCode= asKeywordList[ucKeywordCounter].eCode; 00065 return rOK; 00066 } 00067 } 00068 return rERROR; 00069 } 00070 00071 enum Result Token::eHexStringToUInt(char pcStr[],unsigned int *puiValue){ 00072 00073 if((pcStr[0] != '0') || (pcStr[1] != 'x') || (pcStr[2] == NULL)) { 00074 return rERROR; 00075 } 00076 00077 pcStr[0] = pcStr[3]; 00078 pcStr[1] = pcStr[4]; 00079 pcStr[2] = NULL; 00080 00081 *puiValue = atoi(pcStr); 00082 00083 return rOK; 00084 } 00085 00086 void Token::ReplaceCharactersInString(char pcString[],char cOldChar,char cNewChar){ 00087 00088 unsigned char ucCharacterCounter; 00089 00090 for( ucCharacterCounter = 0; pcString[ucCharacterCounter] != NULL; ucCharacterCounter++ ) { 00091 if( pcString[ucCharacterCounter] == cOldChar) pcString[ucCharacterCounter] = cNewChar; 00092 } 00093 } 00094 00095 void Token::DecodeTokens(void){ 00096 00097 unsigned char ucTokenCounter; 00098 struct tToken * pToken; 00099 00100 for(ucTokenCounter = 0; ucTokenCounter < ucTokenNr; ucTokenCounter++){ 00101 pToken = &asToken[ucTokenCounter]; 00102 00103 if(rOK == eSringToKeyword(pToken->uValue.pcString, &pToken->uValue.eKeyword)){ 00104 pToken->eType = KEYWORD; 00105 } 00106 else if(rOK == eHexStringToUInt(pToken->uValue.pcString, &pToken->uValue.uiNumber)){ 00107 pToken->eType = NUMBER; 00108 } 00109 else{ 00110 pToken->eType = STRING; 00111 } 00112 } 00113 } 00114 00115 void Token::DecodeMsg(char *pcString){ 00116 00117 ucTokenNr = ucFindTokensInString(pcString); 00118 ReplaceCharactersInString(pcString, ' ', NULL); 00119 DecodeTokens(); 00120 }
Generated on Mon Aug 1 2022 00:15:39 by
1.7.2