diff --git a/ProftaakRH/BLEReciever.cs b/ProftaakRH/BLEReciever.cs index 1105362..dfc5827 100644 --- a/ProftaakRH/BLEReciever.cs +++ b/ProftaakRH/BLEReciever.cs @@ -1,11 +1,129 @@ using System; using System.Collections.Generic; using System.Text; +using Avans.TI.BLE; +using System.Threading; +using System.Security.Cryptography; namespace Hardware { class BLEReciever { IDataConverter dataConverter; + private BLE bleBike; + private BLE bleHeart; + public bool running { get; set; } + + public BLEReciever(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 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; + } } } diff --git a/ProftaakRH/DataConverter.cs b/ProftaakRH/DataConverter.cs index 7378fe7..f4a783b 100644 --- a/ProftaakRH/DataConverter.cs +++ b/ProftaakRH/DataConverter.cs @@ -8,12 +8,77 @@ namespace Hardware { public void Bike(byte[] bytes) { - throw new NotImplementedException(); + if (bytes == null) + { + Console.WriteLine("HEY, didn't get bytes!\n-Bike DataConverter"); + } + else + if (bytes.Length == 8) + { + + switch (bytes[0]) + { + case 0x10: + if (bytes[1] != 25) + { + Console.WriteLine("WTF this isn't a bike"); + } + Console.WriteLine($"Time since start is: {bytes[2] / 4}s (Rollover every 4s)"); + Console.WriteLine($"Distance Traveled is : {bytes[3]}m (Rollover every 256m)"); + + int input = bytes[4] | (bytes[5] << 8); + Console.WriteLine($"Speed is : {input * 0.01}m/s (Range 65.534m/4)"); + if (bytes[6] != 0xFF) + { + Console.WriteLine("Heart rate byte: {0}", Convert.ToString(bytes[6],2)); + } + break; + case 0x19: + Console.WriteLine($"Event count: {bytes[1]} (Rollover 256)"); + if (bytes[2] != 0xFF) + { + Console.WriteLine($"Instantaneous cadence: {bytes[2]} RPM (Range 0-254)"); + + } + int accumPower = bytes[3] | (bytes[4] << 8); + + Console.WriteLine($"Accumulated power: {accumPower} watt (Rollover 65536)"); + //Console.WriteLine(); + break; + + default: + Console.WriteLine("HEY, I never heard of data page {0}\n-DataConverter", bytes[0]); + break; + } + } + else + { + Console.WriteLine("HEY, I didn't get 8 bytes!\n-DataConverter"); + } + Console.WriteLine(); } public void BPM(byte[] bytes) { - throw new NotImplementedException(); + if (bytes == null) + { + Console.WriteLine("HEY, didn't get bytes!\n-BPM DataConverter"); + return; + } + if (bytes[0] != 0) + { + Console.WriteLine("HOLY SHIT i got flags!!! {0} now i can't do anything\n-BPM DataConverter", bytes[0]); + } + else if (bytes.Length != 2) + { + Console.WriteLine("bytes length is: {0}", bytes.Length); + } + else + { + Console.WriteLine("BPM: {0}", bytes[1]); + + } + Console.WriteLine(); } } diff --git a/ProftaakRH/FietsDemo.cs b/ProftaakRH/FietsDemo.cs index 1f86c3a..c2db979 100644 --- a/ProftaakRH/FietsDemo.cs +++ b/ProftaakRH/FietsDemo.cs @@ -11,15 +11,14 @@ namespace FietsDemo { internal class Program { - /*static void Main(string[] args) - { - foo foo = new foo(); - //BLEReceiver bLEReceiver = new BLEReceiver(foo); + //static void Main(string[] args) + //{ + // foo foo = new foo(); + // BLEReceiver bLEReceiver = new BLEReceiver(foo); - - //bLEReceiver.ConnectToBLE(); - Console.Read(); - }*/ + // bLEReceiver.ConnectToBLE(); + // Console.Read(); + //} interface IFoo { @@ -151,7 +150,7 @@ namespace FietsDemo { Console.WriteLine("Foo class received {0}", Convert.ToString(bytes)); - + } }