Simon Dziadon / Mbed 2 deprecated mbed_cz2_5_test

Dependencies:   LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers command_decoder.cpp Source File

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 }