xref: /haiku/src/add-ons/kernel/drivers/input/hid_shared/HIDReport.h (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
1 /*
2  * Copyright 2009, Michael Lotz, mmlr@mlotz.ch.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef HID_REPORT_H
6 #define HID_REPORT_H
7 
8 #include "HIDParser.h"
9 #include "util/Vector.h"
10 
11 
12 #ifndef USERLAND_HID
13 #include <condition_variable.h>
14 #endif
15 
16 #define HID_REPORT_TYPE_INPUT		0x01
17 #define HID_REPORT_TYPE_OUTPUT		0x02
18 #define HID_REPORT_TYPE_FEATURE		0x04
19 #define HID_REPORT_TYPE_ANY			0x07
20 
21 class HIDCollection;
22 class HIDReportItem;
23 
24 class HIDReport {
25 public:
26 								HIDReport(HIDParser *parser, uint8 type,
27 									uint8 id);
28 								~HIDReport();
29 
Type()30 		uint8					Type() { return fType; };
ID()31 		uint8					ID() { return fReportID; };
ReportSize()32 		size_t					ReportSize() { return (fReportSize + 7) / 8; };
33 
Parser()34 		HIDParser *				Parser() { return fParser; };
Device()35 		HIDDevice *				Device() { return fParser->Device(); };
36 
37 		void					AddMainItem(global_item_state &globalState,
38 									local_item_state &localState,
39 									main_item_data &mainData,
40 									HIDCollection *collection);
41 
42 		void					SetReport(status_t status, uint8 *report,
43 									size_t length);
CurrentReport()44 		uint8 *					CurrentReport() { return fCurrentReport; };
45 
46 #ifndef USERLAND_HID
47 		status_t				SendReport();
48 #endif
49 
CountItems()50 		uint32					CountItems() { return fItems.Count(); };
51 		HIDReportItem *			ItemAt(uint32 index);
52 		HIDReportItem *			FindItem(uint16 usagePage, uint16 usageID);
53 
54 		uint32 *				Usages();
CountUsages()55 		uint32					CountUsages() { return fUsages.Count(); };
56 
57 #ifndef USERLAND_HID
58 		status_t				WaitForReport(bigtime_t timeout);
59 		void					DoneProcessing();
60 #endif
61 
62 		void					PrintToStream();
63 
64 private:
65 		void					_SignExtend(uint32 &minimum, uint32 &maximum);
66 
67 		HIDParser *				fParser;
68 
69 		uint8					fType;
70 		uint8					fReportID;
71 		uint32					fReportSize;
72 
73 		Vector<HIDReportItem *>	fItems;
74 
75 		status_t				fReportStatus;
76 		uint8 *					fCurrentReport;
77 		int32					fBusyCount;
78 
79 		Vector<uint32>			fUsages;
80 
81 #ifndef USERLAND_HID
82 		ConditionVariable		fConditionVariable;
83 #endif
84 };
85 
86 #endif // HID_REPORT_H
87