public void Disconnect() { _state = 0; if (_connected) { _connected = false; } L2CAPAPI.L2CAPClosePSM(L2CAP_PSM_HIDP_INTR); L2CAPAPI.L2CAPClosePSM(L2CAP_PSM_HIDP_CTRL); if (0 != _cidCtrl) { L2CAPAPI.L2CAPCloseCID(_cidCtrl); _cidCtrl = 0; } if (0 != _cidIntr) { L2CAPAPI.L2CAPCloseCID(_cidIntr); _cidIntr = 0; } _bluetoothAddress = 0; if (null != Disconnected) { Disconnected(this, null); } if (null != _intrThread) { if (Thread.CurrentThread != _intrThread) { _intrThread.Abort(); } } if (null != _ctrlThread) { if (Thread.CurrentThread != _ctrlThread) { _ctrlThread.Abort(); } } lock (this) { if (null != _connectThread) { _connectThread.Abort(); _connectThread = null; } } }
public bool Connect(UInt64 bluetoothAddress) { if (_connected) { Disconnect(); } Program.Debug.WriteLine("Connecting to: " + bluetoothAddress); //_connected = true; //return true; _bluetoothAddress = bluetoothAddress; int iErr = 0; ushort outmtu = 0, intrCid = 0, ctrlCid = 0; _connected = false; if (0 != _bluetoothAddress) { UInt64 ba = _bluetoothAddress; Program.Debug.WriteLine("Connect CTRL: " + bluetoothAddress); if (0 == (iErr = L2CAPAPI.L2CAPConnect(ref ba, L2CAP_PSM_HIDP_CTRL, 48, ref ctrlCid, ref outmtu))) { Program.Debug.WriteLine("Connect INTR: " + bluetoothAddress); if (0 == (iErr = L2CAPAPI.L2CAPConnect(ref ba, L2CAP_PSM_HIDP_INTR, 48, ref intrCid, ref outmtu))) { _connected = true; } else { Program.Debug.WriteError("Connect INTR failed", iErr); } } else { Program.Debug.WriteError("Connect CTRL failed", iErr); } } else { if (!_connected) { _connected = false; UInt64 ba = 0; if (0 == (iErr = L2CAPAPI.L2CAPListen(L2CAP_PSM_HIDP_CTRL, 48))) { if (0 == (iErr = L2CAPAPI.L2CAPListen(L2CAP_PSM_HIDP_INTR, 48))) { if (0 == (iErr = L2CAPAPI.L2CAPAccept(L2CAP_PSM_HIDP_CTRL, ref ba, ref ctrlCid, ref outmtu))) { if (0 == (iErr = L2CAPAPI.L2CAPAccept(L2CAP_PSM_HIDP_INTR, ref ba, ref intrCid, ref outmtu))) { _connected = true; _bluetoothAddress = ba; } else { Program.Debug.WriteError("Accept INTR failed", iErr); } } else { Program.Debug.WriteError("Accept CTRL failed", iErr); } } else { Program.Debug.WriteError("Listen CTRL failed", iErr); } } else { Program.Debug.WriteError("Listen INTR failed", iErr); } if (!_connected) { Program.Debug.WriteLine("Disconnecting: " + bluetoothAddress); iErr = L2CAPAPI.L2CAPClosePSM(L2CAP_PSM_HIDP_INTR); iErr = L2CAPAPI.L2CAPClosePSM(L2CAP_PSM_HIDP_CTRL); } } } if (_connected) { Program.Debug.WriteLine("Connected. Launching listeners: " + bluetoothAddress); // write our stuff here //unsafe //{ // L2CAPAPI.btFLOWSPEC flowSpec = new L2CAPAPI.btFLOWSPEC(); // flowSpec.token_rate = 900; // flowSpec.token_bucket_size = 20; // flowSpec.peak_bandwidth = 900; // flowSpec.latency = 10; // flowSpec.delay_variation = 10; // flowSpec.service_type = 1; // iErr = L2CAPAPI.L2CAPConfigReq(_cidIntr, 48, 0xFF, &flowSpec, 0, null); //} ThreadStart listenThreadIntr = new ThreadStart(ListenOnIntr); ThreadStart listenThreadCtrl = new ThreadStart(ListenOnCtrl); _cidIntr = intrCid; _cidCtrl = ctrlCid; _intrThread = new Thread(listenThreadIntr); _intrThread.IsBackground = true; _ctrlThread = new Thread(listenThreadCtrl); _ctrlThread.IsBackground = true; _intrThread.Start(); _ctrlThread.Start(); _state = 1; Program.Debug.WriteLine("Firing connected event"); if (null != Connected) { Connected(this, null); } } return(_connected); }