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); } }