ARM 3.doc

(68 KB) Pobierz
Załącznik nr

Ochojski Piotr                            Dekodowanie komunikatów

 

#define MAX_TOKEN_NR 3

#define MAX_KEYWORD_STRING_LTH 10

#define MAX_KEYWORD_NR 3

 

typedef enum TokenType {KEYWORD, NUMBER, STRING};

typedef enum KeywordCode { LD, ST, RST};

 

typedef struct Keyword

{

    enum KeywordCode eCode;

    char cString[MAX_KEYWORD_STRING_LTH + 1];

};

 

typedef union TokenValue

{

    enum KeywordCode eKeyword; // jezeli KEYWORD

    unsigned int uiNumber; // jezeli NUMBER

    char * pcString; // jezeli STRING

};

 

typedef struct Token

{

    enum TokenType eTokenType; // KEYWORD, NUMBER, STRING

    union TokenValue uValue; // enum, unsigned int, char*

};

 

typedef struct Keyword asKeywordList[MAX_KEYWORD_NR]=

{

    {RST, "reset" },   

    {LD,  "load"  },

    {ST,  "store" }

                 

};

typedef struct Token asToken[MAX_TOKEN_NR];

 

unsigned char ucTokenNr;

asKeywordList[];

asToken[];

 

 

 

 

 

 

 

 

// FUNKCJA 1----------------------------------------------------------------------------

unsigned char ucFindTokensInString( char *pcString )

{  

    enum TokenAutomat{TOKEN, DELIMITER};

    enum TokenAutomat eTokenAutomat = DELIMITER;

    unsigned char ucLoopCounter;

    unsigned char ucCharMem;

              ucTokenNr = 0;

 

    for(ucLoopCounter = 0;;ucLoopCounter++)

    {

                            ucCharMem = pcString[ucLoopCounter];

        switch( eTokenAutomat )

        {

            case TOKEN:

                                               if( ' ' == ucCharMem )

                 {

                      eTokenAutomat = DELIMITER;  

                 }                                                                                   

                 else if( NULL == ucCharMem )

                 {

                      return  ucTokenNr;   

                 }

                 else if( MAX_TOKEN_NR == ucTokenNr )

                 {

                      return  ucTokenNr;   

                 }

                 else

                 {

                     eTokenAutomat = TOKEN;   

                 }

                 break;

 

            case DELIMITER:

                if ( NULL == ucCharMem )

                {

                    return ucTokenNr;

                }

                                                                      else if ( ' ' == ucCharMem )

                                                                      {

                                                                                      eTokenState = DELIMITER;

                                                                      }              

                                                                      else 

                {

                 eTokenAutomat = TOKEN;

                 asToken[ucTokenNr].uValue.pcString = pcString+ucLoopCounter;

                ucTokenNr++;

                }

            break;

        }

    }

}

// FUNKCJA 2----------------------------------------------------------------------------

 

enum Result eStringToKeyword( char pcStr[],enum KeywordCode *peKeyword )

{

     unsigned char ucLoopCounter;

     for( ucLoopCounter = 0 ; ucLoopCounter < MAX_KEYWORD_NR ; ucLoopCounter++ )

     {

          if (EQUAL == eCompareString( pcStr, asKeywordList[ucLoopCounter].cString))

          {

              *peKeyword = asKeywordList[ucLoopCounter].eCode;

              return OK;

          }

     }

     return ERROR;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// FUNKCJA 3----------------------------------------------------------------------------

 

void DecodeTokens(void)

{

     enum TokenType *eTokenType;

     unsigned int *uiValue;

     char *pcString;

     unsigned char ucLoopCounter;

     unsigned int iTokenValue;

 

     for(ucLoopCounter = 0 ; ucLoopCounter < ucTokenNr ; ucLoopCounter++ )

     {

          pcString &= asToken[ucLoopCounter].uValue.pcString;

          eTokenType  &=( asToken[ucLoopCounter].eTokenType );

          uiValue &=( asToken[ucLoopCounter].uValue.uiNumber );

         

          if( OK == eStringToKeyword( pcString, &asToken[ucLoopCounter].uValue.eKeyword ) )

          {

               *eTokenType=KEYWORD;            

          }

          else if(OK == eHexStringToUInt( pcString, &iTokenValue ) )

          {

              *eTokenType = NUMBER;

              *uiValue = iTokenValue;                                     

          }

          else

          {

              *eTokenType = STRING;

          }

     }

}

 

 

// FUNKCJA 4----------------------------------------------------------------------------

 

void DecodeMsg(char *pcString)

{

     ucTokenNr = ucFindTokensInString( pcString );

     ReplaceCharactersInString( pcString,' ',NULL );

     DecodeTokens();    

}

 

 

 

str. 4

 

Zgłoś jeśli naruszono regulamin