using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using RobotNet10.Shared.Geometry;
using RobotNet10.RobotApp.Devices;
using RobotNet10.Shared.Sensor;
using RobotNet10.RobotApp.Client.Shared.Devices;
namespace RobotNet10.RobotApp.Hubs;
///
/// SignalR Hub cho IMU device - cung cấp real-time IMU data
///
[Authorize]
public class InertialMeasurementUnitHub(IDeviceProvider deviceProvider) : Hub
{
///
/// Lấy thông tin device (DeviceName) theo device ID
///
public async Task GetDeviceInfo(string deviceId)
{
var device = deviceProvider.GetDevice(deviceId);
if (device is not IInertialMeasurementUnit)
{
return null;
}
return new DeviceInfoDto
{
DeviceId = device.DeviceId,
DeviceName = device.DeviceName
};
}
///
/// Lấy thông tin IMU theo device ID
///
public async Task GetImuData(string deviceId)
{
var device = deviceProvider.GetDevice(deviceId);
if (device is not IInertialMeasurementUnit imu)
{
return null;
}
return await imu.ReadAllDataAsync();
}
///
/// Đọc tất cả dữ liệu IMU
///
public async Task ReadAllData(string deviceId)
{
var device = deviceProvider.GetDevice(deviceId);
if (device is not IInertialMeasurementUnit imu)
{
return null;
}
return await imu.ReadAllDataAsync();
}
///
/// Lấy dictionary properties hiện tại của device (để hiển thị trên UI)
///
public Task?> GetDeviceProperties(string deviceId)
{
var device = deviceProvider.GetDevice(deviceId);
if (device is not IInertialMeasurementUnit)
{
return Task.FromResult?>(null);
}
var props = device.Properties.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
return Task.FromResult?>(props);
}
///
/// Lấy danh sách mô tả properties của device (để hiển thị trên UI)
///
public Task?> GetDevicePropertyDescriptions(string deviceId)
{
var device = deviceProvider.GetDevice(deviceId);
if (device is not IInertialMeasurementUnit)
{
return Task.FromResult?>(null);
}
var list = device.PropertyDescriptions
.Select(p => new PropertyDescription
{
Key = p.Key,
DisplayName = p.DisplayName,
Description = p.Description,
DataType = p.DataType,
Unit = p.Unit,
DefaultValue = p.DefaultValue,
IsReadOnly = p.IsReadOnly,
DisplayOrder = p.DisplayOrder,
Category = p.Category,
Format = p.Format
})
.ToList();
return Task.FromResult?>(list);
}
}