From 3e3a0cf4c4b056e2f3d16f55d326a98ec066daca Mon Sep 17 00:00:00 2001 From: shinichi Date: Wed, 9 Sep 2020 12:27:37 +0200 Subject: [PATCH 1/7] wip lunch break --- ProftaakRH/BLEReciever.cs | 69 +++++++++++++++++++++++++++++++++++++++ ProftaakRH/FietsDemo.cs | 17 +++++----- ProftaakRH/Main.cs | 13 +++++++- 3 files changed, 89 insertions(+), 10 deletions(-) diff --git a/ProftaakRH/BLEReciever.cs b/ProftaakRH/BLEReciever.cs index 1105362..d0d4d0f 100644 --- a/ProftaakRH/BLEReciever.cs +++ b/ProftaakRH/BLEReciever.cs @@ -1,11 +1,80 @@ using System; using System.Collections.Generic; using System.Text; +using Avans.TI.BLE; +using System.Threading; + namespace Hardware { class BLEReciever { IDataConverter dataConverter; + + public BLEReciever(IDataConverter dataConverter) + { + this.dataConverter = dataConverter; + } + + public async void Connect() + { + int errorCode = 0; + BLE bleBike = new BLE(); + BLE bleHeart = 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")) + { + Connect(name); + Console.WriteLine("connecting to {0}", name); + break; + } + } + } + public async void Connect(string deviceName) + { + int errorCode = 0; + BLE bleBike = new BLE(); + BLE bleHeart = new BLE(); + + errorCode = errorCode = await bleBike.OpenDevice(deviceName); + // __TODO__ Error check + + var services = bleBike.GetServices; + foreach (var service in services) + { + Console.WriteLine($"Service: {service}"); + } + + // Set service + errorCode = await bleBike.SetService("6e40fec1-b5a3-f393-e0a9-e50e24dcca9e"); + // __TODO__ error check + + // Subscribe + bleBike.SubscriptionValueChanged += BleBike_SubscriptionValueChanged; + errorCode = await bleBike.SubscribeToCharacteristic("6e40fec2-b5a3-f393-e0a9-e50e24dcca9e"); + + // Heart rate + errorCode = await bleHeart.OpenDevice(deviceName); + + await bleHeart.SetService("HeartRate"); + + bleHeart.SubscriptionValueChanged += BleBike_SubscriptionValueChanged; + await bleHeart.SubscribeToCharacteristic("HeartRateMeasurement"); + } + + private void BleBike_SubscriptionValueChanged(object sender, BLESubscriptionValueChangedEventArgs e) + { + Console.WriteLine("Received from {0}: {1}, {2}", e.ServiceName, + BitConverter.ToString(e.Data).Replace("-", " "), + Encoding.UTF8.GetString(e.Data)); + //send to dataconverter + } } } diff --git a/ProftaakRH/FietsDemo.cs b/ProftaakRH/FietsDemo.cs index d95c24f..eb6d7fb 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 { @@ -144,7 +143,7 @@ namespace FietsDemo { Console.WriteLine("Foo class received {0}", Convert.ToString(bytes)); - + } } diff --git a/ProftaakRH/Main.cs b/ProftaakRH/Main.cs index 207d831..efad10b 100644 --- a/ProftaakRH/Main.cs +++ b/ProftaakRH/Main.cs @@ -1,10 +1,21 @@ using System; using System.Collections.Generic; using System.Text; +using Hardware; namespace ProftaakRH { - class Main + class Program { + + static void Main(string[] args) + { + IDataConverter dataConverter = new DataConverter(); + BLEReciever bLEReceiver = new BLEReciever(dataConverter); + + bLEReceiver.Connect("sdkgjnzsoifgnzaiof"); + + //Console.ReadLine(); + } } } From 87abee1207c1c0bd079c9cacc9456d403cab2a74 Mon Sep 17 00:00:00 2001 From: shinichi Date: Wed, 9 Sep 2020 13:43:59 +0200 Subject: [PATCH 2/7] error handling --- ProftaakRH/BLEReciever.cs | 62 ++++++++++++++++++++++++++++----------- ProftaakRH/Main.cs | 4 +-- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/ProftaakRH/BLEReciever.cs b/ProftaakRH/BLEReciever.cs index d0d4d0f..854d80f 100644 --- a/ProftaakRH/BLEReciever.cs +++ b/ProftaakRH/BLEReciever.cs @@ -10,17 +10,17 @@ namespace Hardware class BLEReciever { IDataConverter dataConverter; + BLE bleBike; + BLE bleHeart; public BLEReciever(IDataConverter dataConverter) { this.dataConverter = dataConverter; } - public async void Connect() + public void Connect() { - int errorCode = 0; BLE bleBike = new BLE(); - BLE bleHeart = new BLE(); Thread.Sleep(1000); // We need some time to list available devices // List available devices @@ -31,50 +31,78 @@ namespace Hardware Console.WriteLine(name); if (name.Contains("Avans Bike")) { - Connect(name); Console.WriteLine("connecting to {0}", name); + Connect(name); break; + } } } public async void Connect(string deviceName) { int errorCode = 0; - BLE bleBike = new BLE(); - BLE bleHeart = new BLE(); + bleBike = new BLE(); + bleHeart = new BLE(); errorCode = errorCode = await bleBike.OpenDevice(deviceName); - // __TODO__ Error check - - var services = bleBike.GetServices; - foreach (var service in services) + if (errorCode > 0) { - Console.WriteLine($"Service: {service}"); + disposeBLE(); + return; } // Set service errorCode = await bleBike.SetService("6e40fec1-b5a3-f393-e0a9-e50e24dcca9e"); - // __TODO__ error check + 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; + } - await bleHeart.SetService("HeartRate"); + errorCode = await bleHeart.SetService("HeartRate"); + if (errorCode > 0) + { + disposeBLE(); + return; + } bleHeart.SubscriptionValueChanged += BleBike_SubscriptionValueChanged; - await bleHeart.SubscribeToCharacteristic("HeartRateMeasurement"); + errorCode = await bleHeart.SubscribeToCharacteristic("HeartRateMeasurement"); + if (errorCode > 0) + { + disposeBLE(); + return; + } } private void BleBike_SubscriptionValueChanged(object sender, BLESubscriptionValueChangedEventArgs e) { - Console.WriteLine("Received from {0}: {1}, {2}", e.ServiceName, - BitConverter.ToString(e.Data).Replace("-", " "), - Encoding.UTF8.GetString(e.Data)); + Console.WriteLine("Received from {0}: {1}", e.ServiceName, + BitConverter.ToString(e.Data).Replace("-", " ")); //send to dataconverter } + + private void disposeBLE() + { + this.bleBike?.Dispose(); + this.bleHeart?.Dispose(); + } } } diff --git a/ProftaakRH/Main.cs b/ProftaakRH/Main.cs index efad10b..4625f5d 100644 --- a/ProftaakRH/Main.cs +++ b/ProftaakRH/Main.cs @@ -13,9 +13,9 @@ namespace ProftaakRH IDataConverter dataConverter = new DataConverter(); BLEReciever bLEReceiver = new BLEReciever(dataConverter); - bLEReceiver.Connect("sdkgjnzsoifgnzaiof"); + bLEReceiver.Connect(); - //Console.ReadLine(); + Console.ReadLine(); } } } From 8d9985ac89bebc60c03a20f59d6c2172452d22cd Mon Sep 17 00:00:00 2001 From: shinichi Date: Wed, 9 Sep 2020 13:44:50 +0200 Subject: [PATCH 3/7] BLEreceiver running bool --- ProftaakRH/BLEReciever.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ProftaakRH/BLEReciever.cs b/ProftaakRH/BLEReciever.cs index 854d80f..280fc73 100644 --- a/ProftaakRH/BLEReciever.cs +++ b/ProftaakRH/BLEReciever.cs @@ -10,12 +10,14 @@ namespace Hardware class BLEReciever { IDataConverter dataConverter; - BLE bleBike; - BLE bleHeart; + private BLE bleBike; + private BLE bleHeart; + public bool running { get; } public BLEReciever(IDataConverter dataConverter) { this.dataConverter = dataConverter; + bool running = false; } public void Connect() @@ -34,7 +36,7 @@ namespace Hardware Console.WriteLine("connecting to {0}", name); Connect(name); break; - + } } } @@ -90,6 +92,7 @@ namespace Hardware disposeBLE(); return; } + this.running = true; } private void BleBike_SubscriptionValueChanged(object sender, BLESubscriptionValueChangedEventArgs e) @@ -103,6 +106,7 @@ namespace Hardware { this.bleBike?.Dispose(); this.bleHeart?.Dispose(); + this.running = false; } } } From 650f308cf509e937a49f8504a9c7bc92c8774b14 Mon Sep 17 00:00:00 2001 From: shinichi Date: Wed, 9 Sep 2020 14:49:40 +0200 Subject: [PATCH 4/7] wip --- ProftaakRH/BLEReciever.cs | 25 ++++++++++++++--- ProftaakRH/DataConverter.cs | 55 +++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/ProftaakRH/BLEReciever.cs b/ProftaakRH/BLEReciever.cs index 280fc73..dfc5827 100644 --- a/ProftaakRH/BLEReciever.cs +++ b/ProftaakRH/BLEReciever.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text; using Avans.TI.BLE; using System.Threading; - +using System.Security.Cryptography; namespace Hardware { @@ -12,7 +12,7 @@ namespace Hardware IDataConverter dataConverter; private BLE bleBike; private BLE bleHeart; - public bool running { get; } + public bool running { get; set; } public BLEReciever(IDataConverter dataConverter) { @@ -92,14 +92,31 @@ namespace Hardware 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("-", " ")); + //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() diff --git a/ProftaakRH/DataConverter.cs b/ProftaakRH/DataConverter.cs index 7378fe7..1c9a4e3 100644 --- a/ProftaakRH/DataConverter.cs +++ b/ProftaakRH/DataConverter.cs @@ -8,12 +8,63 @@ 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)"); + break; + case 0x19: + + 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(); } } From bd40a117ec66c06117316e2885e6123f6102f478 Mon Sep 17 00:00:00 2001 From: shinichi Date: Wed, 9 Sep 2020 14:57:23 +0200 Subject: [PATCH 5/7] done with data page 0x10 byte 7 isn't checked --- ProftaakRH/DataConverter.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ProftaakRH/DataConverter.cs b/ProftaakRH/DataConverter.cs index 1c9a4e3..24d4bbc 100644 --- a/ProftaakRH/DataConverter.cs +++ b/ProftaakRH/DataConverter.cs @@ -27,6 +27,10 @@ namespace Hardware 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: From 3de18d7c23e8c11bbf94ccdb6ee9cb8f37e2c84d Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 9 Sep 2020 14:58:10 +0200 Subject: [PATCH 6/7] added read for byte 1 of page 25 --- ProftaakRH/DataConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProftaakRH/DataConverter.cs b/ProftaakRH/DataConverter.cs index 1c9a4e3..cad236d 100644 --- a/ProftaakRH/DataConverter.cs +++ b/ProftaakRH/DataConverter.cs @@ -29,7 +29,7 @@ namespace Hardware Console.WriteLine($"Speed is : {input * 0.01}m/s (Range 65.534m/4)"); break; case 0x19: - + Console.WriteLine($"Event count: {bytes[1]} (Rollover 256)"); break; default: From 53735b3cad6d2cc5793d17f76b4b74b19d8102b2 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 9 Sep 2020 15:17:13 +0200 Subject: [PATCH 7/7] added cadence and accumulated power --- ProftaakRH/DataConverter.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ProftaakRH/DataConverter.cs b/ProftaakRH/DataConverter.cs index ed79a28..f4a783b 100644 --- a/ProftaakRH/DataConverter.cs +++ b/ProftaakRH/DataConverter.cs @@ -15,6 +15,7 @@ namespace Hardware else if (bytes.Length == 8) { + switch (bytes[0]) { case 0x10: @@ -34,6 +35,15 @@ namespace Hardware 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: