1/*
2    File:       IrGlue.h
3
4    Contains:   Top of the IrDA stack
5
6
7*/
8
9
10#ifndef __IRGLUE_H
11#define __IRGLUE_H
12
13#include "IrDAStats.h"
14#include "IrDATypes.h"
15
16
17// Constants
18
19
20enum IrLSAPIds
21{
22    kNameServerLSAPId           = 0x00,
23    kAssignDynamicLSAPId        = 0x00,
24    kLastValidLSAPId            = 0x6F,
25    kInvalidLSAPId              = 0xFF,
26    kPendingConnectLSAPId       = 0xFF
27};
28
29
30class TIrStream;
31class CBuffer;
32class TLSAPConn;
33class TIASService;
34class TIrEvent;
35class CIrDevice;
36class TIrLAP;
37class TIrLMP;
38class TIrLAPConn;
39class CIrDiscovery;
40class TIASService;
41class TIASServer;
42class CTimer;
43class TIrQOS;
44class CList;
45class TIrDscInfo;
46class AppleIrDASerial;
47class AppleIrDA;
48struct USBIrDAQoS;
49
50enum {
51    kNumTimers = 3,                 // we have 3 timers, id's 0,1,2
52    kTimer_LAP = 0,                 // LAP's timer
53    kTimer_LMP = 1,                 // LMP's 1 second timer (LSAPConn)
54    kTimer_LAPConn = 2              // LAPConn's idle disconnect timer
55};
56
57class IOWorkLoop;
58
59class TIrGlue : public OSObject
60{
61    OSDeclareDefaultStructors(TIrGlue);
62
63public:
64
65    static TIrGlue *tIrGlue(AppleIrDASerial *driver, AppleIrDA *appleirda, IOWorkLoop *work, USBIrDAQoS *qos);
66
67    Boolean         init(AppleIrDASerial *driver, AppleIrDA *appleirda, IOWorkLoop *work, USBIrDAQoS *qos);
68    void            free(void);
69
70    // Packets coming in from the driver
71    void            ReadComplete(UInt8 *buffer, UInt32 length);     // add return code?
72    void            RunQueue();                                     // shorthand for TIrStream::RunQueue
73
74    // Device transmit finished, hand back to driver
75    void            TransmitComplete(Boolean worked);
76
77    // Device finished changing speed
78    void            SetSpeedComplete(Boolean worked);
79
80    void            Start(void);    // do any runtime startup.
81    void            Stop(void);     // usb driver isn't available anymore
82
83    // Client Methods
84
85	    IrDAErr         RegisterMyNameAndLSAPId( UChar* className, UChar* attrName, UInt32 * lsapId );
86
87	    IrDAErr         ConnectStart    (   TIrStream   *   client,
88						UInt32          myLSAPId,
89						UInt32          devAddr,
90						UInt32          peerLSAPId,
91						CBuffer     *   clientData,
92						TLSAPConn   **  theLSAP );
93
94	    IrDAErr         ListenStart     (   TIrStream   *   client,         // Caller
95						UInt32          lsapId,         // Preallocated LSAP Id
96						CBuffer     *   clientData,     // Data to pass with connect
97						TLSAPConn   **  theLSAP     );  // The allocated LSAP
98
99
100	    // LSAPId management routines for LSAPConn
101	    IrDAErr         ObtainLSAPId    ( UInt32 & desiredLSAPId );
102	    void            ReleaseLSAPId   ( UInt32 lsapId );
103
104	    // Temp(?!) until this is cleaned up some more
105	    TIASService     *GetNameService(void);      // get nameservice
106
107    // Lower Layer methods
108
109	    // Terminate helper routine for IrLAP
110	    void            Disconnected(Boolean reset_lap);
111
112	    // Timer helper routines for IrLMP, IrLAP.  Id is [0..2]
113	    void            StartTimer(int id, TTimeout timeDelay, UInt32 refCon);
114	    void            StopTimer(int id);
115
116	    void            TimerComplete(UInt32 refCon);
117
118	    // Event related management
119
120	    TIrEvent        *GrabEventBlock(UInt32 event = 0, UInt32 size = 0); // size is currently ignored
121	    void            ReleaseEventBlock(TIrEvent *reqBlock);
122
123	    // Inline member getters
124	    TIrLAP              *GetLAP             (void);
125	    TIrLMP              *GetLMP             (void);
126	    TIrLAPConn          *GetLAPConn         (void);
127	    CIrDevice           *GetIrDevice        (void);
128	    TIrQOS              *GetMyQOS           (void);
129	    TIrQOS              *GetPeerQOS         (void);
130	    CIrDiscovery        *GetDiscovery       (void);
131
132	    Boolean             IsLAPConnected(void);           // check with lap re our connection status
133	    void                DoIdleDisconnect(void);         // tell lapconn to hurry up and disconnect now if idle
134
135	    CTimer              *GetTimer(int id);              // this is really just used by glue, move to private?
136
137    // statistics
138	    void            GetIrDAStatus(IrDAStatus *status);
139
140    private:
141	    Boolean         InitNameService(void);  // set initial values for our IAS service
142
143	    CTimer          *fTimers[kNumTimers];   // our three timers
144	    UInt32           fLSAPIdsInUse;         // bitmap of allocated LSAP ids (bug?  max 32 in use)
145
146
147	    TIrLAP          *fIrLAP;                // one lap
148	    TIrLMP          *fIrLMP;                // one lmp
149	    TIrLAPConn      *fIrLAPConn;            // one lap link
150	    CIrDevice       *fIrDevice;             // link back to IOKit's usb/irda bridge
151	    CIrDiscovery    *fIrDiscovery;          // one discovery engine
152	    TIrQOS          *fMyQOS;
153	    TIrQOS          *fPeerQOS;
154
155	    TIASService     *fNameService;          // The IAS name database
156	    TIASServer      *fNameServer;           // Our server to access the IAS database
157
158	    AppleIrDA       *fAppleIrDA;            // link to iokit message sender
159	    UInt8           fLastState;             // irda state change --> message to clients
160};
161
162#define CheckReturn(x) { check(x); return (x); }
163
164inline CTimer       *   TIrGlue::GetTimer(int id)       { CheckReturn(fTimers[id]); }
165inline TIASService  *   TIrGlue::GetNameService(void)   { CheckReturn(fNameService); }
166
167inline TIrLAP       *   TIrGlue::GetLAP(void)           { CheckReturn(fIrLAP); }
168inline TIrLMP       *   TIrGlue::GetLMP(void)           { CheckReturn(fIrLMP); }
169inline TIrLAPConn   *   TIrGlue::GetLAPConn(void)       { CheckReturn(fIrLAPConn); }
170inline CIrDevice    *   TIrGlue::GetIrDevice(void)      { CheckReturn(fIrDevice); }
171inline TIrQOS       *   TIrGlue::GetMyQOS(void)         { CheckReturn(fMyQOS); }
172inline TIrQOS       *   TIrGlue::GetPeerQOS(void)       { CheckReturn(fPeerQOS); }
173inline CIrDiscovery *   TIrGlue::GetDiscovery(void)     { CheckReturn(fIrDiscovery); }
174
175#endif // __IRGLUE_H
176