207 lines
8.1 KiB
C#
207 lines
8.1 KiB
C#
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;
|
|
using UnityEngine;
|
|
|
|
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()
|
|
{
|
|
}
|
|
}
|
|
}
|