A DTMF sequence editor and player for HAM radio equipment command & control.

Dependencies:   mbed ExtTextLCD

Committer:
osmeest
Date:
Mon Mar 07 22:51:19 2011 +0000
Revision:
0:1324e7d9d471

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
osmeest 0:1324e7d9d471 1 #ifndef KEY_MAPPER_H_
osmeest 0:1324e7d9d471 2 #define KEY_MAPPER_H_
osmeest 0:1324e7d9d471 3
osmeest 0:1324e7d9d471 4 #include "kbd_mgr/KeyPressEventServer.h"
osmeest 0:1324e7d9d471 5
osmeest 0:1324e7d9d471 6 #include <vector>
osmeest 0:1324e7d9d471 7 #include <string>
osmeest 0:1324e7d9d471 8 #include <utility>
osmeest 0:1324e7d9d471 9
osmeest 0:1324e7d9d471 10 namespace kbd_mgr {
osmeest 0:1324e7d9d471 11
osmeest 0:1324e7d9d471 12 /**
osmeest 0:1324e7d9d471 13 * @brief A class used to store a set of key mappings.
osmeest 0:1324e7d9d471 14 * It associates a key event and a key code to a mapped character.
osmeest 0:1324e7d9d471 15 * It also allows to specify a mapping for any unmatched key event of a key.
osmeest 0:1324e7d9d471 16 * The KeyMap can be set at construction time with a string and an optional key event.
osmeest 0:1324e7d9d471 17 * Additional mappings can be specified by using the () operator. This way, both individual mappings and string mappings are possible.
osmeest 0:1324e7d9d471 18 * Eg. keymap(KeyEvent::LongKeyPress, 1, '@')(1, '*')
osmeest 0:1324e7d9d471 19 * maps the key 1 to '*' for all key presses but to '@' when a long key press occurs.
osmeest 0:1324e7d9d471 20 */
osmeest 0:1324e7d9d471 21 class KeyMap {
osmeest 0:1324e7d9d471 22 public:
osmeest 0:1324e7d9d471 23 /**
osmeest 0:1324e7d9d471 24 * @brief Creates an empty keymap.
osmeest 0:1324e7d9d471 25 */
osmeest 0:1324e7d9d471 26 KeyMap() : map_() { }
osmeest 0:1324e7d9d471 27
osmeest 0:1324e7d9d471 28 /**
osmeest 0:1324e7d9d471 29 * @brief Creates a keymap based on a string.
osmeest 0:1324e7d9d471 30 * Each character is mapped to the key at that position (key 1 maps to str[1]).
osmeest 0:1324e7d9d471 31 */
osmeest 0:1324e7d9d471 32 KeyMap(const std::string &str) : map_() {
osmeest 0:1324e7d9d471 33 addMappings(KeyEvent::NoEvent, str);
osmeest 0:1324e7d9d471 34 }
osmeest 0:1324e7d9d471 35 /**
osmeest 0:1324e7d9d471 36 * @brief Creates a keymap based on a string for a certain key event.
osmeest 0:1324e7d9d471 37 * Each character is mapped to the key at that position (key 1 maps to str[1]).
osmeest 0:1324e7d9d471 38 */
osmeest 0:1324e7d9d471 39 KeyMap(KeyEvent::EventType event, const std::string &str) : map_() {
osmeest 0:1324e7d9d471 40 addMappings(event, str);
osmeest 0:1324e7d9d471 41 }
osmeest 0:1324e7d9d471 42
osmeest 0:1324e7d9d471 43 /**
osmeest 0:1324e7d9d471 44 * @brief Adds key mappings based on the given string.
osmeest 0:1324e7d9d471 45 */
osmeest 0:1324e7d9d471 46 KeyMap& operator()(const std::string &str) {
osmeest 0:1324e7d9d471 47 addMappings(KeyEvent::NoEvent, str);
osmeest 0:1324e7d9d471 48 return *this;
osmeest 0:1324e7d9d471 49 }
osmeest 0:1324e7d9d471 50
osmeest 0:1324e7d9d471 51 /**
osmeest 0:1324e7d9d471 52 * @brief Adds key mappings based on the given string for a given event.
osmeest 0:1324e7d9d471 53 */
osmeest 0:1324e7d9d471 54 KeyMap& operator()(KeyEvent::EventType event, const std::string &str) {
osmeest 0:1324e7d9d471 55 addMappings(event, str);
osmeest 0:1324e7d9d471 56 return *this;
osmeest 0:1324e7d9d471 57 }
osmeest 0:1324e7d9d471 58
osmeest 0:1324e7d9d471 59 /**
osmeest 0:1324e7d9d471 60 * @brief Adds a key mapping for a key.
osmeest 0:1324e7d9d471 61 */
osmeest 0:1324e7d9d471 62 KeyMap& operator()(int key, char ch) {
osmeest 0:1324e7d9d471 63 addMapping(KeyEvent::NoEvent, key, ch);
osmeest 0:1324e7d9d471 64 return *this;
osmeest 0:1324e7d9d471 65 }
osmeest 0:1324e7d9d471 66
osmeest 0:1324e7d9d471 67 /**
osmeest 0:1324e7d9d471 68 * @brief Adds a key mapping for a key event & code combo.
osmeest 0:1324e7d9d471 69 */
osmeest 0:1324e7d9d471 70 KeyMap& operator()(KeyEvent::EventType event, int key, char ch) {
osmeest 0:1324e7d9d471 71 addMapping(event, key, ch);
osmeest 0:1324e7d9d471 72 return *this;
osmeest 0:1324e7d9d471 73 }
osmeest 0:1324e7d9d471 74
osmeest 0:1324e7d9d471 75 /**
osmeest 0:1324e7d9d471 76 * @brief Gets the mapped character for a key press event.
osmeest 0:1324e7d9d471 77 */
osmeest 0:1324e7d9d471 78 char map(KeyEvent::EventType event, int key) const;
osmeest 0:1324e7d9d471 79
osmeest 0:1324e7d9d471 80 private:
osmeest 0:1324e7d9d471 81 struct KeyMapping {
osmeest 0:1324e7d9d471 82 KeyEvent::EventType event;
osmeest 0:1324e7d9d471 83 int key;
osmeest 0:1324e7d9d471 84 char ch;
osmeest 0:1324e7d9d471 85
osmeest 0:1324e7d9d471 86 KeyMapping(KeyEvent::EventType event, int key, char ch) : event(event), key(key), ch(ch) { }
osmeest 0:1324e7d9d471 87
osmeest 0:1324e7d9d471 88 bool matches(const std::pair<KeyEvent::EventType, int> &arg) const {
osmeest 0:1324e7d9d471 89 return this->event == arg.first && this->key == arg.second;
osmeest 0:1324e7d9d471 90 }
osmeest 0:1324e7d9d471 91 };
osmeest 0:1324e7d9d471 92
osmeest 0:1324e7d9d471 93 void addMapping(KeyEvent::EventType event, int key, char ch);
osmeest 0:1324e7d9d471 94 void addMappings(KeyEvent::EventType event, const std::string &str);
osmeest 0:1324e7d9d471 95 const KeyMapping * getMapping(KeyEvent::EventType event, int key) const;
osmeest 0:1324e7d9d471 96
osmeest 0:1324e7d9d471 97 typedef std::vector<KeyMapping> Map;
osmeest 0:1324e7d9d471 98 Map map_;
osmeest 0:1324e7d9d471 99 };
osmeest 0:1324e7d9d471 100
osmeest 0:1324e7d9d471 101 /**
osmeest 0:1324e7d9d471 102 * @brief A key press event handler that adds a mapped key char to key events.
osmeest 0:1324e7d9d471 103 * Mappings can be specified for any key press event or for some specific key press event.
osmeest 0:1324e7d9d471 104 */
osmeest 0:1324e7d9d471 105 class KeyMapper : public KeyPressEventServer, public KeyPressEventHandler {
osmeest 0:1324e7d9d471 106 public:
osmeest 0:1324e7d9d471 107
osmeest 0:1324e7d9d471 108 KeyMapper(const KeyMap &keymap = KeyMap()) :
osmeest 0:1324e7d9d471 109 keymap_(keymap)
osmeest 0:1324e7d9d471 110 { }
osmeest 0:1324e7d9d471 111
osmeest 0:1324e7d9d471 112 const KeyMap & keymap() const { return this->keymap_; }
osmeest 0:1324e7d9d471 113 char map(KeyEvent::EventType event, int key) const { return this->keymap_.map(event, key); }
osmeest 0:1324e7d9d471 114
osmeest 0:1324e7d9d471 115 virtual void handleKeyPress(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 116
osmeest 0:1324e7d9d471 117 private:
osmeest 0:1324e7d9d471 118 KeyMap keymap_;
osmeest 0:1324e7d9d471 119 };
osmeest 0:1324e7d9d471 120
osmeest 0:1324e7d9d471 121 } // kbd_mgr
osmeest 0:1324e7d9d471 122
osmeest 0:1324e7d9d471 123 #endif // KEY_MAPPER_H_