From 0405c933bcb54f231696f08ab45d2dbe69644acc Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Thu, 2 May 2024 14:45:32 -0400 Subject: [PATCH 01/17] start analog --- components/board/board.go | 8 +++++++- components/board/client.go | 8 ++++---- components/board/client_test.go | 9 ++++++--- components/board/collector.go | 8 ++++++-- components/board/collectors_test.go | 9 ++++++--- components/board/fake/board.go | 10 +++++++--- components/board/numato/board.go | 10 +++++++--- components/board/numato/board_test.go | 10 +++++++--- .../board/pinwrappers/analog_smoother_test.go | 8 ++++---- components/board/pinwrappers/analogs.go | 16 ++++++++++------ components/board/server.go | 5 +++-- components/board/server_test.go | 18 ++++++++++-------- components/board/status.go | 2 +- components/gripper/softrobotics/gripper.go | 4 ++-- components/input/gpio/gpio.go | 2 +- components/input/gpio/gpio_test.go | 12 ++++++------ go.mod | 2 +- go.sum | 4 ++-- testutils/inject/analog.go | 4 ++-- 19 files changed, 92 insertions(+), 57 deletions(-) diff --git a/components/board/board.go b/components/board/board.go index e68d9bf7b6e..549937f7bdf 100644 --- a/components/board/board.go +++ b/components/board/board.go @@ -80,12 +80,18 @@ type Board interface { // An Analog represents an analog pin that resides on a board. type Analog interface { // Read reads off the current value. - Read(ctx context.Context, extra map[string]interface{}) (int, error) + Read(ctx context.Context, extra map[string]interface{}) (int, AnalogRange, error) // Write writes a value to the analog pin. Write(ctx context.Context, value int, extra map[string]interface{}) error } +type AnalogRange struct { + Min float32 + Max float32 + StepSize float32 +} + // FromDependencies is a helper for getting the named board from a collection of // dependencies. func FromDependencies(deps resource.Dependencies, name string) (Board, error) { diff --git a/components/board/client.go b/components/board/client.go index 189c48c139e..c8b0fa64a20 100644 --- a/components/board/client.go +++ b/components/board/client.go @@ -150,10 +150,10 @@ type analogClient struct { analogName string } -func (ac *analogClient) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (ac *analogClient) Read(ctx context.Context, extra map[string]interface{}) (int, AnalogRange, error) { ext, err := protoutils.StructToStructPb(extra) if err != nil { - return 0, err + return 0, AnalogRange{}, err } // the api method is named ReadAnalogReader, it is named differenlty than // the board interface functions. @@ -163,9 +163,9 @@ func (ac *analogClient) Read(ctx context.Context, extra map[string]interface{}) Extra: ext, }) if err != nil { - return 0, err + return 0, AnalogRange{}, err } - return int(resp.Value), nil + return int(resp.Value), AnalogRange{Min: resp.MinRange, Max: resp.MaxRange, StepSize: resp.StepSize}, nil } func (ac *analogClient) Write(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/components/board/client_test.go b/components/board/client_test.go index 2bfe24f1f84..64feaba3175 100644 --- a/components/board/client_test.go +++ b/components/board/client_test.go @@ -141,13 +141,16 @@ func TestWorkingClient(t *testing.T) { test.That(t, injectBoard.AnalogByNameCap(), test.ShouldResemble, []interface{}{"analog1"}) // Analog: Read - injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, error) { + injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { actualExtra = extra - return 6, nil + return 6, board.AnalogRange{Min: 0, Max: 10, StepSize: 0.1}, nil } - readVal, err := analog1.Read(context.Background(), expectedExtra) + readVal, analogRange, err := analog1.Read(context.Background(), expectedExtra) test.That(t, err, test.ShouldBeNil) test.That(t, readVal, test.ShouldEqual, 6) + test.That(t, analogRange.Min, test.ShouldEqual, 0) + test.That(t, analogRange.Max, test.ShouldEqual, 10) + test.That(t, analogRange.StepSize, test.ShouldEqual, 0.1) test.That(t, actualExtra, test.ShouldResemble, expectedExtra) actualExtra = nil diff --git a/components/board/collector.go b/components/board/collector.go index 82026cfeb4f..b558ff2b247 100644 --- a/components/board/collector.go +++ b/components/board/collector.go @@ -41,12 +41,13 @@ func newAnalogCollector(resource interface{}, params data.CollectorParams) (data cFunc := data.CaptureFunc(func(ctx context.Context, arg map[string]*anypb.Any) (interface{}, error) { var value int + var analogRange AnalogRange if _, ok := arg[analogReaderNameKey]; !ok { return nil, data.FailedToReadErr(params.ComponentName, analogs.String(), errors.New("Must supply reader_name in additional_params for analog collector")) } if reader, err := board.AnalogByName(arg[analogReaderNameKey].String()); err == nil { - value, err = reader.Read(ctx, data.FromDMExtraMap) + value, analogRange, err = reader.Read(ctx, data.FromDMExtraMap) if err != nil { // A modular filter component can be created to filter the readings from a component. The error ErrNoCaptureToStore // is used in the datamanager to exclude readings from being captured and stored. @@ -57,7 +58,10 @@ func newAnalogCollector(resource interface{}, params data.CollectorParams) (data } } return pb.ReadAnalogReaderResponse{ - Value: int32(value), + Value: int32(value), + MinRange: analogRange.Min, + MaxRange: analogRange.Max, + StepSize: analogRange.StepSize, }, nil }) return data.NewCollector(cFunc, params) diff --git a/components/board/collectors_test.go b/components/board/collectors_test.go index a2ea313dc5c..77c24245334 100644 --- a/components/board/collectors_test.go +++ b/components/board/collectors_test.go @@ -47,7 +47,10 @@ func TestCollectors(t *testing.T) { }, collector: board.NewAnalogCollector, expected: tu.ToProtoMapIgnoreOmitEmpty(pb.ReadAnalogReaderResponse{ - Value: 1, + Value: 1, + MinRange: 0, + MaxRange: 10, + StepSize: 0.1, }), shouldError: false, }, @@ -96,8 +99,8 @@ func TestCollectors(t *testing.T) { func newBoard() board.Board { b := &inject.Board{} analog := &inject.Analog{} - analog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, error) { - return 1, nil + analog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { + return 1, board.AnalogRange{Min: 0, Max: 10, StepSize: 0.1}, nil } b.AnalogByNameFunc = func(name string) (board.Analog, error) { return analog, nil diff --git a/components/board/fake/board.go b/components/board/fake/board.go index 4ff91d67515..4aa5522464c 100644 --- a/components/board/fake/board.go +++ b/components/board/fake/board.go @@ -295,14 +295,18 @@ func (a *Analog) reset(pin string) { a.Mu.Unlock() } -func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { a.Mu.RLock() defer a.Mu.RUnlock() if a.pin != analogTestPin { a.Value = a.fakeValue - a.fakeValue++ + if a.fakeValue == 1000 { + a.fakeValue = 0 + } else { + a.fakeValue++ + } } - return a.Value, nil + return a.Value, board.AnalogRange{Min: 0, Max: 1000, StepSize: 1}, nil } func (a *Analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/components/board/numato/board.go b/components/board/numato/board.go index 3fe20be3881..cf106cf6c3b 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -358,12 +358,16 @@ type analog struct { pin string } -func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { res, err := a.b.doSendReceive(ctx, fmt.Sprintf("adc read %s", a.pin)) if err != nil { - return 0, err + return 0, board.AnalogRange{}, err } - return strconv.Atoi(res) + reading, err := strconv.Atoi(res) + if err != nil { + return 0, board.AnalogRange{}, err + } + return reading, board.AnalogRange{Min: 0, Max: 5, StepSize: 4.88}, nil } func (a *analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/components/board/numato/board_test.go b/components/board/numato/board_test.go index 24eef77b09e..e41f9cd0243 100644 --- a/components/board/numato/board_test.go +++ b/components/board/numato/board_test.go @@ -91,21 +91,25 @@ func TestNumato1(t *testing.T) { ar, err := b.AnalogByName("foo") test.That(t, err, test.ShouldBeNil, true) - res2, err := ar.Read(ctx, nil) + res2, analogRange, err := ar.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) test.That(t, res2, test.ShouldBeLessThan, 100) + test.That(t, analogRange.Min, test.ShouldEqual, 0) + test.That(t, analogRange.Max, test.ShouldEqual, 5) + test.That(t, analogRange.StepSize, test.ShouldEqual, 4.88) + err = zeroPin.Set(context.Background(), true, nil) test.That(t, err, test.ShouldBeNil) - res2, err = ar.Read(ctx, nil) + res2, _, err = ar.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) test.That(t, res2, test.ShouldBeGreaterThan, 1000) err = zeroPin.Set(context.Background(), false, nil) test.That(t, err, test.ShouldBeNil) - res2, err = ar.Read(ctx, nil) + res2, _, err = ar.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) test.That(t, res2, test.ShouldBeLessThan, 100) } diff --git a/components/board/pinwrappers/analog_smoother_test.go b/components/board/pinwrappers/analog_smoother_test.go index 0f5d3b9ae53..b3dc2626d4b 100644 --- a/components/board/pinwrappers/analog_smoother_test.go +++ b/components/board/pinwrappers/analog_smoother_test.go @@ -23,14 +23,14 @@ type testAnalog struct { stop bool } -func (t *testAnalog) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (t *testAnalog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { t.mu.Lock() defer t.mu.Unlock() if t.stop || t.n >= t.lim { - return 0, errStopReading + return 0, board.AnalogRange{}, errStopReading } t.n++ - return t.r.Intn(100), nil + return t.r.Intn(100), board.AnalogRange{Min: 0, Max: 3.3, StepSize: 0.1}, nil } func (t *testAnalog) Write(ctx context.Context, value int, extra map[string]interface{}) error { @@ -60,7 +60,7 @@ func TestAnalogSmoother1(t *testing.T) { testutils.WaitForAssertionWithSleep(t, 10*time.Millisecond, 200, func(tb testing.TB) { tb.Helper() - v, err := as.Read(context.Background(), nil) + v, _, err := as.Read(context.Background(), nil) test.That(tb, err, test.ShouldEqual, errStopReading) test.That(tb, v, test.ShouldEqual, 52) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 4baf5647777..e018d3b3315 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -57,21 +57,25 @@ func (as *AnalogSmoother) Close(ctx context.Context) error { } // Read returns the smoothed out reading. -func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { if as.data == nil { // We're using raw data, and not averaging - return as.lastData, nil + return as.lastData, board.AnalogRange{}, nil } avg := as.data.Average() lastErr := as.lastError.Load() if lastErr == nil { - return avg, nil + + ///TODO: figure out range ?? + return avg, board.AnalogRange{}, nil } //nolint:forcetypeassert if lastErr.present { - return avg, lastErr.err + return avg, board.AnalogRange{}, lastErr.err } - return avg, nil + + //TODO: range here + return avg, board.AnalogRange{}, nil } // Start begins the smoothing routine that reads from the underlying @@ -111,7 +115,7 @@ func (as *AnalogSmoother) Start() { default: } start := time.Now() - reading, err := as.Raw.Read(ctx, nil) + reading, _, err := as.Raw.Read(ctx, nil) as.lastError.Store(&errValue{err != nil, err}) if err == nil { as.lastData = reading diff --git a/components/board/server.go b/components/board/server.go index 8ce8d36f895..a27052e096b 100644 --- a/components/board/server.go +++ b/components/board/server.go @@ -144,11 +144,12 @@ func (s *serviceServer) ReadAnalogReader( return nil, err } - val, err := theReader.Read(ctx, req.Extra.AsMap()) + val, analogRange, err := theReader.Read(ctx, req.Extra.AsMap()) if err != nil { return nil, err } - return &pb.ReadAnalogReaderResponse{Value: int32(val)}, nil + return &pb.ReadAnalogReaderResponse{Value: int32(val), + MinRange: analogRange.Min, MaxRange: analogRange.Max, StepSize: analogRange.StepSize}, nil } // WriteAnalog writes the analog value to the analog writer pin of the underlying robot. diff --git a/components/board/server_test.go b/components/board/server_test.go index 7b833e60ebb..f30ae3c38a7 100644 --- a/components/board/server_test.go +++ b/components/board/server_test.go @@ -464,7 +464,8 @@ func TestServerReadAnalogReader(t *testing.T) { tests := []struct { injectAnalog *inject.Analog injectAnalogErr error - injectResult int + injectVal int + injectRange board.AnalogRange injectErr error req *request expCapAnalogArgs []interface{} @@ -475,7 +476,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: nil, injectAnalogErr: errAnalog, - injectResult: 0, + injectVal: 0, injectErr: nil, req: &request{BoardName: missingBoardName}, expCapAnalogArgs: []interface{}(nil), @@ -486,7 +487,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: nil, injectAnalogErr: errAnalog, - injectResult: 0, + injectVal: 0, injectErr: nil, req: &request{BoardName: testBoardName, AnalogReaderName: "analog1"}, expCapAnalogArgs: []interface{}{"analog1"}, @@ -497,7 +498,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: &inject.Analog{}, injectAnalogErr: nil, - injectResult: 0, + injectVal: 0, injectErr: errFoo, req: &request{BoardName: testBoardName, AnalogReaderName: "analog1"}, expCapAnalogArgs: []interface{}{"analog1"}, @@ -508,12 +509,13 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: &inject.Analog{}, injectAnalogErr: nil, - injectResult: 8, + injectVal: 8, + injectRange: board.AnalogRange{Min: 0, Max: 10, StepSize: 0.1}, injectErr: nil, req: &request{BoardName: testBoardName, AnalogReaderName: "analog1", Extra: pbExpectedExtra}, expCapAnalogArgs: []interface{}{"analog1"}, expCapArgs: []interface{}{ctx}, - expResp: &response{Value: 8}, + expResp: &response{Value: 8, MinRange: 0, MaxRange: 10, StepSize: 0.1}, expRespErr: "", }, } @@ -529,9 +531,9 @@ func TestServerReadAnalogReader(t *testing.T) { } if tc.injectAnalog != nil { - tc.injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, error) { + tc.injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { actualExtra = extra - return tc.injectResult, tc.injectErr + return tc.injectVal, tc.injectRange, tc.injectErr } } diff --git a/components/board/status.go b/components/board/status.go index 003d289f096..2d83aa6cca0 100644 --- a/components/board/status.go +++ b/components/board/status.go @@ -20,7 +20,7 @@ func CreateStatus(ctx context.Context, b Board) (*pb.Status, error) { if err != nil { return nil, err } - val, err := x.Read(ctx, nil) + val, _, err := x.Read(ctx, nil) if err != nil { return nil, errors.Wrapf(err, "couldn't read analog (%s)", name) } diff --git a/components/gripper/softrobotics/gripper.go b/components/gripper/softrobotics/gripper.go index 4394c2f6849..54c51f6a176 100644 --- a/components/gripper/softrobotics/gripper.go +++ b/components/gripper/softrobotics/gripper.go @@ -169,7 +169,7 @@ func (g *softGripper) Open(ctx context.Context, extra map[string]interface{}) er return ctx.Err() } // REMOVE - val, err := g.psi.Read(ctx, nil) + val, _, err := g.psi.Read(ctx, nil) if err != nil { return multierr.Combine(err, g.Stop(ctx, extra)) } @@ -204,7 +204,7 @@ func (g *softGripper) Grab(ctx context.Context, extra map[string]interface{}) (b return false, ctx.Err() } // REMOVE - val, err := g.psi.Read(ctx, nil) + val, _, err := g.psi.Read(ctx, nil) if err != nil { return false, multierr.Combine(err, g.Stop(ctx, extra)) } diff --git a/components/input/gpio/gpio.go b/components/input/gpio/gpio.go index 52991b92446..15aeca7649b 100644 --- a/components/input/gpio/gpio.go +++ b/components/input/gpio/gpio.go @@ -323,7 +323,7 @@ func (c *Controller) newAxis(ctx context.Context, brd board.Board, analogName st return case <-ticker.C: } - rawVal, err := reader.Read(ctx, nil) + rawVal, _, err := reader.Read(ctx, nil) if err != nil { c.logger.CError(ctx, err) } diff --git a/components/input/gpio/gpio_test.go b/components/input/gpio/gpio_test.go index eaf33bc6cc5..1c558df8f7a 100644 --- a/components/input/gpio/gpio_test.go +++ b/components/input/gpio/gpio_test.go @@ -106,20 +106,20 @@ func setup(t *testing.T) *setupResult { return nil } - s.analog1.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, error) { + s.analog1.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { s.mu.Lock() defer s.mu.Unlock() - return analog1Val, nil + return analog1Val, board.AnalogRange{}, nil } - s.analog2.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, error) { + s.analog2.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { s.mu.Lock() defer s.mu.Unlock() - return analog2Val, nil + return analog2Val, board.AnalogRange{}, nil } - s.analog3.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, error) { + s.analog3.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { s.mu.Lock() defer s.mu.Unlock() - return analog3Val, nil + return analog3Val, board.AnalogRange{}, nil } s.analog2.WriteFunc = func(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/go.mod b/go.mod index b07ee618c93..0b020f55127 100644 --- a/go.mod +++ b/go.mod @@ -84,7 +84,7 @@ require ( go.uber.org/atomic v1.10.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.24.0 - go.viam.com/api v0.1.293 + go.viam.com/api v0.1.295 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 go.viam.com/utils v0.1.74 goji.io v2.0.2+incompatible diff --git a/go.sum b/go.sum index f5ad511dfbf..6117e3a141b 100644 --- a/go.sum +++ b/go.sum @@ -1531,8 +1531,8 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.viam.com/api v0.1.293 h1:BO82qY1mWOZbIjK9kMUyoRv/apdy7O76RT7BNPH29Jo= -go.viam.com/api v0.1.293/go.mod h1:msa4TPrMVeRDcG4YzKA/S6wLEUC7GyHQE973JklrQ10= +go.viam.com/api v0.1.295 h1:yfkJOyQEq9BQoD7Hw4UNEmyA58qZKlthSVk8Ml6gnBM= +go.viam.com/api v0.1.295/go.mod h1:msa4TPrMVeRDcG4YzKA/S6wLEUC7GyHQE973JklrQ10= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 h1:oBiK580EnEIzgFLU4lHOXmGAE3MxnVbeR7s1wp/F3Ps= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2/go.mod h1:XM0tej6riszsiNLT16uoyq1YjuYPWlRBweTPRDanIts= go.viam.com/utils v0.1.74 h1:HS3dqK1NAn3n/KwroBUzJI2qZzhP2uW2+u4VK4VUfrc= diff --git a/testutils/inject/analog.go b/testutils/inject/analog.go index e3b9550e0c7..5cf4e9d3189 100644 --- a/testutils/inject/analog.go +++ b/testutils/inject/analog.go @@ -9,14 +9,14 @@ import ( // Analog is an injected analog pin. type Analog struct { board.Analog - ReadFunc func(ctx context.Context, extra map[string]interface{}) (int, error) + ReadFunc func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) readCap []interface{} WriteFunc func(ctx context.Context, value int, extra map[string]interface{}) error writeCap []interface{} } // Read calls the injected Read or the real version. -func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { a.readCap = []interface{}{ctx} if a.ReadFunc == nil { return a.Analog.Read(ctx, extra) From a1d80bf7a3b543a4a9c0b89768fd35f2e2a4de54 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Fri, 3 May 2024 14:21:59 -0400 Subject: [PATCH 02/17] analog read --- components/board/genericlinux/board.go | 4 ++-- components/board/mcp3008helper/mcp3008.go | 11 +++++++---- components/board/pi/impl/external_hardware_test.go | 6 +++--- components/board/pinwrappers/analogs.go | 1 - 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/components/board/genericlinux/board.go b/components/board/genericlinux/board.go index 25832efb160..3f7901411eb 100644 --- a/components/board/genericlinux/board.go +++ b/components/board/genericlinux/board.go @@ -351,11 +351,11 @@ func newWrappedAnalogReader(ctx context.Context, chipSelect string, reader *pinw return &wrapped } -func (a *wrappedAnalogReader) Read(ctx context.Context, extra map[string]interface{}) (int, error) { +func (a *wrappedAnalogReader) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { a.mu.RLock() defer a.mu.RUnlock() if a.reader == nil { - return 0, errors.New("closed") + return 0, board.AnalogRange{}, errors.New("closed") } return a.reader.Read(ctx, extra) } diff --git a/components/board/mcp3008helper/mcp3008.go b/components/board/mcp3008helper/mcp3008.go index 198f256dff2..725924349ff 100644 --- a/components/board/mcp3008helper/mcp3008.go +++ b/components/board/mcp3008helper/mcp3008.go @@ -7,6 +7,7 @@ import ( "go.uber.org/multierr" + "go.viam.com/rdk/components/board" "go.viam.com/rdk/components/board/genericlinux/buses" "go.viam.com/rdk/grpc" "go.viam.com/rdk/resource" @@ -37,7 +38,7 @@ func (config *MCP3008AnalogConfig) Validate(path string) error { return nil } -func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]interface{}) (value int, err error) { +func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]interface{}) (value int, analogRange board.AnalogRange, err error) { var tx [3]byte tx[0] = 1 // start bit tx[1] = byte((8 + mar.Channel) << 4) // single-ended @@ -45,7 +46,7 @@ func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]inter bus, err := mar.Bus.OpenHandle() if err != nil { - return 0, err + return 0, board.AnalogRange{}, err } defer func() { err = multierr.Combine(err, bus.Close()) @@ -53,13 +54,15 @@ func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]inter rx, err := bus.Xfer(ctx, 1000000, mar.Chip, 0, tx[:]) if err != nil { - return 0, err + return 0, board.AnalogRange{}, err } // Reassemble the 10-bit value. Do not include bits before the final 10, because they contain // garbage and might be non-zero. val := 0x03FF & ((int(rx[1]) << 8) | int(rx[2])) - return val, nil + + //TODO: wtf is the analog range for this + return val, board.AnalogRange{}, nil } // Close does nothing. diff --git a/components/board/pi/impl/external_hardware_test.go b/components/board/pi/impl/external_hardware_test.go index 8d543ab1c8f..0fb330c6c1b 100644 --- a/components/board/pi/impl/external_hardware_test.go +++ b/components/board/pi/impl/external_hardware_test.go @@ -65,7 +65,7 @@ func TestPiHardware(t *testing.T) { err = p.SetGPIOBcom(26, false) test.That(t, err, test.ShouldBeNil) - v, err := reader.Read(ctx, nil) + v, _, err := reader.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) test.That(t, v, test.ShouldAlmostEqual, 0, 150) @@ -73,7 +73,7 @@ func TestPiHardware(t *testing.T) { err = p.SetGPIOBcom(26, true) test.That(t, err, test.ShouldBeNil) - v, err = reader.Read(ctx, nil) + v, _, err = reader.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) test.That(t, v, test.ShouldAlmostEqual, 1023, 150) @@ -81,7 +81,7 @@ func TestPiHardware(t *testing.T) { err = p.SetGPIOBcom(26, false) test.That(t, err, test.ShouldBeNil) - v, err = reader.Read(ctx, nil) + v, _, err = reader.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) test.That(t, v, test.ShouldAlmostEqual, 0, 150) }) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index e018d3b3315..5de5744e2e0 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -65,7 +65,6 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} avg := as.data.Average() lastErr := as.lastError.Load() if lastErr == nil { - ///TODO: figure out range ?? return avg, board.AnalogRange{}, nil } From 28cef108e140c27fdcec59e540d9b52c8d4b2788 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Mon, 13 May 2024 12:05:00 -0400 Subject: [PATCH 03/17] product id --- components/board/numato/board.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/components/board/numato/board.go b/components/board/numato/board.go index cf106cf6c3b..7b4a2f67e1c 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -20,6 +20,7 @@ import ( pb "go.viam.com/api/component/board/v1" "go.viam.com/utils" "go.viam.com/utils/serial" + "go.viam.com/utils/usb" "go.viam.com/rdk/components/board" "go.viam.com/rdk/components/board/pinwrappers" @@ -367,7 +368,8 @@ func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, b if err != nil { return 0, board.AnalogRange{}, err } - return reading, board.AnalogRange{Min: 0, Max: 5, StepSize: 4.88}, nil + + return reading, board.AnalogRange{Min: 0, Max: 0, StepSize: 0}, nil } func (a *analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { @@ -386,6 +388,18 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi return nil, fmt.Errorf("found more than 1 numato board: %d", len(devs)) } + // Find the numato board product id + products := usb.Search(usb.NewSearchFilter("AppleUSBACMData", "usbmodem"), func(vendorID, productID int) bool { + return true + }) + var productID int + for _, product := range products { + if product.ID.Vendor != 0x2a19 { + continue + } + productID = product.ID.Product + } + options := goserial.OpenOptions{ PortName: devs[0].Path, BaudRate: 19200, From 3a723a4e134eaa48911cf360cade382d1797b92f Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Mon, 13 May 2024 15:33:57 -0400 Subject: [PATCH 04/17] numato board --- components/board/mcp3008helper/mcp3008.go | 3 +- components/board/numato/board.go | 56 +++- components/board/numato/darwin_utils.go | 11 + components/board/numato/linux_utils.go | 11 + components/board/pinwrappers/analogs.go | 14 +- components/board/server.go | 6 +- go.mod | 141 +++++---- go.sum | 353 ++++++++++++---------- 8 files changed, 350 insertions(+), 245 deletions(-) create mode 100644 components/board/numato/darwin_utils.go create mode 100644 components/board/numato/linux_utils.go diff --git a/components/board/mcp3008helper/mcp3008.go b/components/board/mcp3008helper/mcp3008.go index 725924349ff..4d2d0338f73 100644 --- a/components/board/mcp3008helper/mcp3008.go +++ b/components/board/mcp3008helper/mcp3008.go @@ -60,8 +60,7 @@ func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]inter // garbage and might be non-zero. val := 0x03FF & ((int(rx[1]) << 8) | int(rx[2])) - - //TODO: wtf is the analog range for this + //TODO: wtf is the analog range for this return val, board.AnalogRange{}, nil } diff --git a/components/board/numato/board.go b/components/board/numato/board.go index 36ad77444ad..aff0b9e5d8b 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -118,6 +118,8 @@ type numatoBoard struct { sent map[string]bool sentMu sync.Mutex workers rdkutils.StoppableWorkers + + productID int } func (b *numatoBoard) addToSent(msg string) { @@ -355,6 +357,7 @@ type analog struct { pin string } +// analog Read returns the analog value with the range and step size in mV/bit. func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { res, err := a.b.doSendReceive(ctx, fmt.Sprintf("adc read %s", a.pin)) if err != nil { @@ -364,8 +367,34 @@ func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, b if err != nil { return 0, board.AnalogRange{}, err } - - return reading, board.AnalogRange{Min: 0, Max: 0, StepSize: 0}, nil + var max float32 = 0.0 + var stepSize float32 = 0.0 + switch a.b.productID { + case 0x805: + // 128 channel usb numato has 12 bit resolution + max = 3.3 + stepSize = max / 4096 + case 0x802: + // 32 channel usb numato has 10 bit resolution + max = 3.3 + stepSize = max / 1024 + case 0x800: + // 8 and 16 pin usb versions have the same product ID but different voltage ranges + // both have 10 bit resolution + if a.b.pins == 8 { + max = 5.0 + } else if a.b.pins == 16 { + max = 3.3 + } + stepSize = max / 1024 + case 0xC05: + // 1 channel usb relay module numato - 10 bit resolution + max = 5.0 + stepSize = max / 1024 + default: + } + stepSize *= 1000 + return reading, board.AnalogRange{Min: 0, Max: max, StepSize: stepSize}, nil } func (a *analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { @@ -390,10 +419,10 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi path = devs[0].Path } - // Find the numato board product id - products := usb.Search(usb.NewSearchFilter("AppleUSBACMData", "usbmodem"), func(vendorID, productID int) bool { - return true - }) + // Find the numato board's productid + var products []usb.Description + products = getSerialDevices() + var productID int for _, product := range products { if product.ID.Vendor != 0x2a19 { @@ -402,6 +431,10 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi productID = product.ID.Product } + if productID != 0x805|0x802|0x800|0x0C05 { + logger.Warnf("analog range and step size is not supported for numato with product id %d", productID) + } + options := goserial.OpenOptions{ PortName: path, BaudRate: 19200, @@ -414,12 +447,12 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi if err != nil { return nil, err } - b := &numatoBoard{ - Named: name.AsNamed(), - pins: pins, - port: device, - logger: logger, + Named: name.AsNamed(), + pins: pins, + port: device, + logger: logger, + productID: productID, } b.analogs = map[string]*pinwrappers.AnalogSmoother{} @@ -437,6 +470,5 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi return nil, multierr.Combine(b.Close(ctx), err) } b.logger.CDebugw(ctx, "numato startup", "version", ver) - return b, nil } diff --git a/components/board/numato/darwin_utils.go b/components/board/numato/darwin_utils.go new file mode 100644 index 00000000000..7b071616e8d --- /dev/null +++ b/components/board/numato/darwin_utils.go @@ -0,0 +1,11 @@ +//go:build darwin + +package numato + +import "go.viam.com/utils/usb" + +func getSerialDevices() []usb.Description { + return usb.Search(usb.NewSearchFilter("AppleUSBACMData", "usbmodem"), func(vendorID, productID int) bool { + return true + }) +} diff --git a/components/board/numato/linux_utils.go b/components/board/numato/linux_utils.go new file mode 100644 index 00000000000..61376ff26a2 --- /dev/null +++ b/components/board/numato/linux_utils.go @@ -0,0 +1,11 @@ +//go:build linux + +package numato + +import "go.viam.com/utils/usb" + +func getSerialDevices() []usb.Description { + return usb.Search(usb.SearchFilter{}, func(vendorID, productID int) bool { + return true + }) +} diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 5de5744e2e0..7b8af5f4502 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -26,6 +26,7 @@ type AnalogSmoother struct { lastError atomic.Pointer[errValue] logger logging.Logger workers utils.StoppableWorkers + analogRange board.AnalogRange } // SmoothAnalogReader wraps the given reader in a smoother. @@ -65,16 +66,14 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} avg := as.data.Average() lastErr := as.lastError.Load() if lastErr == nil { - ///TODO: figure out range ?? - return avg, board.AnalogRange{}, nil + return avg, as.analogRange, nil } //nolint:forcetypeassert if lastErr.present { - return avg, board.AnalogRange{}, lastErr.err + return avg, as.analogRange, lastErr.err } - //TODO: range here - return avg, board.AnalogRange{}, nil + return avg, as.analogRange, nil } // Start begins the smoothing routine that reads from the underlying @@ -107,6 +106,11 @@ func (as *AnalogSmoother) Start() { } as.workers = utils.NewStoppableWorkers(func(ctx context.Context) { + // Store the analog reader range and step size + _, analogRange, err := as.Raw.Read(ctx, nil) + as.lastError.Store(&errValue{err != nil, err}) + as.analogRange = analogRange + for { select { case <-ctx.Done(): diff --git a/components/board/server.go b/components/board/server.go index 676cf05c972..f78397d6385 100644 --- a/components/board/server.go +++ b/components/board/server.go @@ -148,8 +148,10 @@ func (s *serviceServer) ReadAnalogReader( if err != nil { return nil, err } - return &pb.ReadAnalogReaderResponse{Value: int32(val), - MinRange: analogRange.Min, MaxRange: analogRange.Max, StepSize: analogRange.StepSize}, nil + return &pb.ReadAnalogReaderResponse{ + Value: int32(val), + MinRange: analogRange.Min, MaxRange: analogRange.Max, StepSize: analogRange.StepSize, + }, nil } // WriteAnalog writes the analog value to the analog writer pin of the underlying robot. diff --git a/go.mod b/go.mod index 993ab16374a..06adb22075e 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/benbjohnson/clock v1.3.3 github.com/bep/debounce v1.2.1 github.com/bluenviron/gortsplib/v4 v4.8.0 + github.com/bluenviron/mediacommon v1.9.2 github.com/bufbuild/buf v1.6.0 github.com/creack/pty v1.1.19-0.20220421211855-0d412c9fbeb1 github.com/d2r2/go-i2c v0.0.0-20191123181816-73a8a799d6bc @@ -42,7 +43,7 @@ require ( github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 github.com/golang/protobuf v1.5.3 - github.com/golangci/golangci-lint v1.51.2 + github.com/golangci/golangci-lint v1.54.0 github.com/google/flatbuffers v2.0.6+incompatible github.com/google/go-cmp v0.5.9 github.com/google/uuid v1.6.0 @@ -54,7 +55,7 @@ require ( github.com/jedib0t/go-pretty/v6 v6.4.6 github.com/jhump/protoreflect v1.15.1 github.com/kellydunn/golang-geo v0.7.0 - github.com/lestrrat-go/jwx v1.2.25 + github.com/lestrrat-go/jwx v1.2.29 github.com/lmittmann/ppm v1.0.2 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/mattn/go-tflite v1.0.4 @@ -66,7 +67,7 @@ require ( github.com/muesli/kmeans v0.3.1 github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 - github.com/pion/mediadevices v0.6.2 + github.com/pion/mediadevices v0.6.4 github.com/pion/rtp v1.8.5 github.com/pion/webrtc/v3 v3.2.36 github.com/rhysd/actionlint v1.6.24 @@ -84,21 +85,23 @@ require ( go.uber.org/atomic v1.10.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.24.0 - go.viam.com/api v0.1.295 + go.viam.com/api v0.1.296 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 - go.viam.com/utils v0.1.71 + go.viam.com/utils v0.1.77 goji.io v2.0.2+incompatible golang.org/x/image v0.15.0 - golang.org/x/sys v0.18.0 - golang.org/x/term v0.18.0 + golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b + golang.org/x/sys v0.20.0 + golang.org/x/term v0.20.0 golang.org/x/time v0.3.0 - golang.org/x/tools v0.10.0 + golang.org/x/tools v0.17.0 gonum.org/v1/gonum v0.12.0 gonum.org/v1/plot v0.12.0 google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 google.golang.org/grpc v1.58.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.34.1 gopkg.in/src-d/go-billy.v4 v4.3.2 gorgonia.org/tensor v0.9.24 gotest.tools/gotestsum v1.10.0 @@ -119,47 +122,50 @@ require ( cloud.google.com/go/trace v1.10.1 // indirect contrib.go.opencensus.io/exporter/stackdriver v0.13.4 // indirect git.sr.ht/~sbinet/gg v0.3.1 // indirect - github.com/Abirdcfly/dupword v0.0.9 // indirect - github.com/Antonboom/errname v0.1.7 // indirect - github.com/Antonboom/nilnil v0.1.1 // indirect - github.com/BurntSushi/toml v1.2.1 // indirect + github.com/4meepo/tagalign v1.3.2 // indirect + github.com/Abirdcfly/dupword v0.0.12 // indirect + github.com/Antonboom/errname v0.1.10 // indirect + github.com/Antonboom/nilnil v0.1.5 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 // indirect + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect - github.com/OpenPeeDeeP/depguard v1.1.1 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.1.0 // indirect github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect + github.com/alexkohler/nakedret/v2 v2.0.2 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect github.com/apache/arrow/go/arrow v0.0.0-20201229220542-30ce2eb5d4dc // indirect - github.com/ashanbrown/forbidigo v1.4.0 // indirect + github.com/ashanbrown/forbidigo v1.6.0 // indirect github.com/ashanbrown/makezero v1.1.1 // indirect github.com/aws/aws-sdk-go v1.38.20 // indirect github.com/bamiaux/iobit v0.0.0-20170418073505-498159a04883 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.0 // indirect - github.com/blackjack/webcam v0.5.0 // indirect + github.com/bkielbasa/cyclop v1.2.1 // indirect + github.com/blackjack/webcam v0.6.1 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bombsimon/wsl/v3 v3.4.0 // indirect - github.com/breml/bidichk v0.2.3 // indirect - github.com/breml/errchkjson v0.3.0 // indirect + github.com/breml/bidichk v0.2.4 // indirect + github.com/breml/errchkjson v0.3.1 // indirect github.com/bufbuild/connect-go v0.1.1 // indirect github.com/bufbuild/protocompile v0.5.1 // indirect - github.com/butuzov/ireturn v0.1.1 // indirect + github.com/butuzov/ireturn v0.2.0 // indirect + github.com/butuzov/mirror v1.1.0 // indirect github.com/campoy/embedmd v1.0.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/charithe/durationcheck v0.0.9 // indirect - github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 // indirect + github.com/charithe/durationcheck v0.0.10 // indirect + github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 // indirect github.com/chewxy/hm v1.0.0 // indirect github.com/chewxy/math32 v1.0.8 // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/daixiang0/gci v0.9.1 // indirect + github.com/daixiang0/gci v0.11.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/denis-tingaikin/go-header v0.4.3 // indirect @@ -175,16 +181,16 @@ require ( github.com/firefart/nonamedreturns v1.0.4 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gen2brain/malgo v0.11.21 // indirect - github.com/gin-gonic/gin v1.8.1 // indirect + github.com/gin-gonic/gin v1.9.1 // indirect github.com/go-audio/riff v1.0.0 // indirect github.com/go-chi/chi/v5 v5.0.7 // indirect - github.com/go-critic/go-critic v0.6.7 // indirect + github.com/go-critic/go-critic v0.8.2 // indirect github.com/go-fonts/liberation v0.3.0 // indirect github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 // indirect github.com/go-pdf/fpdf v0.6.0 // indirect github.com/go-restruct/restruct v1.2.0-alpha.0.20210525045353-983b86fa188e // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.0.3 // indirect + github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.1.0 // indirect github.com/go-toolsmith/astfmt v1.1.0 // indirect github.com/go-toolsmith/astp v1.1.0 // indirect @@ -206,7 +212,7 @@ require ( github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 // indirect github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect - github.com/golangci/misspell v0.4.0 // indirect + github.com/golangci/misspell v0.4.1 // indirect github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect github.com/gonuts/binary v0.2.0 // indirect @@ -214,7 +220,7 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 // indirect + github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 // indirect github.com/gorilla/securecookie v1.1.1 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.4.2 // indirect @@ -229,7 +235,7 @@ require ( github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a // indirect github.com/jgautheron/goconst v1.5.1 // indirect github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f // indirect @@ -237,48 +243,47 @@ require ( github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/julz/importas v0.1.0 // indirect - github.com/junk1tm/musttag v0.4.5 // indirect github.com/kisielk/errcheck v1.6.3 // indirect github.com/kisielk/gotool v1.0.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.3 // indirect + github.com/kkHAIKE/contextcheck v1.1.4 // indirect github.com/klauspost/compress v1.16.5 // indirect github.com/klauspost/pgzip v1.2.5 // indirect github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.6 // indirect + github.com/kunwardeep/paralleltest v1.0.8 // indirect github.com/kyoh86/exportloopref v0.1.11 // indirect github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.4.0 // indirect + github.com/ldez/tagliatelle v0.5.0 // indirect github.com/leonklingele/grouper v1.1.1 // indirect github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect - github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/blackmagic v1.0.2 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect github.com/lestrrat-go/iter v1.0.2 // indirect github.com/lestrrat-go/option v1.0.1 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/lufeee/execinquery v1.2.1 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.0 // indirect - github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect + github.com/maratori/testpackage v1.1.1 // indirect + github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect - github.com/mgechev/revive v1.2.5 // indirect + github.com/mgechev/revive v1.3.2 // indirect github.com/miekg/dns v1.1.53 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moricho/tparallel v0.2.1 // indirect + github.com/moricho/tparallel v0.3.1 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect - github.com/nishanths/exhaustive v0.9.5 // indirect + github.com/nishanths/exhaustive v0.11.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.8.1 // indirect + github.com/nunnatsa/ginkgolinter v0.13.3 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pierrec/lz4 v2.0.5+incompatible // indirect github.com/pion/datachannel v1.5.5 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect @@ -297,14 +302,14 @@ require ( github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/profile v1.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.1.0 // indirect + github.com/polyfloyd/go-errorlint v1.4.3 // indirect github.com/prometheus/client_golang v1.12.2 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/quasilyte/go-ruleguard v0.3.19 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/robfig/cron v1.2.0 // indirect @@ -314,18 +319,18 @@ require ( github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect - github.com/securego/gosec/v2 v2.15.0 // indirect + github.com/securego/gosec/v2 v2.16.0 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/sivchari/containedctx v1.0.2 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sivchari/containedctx v1.0.3 // indirect github.com/sivchari/nosnakecase v1.7.0 // indirect github.com/sivchari/tenv v1.7.1 // indirect github.com/smartystreets/assertions v1.13.0 // indirect - github.com/sonatard/noctx v0.0.1 // indirect + github.com/sonatard/noctx v0.0.2 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.12.0 // indirect @@ -337,49 +342,51 @@ require ( github.com/subosito/gotenv v1.4.1 // indirect github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 // indirect - github.com/tdakkota/asciicheck v0.1.1 // indirect + github.com/tdakkota/asciicheck v0.2.0 // indirect github.com/tetafro/godot v1.4.11 // indirect - github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e // indirect - github.com/timonwong/loggercheck v0.9.3 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.0 // indirect + github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect + github.com/timonwong/loggercheck v0.9.4 // indirect + github.com/tomarrell/wrapcheck/v2 v2.8.1 // indirect github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect github.com/u2takey/go-utils v0.3.1 // indirect - github.com/ultraware/funlen v0.0.3 // indirect + github.com/ultraware/funlen v0.1.0 // indirect github.com/ultraware/whitespace v0.0.5 // indirect - github.com/uudashr/gocognit v1.0.6 // indirect + github.com/uudashr/gocognit v1.0.7 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/xen0n/gosmopolitan v1.2.1 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/xtgo/set v1.0.0 // indirect github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.2.0 // indirect + github.com/ykadowak/zerologlint v0.1.3 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect github.com/zitadel/oidc v1.13.4 // indirect - gitlab.com/bosi/decorder v0.2.3 // indirect + gitlab.com/bosi/decorder v0.4.1 // indirect + go.tmz.dev/musttag v0.7.1 // indirect go.uber.org/goleak v1.2.1 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.25.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.126.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorgonia.org/vecf32 v0.9.0 // indirect gorgonia.org/vecf64 v0.9.0 // indirect - honnef.co/go/tools v0.4.2 // indirect + honnef.co/go/tools v0.4.3 // indirect howett.net/plist v1.0.0 // indirect - mvdan.cc/gofumpt v0.4.0 // indirect + mvdan.cc/gofumpt v0.5.0 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d // indirect diff --git a/go.sum b/go.sum index f51d2ea8bee..bf1a565ea19 100644 --- a/go.sum +++ b/go.sum @@ -66,24 +66,26 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EU dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/Abirdcfly/dupword v0.0.9 h1:MxprGjKq3yDBICXDgEEsyGirIXfMYXkLNT/agPsE1tk= -github.com/Abirdcfly/dupword v0.0.9/go.mod h1:PzmHVLLZ27MvHSzV7eFmMXSFArWXZPZmfuuziuUrf2g= +github.com/4meepo/tagalign v1.3.2 h1:1idD3yxlRGV18VjqtDbqYvQ5pXqQS0wO2dn6M3XstvI= +github.com/4meepo/tagalign v1.3.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= +github.com/Abirdcfly/dupword v0.0.12 h1:56NnOyrXzChj07BDFjeRA+IUzSz01jmzEq+G4kEgFhc= +github.com/Abirdcfly/dupword v0.0.12/go.mod h1:+us/TGct/nI9Ndcbcp3rgNcQzctTj68pq7TcgNpLfdI= github.com/AlekSi/gocov-xml v1.0.0 h1:4QctJBgXEkbzeKz6PJy6bt3JSPNSN4I2mITYW+eKUoQ= github.com/AlekSi/gocov-xml v1.0.0/go.mod h1:J0qYeZ6tDg4oZubW9mAAgxlqw39PDfoEkzB3HXSbEuA= -github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako= -github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= -github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q= -github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= +github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= +github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= +github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= +github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CPRT/roboclaw v0.0.0-20190825181223-76871438befc h1:X6Ptoxdi1w0lofv51zchUBBvULiL97ruSjtTRa/SL5Q= github.com/CPRT/roboclaw v0.0.0-20190825181223-76871438befc/go.mod h1:1nLByU34wsr4qNJ4yrfxuGFmIl/0/eAuB8VAiGK0GHs= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0 h1:3ZBs7LAezy8gh0uECsA6CGU43FF3zsx5f4eah5FxTMA= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0/go.mod h1:rZLTje5A9kFBe0pzhpe2TdhRniBF++PRHQuRpR8esVc= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -100,8 +102,8 @@ github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cq github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= -github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= +github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= +github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= @@ -120,6 +122,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= +github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= @@ -138,8 +142,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/forbidigo v1.4.0 h1:spdPbupaSqtWORq1Q4eHBoPBmHtwVyLKwaedbSLc5Sw= -github.com/ashanbrown/forbidigo v1.4.0/go.mod h1:IvgwB5Y4fzqSAj/WVXKWigoTkB0dzI2FBbpKWuh7ph8= +github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= +github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v0.0.0-20201205152432-7b7cdbb3025a/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= @@ -170,31 +174,38 @@ github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blackjack/webcam v0.5.0 h1:NImYpsAbWxglejopcQGQ3FClxhJZaBBgr5fV7nsGdvk= -github.com/blackjack/webcam v0.5.0/go.mod h1:zs+RkUZzqpFPHPiwBZ6U5B34ZXXe9i+SiHLKnnukJuI= +github.com/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= +github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= +github.com/blackjack/webcam v0.6.1 h1:K0T6Q0zto23U99gNAa5q/hFoye6uGcKr2aE6hFoxVoE= +github.com/blackjack/webcam v0.6.1/go.mod h1:zs+RkUZzqpFPHPiwBZ6U5B34ZXXe9i+SiHLKnnukJuI= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bluenviron/gortsplib/v4 v4.8.0 h1:nvFp6rHALcSep3G9uBFI0uogS9stVZLNq/92TzGZdQg= github.com/bluenviron/gortsplib/v4 v4.8.0/go.mod h1:+d+veuyvhvikUNp0GRQkk6fEbd/DtcXNidMRm7FQRaA= +github.com/bluenviron/mediacommon v1.9.2 h1:EHcvoC5YMXRcFE010bTNf07ZiSlB/e/AdZyG7GsEYN0= +github.com/bluenviron/mediacommon v1.9.2/go.mod h1:lt8V+wMyPw8C69HAqDWV5tsAwzN9u2Z+ca8B6C//+n0= github.com/bombsimon/wsl/v3 v3.2.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= -github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= -github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= -github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= +github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= +github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= +github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= +github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= github.com/bufbuild/buf v1.6.0 h1:VXHJ+n3NYzpDH4Ysuj9ivVf23Xk/NAxcZPbAAFv4EDs= github.com/bufbuild/buf v1.6.0/go.mod h1:23u11F6tmCF9sSB/dz7ybxxJ5q6qmWY0Lb4E4TR1rqw= github.com/bufbuild/connect-go v0.1.1 h1:EANBP3Vrk+MH08bfOJQ07FAtA5p4wQB5ouCXYm3LxGE= github.com/bufbuild/connect-go v0.1.1/go.mod h1:4efZ2eXFENwd4p7tuLaL9m0qtTsCOzuBvrohvRGevDM= github.com/bufbuild/protocompile v0.5.1 h1:mixz5lJX4Hiz4FpqFREJHIXLfaLBntfaJv1h+/jS+Qg= github.com/bufbuild/protocompile v0.5.1/go.mod h1:G5iLmavmF4NsYtpZFvE3B/zFch2GIY8+wjsYLR/lc40= -github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= +github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= +github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -212,10 +223,12 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 h1:cy5GCEZLUCshCGCRRUjxHrDUqkB4l5cuUt3ShEckQEo= -github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348/go.mod h1:f/miWtG3SSuTxKsNK3o58H1xl+XV6ZIfbC6p7lPPB8U= +github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= +github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chewxy/hm v1.0.0 h1:zy/TSv3LV2nD3dwUEQL2VhXeoXbb9QkpmdRAVUFiA6k= github.com/chewxy/hm v1.0.0/go.mod h1:qg9YI4q6Fkj/whwHR1D+bOGeF7SniIP40VweVepLjg0= github.com/chewxy/math32 v1.0.0/go.mod h1:Miac6hA1ohdDUTagnvJy/q+aNnEk16qWUdb8ZVhvCN0= @@ -268,16 +281,15 @@ github.com/d2r2/go-i2c v0.0.0-20191123181816-73a8a799d6bc/go.mod h1:AwxDPnsgIpy4 github.com/d2r2/go-logger v0.0.0-20210606094344-60e9d1233e22 h1:nO+SY4KOMsF/LsZ5EtbSKhiT3M6sv/igo2PEru/xEHI= github.com/d2r2/go-logger v0.0.0-20210606094344-60e9d1233e22/go.mod h1:eSx+YfcVy5vCjRZBNIhpIpfCGFMQ6XSOSQkDk7+VCpg= github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/daixiang0/gci v0.9.1 h1:jBrwBmBZTDsGsXiaCTLIe9diotp1X4X64zodFrh7l+c= -github.com/daixiang0/gci v0.9.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= +github.com/daixiang0/gci v0.11.0 h1:XeQbFKkCRxvVyn06EOuNY6LPGBLVuB/W130c8FrnX6A= +github.com/daixiang0/gci v0.11.0/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/de-bkg/gognss v0.0.0-20220601150219-24ccfdcdbb5d h1:AHDio/bKqSNW6c8d9vP0KsVsBBOdvuN5FyDHpnGY7t0= github.com/de-bkg/gognss v0.0.0-20220601150219-24ccfdcdbb5d/go.mod h1:9ExAdt7E0RgTFoLc2GFji9LmfnMA11NVRz3eJ6yogvE= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= @@ -349,8 +361,8 @@ github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -362,14 +374,16 @@ github.com/fullstorydev/grpcurl v1.8.6/go.mod h1:WhP7fRQdhxz2TkL97u+TCb505sxfH78 github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gen2brain/malgo v0.11.21 h1:qsS4Dh6zhZgmvAW5CtKRxDjQzHbc2NJlBG9eE0tgS8w= github.com/gen2brain/malgo v0.11.21/go.mod h1:f9TtuN7DVrXMiV/yIceMeWpvanyVzJQMlBecJFVMxww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-audio/audio v1.0.0 h1:zS9vebldgbQqktK4H0lUqWrG8P0NxCJVqcj7ZpNnwd4= github.com/go-audio/audio v1.0.0/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs= github.com/go-audio/riff v1.0.0 h1:d8iCGbDvox9BfLagY94fBynxSPHO80LmZCaOsmKxokA= @@ -382,8 +396,8 @@ github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-critic/go-critic v0.5.4/go.mod h1:cjB4YGw+n/+X8gREApej7150Uyy1Tg8If6F2XOAUXNE= github.com/go-critic/go-critic v0.5.5/go.mod h1:eMs1Oc/oIP+CYNVN09M+XZYffIPuRHawxzlggAPN9Kk= -github.com/go-critic/go-critic v0.6.7 h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM= -github.com/go-critic/go-critic v0.6.7/go.mod h1:fYZUijFdcnxgx6wPjQA2QEjIRaNCT0gO8bhexy6/QmE= +github.com/go-critic/go-critic v0.8.2 h1:mekhZ9jw5NBEj3I8o/EywXw5zBfGAJuMo4VVVjtxF80= +github.com/go-critic/go-critic v0.8.2/go.mod h1:nZPlrtVfOuLOe8GpvWTfcMzfkG0QVZWAziAeXpivfQo= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.3.0 h1:CIDlMm0djMO3XIKHVz2na9lFKt3kdC/YCy7k7lLpyjE= @@ -410,8 +424,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-nlopt/nlopt v0.0.0-20230219125344-443d3362dcb5 h1:JlR5qQ/dy4NPpeKld/CJR6cIcL0ll4OQ7ieylY5kJ20= github.com/go-nlopt/nlopt v0.0.0-20230219125344-443d3362dcb5/go.mod h1:crLzNxWuUkZODn9zme0coCcBvPQrM3hnbQWR3uolF8o= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= @@ -419,28 +433,29 @@ github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw= -github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-restruct/restruct v1.2.0-alpha.0.20210525045353-983b86fa188e h1:PIFVUcdZ9OADg9XAsN0I8OzUzmYXHU+2msP2X7ST/fo= github.com/go-restruct/restruct v1.2.0-alpha.0.20210525045353-983b86fa188e/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astcopy v1.0.3 h1:r0bgSRlMOAgO+BdQnVAcpMSMkrQCnV6ZJmIkrJgcJj0= -github.com/go-toolsmith/astcopy v1.0.3/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= @@ -452,8 +467,8 @@ github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdY github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= @@ -481,7 +496,6 @@ github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-graphviz v0.1.3-0.20240305010347-606fdf55b06d h1:V1/uQfndsWudlWLRn3pKUj6QZcifa9BZyeaedNA+Wik= github.com/goccy/go-graphviz v0.1.3-0.20240305010347-606fdf55b06d/go.mod h1:pMYpbAqJT10V8dzV1JN/g/wUlG/0imKPzn3ZsrchGCI= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= @@ -555,15 +569,15 @@ github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzr github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= github.com/golangci/golangci-lint v1.38.0/go.mod h1:Knp/sd5ATrVp7EOzWzwIIFH+c8hUfpW+oOQb8NvdZDo= github.com/golangci/golangci-lint v1.39.0/go.mod h1:mzMK3FGyk8LKTOxpRDcDqxwHVudnYemESTt5rpUxqCM= -github.com/golangci/golangci-lint v1.51.2 h1:yIcsT1X9ZYHdSpeWXRT1ORC/FPGSqDHbHsu9uk4FK7M= -github.com/golangci/golangci-lint v1.51.2/go.mod h1:KH9Q7/3glwpYSknxUgUyLlAv46A8fsSKo1hH2wDvkr8= +github.com/golangci/golangci-lint v1.54.0 h1:sWD8sCmlWRZYj7I0VZLwX7uYfjIcIUHq8rSO4IJtzdw= +github.com/golangci/golangci-lint v1.54.0/go.mod h1:iNEG4/FSaCPMDZTk1JGetYZzz5sg25ref6QECL/NA9U= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= -github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= +github.com/golangci/misspell v0.4.1 h1:+y73iSicVy2PqyX7kmUefHusENlrP9YwuHZHPLGQj/g= +github.com/golangci/misspell v0.4.1/go.mod h1:9mAN1quEo3DlpbaIKKyEvRxK1pwqR9s/Sea1bJCtlNI= github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= @@ -589,6 +603,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -610,6 +625,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= @@ -635,8 +652,8 @@ github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U= -github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= +github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -733,8 +750,8 @@ github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/invopop/jsonschema v0.6.0 h1:8e+xY8ZEn8gDHUYylSlLHy22P+SLeIRIHv3nM3hCbmY= github.com/invopop/jsonschema v0.6.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= @@ -790,8 +807,6 @@ github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db/go.mod h1:oSFU2R4XK/ github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/junk1tm/musttag v0.4.5 h1:d+mpJ1vn6WFEVKHwkgJiIedis1u/EawKOuUTygAUtCo= -github.com/junk1tm/musttag v0.4.5/go.mod h1:XkcL/9O6RmD88JBXb+I15nYRl9W4ExhgQeCBEhfMC8U= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kellydunn/golang-geo v0.7.0 h1:A5j0/BvNgGwY6Yb6inXQxzYwlPHc6WVZR+MrarZYNNg= github.com/kellydunn/golang-geo v0.7.0/go.mod h1:YYlQPJ+DPEzrHx8kT3oPHC/NjyvCCXE+IuKGKdrjrcU= @@ -803,8 +818,8 @@ github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.3 h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw= -github.com/kkHAIKE/contextcheck v1.1.3/go.mod h1:PG/cwd6c0705/LM0KTr1acO2gORUxkSVWyLJOFW5qoo= +github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= +github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -813,7 +828,10 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e h1:+lIPJOWl+jSiJOc70QXJ07+2eg2Jy2EC7Mi11BWujeM= github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -822,8 +840,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -833,8 +851,8 @@ github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5 github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= -github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g= -github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= +github.com/kunwardeep/paralleltest v1.0.8 h1:Ul2KsqtzFxTlSU7IP0JusWlLiNqQaloB9vguyjbE558= +github.com/kunwardeep/paralleltest v1.0.8/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= github.com/kylelemons/go-gypsy v1.0.0 h1:7/wQ7A3UL1bnqRMnZ6T8cwCOArfZCxFmb1iTxaOOo1s= github.com/kylelemons/go-gypsy v1.0.0/go.mod h1:chkXM0zjdpXOiqkCW1XcCHDfjfk14PH2KKkQWxfJUcU= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= @@ -844,25 +862,23 @@ github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3 github.com/ldez/gomoddirectives v0.2.1/go.mod h1:sGicqkRgBOg//JfpXwkB9Hj0X5RyJ7mlACM5B9f6Me4= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.4.0 h1:sylp7d9kh6AdXN2DpVGHBRb5guTVAgOxqNGhbqc4b1c= -github.com/ldez/tagliatelle v0.4.0/go.mod h1:mNtTfrHy2haaBAw+VT7IBV6VXBThS7TCreYWbBcJ87I= +github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= +github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= -github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= -github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/jwx v1.2.29 h1:QT0utmUJ4/12rmsVQrJ3u55bycPkKqGYuGT4tyRhxSQ= +github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= @@ -870,8 +886,8 @@ github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lmittmann/ppm v1.0.2 h1:YW2FFG864rGdrzYu41XngKfptOQU2V+cOmi/hBbaUlI= @@ -891,10 +907,11 @@ github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/maratori/testpackage v1.1.0 h1:GJY4wlzQhuBusMF1oahQCBtUV/AQ/k69IZ68vxaac2Q= -github.com/maratori/testpackage v1.1.0/go.mod h1:PeAhzU8qkCwdGEMTEupsHJNlQu2gZopMC6RjbhmHeDc= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= +github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -912,8 +929,8 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -936,8 +953,8 @@ github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aks github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/mgechev/revive v1.0.3/go.mod h1:POGGZagSo/0frdr7VeAifzS5Uka0d0GPiM35MsTO8nE= github.com/mgechev/revive v1.0.5/go.mod h1:tSw34BaGZ0iF+oVKDOjq1/LuxGifgW7shaJ6+dBYFXg= -github.com/mgechev/revive v1.2.5 h1:UF9AR8pOAuwNmhXj2odp4mxv9Nx2qUIwVz8ZsU+Mbec= -github.com/mgechev/revive v1.2.5/go.mod h1:nFOXent79jMTISAfOAasKfy0Z2Ejq0WX7Qn/KAdYopI= +github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= +github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -979,8 +996,9 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwd github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= +github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= github.com/mozilla/tls-observatory v0.0.0-20201209171846-0547674fceff/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mozilla/tls-observatory v0.0.0-20210209181001-cf43108d6880/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= @@ -1014,15 +1032,15 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= -github.com/nishanths/exhaustive v0.9.5 h1:TzssWan6orBiLYVqewCG8faud9qlFntJE30ACpzmGME= -github.com/nishanths/exhaustive v0.9.5/go.mod h1:IbwrGdVMizvDcIxPYGVdQn5BqWJaOwpCvg4RGb8r/TA= +github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= +github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.8.1 h1:/y4o/0hV+ruUHj4xXh89xlFjoaitnI4LnkpuYs02q1c= -github.com/nunnatsa/ginkgolinter v0.8.1/go.mod h1:FYYLtszIdmzCH8XMaMPyxPVXZ7VCaIm55bA+gugx+14= +github.com/nunnatsa/ginkgolinter v0.13.3 h1:wEvjrzSMfDdnoWkctignX9QTf4rT9f4GkQ3uVoXBmiU= +github.com/nunnatsa/ginkgolinter v0.13.3/go.mod h1:aTKXo8WddENYxNEFT+4ZxEgWXqlD9uMD3w9Bfw/ABEc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1041,15 +1059,15 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.8.0 h1:pAM+oBNPrpXRs+E/8spkeGx9QgekbRVyr74EUvRVOUI= -github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= +github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= @@ -1072,8 +1090,8 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= @@ -1097,8 +1115,8 @@ github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= -github.com/pion/mediadevices v0.6.2 h1:xffUQhILcEVka2EqK1XyHxZniiZNMREdX3uvHXBeKgI= -github.com/pion/mediadevices v0.6.2/go.mod h1:PZ35qSDPw3Q2MetsV1HZrYZ+UNqRQeCd2owGUmjhWbg= +github.com/pion/mediadevices v0.6.4 h1:BDR6iEcc80URpJ+wkSUfW/X+pan98nEfoX8ab6mkeAE= +github.com/pion/mediadevices v0.6.4/go.mod h1:Qo9oecByIaLcwH1+S/76FcaGurRqrkHls07y5VjWW1Q= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= @@ -1147,8 +1165,8 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polyfloyd/go-errorlint v0.0.0-20201127212506-19bd8db6546f/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/polyfloyd/go-errorlint v1.1.0 h1:VKoEFg5yxSgJ2yFPVhxW7oGz+f8/OVcuMeNvcPIi6Eg= -github.com/polyfloyd/go-errorlint v1.1.0/go.mod h1:Uss7Bc/izYG0leCMRx3WVlrpqWedSZk7V/FUQW6VJ6U= +github.com/polyfloyd/go-errorlint v1.4.3 h1:P6NALOLV8BrWhm6PsqOraUK05E5h8IZnpXYJ+CIg+0U= +github.com/polyfloyd/go-errorlint v1.4.3/go.mod h1:VPlWPh6hB/wruVG803SuNpLuTGNjLHYlvcdSy4RhdPA= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -1207,8 +1225,9 @@ github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mo github.com/quasilyte/go-ruleguard/rules v0.0.0-20210221215616-dfcc94e3dffd/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1223,8 +1242,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= @@ -1253,8 +1272,8 @@ github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec/v2 v2.6.1/go.mod h1:I76p3NTHBXsGhybUW+cEQ692q2Vp+A0Z6ZLzDIZy+Ao= github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= -github.com/securego/gosec/v2 v2.15.0 h1:v4Ym7FF58/jlykYmmhZ7mTm7FQvN/setNm++0fgIAtw= -github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= +github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= +github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= @@ -1271,10 +1290,10 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.2 h1:0hLQKpgC53OVF1VT7CeoFHk9YKstur1XOgfYIc1yrHI= -github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= @@ -1285,8 +1304,9 @@ github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN2 github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= +github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= @@ -1304,8 +1324,8 @@ github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1348,6 +1368,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= @@ -1360,8 +1381,8 @@ github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1 github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A= -github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= +github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= @@ -1373,10 +1394,10 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo= -github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.3 h1:ecACo9fNiHxX4/Bc02rW2+kaJIAMAes7qJ7JKxt0EZI= -github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= +github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= +github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -1384,12 +1405,14 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomarrell/wrapcheck v0.0.0-20201130113247-1683564d9756/go.mod h1:yiFB6fFoV7saXirUGfuK+cPtUh4NX/Hf5y2WC2lehu0= github.com/tomarrell/wrapcheck v1.0.0/go.mod h1:Bd3i1FaEKe3XmcPoHhNQ+HM0S8P6eIXoQIoGj/ndJkU= -github.com/tomarrell/wrapcheck/v2 v2.8.0 h1:qDzbir0xmoE+aNxGCPrn+rUSxAX+nG6vREgbbXAR81I= -github.com/tomarrell/wrapcheck/v2 v2.8.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= +github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= +github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/u2takey/ffmpeg-go v0.4.1 h1:l5ClIwL3N2LaH1zF3xivb3kP2HW95eyG5xhHE1JdZ9Y= github.com/u2takey/ffmpeg-go v0.4.1/go.mod h1:ruZWkvC1FEiUNjmROowOAps3ZcWxEiOpFoHCvk97kGc= github.com/u2takey/go-utils v0.3.1 h1:TaQTgmEZZeDHQFYfd+AdUT1cT4QJgJn/XVPELhHw4ys= @@ -1398,10 +1421,11 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= +github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= @@ -1410,8 +1434,8 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.10.3 h1:oi571Fxz5aHugfBAJd5nkwSk3fzATXtMlpxdLylSCMo= github.com/urfave/cli/v2 v2.10.3/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/uudashr/gocognit v1.0.7 h1:e9aFXgKgUJrQ5+bs61zBigmj7bFJ/5cC6HmMahVzuDo= +github.com/uudashr/gocognit v1.0.7/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= @@ -1430,6 +1454,8 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= +github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= github.com/xfmoulet/qoi v0.2.0 h1:+Smrwzy5ptRnPzGm/YHkZfyK9qGUSoOpiEPngGmFv+c= github.com/xfmoulet/qoi v0.2.0/go.mod h1:uuPUygmV7o8qy7PhiaGAQX0iLiqoUvFEUKjwUFtlaTQ= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -1442,6 +1468,8 @@ github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/ykadowak/zerologlint v0.1.3 h1:TLy1dTW3Nuc+YE3bYRPToG1Q9Ej78b5UUN6bjbGdxPE= +github.com/ykadowak/zerologlint v0.1.3/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= @@ -1459,10 +1487,12 @@ github.com/zitadel/oidc v1.13.4 h1:+k2GKqP9Ld9S2MSFlj+KaNsoZ3J9oy+Ezw51EzSFuC8= github.com/zitadel/oidc v1.13.4/go.mod h1:3h2DhUcP02YV6q/CA/BG4yla0o6rXjK+DkJGK/dwJfw= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= +gitlab.com/bosi/decorder v0.4.1 h1:VdsdfxhstabyhZovHafFw+9eJ6eU0d2CkFNJcZz/NU4= +gitlab.com/bosi/decorder v0.4.1/go.mod h1:jecSqWUew6Yle1pCr2eLWTensJMmsxHsBwt+PVbkAqA= go-hep.org/x/hep v0.32.1 h1:O96fOyMP+4ET8X+Uu38VFdegQb7rL0rjmFqXMCSm4VM= go-hep.org/x/hep v0.32.1/go.mod h1:VX3IVUv0Ku5bgWhE+LxRQ1aT7BmWWxSxQu02hfsoeRI= +go-simpler.org/assert v0.5.0 h1:+5L/lajuQtzmbtEfh69sr5cRf2/xZzyJhFjoOz/PPqs= +go-simpler.org/assert v0.5.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= go.einride.tech/vlp16 v0.7.0 h1:mR7jChj9PTxxKhEn2HkHeT3zwKK45qIb6DLZkbyQZuw= go.einride.tech/vlp16 v0.7.0/go.mod h1:Hk+9Ts3PftwxIeXbabBO2zFPP2vcmnRno3ZgXGMh3Os= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -1484,6 +1514,8 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.tmz.dev/musttag v0.7.1 h1:9lFmeSFnFfPuMq4IksHGomItE6NgKMNW2Nt2FPOhCfU= +go.tmz.dev/musttag v0.7.1/go.mod h1:oJLkpR56EsIryktZJk/B0IroSMi37YWver47fibGh5U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1508,17 +1540,19 @@ go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.viam.com/api v0.1.295 h1:yfkJOyQEq9BQoD7Hw4UNEmyA58qZKlthSVk8Ml6gnBM= -go.viam.com/api v0.1.295/go.mod h1:msa4TPrMVeRDcG4YzKA/S6wLEUC7GyHQE973JklrQ10= +go.viam.com/api v0.1.296 h1:CuGF7IVLUmVn5cvWvmGuF7TCviZ7iYJKBqABxcb8G4M= +go.viam.com/api v0.1.296/go.mod h1:msa4TPrMVeRDcG4YzKA/S6wLEUC7GyHQE973JklrQ10= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 h1:oBiK580EnEIzgFLU4lHOXmGAE3MxnVbeR7s1wp/F3Ps= go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2/go.mod h1:XM0tej6riszsiNLT16uoyq1YjuYPWlRBweTPRDanIts= -go.viam.com/utils v0.1.71 h1:k2wz3VqIiBZqBNVGw16EIeOa9PFyanCzze5yxmfsws8= -go.viam.com/utils v0.1.71/go.mod h1:F1vVtLQdGqvV8aOfqDZ8s8uRj/zetSPhghMUMl6ir2w= +go.viam.com/utils v0.1.77 h1:eI2BzUxf2kILSqPT5GbWw605Z26gKAiJ7wGSqx8OfCw= +go.viam.com/utils v0.1.77/go.mod h1:3xcBBlLsRX2eWpWuQrFJ7UVxsgXwJg8Fx30Rt/kp52g= go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 h1:WJhcL4p+YeDxmZWg141nRm7XC8IDmhz7lk5GpadO1Sg= go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= gocv.io/x/gocv v0.25.0/go.mod h1:Rar2PS6DV+T4FL+PM535EImD/h13hGVaHhnCu1xarBs= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= goji.io v2.0.2+incompatible/go.mod h1:sbqFwrtqZACxLBTQcdgVjFh54yGVCvwq8+w49MVMMIk= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1537,15 +1571,16 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1560,8 +1595,9 @@ golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8H golang.org/x/exp v0.0.0-20230725012225-302865e7556b h1:tK7yjGqVRzYdXsBcfD2MLhFAhHfDgGLm2rY1ub7FA9k= golang.org/x/exp v0.0.0-20230725012225-302865e7556b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 h1:6WHiuFL9FNjg8RljAaT7FNUuKDbvMqS1i5cr2OE2sLQ= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= +golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1585,6 +1621,8 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b h1:kfWLZgb8iUBHdE9WydD5V5dHIS/F6HjlBZNyJfn2bs4= +golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b/go.mod h1:4efzQnuA1nICq6h4kmZRMGzbPiP06lZvgADUu1VpJCE= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -1600,8 +1638,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1660,7 +1698,6 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= @@ -1668,8 +1705,9 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1698,8 +1736,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1789,7 +1827,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1799,15 +1836,16 @@ golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -1815,8 +1853,10 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1828,14 +1868,14 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1955,11 +1995,10 @@ golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2104,8 +2143,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2167,14 +2206,14 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.2/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -honnef.co/go/tools v0.4.2 h1:6qXr+R5w+ktL5UkwEbPp+fEvfyoMPche6GkOpGHZcLc= -honnef.co/go/tools v0.4.2/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= +honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= +honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= mvdan.cc/gofumpt v0.1.0/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= -mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= +mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= +mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= From c07588c3031e4855bb67187601495b3ec784e65f Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Mon, 13 May 2024 15:52:00 -0400 Subject: [PATCH 05/17] clean up --- components/board/board.go | 1 + components/board/mcp3008helper/mcp3008.go | 6 ++++-- components/board/numato/board.go | 4 ++-- components/board/pinwrappers/analog_smoother_test.go | 5 ++++- components/board/server_test.go | 4 ++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/components/board/board.go b/components/board/board.go index e1da4dce3a7..fd0660b6506 100644 --- a/components/board/board.go +++ b/components/board/board.go @@ -83,6 +83,7 @@ type Analog interface { Write(ctx context.Context, value int, extra map[string]interface{}) error } +// AnalogRange contains themin, max, and stepSize of the analog reader. type AnalogRange struct { Min float32 Max float32 diff --git a/components/board/mcp3008helper/mcp3008.go b/components/board/mcp3008helper/mcp3008.go index 4d2d0338f73..45c3755b8c4 100644 --- a/components/board/mcp3008helper/mcp3008.go +++ b/components/board/mcp3008helper/mcp3008.go @@ -38,7 +38,9 @@ func (config *MCP3008AnalogConfig) Validate(path string) error { return nil } -func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]interface{}) (value int, analogRange board.AnalogRange, err error) { +func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]interface{}) ( + value int, analogRange board.AnalogRange, err error, +) { var tx [3]byte tx[0] = 1 // start bit tx[1] = byte((8 + mar.Channel) << 4) // single-ended @@ -60,7 +62,7 @@ func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]inter // garbage and might be non-zero. val := 0x03FF & ((int(rx[1]) << 8) | int(rx[2])) - //TODO: wtf is the analog range for this + // returning blank analog range since mcp3008 will be removed soon. return val, board.AnalogRange{}, nil } diff --git a/components/board/numato/board.go b/components/board/numato/board.go index aff0b9e5d8b..c0fde351bbb 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -367,8 +367,8 @@ func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, b if err != nil { return 0, board.AnalogRange{}, err } - var max float32 = 0.0 - var stepSize float32 = 0.0 + var max float32 + var stepSize float32 switch a.b.productID { case 0x805: // 128 channel usb numato has 12 bit resolution diff --git a/components/board/pinwrappers/analog_smoother_test.go b/components/board/pinwrappers/analog_smoother_test.go index b3dc2626d4b..deb4342d0a6 100644 --- a/components/board/pinwrappers/analog_smoother_test.go +++ b/components/board/pinwrappers/analog_smoother_test.go @@ -60,9 +60,12 @@ func TestAnalogSmoother1(t *testing.T) { testutils.WaitForAssertionWithSleep(t, 10*time.Millisecond, 200, func(tb testing.TB) { tb.Helper() - v, _, err := as.Read(context.Background(), nil) + v, analogRange, err := as.Read(context.Background(), nil) test.That(tb, err, test.ShouldEqual, errStopReading) test.That(tb, v, test.ShouldEqual, 52) + test.That(tb, analogRange.Min, test.ShouldEqual, 0) + test.That(tb, analogRange.Max, test.ShouldEqual, 3.3) + test.That(tb, analogRange.StepSize, test.ShouldEqual, 0.1) // need lock to access testReader.n testReader.mu.Lock() diff --git a/components/board/server_test.go b/components/board/server_test.go index d9048dc94d0..bf7ccd333bc 100644 --- a/components/board/server_test.go +++ b/components/board/server_test.go @@ -451,7 +451,7 @@ func TestServerSetPWMFrequency(t *testing.T) { } } -//nolint:dupl + func TestServerReadAnalogReader(t *testing.T) { type request = pb.ReadAnalogReaderRequest type response = pb.ReadAnalogReaderResponse @@ -621,7 +621,7 @@ func TestServerWriteAnalog(t *testing.T) { } } -//nolint:dupl + func TestServerGetDigitalInterruptValue(t *testing.T) { type request = pb.GetDigitalInterruptValueRequest type response = pb.GetDigitalInterruptValueResponse From 4b3f36a5799b4992163514fbcc8040e2809ecc6d Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Mon, 13 May 2024 16:02:28 -0400 Subject: [PATCH 06/17] lint --- components/board/numato/board.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/board/numato/board.go b/components/board/numato/board.go index c0fde351bbb..a5073312c29 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -20,7 +20,6 @@ import ( pb "go.viam.com/api/component/board/v1" "go.viam.com/utils" "go.viam.com/utils/serial" - "go.viam.com/utils/usb" "go.viam.com/rdk/components/board" "go.viam.com/rdk/components/board/pinwrappers" @@ -420,8 +419,7 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi } // Find the numato board's productid - var products []usb.Description - products = getSerialDevices() + products := getSerialDevices() var productID int for _, product := range products { From ec95030c2f444ebe31fe23f5cc4b27e7e5fb4447 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Mon, 13 May 2024 16:08:45 -0400 Subject: [PATCH 07/17] lint --- components/board/server_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/components/board/server_test.go b/components/board/server_test.go index bf7ccd333bc..70d9aa18b42 100644 --- a/components/board/server_test.go +++ b/components/board/server_test.go @@ -450,8 +450,6 @@ func TestServerSetPWMFrequency(t *testing.T) { }) } } - - func TestServerReadAnalogReader(t *testing.T) { type request = pb.ReadAnalogReaderRequest type response = pb.ReadAnalogReaderResponse @@ -621,7 +619,6 @@ func TestServerWriteAnalog(t *testing.T) { } } - func TestServerGetDigitalInterruptValue(t *testing.T) { type request = pb.GetDigitalInterruptValueRequest type response = pb.GetDigitalInterruptValueResponse From fde443fc694aaaca9df329a122559e2fd9111947 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Mon, 13 May 2024 16:25:46 -0400 Subject: [PATCH 08/17] lint again --- components/board/server_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/components/board/server_test.go b/components/board/server_test.go index 70d9aa18b42..c88a3024e40 100644 --- a/components/board/server_test.go +++ b/components/board/server_test.go @@ -450,6 +450,7 @@ func TestServerSetPWMFrequency(t *testing.T) { }) } } + func TestServerReadAnalogReader(t *testing.T) { type request = pb.ReadAnalogReaderRequest type response = pb.ReadAnalogReaderResponse From ad58c9b8a53b6a584164c3ff8b59ee54b158b52d Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Tue, 14 May 2024 13:59:13 -0400 Subject: [PATCH 09/17] pr changes --- components/board/board.go | 10 ++++--- components/board/client.go | 8 +++--- components/board/client_test.go | 14 +++++----- components/board/collector.go | 13 +++++----- components/board/collectors_test.go | 4 +-- components/board/fake/board.go | 11 +++----- components/board/genericlinux/board.go | 4 +-- components/board/mcp3008helper/mcp3008.go | 10 +++---- components/board/numato/board.go | 16 +++++++----- components/board/numato/board_test.go | 18 ++++++------- components/board/numato/darwin_utils.go | 1 + components/board/numato/linux_utils.go | 1 + .../board/pinwrappers/analog_smoother_test.go | 16 ++++++------ components/board/pinwrappers/analogs.go | 26 ++++++++++--------- components/board/server.go | 8 +++--- components/board/server_test.go | 16 +++++------- components/board/status.go | 4 +-- components/gripper/softrobotics/gripper.go | 8 +++--- components/input/gpio/gpio.go | 26 +++++++++---------- components/input/gpio/gpio_test.go | 12 ++++----- testutils/inject/analog.go | 4 +-- 21 files changed, 118 insertions(+), 112 deletions(-) diff --git a/components/board/board.go b/components/board/board.go index fd0660b6506..c203d7c03f8 100644 --- a/components/board/board.go +++ b/components/board/board.go @@ -77,14 +77,18 @@ type Board interface { // An Analog represents an analog pin that resides on a board. type Analog interface { // Read reads off the current value. - Read(ctx context.Context, extra map[string]interface{}) (int, AnalogRange, error) + Read(ctx context.Context, extra map[string]interface{}) (AnalogValue, error) // Write writes a value to the analog pin. Write(ctx context.Context, value int, extra map[string]interface{}) error } -// AnalogRange contains themin, max, and stepSize of the analog reader. -type AnalogRange struct { +// AnalogValue contains all info about the analog reading. +// Value represents the reading in bits. +// Min and Max represent the range of raw analog values. +// StepSize is the precision per bit of the reading. +type AnalogValue struct { + Value int Min float32 Max float32 StepSize float32 diff --git a/components/board/client.go b/components/board/client.go index 684a2393a7e..4e8b28631c1 100644 --- a/components/board/client.go +++ b/components/board/client.go @@ -134,10 +134,10 @@ type analogClient struct { analogName string } -func (ac *analogClient) Read(ctx context.Context, extra map[string]interface{}) (int, AnalogRange, error) { +func (ac *analogClient) Read(ctx context.Context, extra map[string]interface{}) (AnalogValue, error) { ext, err := protoutils.StructToStructPb(extra) if err != nil { - return 0, AnalogRange{}, err + return AnalogValue{}, err } // the api method is named ReadAnalogReader, it is named differently than // the board interface functions. @@ -147,9 +147,9 @@ func (ac *analogClient) Read(ctx context.Context, extra map[string]interface{}) Extra: ext, }) if err != nil { - return 0, AnalogRange{}, err + return AnalogValue{}, err } - return int(resp.Value), AnalogRange{Min: resp.MinRange, Max: resp.MaxRange, StepSize: resp.StepSize}, nil + return AnalogValue{Value: int(resp.Value), Min: resp.MinRange, Max: resp.MaxRange, StepSize: resp.StepSize}, nil } func (ac *analogClient) Write(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/components/board/client_test.go b/components/board/client_test.go index d83297ce00a..0265766e165 100644 --- a/components/board/client_test.go +++ b/components/board/client_test.go @@ -141,16 +141,16 @@ func TestWorkingClient(t *testing.T) { test.That(t, injectBoard.AnalogByNameCap(), test.ShouldResemble, []interface{}{"analog1"}) // Analog: Read - injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { + injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { actualExtra = extra - return 6, board.AnalogRange{Min: 0, Max: 10, StepSize: 0.1}, nil + return board.AnalogValue{Value: 6, Min: 0, Max: 10, StepSize: 0.1}, nil } - readVal, analogRange, err := analog1.Read(context.Background(), expectedExtra) + analogVal, err := analog1.Read(context.Background(), expectedExtra) test.That(t, err, test.ShouldBeNil) - test.That(t, readVal, test.ShouldEqual, 6) - test.That(t, analogRange.Min, test.ShouldEqual, 0) - test.That(t, analogRange.Max, test.ShouldEqual, 10) - test.That(t, analogRange.StepSize, test.ShouldEqual, 0.1) + test.That(t, analogVal.Value, test.ShouldEqual, 6) + test.That(t, analogVal.Min, test.ShouldEqual, 0) + test.That(t, analogVal.Max, test.ShouldEqual, 10) + test.That(t, analogVal.StepSize, test.ShouldEqual, 0.1) test.That(t, actualExtra, test.ShouldResemble, expectedExtra) actualExtra = nil diff --git a/components/board/collector.go b/components/board/collector.go index b558ff2b247..64a77bfdaa0 100644 --- a/components/board/collector.go +++ b/components/board/collector.go @@ -40,14 +40,13 @@ func newAnalogCollector(resource interface{}, params data.CollectorParams) (data } cFunc := data.CaptureFunc(func(ctx context.Context, arg map[string]*anypb.Any) (interface{}, error) { - var value int - var analogRange AnalogRange + var analogValue AnalogValue if _, ok := arg[analogReaderNameKey]; !ok { return nil, data.FailedToReadErr(params.ComponentName, analogs.String(), errors.New("Must supply reader_name in additional_params for analog collector")) } if reader, err := board.AnalogByName(arg[analogReaderNameKey].String()); err == nil { - value, analogRange, err = reader.Read(ctx, data.FromDMExtraMap) + analogValue, err = reader.Read(ctx, data.FromDMExtraMap) if err != nil { // A modular filter component can be created to filter the readings from a component. The error ErrNoCaptureToStore // is used in the datamanager to exclude readings from being captured and stored. @@ -58,10 +57,10 @@ func newAnalogCollector(resource interface{}, params data.CollectorParams) (data } } return pb.ReadAnalogReaderResponse{ - Value: int32(value), - MinRange: analogRange.Min, - MaxRange: analogRange.Max, - StepSize: analogRange.StepSize, + Value: int32(analogValue.Value), + MinRange: analogValue.Min, + MaxRange: analogValue.Max, + StepSize: analogValue.StepSize, }, nil }) return data.NewCollector(cFunc, params) diff --git a/components/board/collectors_test.go b/components/board/collectors_test.go index 77c24245334..18d5c2f85d5 100644 --- a/components/board/collectors_test.go +++ b/components/board/collectors_test.go @@ -99,8 +99,8 @@ func TestCollectors(t *testing.T) { func newBoard() board.Board { b := &inject.Board{} analog := &inject.Analog{} - analog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { - return 1, board.AnalogRange{Min: 0, Max: 10, StepSize: 0.1}, nil + analog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { + return board.AnalogValue{Value: 1, Min: 0, Max: 10, StepSize: 0.1}, nil } b.AnalogByNameFunc = func(name string) (board.Analog, error) { return analog, nil diff --git a/components/board/fake/board.go b/components/board/fake/board.go index e4eb7a175af..fb907324f60 100644 --- a/components/board/fake/board.go +++ b/components/board/fake/board.go @@ -289,18 +289,15 @@ func (a *Analog) reset(pin string) { a.Mu.Unlock() } -func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { +func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { a.Mu.RLock() defer a.Mu.RUnlock() if a.pin != analogTestPin { + a.fakeValue++ + a.fakeValue %= 1001 a.Value = a.fakeValue - if a.fakeValue == 1000 { - a.fakeValue = 0 - } else { - a.fakeValue++ - } } - return a.Value, board.AnalogRange{Min: 0, Max: 1000, StepSize: 1}, nil + return board.AnalogValue{Value: a.Value, Min: 0, Max: 1000, StepSize: 1}, nil } func (a *Analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/components/board/genericlinux/board.go b/components/board/genericlinux/board.go index c7884ff921b..4f6d940d4c1 100644 --- a/components/board/genericlinux/board.go +++ b/components/board/genericlinux/board.go @@ -351,11 +351,11 @@ func newWrappedAnalogReader(ctx context.Context, chipSelect string, reader *pinw return &wrapped } -func (a *wrappedAnalogReader) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { +func (a *wrappedAnalogReader) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { a.mu.RLock() defer a.mu.RUnlock() if a.reader == nil { - return 0, board.AnalogRange{}, errors.New("closed") + return board.AnalogValue{}, errors.New("closed") } return a.reader.Read(ctx, extra) } diff --git a/components/board/mcp3008helper/mcp3008.go b/components/board/mcp3008helper/mcp3008.go index 45c3755b8c4..722ca189971 100644 --- a/components/board/mcp3008helper/mcp3008.go +++ b/components/board/mcp3008helper/mcp3008.go @@ -39,7 +39,7 @@ func (config *MCP3008AnalogConfig) Validate(path string) error { } func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]interface{}) ( - value int, analogRange board.AnalogRange, err error, + analogVal board.AnalogValue, err error, ) { var tx [3]byte tx[0] = 1 // start bit @@ -48,7 +48,7 @@ func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]inter bus, err := mar.Bus.OpenHandle() if err != nil { - return 0, board.AnalogRange{}, err + return board.AnalogValue{}, err } defer func() { err = multierr.Combine(err, bus.Close()) @@ -56,14 +56,14 @@ func (mar *MCP3008AnalogReader) Read(ctx context.Context, extra map[string]inter rx, err := bus.Xfer(ctx, 1000000, mar.Chip, 0, tx[:]) if err != nil { - return 0, board.AnalogRange{}, err + return board.AnalogValue{}, err } // Reassemble the 10-bit value. Do not include bits before the final 10, because they contain // garbage and might be non-zero. val := 0x03FF & ((int(rx[1]) << 8) | int(rx[2])) - // returning blank analog range since mcp3008 will be removed soon. - return val, board.AnalogRange{}, nil + // returning no analog range since mcp3008 will be removed soon. + return board.AnalogValue{Value: val}, nil } // Close does nothing. diff --git a/components/board/numato/board.go b/components/board/numato/board.go index a5073312c29..f46f492b540 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -356,15 +356,15 @@ type analog struct { pin string } -// analog Read returns the analog value with the range and step size in mV/bit. -func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { +// Read returns the analog value with the range and step size in V/bit. +func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { res, err := a.b.doSendReceive(ctx, fmt.Sprintf("adc read %s", a.pin)) if err != nil { - return 0, board.AnalogRange{}, err + return board.AnalogValue{}, err } reading, err := strconv.Atoi(res) if err != nil { - return 0, board.AnalogRange{}, err + return board.AnalogValue{}, err } var max float32 var stepSize float32 @@ -392,8 +392,7 @@ func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (int, b stepSize = max / 1024 default: } - stepSize *= 1000 - return reading, board.AnalogRange{Min: 0, Max: max, StepSize: stepSize}, nil + return board.AnalogValue{Value: reading, Min: 0, Max: max, StepSize: stepSize}, nil } func (a *analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { @@ -426,10 +425,13 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi if product.ID.Vendor != 0x2a19 { continue } + // we can safely get the first numato productID we find because + // we only support one board being used at a time productID = product.ID.Product + break } - if productID != 0x805|0x802|0x800|0x0C05 { + if productID != 0x800 && productID != 0x802 && productID != 0x805 && productID != 0xC05 { logger.Warnf("analog range and step size is not supported for numato with product id %d", productID) } diff --git a/components/board/numato/board_test.go b/components/board/numato/board_test.go index e41f9cd0243..9a598ce9926 100644 --- a/components/board/numato/board_test.go +++ b/components/board/numato/board_test.go @@ -91,27 +91,27 @@ func TestNumato1(t *testing.T) { ar, err := b.AnalogByName("foo") test.That(t, err, test.ShouldBeNil, true) - res2, analogRange, err := ar.Read(ctx, nil) + res2, err := ar.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) - test.That(t, res2, test.ShouldBeLessThan, 100) + test.That(t, res2.Value, test.ShouldBeLessThan, 100) - test.That(t, analogRange.Min, test.ShouldEqual, 0) - test.That(t, analogRange.Max, test.ShouldEqual, 5) - test.That(t, analogRange.StepSize, test.ShouldEqual, 4.88) + // Only testing these since the values depend on what board version is connected. + test.That(t, res2.Min, test.ShouldEqual, 0) + test.That(t, res2.Max, test.ShouldBeGreaterThanOrEqualTo, 3.3) err = zeroPin.Set(context.Background(), true, nil) test.That(t, err, test.ShouldBeNil) - res2, _, err = ar.Read(ctx, nil) + res2, err = ar.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) - test.That(t, res2, test.ShouldBeGreaterThan, 1000) + test.That(t, res2.Value, test.ShouldBeGreaterThan, 1000) err = zeroPin.Set(context.Background(), false, nil) test.That(t, err, test.ShouldBeNil) - res2, _, err = ar.Read(ctx, nil) + res2, err = ar.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) - test.That(t, res2, test.ShouldBeLessThan, 100) + test.That(t, res2.Value, test.ShouldBeLessThan, 100) } func TestConfigValidate(t *testing.T) { diff --git a/components/board/numato/darwin_utils.go b/components/board/numato/darwin_utils.go index 7b071616e8d..cc8deac8c9a 100644 --- a/components/board/numato/darwin_utils.go +++ b/components/board/numato/darwin_utils.go @@ -4,6 +4,7 @@ package numato import "go.viam.com/utils/usb" +// getSerialDevices returns all devices connected by USB on a mac. func getSerialDevices() []usb.Description { return usb.Search(usb.NewSearchFilter("AppleUSBACMData", "usbmodem"), func(vendorID, productID int) bool { return true diff --git a/components/board/numato/linux_utils.go b/components/board/numato/linux_utils.go index 61376ff26a2..2d1c9e62058 100644 --- a/components/board/numato/linux_utils.go +++ b/components/board/numato/linux_utils.go @@ -4,6 +4,7 @@ package numato import "go.viam.com/utils/usb" +// getSerialDevices returns all devices connected by USB on a linux machine. func getSerialDevices() []usb.Description { return usb.Search(usb.SearchFilter{}, func(vendorID, productID int) bool { return true diff --git a/components/board/pinwrappers/analog_smoother_test.go b/components/board/pinwrappers/analog_smoother_test.go index deb4342d0a6..a86c6cc2c80 100644 --- a/components/board/pinwrappers/analog_smoother_test.go +++ b/components/board/pinwrappers/analog_smoother_test.go @@ -23,14 +23,14 @@ type testAnalog struct { stop bool } -func (t *testAnalog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { +func (t *testAnalog) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { t.mu.Lock() defer t.mu.Unlock() if t.stop || t.n >= t.lim { - return 0, board.AnalogRange{}, errStopReading + return board.AnalogValue{}, errStopReading } t.n++ - return t.r.Intn(100), board.AnalogRange{Min: 0, Max: 3.3, StepSize: 0.1}, nil + return board.AnalogValue{Value: t.r.Intn(100), Min: 0, Max: 3.3, StepSize: 0.1}, nil } func (t *testAnalog) Write(ctx context.Context, value int, extra map[string]interface{}) error { @@ -60,12 +60,12 @@ func TestAnalogSmoother1(t *testing.T) { testutils.WaitForAssertionWithSleep(t, 10*time.Millisecond, 200, func(tb testing.TB) { tb.Helper() - v, analogRange, err := as.Read(context.Background(), nil) + v, err := as.Read(context.Background(), nil) test.That(tb, err, test.ShouldEqual, errStopReading) - test.That(tb, v, test.ShouldEqual, 52) - test.That(tb, analogRange.Min, test.ShouldEqual, 0) - test.That(tb, analogRange.Max, test.ShouldEqual, 3.3) - test.That(tb, analogRange.StepSize, test.ShouldEqual, 0.1) + test.That(tb, v.Value, test.ShouldEqual, 52) + test.That(tb, v.Min, test.ShouldEqual, 0) + test.That(tb, v.Max, test.ShouldEqual, 3.3) + test.That(tb, v.StepSize, test.ShouldEqual, 0.1) // need lock to access testReader.n testReader.mu.Lock() diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 7b8af5f4502..8815fc4dd94 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -26,7 +26,7 @@ type AnalogSmoother struct { lastError atomic.Pointer[errValue] logger logging.Logger workers utils.StoppableWorkers - analogRange board.AnalogRange + analogVal board.AnalogValue } // SmoothAnalogReader wraps the given reader in a smoother. @@ -58,22 +58,24 @@ func (as *AnalogSmoother) Close(ctx context.Context) error { } // Read returns the smoothed out reading. -func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { +func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { if as.data == nil { // We're using raw data, and not averaging - return as.lastData, board.AnalogRange{}, nil + as.analogVal.Value = as.lastData + return as.analogVal, nil } avg := as.data.Average() lastErr := as.lastError.Load() + as.analogVal.Value = avg if lastErr == nil { - return avg, as.analogRange, nil + return as.analogVal, nil } //nolint:forcetypeassert if lastErr.present { - return avg, as.analogRange, lastErr.err + return as.analogVal, lastErr.err } - return avg, as.analogRange, nil + return as.analogVal, nil } // Start begins the smoothing routine that reads from the underlying @@ -106,10 +108,10 @@ func (as *AnalogSmoother) Start() { } as.workers = utils.NewStoppableWorkers(func(ctx context.Context) { - // Store the analog reader range and step size - _, analogRange, err := as.Raw.Read(ctx, nil) + // Store the full analog reader value + analogVal, err := as.Raw.Read(ctx, nil) as.lastError.Store(&errValue{err != nil, err}) - as.analogRange = analogRange + as.analogVal = analogVal for { select { @@ -118,12 +120,12 @@ func (as *AnalogSmoother) Start() { default: } start := time.Now() - reading, _, err := as.Raw.Read(ctx, nil) + reading, err := as.Raw.Read(ctx, nil) as.lastError.Store(&errValue{err != nil, err}) if err == nil { - as.lastData = reading + as.lastData = reading.Value if as.data != nil { - as.data.Add(reading) + as.data.Add(reading.Value) } } else { // Non-nil error if errors.Is(err, errStopReading) { diff --git a/components/board/server.go b/components/board/server.go index f78397d6385..89441731890 100644 --- a/components/board/server.go +++ b/components/board/server.go @@ -144,13 +144,15 @@ func (s *serviceServer) ReadAnalogReader( return nil, err } - val, analogRange, err := theReader.Read(ctx, req.Extra.AsMap()) + analogValue, err := theReader.Read(ctx, req.Extra.AsMap()) if err != nil { return nil, err } return &pb.ReadAnalogReaderResponse{ - Value: int32(val), - MinRange: analogRange.Min, MaxRange: analogRange.Max, StepSize: analogRange.StepSize, + Value: int32(analogValue.Value), + MinRange: analogValue.Min, + MaxRange: analogValue.Max, + StepSize: analogValue.StepSize, }, nil } diff --git a/components/board/server_test.go b/components/board/server_test.go index c88a3024e40..79e764ce1a6 100644 --- a/components/board/server_test.go +++ b/components/board/server_test.go @@ -463,8 +463,7 @@ func TestServerReadAnalogReader(t *testing.T) { tests := []struct { injectAnalog *inject.Analog injectAnalogErr error - injectVal int - injectRange board.AnalogRange + injectVal board.AnalogValue injectErr error req *request expCapAnalogArgs []interface{} @@ -475,7 +474,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: nil, injectAnalogErr: errAnalog, - injectVal: 0, + injectVal: board.AnalogValue{Value: 0}, injectErr: nil, req: &request{BoardName: missingBoardName}, expCapAnalogArgs: []interface{}(nil), @@ -486,7 +485,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: nil, injectAnalogErr: errAnalog, - injectVal: 0, + injectVal: board.AnalogValue{Value: 0}, injectErr: nil, req: &request{BoardName: testBoardName, AnalogReaderName: "analog1"}, expCapAnalogArgs: []interface{}{"analog1"}, @@ -497,7 +496,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: &inject.Analog{}, injectAnalogErr: nil, - injectVal: 0, + injectVal: board.AnalogValue{Value: 0}, injectErr: errFoo, req: &request{BoardName: testBoardName, AnalogReaderName: "analog1"}, expCapAnalogArgs: []interface{}{"analog1"}, @@ -508,8 +507,7 @@ func TestServerReadAnalogReader(t *testing.T) { { injectAnalog: &inject.Analog{}, injectAnalogErr: nil, - injectVal: 8, - injectRange: board.AnalogRange{Min: 0, Max: 10, StepSize: 0.1}, + injectVal: board.AnalogValue{Value: 8, Min: 0, Max: 10, StepSize: 0.1}, injectErr: nil, req: &request{BoardName: testBoardName, AnalogReaderName: "analog1", Extra: pbExpectedExtra}, expCapAnalogArgs: []interface{}{"analog1"}, @@ -530,9 +528,9 @@ func TestServerReadAnalogReader(t *testing.T) { } if tc.injectAnalog != nil { - tc.injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { + tc.injectAnalog.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { actualExtra = extra - return tc.injectVal, tc.injectRange, tc.injectErr + return tc.injectVal, tc.injectErr } } diff --git a/components/board/status.go b/components/board/status.go index 2d83aa6cca0..2d0d67a5c42 100644 --- a/components/board/status.go +++ b/components/board/status.go @@ -20,11 +20,11 @@ func CreateStatus(ctx context.Context, b Board) (*pb.Status, error) { if err != nil { return nil, err } - val, _, err := x.Read(ctx, nil) + val, err := x.Read(ctx, nil) if err != nil { return nil, errors.Wrapf(err, "couldn't read analog (%s)", name) } - status.Analogs[name] = int32(val) + status.Analogs[name] = int32(val.Value) } } diff --git a/components/gripper/softrobotics/gripper.go b/components/gripper/softrobotics/gripper.go index 54c51f6a176..ed72f96e93d 100644 --- a/components/gripper/softrobotics/gripper.go +++ b/components/gripper/softrobotics/gripper.go @@ -169,12 +169,12 @@ func (g *softGripper) Open(ctx context.Context, extra map[string]interface{}) er return ctx.Err() } // REMOVE - val, _, err := g.psi.Read(ctx, nil) + val, err := g.psi.Read(ctx, nil) if err != nil { return multierr.Combine(err, g.Stop(ctx, extra)) } - if val > 500 { + if val.Value > 500 { break } @@ -204,12 +204,12 @@ func (g *softGripper) Grab(ctx context.Context, extra map[string]interface{}) (b return false, ctx.Err() } // REMOVE - val, _, err := g.psi.Read(ctx, nil) + val, err := g.psi.Read(ctx, nil) if err != nil { return false, multierr.Combine(err, g.Stop(ctx, extra)) } - if val <= 200 { + if val.Value <= 200 { break } diff --git a/components/input/gpio/gpio.go b/components/input/gpio/gpio.go index 4b838013614..4c78780f5f3 100644 --- a/components/input/gpio/gpio.go +++ b/components/input/gpio/gpio.go @@ -322,34 +322,34 @@ func (c *Controller) newAxis(ctx context.Context, brd board.Board, analogName st return case <-ticker.C: } - rawVal, _, err := reader.Read(ctx, nil) + rawVal, err := reader.Read(ctx, nil) if err != nil { c.logger.CError(ctx, err) } - if rawVal > cfg.Max { - rawVal = cfg.Max - } else if rawVal < cfg.Min { - rawVal = cfg.Min + if rawVal.Value > cfg.Max { + rawVal.Value = cfg.Max + } else if rawVal.Value < cfg.Min { + rawVal.Value = cfg.Min } var outVal float64 if cfg.Bidirectional { center := (cfg.Min + cfg.Max) / 2 - if abs(rawVal-center) < cfg.Deadzone { - rawVal = center + if abs(rawVal.Value-center) < cfg.Deadzone { + rawVal.Value = center outVal = 0.0 } else { - outVal = scaleAxis(rawVal, cfg.Min, cfg.Max, -1, 1) + outVal = scaleAxis(rawVal.Value, cfg.Min, cfg.Max, -1, 1) } } else { - if abs(rawVal-cfg.Min) < cfg.Deadzone { - rawVal = cfg.Min + if abs(rawVal.Value-cfg.Min) < cfg.Deadzone { + rawVal.Value = cfg.Min } - outVal = scaleAxis(rawVal, cfg.Min, cfg.Max, 0, 1) + outVal = scaleAxis(rawVal.Value, cfg.Min, cfg.Max, 0, 1) } - if abs(rawVal-prevVal) < cfg.MinChange { + if abs(rawVal.Value-prevVal) < cfg.MinChange { continue } @@ -357,7 +357,7 @@ func (c *Controller) newAxis(ctx context.Context, brd board.Board, analogName st outVal *= -1 } - prevVal = rawVal + prevVal = rawVal.Value eventOut := input.Event{ Time: time.Now(), Event: input.PositionChangeAbs, diff --git a/components/input/gpio/gpio_test.go b/components/input/gpio/gpio_test.go index 42d13028904..fdd517e1221 100644 --- a/components/input/gpio/gpio_test.go +++ b/components/input/gpio/gpio_test.go @@ -96,20 +96,20 @@ func setup(t *testing.T) *setupResult { return nil } - s.analog1.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { + s.analog1.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { s.mu.Lock() defer s.mu.Unlock() - return analog1Val, board.AnalogRange{}, nil + return board.AnalogValue{Value: analog1Val}, nil } - s.analog2.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { + s.analog2.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { s.mu.Lock() defer s.mu.Unlock() - return analog2Val, board.AnalogRange{}, nil + return board.AnalogValue{Value: analog2Val}, nil } - s.analog3.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { + s.analog3.ReadFunc = func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { s.mu.Lock() defer s.mu.Unlock() - return analog3Val, board.AnalogRange{}, nil + return board.AnalogValue{Value: analog3Val}, nil } s.analog2.WriteFunc = func(ctx context.Context, value int, extra map[string]interface{}) error { diff --git a/testutils/inject/analog.go b/testutils/inject/analog.go index 5cf4e9d3189..70ed8122588 100644 --- a/testutils/inject/analog.go +++ b/testutils/inject/analog.go @@ -9,14 +9,14 @@ import ( // Analog is an injected analog pin. type Analog struct { board.Analog - ReadFunc func(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) + ReadFunc func(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) readCap []interface{} WriteFunc func(ctx context.Context, value int, extra map[string]interface{}) error writeCap []interface{} } // Read calls the injected Read or the real version. -func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (int, board.AnalogRange, error) { +func (a *Analog) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { a.readCap = []interface{}{ctx} if a.ReadFunc == nil { return a.Analog.Read(ctx, extra) From 805fb532a9d06652cf262cae578dea45d78d51b7 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Tue, 14 May 2024 14:17:50 -0400 Subject: [PATCH 10/17] fix tests --- components/board/pi/impl/external_hardware_test.go | 12 ++++++------ components/board/pinwrappers/analogs.go | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/components/board/pi/impl/external_hardware_test.go b/components/board/pi/impl/external_hardware_test.go index 0fb330c6c1b..0a17794fa59 100644 --- a/components/board/pi/impl/external_hardware_test.go +++ b/components/board/pi/impl/external_hardware_test.go @@ -65,25 +65,25 @@ func TestPiHardware(t *testing.T) { err = p.SetGPIOBcom(26, false) test.That(t, err, test.ShouldBeNil) - v, _, err := reader.Read(ctx, nil) + v, err := reader.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) - test.That(t, v, test.ShouldAlmostEqual, 0, 150) + test.That(t, v.Value, test.ShouldAlmostEqual, 0, 150) // try to set high err = p.SetGPIOBcom(26, true) test.That(t, err, test.ShouldBeNil) - v, _, err = reader.Read(ctx, nil) + v, err = reader.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) - test.That(t, v, test.ShouldAlmostEqual, 1023, 150) + test.That(t, v.Value, test.ShouldAlmostEqual, 1023, 150) // back to low err = p.SetGPIOBcom(26, false) test.That(t, err, test.ShouldBeNil) - v, _, err = reader.Read(ctx, nil) + v, err = reader.Read(ctx, nil) test.That(t, err, test.ShouldBeNil) - test.That(t, v, test.ShouldAlmostEqual, 0, 150) + test.That(t, v.Value, test.ShouldAlmostEqual, 0, 150) }) t.Run("basic interrupts", func(t *testing.T) { diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 8815fc4dd94..f574495d8c2 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -2,6 +2,7 @@ package pinwrappers import ( "context" + "sync" "sync/atomic" "time" @@ -27,6 +28,7 @@ type AnalogSmoother struct { logger logging.Logger workers utils.StoppableWorkers analogVal board.AnalogValue + mu *sync.Mutex } // SmoothAnalogReader wraps the given reader in a smoother. @@ -66,7 +68,9 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} avg := as.data.Average() lastErr := as.lastError.Load() + as.mu.Lock() as.analogVal.Value = avg + as.mu.Unlock() if lastErr == nil { return as.analogVal, nil } @@ -111,7 +115,9 @@ func (as *AnalogSmoother) Start() { // Store the full analog reader value analogVal, err := as.Raw.Read(ctx, nil) as.lastError.Store(&errValue{err != nil, err}) + as.mu.Lock() as.analogVal = analogVal + as.mu.Unlock() for { select { From 036df4a44dceab799212c66aadf5101b13a25bca Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Tue, 14 May 2024 14:36:19 -0400 Subject: [PATCH 11/17] fix error --- components/board/pinwrappers/analogs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index f574495d8c2..6c890ce6883 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -28,7 +28,7 @@ type AnalogSmoother struct { logger logging.Logger workers utils.StoppableWorkers analogVal board.AnalogValue - mu *sync.Mutex + mu sync.Mutex } // SmoothAnalogReader wraps the given reader in a smoother. From f825659ea7cd248f9e5cbd26e3e8e543bd7c8bad Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Tue, 14 May 2024 14:54:16 -0400 Subject: [PATCH 12/17] fix data race --- components/board/pinwrappers/analogs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 6c890ce6883..46b879e8961 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -69,8 +69,8 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} avg := as.data.Average() lastErr := as.lastError.Load() as.mu.Lock() + defer as.mu.Unlock() as.analogVal.Value = avg - as.mu.Unlock() if lastErr == nil { return as.analogVal, nil } From f63d1fe84504390a3e8caa1bc49697b61685c84f Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Thu, 16 May 2024 11:05:10 -0400 Subject: [PATCH 13/17] fix error --- components/board/pinwrappers/analogs.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index cd149987df1..758c0a65c47 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -32,19 +32,17 @@ type AnalogSmoother struct { // SmoothAnalogReader wraps the given reader in a smoother. func SmoothAnalogReader(r board.Analog, c board.AnalogReaderConfig, logger logging.Logger) *AnalogSmoother { - cancelCtx, cancel := context.WithCancel(context.Background()) smoother := &AnalogSmoother{ Raw: r, AverageOverMillis: c.AverageOverMillis, SamplesPerSecond: c.SamplesPerSecond, logger: logger, - cancel: cancel, } if smoother.SamplesPerSecond <= 0 { logger.Debug("Can't read nonpositive samples per second; defaulting to 1 instead") smoother.SamplesPerSecond = 1 } - smoother.Start(cancelCtx) + smoother.Start() return smoother } @@ -56,8 +54,7 @@ type errValue struct { // Close stops the smoothing routine. func (as *AnalogSmoother) Close(ctx context.Context) error { - as.cancel() - as.activeBackgroundWorkers.Wait() + as.workers.Stop() return nil } @@ -86,7 +83,7 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} // Start begins the smoothing routine that reads from the underlying // analog reader. -func (as *AnalogSmoother) Start(ctx context.Context) { +func (as *AnalogSmoother) Start() { // examples 1 // AverageOverMillis 10 // SamplesPerSecond 1000 @@ -108,7 +105,7 @@ func (as *AnalogSmoother) Start(ctx context.Context) { as.data = utils.NewRollingAverage(numSamples) nanosBetween = 1e9 / as.SamplesPerSecond } else { - as.logger.CDebug(ctx, "Too few samples to smooth over; defaulting to raw data.") + as.logger.Debug("Too few samples to smooth over; defaulting to raw data.") as.data = nil nanosBetween = as.AverageOverMillis * 1e6 } From 6b856747a300bdd81efc4b371a06d583a9c8b214 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Thu, 16 May 2024 11:10:06 -0400 Subject: [PATCH 14/17] fix merge conflict --- components/board/pinwrappers/analogs.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 758c0a65c47..ae1e4332986 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -10,6 +10,7 @@ import ( goutils "go.viam.com/utils" "go.viam.com/rdk/components/board" + "go.viam.com/rdk/grpc" "go.viam.com/rdk/logging" "go.viam.com/rdk/utils" ) @@ -111,6 +112,9 @@ func (as *AnalogSmoother) Start() { } as.workers = utils.NewStoppableWorkers(func(ctx context.Context) { + consecutiveErrors := 0 + var lastError error + // Store the full analog reader value analogVal, err := as.Raw.Read(ctx, nil) as.lastError.Store(&errValue{err != nil, err}) @@ -132,12 +136,23 @@ func (as *AnalogSmoother) Start() { if as.data != nil { as.data.Add(reading.Value) } + consecutiveErrors = 0 } else { // Non-nil error if errors.Is(err, errStopReading) { break } - as.logger.CInfow(ctx, "error reading analog", "error", err) - continue + if lastError != nil && err.Error() == lastError.Error() { + consecutiveErrors++ + } else { + as.logger.CInfow(ctx, "error reading analog", "error", err) + consecutiveErrors = 0 + } + // Don't spam the errors: only remind us of the problem every 10 seconds. + if consecutiveErrors == (as.SamplesPerSecond * 10) { + as.logger.CErrorw(ctx, "unable to read analog for 10 seconds", "error", err) + consecutiveErrors = 0 + } + lastError = err } as.lastData = reading.Value @@ -154,3 +169,7 @@ func (as *AnalogSmoother) Start() { } }) } + +func (as *AnalogSmoother) Write(ctx context.Context, value int, extra map[string]interface{}) error { + return grpc.UnimplementedError +} From dc02a7dfad937bef39ac0144024d42a9cad43b40 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Thu, 16 May 2024 11:45:29 -0400 Subject: [PATCH 15/17] failing analog test --- components/board/pinwrappers/analogs.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index ae1e4332986..d818c0246d0 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -65,20 +65,19 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} as.analogVal.Value = as.lastData return as.analogVal, nil } - avg := as.data.Average() lastErr := as.lastError.Load() as.mu.Lock() defer as.mu.Unlock() as.analogVal.Value = avg if lastErr == nil { + return as.analogVal, nil } //nolint:forcetypeassert if lastErr.present { return as.analogVal, lastErr.err } - return as.analogVal, nil } @@ -101,14 +100,12 @@ func (as *AnalogSmoother) Start() { // numSamples 4 numSamples := (as.SamplesPerSecond * as.AverageOverMillis) / 1000 - var nanosBetween int + nanosBetween := 1e9 / as.SamplesPerSecond if numSamples >= 1 { as.data = utils.NewRollingAverage(numSamples) - nanosBetween = 1e9 / as.SamplesPerSecond } else { as.logger.Debug("Too few samples to smooth over; defaulting to raw data.") as.data = nil - nanosBetween = as.AverageOverMillis * 1e6 } as.workers = utils.NewStoppableWorkers(func(ctx context.Context) { @@ -152,13 +149,8 @@ func (as *AnalogSmoother) Start() { as.logger.CErrorw(ctx, "unable to read analog for 10 seconds", "error", err) consecutiveErrors = 0 } - lastError = err - } - - as.lastData = reading.Value - if as.data != nil { - as.data.Add(reading.Value) } + lastError = err end := time.Now() From 1aea02c00e500ea7de7d1027dc065553340585a7 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Thu, 16 May 2024 12:01:59 -0400 Subject: [PATCH 16/17] lint --- components/board/pinwrappers/analogs.go | 1 - 1 file changed, 1 deletion(-) diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index d818c0246d0..24650577682 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -71,7 +71,6 @@ func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{} defer as.mu.Unlock() as.analogVal.Value = avg if lastErr == nil { - return as.analogVal, nil } //nolint:forcetypeassert From 97c6b638ec5c827d83d2659a951e248e4b101dd7 Mon Sep 17 00:00:00 2001 From: oliviamiller <106617921+oliviamiller@users.noreply.github.com> Date: Thu, 16 May 2024 14:11:48 -0400 Subject: [PATCH 17/17] pr comments --- components/board/numato/board.go | 72 +++++++++++++------------ components/board/numato/darwin_utils.go | 3 +- components/board/numato/linux_utils.go | 1 + components/board/pinwrappers/analogs.go | 33 ++++++------ 4 files changed, 57 insertions(+), 52 deletions(-) diff --git a/components/board/numato/board.go b/components/board/numato/board.go index ca6062eb7a6..2ae7f6665e9 100644 --- a/components/board/numato/board.go +++ b/components/board/numato/board.go @@ -118,7 +118,8 @@ type numatoBoard struct { sentMu sync.Mutex workers rdkutils.StoppableWorkers - productID int + maxAnalogVoltage float32 + stepSize float32 } func (b *numatoBoard) addToSent(msg string) { @@ -366,33 +367,8 @@ func (a *analog) Read(ctx context.Context, extra map[string]interface{}) (board. if err != nil { return board.AnalogValue{}, err } - var max float32 - var stepSize float32 - switch a.b.productID { - case 0x805: - // 128 channel usb numato has 12 bit resolution - max = 3.3 - stepSize = max / 4096 - case 0x802: - // 32 channel usb numato has 10 bit resolution - max = 3.3 - stepSize = max / 1024 - case 0x800: - // 8 and 16 pin usb versions have the same product ID but different voltage ranges - // both have 10 bit resolution - if a.b.pins == 8 { - max = 5.0 - } else if a.b.pins == 16 { - max = 3.3 - } - stepSize = max / 1024 - case 0xC05: - // 1 channel usb relay module numato - 10 bit resolution - max = 5.0 - stepSize = max / 1024 - default: - } - return board.AnalogValue{Value: reading, Min: 0, Max: max, StepSize: stepSize}, nil + + return board.AnalogValue{Value: reading, Min: 0, Max: a.b.maxAnalogVoltage, StepSize: a.b.stepSize}, nil } func (a *analog) Write(ctx context.Context, value int, extra map[string]interface{}) error { @@ -431,8 +407,33 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi break } - if productID != 0x800 && productID != 0x802 && productID != 0x805 && productID != 0xC05 { - logger.Warnf("analog range and step size is not supported for numato with product id %d", productID) + // Find the max analog voltage and stepSize based on the productID. + var max float32 + var stepSize float32 + switch productID { + case 0x800: + // 8 and 16 pin usb versions have the same product ID but different voltage ranges + // both have 10 bit resolution + if conf.Pins == 8 { + max = 5.0 + } else if conf.Pins == 16 { + max = 3.3 + } + stepSize = max / 1024 + case 0x802: + // 32 channel usb numato has 10 bit resolution + max = 3.3 + stepSize = max / 1024 + case 0x805: + // 128 channel usb numato has 12 bit resolution + max = 3.3 + stepSize = max / 4096 + case 0xC05: + // 1 channel usb relay module numato - 10 bit resolution + max = 5.0 + stepSize = max / 1024 + default: + logger.Warnf("analog range and step size are not supported for numato with product id %d", productID) } options := goserial.OpenOptions{ @@ -448,11 +449,12 @@ func connect(ctx context.Context, name resource.Name, conf *Config, logger loggi return nil, err } b := &numatoBoard{ - Named: name.AsNamed(), - pins: pins, - port: device, - logger: logger, - productID: productID, + Named: name.AsNamed(), + pins: pins, + port: device, + logger: logger, + maxAnalogVoltage: max, + stepSize: stepSize, } b.analogs = map[string]*pinwrappers.AnalogSmoother{} diff --git a/components/board/numato/darwin_utils.go b/components/board/numato/darwin_utils.go index cc8deac8c9a..c1e15d1133a 100644 --- a/components/board/numato/darwin_utils.go +++ b/components/board/numato/darwin_utils.go @@ -4,7 +4,8 @@ package numato import "go.viam.com/utils/usb" -// getSerialDevices returns all devices connected by USB on a mac. +// getSerialDevices returns all device descriptions connected by USB on mac. This is used to get the +// productID of the numato board being used. func getSerialDevices() []usb.Description { return usb.Search(usb.NewSearchFilter("AppleUSBACMData", "usbmodem"), func(vendorID, productID int) bool { return true diff --git a/components/board/numato/linux_utils.go b/components/board/numato/linux_utils.go index 2d1c9e62058..e7e0d7faa30 100644 --- a/components/board/numato/linux_utils.go +++ b/components/board/numato/linux_utils.go @@ -5,6 +5,7 @@ package numato import "go.viam.com/utils/usb" // getSerialDevices returns all devices connected by USB on a linux machine. +// This is used to get the productID of the numato board being used. func getSerialDevices() []usb.Description { return usb.Search(usb.SearchFilter{}, func(vendorID, productID int) bool { return true diff --git a/components/board/pinwrappers/analogs.go b/components/board/pinwrappers/analogs.go index 24650577682..7af73c00275 100644 --- a/components/board/pinwrappers/analogs.go +++ b/components/board/pinwrappers/analogs.go @@ -2,7 +2,6 @@ package pinwrappers import ( "context" - "sync" "sync/atomic" "time" @@ -28,7 +27,6 @@ type AnalogSmoother struct { logger logging.Logger workers utils.StoppableWorkers analogVal board.AnalogValue - mu sync.Mutex } // SmoothAnalogReader wraps the given reader in a smoother. @@ -43,6 +41,12 @@ func SmoothAnalogReader(r board.Analog, c board.AnalogReaderConfig, logger loggi logger.Debug("Can't read nonpositive samples per second; defaulting to 1 instead") smoother.SamplesPerSecond = 1 } + + // Store the analog reader info + analogVal, err := smoother.Raw.Read(context.Background(), nil) + smoother.lastError.Store(&errValue{err != nil, err}) + smoother.analogVal = analogVal + smoother.Start() return smoother } @@ -61,23 +65,27 @@ func (as *AnalogSmoother) Close(ctx context.Context) error { // Read returns the smoothed out reading. func (as *AnalogSmoother) Read(ctx context.Context, extra map[string]interface{}) (board.AnalogValue, error) { + analogVal := board.AnalogValue{ + Min: as.analogVal.Min, + Max: as.analogVal.Max, + StepSize: as.analogVal.StepSize, + } + if as.data == nil { // We're using raw data, and not averaging - as.analogVal.Value = as.lastData + analogVal.Value = as.lastData return as.analogVal, nil } avg := as.data.Average() lastErr := as.lastError.Load() - as.mu.Lock() - defer as.mu.Unlock() - as.analogVal.Value = avg + analogVal.Value = avg if lastErr == nil { - return as.analogVal, nil + return analogVal, nil } //nolint:forcetypeassert if lastErr.present { - return as.analogVal, lastErr.err + return analogVal, lastErr.err } - return as.analogVal, nil + return analogVal, nil } // Start begins the smoothing routine that reads from the underlying @@ -111,13 +119,6 @@ func (as *AnalogSmoother) Start() { consecutiveErrors := 0 var lastError error - // Store the full analog reader value - analogVal, err := as.Raw.Read(ctx, nil) - as.lastError.Store(&errValue{err != nil, err}) - as.mu.Lock() - as.analogVal = analogVal - as.mu.Unlock() - for { select { case <-ctx.Done():