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 LONG_KEY_PRESS_MONITOR_H_
osmeest 0:1324e7d9d471 2 #define LONG_KEY_PRESS_MONITOR_H_
osmeest 0:1324e7d9d471 3
osmeest 0:1324e7d9d471 4 #include <kbd_mgr/KeyPressEventServer.h>
osmeest 0:1324e7d9d471 5 #include <set>
osmeest 0:1324e7d9d471 6
osmeest 0:1324e7d9d471 7 #include "mbed.h"
osmeest 0:1324e7d9d471 8
osmeest 0:1324e7d9d471 9 namespace kbd_mgr {
osmeest 0:1324e7d9d471 10
osmeest 0:1324e7d9d471 11 /**
osmeest 0:1324e7d9d471 12 * @brief A key press event handler that detects long key presses and report them as specified.
osmeest 0:1324e7d9d471 13 * This class offers two specific reactions for long key presses. Either a specific long key press is reported
osmeest 0:1324e7d9d471 14 * or the key press event is auto repeated. The timing for both kind of reactions can be specified independently.
osmeest 0:1324e7d9d471 15 * The monitor reacts on key code, not on mapped key char. If a mapped key char is present in the event, it is retained
osmeest 0:1324e7d9d471 16 * in the generated key press events.
osmeest 0:1324e7d9d471 17 */
osmeest 0:1324e7d9d471 18 class LongKeyPressMonitor : public KeyPressEventServer, public KeyPressEventHandler {
osmeest 0:1324e7d9d471 19 public:
osmeest 0:1324e7d9d471 20 LongKeyPressMonitor() :
osmeest 0:1324e7d9d471 21 repeatKeys_(), repeatInitTime_(0), repeatDelay_(0), longPressKeys_(), longPressTime_(0),
osmeest 0:1324e7d9d471 22 state(Idle), keyDownCount(0), timer()
osmeest 0:1324e7d9d471 23 { }
osmeest 0:1324e7d9d471 24
osmeest 0:1324e7d9d471 25 class AutoRepeatSetupProxy {
osmeest 0:1324e7d9d471 26 public:
osmeest 0:1324e7d9d471 27 AutoRepeatSetupProxy(LongKeyPressMonitor *monitor) : monitor_(monitor) { }
osmeest 0:1324e7d9d471 28 AutoRepeatSetupProxy& operator()(int key) { this->monitor_->addAutoRepeatKey(key, key); return *this; }
osmeest 0:1324e7d9d471 29 AutoRepeatSetupProxy& operator()(int firstKey, int lastKey) { this->monitor_->addAutoRepeatKey(firstKey, lastKey); return *this; }
osmeest 0:1324e7d9d471 30
osmeest 0:1324e7d9d471 31 private:
osmeest 0:1324e7d9d471 32 LongKeyPressMonitor *monitor_;
osmeest 0:1324e7d9d471 33 };
osmeest 0:1324e7d9d471 34
osmeest 0:1324e7d9d471 35 friend class AutoRepeatSetupProxy;
osmeest 0:1324e7d9d471 36
osmeest 0:1324e7d9d471 37 /**
osmeest 0:1324e7d9d471 38 * @brief Sets up auto-repeat keys.
osmeest 0:1324e7d9d471 39 * This method takes the timing parameters. It returns a special class that allows specifying the keys
osmeest 0:1324e7d9d471 40 * between brackets. Eg:
osmeest 0:1324e7d9d471 41 * - monitor.autoRepeat(0.3, 0.1)(1)(2)(4,8)
osmeest 0:1324e7d9d471 42 * Sets up auto repeat after 300ms, every 100ms for keys 1, 2 and 4 to 8.
osmeest 0:1324e7d9d471 43 */
osmeest 0:1324e7d9d471 44 AutoRepeatSetupProxy autoRepeat(float initTime, float delay);
osmeest 0:1324e7d9d471 45
osmeest 0:1324e7d9d471 46
osmeest 0:1324e7d9d471 47 class LongPressSetupProxy {
osmeest 0:1324e7d9d471 48 public:
osmeest 0:1324e7d9d471 49 LongPressSetupProxy(LongKeyPressMonitor *monitor) : monitor_(monitor) { }
osmeest 0:1324e7d9d471 50 LongPressSetupProxy& operator()(int key) { this->monitor_->addLongPressKey(key, key); return *this; }
osmeest 0:1324e7d9d471 51 LongPressSetupProxy& operator()(int firstKey, int lastKey) { this->monitor_->addLongPressKey(firstKey, lastKey); return *this; }
osmeest 0:1324e7d9d471 52
osmeest 0:1324e7d9d471 53 private:
osmeest 0:1324e7d9d471 54 LongKeyPressMonitor *monitor_;
osmeest 0:1324e7d9d471 55 };
osmeest 0:1324e7d9d471 56
osmeest 0:1324e7d9d471 57 friend class LongPressSetupProxy;
osmeest 0:1324e7d9d471 58
osmeest 0:1324e7d9d471 59 /**
osmeest 0:1324e7d9d471 60 * @brief Sets up long key press keys.
osmeest 0:1324e7d9d471 61 * This method takes the timing parameters. It returns a special class that allows specifying the keys
osmeest 0:1324e7d9d471 62 * between brackets. Eg:
osmeest 0:1324e7d9d471 63 * - monitor.longKeyPress(0.5)(3)(12,14)
osmeest 0:1324e7d9d471 64 * Sets up report of long key press after 500ms for keys 3 and 12 to 14.
osmeest 0:1324e7d9d471 65 */
osmeest 0:1324e7d9d471 66 LongPressSetupProxy longKeyPress(float longPressTime);
osmeest 0:1324e7d9d471 67
osmeest 0:1324e7d9d471 68 /**
osmeest 0:1324e7d9d471 69 * @brief KeyPressEventHandler interface
osmeest 0:1324e7d9d471 70 */
osmeest 0:1324e7d9d471 71 virtual void handleKeyPress(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 72
osmeest 0:1324e7d9d471 73 private:
osmeest 0:1324e7d9d471 74 void addAutoRepeatKey(int firstKey, int lastKey);
osmeest 0:1324e7d9d471 75 bool isAutoRepeatKey(int key) const { return this->repeatKeys_.find(key) != this->repeatKeys_.end(); }
osmeest 0:1324e7d9d471 76 void addLongPressKey(int firstKey, int lastKey);
osmeest 0:1324e7d9d471 77 bool isLongPressKey(int key) const { return this->longPressKeys_.find(key) != this->longPressKeys_.end(); }
osmeest 0:1324e7d9d471 78
osmeest 0:1324e7d9d471 79 void handleKeyDown(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 80 void handleFirstKeyDown(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 81 void handleOtherKeyDown(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 82 void handleKeyUp(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 83 void handleLastKeyUp(const KeyEvent &keypress);
osmeest 0:1324e7d9d471 84
osmeest 0:1324e7d9d471 85 void handleTimer();
osmeest 0:1324e7d9d471 86 void handleRepeatTimer();
osmeest 0:1324e7d9d471 87 void handleLongPressTimer();
osmeest 0:1324e7d9d471 88
osmeest 0:1324e7d9d471 89 typedef std::set<int> KeySet;
osmeest 0:1324e7d9d471 90
osmeest 0:1324e7d9d471 91 KeySet repeatKeys_;
osmeest 0:1324e7d9d471 92 float repeatInitTime_;
osmeest 0:1324e7d9d471 93 float repeatDelay_;
osmeest 0:1324e7d9d471 94
osmeest 0:1324e7d9d471 95 KeySet longPressKeys_;
osmeest 0:1324e7d9d471 96 float longPressTime_;
osmeest 0:1324e7d9d471 97
osmeest 0:1324e7d9d471 98 enum State {
osmeest 0:1324e7d9d471 99 Idle,
osmeest 0:1324e7d9d471 100 RepeatInitWait,
osmeest 0:1324e7d9d471 101 Repeating,
osmeest 0:1324e7d9d471 102 LongPressWait,
osmeest 0:1324e7d9d471 103 LongPressReported,
osmeest 0:1324e7d9d471 104 Invalid
osmeest 0:1324e7d9d471 105 };
osmeest 0:1324e7d9d471 106
osmeest 0:1324e7d9d471 107 State state;
osmeest 0:1324e7d9d471 108 KeyEvent keypress;
osmeest 0:1324e7d9d471 109 int keyDownCount;
osmeest 0:1324e7d9d471 110 Timeout timer;
osmeest 0:1324e7d9d471 111 };
osmeest 0:1324e7d9d471 112
osmeest 0:1324e7d9d471 113 } // kbd_mgr
osmeest 0:1324e7d9d471 114
osmeest 0:1324e7d9d471 115 #endif // LONG_KEY_PRESS_MONITOR_H_