mirror of
https://github.com/jwetzell/showbridge-go.git
synced 2026-04-26 21:05:30 +00:00
100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package processor
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/google/jsonschema-go/jsonschema"
|
|
"github.com/jwetzell/showbridge-go/internal/common"
|
|
"github.com/jwetzell/showbridge-go/internal/config"
|
|
)
|
|
|
|
type IntScale struct {
|
|
OutMin int
|
|
OutMax int
|
|
InMin int
|
|
InMax int
|
|
config config.ProcessorConfig
|
|
}
|
|
|
|
func (ir *IntScale) Process(ctx context.Context, wrappedPayload common.WrappedPayload) (common.WrappedPayload, error) {
|
|
payload := wrappedPayload.Payload
|
|
payloadInt, ok := common.GetAnyAs[int](payload)
|
|
if !ok {
|
|
wrappedPayload.End = true
|
|
return wrappedPayload, errors.New("int.scale can only process an int")
|
|
}
|
|
|
|
payloadInt = (payloadInt-ir.InMin)*(ir.OutMax-ir.OutMin)/(ir.InMax-ir.InMin) + ir.OutMin
|
|
wrappedPayload.Payload = payloadInt
|
|
return wrappedPayload, nil
|
|
}
|
|
|
|
func (ir *IntScale) Type() string {
|
|
return ir.config.Type
|
|
}
|
|
|
|
func init() {
|
|
RegisterProcessor(ProcessorRegistration{
|
|
Type: "int.scale",
|
|
Title: "Scale Int",
|
|
ParamsSchema: &jsonschema.Schema{
|
|
Type: "object",
|
|
Properties: map[string]*jsonschema.Schema{
|
|
"inMin": {
|
|
Title: "Input Minimum",
|
|
Type: "integer",
|
|
},
|
|
"inMax": {
|
|
Title: "Input Maximum",
|
|
Type: "integer",
|
|
},
|
|
"outMin": {
|
|
Title: "Output Minimum",
|
|
Type: "integer",
|
|
},
|
|
"outMax": {
|
|
Title: "Output Maximum",
|
|
Type: "integer",
|
|
},
|
|
},
|
|
Required: []string{"inMin", "inMax", "outMin", "outMax"},
|
|
AdditionalProperties: &jsonschema.Schema{Not: &jsonschema.Schema{}},
|
|
},
|
|
New: func(config config.ProcessorConfig) (Processor, error) {
|
|
params := config.Params
|
|
|
|
inMinInt, err := params.GetInt("inMin")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("int.scale inMin error: %w", err)
|
|
}
|
|
|
|
inMaxInt, err := params.GetInt("inMax")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("int.scale inMax error: %w", err)
|
|
}
|
|
|
|
if inMaxInt < inMinInt {
|
|
return nil, errors.New("int.scale inMax must be greater than inMin")
|
|
}
|
|
|
|
outMinInt, err := params.GetInt("outMin")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("int.scale outMin error: %w", err)
|
|
}
|
|
|
|
outMaxInt, err := params.GetInt("outMax")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("int.scale outMax error: %w", err)
|
|
}
|
|
|
|
if outMaxInt < outMinInt {
|
|
return nil, errors.New("int.scale outMax must be greater than outMin")
|
|
}
|
|
|
|
return &IntScale{config: config, InMin: inMinInt, InMax: inMaxInt, OutMin: outMinInt, OutMax: outMaxInt}, nil
|
|
},
|
|
})
|
|
}
|