using System.Threading; using System.Threading.Tasks; using ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Shared.Contracts; namespace ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Host.Backend; /// /// Safe default when the deployment hasn't configured a real Fwlib32 backend. /// Returns structured failure responses instead of throwing so the Proxy can map the /// error to BadDeviceFailure and surface a clear operator message pointing at /// docs/v2/focas-deployment.md. Used when OTOPCUA_FOCAS_BACKEND is unset /// or set to unconfigured. /// public sealed class UnconfiguredFocasBackend : IFocasBackend { private const uint BadDeviceFailure = 0x80550000u; private const string Reason = "FOCAS Host is running without a real Fwlib32 backend. Set OTOPCUA_FOCAS_BACKEND=fwlib32 " + "and ensure Fwlib32.dll is on PATH — see docs/v2/focas-deployment.md."; public Task OpenSessionAsync(OpenSessionRequest request, CancellationToken ct) => Task.FromResult(new OpenSessionResponse { Success = false, Error = Reason, ErrorCode = "NoFwlibBackend" }); public Task CloseSessionAsync(CloseSessionRequest request, CancellationToken ct) => Task.CompletedTask; public Task ReadAsync(ReadRequest request, CancellationToken ct) => Task.FromResult(new ReadResponse { Success = false, StatusCode = BadDeviceFailure, Error = Reason }); public Task WriteAsync(WriteRequest request, CancellationToken ct) => Task.FromResult(new WriteResponse { Success = false, StatusCode = BadDeviceFailure, Error = Reason }); public Task PmcBitWriteAsync(PmcBitWriteRequest request, CancellationToken ct) => Task.FromResult(new PmcBitWriteResponse { Success = false, StatusCode = BadDeviceFailure, Error = Reason }); public Task ProbeAsync(ProbeRequest request, CancellationToken ct) => Task.FromResult(new ProbeResponse { Healthy = false, Error = Reason, ObservedAtUtcUnixMs = System.DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }); }