public override void Send(byte[] data) { try { if (device?.ConnectionHandle != null && isConnected) { AutoResetEvent proceed = new AutoResetEvent(false); ProcedureCompletedEventHandler complete = delegate(object sender, ProcedureCompletedEventArgs e) { Debug.WriteLine("Bluetooth: write complete"); proceed.Set(); }; bluetooth.BLEEventATTClientProcedureCompleted += complete; if (data.Length > 20) { List <byte> payload = new List <byte>(data); int total = data.Length; bool signal; for (int i = 0; i < Math.Ceiling((double)data.Length / 20); i++) { bluetooth.SendCommand(this.port, bluetooth.BLECommandATTClientAttributeWrite((byte)device.ConnectionHandle, (ushort)Handle.Write, payload.GetRange(i * 20, (total < 20) ? total : 20).ToArray()) ); total -= 20; signal = proceed.WaitOne(200); if (!signal) { break; } } } else { bluetooth.SendCommand(this.port, bluetooth.BLECommandATTClientAttributeWrite((byte)device.ConnectionHandle, (ushort)Handle.Write, data)); proceed.WaitOne(200); } bluetooth.BLEEventATTClientProcedureCompleted -= complete; } else { throw new HardwareException("There is no reader connected"); } } catch (InvalidOperationException e) { throw new HardwareException("There is no TappyUSB connected"); } }
public void Execute() { Byte[] writeToAttr = Ble.Lib.BLECommandATTClientAttributeWrite(this.Connection, this.AttributeHandle, (byte[])this.Value); ProcedureCompletedEventHandler handler = this.ProcedureCompletedHandler; Ble.Lib.BLEEventATTClientProcedureCompleted += handler; Ble.SendCommand(this.Port, writeToAttr); this.WaitEvent(() => _response != null); Ble.Lib.BLEEventATTClientProcedureCompleted -= handler; }
private void FindServices() { // (established connection, handle.min_address, handle.max_address, primary gatt service attribute identifier) byte[] readGroups = Ble.Lib.BLECommandATTClientReadByGroupType(this.Connection, GATT_MIN_HANDLE, GATT_MAX_HANDLE, (byte[])GATT_SERVICE_TYPE_PRIMARY); Ble.Lib.BLEEventATTClientGroupFound += GroupFound; ProcedureCompletedEventArgs procedureResponse = null; ProcedureCompletedEventHandler handler = (sender, e) => { procedureResponse = e; }; Ble.Lib.BLEEventATTClientProcedureCompleted += handler; Ble.SendCommand(this.Port, readGroups); this.WaitEvent(() => procedureResponse != null); Ble.Lib.BLEEventATTClientGroupFound -= GroupFound; Ble.Lib.BLEEventATTClientProcedureCompleted -= handler; }
private void FindAttributes(BlePeripheralService service) { byte[] findInfo = Ble.Lib.BLECommandATTClientFindInformation(this.Connection, service.StartHandle, service.EndHandle); FindInformationFoundEventHandler infoHandler = (sender, e) => this.AttributeFound(service, e); Ble.Lib.BLEEventATTClientFindInformationFound += infoHandler; ProcedureCompletedEventArgs procedureResponse = null; ProcedureCompletedEventHandler handler = (sender, e) => { procedureResponse = e; }; Ble.Lib.BLEEventATTClientProcedureCompleted += handler; Ble.SendCommand(this.Port, findInfo); this.WaitEvent(() => procedureResponse != null); Ble.Lib.BLEEventATTClientFindInformationFound -= infoHandler; Ble.Lib.BLEEventATTClientProcedureCompleted -= handler; }