76 lines
2.4 KiB
Go
76 lines
2.4 KiB
Go
package scpi
|
|
|
|
import "github.com/uopi/uopi/internal/datasource"
|
|
|
|
// Config is the [datasource.scpi] section. Each instrument is polled
|
|
// independently over its own TCP socket.
|
|
type Config struct {
|
|
Enabled bool `toml:"enabled"`
|
|
// PollIntervalMs is the default polling period for channels that do not
|
|
// override it. Zero → 1000 ms.
|
|
PollIntervalMs int `toml:"poll_interval_ms"`
|
|
Instruments []Instrument `toml:"instruments"`
|
|
}
|
|
|
|
// Instrument is one SCPI device reachable over a raw TCP socket. Address is
|
|
// "host:port"; the conventional SCPI-raw port 5025 is appended if absent.
|
|
type Instrument struct {
|
|
Name string `toml:"name"`
|
|
// Transport selects the link type. "raw" (default) is line-based SCPI over
|
|
// TCP. Reserved: "vxi11" (not yet implemented).
|
|
Transport string `toml:"transport"`
|
|
Address string `toml:"address"`
|
|
TimeoutMs int `toml:"timeout_ms"`
|
|
// Terminator is appended to every command. Empty → "\n".
|
|
Terminator string `toml:"terminator"`
|
|
Channels []Channel `toml:"channels"`
|
|
}
|
|
|
|
// Channel maps a SCPI query/command pair onto a signal named
|
|
// "instrument:channel".
|
|
type Channel struct {
|
|
Name string `toml:"name"`
|
|
// Query is the SCPI command whose response is the channel value,
|
|
// e.g. "MEAS:VOLT?". Required.
|
|
Query string `toml:"query"`
|
|
// WriteCmd is a printf-style template used by Write; "%v" is replaced with
|
|
// the value, e.g. "VOLT %v". Empty → channel is read-only.
|
|
WriteCmd string `toml:"write_cmd"`
|
|
// Type is the value type: "float" (default), "string", "int", or "bool".
|
|
Type string `toml:"type"`
|
|
Unit string `toml:"unit"`
|
|
Min float64 `toml:"min"`
|
|
Max float64 `toml:"max"`
|
|
PollIntervalMs int `toml:"poll_interval_ms"`
|
|
Description string `toml:"description"`
|
|
}
|
|
|
|
func (c Channel) dataType() datasource.DataType {
|
|
switch c.Type {
|
|
case "string":
|
|
return datasource.TypeString
|
|
case "int":
|
|
return datasource.TypeInt64
|
|
case "bool":
|
|
return datasource.TypeBool
|
|
default:
|
|
return datasource.TypeFloat64
|
|
}
|
|
}
|
|
|
|
func (c Channel) writable() bool { return c.WriteCmd != "" }
|
|
|
|
func (c Channel) metadata(instrument string) datasource.Metadata {
|
|
return datasource.Metadata{
|
|
Name: instrument + ":" + c.Name,
|
|
Type: c.dataType(),
|
|
Unit: c.Unit,
|
|
Description: c.Description,
|
|
DisplayLow: c.Min,
|
|
DisplayHigh: c.Max,
|
|
DriveLow: c.Min,
|
|
DriveHigh: c.Max,
|
|
Writable: c.writable(),
|
|
}
|
|
}
|