Class to handle a loose connection between user input and the program logic. (Documentation is not ready yet)

Dependents:   Sensor

Committer:
wolfsberger
Date:
Tue Mar 15 08:40:16 2016 +0000
Revision:
0:647c98c63475
Imported into MBED; Documentation not finished.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfsberger 0:647c98c63475 1 #ifndef COMMANDHANDLER_H_INCLUDED
wolfsberger 0:647c98c63475 2 #define COMMANDHANDLER_H_INCLUDED
wolfsberger 0:647c98c63475 3
wolfsberger 0:647c98c63475 4 /** Base class for every command
wolfsberger 0:647c98c63475 5 */
wolfsberger 0:647c98c63475 6 class CommandBase
wolfsberger 0:647c98c63475 7 {
wolfsberger 0:647c98c63475 8 public:
wolfsberger 0:647c98c63475 9 // Type definitions
wolfsberger 0:647c98c63475 10 typedef uint8_t IDType;
wolfsberger 0:647c98c63475 11 typedef uint32_t ParameterType;
wolfsberger 0:647c98c63475 12 typedef bool(*CallbackType)(ParameterType);
wolfsberger 0:647c98c63475 13
wolfsberger 0:647c98c63475 14 CommandBase(IDType id)
wolfsberger 0:647c98c63475 15 : id_(id), nextCommand_(NULL)
wolfsberger 0:647c98c63475 16 {}
wolfsberger 0:647c98c63475 17
wolfsberger 0:647c98c63475 18 CommandBase * next()
wolfsberger 0:647c98c63475 19 {
wolfsberger 0:647c98c63475 20 return nextCommand_;
wolfsberger 0:647c98c63475 21 }
wolfsberger 0:647c98c63475 22 void setNext(CommandBase * command)
wolfsberger 0:647c98c63475 23 {
wolfsberger 0:647c98c63475 24 nextCommand_ = command;
wolfsberger 0:647c98c63475 25 }
wolfsberger 0:647c98c63475 26 IDType id()
wolfsberger 0:647c98c63475 27 {
wolfsberger 0:647c98c63475 28 return id_;
wolfsberger 0:647c98c63475 29 }
wolfsberger 0:647c98c63475 30 void operator()(ParameterType param)
wolfsberger 0:647c98c63475 31 {
wolfsberger 0:647c98c63475 32 exec(param);
wolfsberger 0:647c98c63475 33 }
wolfsberger 0:647c98c63475 34 virtual bool exec(ParameterType param) = 0;
wolfsberger 0:647c98c63475 35 private:
wolfsberger 0:647c98c63475 36
wolfsberger 0:647c98c63475 37 IDType id_;
wolfsberger 0:647c98c63475 38 CommandBase * nextCommand_;
wolfsberger 0:647c98c63475 39 };
wolfsberger 0:647c98c63475 40
wolfsberger 0:647c98c63475 41 /** Class to create a command that points to a class member.
wolfsberger 0:647c98c63475 42 *
wolfsberger 0:647c98c63475 43 */
wolfsberger 0:647c98c63475 44 template <typename T>
wolfsberger 0:647c98c63475 45 class MemberCommand : public CommandBase
wolfsberger 0:647c98c63475 46 {
wolfsberger 0:647c98c63475 47 public:
wolfsberger 0:647c98c63475 48 MemberCommand(CommandBase::IDType id, T* target, bool (T::*func)(CommandBase::ParameterType))
wolfsberger 0:647c98c63475 49 : CommandBase(id), target_(target), function_(func)
wolfsberger 0:647c98c63475 50 {}
wolfsberger 0:647c98c63475 51
wolfsberger 0:647c98c63475 52 bool exec(ParameterType param)
wolfsberger 0:647c98c63475 53 {
wolfsberger 0:647c98c63475 54 return (target_->*function_)(param);
wolfsberger 0:647c98c63475 55 }
wolfsberger 0:647c98c63475 56
wolfsberger 0:647c98c63475 57 private:
wolfsberger 0:647c98c63475 58 T * target_;
wolfsberger 0:647c98c63475 59 bool (T::*function_)(CommandBase::ParameterType);
wolfsberger 0:647c98c63475 60 };
wolfsberger 0:647c98c63475 61
wolfsberger 0:647c98c63475 62 /** Class to create a command that points to function.
wolfsberger 0:647c98c63475 63 *
wolfsberger 0:647c98c63475 64 */
wolfsberger 0:647c98c63475 65 class FunctionCommand : public CommandBase
wolfsberger 0:647c98c63475 66 {
wolfsberger 0:647c98c63475 67 public:
wolfsberger 0:647c98c63475 68 FunctionCommand(CommandBase::IDType id, CommandBase::CallbackType func)
wolfsberger 0:647c98c63475 69 : CommandBase(id), function_(func)
wolfsberger 0:647c98c63475 70 {}
wolfsberger 0:647c98c63475 71
wolfsberger 0:647c98c63475 72 bool exec(ParameterType param)
wolfsberger 0:647c98c63475 73 {
wolfsberger 0:647c98c63475 74 return function_(param);
wolfsberger 0:647c98c63475 75 }
wolfsberger 0:647c98c63475 76
wolfsberger 0:647c98c63475 77 private:
wolfsberger 0:647c98c63475 78 CommandBase::CallbackType function_;
wolfsberger 0:647c98c63475 79 };
wolfsberger 0:647c98c63475 80
wolfsberger 0:647c98c63475 81 /** Class that manages the commands
wolfsberger 0:647c98c63475 82 */
wolfsberger 0:647c98c63475 83 class CommandHandler
wolfsberger 0:647c98c63475 84 {
wolfsberger 0:647c98c63475 85 public:
wolfsberger 0:647c98c63475 86 CommandHandler()
wolfsberger 0:647c98c63475 87 : firstCommand_(NULL), lastCommand_(NULL)
wolfsberger 0:647c98c63475 88 {}
wolfsberger 0:647c98c63475 89 void addCommand(CommandBase * command)
wolfsberger 0:647c98c63475 90 {
wolfsberger 0:647c98c63475 91 if (firstCommand_ == NULL)
wolfsberger 0:647c98c63475 92 {
wolfsberger 0:647c98c63475 93 firstCommand_ = command;
wolfsberger 0:647c98c63475 94 lastCommand_ = command;
wolfsberger 0:647c98c63475 95 }
wolfsberger 0:647c98c63475 96 else
wolfsberger 0:647c98c63475 97 {
wolfsberger 0:647c98c63475 98 lastCommand_->setNext(command);
wolfsberger 0:647c98c63475 99 lastCommand_ = command;
wolfsberger 0:647c98c63475 100 }
wolfsberger 0:647c98c63475 101 }
wolfsberger 0:647c98c63475 102 void handleCommand(CommandBase::IDType id, CommandBase::ParameterType param)
wolfsberger 0:647c98c63475 103 {
wolfsberger 0:647c98c63475 104 CommandBase * cmd = firstCommand_;
wolfsberger 0:647c98c63475 105 while (cmd != 0)
wolfsberger 0:647c98c63475 106 {
wolfsberger 0:647c98c63475 107 if (cmd->id() == id && cmd->exec(param))
wolfsberger 0:647c98c63475 108 {
wolfsberger 0:647c98c63475 109 return;
wolfsberger 0:647c98c63475 110 }
wolfsberger 0:647c98c63475 111 cmd = cmd->next();
wolfsberger 0:647c98c63475 112 }
wolfsberger 0:647c98c63475 113 }
wolfsberger 0:647c98c63475 114 private:
wolfsberger 0:647c98c63475 115 CommandBase * nextCommand();
wolfsberger 0:647c98c63475 116 CommandBase * firstCommand_;
wolfsberger 0:647c98c63475 117 CommandBase * lastCommand_;
wolfsberger 0:647c98c63475 118 };
wolfsberger 0:647c98c63475 119
wolfsberger 0:647c98c63475 120 #endif /* COMMANDHANDLER_H_INCLUDED */