// Package ca implements an EPICS Channel Access (CA) client in pure Go. // // It requires no CGo, no libca, and no EPICS installation on the build machine. // A single [Client] manages connections to one or more IOCs, multiplexing // channels over shared TCP virtual circuits that survive IOC restarts. // // # Quick start // // // Configure from standard EPICS environment variables. // cli, err := ca.NewClient(ctx, ca.ConfigFromEnv()) // if err != nil { ... } // defer cli.Close() // // // Subscribe to live monitor updates. // ch := make(chan proto.TimeValue, 16) // cancel, err := cli.Subscribe(ctx, "MY:PV", ch) // if err != nil { ... } // defer cancel() // for tv := range ch { // fmt.Println(tv.Timestamp, tv.Double) // } // // // One-shot read (current value). // tv, err := cli.Get(ctx, "MY:PV") // // // Retrieve full control-block metadata (units, display limits, enum strings). // ci, err := cli.GetCtrl(ctx, "MY:PV") // if ci.Double != nil { // fmt.Println(ci.Double.Units, ci.Double.UpperDispLimit) // } // // // Write a new value (fire-and-forget). // err = cli.Put(ctx, "MY:PV", 42.0) // // # Configuration // // [ConfigFromEnv] reads the standard EPICS CA environment variables: // // EPICS_CA_ADDR_LIST space-separated list of server addresses // EPICS_CA_AUTO_ADDR_LIST set to "NO" to disable local broadcast // // Alternatively, construct [Config] directly and pass to [NewClient]. // // # Protocol // // The library speaks Channel Access protocol version 4.13 over UDP (search, // port 5064) and TCP (data, port 5064). It does not use the CA Repeater; // it sends search requests directly to the addresses in [Config.AddrList]. // // UDP search uses exponential back-off (100 ms → 30 s) and retries until the // PV is found or the context is cancelled. // // # Reconnection // // When an IOC restarts, the library detects the broken TCP connection and // reconnects automatically. All active subscriptions are re-established // transparently after the new CREATE_CHAN handshake completes. // Callers blocked in [Client.Get] or [Client.Put] during a reconnect will // receive an error and should retry. // // # Thread safety // // All exported methods are safe for concurrent use from multiple goroutines. // A single [Client] can be shared across the entire application. package ca