using BlazorApp.Models.Canopen; namespace BlazorApp.Models { public class CanopenDecoder { public static string GetMeaning(uint id) { if (id == 0x080) return "SYNC"; if (id >= 0x081 && id <= 0x0FF) return $"EMCY (Node {id - 0x080})"; if (id >= 0x700 && id <= 0x77F) return $"Heartbeat (Node {id - 0x700})"; if (id >= 0x180 && id <= 0x4FF) { int pdoIndex = (int)((id - 0x180) / 0x100) + 1; int nodeId = (int)(id - (0x180 + (pdoIndex - 1) * 0x100)); return $"TPDO{pdoIndex} (Node {nodeId})"; } return "Unknown"; } public static string GetValue(uint id, byte[] data, byte length) { if (id >= 0x180 && id <= 0x4FF) { int pdoIndex = (int)((id - 0x180) / 0x100) + 1; int nodeId = (int)(id - (0x180 + (pdoIndex - 1) * 0x100)); var decoder = CanopenDeviceRegistry.GetDecoder(nodeId); if (decoder != null) return decoder.DecodeTpdo(pdoIndex, data, length); } if (id >= 0x700 && id <= 0x77F && length >= 1) return DecodeNmtState(data[0]); return "No Error"; } private static string DecodeNmtState(byte value) { return value switch { 0x00 => "Boot-up", 0x04 => "Stopped", 0x05 => "Operational", 0x7F => "Pre-operational", _ => $"Unknown (0x{value:X2})" }; } } }