Interprets Commands received char by char.

CMD_Interpreter.h

Committer:
sepp_nepp
Date:
2019-10-31
Revision:
2:5934744ac614
Parent:
0:b4341838304c

File content as of revision 2:5934744ac614:


#ifndef CMD_Interpreter_H
#define CMD_Interpreter_H

#include "mbed.h"
#include <string> 

const int BuffLen = 512;

// define commands to be handled!
typedef void (*caseHandler)(int param);

typedef struct EXE_CMD_TYPE{
    char cmd;    // THe single command character
    char Npar;   // The number of parameters needed by the command, only for help text. All command Hanlders must have a Parameter
    caseHandler Handler; // Command Handlers
    string help;  // Help Text  for that command
    }EXE_CMD_TYPE;

// Define States of the interpreter
enum InterpretState { isStartNew, isLineFilling, isOverflow, isWaitNewLine};

typedef struct RD_CMD_TYPE {
    char Command;    // Holds the next read command character
    int  Parameter ; // Holds one int Parameter
    int  NumParam ;  // Indicates how many parameters where found
    } RD_CMD_TYPE;

// Uses a Ring buffer to buffer incomiing characters
// Uses a parsing function to extract lines containing a command each
class Interpreter{
  public: 
    // Interpreter Class Creation 
    Interpreter( void );
    void Reinit( void );
    void FillCommands(int aNumCommands, const EXE_CMD_TYPE *ACommands );
  public: // the writing mechanics
    void AddChar ( char aChar ); // Barebone function, assumes that checks havee been performed by writeBuf!
    void writeBuf( char c ) ; // High level method to add a Char to the buffer,
    char RingBuf[BuffLen];
    InterpretState MyState;// Indicates if buffer overflow, line ended etc. 
    int  WriteIndex   ;  // points to next index to write to
    int  BufAvail     ;  // indicates how much of the buffer is still available
    int  LinesComplete; // Indicates how many complete lines are available
    bool ProcessPresentCommands( void );
    RD_CMD_TYPE ParseCommand( void );
    bool executeCommand(RD_CMD_TYPE cmd);
    bool InvalidCommand;
    void PrtCmdHelp  ( Serial *aSerial ); // Display list of Commands
    // void GetLastMessage( string LastMsg); // not possible to implement at the moment
  public: // the reading mechanics
    int  ScanIndex;    // points to next index to read from to
    char actC     ;    // holds the actual character
  private:
    char GetAChar  ( void );
    void SkipBlanks( void );
    int  ReadAnInt ( void );
    char actPP     ( void );
    EXE_CMD_TYPE* AllCommands; // Defines an array of all commands to be filled by the user. 
    int NumCommands; // Holds the actual number of commands that are stored in the array
    /*
    char buff[100]; // Intermediate buffer to hold messages for datalogging
    string LastMessage;
    void DataLog( char *DebugMessage );
    void CmdInval( int param );  // Feedback that the command is invalid
    */
}; // class Interpreter

#endif // CMD_Interpreter_H