KeyboardManager: a class to manage the polling of a switch-matrix keyboard

Dependents:   KeyboardTest

kbd_mgr/KeyPressEventHandler.h

Committer:
osmeest
Date:
2011-02-03
Revision:
3:1310c57aca77
Parent:
2:eb4cc53ff33d

File content as of revision 3:1310c57aca77:

#ifndef KEY_PRESS_EVENT_HANDLER_H_
#define KEY_PRESS_EVENT_HANDLER_H_

namespace kbd_mgr {

struct KeyEvent {
    enum KeyId {
        NoKey = -1
    };
    
    enum EventType {
        NoEvent, KeyDown, KeyPress, RepeatedKeyPress, LongKeyPress, KeyUp
    };
    
    int keyCode;
    char keyChar;
    EventType event;
    
    KeyEvent() : keyCode(NoKey), keyChar(0), event(NoEvent) { }
    
    /**
     * @brief Creates a raw key event (no char).
     */
    KeyEvent(int key, EventType event) : keyCode(key), keyChar(0), event(event) { }    
    
    /**
     * @brief Converts a raw key event into a mapped key.
     */
    KeyEvent(const KeyEvent &raw, char ch) : keyCode(raw.keyCode), keyChar(ch), event(raw.event) { }    
    
    /**
     * @brief Creates a key event with a different event code.
     */
    KeyEvent(const KeyEvent &other, EventType event) : keyCode(other.keyCode), keyChar(other.keyChar), event(event) { }    
};

/**
 * @brief Interface used to report key presses and releases.
 */
class KeyPressEventHandler {
public:
    virtual void handleKeyPress(const KeyEvent &keypress) = 0;
    virtual ~KeyPressEventHandler() { }
};

template <class T>
class MemberKeyPressEventHandler : public KeyPressEventHandler {
public:
    typedef void (T::*MemberFunction)(const KeyEvent &keypress);
    
    MemberKeyPressEventHandler(T *obj, MemberFunction fn) :
        object(obj), func(fn)
    { }
    
    virtual void handleKeyPress(const KeyEvent &keypress) {
        (object->*func)(keypress);
    }
    
private:
    T *object;
    MemberFunction func;
};

class FunctionKeyPressEventHandler : public KeyPressEventHandler {
public:
    typedef void (*HandlerFunction)(const KeyEvent &keypress);

    FunctionKeyPressEventHandler(HandlerFunction fn) :
        func(fn)
    { }

    virtual void handleKeyPress(const KeyEvent &keypress) {
        func(keypress);
    }
        
private:
    HandlerFunction func;
};
    
} // kbd_mgr

#endif // KEY_PRESS_EVENT_HANDLER_H_