public static byte[] ReadToBytes(GattReadResult result) { var data = new byte[result.Value.Length]; DataReader.FromBuffer(result.Value).ReadBytes(data); return data; }
internal static async Task <TAPProperties> GetTAPPropertiesAsync(BluetoothLEDevice d) { GattCharacteristic tapData = null; GattCharacteristic tapMouse = null; GattCharacteristic nusRx = null; int fwVersion = 0; GattDeviceServicesResult tapServicesResult = await GetServicesAsync(d, 10, 800); foreach (GattDeviceService ser in tapServicesResult.Services) { if (ser.Uuid == TAPGuids.service_tap) { GattCharacteristicsResult tapCharacteristicsResult = await GetCharacteristicsAsync(ser, 10, 800); foreach (GattCharacteristic ch in tapCharacteristicsResult.Characteristics) { if (ch.Uuid == TAPGuids.characteristic_tapdata) { tapData = ch; } else if (ch.Uuid == TAPGuids.characteristic_mousedata) { tapMouse = ch; } } } if (ser.Uuid == TAPGuids.service_nus) { GattCharacteristicsResult nusCharacteristicsResult = await GetCharacteristicsAsync(ser, 10, 800); foreach (GattCharacteristic ch in nusCharacteristicsResult.Characteristics) { if (ch.Uuid == TAPGuids.characteristic_rx) { nusRx = ch; } } } if (ser.Uuid == TAPGuids.service_device_information) { GattCharacteristicsResult fwCharacteristicsResult = await GetCharacteristicsAsync(ser, 10, 800); foreach (GattCharacteristic ch in fwCharacteristicsResult.Characteristics) { if (ch.Uuid == TAPGuids.characteristic_fw_version) { GattReadResult fwRead = await ch.ReadValueAsync(); if (fwRead.Status == GattCommunicationStatus.Success) { DataReader reader = DataReader.FromBuffer(fwRead.Value); string str = reader.ReadString(fwRead.Value.Length); fwVersion = VersionNumber.FromString(str); } } } } } return(new TAPProperties(tapData, tapMouse, nusRx, fwVersion)); }
private async void ReadBattery() { if (pairedGamepad != null && batteryCharacteristic != null) { if (pairedGamepad.ConnectionStatus == BluetoothConnectionStatus.Connected) { GattReadResult result = await batteryCharacteristic.ReadValueAsync(); if (result.Status == GattCommunicationStatus.Success) { var reader = DataReader.FromBuffer(result.Value); int val = reader.ReadByte(); string notify = val.ToString() + "% - " + pairedGamepad.Name; notifyIcon.Text = "XBatteryStatus: " + notify; if (val < 5) { notifyIcon.Icon = Properties.Resources.icon00; } else if (val < 15) { notifyIcon.Icon = Properties.Resources.icon10; } else if (val < 25) { notifyIcon.Icon = Properties.Resources.icon20; } else if (val < 35) { notifyIcon.Icon = Properties.Resources.icon30; } else if (val < 45) { notifyIcon.Icon = Properties.Resources.icon40; } else if (val < 55) { notifyIcon.Icon = Properties.Resources.icon50; } else if (val < 65) { notifyIcon.Icon = Properties.Resources.icon60; } else if (val < 75) { notifyIcon.Icon = Properties.Resources.icon70; } else if (val < 85) { notifyIcon.Icon = Properties.Resources.icon80; } else if (val < 95) { notifyIcon.Icon = Properties.Resources.icon90; } else { notifyIcon.Icon = Properties.Resources.icon100; } if ((lastBattery > 15 && val <= 15) || (lastBattery > 10 && val <= 10) || (lastBattery > 5 && val <= 5)) { new ToastContentBuilder().AddText("Low Battery").AddText(notify) .Show(); } lastBattery = val; } } } }
/// <summary> /// This function reads data from the specific BLE characteristic /// </summary> /// <param name="param"></param> public async Task <ERROR_CODE> ReadCharacteristic(string devName, string param) { ERROR_CODE task_result = ERROR_CODE.UNKNOWN_ERROR; try { if (ConnnectionStatus(devName) != ERROR_CODE.BLE_CONNECTED) { task_result = ERROR_CODE.BLE_NO_CONNECTED; Console.WriteLine("No BLE device connected."); return(task_result); } if (string.IsNullOrEmpty(param)) { task_result = ERROR_CODE.CMD_WRONG_PARAMETER; Console.WriteLine("Nothing to read, please specify characteristic name or #."); return(task_result); } List <BluetoothLEAttributeDisplay> chars = new List <BluetoothLEAttributeDisplay>(); string charName = string.Empty; var parts = param.Split('/'); // Do we have parameter is in "service/characteristic" format? if (parts.Length == 2) { string serviceName = Utilities.GetIdByNameOrNumber(_services, parts[0]); charName = parts[1]; // If device is found, connect to device and enumerate all services if (!string.IsNullOrEmpty(serviceName)) { var attr = _services.FirstOrDefault(s => s.Name.Equals(serviceName)); IReadOnlyList <GattCharacteristic> characteristics = new List <GattCharacteristic>(); try { // Ensure we have access to the device. var accessStatus = await attr.service.RequestAccessAsync(); if (accessStatus == DeviceAccessStatus.Allowed) { var result = await attr.service.GetCharacteristicsAsync(BluetoothCacheMode.Uncached); if (result.Status == GattCommunicationStatus.Success) { characteristics = result.Characteristics; } } } catch (Exception ex) { Console.WriteLine($"READ_EXCEPTION_2. Can't read characteristics: {ex.Message}"); task_result = ERROR_CODE.READ_EXCEPTION_2; } foreach (var c in characteristics) { chars.Add(new BluetoothLEAttributeDisplay(c)); } } } else if (parts.Length == 1) { if (_selectedService == null) { Console.WriteLine("No service is selected."); task_result = ERROR_CODE.NO_SELECTED_SERVICE; } chars = new List <BluetoothLEAttributeDisplay>(_characteristics); charName = parts[0]; } // Read characteristic if (chars.Count == 0) { Console.WriteLine("No Characteristics"); task_result = ERROR_CODE.READ_NOTHING_TO_READ; return(task_result); } if (chars.Count > 0 && !string.IsNullOrEmpty(charName)) { string useName = Utilities.GetIdByNameOrNumber(chars, charName); var attr = chars.FirstOrDefault(c => c.Name.Equals(useName)); if (attr != null && attr.characteristic != null) { // Read characteristic value GattReadResult result = await attr.characteristic.ReadValueAsync(BluetoothCacheMode.Uncached); if (result.Status == GattCommunicationStatus.Success) { Console.WriteLine(Utilities.FormatValue(result.Value, _dataFormat)); _resultCharacteristic = Utilities.FormatValue(result.Value, _dataFormat); task_result = ERROR_CODE.NONE; } else { Console.WriteLine($"Read failed: {result.Status}"); task_result = ERROR_CODE.READ_FAIL; } } else { Console.WriteLine($"Invalid characteristic {charName}"); task_result = ERROR_CODE.READ_INVALID_CHARACTERISTIC; } } } catch (Exception ex) { Console.WriteLine($"READ_EXCEPTION_1. Can't read characteristics: {ex.Message}"); task_result = ERROR_CODE.READ_EXCEPTION_1; } return(task_result); }