Robert Labuz
/
mbed5b
mbed5b
command_decoder.cpp@0:d546b014a1e3, 2017-05-05 (annotated)
- Committer:
- Robsonik16
- Date:
- Fri May 05 20:00:16 2017 +0000
- Revision:
- 0:d546b014a1e3
a
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Robsonik16 | 0:d546b014a1e3 | 1 | #include "string.h" |
Robsonik16 | 0:d546b014a1e3 | 2 | #include "command_decoder.h" |
Robsonik16 | 0:d546b014a1e3 | 3 | |
Robsonik16 | 0:d546b014a1e3 | 4 | struct Keyword asKeywordList[MAX_KEYWORD_NR]= |
Robsonik16 | 0:d546b014a1e3 | 5 | { |
Robsonik16 | 0:d546b014a1e3 | 6 | {CALLIB, "callib"}, |
Robsonik16 | 0:d546b014a1e3 | 7 | {GOTO, "goto"}, |
Robsonik16 | 0:d546b014a1e3 | 8 | {STEP, "step"}, |
Robsonik16 | 0:d546b014a1e3 | 9 | {ID, "id"} |
Robsonik16 | 0:d546b014a1e3 | 10 | }; |
Robsonik16 | 0:d546b014a1e3 | 11 | struct Token asToken[MAX_TOKEN_NR]; |
Robsonik16 | 0:d546b014a1e3 | 12 | |
Robsonik16 | 0:d546b014a1e3 | 13 | unsigned char ucTokenNr; |
Robsonik16 | 0:d546b014a1e3 | 14 | |
Robsonik16 | 0:d546b014a1e3 | 15 | unsigned char ucFindTokensInString(char *pcString){ |
Robsonik16 | 0:d546b014a1e3 | 16 | |
Robsonik16 | 0:d546b014a1e3 | 17 | enum LedState { TOKEN, DELIMITER}; |
Robsonik16 | 0:d546b014a1e3 | 18 | enum LedState eState = DELIMITER; |
Robsonik16 | 0:d546b014a1e3 | 19 | |
Robsonik16 | 0:d546b014a1e3 | 20 | unsigned char ucLicznikTokenu = 0; |
Robsonik16 | 0:d546b014a1e3 | 21 | unsigned char ucLicznikZnaku = 0; |
Robsonik16 | 0:d546b014a1e3 | 22 | char cAktualnyZnak; |
Robsonik16 | 0:d546b014a1e3 | 23 | |
Robsonik16 | 0:d546b014a1e3 | 24 | for(ucLicznikZnaku=0; pcString[ucLicznikZnaku] != NULL; ucLicznikZnaku++){ |
Robsonik16 | 0:d546b014a1e3 | 25 | cAktualnyZnak = pcString[ucLicznikZnaku]; |
Robsonik16 | 0:d546b014a1e3 | 26 | switch(eState){ |
Robsonik16 | 0:d546b014a1e3 | 27 | case DELIMITER: |
Robsonik16 | 0:d546b014a1e3 | 28 | if(cAktualnyZnak == DELIMITER_CHAR){ |
Robsonik16 | 0:d546b014a1e3 | 29 | eState = DELIMITER; |
Robsonik16 | 0:d546b014a1e3 | 30 | }else if(ucLicznikTokenu < MAX_TOKEN_NR){ |
Robsonik16 | 0:d546b014a1e3 | 31 | eState = TOKEN; |
Robsonik16 | 0:d546b014a1e3 | 32 | asToken[ucLicznikTokenu].uValue.pcString = pcString + ucLicznikZnaku; |
Robsonik16 | 0:d546b014a1e3 | 33 | ucLicznikTokenu++; |
Robsonik16 | 0:d546b014a1e3 | 34 | }else{ |
Robsonik16 | 0:d546b014a1e3 | 35 | return(ucLicznikTokenu); |
Robsonik16 | 0:d546b014a1e3 | 36 | } |
Robsonik16 | 0:d546b014a1e3 | 37 | break; |
Robsonik16 | 0:d546b014a1e3 | 38 | case TOKEN: |
Robsonik16 | 0:d546b014a1e3 | 39 | if(cAktualnyZnak!= DELIMITER_CHAR){ |
Robsonik16 | 0:d546b014a1e3 | 40 | eState = TOKEN; |
Robsonik16 | 0:d546b014a1e3 | 41 | }else{ |
Robsonik16 | 0:d546b014a1e3 | 42 | eState = DELIMITER; |
Robsonik16 | 0:d546b014a1e3 | 43 | } |
Robsonik16 | 0:d546b014a1e3 | 44 | break; |
Robsonik16 | 0:d546b014a1e3 | 45 | } |
Robsonik16 | 0:d546b014a1e3 | 46 | } |
Robsonik16 | 0:d546b014a1e3 | 47 | return(ucLicznikTokenu); |
Robsonik16 | 0:d546b014a1e3 | 48 | } |
Robsonik16 | 0:d546b014a1e3 | 49 | |
Robsonik16 | 0:d546b014a1e3 | 50 | enum Result eStringToKeyword(char pcStr[], enum KeywordCode *peKeywordCode){ |
Robsonik16 | 0:d546b014a1e3 | 51 | |
Robsonik16 | 0:d546b014a1e3 | 52 | unsigned char ucKeywordIndex; |
Robsonik16 | 0:d546b014a1e3 | 53 | |
Robsonik16 | 0:d546b014a1e3 | 54 | for(ucKeywordIndex=0; ucKeywordIndex < MAX_KEYWORD_NR; ucKeywordIndex++){ |
Robsonik16 | 0:d546b014a1e3 | 55 | if(eCompareString(pcStr, asKeywordList[ucKeywordIndex].cString) == EQUAL){ |
Robsonik16 | 0:d546b014a1e3 | 56 | *peKeywordCode = asKeywordList[ucKeywordIndex].eCode; |
Robsonik16 | 0:d546b014a1e3 | 57 | return(OK); |
Robsonik16 | 0:d546b014a1e3 | 58 | } |
Robsonik16 | 0:d546b014a1e3 | 59 | } |
Robsonik16 | 0:d546b014a1e3 | 60 | return(ERROR); |
Robsonik16 | 0:d546b014a1e3 | 61 | } |
Robsonik16 | 0:d546b014a1e3 | 62 | |
Robsonik16 | 0:d546b014a1e3 | 63 | void DecodeTokens(void){ |
Robsonik16 | 0:d546b014a1e3 | 64 | |
Robsonik16 | 0:d546b014a1e3 | 65 | unsigned int uiNumber; |
Robsonik16 | 0:d546b014a1e3 | 66 | unsigned char ucTokenIndex; |
Robsonik16 | 0:d546b014a1e3 | 67 | enum KeywordCode eKeyword; |
Robsonik16 | 0:d546b014a1e3 | 68 | |
Robsonik16 | 0:d546b014a1e3 | 69 | for(ucTokenIndex=0; ucTokenIndex < ucTokenNr; ucTokenIndex++){ |
Robsonik16 | 0:d546b014a1e3 | 70 | if((eStringToKeyword (asToken[ucTokenIndex].uValue.pcString, &eKeyword))== OK){ |
Robsonik16 | 0:d546b014a1e3 | 71 | asToken[ucTokenIndex].eType = KEYWORD; |
Robsonik16 | 0:d546b014a1e3 | 72 | asToken[ucTokenIndex].uValue.eKeyword=eKeyword; |
Robsonik16 | 0:d546b014a1e3 | 73 | }else if((eHexStringToUInt(asToken[ucTokenIndex].uValue.pcString,&uiNumber))== OK){ |
Robsonik16 | 0:d546b014a1e3 | 74 | asToken[ucTokenIndex].eType = NUMBER; |
Robsonik16 | 0:d546b014a1e3 | 75 | asToken[ucTokenIndex].uValue.uiNumber = uiNumber; |
Robsonik16 | 0:d546b014a1e3 | 76 | }else{ |
Robsonik16 | 0:d546b014a1e3 | 77 | asToken[ucTokenIndex].eType = STRING; |
Robsonik16 | 0:d546b014a1e3 | 78 | } |
Robsonik16 | 0:d546b014a1e3 | 79 | } |
Robsonik16 | 0:d546b014a1e3 | 80 | } |
Robsonik16 | 0:d546b014a1e3 | 81 | |
Robsonik16 | 0:d546b014a1e3 | 82 | void DecodeMsg(char *pcString){ |
Robsonik16 | 0:d546b014a1e3 | 83 | |
Robsonik16 | 0:d546b014a1e3 | 84 | ucTokenNr = ucFindTokensInString (pcString); |
Robsonik16 | 0:d546b014a1e3 | 85 | ReplaceCharactersInString(pcString,' ',NULL); |
Robsonik16 | 0:d546b014a1e3 | 86 | DecodeTokens(); |
Robsonik16 | 0:d546b014a1e3 | 87 | } |