AGH UST MBED part 2

Dependencies:   LCD_DISCO_F429ZI mbed BSP_DISCO_F429ZI

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?

UserRevisionLine numberNew 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 }