1/*
2    File:       IrQOS.h
3
4    Contains:   Methods for implementing IrQOS (IrDA Quality of Service)
5
6*/
7
8
9#ifndef __IRQOS_H
10#define __IRQOS_H
11
12#include "IrDATypes.h"
13
14class CBufferSegment;
15struct USBIrDAQoS;          // From AppleUSBIrDA.h
16
17// Constants
18
19enum QOSIdentifiers
20{
21    kQOSNumberOfIdentifiers = 0x07,
22    kQOSType1IdentifierFlag = 0x80,
23
24    kQOSBaudRateId          = 0x01,
25    kQOSMaxTurnAroundTimeId = 0x82,
26    kQOSDataSizeId          = 0x83,
27    kQOSWindowSizeId        = 0x84,
28    kQOSNumberOfExtraBOFsId = 0x85,
29    kQOSMinTurnAroundTimeId = 0x86,
30    kQOSLinkDiscThresholdId = 0x08
31};
32
33enum QOSBaudRates           // 0x01
34{
35    kQOS2400bps             = 0x0001,
36    kQOS9600bps             = 0x0002,
37    kQOS19200bps            = 0x0004,
38    kQOS38400bps            = 0x0008,
39    kQOS57600bps            = 0x0010,
40    kQOS115200bps           = 0x0020,
41    kQOS576000bps           = 0x0040,
42    kQOS1Mbps               = 0x0080,
43    kQOS4Mbps               = 0x0100,
44
45    kQOSValidBaudRatesLow       = (kQOS1Mbps     | kQOS115200bps | kQOS57600bps | kQOS38400bps  |
46				   kQOS19200bps  | kQOS9600bps   | kQOS2400bps),
47    kQOSValidBaudRatesHigh      = (kQOS4Mbps )>>8,
48
49    kQOSDefaultBaudRates        = (kQOS1Mbps     | kQOS115200bps | kQOS57600bps |
50				   kQOS38400bps  | kQOS19200bps  | kQOS9600bps)
51};
52
53enum QOSMaxTurnAroundTime   // 0x82
54{
55    kQOSMaxTurnTime500ms    = 0x01,
56    kQOSMaxTurnTime250ms    = 0x02,
57    kQOSMaxTurnTime100ms    = 0x04,
58    kQOSMaxTurnTime50ms     = 0x08,
59    kQOSValidMaxTurnTimes       = (kQOSMaxTurnTime500ms | kQOSMaxTurnTime250ms |
60				   kQOSMaxTurnTime100ms | kQOSMaxTurnTime50ms),
61    kQOSDefaultMaxTurnTime      = (kQOSMaxTurnTime500ms)
62};
63
64enum QOSDataSize            // 0x83
65{
66    kQOS64Bytes             = 0x01,
67    kQOS128Bytes            = 0x02,
68    kQOS256Bytes            = 0x04,
69    kQOS512Bytes            = 0x08,
70    kQOS1024Bytes           = 0x10,
71    kQOS2048Bytes           = 0x20,
72    kQOSValidDataSizes          = (kQOS2048Bytes | kQOS1024Bytes |
73				   kQOS512Bytes  | kQOS256Bytes  |
74				   kQOS128Bytes  | kQOS64Bytes),
75    kQOSDefaultDataSizes        = kQOSValidDataSizes
76};
77
78enum QOSWindowSize          // 0x84
79{
80    kQOS1Frame              = 0x01,
81    kQOS2Frames             = 0x02,
82    kQOS3Frames             = 0x04,
83    kQOS4Frames             = 0x08,
84    kQOS5Frames             = 0x10,
85    kQOS6Frames             = 0x20,
86    kQOS7Frames             = 0x40,
87    kQOSValidWindowSizes        = (kQOS7Frames | kQOS6Frames | kQOS5Frames | kQOS4Frames |
88				   kQOS3Frames | kQOS2Frames | kQOS1Frame),
89
90    kQOSDefaultWindowSize       = (kQOS1Frame)
91};
92
93enum QOSExtraBOFs           // 0x85
94{
95    kQOS48ExtraBOFs         = 0x01,
96    kQOS24ExtraBOFs         = 0x02,
97    kQOS12ExtraBOFs         = 0x04,
98    kQOS6ExtraBOFs          = 0x08,
99    kQOS3ExtraBOFs          = 0x10,
100    kQOS2ExtraBOFs          = 0x20,
101    kQOS1ExtraBOF           = 0x40,
102    kQOSNoExtraBOFs         = 0x80,
103    kQOSValidExtraBOFs          = (kQOSNoExtraBOFs | kQOS1ExtraBOF  | kQOS2ExtraBOFs  |
104				   kQOS3ExtraBOFs  | kQOS6ExtraBOFs | kQOS12ExtraBOFs |
105				   kQOS24ExtraBOFs | kQOS48ExtraBOFs),
106    kQOSDefaultExtraBOFs        = (kQOS2ExtraBOFs)
107};
108
109enum QOSMinTurnAroundTime   // 0x86
110{
111    kQOSMinTurnTime10ms     = 0x01,
112    kQOSMinTurnTime5ms      = 0x02,
113    kQOSMinTurnTime1ms      = 0x04,
114    kQOSMinTurnTime500us    = 0x08,
115    kQOSMinTurnTime100us    = 0x10,
116    kQOSMinTurnTime50us     = 0x20,
117    kQOSMinTurnTime10us     = 0x40,
118    kQOSMinTurnTimeNone     = 0x80,
119    kQOSValidMinTurnTimes       = (kQOSMinTurnTimeNone  | kQOSMinTurnTime10us  |
120				   kQOSMinTurnTime50us  | kQOSMinTurnTime100us |
121				   kQOSMinTurnTime500us | kQOSMinTurnTime1ms   |
122				   kQOSMinTurnTime5ms   | kQOSMinTurnTime10ms),
123    kQOSDefaultMinTurnTime      = (kQOSMinTurnTime5ms)
124};
125
126enum QOSLinkDiscThreshold   // 0x08
127{
128    kQOSDiscAfter3secs      = 0x01,
129    kQOSDiscAfter8secs      = 0x02,
130    kQOSDiscAfter12secs     = 0x04,
131    kQOSDiscAfter16secs     = 0x08,
132    kQOSDiscAfter20secs     = 0x10,
133    kQOSDiscAfter25secs     = 0x20,
134    kQOSDiscAfter30secs     = 0x40,
135    kQOSDiscAfter40secs     = 0x80,
136    kQOSValidDiscThresholds     = (kQOSDiscAfter40secs | kQOSDiscAfter30secs |
137				   kQOSDiscAfter25secs | kQOSDiscAfter20secs |
138				   kQOSDiscAfter16secs | kQOSDiscAfter12secs |
139				   kQOSDiscAfter8secs  | kQOSDiscAfter3secs),
140    kQOSDefaultDiscThresholds   = (kQOSDiscAfter40secs | kQOSDiscAfter30secs |
141				   kQOSDiscAfter25secs | kQOSDiscAfter20secs |
142				   kQOSDiscAfter16secs | kQOSDiscAfter12secs |
143				   kQOSDiscAfter8secs  | kQOSDiscAfter3secs)
144};
145
146typedef struct
147{
148    UInt16      baudRate;
149
150    UInt8       maxTurnTime,
151		dataSizes,
152		windowSize,
153		extraBOFs,
154		minTurnTime,
155		discThresholds;
156
157} QoSData, *QoSPtr, **QoSHandle;
158
159// Classes
160
161// --------------------------------------------------------------------------------------------------------------------
162//                      TIrQOS
163// --------------------------------------------------------------------------------------------------------------------
164
165class TIrQOS : public OSObject
166{
167    OSDeclareDefaultStructors(TIrQOS);
168
169    public:
170	    static TIrQOS * tIrQOS(USBIrDAQoS *qos);
171	    bool init(USBIrDAQoS *qos);
172	    void free();
173
174	    // Set all values to defaults
175	    void            Reset();
176
177	    // Specify QOS parms (obtained via options)
178	    IrDAErr         SetBaudRate(BitRate bitsPerSec);
179	    IrDAErr         SetDataSize(ULong bufferSize);
180	    IrDAErr         SetWindowSize(ULong numFrames);
181	    IrDAErr         SetLinkDiscThresholdTime(TTimeout linkDiscThresholdTime);
182
183	    // Obtain QOS parms (probably returned to client via options)
184	    BitRate         GetBaudRate();
185	    TTimeout        GetMaxTurnAroundTime();
186	    ULong           GetDataSize();
187	    ULong           GetWindowSize();
188	    ULong           GetExtraBOFs();
189	    TTimeout        GetMinTurnAroundTime();
190	    TTimeout        GetLinkDiscThresholdTime();
191
192	    ULong           AddInfoToBuffer(UByte* buffer, ULong maxBytes);
193	    IrDAErr         ExtractInfoFromBuffer(CBufferSegment* buffer);
194
195	    IrDAErr         NegotiateWith(TIrQOS* peerDeviceQOS);
196
197    private:
198
199	    IrDAErr         NormalizeInfo();
200	    ULong           HighestBitOn(UByte aByte);
201
202	    UInt16          fBaudRate;
203	    UByte           fMaxTurnAroundTime;
204	    UByte           fDataSize;
205	    UByte           fWindowSize;
206	    UByte           fNumExtraBOFs;
207	    UByte           fMinTurnAroundTime;
208	    UByte           fLinkDiscThreshold;
209
210	    USBIrDAQoS      *fDeviceQOS;        // qos values from usb
211};
212
213#endif // __IRQOS_H
214