root/src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.h
/*
 * Copyright 2008-2011 Michael Lotz <mmlr@mlotz.ch>
 * Distributed under the terms of the MIT license.
 */
#ifndef USB_KEYBOARD_PROTOCOL_HANDLER_H
#define USB_KEYBOARD_PROTOCOL_HANDLER_H


#include "ProtocolHandler.h"

#include <lock.h>


class HIDReportItem;
class HIDCollection;


#define MAX_MODIFIERS   16
#define MAX_KEYS                128
#define MAX_LEDS                3


class KeyboardProtocolHandler : public ProtocolHandler {
public:
                                                                KeyboardProtocolHandler(HIDReport &inputReport,
                                                                        HIDReport *outputReport);
        virtual                                         ~KeyboardProtocolHandler();

        static  void                            AddHandlers(HIDDevice &device,
                                                                        HIDCollection &collection,
                                                                        ProtocolHandler *&handlerList);

        virtual status_t                        Open(uint32 flags, uint32 *cookie);
        virtual status_t                        Close(uint32 *cookie);

        virtual status_t                        Control(uint32 *cookie, uint32 op, void *buffer,
                                                                        size_t length);

private:
                        void                            _WriteKey(uint32 key, bool down);
                        status_t                        _SetLEDs(uint8 *data);
                        status_t                        _ReadReport(bigtime_t timeout, uint32 *cookie);

private:
                        mutex                           fLock;

                        HIDReport &                     fInputReport;
                        HIDReport *                     fOutputReport;

                        HIDReportItem *         fModifiers[MAX_MODIFIERS];
                        HIDReportItem *         fKeys[MAX_KEYS];
                        HIDReportItem *         fLEDs[MAX_LEDS];

                        bigtime_t                       fRepeatDelay;
                        bigtime_t                       fRepeatRate;
                        bigtime_t                       fCurrentRepeatDelay;
                        uint32                          fCurrentRepeatKey;

                        uint32                          fKeyCount;
                        uint32                          fModifierCount;

                        uint8                           fLastModifiers;
                        uint16 *                        fCurrentKeys;
                        uint16 *                        fLastKeys;

                        int32                           fHasReader;
                        bool                            fHasDebugReader;
};


#endif // USB_KEYBOARD_PROTOCOL_HANDLER_H