This commit is contained in:
shinichi
2020-09-09 17:09:08 +02:00
parent 11772f33b7
commit 2854684b86
3 changed files with 170 additions and 124 deletions

157
ProftaakRH/BLEHandler.cs Normal file
View File

@@ -0,0 +1,157 @@
using System;
using System.Collections.Generic;
using System.Text;
using Avans.TI.BLE;
using System.Threading;
using System.Security.Cryptography;
namespace Hardware
{
class BLEHandler
{
IDataConverter dataConverter;
private BLE bleBike;
private BLE bleHeart;
public bool Running { get; set; }
public BLEHandler(IDataConverter dataConverter)
{
this.dataConverter = dataConverter;
bool running = false;
}
public void Connect()
{
BLE bleBike = new BLE();
Thread.Sleep(1000); // We need some time to list available devices
// List available devices
List<String> bleBikeList = bleBike.ListDevices();
Console.WriteLine("Devices found: ");
foreach (var name in bleBikeList)
{
Console.WriteLine(name);
if (name.Contains("Avans Bike"))
{
Console.WriteLine("connecting to {0}", name);
Connect(name);
break;
}
}
}
public async void Connect(string deviceName)
{
int errorCode = 0;
bleBike = new BLE();
bleHeart = new BLE();
errorCode = errorCode = await bleBike.OpenDevice(deviceName);
if (errorCode > 0)
{
disposeBLE();
return;
}
// Set service
errorCode = await bleBike.SetService("6e40fec1-b5a3-f393-e0a9-e50e24dcca9e");
if (errorCode > 0)
{
disposeBLE();
return;
}
// Subscribe
bleBike.SubscriptionValueChanged += BleBike_SubscriptionValueChanged;
errorCode = await bleBike.SubscribeToCharacteristic("6e40fec2-b5a3-f393-e0a9-e50e24dcca9e");
if (errorCode > 0)
{
disposeBLE();
return;
}
// Heart rate
errorCode = await bleHeart.OpenDevice(deviceName);
if (errorCode > 0)
{
disposeBLE();
return;
}
errorCode = await bleHeart.SetService("HeartRate");
if (errorCode > 0)
{
disposeBLE();
return;
}
bleHeart.SubscriptionValueChanged += BleBike_SubscriptionValueChanged;
errorCode = await bleHeart.SubscribeToCharacteristic("HeartRateMeasurement");
if (errorCode > 0)
{
disposeBLE();
return;
}
Console.WriteLine("connected to BLE");
this.Running = true;
}
private void BleBike_SubscriptionValueChanged(object sender, BLESubscriptionValueChangedEventArgs e)
{
//Console.WriteLine("Received from {0}: {1}", e.ServiceName,
// BitConverter.ToString(e.Data).Replace("-", " "));
//send to dataconverter
if (e.ServiceName == "6e40fec2-b5a3-f393-e0a9-e50e24dcca9e")
{
byte[] payload = new byte[8];
Array.Copy(e.Data, 4, payload, 0, 8);
this.dataConverter.Bike(payload);
}
else if (e.ServiceName == "00002a37-0000-1000-8000-00805f9b34fb")
{
this.dataConverter.BPM(e.Data);
}
else
{
Console.WriteLine("received data from unknown source {0}", e.ServiceName);
}
}
private void disposeBLE()
{
this.bleBike?.Dispose();
this.bleHeart?.Dispose();
this.Running = false;
}
public void setResistance(float percentage)
{
byte[] antMessage = new byte[13];
antMessage[0] = 0x4A;
antMessage[1] = 0x08;
antMessage[2] = 0x4E;
antMessage[3] = 0x05;
antMessage[4] = 0x30;
for (int i = 5; i < 11; i++)
{
antMessage[i] = 0xFF;
}
//antMessage[10] = (byte)Math.Max(Math.Min(Math.Round(percentage / 0.5), 255), 0);
antMessage[11] = 50; //hardcoded for testing
byte checksum = 0;
for (int i = 0; i < antMessage.Length -1; i++)
{
checksum ^= antMessage[i];
}
antMessage[12] = checksum;
bleBike.WriteCharacteristic("6E40FEC3-B5A3-F393-E0A9-E50E24DCCA9E", antMessage);
}
}
}