using Peak.Can.Basic; using IOModuleTestBlazor.Models; namespace IOModuleTestBlazor.Services; public interface ICanService { bool IsConnected { get; } string ChannelName { get; } Bitrate CurrentBitrate { get; } /// /// Raised on the worker thread each time a CAN message passes all filters. /// Subscribers must marshal UI updates with InvokeAsync(StateHasChanged). /// event Action MessageReceived; // ── Filters ─────────────────────────────────────────────────────────────── IReadOnlyList Filters { get; } CanFilter AddFilter(CanFilter filter); bool RemoveFilter(Guid id); void ClearFilters(); // ── Bitmasks ────────────────────────────────────────────────────────────── IReadOnlyList Bitmasks { get; } CanBitmask AddBitmask(CanBitmask bitmask); bool RemoveBitmask(Guid id); void ClearBitmasks(); // ── Helpers used by the worker ──────────────────────────────────────────── bool PassesFilter(uint messageId); IReadOnlyDictionary ExtractSignals(uint messageId, byte[] data); void PublishMessage(CanMessageDto dto); // ── Channel management ──────────────────────────────────────────────────── /// Returns all PCAN USB channels that are currently available. IReadOnlyList GetAvailableChannels(); /// /// Asks the worker to reinitialise on the next loop iteration. /// Non-blocking — the actual reconnect happens asynchronously. /// void RequestReinitialize(PcanChannel channel, Bitrate bitrate); /// Called by the worker to pick up a pending reinit request. bool TryConsumePendingReinit(out PcanChannel channel, out Bitrate bitrate); // ── PCAN passthrough ────────────────────────────────────────────────────── void Initialize(PcanChannel channel, Bitrate bitrate); void Uninitialize(); PcanStatus Read(out PcanMessage msg, out ulong timestamp); PcanStatus Write(PcanMessage msg); }