diff --git a/ProftaakRH/BikeSimulator.cs b/ProftaakRH/BikeSimulator.cs index 4b106bc..5664f9e 100644 --- a/ProftaakRH/BikeSimulator.cs +++ b/ProftaakRH/BikeSimulator.cs @@ -1,11 +1,147 @@ -using System; +using LibNoise.Primitive; +using System; using System.Collections.Generic; +using System.Linq; using System.Text; +using System.Threading; + + namespace Hardware.Simulators { - class BikeSimulator + class BikeSimulator : IHandler { IDataConverter dataConverter; + private int elapsedTime = 0; + private int eventCounter = 0; + private double distanceTraveled = 0; + private int equipmentType = 25; + private double speed = 0; + private int BPM = 0; + private int cadence = 0; + private double resistance = 0; + private double power; + private double accPower; + + byte[] speedArray; + byte[] powerArray; + byte[] accPowerArray; + + + + public BikeSimulator(IDataConverter dataConverter) + { + this.dataConverter = dataConverter; + } + public void StartSimulation() + { + //Example BLE Message + //4A-09-4E-05-19-16-00-FF-28-00-00-20-F0 + + float x = 0.0f; + + //Perlin for Random values + ImprovedPerlin improvedPerlin = new ImprovedPerlin(0,LibNoise.NoiseQuality.Best); + + while (true) + { + CalculateVariables(improvedPerlin.GetValue(x)+1); + + //Simulate sending data + dataConverter.Bike(GenerateBike0x19()); + dataConverter.Bike(GenerateBike0x10()); + dataConverter.BPM(GenerateHeart()); + + Thread.Sleep(1000); + + x += 0.1f; + eventCounter++; + elapsedTime++; + } + + } + + //Generate an ANT message for page 0x19 + private byte[] GenerateBike0x19() + { + byte statByte = (byte)(powerArray[1] >> 4); + byte[] bikeByte = { 0x19, Convert.ToByte(eventCounter%256), Convert.ToByte(cadence%254), accPowerArray[0], accPowerArray[1], powerArray[0], statByte, 0x20 }; + return bikeByte; + } + + //Generate an ANT message for page 0x10 + private byte[] GenerateBike0x10() + { + byte[] bikeByte = { 0x10, Convert.ToByte(equipmentType), Convert.ToByte(elapsedTime*4%64), Convert.ToByte(distanceTraveled), speedArray[0], speedArray[1], Convert.ToByte(BPM), 0xFF }; + return bikeByte; + } + + //Generate an ANT message for BPM + private byte[] GenerateHeart() + { + byte[] hartByte = { 0x00, Convert.ToByte(BPM)}; + return hartByte; + } + + //Generate an ANT message for resistance + public byte[] GenerateResistance(float percentage) + { + byte[] antMessage = new byte[13]; + antMessage[0] = 0x4A; + antMessage[1] = 0x09; + antMessage[2] = 0x4E; + antMessage[3] = 0x05; + antMessage[4] = 0x30; + for (int i = 5; i < 11; i++) + { + antMessage[i] = 0xFF; + } + antMessage[11] = (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 < 12; i++) + { + checksum ^= antMessage[i]; + } + + antMessage[12] = checksum;//reminder that i am dumb :P + + return antMessage; + } + + //Calculates the needed variables + //Input perlin value + private void CalculateVariables(float perlin) + { + this.speed = perlin * 5 / 0.01 ; + short sped = (short)speed; + speedArray = BitConverter.GetBytes(sped); + this.distanceTraveled = (distanceTraveled+(speed*0.01)) % 256; + this.BPM = (int) (perlin * 80); + this.cadence = (int)speed/6; + this.power = ((1 + resistance) * speed)/14 % 4094; + this.accPower = (this.accPower + this.power) % 65536; + // TO DO power to power LSB & MSN + powerArray = BitConverter.GetBytes((short)this.power); + accPowerArray = BitConverter.GetBytes((short)accPower); + } + + //Set resistance in simulated bike + public void setResistance(byte[] bytes) + { + //TODO check if message is correct + if(bytes.Length == 13) + { + this.resistance = Convert.ToDouble(bytes[11])/2; + } + } + } + + //Interface for receiving a message on the simulated bike + interface IHandler + { + void setResistance(byte[] bytes); + } } diff --git a/ProftaakRH/Main.cs b/ProftaakRH/Main.cs index 2d3ffca..0938089 100644 --- a/ProftaakRH/Main.cs +++ b/ProftaakRH/Main.cs @@ -1,28 +1,23 @@ -using System; +using System; using System.Collections.Generic; using System.Text; using Hardware; -using System.Threading; +using Hardware.Simulators; namespace ProftaakRH { - class Program + class Program { - - static void Main(string[] args) + static void Main(string[] agrs) { IDataConverter dataConverter = new DataConverter(); BLEHandler bLEHandler = new BLEHandler(dataConverter); + //BikeSimulator bikeSimulator = new BikeSimulator(dataConverter); + //bikeSimulator.setResistance(bikeSimulator.GenerateResistance(1f)); + //bikeSimulator.StartSimulation(); - bLEHandler.Connect(); - while (!bLEHandler.Running) - { - Thread.Yield(); - } - - bLEHandler.setResistance(25); bool running = true; while (running) { diff --git a/ProftaakRH/ProftaakRH.csproj b/ProftaakRH/ProftaakRH.csproj index ca49088..8f98a2c 100644 --- a/ProftaakRH/ProftaakRH.csproj +++ b/ProftaakRH/ProftaakRH.csproj @@ -4,6 +4,10 @@ Exe netcoreapp3.1 + + + + .\dll\BLELibrary.dll