using BlazorApp.Models.Canopen; using BlazorApp.Models.Canopen.Eds; namespace BlazorApp.Models.Canopen.Eds { public class EdsDeviceDecoder : ICanopenDeviceDecoder { private readonly EdsDevice _device; public int NodeId => _device.NodeId; public EdsDeviceDecoder(EdsDevice device) { _device = device; } public string DecodeTpdo(int pdoIndex, byte[] data, byte length) { if (!_device.Tpdos.TryGetValue(pdoIndex, out var tpdo)) return "-"; var results = new List(); foreach (var obj in tpdo.Objects) { ulong raw = ReadBits(data, obj.BitOffset, obj.BitLength); double value = raw * obj.Factor; results.Add($"{obj.Name}: {value:F2} {obj.Unit}"); } return string.Join(" | ", results); } private static ulong ReadBits(byte[] data, int bitOffset, int bitLength) { ulong value = 0; int byteOffset = bitOffset / 8; for (int i = 0; i < bitLength / 8; i++) { value |= (ulong)data[byteOffset + i] << (8 * i); } return value; } } }