66 lines
2.3 KiB
Go
66 lines
2.3 KiB
Go
// 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
|