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