root/src/add-ons/kernel/drivers/input/hid_shared/HIDReport.h
/*
 * Copyright 2009, Michael Lotz, mmlr@mlotz.ch.
 * Distributed under the terms of the MIT License.
 */
#ifndef HID_REPORT_H
#define HID_REPORT_H

#include "HIDParser.h"
#include "util/Vector.h"


#ifndef USERLAND_HID
#include <condition_variable.h>
#endif

#define HID_REPORT_TYPE_INPUT           0x01
#define HID_REPORT_TYPE_OUTPUT          0x02
#define HID_REPORT_TYPE_FEATURE         0x04
#define HID_REPORT_TYPE_ANY                     0x07

class HIDCollection;
class HIDReportItem;

class HIDReport {
public:
                                                                HIDReport(HIDParser *parser, uint8 type,
                                                                        uint8 id);
                                                                ~HIDReport();

                uint8                                   Type() { return fType; };
                uint8                                   ID() { return fReportID; };
                size_t                                  ReportSize() { return (fReportSize + 7) / 8; };

                HIDParser *                             Parser() { return fParser; };
                HIDDevice *                             Device() { return fParser->Device(); };

                void                                    AddMainItem(global_item_state &globalState,
                                                                        local_item_state &localState,
                                                                        main_item_data &mainData,
                                                                        HIDCollection *collection);

                void                                    SetReport(status_t status, uint8 *report,
                                                                        size_t length);
                uint8 *                                 CurrentReport() { return fCurrentReport; };

#ifndef USERLAND_HID
                status_t                                SendReport();
#endif

                uint32                                  CountItems() { return fItems.Count(); };
                HIDReportItem *                 ItemAt(uint32 index);
                HIDReportItem *                 FindItem(uint16 usagePage, uint16 usageID);

                uint32 *                                Usages();
                uint32                                  CountUsages() { return fUsages.Count(); };

#ifndef USERLAND_HID
                status_t                                WaitForReport(bigtime_t timeout);
                void                                    DoneProcessing();
#endif

                void                                    PrintToStream();

private:
                void                                    _SignExtend(uint32 &minimum, uint32 &maximum);

                HIDParser *                             fParser;

                uint8                                   fType;
                uint8                                   fReportID;
                uint32                                  fReportSize;

                Vector<HIDReportItem *> fItems;

                status_t                                fReportStatus;
                uint8 *                                 fCurrentReport;
                int32                                   fBusyCount;

                Vector<uint32>                  fUsages;

#ifndef USERLAND_HID
                ConditionVariable               fConditionVariable;
#endif
};

#endif // HID_REPORT_H