diff --git a/cartofacade/capi.go b/cartofacade/capi.go index 33057fcd..bfe1cafd 100644 --- a/cartofacade/capi.go +++ b/cartofacade/capi.go @@ -17,6 +17,9 @@ import ( "errors" "unsafe" + geo "github.com/kellydunn/golang-geo" + "go.viam.com/rdk/spatialmath" + s "github.com/viamrobotics/viam-cartographer/sensors" ) @@ -57,6 +60,7 @@ type CartoInterface interface { terminate() error addLidarReading(string, s.TimedLidarReadingResponse) error addIMUReading(string, s.TimedIMUReadingResponse) error + addOdometerReading(string, s.TimedOdometerReadingResponse) error position() (Position, error) pointCloudMap() ([]byte, error) internalState() ([]byte, error) @@ -248,6 +252,24 @@ func (vc *Carto) addIMUReading(imu string, reading s.TimedIMUReadingResponse) er return nil } +// addOdometerReading is a wrapper for viam_carto_add_odometer_reading +func (vc *Carto) addOdometerReading(odometer string, reading s.TimedOdometerReadingResponse) error { + value := toOdometerReading(odometer, reading) + + status := C.viam_carto_add_odometer_reading(vc.value, &value) + + if err := toError(status); err != nil { + return err + } + + status = C.viam_carto_add_odometer_reading_destroy(&value) + if err := toError(status); err != nil { + return err + } + + return nil +} + // position is a wrapper for viam_carto_get_position func (vc *Carto) position() (Position, error) { value := C.viam_carto_get_position_response{} @@ -435,11 +457,11 @@ func toLidarReading(lidar string, reading s.TimedLidarReadingResponse) C.viam_ca return sr } -func toIMUReading(imu string, reading s.TimedIMUReadingResponse) C.viam_carto_imu_reading { +func toIMUReading(movementSensor string, reading s.TimedIMUReadingResponse) C.viam_carto_imu_reading { sr := C.viam_carto_imu_reading{} - sensorCStr := C.CString(imu) + sensorCStr := C.CString(movementSensor) defer C.free(unsafe.Pointer(sensorCStr)) - sr.imu = C.blk2bstr(unsafe.Pointer(sensorCStr), C.int(len(imu))) + sr.imu = C.blk2bstr(unsafe.Pointer(sensorCStr), C.int(len(movementSensor))) sr.lin_acc_x = C.double(reading.LinearAcceleration.X) sr.lin_acc_y = C.double(reading.LinearAcceleration.Y) @@ -452,6 +474,27 @@ func toIMUReading(imu string, reading s.TimedIMUReadingResponse) C.viam_carto_im return sr } +func toOdometerReading(movementSensor string, reading s.TimedOdometerReadingResponse) C.viam_carto_odometer_reading { + sr := C.viam_carto_odometer_reading{} + sensorCStr := C.CString(movementSensor) + defer C.free(unsafe.Pointer(sensorCStr)) + sr.odometer = C.blk2bstr(unsafe.Pointer(sensorCStr), C.int(len(movementSensor))) + + translation := spatialmath.GeoPointToPoint(reading.Position, geo.NewPoint(0, 0)) + rotation := reading.Orientation.Quaternion() + + sr.translation_x = C.double(translation.X) + sr.translation_y = C.double(translation.Y) + sr.translation_z = C.double(translation.Z) + sr.rotation_x = C.double(rotation.Imag) + sr.rotation_y = C.double(rotation.Jmag) + sr.rotation_z = C.double(rotation.Kmag) + sr.rotation_w = C.double(rotation.Real) + + sr.odometer_reading_time_unix_milli = C.int64_t(reading.ReadingTime.UnixMilli()) + return sr +} + func bstringToByteSlice(bstr C.bstring) []byte { return C.GoBytes(unsafe.Pointer(bstr.data), bstr.slen) } @@ -526,6 +569,8 @@ func toError(status C.int) error { return errors.New("VIAM_CARTO_IMU_PROVIDED_AND_IMU_ENABLED_MISMATCH") case C.VIAM_CARTO_IMU_READING_INVALID: return errors.New("VIAM_CARTO_IMU_READING_INVALID") + case C.VIAM_CARTO_ODOMETER_READING_INVALID: + return errors.New("VIAM_CARTO_ODOMETER_READING_INVALID") default: return errors.New("status code unclassified") } diff --git a/cartofacade/capi_mock.go b/cartofacade/capi_mock.go index 85ce8095..30fa46db 100644 --- a/cartofacade/capi_mock.go +++ b/cartofacade/capi_mock.go @@ -27,6 +27,7 @@ type CartoMock struct { TerminateFunc func() error AddLidarReadingFunc func(string, s.TimedLidarReadingResponse) error AddIMUReadingFunc func(string, s.TimedIMUReadingResponse) error + AddOdometerReadingFunc func(string, s.TimedOdometerReadingResponse) error PositionFunc func() (Position, error) PointCloudMapFunc func() ([]byte, error) InternalStateFunc func() ([]byte, error) @@ -66,11 +67,19 @@ func (cf *CartoMock) addLidarReading(lidar string, reading s.TimedLidarReadingRe } // addIMUReading calls the injected AddIMUReadingFunc or the real version. -func (cf *CartoMock) addIMUReading(imu string, reading s.TimedIMUReadingResponse) error { +func (cf *CartoMock) addIMUReading(movementSensor string, reading s.TimedIMUReadingResponse) error { if cf.AddIMUReadingFunc == nil { - return cf.Carto.addIMUReading(imu, reading) + return cf.Carto.addIMUReading(movementSensor, reading) } - return cf.AddIMUReadingFunc(imu, reading) + return cf.AddIMUReadingFunc(movementSensor, reading) +} + +// addOdometerReading calls the injected AddOdometerReadingFunc or the real version. +func (cf *CartoMock) addOdometerReading(movementSensor string, reading s.TimedOdometerReadingResponse) error { + if cf.AddOdometerReadingFunc == nil { + return cf.Carto.addOdometerReading(movementSensor, reading) + } + return cf.AddOdometerReadingFunc(movementSensor, reading) } // position calls the injected PositionFunc or the real version. diff --git a/cartofacade/capi_test.go b/cartofacade/capi_test.go index b9cce5c5..0c61c8b5 100644 --- a/cartofacade/capi_test.go +++ b/cartofacade/capi_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/golang/geo/r3" + geo "github.com/kellydunn/golang-geo" "go.viam.com/rdk/pointcloud" "go.viam.com/rdk/spatialmath" "go.viam.com/test" @@ -58,18 +59,18 @@ func testAddLidarReading(t *testing.T, vc Carto, pcdPath string, timestamp time. ReadingTime: timestamp, } - err = vc.addLidarReading("mylidar", reading) + err = vc.addLidarReading("my-lidar", reading) test.That(t, err, test.ShouldBeNil) } func TestGetConfig(t *testing.T) { - t.Run("config properly converted between C and go with no IMU specified", func(t *testing.T) { - cfg := GetTestConfig("mylidar", "", "", true) + t.Run("config properly converted between C and go with no movement sensor specified", func(t *testing.T) { + cfg := GetTestConfig("my-lidar", "", "", true) vcc, err := getConfig(cfg) test.That(t, err, test.ShouldBeNil) camera := bstringToGoString(vcc.camera) - test.That(t, camera, test.ShouldResemble, "mylidar") + test.That(t, camera, test.ShouldResemble, "my-lidar") enableMapping := bool(vcc.enable_mapping) test.That(t, enableMapping, test.ShouldBeTrue) @@ -77,16 +78,16 @@ func TestGetConfig(t *testing.T) { test.That(t, vcc.lidar_config, test.ShouldEqual, TwoD) }) - t.Run("config properly converted between C and go with an IMU specified", func(t *testing.T) { - cfg := GetTestConfig("mylidar", "myIMU", "", true) + t.Run("config properly converted between C and go with a movement sensor specified", func(t *testing.T) { + cfg := GetTestConfig("my-lidar", "my-movement-sensor", "", true) vcc, err := getConfig(cfg) test.That(t, err, test.ShouldBeNil) camera := bstringToGoString(vcc.camera) - test.That(t, camera, test.ShouldResemble, "mylidar") + test.That(t, camera, test.ShouldResemble, "my-lidar") movementSensor := bstringToGoString(vcc.movement_sensor) - test.That(t, movementSensor, test.ShouldResemble, "myIMU") + test.That(t, movementSensor, test.ShouldResemble, "my-movement-sensor") enableMapping := bool(vcc.enable_mapping) test.That(t, enableMapping, test.ShouldBeTrue) @@ -94,18 +95,18 @@ func TestGetConfig(t *testing.T) { test.That(t, vcc.lidar_config, test.ShouldEqual, TwoD) }) - t.Run("config properly converted between C and go with an IMU specified and existing map", func(t *testing.T) { + t.Run("config properly converted between C and go with a movement sensor specified and an existing map", func(t *testing.T) { filename := "viam-cartographer/outputs/viam-office-02-22-3/internal_state/internal_state_0.pbstream" - cfg := GetTestConfig("mylidar", "myIMU", filename, false) + cfg := GetTestConfig("my-lidar", "my-movement-sensor", filename, false) vcc, err := getConfig(cfg) test.That(t, err, test.ShouldBeNil) camera := bstringToGoString(vcc.camera) - test.That(t, camera, test.ShouldResemble, "mylidar") + test.That(t, camera, test.ShouldResemble, "my-lidar") movementSensor := bstringToGoString(vcc.movement_sensor) - test.That(t, movementSensor, test.ShouldResemble, "myIMU") + test.That(t, movementSensor, test.ShouldResemble, "my-movement-sensor") enableMapping := bool(vcc.enable_mapping) test.That(t, enableMapping, test.ShouldBeFalse) @@ -137,33 +138,56 @@ func TestToLidarReading(t *testing.T) { Reading: []byte("he0llo"), ReadingTime: timestamp, } - sr := toLidarReading("mylidar", reading) - test.That(t, bstringToGoString(sr.lidar), test.ShouldResemble, "mylidar") + sr := toLidarReading("my-lidar", reading) + test.That(t, bstringToGoString(sr.lidar), test.ShouldResemble, "my-lidar") test.That(t, bstringToGoString(sr.lidar_reading), test.ShouldResemble, "he0llo") test.That(t, sr.lidar_reading_time_unix_milli, test.ShouldEqual, timestamp.UnixMilli()) }) } func TestToIMUReading(t *testing.T) { - reading := s.TimedIMUReadingResponse{ - LinearAcceleration: r3.Vector{X: 0.1, Y: 0, Z: 9.8}, - AngularVelocity: spatialmath.AngularVelocity{X: 0, Y: -0.2, Z: 0}, - } t.Run("IMU reading properly converted between c and go", func(t *testing.T) { timestamp := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC) - reading.ReadingTime = timestamp - sr := toIMUReading("myIMU", reading) - test.That(t, bstringToGoString(sr.imu), test.ShouldResemble, "myIMU") - test.That(t, sr.lin_acc_x, test.ShouldEqual, 0.1) - test.That(t, sr.lin_acc_y, test.ShouldEqual, 0) - test.That(t, sr.lin_acc_z, test.ShouldEqual, 9.8) - test.That(t, sr.ang_vel_x, test.ShouldEqual, 0) - test.That(t, sr.ang_vel_y, test.ShouldEqual, -0.2) - test.That(t, sr.ang_vel_z, test.ShouldEqual, 0) + reading := s.TimedIMUReadingResponse{ + LinearAcceleration: r3.Vector{X: 0.1, Y: 0, Z: 9.8}, + AngularVelocity: spatialmath.AngularVelocity{X: 0, Y: -0.2, Z: 0}, + ReadingTime: timestamp, + } + sr := toIMUReading("my-movement-sensor", reading) + test.That(t, bstringToGoString(sr.imu), test.ShouldResemble, "my-movement-sensor") + test.That(t, sr.lin_acc_x, test.ShouldEqual, reading.LinearAcceleration.X) + test.That(t, sr.lin_acc_y, test.ShouldEqual, reading.LinearAcceleration.Y) + test.That(t, sr.lin_acc_z, test.ShouldEqual, reading.LinearAcceleration.Z) + test.That(t, sr.ang_vel_x, test.ShouldEqual, reading.AngularVelocity.X) + test.That(t, sr.ang_vel_y, test.ShouldEqual, reading.AngularVelocity.Y) + test.That(t, sr.ang_vel_z, test.ShouldEqual, reading.AngularVelocity.Z) test.That(t, sr.imu_reading_time_unix_milli, test.ShouldEqual, timestamp.UnixMilli()) }) } +func TestToOdometerReading(t *testing.T) { + t.Run("odometer reading properly converted between c and go", func(t *testing.T) { + timestamp := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC) + reading := s.TimedOdometerReadingResponse{ + Position: geo.NewPoint(4, 5), + Orientation: &spatialmath.Quaternion{Real: 0.8, Imag: -0.2, Jmag: 5.6, Kmag: -0.7}, + ReadingTime: timestamp, + } + origin := geo.NewPoint(0, 0) + translation := spatialmath.GeoPointToPoint(reading.Position, origin) + sr := toOdometerReading("my-movement-sensor", reading) + test.That(t, bstringToGoString(sr.odometer), test.ShouldResemble, "my-movement-sensor") + test.That(t, sr.translation_x, test.ShouldEqual, translation.X) + test.That(t, sr.translation_y, test.ShouldEqual, translation.Y) + test.That(t, sr.translation_z, test.ShouldEqual, translation.Z) + test.That(t, sr.rotation_x, test.ShouldEqual, reading.Orientation.Quaternion().Imag) + test.That(t, sr.rotation_y, test.ShouldEqual, reading.Orientation.Quaternion().Jmag) + test.That(t, sr.rotation_z, test.ShouldEqual, reading.Orientation.Quaternion().Kmag) + test.That(t, sr.rotation_w, test.ShouldEqual, reading.Orientation.Quaternion().Real) + test.That(t, sr.odometer_reading_time_unix_milli, test.ShouldEqual, timestamp.UnixMilli()) + }) +} + func TestBstringToByteSlice(t *testing.T) { t.Run("b strings are properly converted to byte slices", func(t *testing.T) { bstring := goStringToBstring("hell0!") @@ -172,15 +196,15 @@ func TestBstringToByteSlice(t *testing.T) { }) } -func TestCGoAPIWithoutIMU(t *testing.T) { +func TestCGoAPIWithoutMovementSensor(t *testing.T) { pvcl, err := NewLib(0, 1) - t.Run("test state machine without IMU", func(t *testing.T) { + t.Run("test state machine without movement sensor", func(t *testing.T) { // initialize viam_carto_lib test.That(t, err, test.ShouldBeNil) test.That(t, pvcl, test.ShouldNotBeNil) - cfg := GetTestConfig("mylidar", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) vc, err := NewCarto(cfg, algoCfg, &CartoLibMock{}) @@ -241,7 +265,7 @@ func TestCGoAPIWithoutIMU(t *testing.T) { Reading: []byte(""), ReadingTime: timestamp, } - err = vc.addLidarReading("mylidar", reading) + err = vc.addLidarReading("my-lidar", reading) test.That(t, err, test.ShouldBeError) test.That(t, err.Error(), test.ShouldResemble, "VIAM_CARTO_LIDAR_READING_EMPTY") @@ -251,10 +275,29 @@ func TestCGoAPIWithoutIMU(t *testing.T) { Reading: []byte("he0llo"), ReadingTime: timestamp, } - err = vc.addLidarReading("mylidar", reading) + err = vc.addLidarReading("my-lidar", reading) test.That(t, err, test.ShouldBeError) test.That(t, err.Error(), test.ShouldResemble, "VIAM_CARTO_LIDAR_READING_INVALID") + // test position should be unchanged by failed attempt to add data + position, err = vc.position() + test.That(t, err, test.ShouldNotBeNil) + test.That(t, err, test.ShouldResemble, errors.New("VIAM_CARTO_GET_POSITION_NOT_INITIALIZED")) + test.That(t, position, test.ShouldResemble, Position{}) + + // test pointCloudMap should be unchanged by failed attempt to add data + pcd, err = vc.pointCloudMap() + test.That(t, pcd, test.ShouldBeNil) + test.That(t, err, test.ShouldBeError) + test.That(t, err, test.ShouldResemble, errors.New("VIAM_CARTO_POINTCLOUD_MAP_EMPTY")) + + // test internalState should be unchanged by failed attempt to add data + internalState, err = vc.internalState() + test.That(t, err, test.ShouldBeNil) + test.That(t, internalState, test.ShouldNotBeNil) + test.That(t, len(internalState), test.ShouldEqual, len(lastInternalState)) + lastInternalState = internalState + confirmBinaryCompressedUnsupported(t) // NOTE: This test is very carefully created in order to not hit @@ -299,7 +342,7 @@ func TestCGoAPIWithoutIMU(t *testing.T) { // test position zeroed position, err = vc.position() test.That(t, err, test.ShouldBeNil) - test.That(t, position.ComponentReference, test.ShouldEqual, "mylidar") + test.That(t, position.ComponentReference, test.ShouldEqual, "my-lidar") positionIsZero(t, position) // test pointCloudMap now returns a non empty result @@ -326,7 +369,7 @@ func TestCGoAPIWithoutIMU(t *testing.T) { // test position, is no longer zeroed position, err = vc.position() test.That(t, err, test.ShouldBeNil) - test.That(t, position.ComponentReference, test.ShouldEqual, "mylidar") + test.That(t, position.ComponentReference, test.ShouldEqual, "my-lidar") test.That(t, position.X, test.ShouldNotEqual, 0) test.That(t, position.Y, test.ShouldNotEqual, 0) test.That(t, position.Z, test.ShouldEqual, 0) @@ -373,20 +416,15 @@ func TestCGoAPIWithoutIMU(t *testing.T) { }) } -func TestCGoAPIWithIMU(t *testing.T) { +func TestCGoAPIWithMovementSensor(t *testing.T) { pvcl, err := NewLib(0, 1) - reading := s.TimedIMUReadingResponse{ - LinearAcceleration: r3.Vector{X: 0, Y: 0, Z: 9.8}, - AngularVelocity: spatialmath.AngularVelocity{X: 0, Y: 0, Z: 0}, - } - - t.Run("test state machine with IMU", func(t *testing.T) { + t.Run("test state machine with movement sensor", func(t *testing.T) { // initialize viam_carto_lib test.That(t, err, test.ShouldBeNil) test.That(t, pvcl, test.ShouldNotBeNil) - cfg := GetTestConfig("mylidar", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) // test invalid IMU enabling configuration algoCfg := GetTestAlgoConfig(true) @@ -394,7 +432,7 @@ func TestCGoAPIWithIMU(t *testing.T) { test.That(t, err, test.ShouldResemble, errors.New("VIAM_CARTO_IMU_PROVIDED_AND_IMU_ENABLED_MISMATCH")) test.That(t, vc, test.ShouldNotBeNil) - cfg = GetTestConfig("mylidar", "myIMU", "", true) + cfg = GetTestConfig("my-lidar", "my-movement-sensor", "", true) algoCfg = GetTestAlgoConfig(true) vc, err = NewCarto(cfg, algoCfg, &pvcl) @@ -426,13 +464,57 @@ func TestCGoAPIWithIMU(t *testing.T) { test.That(t, len(internalState), test.ShouldBeGreaterThan, 0) lastInternalState := internalState - // test invalid addIMUReading: sensor name unknown + // test invalid addLidarReading: sensor name unknown timestamp := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC) - reading.ReadingTime = timestamp - err = vc.addIMUReading("not my sensor", reading) + lidarReading := s.TimedLidarReadingResponse{ + Reading: []byte("he0llo"), + ReadingTime: timestamp, + } + err = vc.addLidarReading("not my sensor", lidarReading) test.That(t, err, test.ShouldBeError) test.That(t, err.Error(), test.ShouldResemble, "VIAM_CARTO_UNKNOWN_SENSOR_NAME") + // test invalid addIMUReading: sensor name unknown + timestamp = time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC) + imuReading := s.TimedIMUReadingResponse{ + LinearAcceleration: r3.Vector{X: 0, Y: 0, Z: 9.8}, + AngularVelocity: spatialmath.AngularVelocity{X: 0, Y: 0, Z: 0}, + ReadingTime: timestamp, + } + err = vc.addIMUReading("not my sensor", imuReading) + test.That(t, err, test.ShouldBeError) + test.That(t, err.Error(), test.ShouldResemble, "VIAM_CARTO_UNKNOWN_SENSOR_NAME") + + // test invalid addOdometerReading: sensor name unknown + timestamp = time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC) + odometerReading := s.TimedOdometerReadingResponse{ + Position: geo.NewPoint(4, 5), + Orientation: &spatialmath.Quaternion{Real: 0.8, Imag: -0.2, Jmag: 5.6, Kmag: -0.7}, + ReadingTime: timestamp, + } + err = vc.addOdometerReading("not my sensor", odometerReading) + test.That(t, err, test.ShouldBeError) + test.That(t, err.Error(), test.ShouldResemble, "VIAM_CARTO_UNKNOWN_SENSOR_NAME") + + // test position should be unchanged by failed attempt to add data + position, err = vc.position() + test.That(t, err, test.ShouldNotBeNil) + test.That(t, err, test.ShouldResemble, errors.New("VIAM_CARTO_GET_POSITION_NOT_INITIALIZED")) + test.That(t, position, test.ShouldResemble, Position{}) + + // test pointCloudMap should be unchanged by failed attempt to add data + pcd, err = vc.pointCloudMap() + test.That(t, pcd, test.ShouldBeNil) + test.That(t, err, test.ShouldBeError) + test.That(t, err, test.ShouldResemble, errors.New("VIAM_CARTO_POINTCLOUD_MAP_EMPTY")) + + // test internalState should be unchanged by failed attempt to add data + internalState, err = vc.internalState() + test.That(t, err, test.ShouldBeNil) + test.That(t, internalState, test.ShouldNotBeNil) + test.That(t, len(internalState), test.ShouldEqual, len(lastInternalState)) + lastInternalState = internalState + confirmBinaryCompressedUnsupported(t) // NOTE: This test is very carefully created in order to not hit @@ -444,19 +526,29 @@ func TestCGoAPIWithIMU(t *testing.T) { // 1. test valid addLidarReading: valid reading ascii tDelta := time.Second * 5 - imuReadingOffset := time.Millisecond * 5 + movementSensorReadingOffset := time.Millisecond * 5 t.Log("lidar reading 1") timestamp = timestamp.Add(tDelta) testAddLidarReading(t, vc, "viam-cartographer/mock_lidar/0.pcd", timestamp, pointcloud.PCDAscii) - // test valid addIMUReading with same timestamp + // test valid addIMUReading with closely followed timestamp t.Log("IMU reading 1") testIMUReading := s.TimedIMUReadingResponse{ LinearAcceleration: r3.Vector{X: 0, Y: 0, Z: 9.8}, AngularVelocity: spatialmath.AngularVelocity{X: 0, Y: 0, Z: 0}, - ReadingTime: timestamp.Add(imuReadingOffset), + ReadingTime: timestamp.Add(movementSensorReadingOffset), } - err = vc.addIMUReading("myIMU", testIMUReading) + err = vc.addIMUReading("my-movement-sensor", testIMUReading) + test.That(t, err, test.ShouldBeNil) + + // test valid addOdometerReading with closely followed timestamp + t.Log("odometer reading 1") + testOdometerReading := s.TimedOdometerReadingResponse{ + Position: geo.NewPoint(4, 5), + Orientation: &spatialmath.Quaternion{Real: 0.8, Imag: -0.2, Jmag: 5.6, Kmag: -0.7}, + ReadingTime: timestamp.Add(2 * movementSensorReadingOffset), + } + err = vc.addOdometerReading("my-movement-sensor", testOdometerReading) test.That(t, err, test.ShouldBeNil) // 2. test valid addLidarReading: valid reading binary @@ -464,14 +556,24 @@ func TestCGoAPIWithIMU(t *testing.T) { timestamp = timestamp.Add(tDelta) testAddLidarReading(t, vc, "viam-cartographer/mock_lidar/1.pcd", timestamp, pointcloud.PCDBinary) - // test valid addIMUReading with same timestamp + // test valid addIMUReading with closely followed timestamp t.Log("IMU reading 2") testIMUReading = s.TimedIMUReadingResponse{ LinearAcceleration: r3.Vector{X: 0.1, Y: 0, Z: 9.8}, AngularVelocity: spatialmath.AngularVelocity{X: 0, Y: -0.2, Z: 0}, - ReadingTime: timestamp.Add(imuReadingOffset), + ReadingTime: timestamp.Add(movementSensorReadingOffset), + } + err = vc.addIMUReading("my-movement-sensor", testIMUReading) + test.That(t, err, test.ShouldBeNil) + + // test valid addOdometerReading with closely followed timestamp + t.Log("odometer reading 2") + testOdometerReading = s.TimedOdometerReadingResponse{ + Position: geo.NewPoint(5, 6), + Orientation: &spatialmath.Quaternion{Real: 0.7, Imag: -0.1, Jmag: 5.4, Kmag: -0.8}, + ReadingTime: timestamp.Add(2 * movementSensorReadingOffset), } - err = vc.addIMUReading("myIMU", testIMUReading) + err = vc.addOdometerReading("my-movement-sensor", testOdometerReading) test.That(t, err, test.ShouldBeNil) // third sensor reading populates the pointcloud map and the position @@ -479,20 +581,30 @@ func TestCGoAPIWithIMU(t *testing.T) { timestamp = timestamp.Add(tDelta) testAddLidarReading(t, vc, "viam-cartographer/mock_lidar/2.pcd", timestamp, pointcloud.PCDBinary) - // test valid addIMUReading with same timestamp + // test valid addIMUReading with closely followed timestamp t.Log("IMU reading 3") testIMUReading = s.TimedIMUReadingResponse{ LinearAcceleration: r3.Vector{X: 0.2, Y: 0, Z: 9.8}, AngularVelocity: spatialmath.AngularVelocity{X: -0.6, Y: 0, Z: 0}, - ReadingTime: timestamp.Add(imuReadingOffset), + ReadingTime: timestamp.Add(movementSensorReadingOffset), } - err = vc.addIMUReading("myIMU", testIMUReading) + err = vc.addIMUReading("my-movement-sensor", testIMUReading) test.That(t, err, test.ShouldBeNil) - // test position zeroed + // test valid addOdometerReading with closely followed timestamp + t.Log("odometer reading 3") + testOdometerReading = s.TimedOdometerReadingResponse{ + Position: geo.NewPoint(6, 7), + Orientation: &spatialmath.Quaternion{Real: 0.4, Imag: 0.1, Jmag: 4.4, Kmag: -0.1}, + ReadingTime: timestamp.Add(2 * movementSensorReadingOffset), + } + err = vc.addOdometerReading("my-movement-sensor", testOdometerReading) + test.That(t, err, test.ShouldBeNil) + + // test position is not zeroed position, err = vc.position() test.That(t, err, test.ShouldBeNil) - test.That(t, position.ComponentReference, test.ShouldEqual, "mylidar") + test.That(t, position.ComponentReference, test.ShouldEqual, "my-lidar") test.That(t, r3.Vector{X: position.X, Y: position.Y, Z: position.Z}, test.ShouldNotResemble, r3.Vector{X: 0, Y: 0, Z: 0}) // test pointCloudMap returns a non empty result diff --git a/cartofacade/carto_facade.go b/cartofacade/carto_facade.go index c38561b5..f508647c 100644 --- a/cartofacade/carto_facade.go +++ b/cartofacade/carto_facade.go @@ -15,7 +15,8 @@ import ( var emptyRequestParams = map[RequestParamType]interface{}{} -// ErrUnableToAcquireLock is the error returned from AddLidarReading and/or AddIMUReading when lock can't be acquired. +// ErrUnableToAcquireLock is the error returned from AddLidarReading, AddIMUReading, +// and/or AddOdometerReading when lock can't be acquired. var ErrUnableToAcquireLock = errors.New("VIAM_CARTO_UNABLE_TO_ACQUIRE_LOCK") // Initialize calls into the cartofacade C code. @@ -90,11 +91,11 @@ func (cf *CartoFacade) AddLidarReading( func (cf *CartoFacade) AddIMUReading( ctx context.Context, timeout time.Duration, - imuName string, + movementSensorName string, currentReading s.TimedIMUReadingResponse, ) error { requestParams := map[RequestParamType]interface{}{ - sensor: imuName, + sensor: movementSensorName, reading: currentReading, } @@ -106,6 +107,26 @@ func (cf *CartoFacade) AddIMUReading( return nil } +// AddOdometerReading calls into the cartofacade C code. +func (cf *CartoFacade) AddOdometerReading( + ctx context.Context, + timeout time.Duration, + movementSensorName string, + currentReading s.TimedOdometerReadingResponse, +) error { + requestParams := map[RequestParamType]interface{}{ + sensor: movementSensorName, + reading: currentReading, + } + + _, err := cf.request(ctx, addOdometerReading, requestParams, timeout) + if err != nil { + return err + } + + return nil +} + // Position calls into the cartofacade C code. func (cf *CartoFacade) Position(ctx context.Context, timeout time.Duration) (Position, error) { untyped, err := cf.request(ctx, position, emptyRequestParams, timeout) @@ -177,6 +198,8 @@ const ( addLidarReading // addIMUReading represents the viam_carto_add_imu_reading in c. addIMUReading + // addOdometerReading represents the viam_carto_add_odometer_reading in c. + addOdometerReading // position represents the viam_carto_get_position call in c. position // internalState represents the viam_carto_get_internal_state call in c. @@ -260,9 +283,15 @@ type Interface interface { AddIMUReading( ctx context.Context, timeout time.Duration, - imuName string, + movementSensorName string, currentReading s.TimedIMUReadingResponse, ) error + AddOdometerReading( + ctx context.Context, + timeout time.Duration, + movementSensorName string, + currentReading s.TimedOdometerReadingResponse, + ) error Position( ctx context.Context, timeout time.Duration, @@ -320,7 +349,7 @@ func (r *Request) doWork( reading, ok := r.requestParams[reading].(s.TimedLidarReadingResponse) if !ok { - return nil, errors.New("could not cast inputted reading to type sensors.TimedLidarSensorReadingResponse") + return nil, errors.New("could not cast inputted reading to type sensors.TimedLidarReadingResponse") } return nil, cf.carto.addLidarReading(lidar, reading) @@ -332,10 +361,22 @@ func (r *Request) doWork( reading, ok := r.requestParams[reading].(s.TimedIMUReadingResponse) if !ok { - return nil, errors.New("could not cast inputted reading to type sensors.TimedIMUSensorReadingResponse") + return nil, errors.New("could not cast inputted reading to type sensors.TimedIMUReadingResponse") } return nil, cf.carto.addIMUReading(imu, reading) + case addOdometerReading: + odometer, ok := r.requestParams[sensor].(string) + if !ok { + return nil, errors.New("could not cast inputted odometer name to string") + } + + reading, ok := r.requestParams[reading].(s.TimedOdometerReadingResponse) + if !ok { + return nil, errors.New("could not cast inputted reading to type sensors.TimedOdometerReadingResponse") + } + + return nil, cf.carto.addOdometerReading(odometer, reading) case position: return cf.carto.position() case internalState: diff --git a/cartofacade/carto_facade_mock.go b/cartofacade/carto_facade_mock.go index 1983ea8e..47a2fe3c 100644 --- a/cartofacade/carto_facade_mock.go +++ b/cartofacade/carto_facade_mock.go @@ -62,9 +62,15 @@ type Mock struct { AddIMUReadingFunc func( ctx context.Context, timeout time.Duration, - imuName string, + movementSensorName string, currentReading s.TimedIMUReadingResponse, ) error + AddOdometerReadingFunc func( + ctx context.Context, + timeout time.Duration, + movementSensorName string, + currentReading s.TimedOdometerReadingResponse, + ) error PositionFunc func( ctx context.Context, timeout time.Duration, @@ -165,13 +171,26 @@ func (cf *Mock) AddLidarReading( func (cf *Mock) AddIMUReading( ctx context.Context, timeout time.Duration, - imuName string, + movementSensorName string, currentReading s.TimedIMUReadingResponse, ) error { if cf.AddIMUReadingFunc == nil { - return cf.CartoFacade.AddIMUReading(ctx, timeout, imuName, currentReading) + return cf.CartoFacade.AddIMUReading(ctx, timeout, movementSensorName, currentReading) + } + return cf.AddIMUReadingFunc(ctx, timeout, movementSensorName, currentReading) +} + +// AddOdometerReading calls the injected AddOdometerReadingFunc or the real version. +func (cf *Mock) AddOdometerReading( + ctx context.Context, + timeout time.Duration, + movementSensorName string, + currentReading s.TimedOdometerReadingResponse, +) error { + if cf.AddOdometerReadingFunc == nil { + return cf.CartoFacade.AddOdometerReading(ctx, timeout, movementSensorName, currentReading) } - return cf.AddIMUReadingFunc(ctx, timeout, imuName, currentReading) + return cf.AddOdometerReadingFunc(ctx, timeout, movementSensorName, currentReading) } // Position calls the injected PositionFunc or the real version. diff --git a/cartofacade/carto_facade_test.go b/cartofacade/carto_facade_test.go index a1cc474f..ab9ab096 100644 --- a/cartofacade/carto_facade_test.go +++ b/cartofacade/carto_facade_test.go @@ -11,6 +11,7 @@ import ( "time" "github.com/golang/geo/r3" + geo "github.com/kellydunn/golang-geo" "go.uber.org/multierr" "go.viam.com/rdk/pointcloud" "go.viam.com/rdk/spatialmath" @@ -32,7 +33,7 @@ func TestRequest(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) carto := CartoMock{} @@ -56,7 +57,7 @@ func TestRequest(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) carto := CartoMock{} @@ -79,7 +80,7 @@ func TestRequest(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) carto := CartoMock{} @@ -104,7 +105,7 @@ func TestRequest(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) carto := CartoMock{} @@ -137,7 +138,7 @@ func TestInitialize(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -162,7 +163,7 @@ func TestStart(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -209,7 +210,7 @@ func TestStop(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -256,7 +257,7 @@ func TestTerminate(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -303,7 +304,7 @@ func TestAddLidarReading(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -329,7 +330,7 @@ func TestAddLidarReading(t *testing.T) { carto.AddLidarReadingFunc = func(name string, reading s.TimedLidarReadingResponse) error { return nil } - err = cartoFacade.AddLidarReading(cancelCtx, 5*time.Second, "mysensor", reading) + err = cartoFacade.AddLidarReading(cancelCtx, 5*time.Second, "my-lidar", reading) test.That(t, err, test.ShouldBeNil) }) @@ -338,7 +339,7 @@ func TestAddLidarReading(t *testing.T) { carto.AddLidarReadingFunc = func(name string, reading s.TimedLidarReadingResponse) error { return expectedErr } - err = cartoFacade.AddLidarReading(cancelCtx, 5*time.Second, "mysensor", reading) + err = cartoFacade.AddLidarReading(cancelCtx, 5*time.Second, "my-lidar", reading) test.That(t, err, test.ShouldBeError) test.That(t, err, test.ShouldResemble, expectedErr) }) @@ -348,7 +349,7 @@ func TestAddLidarReading(t *testing.T) { time.Sleep(50 * time.Millisecond) return nil } - err = cartoFacade.AddLidarReading(cancelCtx, 1*time.Millisecond, "mysensor", reading) + err = cartoFacade.AddLidarReading(cancelCtx, 1*time.Millisecond, "my-lidar", reading) test.That(t, err, test.ShouldBeError) expectedErr := multierr.Combine(errors.New(timeoutErrMessage), context.DeadlineExceeded) test.That(t, err, test.ShouldResemble, expectedErr) @@ -364,7 +365,7 @@ func TestAddIMUReading(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mylidar", "myIMU", "", true) + cfg := GetTestConfig("my-lidar", "my-movement-sensor", "", true) algoCfg := GetTestAlgoConfig(true) cartoFacade := New(&lib, cfg, algoCfg) @@ -382,7 +383,7 @@ func TestAddIMUReading(t *testing.T) { carto.AddIMUReadingFunc = func(name string, reading s.TimedIMUReadingResponse) error { return nil } - err := cartoFacade.AddIMUReading(cancelCtx, 5*time.Second, "myIMU", testIMUReading) + err := cartoFacade.AddIMUReading(cancelCtx, 5*time.Second, "my-movement-sensor", testIMUReading) test.That(t, err, test.ShouldBeNil) }) @@ -391,7 +392,7 @@ func TestAddIMUReading(t *testing.T) { carto.AddIMUReadingFunc = func(name string, reading s.TimedIMUReadingResponse) error { return expectedErr } - err := cartoFacade.AddIMUReading(cancelCtx, 5*time.Second, "myIMU", testIMUReading) + err := cartoFacade.AddIMUReading(cancelCtx, 5*time.Second, "my-movement-sensor", testIMUReading) test.That(t, err, test.ShouldBeError) test.That(t, err, test.ShouldResemble, expectedErr) }) @@ -401,7 +402,61 @@ func TestAddIMUReading(t *testing.T) { time.Sleep(50 * time.Millisecond) return nil } - err := cartoFacade.AddIMUReading(cancelCtx, 1*time.Millisecond, "myIMU", testIMUReading) + err := cartoFacade.AddIMUReading(cancelCtx, 1*time.Millisecond, "my-movement-sensor", testIMUReading) + test.That(t, err, test.ShouldBeError) + expectedErr := multierr.Combine(errors.New(timeoutErrMessage), context.DeadlineExceeded) + test.That(t, err, test.ShouldResemble, expectedErr) + }) + + cancelFunc() + activeBackgroundWorkers.Wait() +} + +func TestAddOdometerReading(t *testing.T) { + lib := CartoLibMock{} + + cancelCtx, cancelFunc := context.WithCancel(context.Background()) + activeBackgroundWorkers := sync.WaitGroup{} + + cfg := GetTestConfig("my-lidar", "my-movement-sensor", "", true) + algoCfg := GetTestAlgoConfig(true) + + cartoFacade := New(&lib, cfg, algoCfg) + carto := CartoMock{} + cartoFacade.carto = &carto + cartoFacade.startCGoroutine(cancelCtx, &activeBackgroundWorkers) + + timestamp := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC) + testOdometerReading := s.TimedOdometerReadingResponse{ + Position: geo.NewPoint(4, 5), + Orientation: &spatialmath.Quaternion{Real: 0.8, Imag: -0.2, Jmag: 5.6, Kmag: -0.7}, + ReadingTime: timestamp, + } + + t.Run("success", func(t *testing.T) { + carto.AddOdometerReadingFunc = func(name string, reading s.TimedOdometerReadingResponse) error { + return nil + } + err := cartoFacade.AddOdometerReading(cancelCtx, 5*time.Second, "my-movement-sensor", testOdometerReading) + test.That(t, err, test.ShouldBeNil) + }) + + t.Run("failure", func(t *testing.T) { + expectedErr := errors.New("AddOdometerReading failed") + carto.AddOdometerReadingFunc = func(name string, reading s.TimedOdometerReadingResponse) error { + return expectedErr + } + err := cartoFacade.AddOdometerReading(cancelCtx, 5*time.Second, "my-movement-sensor", testOdometerReading) + test.That(t, err, test.ShouldBeError) + test.That(t, err, test.ShouldResemble, expectedErr) + }) + + t.Run("failure due to time out", func(t *testing.T) { + carto.AddOdometerReadingFunc = func(name string, reading s.TimedOdometerReadingResponse) error { + time.Sleep(50 * time.Millisecond) + return nil + } + err := cartoFacade.AddOdometerReading(cancelCtx, 1*time.Millisecond, "my-movement-sensor", testOdometerReading) test.That(t, err, test.ShouldBeError) expectedErr := multierr.Combine(errors.New(timeoutErrMessage), context.DeadlineExceeded) test.That(t, err, test.ShouldResemble, expectedErr) @@ -417,7 +472,7 @@ func TestPosition(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -468,7 +523,7 @@ func TestInternalState(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -517,7 +572,7 @@ func TestPointCloudMap(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) @@ -566,7 +621,7 @@ func TestRunFinalOptimization(t *testing.T) { cancelCtx, cancelFunc := context.WithCancel(context.Background()) activeBackgroundWorkers := sync.WaitGroup{} - cfg := GetTestConfig("mysensor", "", "", true) + cfg := GetTestConfig("my-lidar", "", "", true) algoCfg := GetTestAlgoConfig(false) cartoFacade := New(&lib, cfg, algoCfg) diff --git a/go.mod b/go.mod index b3abd1df..485b88cb 100644 --- a/go.mod +++ b/go.mod @@ -11,21 +11,21 @@ require ( github.com/rhysd/actionlint v1.6.24 go.opencensus.io v0.24.0 go.uber.org/multierr v1.11.0 - go.uber.org/zap v1.24.0 - go.viam.com/api v0.1.223 - go.viam.com/rdk v0.13.0 + go.uber.org/zap v1.26.0 + go.viam.com/api v0.1.235 + go.viam.com/rdk v0.15.1 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 - go.viam.com/utils v0.1.52 + go.viam.com/utils v0.1.54 ) require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect 4d63.com/gochecknoglobals v0.2.1 // indirect - cloud.google.com/go v0.110.4 // indirect - cloud.google.com/go/compute v1.21.0 // indirect + cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect - cloud.google.com/go/storage v1.30.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.35.1 // indirect git.sr.ht/~sbinet/gg v0.5.0 // indirect github.com/Abirdcfly/dupword v0.0.9 // indirect github.com/Antonboom/errname v0.1.7 // indirect @@ -37,10 +37,10 @@ require ( github.com/OpenPeeDeeP/depguard v1.1.1 // indirect github.com/a8m/envsubst v1.4.2 // indirect github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect - github.com/alecthomas/participle/v2 v2.0.0 // indirect + github.com/alecthomas/participle/v2 v2.1.1 // 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/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect github.com/ashanbrown/forbidigo v1.4.0 // indirect github.com/ashanbrown/makezero v1.1.1 // indirect github.com/aybabtme/uniplot v0.0.0-20151203143629-039c559e5e7e // indirect @@ -48,12 +48,12 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bep/debounce v1.2.1 // indirect github.com/bkielbasa/cyclop v1.2.0 // indirect - github.com/blackjack/webcam v0.0.0-20230509180125-87693b3f29dc // indirect + github.com/blackjack/webcam v0.5.0 // 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/bufbuild/protocompile v0.5.1 // indirect + github.com/bufbuild/protocompile v0.7.1 // indirect github.com/butuzov/ireturn v0.1.1 // indirect github.com/campoy/embedmd v1.0.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect @@ -62,7 +62,7 @@ require ( github.com/charithe/durationcheck v0.0.9 // indirect github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 // indirect github.com/chewxy/hm v1.0.0 // indirect - github.com/chewxy/math32 v1.0.8 // indirect + github.com/chewxy/math32 v1.10.1 // indirect github.com/curioswitch/go-reassign v0.2.0 // indirect github.com/daixiang0/gci v0.9.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -83,7 +83,7 @@ require ( github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.4 // indirect github.com/fogleman/gg v1.3.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fullstorydev/grpcurl v1.8.6 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gen2brain/malgo v0.11.10 // indirect @@ -92,11 +92,13 @@ require ( github.com/go-audio/transforms v0.0.0-20180121090939-51830ccc35a5 // indirect github.com/go-audio/wav v1.1.0 // indirect github.com/go-critic/go-critic v0.6.7 // indirect - github.com/go-fonts/liberation v0.3.1 // indirect - github.com/go-gl/mathgl v1.0.0 // indirect - github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 // indirect + github.com/go-fonts/liberation v0.3.2 // indirect + github.com/go-gl/mathgl v1.1.0 // indirect + github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-nlopt/nlopt v0.0.0-20230219125344-443d3362dcb5 // indirect - github.com/go-pdf/fpdf v0.8.0 // indirect + github.com/go-pdf/fpdf v0.9.0 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.0.3 // indirect github.com/go-toolsmith/astequal v1.1.0 // indirect @@ -124,20 +126,20 @@ require ( 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 - github.com/google/flatbuffers v2.0.6+incompatible // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 // indirect - github.com/gorilla/securecookie v1.1.1 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.4.2 // indirect github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.6.0 // indirect @@ -145,9 +147,9 @@ require ( github.com/hexops/gotextdiff v1.0.3 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jedib0t/go-pretty/v6 v6.4.6 // indirect + github.com/jedib0t/go-pretty/v6 v6.4.9 // indirect github.com/jgautheron/goconst v1.5.1 // indirect - github.com/jhump/protoreflect v1.15.1 // indirect + github.com/jhump/protoreflect v1.15.4 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect github.com/julz/importas v0.1.0 // indirect @@ -155,7 +157,7 @@ require ( 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/klauspost/compress v1.16.6 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/kulti/thelper v0.6.3 // indirect github.com/kunwardeep/paralleltest v1.0.6 // indirect github.com/kylelemons/go-gypsy v1.0.0 // indirect @@ -164,10 +166,10 @@ require ( github.com/ldez/tagliatelle v0.4.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/jwx v1.2.26 // indirect + github.com/lestrrat-go/jwx v1.2.27 // indirect github.com/lestrrat-go/option v1.0.1 // indirect github.com/lib/pq v1.10.9 // indirect github.com/lmittmann/ppm v1.0.2 // indirect @@ -179,11 +181,11 @@ require ( github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.18 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mbilski/exhaustivestruct v1.2.0 // indirect github.com/mgechev/revive v1.2.5 // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/miekg/dns v1.1.57 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -201,22 +203,22 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pion/datachannel v1.5.5 // indirect - github.com/pion/dtls/v2 v2.2.7 // indirect + github.com/pion/dtls/v2 v2.2.8 // indirect github.com/pion/ice/v2 v2.3.11 // indirect - github.com/pion/interceptor v0.1.22 // indirect + github.com/pion/interceptor v0.1.25 // indirect github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns v0.0.8 // indirect - github.com/pion/mediadevices v0.5.1-0.20231017204133-3c9fee958efe // indirect + github.com/pion/mdns v0.0.9 // indirect + github.com/pion/mediadevices v0.6.0 // indirect github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.10 // indirect - github.com/pion/rtp v1.8.2 // indirect - github.com/pion/sctp v1.8.8 // indirect + github.com/pion/rtcp v1.2.12 // indirect + github.com/pion/rtp v1.8.3 // indirect + github.com/pion/sctp v1.8.9 // indirect github.com/pion/sdp/v3 v3.0.6 // indirect - github.com/pion/srtp/v2 v2.0.17 // indirect + github.com/pion/srtp/v2 v2.0.18 // indirect github.com/pion/stun v0.6.1 // indirect - github.com/pion/transport/v2 v2.2.3 // indirect - github.com/pion/turn/v2 v2.1.3 // indirect - github.com/pion/webrtc/v3 v3.2.21 // indirect + github.com/pion/transport/v2 v2.2.4 // indirect + github.com/pion/turn/v2 v2.1.4 // indirect + github.com/pion/webrtc/v3 v3.2.23 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.1.0 // indirect github.com/prometheus/client_golang v1.12.2 // indirect @@ -229,7 +231,7 @@ require ( 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 - github.com/rs/cors v1.9.0 // indirect + github.com/rs/cors v1.10.1 // indirect github.com/ryancurrah/gomodguard v1.3.0 // indirect github.com/ryanrolds/sqlclosecheck v0.4.0 // indirect github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect @@ -238,7 +240,7 @@ require ( github.com/securego/gosec/v2 v2.15.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/sivchari/containedctx v1.0.2 // indirect github.com/sivchari/nosnakecase v1.7.0 // indirect github.com/sivchari/tenv v1.7.1 // indirect @@ -276,36 +278,40 @@ require ( github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.2.0 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - github.com/zitadel/oidc v1.13.4 // indirect + github.com/zitadel/oidc v1.13.5 // indirect github.com/ziutek/mymysql v1.5.4 // indirect gitlab.com/bosi/decorder v0.2.3 // indirect - go-hep.org/x/hep v0.33.0 // indirect - go.mongodb.org/mongo-driver v1.12.0-prerelease.0.20221109213319-d3466eeae7a7 // indirect + go-hep.org/x/hep v0.34.1 // indirect + go.mongodb.org/mongo-driver v1.13.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.2.1 // indirect - go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect + go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 // indirect goji.io v2.0.2+incompatible // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb // indirect golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 // indirect - golang.org/x/image v0.12.0 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.10.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gonum.org/v1/gonum v0.13.0 // indirect - gonum.org/v1/plot v0.13.0 // indirect - google.golang.org/api v0.128.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/api v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/grpc v1.58.3 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/image v0.14.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.16.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + gonum.org/v1/gonum v0.14.0 // indirect + gonum.org/v1/plot v0.14.0 // indirect + google.golang.org/api v0.153.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect @@ -319,5 +325,7 @@ require ( 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 - nhooyr.io/websocket v1.8.7 // indirect + nhooyr.io/websocket v1.8.10 // indirect + periph.io/x/conn/v3 v3.7.0 // indirect + periph.io/x/host/v3 v3.8.2 // indirect ) diff --git a/go.sum b/go.sum index 334f4096..f86291f5 100644 --- a/go.sum +++ b/go.sum @@ -24,23 +24,23 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= -cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -53,11 +53,13 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= +git.sr.ht/~sbinet/epok v0.4.0 h1:3FYQTVg2ZtfMiXSyoE/vKaFXdqFQYhcpZc+Cy3EdAUI= git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= github.com/Abirdcfly/dupword v0.0.9 h1:MxprGjKq3yDBICXDgEEsyGirIXfMYXkLNT/agPsE1tk= @@ -99,11 +101,12 @@ github.com/adrianmo/go-nmea v1.7.0 h1:ji8IeiuUG+LTpVoUxmLPHr/WuxFvvD2S6lYDfDze5y github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= -github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= -github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= +github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -119,8 +122,8 @@ github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/arrow/go/arrow v0.0.0-20201229220542-30ce2eb5d4dc h1:zvQ6w7KwtQWgMQiewOF9tFtundRMVZFSAksNV6ogzuY= -github.com/apache/arrow/go/arrow v0.0.0-20201229220542-30ce2eb5d4dc/go.mod h1:c9sxoIT3YgLxH4UhLOCKaBlEojuMhVYpk4Ntv3opUTQ= +github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 h1:q4dksr6ICHXqG5hm0ZW5IHyeEJXoIJSOZeBLmWPNeIQ= +github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -158,19 +161,20 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB 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.0.0-20230509180125-87693b3f29dc h1:7cMZ/f4xwkD3FUOcThPAm0uecSP5kSTUU/3RWsrmcww= -github.com/blackjack/webcam v0.0.0-20230509180125-87693b3f29dc/go.mod h1:G0X+rEqYPWSq0dG8OMf8M446MtKytzpPjgS3HbdOJZ4= +github.com/blackjack/webcam v0.5.0 h1:NImYpsAbWxglejopcQGQ3FClxhJZaBBgr5fV7nsGdvk= +github.com/blackjack/webcam v0.5.0/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/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/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/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/bufbuild/protocompile v0.7.1 h1:Kd8fb6EshOHXNNRtYAmLAwy/PotlyFoN0iMbuwGNh0M= +github.com/bufbuild/protocompile v0.7.1/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= @@ -195,8 +199,8 @@ github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348/go.mod h1:f/miWtG3 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= -github.com/chewxy/math32 v1.0.8 h1:fU5E4Ec4Z+5RtRAi3TovSxUjQPkgRh+HbP7tKB2OFbM= -github.com/chewxy/math32 v1.0.8/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= +github.com/chewxy/math32 v1.10.1 h1:LFpeY0SLJXeaiej/eIp2L40VYfscTvKh/FSEZ68uMkU= +github.com/chewxy/math32 v1.10.1/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -206,6 +210,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -277,6 +282,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -302,6 +309,7 @@ github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 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= @@ -309,8 +317,8 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2 github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= 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.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= github.com/fullstorydev/grpcurl v1.8.6 h1:WylAwnPauJIofYSHqqMTC1eEfUIzqzevXyogBxnQquo= github.com/fullstorydev/grpcurl v1.8.6/go.mod h1:WhP7fRQdhxz2TkL97u+TCb505sxfH78W1usyoB3tepw= @@ -320,10 +328,8 @@ github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlya github.com/gen2brain/malgo v0.11.10 h1:u41QchDBS7Z2rwEVPu7uycK6HA8IyzKoUOhLU7IvYW4= github.com/gen2brain/malgo v0.11.10/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/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= @@ -336,39 +342,45 @@ github.com/go-critic/go-critic v0.5.4/go.mod h1:cjB4YGw+n/+X8gREApej7150Uyy1Tg8I 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-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= -github.com/go-fonts/latin-modern v0.3.1 h1:/cT8A7uavYKvglYXvrdDw4oS5ZLkcOU22fa2HJ1/JVM= -github.com/go-fonts/liberation v0.3.1 h1:9RPT2NhUpxQ7ukUvz3jeUckmN42T9D9TpjtQcqK/ceM= -github.com/go-fonts/liberation v0.3.1/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/dejavu v0.3.2 h1:3XlHi0JBYX+Cp8n98c6qSoHrxPa4AUKDMKdrh/0sUdk= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/latin-modern v0.3.2 h1:M+Sq24Dp0ZRPf3TctPnG1MZxRblqyWC/cRUL9WmdaFc= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.3.2 h1:XuwG0vGHFBPRRI8Qwbi5tIvR3cku9LUfZGq/Ar16wlQ= +github.com/go-fonts/liberation v0.3.2/go.mod h1:N0QsDLVUQPy3UYg9XAc3Uh3UDMp2Z7M1o4+X98dXkmI= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/mathgl v1.0.0 h1:t9DznWJlXxxjeeKLIdovCOVJQk/GzDEL7h/h+Ro2B68= -github.com/go-gl/mathgl v1.0.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= +github.com/go-gl/mathgl v1.1.0 h1:0lzZ+rntPX3/oGrDzYGdowSLC2ky8Osirvf5uAwfIEA= +github.com/go-gl/mathgl v1.1.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= github.com/go-gnss/rtcm v0.0.3 h1:JdMhDoP6wmF1FUyqvGGayICk5V6LXUIHXF4O99vzzq0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 h1:NxXI5pTAtpEaU49bpLpQoDsu1zrteW/vxzTz8Cd2UAs= -github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9/go.mod h1:gWuR/CrFDDeVRFQwHPvsv9soJVB/iqymhuZQuJ3a9OM= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea h1:DfZQkvEbdmOe+JK2TMtBM+0I9GSdzE2y/L1/AmD8xKc= +github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea/go.mod h1:Y7Vld91/HRbTBm7JwoI7HejdDB0u+e9AUBO9MB7yuZk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 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 v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 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= -github.com/go-pdf/fpdf v0.8.0 h1:IJKpdaagnWUeSkUFUjTcSzTppFxmv8ucGQyNPQWxYOQ= -github.com/go-pdf/fpdf v0.8.0/go.mod h1:gfqhcNwXrsd3XYKte9a7vM3smvU/jB4ZRDrmWSxpfdc= +github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= +github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= 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= @@ -410,11 +422,8 @@ github.com/goburrow/modbus v0.1.0 h1:DejRZY73nEM6+bt5JSP6IsFolJ9dVcqxsYbpLbeW/ro github.com/goburrow/serial v0.1.0 h1:v2T1SQa/dlUqQiYIT8+Cu7YolfqAi3K96UmhwYyuSrA= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -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-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -436,7 +445,6 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I= github.com/golang/geo v0.0.0-20230421003525-6adc56603217/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -472,6 +480,7 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= @@ -506,9 +515,9 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v2.0.6+incompatible h1:XHFReMv7nFFusa+CEokzWbzaYocKXI6C7hdU5Kgh9Lw= -github.com/google/flatbuffers v2.0.6+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -520,10 +529,12 @@ 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= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -541,21 +552,22 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe 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/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= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.3.6/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= @@ -569,11 +581,10 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= @@ -603,8 +614,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -658,15 +669,15 @@ github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf 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/jacobsa/go-serial v0.0.0-20180131005756-15cf729a72d4 h1:G2ztCwXov8mRvP0ZfjE6nAlaCX2XbykaeHdbT6KwDz0= -github.com/jedib0t/go-pretty/v6 v6.4.6 h1:v6aG9h6Uby3IusSSEjHaZNXpHFhzqMmjXcPq1Rjl9Jw= -github.com/jedib0t/go-pretty/v6 v6.4.6/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= +github.com/jedib0t/go-pretty/v6 v6.4.9 h1:vZ6bjGg2eBSrJn365qlxGcaWu09Id+LHtrfDWlB2Usc= +github.com/jedib0t/go-pretty/v6 v6.4.9/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jhump/protoreflect v1.10.3/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jhump/protoreflect v1.15.4 h1:mrwJhfQGGljwvR/jPEocli8KA6G9afbQpH8NY2wORcI= +github.com/jhump/protoreflect v1.15.4/go.mod h1:2B+zwrnMY3TTIqEK01OG/d3pyUycQBfDf+bx8fE2DNg= github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d/go.mod h1:/EZlaYCnEX24i7qdVhT9du5JrtFWYRQr67bVgR7JJC8= github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D3C1GeosjupAKCA= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= @@ -680,6 +691,7 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -687,7 +699,6 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -699,6 +710,8 @@ github.com/julz/importas v0.0.0-20210226073942-60b4fa260dd0/go.mod h1:oSFU2R4XK/ github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/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= @@ -718,9 +731,10 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.6 h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk= -github.com/klauspost/compress v1.16.6/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -750,20 +764,19 @@ github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUc 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/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 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.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.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx v1.2.26 h1:4iFo8FPRZGDYe1t19mQP0zTRqA7n8HnJ5lkIiDvJcB0= -github.com/lestrrat-go/jwx v1.2.26/go.mod h1:MaiCdGbn3/cckbOFSCluJlJMmp9dmZm5hDuIkx8ftpQ= +github.com/lestrrat-go/jwx v1.2.27 h1:cvnTnda/YzdyFuWdEAMkI6BsLtItSrASEVCI3C/IUEQ= +github.com/lestrrat-go/jwx v1.2.27/go.mod h1:Stob9LjSqR3lOmNdxF0/TvZo60V3hUGv8Fr7Bwzla3k= 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= @@ -819,8 +832,8 @@ github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tflite v1.0.4 h1:wpfNKjMr3IJz4xI+oUeHE70RU6Q5dZc0FK/X8vCWLAo= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= @@ -837,8 +850,8 @@ github.com/mgechev/revive v1.2.5/go.mod h1:nFOXent79jMTISAfOAasKfy0Z2Ejq0WX7Qn/K 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= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= +github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -862,11 +875,9 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mkch/gpio v0.0.0-20190919032813-8327cd97d95e h1:vSAYdBvTvlYVdoDYYQapVnlPd8Klrk19uHPDy29agsg= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= @@ -967,51 +978,62 @@ github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaF 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= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8= github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0= -github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.8 h1:BUroldfiIbV9jSnC6cKOMnyiORRWrWWpV11JUyEu5OA= +github.com/pion/dtls/v2 v2.2.8/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/ice/v2 v2.3.11 h1:rZjVmUwyT55cmN8ySMpL7rsS8KYsJERsrxJLLxpKhdw= github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E= -github.com/pion/interceptor v0.1.18/go.mod h1:tpvvF4cPM6NGxFA1DUMbhabzQBxdWMATDGEUYOR9x6I= -github.com/pion/interceptor v0.1.22 h1:khhimAF0/VmGaIfeE+bA3X1jm0lD8C8HOGcU7vpWcPA= -github.com/pion/interceptor v0.1.22/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y= +github.com/pion/interceptor v0.1.25 h1:pwY9r7P6ToQ3+IF0bajN0xmk/fNw/suTgaTdlwTDmhc= +github.com/pion/interceptor v0.1.25/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y= 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.8 h1:HhicWIg7OX5PVilyBO6plhMetInbzkVJAhbdJiAeVaI= github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI= -github.com/pion/mediadevices v0.5.1-0.20231017204133-3c9fee958efe h1:Ib0avJz1sPwq9LxNlyQmmVAh2Jji/0vnwk7jVBBTFLk= -github.com/pion/mediadevices v0.5.1-0.20231017204133-3c9fee958efe/go.mod h1:FsvwNFhEAGq/JWgeYEuZ3FZ0BgB35/NPpKte/CvXU6E= +github.com/pion/mdns v0.0.9 h1:7Ue5KZsqq8EuqStnpPWV33vYYEH0+skdDN5L7EiEsI4= +github.com/pion/mdns v0.0.9/go.mod h1:2JA5exfxwzXiCihmxpTKgFUpiQws2MnipoPK09vecIc= +github.com/pion/mediadevices v0.6.0 h1:w8ulVGSoSCbwhtsBwYj+fMnIYOyvWopWcShuwaU60Y4= +github.com/pion/mediadevices v0.6.0/go.mod h1:KIOhvYyqifPiLeSlLBP5J8IzVLOPMq9TNOGMenXjbG0= 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 h1:nkr3uj+8Sp97zyItdN60tE/S6vk4al5CPRR6Gejsdjc= github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I= -github.com/pion/rtp v1.8.1/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/rtp v1.8.2 h1:oKMM0K1/QYQ5b5qH+ikqDSZRipP5mIxPJcgcvw5sH0w= +github.com/pion/rtcp v1.2.12 h1:bKWiX93XKgDZENEXCijvHRU/wRifm6JV5DGcH6twtSM= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtp v1.8.2/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.3 h1:VEHxqzSVQxCkKDSHro5/4IUUG1ea+MFdqR2R3xSpNU8= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0= -github.com/pion/sctp v1.8.8 h1:5EdnnKI4gpyR1a1TwbiS/wxEgcUWBHsc7ILAjARJB+U= github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs= +github.com/pion/sctp v1.8.9 h1:TP5ZVxV5J7rz7uZmbyvnUvsn7EJ2x/5q9uhsTtXbI3g= +github.com/pion/sctp v1.8.9/go.mod h1:cMLT45jqw3+jiJCrtHVwfQLnfR0MGZ4rgOJwUOIqLkI= github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw= -github.com/pion/srtp/v2 v2.0.17 h1:ECuOk+7uIpY6HUlTb0nXhfvu4REG2hjtC4ronYFCZE4= -github.com/pion/srtp/v2 v2.0.17/go.mod h1:y5WSHcJY4YfNB/5r7ca5YjHeIr1H3LM1rKArGGs8jMc= +github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= +github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40= github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= -github.com/pion/transport/v2 v2.2.3 h1:XcOE3/x41HOSKbl1BfyY1TF1dERx7lVvlMCbXU7kfvA= github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= -github.com/pion/turn/v2 v2.1.3 h1:pYxTVWG2gpC97opdRc5IGsQ1lJ9O/IlNhkzj7MMrGAA= github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/webrtc/v3 v3.2.21 h1:c8fy5JcqJkAQBwwy3Sk9huQLTBUSqaggyRlv9Lnh2zY= -github.com/pion/webrtc/v3 v3.2.21/go.mod h1:vVURQTBOG5BpWKOJz3nlr23NfTDeyKVmubRNqzQp+Tg= +github.com/pion/turn/v2 v2.1.4 h1:2xn8rduI5W6sCZQkEnIUDAkrBQNl2eYIBCHMZ3QMmP8= +github.com/pion/turn/v2 v2.1.4/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.2.23 h1:GbqEuxBbVLFhXk0GwxKAoaIJYiEa9TyoZPEZC+2HZxM= +github.com/pion/webrtc/v3 v3.2.23/go.mod h1:1CaT2fcZzZ6VZA+O1i9yK2DU4EOcXVvSbWG9pr5jefs= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1102,11 +1124,12 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR 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/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= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= @@ -1145,8 +1168,8 @@ 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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/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/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= @@ -1208,7 +1231,6 @@ github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1231,6 +1253,7 @@ github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUY 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/teambition/rrule-go v1.8.2 h1:lIjpjvWTj9fFUZCmuoVDrKVOtdiyzbzc93qTmRVe/J8= 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= @@ -1238,8 +1261,6 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1: github.com/tetafro/godot v1.4.4/go.mod h1:FVDd4JuKliW3UgjswZfJfHq4vAx0bD/Jd5brJjGeaz4= github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= 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= @@ -1260,10 +1281,8 @@ github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+ github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/u2takey/ffmpeg-go v0.4.1 h1:l5ClIwL3N2LaH1zF3xivb3kP2HW95eyG5xhHE1JdZ9Y= github.com/u2takey/go-utils v0.3.1 h1:TaQTgmEZZeDHQFYfd+AdUT1cT4QJgJn/XVPELhHw4ys= -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 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= @@ -1286,10 +1305,8 @@ github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -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/xfmoulet/qoi v0.2.0 h1:+Smrwzy5ptRnPzGm/YHkZfyK9qGUSoOpiEPngGmFv+c= @@ -1315,22 +1332,22 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -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/zitadel/oidc v1.13.5 h1:7jhh68NGZitLqwLiVU9Dtwa4IraJPFF1vS+4UupO93U= +github.com/zitadel/oidc v1.13.5/go.mod h1:rHs1DhU3Sv3tnI6bQRVlFa3u0lCwtR7S21WHY+yXgPA= 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= -go-hep.org/x/hep v0.33.0 h1:L9USQj5F6vIrnLMrOKk+kM0NsPxm3Jzw3Ln92SxihQQ= -go-hep.org/x/hep v0.33.0/go.mod h1:0oxgYeNQOZ8S5LrgXo0PteQqTdBavcSnXFy3JbxFB+k= +go-hep.org/x/hep v0.34.1 h1:C7kcqaECrra3Dx21u0rfb7F7ZMWUoMDUqlqCMPa57mE= +go-hep.org/x/hep v0.34.1/go.mod h1:+egIX98hlO2ErLV7XRzc+AypF2Z6M4WeRbuUski7MZ8= go.einride.tech/vlp16 v0.7.0 h1:mR7jChj9PTxxKhEn2HkHeT3zwKK45qIb6DLZkbyQZuw= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.mongodb.org/mongo-driver v1.12.0-prerelease.0.20221109213319-d3466eeae7a7 h1:41yUZ1vfJiLeNVNhPVY+aJ0uUJMTxB4MDBdEx22IaFw= -go.mongodb.org/mongo-driver v1.12.0-prerelease.0.20221109213319-d3466eeae7a7/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1342,6 +1359,13 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 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= @@ -1364,18 +1388,18 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= 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.223 h1:QHLEF9eR9ntRh9Rat/54UN9kpk3YM5ASiAxQXKhwcb4= -go.viam.com/api v0.1.223/go.mod h1:msa4TPrMVeRDcG4YzKA/S6wLEUC7GyHQE973JklrQ10= -go.viam.com/rdk v0.13.0 h1:YDUFU9cW8B+FdknVLhKLPmj6zGLNNXVzuni5be574Xc= -go.viam.com/rdk v0.13.0/go.mod h1:pfZNdjfpKgqfG1wUsMjiBizjnGSnThfqMri9GaRNM1E= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.viam.com/api v0.1.235 h1:xxrAVFTvIR93DpMfv4ixIoCC60PyVVOfKzgunyxRTeE= +go.viam.com/api v0.1.235/go.mod h1:msa4TPrMVeRDcG4YzKA/S6wLEUC7GyHQE973JklrQ10= +go.viam.com/rdk v0.15.1 h1:gsQWP3F3/JGJXfNrtH+qlJIYDfqP2RsfSzjNrpUR2i8= +go.viam.com/rdk v0.15.1/go.mod h1:DPs/YSRJPpnfn0h2I1ZRFmXzQ02zfsyHDHcUXXsmG2Y= 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.52 h1:g5lw85utkAwkkGXEqbvcy2wRJA3/kypc3trRhv78+Jo= -go.viam.com/utils v0.1.52/go.mod h1:tjPInze4C0UYFRqL/FU96yqhJpHR1zjiNZ7qChTN/b8= -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= +go.viam.com/utils v0.1.54 h1:1ENNj0atwDngCVKAOr4gXSJnoQdVd88qm38tEnqghaE= +go.viam.com/utils v0.1.54/go.mod h1:tjPInze4C0UYFRqL/FU96yqhJpHR1zjiNZ7qChTN/b8= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 h1:lGdhQUN/cnWdSH3291CUuxSEqc+AsGTiDxPP3r2J0l4= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= 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/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1395,20 +1419,23 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 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-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.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= 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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1416,18 +1443,25 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8= +golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= 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/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.12.0 h1:w13vZbU4o5rKOFFR8y7M+c4A5jXDC0uXTdHYRP8X2DQ= -golang.org/x/image v0.12.0/go.mod h1:Lu90jvHG7GfemOIcldsh9A2hS01ocl6oNO7ype5mEnk= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1439,6 +1473,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/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/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1456,8 +1491,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= @@ -1497,7 +1532,6 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1509,6 +1543,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1525,8 +1560,9 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= 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.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= 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= @@ -1538,8 +1574,8 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1554,8 +1590,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.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= @@ -1607,7 +1643,6 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201024232916-9f70ab9862d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1620,12 +1655,14 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1637,7 +1674,6 @@ golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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= @@ -1649,8 +1685,9 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.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= @@ -1664,6 +1701,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= 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.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= 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= @@ -1682,14 +1721,16 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.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/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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1697,6 +1738,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1717,6 +1759,7 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191026034945-b2104f82a97d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1793,6 +1836,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= @@ -1803,18 +1847,24 @@ 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.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= -gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= -gonum.org/v1/plot v0.13.0 h1:yb2Z/b8bY5h/xC4uix+ujJ+ixvPUvBmUOtM73CJzpsw= -gonum.org/v1/plot v0.13.0/go.mod h1:mV4Bpu4PWTgN2CETURNF8hCMg7EtlZqJYCcmYo/t4Co= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= +gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= +gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1836,8 +1886,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4= +google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1846,8 +1896,9 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1886,7 +1937,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1894,12 +1944,13 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto v0.0.0-20210630183607-d20f26d13c79/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= +google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4 h1:W12Pwm4urIbRdGhMEg2NM9O3TWKjNcxQhs46V0ypf/k= +google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 h1:ZcOkrmX74HbKFYnpPY8Qsw93fC29TbJXspYKaBkSXDQ= +google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1927,11 +1978,11 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200910201057-6591123024b3/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1945,8 +1996,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1 h1:fk72uXZyuZiTtW5tgd63jyVK6582lF61nRC/kGv6vCA= +google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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= @@ -2014,12 +2066,15 @@ mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= +nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= periph.io/x/conn/v3 v3.7.0 h1:f1EXLn4pkf7AEWwkol2gilCNZ0ElY+bxS4WE2PQXfrA= -periph.io/x/host/v3 v3.8.1-0.20230331112814-9f0d9f7d76db h1:8+HL7DJFofYRhGoK/UdwhzvQj3I2HrKLQ6dkOC66CZY= +periph.io/x/conn/v3 v3.7.0/go.mod h1:ypY7UVxgDbP9PJGwFSVelRRagxyXYfttVh7hJZUHEhg= +periph.io/x/host/v3 v3.8.2 h1:ayKUDzgUCN0g8+/xM9GTkWaOBhSLVcVHGTfjAOi8OsQ= +periph.io/x/host/v3 v3.8.2/go.mod h1:yFL76AesNHR68PboofSWYaQTKmvPXsQH2Apvp/ls/K4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/sensors/lidar_test.go b/sensors/lidar_test.go index d7ccd086..275f0815 100644 --- a/sensors/lidar_test.go +++ b/sensors/lidar_test.go @@ -20,7 +20,7 @@ func TestNewLidar(t *testing.T) { actualLidar, err := s.NewLidar(context.Background(), s.SetupDeps(lidar, imu), string(lidar), testDataFrequencyHz, logger) test.That(t, err, test.ShouldBeError, errors.New("error getting lidar camera "+ - " for slam service: \"rdk:component:camera/\" missing from dependencies")) + " for slam service: Resource missing from dependencies. Resource: rdk:component:camera/")) test.That(t, actualLidar, test.ShouldResemble, s.Lidar{}) }) @@ -29,7 +29,7 @@ func TestNewLidar(t *testing.T) { actualLidar, err := s.NewLidar(context.Background(), s.SetupDeps(lidar, imu), string(lidar), testDataFrequencyHz, logger) test.That(t, err, test.ShouldBeError, errors.New("error getting lidar camera "+ - "gibberish_lidar for slam service: \"rdk:component:camera/gibberish_lidar\" missing from dependencies")) + "gibberish_lidar for slam service: Resource missing from dependencies. Resource: rdk:component:camera/gibberish_lidar")) test.That(t, actualLidar, test.ShouldResemble, s.Lidar{}) }) diff --git a/sensors/movementsensor_test.go b/sensors/movementsensor_test.go index 145e85fe..2b83d57e 100644 --- a/sensors/movementsensor_test.go +++ b/sensors/movementsensor_test.go @@ -35,8 +35,8 @@ func TestNewMovementSensor(t *testing.T) { deps := s.SetupDeps(lidar, movementSensor) actualMs, err := s.NewMovementSensor(context.Background(), deps, string(movementSensor), testDataFrequencyHz, logger) test.That(t, err, test.ShouldBeError, - errors.New("error getting movement sensor \""+string(movementSensor)+"\" for slam service: \""+ - "rdk:component:movement_sensor/"+string(movementSensor)+"\" missing from dependencies")) + errors.New("error getting movement sensor \""+string(movementSensor)+"\" for slam service: "+ + "Resource missing from dependencies. Resource: rdk:component:movement_sensor/"+string(movementSensor))) test.That(t, actualMs, test.ShouldResemble, &s.MovementSensor{}) }) diff --git a/viam-cartographer/src/carto_facade/carto_facade.cc b/viam-cartographer/src/carto_facade/carto_facade.cc index c610e837..b96764a8 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.cc +++ b/viam-cartographer/src/carto_facade/carto_facade.cc @@ -890,6 +890,57 @@ void CartoFacade::AddIMUReading(const viam_carto_imu_reading *sr) { } }; +void CartoFacade::AddOdometerReading(const viam_carto_odometer_reading *sr) { + if (state != CartoFacadeState::STARTED) { + LOG(ERROR) << "carto facade is in state: " << state + << " expected it to be in state: " + << CartoFacadeState::STARTED; + throw VIAM_CARTO_NOT_IN_STARTED_STATE; + } + bstring movement_sensor = to_bstring(config.movement_sensor); + + bool known_sensor = biseq(movement_sensor, sr->odometer); + bdestroy(movement_sensor); + + if (!known_sensor) { + VLOG(1) << "expected sensor: " << to_std_string(sr->odometer) + << " to be " << config.movement_sensor; + throw VIAM_CARTO_UNKNOWN_SENSOR_NAME; + } + + int64_t odometer_reading_time_unix_milli = + sr->odometer_reading_time_unix_milli; + + cartographer::sensor::OdometryData measurement; + measurement.time = cartographer::common::FromUniversal(0) + + cartographer::common::FromMilliseconds( + odometer_reading_time_unix_milli); + measurement.pose = cartographer::transform::Rigid3d( + cartographer::transform::Rigid3d::Vector( + sr->translation_x, sr->translation_y, sr->translation_z), + cartographer::transform::Rigid3d::Quaternion( + sr->rotation_w, sr->rotation_x, sr->rotation_y, sr->rotation_z)); + + cartographer::transform::Rigid3d tmp_global_pose; + + if (map_builder_mutex.try_lock()) { + VLOG(1) << "AddSensorData timestamp: " << measurement.time + << " Sensor type: Odometer "; + map_builder.AddSensorData(kOdometerSensorId.id, measurement); + VLOG(1) << "Data added is: " << measurement.pose.DebugString(); + LOG(INFO) << "Added odometer data to Cartographer"; + tmp_global_pose = map_builder.GetGlobalPose(); + map_builder_mutex.unlock(); + { + std::lock_guard lk(viam_response_mutex); + latest_global_pose = tmp_global_pose; + } + return; + } else { + throw VIAM_CARTO_UNABLE_TO_ACQUIRE_LOCK; + } +}; + viam::carto_facade::SlamMode determine_slam_mode( std::string path_to_internal_state, std::chrono::seconds map_rate_sec) { // Check if there is an apriori map (internal state) in the @@ -1206,6 +1257,47 @@ extern int viam_carto_add_imu_reading_destroy(viam_carto_imu_reading *sr) { return return_code; }; +extern int viam_carto_add_odometer_reading( + viam_carto *vc, const viam_carto_odometer_reading *sr) { + if (vc == nullptr) { + return VIAM_CARTO_VC_INVALID; + } + + if (sr == nullptr) { + return VIAM_CARTO_ODOMETER_READING_INVALID; + } + + try { + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + cf->AddOdometerReading(sr); + } catch (int err) { + return err; + } catch (std::exception &e) { + LOG(ERROR) << e.what(); + return VIAM_CARTO_UNKNOWN_ERROR; + } + return VIAM_CARTO_SUCCESS; +}; + +extern int viam_carto_add_odometer_reading_destroy( + viam_carto_odometer_reading *sr) { + if (sr == nullptr) { + return VIAM_CARTO_ODOMETER_READING_INVALID; + } + int return_code = VIAM_CARTO_SUCCESS; + int rc = BSTR_OK; + + // destroy sensor + rc = bdestroy(sr->odometer); + if (rc != BSTR_OK) { + return_code = VIAM_CARTO_DESTRUCTOR_ERROR; + } + sr->odometer = nullptr; + + return return_code; +}; + extern int viam_carto_get_position(viam_carto *vc, viam_carto_get_position_response *r) { if (vc == nullptr) { diff --git a/viam-cartographer/src/carto_facade/carto_facade.h b/viam-cartographer/src/carto_facade/carto_facade.h index 5c8b216f..862bb9cc 100644 --- a/viam-cartographer/src/carto_facade/carto_facade.h +++ b/viam-cartographer/src/carto_facade/carto_facade.h @@ -89,6 +89,18 @@ typedef struct viam_carto_imu_reading { int64_t imu_reading_time_unix_milli; } viam_carto_imu_reading; +typedef struct viam_carto_odometer_reading { + bstring odometer; + double translation_x; + double translation_y; + double translation_z; + double rotation_x; + double rotation_y; + double rotation_z; + double rotation_w; + int64_t odometer_reading_time_unix_milli; +} viam_carto_odometer_reading; + // return codes #define VIAM_CARTO_SUCCESS 0 #define VIAM_CARTO_UNABLE_TO_ACQUIRE_LOCK 1 @@ -126,6 +138,7 @@ typedef struct viam_carto_imu_reading { #define VIAM_CARTO_IMU_PROVIDED_AND_IMU_ENABLED_MISMATCH 34 #define VIAM_CARTO_IMU_READING_EMPTY 35 #define VIAM_CARTO_IMU_READING_INVALID 36 +#define VIAM_CARTO_ODOMETER_READING_INVALID 37 typedef struct viam_carto_algo_config { bool optimize_on_start; @@ -248,6 +261,28 @@ extern int viam_carto_add_imu_reading(viam_carto *vc, // extern int viam_carto_add_imu_reading_destroy(viam_carto_imu_reading *sr // ); +// viam_carto_add_odometer_reading/3 takes a viam_carto pointer, a +// viam_carto_odometer_reading +// +// On error: Returns a non 0 error code +// +// An expected error is VIAM_CARTO_UNABLE_TO_ACQUIRE_LOCK(1) +// +// On success: Returns 0, adds odometer reading to cartographer's data model +extern int viam_carto_add_odometer_reading( + viam_carto *vc, // + const viam_carto_odometer_reading *sr // +); + +// viam_carto_add_odometer_reading_destroy/2 takes a viam_carto pointer +// +// On error: Returns a non 0 error code +// +// On success: Returns 0, frees the viam_carto_odometer_reading. +extern int viam_carto_add_odometer_reading_destroy( + viam_carto_odometer_reading *sr // +); + // viam_carto_get_position/3 takes a viam_carto pointer, a // viam_carto_get_position_response pointer // @@ -402,6 +437,8 @@ class CartoFacade { void AddIMUReading(const viam_carto_imu_reading *sr); + void AddOdometerReading(const viam_carto_odometer_reading *sr); + void Start(); void Stop(); diff --git a/viam-cartographer/src/carto_facade/carto_facade_test.cc b/viam-cartographer/src/carto_facade/carto_facade_test.cc index b44dcaab..7dce4855 100644 --- a/viam-cartographer/src/carto_facade/carto_facade_test.cc +++ b/viam-cartographer/src/carto_facade/carto_facade_test.cc @@ -61,29 +61,64 @@ viam_carto_lidar_reading new_test_lidar_reading( sr.lidar_reading_time_unix_milli = lidar_reading_time_unix_milli; return sr; } +void add_lidar_reading_successfully(viam_carto *vc, int number_reading, + std::string pcd_path, int64_t timestamp) { + VLOG(1) << "viam_carto_add_lidar_reading " << number_reading; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, timestamp); + BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); + BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == VIAM_CARTO_SUCCESS); +} -viam_carto_imu_reading new_testIMUReading(std::string imu, double readings[6], - int64_t imu_reading_time_unix_milli) { +viam_carto_imu_reading new_test_imu_reading( + std::string imu, double reading[6], int64_t imu_reading_time_unix_milli) { viam_carto_imu_reading sr; sr.imu = bfromcstr(imu.c_str()); - sr.lin_acc_x = readings[0]; - sr.lin_acc_y = readings[1]; - sr.lin_acc_z = readings[2]; - sr.ang_vel_x = readings[3]; - sr.ang_vel_y = readings[4]; - sr.ang_vel_z = readings[5]; + sr.lin_acc_x = reading[0]; + sr.lin_acc_y = reading[1]; + sr.lin_acc_z = reading[2]; + sr.ang_vel_x = reading[3]; + sr.ang_vel_y = reading[4]; + sr.ang_vel_z = reading[5]; sr.imu_reading_time_unix_milli = imu_reading_time_unix_milli; return sr; } -void add_new_testIMUReading(viam_carto *vc, double readings[6], - int64_t timestamp) { - VLOG(1) << "viam_carto_add_new_testIMUReading"; - viam_carto_imu_reading sr = new_testIMUReading("imu", readings, timestamp); +void add_imu_reading_successfully(viam_carto *vc, int number_reading, + double reading[6], int64_t timestamp) { + VLOG(1) << "viam_carto_add_imu_reading " << number_reading; + viam_carto_imu_reading sr = + new_test_imu_reading("movement_sensor", reading, timestamp); BOOST_TEST(viam_carto_add_imu_reading(vc, &sr) == VIAM_CARTO_SUCCESS); BOOST_TEST(viam_carto_add_imu_reading_destroy(&sr) == VIAM_CARTO_SUCCESS); } +viam_carto_odometer_reading new_test_odometer_reading( + std::string odometer, double reading[7], + int64_t odometer_reading_time_unix_milli) { + viam_carto_odometer_reading sr; + sr.odometer = bfromcstr(odometer.c_str()); + sr.translation_x = reading[0]; + sr.translation_y = reading[1]; + sr.translation_z = reading[2]; + sr.rotation_x = reading[3]; + sr.rotation_y = reading[4]; + sr.rotation_z = reading[5]; + sr.rotation_w = reading[5]; + sr.odometer_reading_time_unix_milli = odometer_reading_time_unix_milli; + return sr; +} + +void add_odometer_reading_successfully(viam_carto *vc, int number_reading, + double reading[7], int64_t timestamp) { + VLOG(1) << "viam_carto_add_odometer_reading " << number_reading; + viam_carto_odometer_reading sr = + new_test_odometer_reading("movement_sensor", reading, timestamp); + BOOST_TEST(viam_carto_add_odometer_reading(vc, &sr) == VIAM_CARTO_SUCCESS); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); +} + viam_carto_algo_config viam_carto_algo_config_setup(bool use_imu_data) { struct viam_carto_algo_config ac; ac.use_imu_data = use_imu_data; @@ -141,7 +176,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { fs::temp_directory_path() / fs::path(bfs::unique_path().string()); std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; std::string no_camera = ""; std::string no_movement_sensor = ""; @@ -179,14 +214,15 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_lidar_config, ac) == VIAM_CARTO_LIDAR_CONFIG_INVALID); - // Test config validation with invalid imu config + // Test config validation with invalid movement sensor config ac = viam_carto_algo_config_setup(true); - struct viam_carto_config vcc_invalid_imu_config = + struct viam_carto_config vcc_invalid_movement_sensor_config = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera, no_movement_sensor, false, false, ""); - BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_imu_config, ac) == - VIAM_CARTO_IMU_PROVIDED_AND_IMU_ENABLED_MISMATCH); + BOOST_TEST( + viam_carto_init(&vc, lib, vcc_invalid_movement_sensor_config, ac) == + VIAM_CARTO_IMU_PROVIDED_AND_IMU_ENABLED_MISMATCH); // Test config validation with deprecated config structure fs::path deprecated_path = tmp_dir / fs::path(bfs::unique_path().string()); @@ -209,24 +245,24 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { BOOST_TEST(viam_carto_init(&vc, lib, vcc_invalid_path, ac) == VIAM_CARTO_DATA_DIR_FILE_SYSTEM_ERROR); - // Test config validation with imu (success) - struct viam_carto_config vcc_with_imu_succ = + // Test config validation with movement sensor (success) + struct viam_carto_config vcc_with_movement_sensor_succ = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera, movement_sensor, false, false, ""); - BOOST_TEST(viam_carto_init(nullptr, lib, vcc_with_imu_succ, ac) == - VIAM_CARTO_VC_INVALID); - BOOST_TEST(viam_carto_init(nullptr, nullptr, vcc_with_imu_succ, ac) == - VIAM_CARTO_VC_INVALID); - BOOST_TEST(viam_carto_init(&vc, nullptr, vcc_with_imu_succ, ac) == - VIAM_CARTO_LIB_INVALID); + BOOST_TEST(viam_carto_init(nullptr, lib, vcc_with_movement_sensor_succ, + ac) == VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_init(nullptr, nullptr, vcc_with_movement_sensor_succ, + ac) == VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_init(&vc, nullptr, vcc_with_movement_sensor_succ, + ac) == VIAM_CARTO_LIB_INVALID); - // invalid invalid terminate + // Invalid terminate BOOST_TEST(viam_carto_terminate(nullptr) == VIAM_CARTO_VC_INVALID); viam_carto *invalidvc = nullptr; BOOST_TEST(viam_carto_terminate(&invalidvc) == VIAM_CARTO_VC_INVALID); - BOOST_TEST(viam_carto_init(&vc, lib, vcc_with_imu_succ, ac) == + BOOST_TEST(viam_carto_init(&vc, lib, vcc_with_movement_sensor_succ, ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc->slam_mode == VIAM_CARTO_SLAM_MODE_MAPPING); @@ -234,15 +270,15 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { BOOST_TEST(viam_carto_terminate(&vc) == VIAM_CARTO_VC_INVALID); // can't terminate same instance again - // Test config validation without imu (success) + // Test config validation without movement sensor (success) viam_carto *vc2; ac = viam_carto_algo_config_setup(false); - struct viam_carto_config vcc_without_imu_succ = + struct viam_carto_config vcc_without_movement_sensor_succ = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera, no_movement_sensor, false, false, ""); - BOOST_TEST(viam_carto_init(&vc2, lib, vcc_without_imu_succ, ac) == - VIAM_CARTO_SUCCESS); + BOOST_TEST(viam_carto_init(&vc2, lib, vcc_without_movement_sensor_succ, + ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc2->slam_mode == VIAM_CARTO_SLAM_MODE_MAPPING); BOOST_TEST(viam_carto_terminate(&vc2) == VIAM_CARTO_SUCCESS); @@ -254,11 +290,11 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_validate) { viam_carto_config_teardown(vcc_empty_component_ref); viam_carto_config_teardown(vcc_invalid_map_rate_sec); viam_carto_config_teardown(vcc_invalid_lidar_config); - viam_carto_config_teardown(vcc_invalid_imu_config); + viam_carto_config_teardown(vcc_invalid_movement_sensor_config); viam_carto_config_teardown(vcc_deprecated_path); viam_carto_config_teardown(vcc_invalid_path); - viam_carto_config_teardown(vcc_with_imu_succ); - viam_carto_config_teardown(vcc_without_imu_succ); + viam_carto_config_teardown(vcc_with_movement_sensor_succ); + viam_carto_config_teardown(vcc_without_movement_sensor_succ); // TODO: Move all suite level setup & teardown to boost test hook fs::remove_all(tmp_dir); @@ -272,7 +308,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode_cloud_story_enabled) { BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; struct viam_carto_algo_config ac = viam_carto_algo_config_setup(true); { @@ -471,7 +507,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_algo_config ac = viam_carto_algo_config_setup(true); @@ -666,7 +702,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_derive_slam_mode) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate_without_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate_without_movement_sensor) { // library init viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); @@ -717,7 +753,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate_without_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_movement_sensor) { // library init viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); @@ -740,9 +776,10 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { // behavior of methods before start // AddLidarReading { - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1687900053773475); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == @@ -774,6 +811,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { // Start BOOST_TEST(viam_carto_start(vc) == VIAM_CARTO_SUCCESS); + // start not allowed if already started BOOST_TEST(viam_carto_start(vc) == VIAM_CARTO_NOT_IN_IO_INITIALIZED_STATE); @@ -796,27 +834,32 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_GET_POSITION_NOT_INITIALIZED); } - std::vector> points = { - {-0.001000, 0.002000, 0.005000, 16711938}, - {0.582000, 0.012000, 0.000000, 16711938}, - {0.007000, 0.006000, 0.001000, 16711938}}; + // AddLidarReading + // vc nullptr { BOOST_TEST(viam_carto_add_lidar_reading(nullptr, nullptr) == VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_add_lidar_reading_destroy(nullptr) == + VIAM_CARTO_LIDAR_READING_INVALID); } // viam_carto_lidar_reading nullptr { BOOST_TEST(viam_carto_add_lidar_reading(vc, nullptr) == VIAM_CARTO_LIDAR_READING_INVALID); + BOOST_TEST(viam_carto_add_lidar_reading_destroy(nullptr) == + VIAM_CARTO_LIDAR_READING_INVALID); } - BOOST_TEST(viam_carto_add_lidar_reading_destroy(nullptr) == - VIAM_CARTO_LIDAR_READING_INVALID); + // lidar is not equal to component reference { + std::vector> points = { + {-0.001000, 0.002000, 0.005000, 16711938}, + {0.582000, 0.012000, 0.000000, 16711938}, + {0.007000, 0.006000, 0.001000, 16711938}}; + viam_carto_lidar_reading sr; - // must be they first sensor in the sensor list sr.lidar = bfromcstr("never heard of it sensor"); std::string pcd = help::binary_pcd(points); sr.lidar_reading = blk2bstr(pcd.c_str(), pcd.length()); @@ -828,26 +871,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } - // PATRICIA TODO: #242 - // non first sensor - { - viam_carto_lidar_reading sr; - // must be they first sensor in the sensor list - sr.lidar = bfromcstr("sensor_2"); - std::string pcd = help::binary_pcd(points); - sr.lidar_reading = blk2bstr(pcd.c_str(), pcd.length()); - BOOST_TEST(sr.lidar_reading != nullptr); - sr.lidar_reading_time_unix_milli = 1687900014152474; - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == - VIAM_CARTO_UNKNOWN_SENSOR_NAME); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == - VIAM_CARTO_SUCCESS); - } - // empty lidar reading { viam_carto_lidar_reading sr; - // must be they first sensor in the sensor list sr.lidar = bfromcstr("lidar"); std::string pcd = "empty lidar reading"; // passing 0 as the second parameter makes the string empty @@ -860,10 +886,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } - // invalid reading + // invalid lidar reading { viam_carto_lidar_reading sr; - // must be they first sensor in the sensor list sr.lidar = bfromcstr("lidar"); std::string pcd = "invalid lidar reading"; sr.lidar_reading = blk2bstr(pcd.c_str(), pcd.length()); @@ -875,11 +900,12 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } - // unable to aquire lock + // unable to aquire lock on lidar { - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1687900053773475); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); std::lock_guard lk(cf->map_builder_mutex); @@ -932,9 +958,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_GET_POSITION_NOT_INITIALIZED); } - // GetPosition is unchanged from first AddLidarReading request + // GetPosition is unchanged from the first three AddLidarReading requests, // as cartographer needs at least 3 lidar readings to compute a - // position and the first position computed is zero. + // position. Until then, the initially set position equals is zero. // As a result it takes a minimum of 3 lidar readings before // cartographer produces a non zeroed position. // For more info see: @@ -943,27 +969,26 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { // first sensor reading { - VLOG(1) << "viam_carto_add_lidar_reading 1"; - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1629037851000000); - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == - VIAM_CARTO_SUCCESS); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + add_lidar_reading_successfully(vc, 1, pcd_path, 1629037851000000); } + // GetPosition not initialized after only one successful reading { viam_carto_get_position_response pr; BOOST_TEST(viam_carto_get_position(vc, &pr) == VIAM_CARTO_GET_POSITION_NOT_INITIALIZED); } + // GetPointCloudMap is empty after only one reading { viam_carto_get_point_cloud_map_response mr; BOOST_TEST(viam_carto_get_point_cloud_map(vc, &mr) == VIAM_CARTO_POINTCLOUD_MAP_EMPTY); } + // GetInternalState is not changed after only one reading { viam_carto_get_internal_state_response isr; BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == @@ -979,13 +1004,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { // second sensor reading { - VLOG(1) << "viam_carto_add_lidar_reading 2"; - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/1.pcd", - 1629037853000000); - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == - VIAM_CARTO_SUCCESS); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/1.pcd"; + add_lidar_reading_successfully(vc, 2, pcd_path, 1629037853000000); } // GetPosition returning origin position from 2 successful AddLidarReading @@ -1006,7 +1027,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } - // GetPointCloudMap after successful sensor readings + // GetPointCloudMap after 2 successful sensor readings { viam_carto_get_point_cloud_map_response mr; BOOST_TEST(viam_carto_get_point_cloud_map(vc, &mr) == @@ -1023,10 +1044,14 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } + // GetInternalState after 2 successful sensor readings { viam_carto_get_internal_state_response isr; BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == VIAM_CARTO_SUCCESS); + // on arm64 linux this is strictly greater than; + // on arm64 mac for some reason it is equal to; + // https://viam.atlassian.net/browse/RSDK-3866 BOOST_TEST(blength(isr.internal_state) > last_internal_state_response_size); last_internal_state_response_size = blength(isr.internal_state); @@ -1036,13 +1061,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { // third sensor reading { - VLOG(1) << "viam_carto_add_lidar_reading 3"; - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/2.pcd", - 1629037855000000); - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == - VIAM_CARTO_SUCCESS); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/2.pcd"; + add_lidar_reading_successfully(vc, 3, pcd_path, 1629037855000000); } // GetPosition changed from 3 successful AddLidarReading requests @@ -1062,6 +1083,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } + // GetInternalState after 3 successful sensor readings { viam_carto_get_internal_state_response isr; BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == @@ -1089,9 +1111,10 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { // behavior of methods after stop // AddLidarReading { - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1687900053773475); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == @@ -1100,8 +1123,8 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { VIAM_CARTO_SUCCESS); } + // GetPosition { - // GetPosition viam_carto_get_position_response pr; BOOST_TEST(viam_carto_get_position(vc, &pr) == VIAM_CARTO_NOT_IN_STARTED_STATE); @@ -1130,7 +1153,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_without_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_config_without_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_config_without_movement_sensor) { // library init viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); @@ -1163,7 +1186,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_config_without_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_without_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_without_movement_sensor) { // validate invalid pointer BOOST_TEST(viam_carto_start(nullptr) == VIAM_CARTO_VC_INVALID); BOOST_TEST(viam_carto_stop(nullptr) == VIAM_CARTO_VC_INVALID); @@ -1200,7 +1223,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_without_imu) { // Confirm at least one map is persisted within the map_rate_sec VLOG(1) << "path_to_internal_state: " << cf->path_to_internal_state; // TODO: This should busy wait until this condition happens & the tests - // passes or or 2 seconds goes by & the test fails. + // passes or 2 seconds goes by & the test fails. std::this_thread::sleep_for(cf->config.map_rate_sec + std::chrono::seconds(1)); BOOST_TEST(fs::is_directory(cf->path_to_internal_state)); @@ -1219,14 +1242,14 @@ BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_without_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate_with_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate_with_movement_sensor) { // library init viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); viam_carto *vc; std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = @@ -1271,7 +1294,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_init_terminate_with_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_movement_sensor) { // library init viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); @@ -1279,7 +1302,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { // Setup viam_carto *vc; std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = @@ -1291,36 +1314,101 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { BOOST_TEST(viam_carto_init(&vc, lib, vcc, ac) == VIAM_CARTO_SUCCESS); BOOST_TEST(vc->slam_mode == VIAM_CARTO_SLAM_MODE_MAPPING); + // behavior of methods before start + // AddLidarReading + { + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, 1687900053773475); + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + + // AddIMUReading + { + double reading[6] = {1, 2, 3, 4, 5, 6}; + viam_carto_imu_reading sr = + new_test_imu_reading("movement_sensor", reading, 1687900053773475); + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + BOOST_TEST(viam_carto_add_imu_reading(vc, &sr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + BOOST_TEST(viam_carto_add_imu_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + + // AddOdometerReading + { + double reading[7] = {1, 2, 3, 4, 5, 6, 7}; + viam_carto_odometer_reading sr = new_test_odometer_reading( + "movement_sensor", reading, 1687900053773475); + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + BOOST_TEST(viam_carto_add_odometer_reading(vc, &sr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + + { + // GetPosition + viam_carto_get_position_response pr; + BOOST_TEST(viam_carto_get_position(vc, &pr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + } + + // GetPointCloudMap + { + viam_carto_get_point_cloud_map_response mr; + BOOST_TEST(viam_carto_get_point_cloud_map(vc, &mr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + } + + // GetInternalState + { + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + } + // Start BOOST_TEST(viam_carto_start(vc) == VIAM_CARTO_SUCCESS); - std::vector> points = { - {-0.001000, 0.002000, 0.005000, 16711938}, - {0.582000, 0.012000, 0.000000, 16711938}, - {0.007000, 0.006000, 0.001000, 16711938}}; - // vc nullptr for lidar reading + // AddLidarReading + + // vc nullptr { BOOST_TEST(viam_carto_add_lidar_reading(nullptr, nullptr) == VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_add_lidar_reading_destroy(nullptr) == + VIAM_CARTO_LIDAR_READING_INVALID); } // viam_carto_lidar_reading nullptr { BOOST_TEST(viam_carto_add_lidar_reading(vc, nullptr) == VIAM_CARTO_LIDAR_READING_INVALID); + BOOST_TEST(viam_carto_add_lidar_reading_destroy(nullptr) == + VIAM_CARTO_LIDAR_READING_INVALID); } - BOOST_TEST(viam_carto_add_lidar_reading_destroy(nullptr) == - VIAM_CARTO_LIDAR_READING_INVALID); - + // lidar name is not equal to the configured component reference { + std::vector> points = { + {-0.001000, 0.002000, 0.005000, 16711938}, + {0.582000, 0.012000, 0.000000, 16711938}, + {0.007000, 0.006000, 0.001000, 16711938}}; + viam_carto_lidar_reading sr; - // must be the first sensor in the sensor list sr.lidar = bfromcstr("never heard of it sensor"); std::string pcd = help::binary_pcd(points); sr.lidar_reading = blk2bstr(pcd.c_str(), pcd.length()); BOOST_TEST(sr.lidar_reading != nullptr); - sr.lidar_reading_time_unix_milli = 1687899990420347; BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_UNKNOWN_SENSOR_NAME); @@ -1331,13 +1419,11 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { // empty lidar reading { viam_carto_lidar_reading sr; - // must be the first sensor in the sensor list sr.lidar = bfromcstr("lidar"); std::string pcd = "empty lidar reading"; // passing 0 as the second parameter makes the string empty sr.lidar_reading = blk2bstr(pcd.c_str(), 0); BOOST_TEST(sr.lidar_reading != nullptr); - sr.lidar_reading_time_unix_milli = 1687900021820215; BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_LIDAR_READING_EMPTY); @@ -1345,10 +1431,9 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } - // invalid reading + // invalid lidar reading { viam_carto_lidar_reading sr; - // must be the sensor configured sr.lidar = bfromcstr("lidar"); std::string pcd = "invalid lidar reading"; sr.lidar_reading = blk2bstr(pcd.c_str(), pcd.length()); @@ -1363,9 +1448,10 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { // unable to acquire lock on lidar { - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1687900053773475); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); std::lock_guard lk(cf->map_builder_mutex); @@ -1375,31 +1461,34 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } - // vc nullptr for imu reading + // AddIMUReading + + // vc nullptr { BOOST_TEST(viam_carto_add_imu_reading(nullptr, nullptr) == VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_add_imu_reading_destroy(nullptr) == + VIAM_CARTO_IMU_READING_INVALID); } // viam_carto_imu_reading nullptr { BOOST_TEST(viam_carto_add_imu_reading(vc, nullptr) == VIAM_CARTO_IMU_READING_INVALID); + BOOST_TEST(viam_carto_add_imu_reading_destroy(nullptr) == + VIAM_CARTO_IMU_READING_INVALID); } - BOOST_TEST(viam_carto_add_imu_reading_destroy(nullptr) == - VIAM_CARTO_IMU_READING_INVALID); - + // reading IMU name is not equal to the configured movement sensor name { viam_carto_imu_reading sr; - // must be the sensor configured sr.imu = bfromcstr("never heard of it sensor"); sr.lin_acc_x = 1; - sr.lin_acc_y = 1; - sr.lin_acc_z = 1; - sr.ang_vel_x = 1; - sr.ang_vel_y = 1; - sr.ang_vel_z = 1; + sr.lin_acc_y = 2; + sr.lin_acc_z = 3; + sr.ang_vel_x = 4; + sr.ang_vel_y = 5; + sr.ang_vel_z = 6; sr.imu_reading_time_unix_milli = 1687899990420347; BOOST_TEST(viam_carto_add_imu_reading(vc, &sr) == VIAM_CARTO_UNKNOWN_SENSOR_NAME); @@ -1411,7 +1500,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { { double reading[6] = {1, 1, 1, 1, 1, 1}; viam_carto_imu_reading sr = - new_testIMUReading("imu", reading, 1687900053773475); + new_test_imu_reading("movement_sensor", reading, 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); std::lock_guard lk(cf->map_builder_mutex); @@ -1421,6 +1510,57 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } + // AddOdometerReading + + // vc nullptr + { + BOOST_TEST(viam_carto_add_odometer_reading(nullptr, nullptr) == + VIAM_CARTO_VC_INVALID); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(nullptr) == + VIAM_CARTO_ODOMETER_READING_INVALID); + } + + // viam_carto_odometer_reading nullptr + { + BOOST_TEST(viam_carto_add_odometer_reading(vc, nullptr) == + VIAM_CARTO_ODOMETER_READING_INVALID); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(nullptr) == + VIAM_CARTO_ODOMETER_READING_INVALID); + } + + // reading odometer name is not equal to the configured movement sensor name + { + viam_carto_odometer_reading sr; + sr.odometer = bfromcstr("never heard of it sensor"); + sr.translation_x = 1; + sr.translation_y = 2; + sr.translation_z = 3; + sr.rotation_x = 4; + sr.rotation_y = 5; + sr.rotation_z = 6; + sr.rotation_w = 7; + sr.odometer_reading_time_unix_milli = 1687899990420347; + BOOST_TEST(viam_carto_add_odometer_reading(vc, &sr) == + VIAM_CARTO_UNKNOWN_SENSOR_NAME); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + + // unable to acquire lock on odometer + { + double reading[6] = {1, 1, 1, 1, 1, 1}; + viam_carto_odometer_reading sr = new_test_odometer_reading( + "movement_sensor", reading, 1687900053773475); + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + std::lock_guard lk(cf->map_builder_mutex); + BOOST_TEST(viam_carto_add_odometer_reading(vc, &sr) == + VIAM_CARTO_UNABLE_TO_ACQUIRE_LOCK); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + + // GetInternalState int last_internal_state_response_size = 0; { BOOST_TEST(viam_carto_get_internal_state_response_destroy(nullptr) == @@ -1440,9 +1580,19 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } - // GetPosition is unchanged from first AddLidarReading - // request as cartographer needs at least 3 lidar readings to compute a - // position and the first position computed is zero. + // GetPosition unchanged from failed AddLidarReading, AddIMUReading, and + // AddOdometerReading requests + { + viam_carto_get_position_response pr; + // Test get position before any data is provided + // it should return an error + BOOST_TEST(viam_carto_get_position(vc, &pr) == + VIAM_CARTO_GET_POSITION_NOT_INITIALIZED); + } + + // GetPosition is unchanged from the first three AddLidarReading requests, + // as cartographer needs at least 3 lidar readings to compute a + // position. Until then, the initially set position equals is zero. // As a result it takes a minimum of 3 lidar readings before // cartographer produces a non zeroed position. // For more info see: @@ -1451,62 +1601,109 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { // first sensor reading { - VLOG(1) << "viam_carto_add_lidar_reading 1"; - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1629037851000000); - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == - VIAM_CARTO_SUCCESS); - double readings[6] = {0, 0, 9.8, 0, 0, 0}; - add_new_testIMUReading(vc, readings, 1629037851000000); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + add_lidar_reading_successfully(vc, 1, pcd_path, 1629037851000000); + + double imu_reading[6] = {0, 0, 9.8, 0, 0, 0}; + add_imu_reading_successfully(vc, 1, imu_reading, 1629037851000000); } // second sensor reading { - VLOG(1) << "viam_carto_add_lidar_reading 2"; - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/1.pcd", - 1629037853000100); - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/1.pcd"; + add_lidar_reading_successfully(vc, 2, pcd_path, 1629037853000000); + + double imu_reading[6] = {0.1, 0, 9.8, 0, -0.2, 0}; + add_imu_reading_successfully(vc, 2, imu_reading, 1629037853000100); + } + + // third sensor reading + { + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/2.pcd"; + add_lidar_reading_successfully(vc, 3, pcd_path, 1629037855000000); + + double imu_reading[6] = {0.2, 0, 9.8, -0.6, 0, 0}; + add_imu_reading_successfully(vc, 3, imu_reading, 1629037855000200); + } + + // GetPosition changed from 3 successful AddLidarReading and AddIMUReading + // requests + { + viam_carto_get_position_response pr; + BOOST_TEST(viam_carto_get_position(vc, &pr) == VIAM_CARTO_SUCCESS); + BOOST_TEST(pr.x != 0); + BOOST_TEST(pr.y != 0); + BOOST_TEST(pr.z == 0); + BOOST_TEST(pr.imag != 0); + BOOST_TEST(pr.jmag != 0); + BOOST_TEST(pr.kmag != 0); + BOOST_TEST(pr.real != 1); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); + + BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); + } - double readings[6] = {0.1, 0, 9.8, 0, -0.2, 0}; - add_new_testIMUReading(vc, readings, 1629037853000100); + // GetPointCloudMap after 3 successful sensor readings + { + viam_carto_get_point_cloud_map_response mr; + BOOST_TEST(viam_carto_get_point_cloud_map(vc, &mr) == + VIAM_CARTO_SUCCESS); + pcl::PCLPointCloud2 blob; + pcl::PointCloud::Ptr cloud( + new pcl::PointCloud); + auto s = to_std_string(mr.point_cloud_pcd); + BOOST_TEST(viam::carto_facade::util::read_pcd(s, blob) == 0); + pcl::fromPCLPointCloud2(blob, *cloud); + BOOST_TEST(cloud != nullptr); + BOOST_TEST(cloud->points.size() != 0); + BOOST_TEST(viam_carto_get_point_cloud_map_response_destroy(&mr) == + VIAM_CARTO_SUCCESS); } - // third sensor readings + // GetInternalState after 3 successful sensor readings { - VLOG(1) << "viam_carto_add_lidar_reading 3"; - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/2.pcd", - 1629037855000200); - BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(viam_carto_add_lidar_reading_destroy(&sr) == + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_SUCCESS); + // on arm64 linux this is strictly greater than; + // on arm64 mac for some reason it is equal to; + // https://viam.atlassian.net/browse/RSDK-3866 + BOOST_TEST(blength(isr.internal_state) >= + last_internal_state_response_size); + last_internal_state_response_size = blength(isr.internal_state); + BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == VIAM_CARTO_SUCCESS); - double readings[6] = {0.2, 0, 9.8, -0.6, 0, 0}; - add_new_testIMUReading(vc, readings, 1629037855000200); } - // GetPosition changed from 3 successful AddLidarReading requests + // add fourth sensor reading: only imu + { + double imu_reading[6] = {0.5, 0.2, 9.8, 0.6, 0.1, 0}; + add_imu_reading_successfully(vc, 3, imu_reading, 1629037856000200); + } + + // GetPosition changed from 3 successful AddLidarReading and 4 successful + // AddIMUReading requests { viam_carto_get_position_response pr; BOOST_TEST(viam_carto_get_position(vc, &pr) == VIAM_CARTO_SUCCESS); - BOOST_TEST(pr.x == 0); - BOOST_TEST(pr.y == 0); + BOOST_TEST(pr.x != 0); + BOOST_TEST(pr.y != 0); BOOST_TEST(pr.z == 0); - BOOST_TEST(pr.imag == 0); - BOOST_TEST(pr.jmag == 0); - BOOST_TEST(pr.kmag == 0); - BOOST_TEST(pr.real == 1); + BOOST_TEST(pr.imag != 0); + BOOST_TEST(pr.jmag != 0); + BOOST_TEST(pr.kmag != 0); + BOOST_TEST(pr.real != 1); BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == VIAM_CARTO_SUCCESS); } - // GetPointCloudMap after successful sensor readings + // GetPointCloudMap after 4 successful sensor readings { viam_carto_get_point_cloud_map_response mr; BOOST_TEST(viam_carto_get_point_cloud_map(vc, &mr) == @@ -1523,12 +1720,70 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } + // GetInternalState after 4 successful sensor readings { viam_carto_get_internal_state_response isr; BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == VIAM_CARTO_SUCCESS); - // on arm64 linux this is strictly greater than - // on arm64 mac for some reason it is equal to + // on arm64 linux this is strictly greater than; + // on arm64 mac for some reason it is equal to; + // https://viam.atlassian.net/browse/RSDK-3866 + BOOST_TEST(blength(isr.internal_state) >= + last_internal_state_response_size); + last_internal_state_response_size = blength(isr.internal_state); + BOOST_TEST(viam_carto_get_internal_state_response_destroy(&isr) == + VIAM_CARTO_SUCCESS); + } + + // add fifth sensor reading: only odometer + { + double odometer_reading[7] = {0.5, 0.2, 9.8, 0.6, 0.1, 0, 0.8}; + add_odometer_reading_successfully(vc, 3, odometer_reading, + 1629037857000200); + } + + // GetPosition changed from 3 successful AddLidarReading, 4 successful + // AddIMUReading, and 1 successful AddOdometerReading requests + { + viam_carto_get_position_response pr; + BOOST_TEST(viam_carto_get_position(vc, &pr) == VIAM_CARTO_SUCCESS); + BOOST_TEST(pr.x != 0); + BOOST_TEST(pr.y != 0); + BOOST_TEST(pr.z == 0); + BOOST_TEST(pr.imag != 0); + BOOST_TEST(pr.jmag != 0); + BOOST_TEST(pr.kmag != 0); + BOOST_TEST(pr.real != 1); + BOOST_TEST(to_std_string(pr.component_reference) == "lidar"); + + BOOST_TEST(viam_carto_get_position_response_destroy(&pr) == + VIAM_CARTO_SUCCESS); + } + + // GetPointCloudMap after 5 successful sensor readings + { + viam_carto_get_point_cloud_map_response mr; + BOOST_TEST(viam_carto_get_point_cloud_map(vc, &mr) == + VIAM_CARTO_SUCCESS); + pcl::PCLPointCloud2 blob; + pcl::PointCloud::Ptr cloud( + new pcl::PointCloud); + auto s = to_std_string(mr.point_cloud_pcd); + BOOST_TEST(viam::carto_facade::util::read_pcd(s, blob) == 0); + pcl::fromPCLPointCloud2(blob, *cloud); + BOOST_TEST(cloud != nullptr); + BOOST_TEST(cloud->points.size() != 0); + BOOST_TEST(viam_carto_get_point_cloud_map_response_destroy(&mr) == + VIAM_CARTO_SUCCESS); + } + + // GetInternalState after 5 successful sensor readings + { + viam_carto_get_internal_state_response isr; + BOOST_TEST(viam_carto_get_internal_state(vc, &isr) == + VIAM_CARTO_SUCCESS); + // on arm64 linux this is strictly 'greater than'; + // on arm64 mac for some reason it is 'equal to'; // https://viam.atlassian.net/browse/RSDK-3866 BOOST_TEST(blength(isr.internal_state) >= last_internal_state_response_size); @@ -1537,17 +1792,23 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } + BOOST_TEST(viam_carto_run_final_optimization(vc) == VIAM_CARTO_SUCCESS); + // Stop BOOST_TEST(viam_carto_stop(vc) == VIAM_CARTO_SUCCESS); // stop not allowed if not started BOOST_TEST(viam_carto_stop(vc) == VIAM_CARTO_NOT_IN_STARTED_STATE); + // run_final_optimization not allowed if not started + BOOST_TEST(viam_carto_run_final_optimization(vc) == + VIAM_CARTO_NOT_IN_STARTED_STATE); // behavior of methods after stop // AddLidarReading { - viam_carto_lidar_reading sr = new_test_lidar_reading( - "lidar", ".artifact/data/viam-cartographer/mock_lidar/0.pcd", - 1687900053773475); + std::string pcd_path = + ".artifact/data/viam-cartographer/mock_lidar/0.pcd"; + viam_carto_lidar_reading sr = + new_test_lidar_reading("lidar", pcd_path, 1687900053773475); viam::carto_facade::CartoFacade *cf = static_cast(vc->carto_obj); BOOST_TEST(viam_carto_add_lidar_reading(vc, &sr) == @@ -1556,6 +1817,32 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { VIAM_CARTO_SUCCESS); } + // AddIMUReading + { + double reading[6] = {1, 2, 3, 4, 5, 6}; + viam_carto_imu_reading sr = + new_test_imu_reading("movement_sensor", reading, 1687900053773475); + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + BOOST_TEST(viam_carto_add_imu_reading(vc, &sr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + BOOST_TEST(viam_carto_add_imu_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + + // AddOdometerReading + { + double reading[7] = {1, 2, 3, 4, 5, 6, 7}; + viam_carto_odometer_reading sr = new_test_odometer_reading( + "movement_sensor", reading, 1687900053773475); + viam::carto_facade::CartoFacade *cf = + static_cast(vc->carto_obj); + BOOST_TEST(viam_carto_add_odometer_reading(vc, &sr) == + VIAM_CARTO_NOT_IN_STARTED_STATE); + BOOST_TEST(viam_carto_add_odometer_reading_destroy(&sr) == + VIAM_CARTO_SUCCESS); + } + // GetPosition { viam_carto_get_position_response pr; @@ -1586,18 +1873,19 @@ BOOST_AUTO_TEST_CASE(CartoFacade_demo_with_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_config_with_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_config_with_movement_sensor) { // library init viam_carto_lib *lib; BOOST_TEST(viam_carto_lib_init(&lib, 0, 1) == VIAM_CARTO_SUCCESS); std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = viam_carto_config_setup(1, VIAM_CARTO_THREE_D, tmp_dir.string(), camera, movement_sensor, true, true, ""); + struct config c = viam::carto_facade::from_viam_carto_config(vcc); BOOST_TEST(to_std_string(c.component_reference) == "lidar"); @@ -1605,7 +1893,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_config_with_imu) { BOOST_TEST(c.lidar_config == VIAM_CARTO_THREE_D); BOOST_TEST(c.map_rate_sec.count() == 1); BOOST_TEST(c.camera == "lidar"); - BOOST_TEST(c.movement_sensor == "imu"); + BOOST_TEST(c.movement_sensor == "movement_sensor"); BOOST_TEST(c.cloud_story_enabled == true); BOOST_TEST(c.enable_mapping == true); @@ -1617,7 +1905,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_config_with_imu) { BOOST_TEST(viam_carto_lib_terminate(&lib) == VIAM_CARTO_SUCCESS); } -BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_with_imu) { +BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_with_movement_sensor) { // validate invalid pointer BOOST_TEST(viam_carto_start(nullptr) == VIAM_CARTO_VC_INVALID); BOOST_TEST(viam_carto_stop(nullptr) == VIAM_CARTO_VC_INVALID); @@ -1629,7 +1917,7 @@ BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_with_imu) { // Setup viam_carto *vc; std::string camera = "lidar"; - std::string movement_sensor = "imu"; + std::string movement_sensor = "movement_sensor"; fs::path tmp_dir = fs::temp_directory_path() / fs::path(bfs::unique_path().string()); struct viam_carto_config vcc = @@ -1646,14 +1934,14 @@ BOOST_AUTO_TEST_CASE(CartoFacade_start_stop_with_imu) { BOOST_TEST(fs::is_directory(cf->path_to_internal_state)); BOOST_TEST(fs::is_empty(cf->path_to_internal_state)); - // // Start + // Start BOOST_TEST(viam_carto_start(vc) == VIAM_CARTO_SUCCESS); BOOST_TEST(((cf->state) == CartoFacadeState::STARTED)); // Confirm at least one map is persisted within the map_rate_sec VLOG(1) << "path_to_internal_state: " << cf->path_to_internal_state; // TODO: This should busy wait until this condition happens & the tests - // passes or or 2 seconds goes by & the test fails. + // passes or 2 seconds goes by & the test fails. std::this_thread::sleep_for(cf->config.map_rate_sec + std::chrono::seconds(1)); BOOST_TEST(fs::is_directory(cf->path_to_internal_state)); diff --git a/viam-cartographer/src/carto_facade/map_builder.cc b/viam-cartographer/src/carto_facade/map_builder.cc index 76018ef6..fe850dfc 100644 --- a/viam-cartographer/src/carto_facade/map_builder.cc +++ b/viam-cartographer/src/carto_facade/map_builder.cc @@ -106,6 +106,11 @@ void MapBuilder::AddSensorData(const std::string &sensor_id, trajectory_builder->AddSensorData(kIMUSensorId.id, measurement); } +void MapBuilder::AddSensorData(const std::string &sensor_id, + cartographer::sensor::OdometryData measurement) { + trajectory_builder->AddSensorData(kOdometerSensorId.id, measurement); +} + void MapBuilder::StartTrajectoryBuilder(bool use_imu_data) { VLOG(1) << "MapBuilder::StartTrajectoryBuilder"; std::set sensorList = {kRangeSensorId}; diff --git a/viam-cartographer/src/carto_facade/map_builder.h b/viam-cartographer/src/carto_facade/map_builder.h index 166319dd..ae10389e 100644 --- a/viam-cartographer/src/carto_facade/map_builder.h +++ b/viam-cartographer/src/carto_facade/map_builder.h @@ -24,6 +24,7 @@ using SensorId = cartographer::mapping::TrajectoryBuilderInterface::SensorId; const SensorId kRangeSensorId{SensorId::SensorType::RANGE, "range"}; const SensorId kIMUSensorId{SensorId::SensorType::IMU, "imu"}; +const SensorId kOdometerSensorId{SensorId::SensorType::ODOMETRY, "odometry"}; class MapBuilder { public: @@ -70,12 +71,14 @@ class MapBuilder { // GetGlobalPose returns the local pose based on the provided a local pose. cartographer::transform::Rigid3d GetGlobalPose(); - // AddSensorData adds sensor data to cartographer's internal state - // throws if adding sensor data fails. + // AddSensorData adds sensor data to cartographer's internal state. + // Throws if adding sensor data fails. void AddSensorData(const std::string &sensor_id, cartographer::sensor::TimedPointCloudData measurement); void AddSensorData(const std::string &sensor_id, cartographer::sensor::ImuData measurement); + void AddSensorData(const std::string &sensor_id, + cartographer::sensor::OdometryData measurement); // GetLocalSlamResultCallback saves the local pose in the // local_slam_result_poses array.