BalanceRobotUI/Assets/Scripts/ReceiveData.cs

114 lines
4.6 KiB
C#

using System;
using GameDev.UDP;
using UnityEngine;
using UnityEngine.Serialization;
[RequireComponent(typeof(UDPManager))]
public class ReceiveData : MonoBehaviour
{
[Header("Connections")]
[SerializeField] private UDPManager _udpManager;
[Header("Config")]
[SerializeField] private float _sampleTimeSetting;
[Header("State")]
[SerializeField] private float _updateRateHz;
[SerializeField] private ulong _packagesReceived;
private byte[] ReceivedData { get; set; }
private int _newPackages;
private float _sampleTime;
[field: Header("ReceivedData")]
[field: SerializeField] private byte Watchdog { get; set; }
[field: SerializeField] private byte States { get; set; }
[field: SerializeField] private int M1SpeedCmd { get; set; }
[field: SerializeField] private int M2SpeedCmd { get; set; }
[field: SerializeField] private float AccelerometerPitch { get; set; }
[field: SerializeField] private float FilteredPitch { get; set; }
[field: SerializeField] private float PitchRate { get; set; }
[field: SerializeField] private float RemSpeedRef { get; set; }
[field: SerializeField] private float RemTurnSpeedRef { get; set; }
[field: SerializeField] private float ScContOut { get; set; }
[field: SerializeField] private float TcContOut { get; set; }
[field: SerializeField] private float OlContOut { get; set; }
[field: SerializeField] private float RefIL { get; set; }
[field: SerializeField] private float ActIL { get; set; }
[field: SerializeField] private float ErrorIL { get; set; }
[field: SerializeField] private float ILContOut { get; set; }
[field: SerializeField] private float IerrorIL { get; set; }
[field: SerializeField] private float ILAntiWindup { get; set; }
[field: SerializeField] private float SpeedCmd1 { get; set; }
[field: SerializeField] private float SpeedCmd2 { get; set; }
[field: SerializeField] private float BotLinVel { get; set; }
[field: SerializeField] private float BotAngVel { get; set; }
[field: SerializeField] private float LeftMotorAngVel { get; set; }
[field: SerializeField] private float RightMotorAngVel { get; set; }
[field: SerializeField] private int M1Raw { get; set; }
[field: SerializeField] private int M2Raw { get; set; }
private void OnEnable()
{
_sampleTime = _sampleTimeSetting;
_udpManager.ReceivedNewUdpData += ProcessData;
}
private void OnDisable()
{
_udpManager.ReceivedNewUdpData -= ProcessData;
}
private void ProcessData()
{
_packagesReceived++;
_newPackages++;
ReceivedData = _udpManager.Data;
var i = 0;
Watchdog = ReceivedData[i];
States = ReceivedData[i += 1];
M1SpeedCmd = BitConverter.ToInt16(ReceivedData, i += 1);
M2SpeedCmd = BitConverter.ToInt16(ReceivedData, i += 2);
AccelerometerPitch = BitConverter.ToSingle(ReceivedData, i += 2);
FilteredPitch = BitConverter.ToSingle(ReceivedData, i += 4);
PitchRate = BitConverter.ToSingle(ReceivedData, i += 4);
RemSpeedRef = BitConverter.ToSingle(ReceivedData, i += 4);
RemTurnSpeedRef = BitConverter.ToSingle(ReceivedData, i += 4);
ScContOut = BitConverter.ToSingle(ReceivedData, i += 4);
TcContOut = BitConverter.ToSingle(ReceivedData, i += 4);
OlContOut = BitConverter.ToSingle(ReceivedData, i += 4);
RefIL = BitConverter.ToSingle(ReceivedData, i += 4);
ActIL = BitConverter.ToSingle(ReceivedData, i += 4);
ErrorIL = BitConverter.ToSingle(ReceivedData, i += 4);
ILContOut = BitConverter.ToSingle(ReceivedData, i += 4);
IerrorIL = BitConverter.ToSingle(ReceivedData, i += 4);
ILAntiWindup = BitConverter.ToSingle(ReceivedData, i += 4);
SpeedCmd1 = BitConverter.ToSingle(ReceivedData, i += 4);
SpeedCmd2 = BitConverter.ToSingle(ReceivedData, i += 4);
BotLinVel = BitConverter.ToSingle(ReceivedData, i += 4);
BotAngVel = BitConverter.ToSingle(ReceivedData, i += 4);
LeftMotorAngVel = BitConverter.ToSingle(ReceivedData, i += 4);
RightMotorAngVel = BitConverter.ToSingle(ReceivedData, i += 4);
M1Raw = BitConverter.ToInt32(ReceivedData, i += 4);
M2Raw = BitConverter.ToInt32(ReceivedData, i += 4);
}
private void FixedUpdate()
{
CalculateReceiveRate();
}
private void CalculateReceiveRate()
{
if (_sampleTime < 0)
{
_updateRateHz = _newPackages;
_newPackages = 0;
_sampleTime = _sampleTimeSetting;
}
else
{
_sampleTime -= Time.fixedDeltaTime;
}
}
}