
AGH UST MBED part 2
Dependencies: LCD_DISCO_F429ZI mbed BSP_DISCO_F429ZI
decoder.cpp@7:34a9bd9d3093, 2020-05-22 (annotated)
- Committer:
- matis755
- Date:
- Fri May 22 08:45:37 2020 +0000
- Revision:
- 7:34a9bd9d3093
- Parent:
- 6:06ff453bb16e
Change to built-it replace function
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
matis755 | 4:e48aee3e8d09 | 1 | #include "decoder.h" |
matis755 | 7:34a9bd9d3093 | 2 | #include <algorithm> |
matis755 | 4:e48aee3e8d09 | 3 | |
matis755 | 4:e48aee3e8d09 | 4 | struct Keyword asKeywordList[MAX_KEYWORD_NR] = { |
matis755 | 4:e48aee3e8d09 | 5 | {ID, "id"}, |
matis755 | 4:e48aee3e8d09 | 6 | {CLB, "callib"}, |
matis755 | 4:e48aee3e8d09 | 7 | {GT, "goto"}, |
matis755 | 4:e48aee3e8d09 | 8 | {ST, "step"}, |
matis755 | 4:e48aee3e8d09 | 9 | }; |
matis755 | 4:e48aee3e8d09 | 10 | |
matis755 | 4:e48aee3e8d09 | 11 | enum Result { OK, NOK }; |
matis755 | 4:e48aee3e8d09 | 12 | |
matis755 | 4:e48aee3e8d09 | 13 | |
matis755 | 4:e48aee3e8d09 | 14 | unsigned char Decoder::ucFindTokensInString(char *pcString){ |
matis755 | 4:e48aee3e8d09 | 15 | |
matis755 | 4:e48aee3e8d09 | 16 | unsigned char ucTokenPointer; |
matis755 | 4:e48aee3e8d09 | 17 | unsigned char ucDelimiterCounter; |
matis755 | 4:e48aee3e8d09 | 18 | char cCurrentChar; |
matis755 | 4:e48aee3e8d09 | 19 | enum State {TOKEN, DELIMITER}; |
matis755 | 4:e48aee3e8d09 | 20 | enum State eState = DELIMITER; |
matis755 | 4:e48aee3e8d09 | 21 | ucDelimiterCounter = 0; |
matis755 | 4:e48aee3e8d09 | 22 | |
matis755 | 4:e48aee3e8d09 | 23 | for(ucTokenPointer=0;;ucTokenPointer++){ |
matis755 | 4:e48aee3e8d09 | 24 | cCurrentChar = pcString[ucTokenPointer]; |
matis755 | 4:e48aee3e8d09 | 25 | switch(eState){ |
matis755 | 4:e48aee3e8d09 | 26 | case DELIMITER: |
matis755 | 4:e48aee3e8d09 | 27 | if(cCurrentChar == '\0') |
matis755 | 4:e48aee3e8d09 | 28 | return ucDelimiterCounter; |
matis755 | 4:e48aee3e8d09 | 29 | else if(cCurrentChar == ' ') {} |
matis755 | 4:e48aee3e8d09 | 30 | else { |
matis755 | 4:e48aee3e8d09 | 31 | eState = TOKEN; |
matis755 | 4:e48aee3e8d09 | 32 | asToken[ucDelimiterCounter].uValue.pcString = pcString+ucTokenPointer; |
matis755 | 4:e48aee3e8d09 | 33 | ucDelimiterCounter++; |
matis755 | 4:e48aee3e8d09 | 34 | } |
matis755 | 4:e48aee3e8d09 | 35 | break; |
matis755 | 4:e48aee3e8d09 | 36 | case TOKEN: |
matis755 | 4:e48aee3e8d09 | 37 | if(cCurrentChar == '\0') |
matis755 | 4:e48aee3e8d09 | 38 | return ucDelimiterCounter; |
matis755 | 4:e48aee3e8d09 | 39 | else if(ucDelimiterCounter == MAX_TOKEN_NR) |
matis755 | 4:e48aee3e8d09 | 40 | return ucDelimiterCounter; |
matis755 | 4:e48aee3e8d09 | 41 | else if(cCurrentChar != ' ') {} |
matis755 | 4:e48aee3e8d09 | 42 | else |
matis755 | 4:e48aee3e8d09 | 43 | eState = DELIMITER; |
matis755 | 4:e48aee3e8d09 | 44 | break; |
matis755 | 4:e48aee3e8d09 | 45 | } |
matis755 | 4:e48aee3e8d09 | 46 | } |
matis755 | 4:e48aee3e8d09 | 47 | } |
matis755 | 4:e48aee3e8d09 | 48 | |
matis755 | 4:e48aee3e8d09 | 49 | enum Result Decoder::eStringToKeyword (char pcStr[],enum KeywordCode *peKeywordCode){ |
matis755 | 4:e48aee3e8d09 | 50 | |
matis755 | 4:e48aee3e8d09 | 51 | unsigned char ucTokenCounter; |
matis755 | 4:e48aee3e8d09 | 52 | |
matis755 | 4:e48aee3e8d09 | 53 | for(ucTokenCounter=0;ucTokenCounter<MAX_KEYWORD_NR;ucTokenCounter++){ |
matis755 | 4:e48aee3e8d09 | 54 | if (!strcmp(pcStr, asKeywordList[ucTokenCounter].cString)) { |
matis755 | 4:e48aee3e8d09 | 55 | *peKeywordCode = asKeywordList[ucTokenCounter].eCode; |
matis755 | 4:e48aee3e8d09 | 56 | return OK; |
matis755 | 4:e48aee3e8d09 | 57 | } |
matis755 | 4:e48aee3e8d09 | 58 | } |
matis755 | 4:e48aee3e8d09 | 59 | return NOK; |
matis755 | 4:e48aee3e8d09 | 60 | } |
matis755 | 4:e48aee3e8d09 | 61 | |
matis755 | 4:e48aee3e8d09 | 62 | void Decoder::DecodeTokens(unsigned char ucTokenCnt){ |
matis755 | 4:e48aee3e8d09 | 63 | |
matis755 | 4:e48aee3e8d09 | 64 | unsigned char ucTokenCounter; |
matis755 | 4:e48aee3e8d09 | 65 | Token* tValue; |
matis755 | 4:e48aee3e8d09 | 66 | |
matis755 | 4:e48aee3e8d09 | 67 | for(ucTokenCounter=0;ucTokenCounter<ucTokenCnt;ucTokenCounter++){ |
matis755 | 4:e48aee3e8d09 | 68 | tValue = &asToken[ucTokenCounter]; |
matis755 | 4:e48aee3e8d09 | 69 | if (eStringToKeyword(tValue->uValue.pcString,&tValue->uValue.eKeyword) == OK) tValue->eType = KEYWORD; |
matis755 | 6:06ff453bb16e | 70 | else if ((int)strtol(tValue->uValue.pcString, NULL, 0)) { |
matis755 | 6:06ff453bb16e | 71 | tValue->uValue.uiNumber = (int)strtol(tValue->uValue.pcString, NULL, 0); |
matis755 | 6:06ff453bb16e | 72 | tValue->eType = NUMBER; |
matis755 | 6:06ff453bb16e | 73 | } |
matis755 | 4:e48aee3e8d09 | 74 | else tValue->eType = STRING; |
matis755 | 4:e48aee3e8d09 | 75 | } |
matis755 | 4:e48aee3e8d09 | 76 | } |
matis755 | 4:e48aee3e8d09 | 77 | |
matis755 | 4:e48aee3e8d09 | 78 | void Decoder::DecodeMsg(char *pcString){ |
matis755 | 4:e48aee3e8d09 | 79 | |
matis755 | 4:e48aee3e8d09 | 80 | ucTokenCnt = ucFindTokensInString(pcString); |
matis755 | 7:34a9bd9d3093 | 81 | std::replace(pcString, pcString + strlen(pcString), ' ', '\0'); |
matis755 | 4:e48aee3e8d09 | 82 | DecodeTokens(ucTokenCnt); |
matis755 | 4:e48aee3e8d09 | 83 | } |
matis755 | 4:e48aee3e8d09 | 84 | |
matis755 | 4:e48aee3e8d09 | 85 | enum TokenType Decoder::eGetTokenType(unsigned char ucIdx) { |
matis755 | 4:e48aee3e8d09 | 86 | return asToken[ucIdx].eType; |
matis755 | 4:e48aee3e8d09 | 87 | } |
matis755 | 4:e48aee3e8d09 | 88 | |
matis755 | 4:e48aee3e8d09 | 89 | unsigned char Decoder::GetTokenCnt(void) { |
matis755 | 4:e48aee3e8d09 | 90 | return ucTokenCnt; |
matis755 | 4:e48aee3e8d09 | 91 | } |
matis755 | 4:e48aee3e8d09 | 92 | |
matis755 | 4:e48aee3e8d09 | 93 | enum KeywordCode Decoder::eGetKeyword(unsigned char ucIdx) { |
matis755 | 4:e48aee3e8d09 | 94 | return asToken[ucIdx].uValue.eKeyword; |
matis755 | 4:e48aee3e8d09 | 95 | } |
matis755 | 5:3c19c3ae6286 | 96 | |
matis755 | 5:3c19c3ae6286 | 97 | unsigned int Decoder::uiGetNumber(unsigned char ucIdx) { |
matis755 | 5:3c19c3ae6286 | 98 | return asToken[ucIdx].uValue.uiNumber; |
matis755 | 5:3c19c3ae6286 | 99 | } |