Class to handle a loose connection between user input and the program logic. (Documentation is not ready yet)
CommandHandler.h@0:647c98c63475, 2016-03-15 (annotated)
- 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?
User | Revision | Line number | New 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 */ |