using UnityEngine;
namespace SmartBowSDK
{
///
/// 射箭检测器
///
public class ShootChecker_SDK : MonoBehaviour
{
public SmartBowHelper smartBowHelper;
///
/// 游戏里箭的速度
///
public float gameArrowSpeed = 0;
///
/// 游戏里箭的重量
///
public float gameArrowWeight = 20;
///
/// 现实里箭的重量
///
public float solidArrowWeight = 75;
///
/// 上一次的射击数据ID
///
private int _lastShootID = -1;
///
/// 当收到红外数据时
///
///
public void OnInfraredDataReceived(byte[] bytes)
{
//序号
int id = bytes[1];
if (id == _lastShootID) return; //因为硬件为了避免丢包,会连续发几条相同射击通知过来
_lastShootID = id;
//时区1耗时
float time1 = bytes[2] * 0.1f;
//时区2耗时
float time2 = bytes[3] * 0.1f;
//时区耗时总和
float totalTime = time1 + time2;
//校验和
int sumCheck = (bytes[0] + bytes[1] + bytes[2] + bytes[3]) & 0xff;
//校验和比较结果
bool sumCheckRes = sumCheck == bytes[4];
//实体箭速度
float solidArrowSpeed = 0.05f / (totalTime / 1000f);
//通过动能定理求箭的速度(实体箭质量*实体箭速度^2=游戏中箭的质量*游戏中箭的速度^2)
gameArrowSpeed = Mathf.Sqrt(solidArrowSpeed * solidArrowSpeed * solidArrowWeight / gameArrowWeight);
//打印
string logInfo = $"序号{id},时区1:{time1}毫秒,时区2:{time2}毫秒,校验:{sumCheckRes},实体箭速度:{solidArrowSpeed}m/s,游戏箭速度:{gameArrowSpeed}m/s";
SmartBowLogger.Log(this, logInfo);
//收到正确的射箭数据,就回复硬件,否则n毫秒后硬件会认为丢包而进行重传
if (sumCheckRes) smartBowHelper.bluetoothAim.ReplyInfraredShoot();
//通知九轴算法,因为射箭抖动会使算法计算的姿态角产生误差
smartBowHelper.aimHandler.NotifyAxisOnShot();
smartBowHelper.InvokeOnShooting(gameArrowSpeed);
}
///
/// 回去枪指令
///
///
public void ReplyGun(byte[] bytes)
{
byte[] response = BluetoothDecryptor.GetResponse(bytes);
smartBowHelper.bluetoothAim.ReplyByte(response);
}
///
/// 枪的弹夹状态
/// 0x00 弹夹分离,0x01 上弹夹
///
///
public void UpdateTheMagazine(byte[] bytes)
{
Debug.Log("切换弹夹后:" + System.BitConverter.ToString(bytes));
if (bytes[1] == 0x00 )
{
smartBowHelper.InvokeOnBleDevice(BluetoothDeviceType.Pistol1, BluetoothDeviceStatus.MagazineSeparation);
}
else if(bytes[1] == 0x01) {
smartBowHelper.InvokeOnBleDevice(BluetoothDeviceType.Pistol1, BluetoothDeviceStatus.MagazineLoading);
}
}
}
}