13 type outputRequest struct {
14 command driver.Command
20 func newOutputRequest(command driver.Command, topology topology, deviceID string, batch bool) (outputRequest, string) {
21 request := outputRequest{command: command}
23 if command.DeviceID != deviceID {
24 return request, "Command belongs to another device"
27 if command.Expired(time.Now()) {
28 return request, "Command expired"
31 value := bytes.TrimSpace(command.Payload.Value)
33 for _, output := range topology.outputs {
34 if output.id != command.Capability {
38 request.point = output
39 if !bytes.Equal(value, []byte("true")) && !bytes.Equal(value, []byte("false")) {
40 return request, "Digital output requires a Boolean value"
43 if bytes.Equal(value, []byte("true")) {
47 if output.pulse != 0 && request.value != 1 {
48 return request, "Pulse output requires true"
51 if batch && output.pulse != 0 {
52 return request, "Batches require steady digital outputs"
58 for _, output := range topology.analog {
59 if output.id != command.Capability {
63 request.point, request.analog = output, true
65 return request, "Batches require steady digital outputs"
68 if len(value) == 0 || !json.Valid(value) || value[0] != '-' && (value[0] < '0' || value[0] > '9') {
69 return request, "Analog output requires zero through ten volts"
72 number, valid := new(big.Rat).SetString(string(value))
73 if !valid || number.Sign() < 0 || number.Cmp(big.NewRat(10, 1)) > 0 {
74 return request, "Analog output requires zero through ten volts"
77 voltage, _ := number.Float64()
78 request.value = uint16(math.Round(voltage * 1000))
83 return request, "Capability is not a configured output"