using Assets.Scripts.Ble; using Assets.Scripts.Devices.Ble.Interfaces; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Assets.Scripts.Devices.Ble.Characteristic { public class TacxFecNotify : ICharacteristic { public Guid Uuid => ServiceUuids.Characteristics.TacxFecRead; public Guid ServiceUuid => ServiceUuids.Get(ServiceUuids.TacxBle).IdGuid; public virtual bool IsOptional { get { return false; } } public double Speed { get; set; } private int _Power; public int Power { get { return _Power; } set { _Power = DeviceValueFilter.Power(value); //Debug.Log(_Power); } } private int _Cadence; public int Cadence { get { return _Cadence; } set { _Cadence = DeviceValueFilter.Cadence(value); } } public void HandleAttributeReceived(byte[] data) { //throw new NotImplementedException(); var responseId = data[2]; if (responseId != (byte)ANT_Managed_Library.ANT_ReferenceLibrary.ANTMessageID.BROADCAST_DATA_0x4E) { return; } var data1 = data.Skip(3).ToArray(); var pageNumber = data1[1]; switch (pageNumber) { case 16: { HandleGeneralDataPage(data1.Skip(1).ToArray()); } break; case 19: { //lastInstCadence = data1[5]; } break; case 21: //bike data case 22: //Row data, same format as bike for cad and power case 20: //Elliptical, same format as bike for cad and power case 24: //Nordic Skier, same format as bike for cad and power { //lastInstCadence = data1[5]; //lastInstPower = (ushort)(data1[6] + (data1[7] << 8)); //System.Console.Out.WriteLine("Cadence:" + response.messageContents[5] + ",Power:" + (response.messageContents[6] + (response.messageContents[7] << 8))); //System.Console.Out.WriteLine("SPM:"+response.messageContents[5]+"Power:"+(response.messageContents[6] + (response.messageContents[7] << 8))); } break; case 25: HandleTrainerDataPage(data1.Skip(1).ToArray()); break; default: break; } } private void HandleGeneralDataPage(byte[] dataPayload) { try { byte equipmentType = dataPayload[1]; byte elapsedTime = dataPayload[2]; byte distanceTraveled = dataPayload[3]; //byte heartRate = dataPayload[6]; //FecPageHandler.HeartRateDataSource heartRateDataSource = (FecPageHandler.HeartRateDataSource)(dataPayload[7] & 3); //bool traveledEnabled = (dataPayload[7] & 4) == 1; //bool distanceTraveledEnabled = (dataPayload[7] & 8) == 1; //FecPageHandler.FeState feState = (FecPageHandler.FeState)(dataPayload[7] & 128); //bool lapToggle = (dataPayload[7] & 128) == 1; //this._fecGeneralData = new FecGeneralData(equipmentType, elapsedTime, distanceTraveled, (short)num, feState, lapToggle, heartRate, heartRateDataSource, traveledEnabled, distanceTraveledEnabled); bool traveledEnabled = ((int)dataPayload[7] & 4) == 1; bool distanceTraveledEnabled = ((int)dataPayload[7] & 8) == 1; int num1 = (int)dataPayload[4] | (int)dataPayload[5] << 8; // Instantaneous speed, m/s Speed = (double)num1 / 1000.0 * 60.0 * 60.0 / 1000.0; //转换成公里/小时 //Console.WriteLine(num1 +"-----"+Speed); //fecDevice.UpdateSpeed(new double?(value)); //PubCommData.Speed = num2; //byte? b2 = (heartRate == 255) ? null : new byte?(heartRate); //int? xl = b2.HasValue ? new int?((int)b2.GetValueOrDefault()) : 0; //Console.WriteLine("最新速度" + Speed); //Console.WriteLine("最新心率" + xl); //string str = ""; //for (int i = 0; i < response.messageContents.Length; i++) //{ // str += "," + response.messageContents[i]; //} //PubCommData.sp = "速度:" + str; } catch (Exception) { } } private void HandleTrainerDataPage(byte[] dataPayload) { //if (response.messageContents.Length < 11) break; //double value = 0; //for (int i = 0; i < response.messageContents.Length; i++) //{ // if (i < 8) // { // value += response.messageContents[i]; // } //} //double value1 = response.messageContents[10] * 256 + response.messageContents[9]; //double power = response.messageContents[7] * 256 + response.messageContents[6]; //Console.WriteLine("power:" + power); //PubCommData.power = power; try { if (dataPayload[5] > 0) { //Console.WriteLine(dataPayload[5] + "," + dataPayload[6]);//瞬时功率 } byte num1 = dataPayload[1]; byte num2 = dataPayload[2]; int accumulatedPower = (int)dataPayload[3] | (int)dataPayload[4] << 8; int instantaneousPower = (int)dataPayload[5] | ((int)dataPayload[6] & 15) << 8; //Watts bool bikePowerCalibrationRequired = ((int)dataPayload[6] >> 4 & 1) == 1; bool resistanceCalibrationRequired = ((int)dataPayload[6] >> 5 & 1) == 1; bool userConfigurationRequired = ((int)dataPayload[6] >> 6 & 1) == 1; bool speedIsTooLow = ((int)dataPayload[7] & 1) == 1; bool speedIsTooHigh = ((int)dataPayload[7] & 2) == 1; //PubCommData.power = instantaneousPower; Power = instantaneousPower; //bool bikePowerCalibrationRequired = (response.messageContents[6] >> 4 & 1) == 1; //bool resistanceCalibrationRequired = (response.messageContents[6] >> 5 & 1) == 1; //bool flag = (response.messageContents[6] >> 6 & 1) == 1; //bool speedIsTooLow = (response.messageContents[7] & 1) == 1; //bool speedIsTooHigh = (response.messageContents[7] & 2) == 1; //FecPageHandler.FeState feState = (FecPageHandler.FeState)(dataPayload[7] & 112); //bool lapToggle = (dataPayload[7] & 128) == 1; //this._fecTrainerData = new FecTrainerData((int)eventCount, (int)b, accumulatedPower, num, bikePowerCalibrationRequired, resistanceCalibrationRequired, flag, speedIsTooLow, speedIsTooHigh, feState, lapToggle); //device.UpdatePower(new int?(num)); byte? nullable = (int)num2 == (int)byte.MaxValue ? new byte?() : new byte?(num2); int? cadence = nullable.HasValue ? new int?((int)nullable.GetValueOrDefault()) : new int?(); this.Cadence = cadence.GetValueOrDefault(); //Console.WriteLine($"power:{ instantaneousPower },Cadence:{ cadence }, data:{ string.Join(",", dataPayload) }"); if (!userConfigurationRequired) return; //UpdateUserConfiguration(); } catch (Exception) { } } public virtual void SetUnavailable() { } } }